From 26533494329437802ebfa6c6b7d29f73e63579e7 Mon Sep 17 00:00:00 2001 From: upstream-mirror Date: Tue, 15 Sep 2026 15:15:34 +0500 Subject: [PATCH] snapshot of https://github.com/docmost/docmost.git @ 6205bbeb908fe846f87dd6a2cbf562e24777db38 (2026-09-15) --- .dockerignore | 6 + .env.example | 70 + .github/workflows/release.yml | 154 + .gitignore | 43 + .gitmodules | 3 + Dockerfile | 62 + LICENSE | 661 + README.md | 62 + apps/client/.dockerignore | 4 + apps/client/.gitignore | 27 + apps/client/README.md | 27 + apps/client/eslint.config.mjs | 36 + apps/client/index.html | 26 + apps/client/package.json | 100 + apps/client/postcss.config.js | 14 + apps/client/public/icons/app-icon-192x192.png | Bin 0 -> 4722 bytes apps/client/public/icons/app-icon-512x512.png | Bin 0 -> 13696 bytes apps/client/public/icons/favicon-16x16.png | Bin 0 -> 509 bytes apps/client/public/icons/favicon-32x32.png | Bin 0 -> 881 bytes .../public/locales/de-DE/translation.json | 1480 ++ .../public/locales/en-US/translation.json | 1480 ++ .../public/locales/es-ES/translation.json | 1480 ++ .../public/locales/fr-FR/translation.json | 1480 ++ .../public/locales/it-IT/translation.json | 1480 ++ .../public/locales/ja-JP/translation.json | 1480 ++ .../public/locales/ko-KR/translation.json | 1480 ++ .../public/locales/nl-NL/translation.json | 1480 ++ .../public/locales/pt-BR/translation.json | 1480 ++ .../public/locales/ru-RU/translation.json | 1480 ++ .../public/locales/uk-UA/translation.json | 1480 ++ .../public/locales/zh-CN/translation.json | 1480 ++ apps/client/public/manifest.json | 30 + apps/client/public/vite.svg | 1 + apps/client/src/App.tsx | 202 + apps/client/src/assets/react.svg | 1 + .../src/components/common/avatar-uploader.tsx | 183 + .../src/components/common/copy-button.tsx | 33 + apps/client/src/components/common/copy.tsx | 40 + .../src/components/common/export-modal.tsx | 232 + .../components/common/no-table-results.tsx | 20 + .../src/components/common/page-list-icon.tsx | 18 + .../client/src/components/common/paginate.tsx | 44 + .../src/components/common/recent-changes.tsx | 109 + .../src/components/common/search-input.tsx | 40 + .../src/components/common/user-info.tsx | 24 + .../src/components/icons/airtable-icon.tsx | 32 + .../src/components/icons/confluence-icon.tsx | 20 + .../src/components/icons/figma-icon.tsx | 23 + .../src/components/icons/framer-icon.tsx | 17 + .../components/icons/google-drive-icon.tsx | 24 + .../src/components/icons/google-icon.tsx | 33 + .../components/icons/google-sheets-icon.tsx | 23 + .../src/components/icons/icon-columns-4.tsx | 27 + .../src/components/icons/icon-columns-5.tsx | 28 + .../src/components/icons/icon-drawio.tsx | 20 + .../src/components/icons/icon-excalidraw.tsx | 20 + .../src/components/icons/icon-mermaid.tsx | 20 + .../components/icons/icon-people-circle.tsx | 11 + apps/client/src/components/icons/index.ts | 11 + .../client/src/components/icons/loom-icon.tsx | 19 + .../client/src/components/icons/miro-icon.tsx | 18 + .../src/components/icons/openid-icon.tsx | 20 + .../src/components/icons/typeform-icon.tsx | 18 + .../src/components/icons/vimeo-icon.tsx | 19 + .../src/components/icons/youtube-icon.tsx | 19 + .../layouts/global/app-header.module.css | 39 + .../components/layouts/global/app-header.tsx | 183 + .../layouts/global/app-shell.module.css | 29 + .../src/components/layouts/global/aside.tsx | 101 + .../layouts/global/global-app-shell.tsx | 174 + .../layouts/global/global-sidebar.module.css | 109 + .../layouts/global/global-sidebar.tsx | 186 + .../global/hooks/atoms/sidebar-atom.ts | 24 + .../global/hooks/hooks/use-toggle-sidebar.ts | 8 + .../src/components/layouts/global/layout.tsx | 23 + .../components/layouts/global/top-menu.tsx | 203 + .../src/components/settings/app-version.tsx | 59 + .../settings/atoms/settings-origin-atom.ts | 10 + .../components/settings/settings-queries.tsx | 108 + .../components/settings/settings-sidebar.tsx | 319 + .../components/settings/settings-title.tsx | 13 + .../components/settings/settings.module.css | 64 + .../src/components/theme-toggle.module.css | 19 + apps/client/src/components/theme-toggle.tsx | 28 + .../src/components/ui/auto-tooltip-text.tsx | 50 + .../components/ui/card-carousel.module.css | 68 + .../src/components/ui/card-carousel.tsx | 77 + .../src/components/ui/checkbox-menu-item.tsx | 12 + .../ui/clickable-table-row.module.css | 29 + .../src/components/ui/custom-avatar.tsx | 84 + .../destination-picker-modal.tsx | 73 + .../destination-picker.module.css | 126 + .../destination-picker/destination-picker.tsx | 226 + .../destination-picker.types.ts | 25 + .../ui/destination-picker/page-children.tsx | 94 + .../ui/destination-picker/page-row.tsx | 116 + .../ui/destination-picker/space-row.tsx | 130 + .../src/components/ui/document-title.test.tsx | 45 + .../src/components/ui/document-title.tsx | 29 + .../client/src/components/ui/emoji-picker.tsx | 162 + .../src/components/ui/empty-state.module.css | 8 + apps/client/src/components/ui/empty-state.tsx | 30 + .../src/components/ui/error-404.module.css | 24 + apps/client/src/components/ui/error-404.tsx | 26 + .../src/components/ui/page-list-skeleton.tsx | 21 + .../src/components/ui/radio-menu-item.tsx | 12 + .../components/ui/responsive-settings-row.tsx | 47 + .../src/components/ui/role-select-menu.tsx | 68 + .../components/ui/sidebar-toggle-button.tsx | 35 + .../src/components/ui/skip-to-main.module.css | 27 + .../client/src/components/ui/skip-to-main.tsx | 13 + apps/client/src/ee/LICENSE | 39 + .../ee/ai-chat/components/ai-chat-layout.tsx | 105 + .../ai-chat/components/ai-chat-read-only.tsx | 74 + .../components/ai-chat-sidebar-item.tsx | 167 + .../ee/ai-chat/components/ai-chat-sidebar.tsx | 204 + .../ai-chat-workspace-knowledge-only.tsx | 74 + .../ai-chat/components/aside-chat-history.tsx | 67 + .../ai-chat/components/aside-chat-panel.tsx | 269 + .../ai-chat/components/chat-empty-state.tsx | 102 + .../src/ee/ai-chat/components/chat-input.tsx | 459 + .../ai-chat/components/chat-message-list.tsx | 219 + .../ee/ai-chat/components/chat-message.tsx | 168 + .../ee/ai-chat/components/chat-tool-group.tsx | 65 + .../ai-chat/components/chat-tool-result.tsx | 49 + .../ee/ai-chat/components/enable-ai-chat.tsx | 67 + .../src/ee/ai-chat/hooks/use-chat-stream.ts | 227 + apps/client/src/ee/ai-chat/pages/ai-chat.tsx | 39 + .../src/ee/ai-chat/queries/ai-chat-query.ts | 61 + .../ee/ai-chat/services/ai-chat-service.ts | 144 + .../src/ee/ai-chat/styles/ai-chat.module.css | 170 + .../styles/aside-chat-panel.module.css | 139 + .../ee/ai-chat/styles/chat-input.module.css | 242 + .../ee/ai-chat/styles/chat-message.module.css | 286 + .../ee/ai-chat/styles/chat-sidebar.module.css | 147 + .../src/ee/ai-chat/types/ai-chat.types.ts | 49 + .../ee/ai-chat/utils/group-chats-by-age.ts | 45 + .../src/ee/ai/components/ai-search-result.tsx | 113 + .../editor/ai-menu/ai-menu.module.css | 61 + .../ai/components/editor/ai-menu/ai-menu.tsx | 358 + .../editor/ai-menu/command-items.ts | 219 + .../editor/ai-menu/command-selector.tsx | 72 + .../editor/ai-menu/result-preview.tsx | 32 + .../src/ee/ai/components/enable-ai-search.tsx | 71 + .../ee/ai/components/enable-generative-ai.tsx | 53 + .../src/ee/ai/components/mcp-settings.tsx | 210 + apps/client/src/ee/ai/hooks/use-ai-search.ts | 46 + apps/client/src/ee/ai/hooks/use-ai.ts | 61 + apps/client/src/ee/ai/pages/ai-settings.tsx | 102 + apps/client/src/ee/ai/queries/ai-query.ts | 44 + .../src/ee/ai/services/ai-search-service.ts | 91 + apps/client/src/ee/ai/services/ai-service.ts | 92 + apps/client/src/ee/ai/types/ai.types.ts | 41 + .../components/api-key-created-modal.tsx | 74 + .../ee/api-key/components/api-key-table.tsx | 148 + .../components/create-api-key-modal.tsx | 154 + .../components/restrict-api-to-admins.tsx | 71 + .../components/revoke-api-key-modal.tsx | 65 + .../components/update-api-key-modal.tsx | 81 + apps/client/src/ee/api-key/index.ts | 11 + .../src/ee/api-key/pages/user-api-keys.tsx | 192 + .../ee/api-key/pages/workspace-api-keys.tsx | 121 + .../src/ee/api-key/queries/api-key-query.ts | 101 + .../ee/api-key/services/api-key-service.ts | 32 + .../src/ee/api-key/types/api-key.types.ts | 23 + .../ee/audit/components/audit-logs-table.tsx | 333 + .../ee/audit/components/audit-logs.module.css | 33 + .../src/ee/audit/lib/audit-event-labels.ts | 228 + apps/client/src/ee/audit/pages/audit-logs.tsx | 250 + .../src/ee/audit/queries/audit-query.ts | 51 + .../src/ee/audit/services/audit-service.ts | 22 + apps/client/src/ee/audit/types/audit.types.ts | 40 + apps/client/src/ee/base/atoms/base-atoms.ts | 55 + .../ee/base/atoms/formula-recompute-atom.ts | 3 + .../src/ee/base/atoms/reference-store-atom.ts | 20 + .../src/ee/base/atoms/view-draft-atom.ts | 21 + .../ee/base/components/base-embed-title.tsx | 91 + .../base/components/base-table-skeleton.tsx | 92 + .../src/ee/base/components/base-table.tsx | 70 + .../src/ee/base/components/base-toolbar.tsx | 295 + .../components/base-view-draft-banner.tsx | 45 + .../src/ee/base/components/base-view.tsx | 541 + .../base/components/cells/badge-overflow.tsx | 100 + .../base/components/cells/cell-checkbox.tsx | 44 + .../base/components/cells/cell-created-at.tsx | 22 + .../ee/base/components/cells/cell-date.tsx | 146 + .../ee/base/components/cells/cell-email.tsx | 61 + .../ee/base/components/cells/cell-file.tsx | 236 + .../ee/base/components/cells/cell-formula.tsx | 38 + .../components/cells/cell-last-edited-at.tsx | 22 + .../components/cells/cell-last-edited-by.tsx | 41 + .../base/components/cells/cell-long-text.tsx | 151 + .../components/cells/cell-multi-select.tsx | 289 + .../ee/base/components/cells/cell-number.tsx | 158 + .../ee/base/components/cells/cell-page.tsx | 339 + .../ee/base/components/cells/cell-person.tsx | 247 + .../ee/base/components/cells/cell-select.tsx | 239 + .../ee/base/components/cells/cell-status.tsx | 202 + .../ee/base/components/cells/cell-text.tsx | 60 + .../src/ee/base/components/cells/cell-url.tsx | 70 + .../base/components/cells/cell-value-equal.ts | 30 + .../ee/base/components/cells/choice-badge.tsx | 29 + .../ee/base/components/cells/choice-color.ts | 25 + .../base/components/cells/choice-picker.tsx | 258 + .../components/cells/person-read-list.tsx | 40 + .../components/formula/formula-editor.tsx | 189 + .../base/components/formula/formula-input.tsx | 40 + .../formula/formula-property-editor.tsx | 48 + .../components/formula/function-palette.tsx | 83 + .../components/formula/property-chip-row.tsx | 56 + .../base/components/grid/add-row-button.tsx | 32 + .../grid/base-drop-edge-indicator.tsx | 10 + .../src/ee/base/components/grid/grid-cell.tsx | 301 + .../base/components/grid/grid-container.tsx | 565 + .../base/components/grid/grid-ghost-rows.tsx | 32 + .../base/components/grid/grid-header-cell.tsx | 356 + .../ee/base/components/grid/grid-header.tsx | 64 + .../src/ee/base/components/grid/grid-row.tsx | 198 + .../base/components/grid/row-number-cell.tsx | 111 + .../grid/row-number-header-cell.tsx | 51 + .../components/grid/selection-action-bar.tsx | 52 + .../ee/base/components/kanban/base-kanban.tsx | 214 + .../kanban/card-field/card-field.tsx | 339 + .../kanban/kanban-add-card-button.tsx | 28 + .../kanban/kanban-card-properties.tsx | 251 + .../ee/base/components/kanban/kanban-card.tsx | 85 + .../kanban/kanban-column-header.tsx | 70 + .../components/kanban/kanban-column-menu.tsx | 119 + .../components/kanban/kanban-column-title.tsx | 113 + .../base/components/kanban/kanban-column.tsx | 166 + .../components/kanban/kanban-empty-state.tsx | 99 + .../kanban/kanban-group-by-picker.tsx | 115 + .../components/property/choice-editor.tsx | 673 + .../components/property/conversion-warning.ts | 127 + .../property/create-property-popover.tsx | 417 + .../property/default-value-picker.tsx | 98 + .../components/property/property-menu.tsx | 591 + .../components/property/property-options.tsx | 622 + .../property/property-type-picker.tsx | 71 + .../row-detail-modal/fields/detail-field.tsx | 145 + .../fields/field-cell-adapter.tsx | 80 + .../row-detail-modal/fields/field-choice.tsx | 104 + .../row-detail-modal/fields/field-date.tsx | 76 + .../fields/field-long-text.tsx | 79 + .../row-detail-modal/fields/field-number.tsx | 97 + .../row-detail-modal/fields/field-text.tsx | 99 + .../row-detail-modal/property-row.tsx | 121 + .../row-detail-modal/row-detail-modal.tsx | 465 + .../row-detail-modal/row-detail-title.tsx | 82 + .../components/views/filter-date-input.tsx | 201 + .../components/views/filter-person-input.tsx | 246 + .../components/views/relative-date-presets.ts | 35 + .../components/views/view-create-menu.tsx | 140 + .../components/views/view-filter-config.tsx | 557 + .../views/view-property-visibility.tsx | 165 + .../base/components/views/view-renderer.tsx | 59 + .../components/views/view-sort-config.tsx | 223 + .../ee/base/components/views/view-tabs.tsx | 418 + .../src/ee/base/constants/currencies.ts | 39 + .../src/ee/base/context/base-editable.tsx | 22 + .../src/ee/base/context/grid-row-order.tsx | 12 + .../client/src/ee/base/context/row-expand.tsx | 11 + .../src/ee/base/formatters/cell-formatters.ts | 22 + .../src/ee/base/hooks/use-base-socket.ts | 382 + .../src/ee/base/hooks/use-base-table.ts | 376 + .../src/ee/base/hooks/use-column-resize.ts | 26 + .../base/hooks/use-delete-selected-rows.tsx | 55 + .../ee/base/hooks/use-editable-text-cell.ts | 100 + .../src/ee/base/hooks/use-escape-close.ts | 12 + .../src/ee/base/hooks/use-formula-parser.ts | 107 + .../src/ee/base/hooks/use-grid-autoscroll.ts | 120 + .../ee/base/hooks/use-grid-keyboard-nav.ts | 317 + .../base/hooks/use-horizontal-scroll-sync.ts | 62 + .../ee/base/hooks/use-kanban-autoscroll.ts | 70 + .../src/ee/base/hooks/use-kanban-card-dnd.ts | 80 + .../src/ee/base/hooks/use-kanban-card-drop.ts | 34 + .../ee/base/hooks/use-kanban-column-dnd.ts | 63 + .../src/ee/base/hooks/use-kanban-columns.ts | 53 + .../ee/base/hooks/use-list-keyboard-nav.ts | 62 + .../src/ee/base/hooks/use-person-search.ts | 32 + .../src/ee/base/hooks/use-row-autoscroll.ts | 28 + .../src/ee/base/hooks/use-row-detail-modal.ts | 33 + .../src/ee/base/hooks/use-row-selection.ts | 101 + .../src/ee/base/hooks/use-view-draft.ts | 167 + apps/client/src/ee/base/pages/base-page.tsx | 35 + .../property-type.descriptor.ts | 42 + .../property-types/property-type.registry.tsx | 263 + .../base/queries/base-page-resolver-query.ts | 61 + .../ee/base/queries/base-property-query.ts | 171 + apps/client/src/ee/base/queries/base-query.ts | 132 + .../src/ee/base/queries/base-row-query.ts | 574 + .../src/ee/base/queries/base-view-query.ts | 155 + .../src/ee/base/queries/page-expand-loader.ts | 57 + .../src/ee/base/reference/reference-store.ts | 60 + .../src/ee/base/services/base-service.ts | 177 + .../ee/base/services/format-kanban-count.ts | 7 + .../ee/base/services/kanban-column-filter.ts | 16 + .../styles/base-table-skeleton.module.css | 53 + .../ee/base/styles/base-toolbar.module.css | 10 + .../src/ee/base/styles/base-view.module.css | 5 + .../src/ee/base/styles/cells.module.css | 487 + .../src/ee/base/styles/formula.module.css | 46 + .../client/src/ee/base/styles/grid.module.css | 717 + .../src/ee/base/styles/kanban.module.css | 174 + .../src/ee/base/styles/property.module.css | 23 + .../base/styles/row-detail-modal.module.css | 463 + .../src/ee/base/styles/views.module.css | 16 + apps/client/src/ee/base/types/base.types.ts | 388 + .../client/src/ee/base/types/react-table.d.ts | 8 + .../src/ee/base/utils/generate-base-id.ts | 5 + .../client/src/ee/base/utils/grid-cell-nav.ts | 33 + .../ee/billing/components/billing-details.tsx | 177 + .../billing/components/billing-incomplete.tsx | 13 + .../ee/billing/components/billing-plans.tsx | 233 + .../ee/billing/components/billing-trial.tsx | 32 + .../ee/billing/components/billing.module.css | 10 + .../ee/billing/components/manage-billing.tsx | 34 + apps/client/src/ee/billing/pages/billing.tsx | 38 + .../src/ee/billing/queries/billing-query.ts | 20 + .../ee/billing/services/billing-service.ts | 29 + .../src/ee/billing/types/billing.types.ts | 64 + apps/client/src/ee/billing/utils.ts | 17 + apps/client/src/ee/cloud/query/cloud-query.ts | 13 + .../src/ee/cloud/service/cloud-service.ts | 19 + .../ee/comment/components/resolve-comment.tsx | 68 + .../src/ee/comment/queries/comment-query.ts | 92 + .../src/ee/components/cloud-login-form.tsx | 157 + .../components/joined-workspaces.module.css | 13 + .../src/ee/components/joined-workspaces.tsx | 51 + .../src/ee/components/ldap-login-modal.tsx | 129 + .../src/ee/components/manage-hostname.tsx | 120 + .../client/src/ee/components/posthog-user.tsx | 41 + .../src/ee/components/sso-cloud-signup.tsx | 25 + apps/client/src/ee/components/sso-login.tsx | 142 + .../src/ee/entitlement/entitlement-atom.ts | 7 + .../src/ee/entitlement/entitlement-service.ts | 7 + .../src/ee/entitlement/entitlement.types.ts | 7 + .../src/ee/entitlement/use-entitlements.ts | 11 + apps/client/src/ee/features.ts | 30 + apps/client/src/ee/hooks/use-feature.ts | 7 + apps/client/src/ee/hooks/use-plan.tsx | 19 + .../ee/hooks/use-redirect-to-cloud-select.tsx | 20 + .../src/ee/hooks/use-trial-end-action.tsx | 36 + apps/client/src/ee/hooks/use-trial.tsx | 16 + apps/client/src/ee/hooks/use-upgrade-label.ts | 16 + .../components/activate-license-modal.tsx | 131 + .../components/installation-details.tsx | 71 + .../ee/licence/components/license-details.tsx | 87 + .../ee/licence/components/license-message.tsx | 3 + .../src/ee/licence/components/oss-details.tsx | 106 + .../ee/licence/components/remove-license.tsx | 33 + apps/client/src/ee/licence/license.utils.ts | 26 + apps/client/src/ee/licence/pages/license.tsx | 33 + .../src/ee/licence/queries/license-query.ts | 54 + .../ee/licence/services/license-service.ts | 18 + .../src/ee/licence/types/license.types.ts | 11 + .../mfa/components/mfa-backup-code-input.tsx | 82 + .../mfa/components/mfa-backup-codes-modal.tsx | 213 + .../mfa/components/mfa-challenge.module.css | 12 + .../src/ee/mfa/components/mfa-challenge.tsx | 164 + .../ee/mfa/components/mfa-disable-modal.tsx | 145 + .../src/ee/mfa/components/mfa-settings.tsx | 126 + .../src/ee/mfa/components/mfa-setup-modal.tsx | 346 + .../ee/mfa/components/mfa-setup-required.tsx | 51 + .../src/ee/mfa/components/mfa.module.css | 31 + .../ee/mfa/hooks/use-mfa-page-protection.ts | 53 + apps/client/src/ee/mfa/index.ts | 19 + .../src/ee/mfa/pages/mfa-challenge-page.tsx | 13 + .../ee/mfa/pages/mfa-setup-required-page.tsx | 113 + .../client/src/ee/mfa/services/mfa-service.ts | 61 + apps/client/src/ee/mfa/types/mfa.types.ts | 60 + .../components/authorized-apps-panel.tsx | 19 + .../oauth/components/oauth-grants-table.tsx | 178 + .../src/ee/oauth/pages/oauth-consent.tsx | 333 + .../src/ee/oauth/queries/oauth-query.ts | 45 + .../src/ee/oauth/services/oauth-service.ts | 36 + apps/client/src/ee/oauth/types/oauth.types.ts | 24 + .../components/general-access-select.tsx | 112 + .../components/page-permission-item.tsx | 107 + .../components/page-permission-list.tsx | 164 + .../components/page-permission-tab.tsx | 189 + .../components/page-permission.module.css | 128 + .../components/page-share-modal.tsx | 142 + .../components/publish-tab.tsx | 254 + .../hooks/use-page-permission.ts | 26 + apps/client/src/ee/page-permission/index.ts | 11 + .../queries/page-permission-query.ts | 175 + .../services/page-permission-service.ts | 55 + .../types/page-permission-role-data.ts | 20 + .../types/page-permission.types.ts | 61 + .../components/expiration-fields.tsx | 233 + .../components/manage-verification-form.tsx | 637 + .../page-verification-modal.module.css | 278 + .../components/page-verification-modal.tsx | 221 + .../components/setup-verification-form.tsx | 335 + .../components/user-option.tsx | 43 + .../components/verification-list-table.tsx | 226 + .../components/verification-status.ts | 43 + .../components/verifier-list.tsx | 70 + .../components/verifier-picker.tsx | 65 + apps/client/src/ee/page-verification/index.ts | 5 + .../pages/verified-pages.tsx | 122 + .../queries/page-verification-query.ts | 202 + .../services/page-verification-service.ts | 61 + .../types/page-verification.types.ts | 104 + apps/client/src/ee/pages/cloud-login.tsx | 15 + apps/client/src/ee/pages/create-workspace.tsx | 12 + apps/client/src/ee/pages/verify-email.tsx | 112 + .../src/ee/pdf-export/pdf-render-page.tsx | 65 + .../create-personal-space-modal.tsx | 78 + .../components/personal-spaces-setting.tsx | 64 + .../queries/personal-space-query.ts | 34 + .../services/personal-space-service.ts | 14 + .../components/create-scim-token-modal.tsx | 79 + .../src/ee/scim/components/enable-scim.tsx | 55 + .../components/revoke-scim-token-modal.tsx | 62 + .../components/scim-token-created-modal.tsx | 70 + .../ee/scim/components/scim-token-table.tsx | 135 + .../src/ee/scim/components/scim-url-panel.tsx | 30 + .../components/update-scim-token-modal.tsx | 78 + apps/client/src/ee/scim/index.ts | 2 + .../src/ee/scim/queries/scim-token-query.ts | 96 + .../ee/scim/services/scim-token-service.ts | 34 + .../src/ee/scim/types/scim-token.types.ts | 27 + .../components/allow-member-templates.tsx | 66 + .../security/components/allowed-domains.tsx | 91 + .../components/create-sso-provider.tsx | 99 + .../components/disable-public-sharing.tsx | 87 + .../ee/security/components/enforce-mfa.tsx | 76 + .../ee/security/components/enforce-sso.tsx | 69 + .../space-public-sharing-toggle.tsx | 91 + .../space-viewer-comments-toggle.tsx | 62 + .../security/components/sso-google-form.tsx | 92 + .../ee/security/components/sso-ldap-form.tsx | 228 + .../ee/security/components/sso-oidc-form.tsx | 155 + .../security/components/sso-provider-list.tsx | 199 + .../components/sso-provider-modal.tsx | 54 + .../ee/security/components/sso-saml-form.tsx | 168 + .../src/ee/security/components/sso.module.css | 14 + .../security/components/trash-retention.tsx | 149 + apps/client/src/ee/security/contants.ts | 6 + .../client/src/ee/security/pages/security.tsx | 199 + .../src/ee/security/queries/security-query.ts | 89 + .../ee/security/services/ldap-auth-service.ts | 23 + .../ee/security/services/security-service.ts | 33 + apps/client/src/ee/security/sso.utils.ts | 46 + .../src/ee/security/types/security.types.ts | 29 + .../components/delete-destination-modal.tsx | 44 + .../components/destination-form-modal.tsx | 300 + .../components/destination-status-badge.tsx | 15 + .../ee/siem/components/destination-table.tsx | 155 + .../siem/components/siem-streaming-panel.tsx | 129 + .../src/ee/siem/lib/destination-form.ts | 179 + apps/client/src/ee/siem/queries/siem-query.ts | 115 + .../src/ee/siem/services/siem-service.ts | 46 + apps/client/src/ee/siem/types/siem.types.ts | 91 + .../components/create-template-modal.tsx | 118 + .../components/readonly-template-editor.tsx | 50 + .../components/template-card.module.css | 81 + .../ee/template/components/template-card.tsx | 125 + .../ee/template/components/template-meta.tsx | 37 + .../template-picker-modal.module.css | 70 + .../components/template-picker-modal.tsx | 259 + .../components/template-preview-modal.tsx | 72 + .../components/use-template-modal.tsx | 63 + .../template/pages/template-editor.module.css | 74 + .../src/ee/template/pages/template-editor.tsx | 418 + .../src/ee/template/pages/template-list.tsx | 215 + .../src/ee/template/queries/template-query.ts | 227 + .../ee/template/services/template-service.ts | 47 + .../src/ee/template/types/template.types.ts | 18 + apps/client/src/ee/utils.ts | 16 + .../components/attachment-file-icon.tsx | 59 + .../components/page-attachments-modal.tsx | 191 + .../attachments/queries/attachment-query.ts | 25 + .../services/attachment-service.ts | 116 + .../features/attachments/services/index.ts | 10 + .../attachments/types/attachment.types.ts | 38 + .../features/auth/atoms/auth-tokens-atom.ts | 16 + .../features/auth/components/auth-layout.tsx | 26 + .../features/auth/components/auth.module.css | 26 + .../auth/components/forgot-password-form.tsx | 76 + .../auth/components/invite-sign-up-form.tsx | 123 + .../features/auth/components/login-form.tsx | 133 + .../auth/components/password-reset-form.tsx | 71 + .../auth/components/setup-workspace-form.tsx | 128 + .../src/features/auth/hooks/use-auth.ts | 218 + .../hooks/use-redirect-if-authenticated.ts | 15 + .../src/features/auth/queries/auth-query.tsx | 37 + .../features/auth/services/auth-service.ts | 54 + .../src/features/auth/types/auth.types.ts | 47 + .../features/comment/atoms/comment-atom.ts | 17 + .../comment/components/comment-actions.tsx | 39 + .../comment/components/comment-dialog.tsx | 186 + .../comment/components/comment-editor.tsx | 153 + .../comment/components/comment-list-item.tsx | 218 + .../components/comment-list-with-tabs.tsx | 408 + .../comment/components/comment-menu.tsx | 99 + .../comment/components/comment.module.css | 60 + .../features/comment/queries/comment-query.ts | 161 + .../comment/services/comment-service.ts | 42 + .../features/comment/types/comment.types.ts | 42 + .../src/features/editor/atoms/editor-atoms.ts | 29 + .../src/features/editor/collab-socket.ts | 46 + .../components/attachment/attachment-view.tsx | 87 + .../attachment/upload-attachment-action.tsx | 41 + .../editor/components/audio/audio-menu.tsx | 127 + .../components/audio/audio-view.module.css | 37 + .../editor/components/audio/audio-view.tsx | 70 + .../components/audio/upload-audio-action.tsx | 36 + .../components/base-embed/base-embed-view.tsx | 181 + .../base-embed/base-embed.module.css | 76 + .../base-embed/insert-base-embed.ts | 72 + .../bubble-menu/bubble-menu.module.css | 65 + .../components/bubble-menu/bubble-menu.tsx | 287 + .../components/bubble-menu/color-selector.tsx | 412 + .../components/bubble-menu/link-selector.tsx | 25 + .../components/bubble-menu/node-selector.tsx | 210 + .../bubble-menu/readonly-bubble-menu.tsx | 164 + .../bubble-menu/text-alignment-selector.tsx | 136 + .../components/callout/callout-menu.tsx | 221 + .../components/callout/callout-view.tsx | 75 + .../components/callout/callout.module.css | 22 + .../components/code-block/code-block-view.tsx | 105 + .../code-block/code-block.module.css | 24 + .../components/code-block/mermaid-view.tsx | 59 + .../components/columns/columns-menu.tsx | 364 + .../common/editor-paste-handler.tsx | 244 + .../components/common/lightbox-view.tsx | 188 + .../components/common/node-resize-handles.ts | 35 + .../components/common/node-resize.module.css | 75 + .../components/common/node-width-resize.tsx | 35 + .../common/resizable-wrapper.module.css | 192 + .../components/common/resizable-wrapper.tsx | 173 + .../components/common/toolbar-menu.module.css | 29 + .../common/use-alt-text-control.tsx | 139 + .../editor/components/drawio/drawio-menu.tsx | 437 + .../editor/components/drawio/drawio-view.tsx | 216 + .../editor/components/editor-skeleton.tsx | 39 + .../components/embed/embed-view.module.css | 25 + .../editor/components/embed/embed-view.tsx | 172 + .../components/emoji-menu/emoji-items.ts | 34 + .../components/emoji-menu/emoji-list.tsx | 286 + .../emoji-menu/emoji-menu.module.css | 107 + .../emoji-menu/render-emoji-items.ts | 116 + .../editor/components/emoji-menu/types.ts | 16 + .../editor/components/emoji-menu/utils.ts | 90 + .../empty-page-get-started.module.css | 29 + .../empty-page/empty-page-get-started.tsx | 82 + .../excalidraw/excalidraw-menu-lazy.tsx | 14 + .../components/excalidraw/excalidraw-menu.tsx | 478 + .../components/excalidraw/excalidraw-utils.ts | 42 + .../excalidraw/excalidraw-view-lazy.tsx | 14 + .../components/excalidraw/excalidraw-view.tsx | 258 + .../fixed-toolbar/fixed-toolbar.module.css | 73 + .../fixed-toolbar/fixed-toolbar.tsx | 75 + .../fixed-toolbar/groups/alignment-group.tsx | 28 + .../fixed-toolbar/groups/ask-ai-group.tsx | 23 + .../fixed-toolbar/groups/block-type-group.tsx | 115 + .../fixed-toolbar/groups/color-group.tsx | 24 + .../fixed-toolbar/groups/history-group.tsx | 44 + .../groups/inline-marks-group.tsx | 131 + .../fixed-toolbar/groups/lists-group.tsx | 61 + .../fixed-toolbar/groups/media-group.tsx | 127 + .../groups/more-inserts-group.tsx | 283 + .../groups/quick-inserts-group.tsx | 117 + .../fixed-toolbar/use-toolbar-state.ts | 50 + .../editor/components/image/image-menu.tsx | 280 + .../components/image/image-resize-handles.ts | 7 + .../components/image/image-resize.module.css | 64 + .../components/image/image-view.module.css | 31 + .../editor/components/image/image-view.tsx | 71 + .../components/image/upload-image-action.tsx | 35 + .../components/link/internal-link-paste.ts | 76 + .../components/link/link-editor-panel.tsx | 217 + .../editor/components/link/link-menu.tsx | 114 + .../editor/components/link/link-view.tsx | 643 + .../editor/components/link/link.module.css | 102 + .../features/editor/components/link/types.ts | 5 + .../components/link/use-link-editor-state.tsx | 39 + .../editor/components/math/math-block.tsx | 165 + .../editor/components/math/math-inline.tsx | 140 + .../editor/components/math/math.module.css | 53 + .../components/mention/mention-list.tsx | 498 + .../components/mention/mention-suggestion.ts | 173 + .../components/mention/mention-view.tsx | 213 + .../components/mention/mention.module.css | 58 + .../editor/components/mention/mention.type.ts | 31 + .../editor/components/pdf/pdf-menu.tsx | 148 + .../editor/components/pdf/pdf-view.module.css | 100 + .../editor/components/pdf/pdf-view.tsx | 183 + .../components/pdf/upload-pdf-action.tsx | 36 + .../atoms/search-and-replace-state-atom.ts | 9 + .../search-and-replace-dialog.tsx | 346 + .../search-navigation-dialog.tsx | 205 + .../search-replace.module.css | 10 + .../use-search-navigation-params.ts | 47 + .../components/slash-menu/command-list.tsx | 209 + .../components/slash-menu/menu-items.ts | 859 + .../components/slash-menu/render-items.ts | 118 + .../slash-menu/slash-menu.module.css | 31 + .../editor/components/slash-menu/types.ts | 29 + .../editor/components/status/status-view.tsx | 158 + .../components/status/status.module.css | 65 + .../components/subpages/subpages-menu.tsx | 86 + .../components/subpages/subpages-view.tsx | 172 + .../components/subpages/subpages.module.css | 9 + .../table-of-contents.module.css | 59 + .../table-of-contents/table-of-contents.tsx | 189 + .../components/table/handle/cell-chevron.tsx | 130 + .../components/table/handle/column-handle.tsx | 135 + .../components/table/handle/handle.module.css | 108 + .../hooks/use-column-row-menu-lifecycle.ts | 43 + .../table/handle/hooks/use-table-clear.ts | 56 + .../handle/hooks/use-table-handle-drag.ts | 79 + .../handle/hooks/use-table-handle-state.ts | 23 + .../handle/hooks/use-table-move-row-column.ts | 50 + .../table/handle/hooks/use-table-sort.ts | 101 + .../table/handle/lib/select-row-column.ts | 34 + .../components/table/handle/lib/sort-cells.ts | 57 + .../table/handle/menus/alignment-submenu.tsx | 49 + .../table/handle/menus/cell-chevron-menu.tsx | 154 + .../table/handle/menus/column-handle-menu.tsx | 177 + .../table/handle/menus/row-handle-menu.tsx | 138 + .../components/table/handle/row-handle.tsx | 130 + .../table/handle/table-handles-layer.tsx | 44 + .../table/table-background-color.tsx | 159 + .../components/table/table-cell-menu.tsx | 143 + .../editor/components/table/table-menu.tsx | 267 + .../components/table/table-text-alignment.tsx | 126 + .../editor/components/table/types/types.ts | 20 + .../transclusion/error-placeholder.tsx | 17 + .../transclusion/no-access-placeholder.tsx | 13 + .../transclusion/not-found-placeholder.tsx | 17 + .../transclusion/transclusion-content.tsx | 49 + .../transclusion-lookup-context.tsx | 228 + .../transclusion-reference-view.tsx | 214 + .../transclusion/transclusion-view.tsx | 127 + .../transclusion/transclusion.module.css | 230 + .../components/video/upload-video-action.tsx | 36 + .../editor/components/video/video-menu.tsx | 237 + .../components/video/video-view.module.css | 38 + .../editor/components/video/video-view.tsx | 81 + .../features/editor/extensions/autojoiner.ts | 105 + .../editor/extensions/clean-styles.ts | 20 + .../editor/extensions/document.test.ts | 112 + .../features/editor/extensions/document.ts | 8 + .../features/editor/extensions/drag-handle.ts | 550 + .../editor/extensions/emoji-command.ts | 48 + .../features/editor/extensions/extensions.ts | 478 + .../editor/extensions/markdown-clipboard.ts | 230 + .../features/editor/extensions/placeholder.ts | 64 + .../editor/extensions/slash-command.ts | 51 + .../src/features/editor/extensions/utils.ts | 13 + .../src/features/editor/full-editor.tsx | 220 + .../editor/hooks/use-editor-scroll.ts | 62 + .../src/features/editor/page-editor.tsx | 541 + .../features/editor/readonly-page-editor.tsx | 175 + .../src/features/editor/styles/base-embed.css | 17 + .../src/features/editor/styles/code.css | 115 + .../features/editor/styles/collaboration.css | 26 + .../src/features/editor/styles/columns.css | 124 + .../src/features/editor/styles/core.css | 317 + .../src/features/editor/styles/details.css | 82 + .../features/editor/styles/drag-handle.css | 56 + .../features/editor/styles/editor.module.css | 25 + .../src/features/editor/styles/find.css | 9 + .../src/features/editor/styles/footnotes.css | 26 + .../src/features/editor/styles/highlight.css | 177 + .../src/features/editor/styles/indent.css | 14 + .../src/features/editor/styles/index.css | 21 + .../src/features/editor/styles/media.css | 118 + .../src/features/editor/styles/mention.css | 5 + .../features/editor/styles/ordered-list.css | 34 + .../src/features/editor/styles/page-break.css | 50 + .../features/editor/styles/placeholder.css | 32 + .../src/features/editor/styles/print.css | 23 + .../src/features/editor/styles/status.css | 17 + .../src/features/editor/styles/table.css | 276 + .../src/features/editor/styles/task-list.css | 39 + .../src/features/editor/styles/youtube.css | 25 + .../src/features/editor/title-editor.tsx | 266 + .../client/src/features/editor/utils/index.ts | 2 + .../editor/utils/is-custom-node-selected.ts | 11 + .../features/editor/utils/is-text-selected.ts | 26 + .../favorite/components/star-button.tsx | 105 + .../favorite/queries/favorite-query.ts | 92 + .../favorite/services/favorite-service.ts | 37 + .../features/favorite/types/favorite.types.ts | 33 + .../file-task/services/file-task-service.ts | 19 + .../file-task/types/file-task.types.ts | 17 + .../components/add-group-member-modal.tsx | 55 + .../group/components/create-group-form.tsx | 89 + .../group/components/create-group-modal.tsx | 25 + .../group/components/edit-group-form.tsx | 96 + .../group/components/edit-group-modal.tsx | 32 + .../group/components/group-action-menu.tsx | 96 + .../group/components/group-details.tsx | 40 + .../features/group/components/group-list.tsx | 111 + .../group/components/group-members.tsx | 139 + .../group/components/multi-group-select.tsx | 84 + .../group/components/multi-user-select.tsx | 82 + .../src/features/group/queries/group-query.ts | 168 + .../features/group/services/group-service.ts | 52 + .../src/features/group/types/group.types.ts | 12 + .../src/features/home/atoms/home-tab-atom.ts | 3 + .../home/components/created-by-me.tsx | 120 + .../home/components/favorites-pages.tsx | 127 + .../home/components/home-ai-prompt.module.css | 28 + .../home/components/home-ai-prompt.tsx | 60 + .../features/home/components/home-tabs.tsx | 53 + .../features/home/components/home.module.css | 10 + .../features/label/components/label-chip.tsx | 51 + .../components/label-page-row-skeleton.tsx | 29 + .../label/components/label-page-row.tsx | 91 + .../label/components/label-picker.tsx | 160 + .../label/components/labels-section.tsx | 93 + .../src/features/label/label.module.css | 325 + .../src/features/label/queries/label-query.ts | 158 + .../features/label/services/label-service.ts | 55 + .../src/features/label/types/label.types.ts | 70 + .../features/label/utils/format-label-date.ts | 27 + .../src/features/label/utils/label-colors.ts | 55 + .../features/label/utils/normalize-label.ts | 3 + .../components/notification-item.tsx | 209 + .../components/notification-list.tsx | 121 + .../components/notification-popover.tsx | 195 + .../hooks/use-notification-socket.ts | 23 + .../notification/notification.module.css | 16 + .../notification/notification.utils.ts | 76 + .../queries/notification-query.ts | 59 + .../services/notification-service.ts | 32 + .../notification/types/notification.types.ts | 51 + .../components/backlinks-list.tsx | 113 + .../components/backlinks-modal.tsx | 62 + .../components/page-details-aside.tsx | 238 + .../page-details/queries/backlinks-query.ts | 45 + .../services/backlinks-service.ts | 26 + .../page-details/types/backlink.types.ts | 23 + .../page-history/atoms/history-atoms.ts | 18 + .../components/css/history-mobile.module.css | 69 + .../components/css/history.module.css | 106 + .../components/history-editor.tsx | 203 + .../page-history/components/history-item.tsx | 184 + .../page-history/components/history-list.tsx | 259 + .../components/history-modal-body.tsx | 163 + .../components/history-modal-mobile.tsx | 215 + .../page-history/components/history-modal.tsx | 71 + .../page-history/components/history-view.tsx | 53 + .../src/features/page-history/hooks/index.ts | 3 + .../page-history/hooks/use-diff-navigation.ts | 58 + .../page-history/hooks/use-history-reset.ts | 47 + .../hooks/use-history-restore.tsx | 104 + .../queries/page-history-query.ts | 56 + .../services/page-history-service.ts | 23 + .../features/page-history/types/page.types.ts | 22 + .../utils/resolve-compare-pair.test.ts | 32 + .../utils/resolve-compare-pair.ts | 18 + .../breadcrumbs/breadcrumb.module.css | 30 + .../components/breadcrumbs/breadcrumb.tsx | 189 + .../page/components/copy-page-modal.tsx | 105 + .../components/header/page-header-menu.tsx | 475 + .../components/header/page-header.module.css | 27 + .../page/components/header/page-header.tsx | 68 + .../page/components/move-page-modal.tsx | 100 + .../page/components/page-import-modal.tsx | 514 + .../page/hooks/use-delete-page-modal.tsx | 40 + .../page/hooks/use-restore-page-modal.tsx | 30 + apps/client/src/features/page/page.utils.ts | 104 + .../src/features/page/queries/page-query.ts | 624 + .../features/page/queries/watcher-query.ts | 43 + .../features/page/services/page-service.ts | 215 + .../features/page/services/watcher-service.ts | 16 + .../trash/components/deleted-page-banner.tsx | 140 + .../page/trash/components/trash-banner.tsx | 21 + .../components/trash-page-content-modal.tsx | 53 + .../features/page/trash/components/trash.tsx | 212 + .../page/tree/atoms/open-tree-nodes-atom.ts | 5 + .../page/tree/atoms/tree-data-atom.ts | 19 + .../doc-tree-drag-preview.module.css | 26 + .../tree/components/doc-tree-drag-preview.tsx | 9 + .../components/doc-tree-drop-indicator.tsx | 39 + .../page/tree/components/doc-tree-row.tsx | 410 + .../page/tree/components/doc-tree.tsx | 580 + .../tree/components/space-tree-node-menu.tsx | 271 + .../page/tree/components/space-tree-row.tsx | 298 + .../page/tree/components/space-tree.tsx | 230 + .../hooks/drop-op-to-move-payload.test.ts | 100 + .../tree/hooks/drop-op-to-move-payload.ts | 36 + .../page/tree/hooks/use-tree-mutation.ts | 274 + .../page/tree/model/tree-model.test.ts | 329 + .../features/page/tree/model/tree-model.ts | 222 + .../page/tree/model/tree-model.types.ts | 20 + .../features/page/tree/styles/tree.module.css | 190 + apps/client/src/features/page/tree/types.ts | 13 + .../src/features/page/tree/utils/index.ts | 1 + .../src/features/page/tree/utils/utils.ts | 240 + .../src/features/page/types/page.types.ts | 103 + .../public-space/atoms/public-space-atoms.ts | 17 + .../components/appearance-settings.module.css | 51 + .../components/appearance-settings.tsx | 165 + .../components/docs/docs-breadcrumbs.tsx | 114 + .../components/docs/docs-copy-page.tsx | 45 + .../components/docs/docs-edit-page.tsx | 31 + .../components/docs/docs-footer-branding.tsx | 23 + .../components/docs/docs-hub.module.css | 485 + .../components/docs/docs-page-nav.tsx | 70 + .../components/docs/docs-search-button.tsx | 22 + .../components/docs/docs-shell.tsx | 223 + .../components/docs/docs-sidebar-tree.tsx | 198 + .../components/docs/docs-surface-context.tsx | 27 + .../components/docs/docs-theme-toggle.tsx | 35 + .../public-space/components/docs/docs-toc.tsx | 116 + .../components/docs/docs.module.css | 952 + .../components/public-space-layout.tsx | 69 + .../components/publish-space-settings.tsx | 283 + .../components/published-spaces-list.tsx | 210 + .../components/space-public-notice.tsx | 47 + .../hooks/use-authenticated-user.ts | 14 + .../hooks/use-docs-current-page.ts | 23 + .../queries/public-space-query.ts | 109 + .../services/public-space-service.ts | 73 + .../features/public-space/theme/docs-theme.ts | 91 + .../public-space/types/public-space.types.ts | 105 + .../features/public-space/utils/docs-tree.ts | 39 + .../public-space/utils/public-space-access.ts | 8 + .../search/components/creator-filter-menu.tsx | 152 + .../search/components/label-filter-menu.tsx | 127 + .../public-space-search-spotlight.tsx | 112 + .../components/search-control.module.css | 46 + .../search/components/search-control.tsx | 58 + .../search/components/search-result-item.tsx | 160 + .../search-spotlight-filters.module.css | 26 + .../components/search-spotlight-filters.tsx | 379 + .../search/components/search-spotlight.tsx | 263 + .../components/share-search-spotlight.tsx | 94 + apps/client/src/features/search/constants.ts | 10 + .../search/hooks/use-unified-search.ts | 58 + .../features/search/queries/search-query.ts | 68 + .../search/services/search-service.ts | 46 + .../src/features/search/types/search.types.ts | 66 + .../session/components/session-list.tsx | 178 + .../features/session/queries/session-query.ts | 55 + .../session/services/session-service.ts | 17 + .../features/session/types/session.types.ts | 8 + .../features/share/atoms/shared-page-atom.ts | 10 + .../share/components/share-action-menu.tsx | 106 + .../share/components/share-layout.tsx | 67 + .../features/share/components/share-list.tsx | 112 + .../features/share/components/share-modal.tsx | 287 + .../share/components/share.module.css | 8 + .../share/hooks/use-shared-page-subpages.ts | 13 + .../src/features/share/queries/share-query.ts | 180 + .../features/share/services/share-service.ts | 59 + .../src/features/share/types/share.types.ts | 75 + apps/client/src/features/share/utils.ts | 106 + .../components/add-space-members-modal.tsx | 84 + .../space/components/create-space-form.tsx | 133 + .../space/components/create-space-modal.tsx | 25 + .../space/components/delete-space-modal.tsx | 94 + .../space/components/edit-space-form.tsx | 110 + .../space/components/multi-member-select.tsx | 105 + .../space/components/settings-modal.tsx | 147 + .../space/components/sidebar/space-select.tsx | 108 + .../sidebar/space-sidebar.module.css | 96 + .../components/sidebar/space-sidebar.tsx | 423 + .../sidebar/switch-space.module.css | 5 + .../space/components/sidebar/switch-space.tsx | 96 + .../components/space-carousel.module.css | 27 + .../space/components/space-carousel.tsx | 105 + .../space/components/space-details.tsx | 133 + .../space/components/space-filter-menu.tsx | 131 + .../space/components/space-grid.module.css | 47 + .../features/space/components/space-grid.tsx | 84 + .../space/components/space-home-tabs.tsx | 57 + .../space/components/space-home.module.css | 10 + .../features/space/components/space-list.tsx | 109 + .../space/components/space-member-role.tsx | 60 + .../space/components/space-members.tsx | 249 + .../components/space-security-settings.tsx | 34 + .../spaces-page/all-spaces-list.module.css | 16 + .../spaces-page/all-spaces-list.tsx | 227 + .../spaces-page/favorite-spaces-grid.tsx | 91 + .../space/components/spaces-page/index.ts | 1 + .../space/permissions/permissions.type.ts | 20 + .../space/permissions/use-space-ability.ts | 15 + .../src/features/space/queries/space-query.ts | 266 + .../space/queries/space-watcher-query.ts | 78 + .../features/space/services/space-service.ts | 80 + .../space/services/space-watcher-service.ts | 34 + .../features/space/types/space-role-data.ts | 24 + .../src/features/space/types/space.types.ts | 96 + .../sync-block-references-dropdown.module.css | 205 + .../sync-block-references-dropdown.tsx | 184 + .../queries/transclusion-query.ts | 32 + .../transclusion/services/transclusion-api.ts | 45 + .../transclusion/types/transclusion.types.ts | 23 + .../features/user/atoms/current-user-atom.ts | 41 + .../user/components/account-avatar.tsx | 58 + .../user/components/account-language.tsx | 63 + .../user/components/account-mfa-section.tsx | 6 + .../user/components/account-name-form.tsx | 75 + .../user/components/account-theme.tsx | 49 + .../features/user/components/change-email.tsx | 112 + .../user/components/change-password.tsx | 126 + .../user/components/fixed-toolbar-pref.tsx | 57 + .../user/components/notification-pref.tsx | 126 + .../user/components/page-state-pref.tsx | 95 + .../user/components/page-width-pref.tsx | 61 + .../features/user/hooks/use-current-user.ts | 12 + .../features/user/services/user-service.ts | 12 + .../src/features/user/types/user.types.ts | 55 + .../src/features/user/user-provider.tsx | 84 + .../features/websocket/atoms/socket-atom.ts | 4 + .../src/features/websocket/types/constants.ts | 1 + .../src/features/websocket/types/index.ts | 2 + .../src/features/websocket/types/types.ts | 105 + .../src/features/websocket/use-query-emit.ts | 11 + .../websocket/use-query-subscription.ts | 157 + .../src/features/websocket/use-tree-socket.ts | 153 + .../members/components/invite-action-menu.tsx | 116 + .../components/members-action-menu.tsx | 129 + .../components/workspace-invite-form.tsx | 106 + .../components/workspace-invite-modal.tsx | 29 + .../components/workspace-invite-section.tsx | 45 + .../components/workspace-invites-table.tsx | 78 + .../components/workspace-members-table.tsx | 138 + .../components/allow-public-spaces.tsx | 129 + .../workspace-default-page-edit-mode.tsx | 71 + .../settings/components/workspace-icon.tsx | 67 + .../components/workspace-name-form.tsx | 74 + .../workspace/queries/workspace-query.ts | 242 + .../workspace/services/workspace-service.ts | 124 + .../workspace/types/user-role-data.ts | 24 + .../workspace/types/workspace.types.ts | 122 + apps/client/src/hooks/use-clipboard.ts | 60 + apps/client/src/hooks/use-cursor-paginate.tsx | 28 + apps/client/src/hooks/use-idle.ts | 58 + apps/client/src/hooks/use-match-path.tsx | 16 + .../src/hooks/use-paginate-and-search.tsx | 34 + .../src/hooks/use-settings-navigation.ts | 14 + apps/client/src/hooks/use-time-ago.tsx | 32 + apps/client/src/hooks/use-toggle-aside.tsx | 36 + apps/client/src/hooks/use-track-origin.ts | 16 + apps/client/src/hooks/use-user-role.tsx | 19 + apps/client/src/i18n.ts | 28 + apps/client/src/lib/api-client.ts | 100 + apps/client/src/lib/api-error.ts | 17 + apps/client/src/lib/app-route.ts | 68 + apps/client/src/lib/config.ts | 116 + apps/client/src/lib/constants.ts | 4 + apps/client/src/lib/date-locale.ts | 62 + apps/client/src/lib/get-initials-color.ts | 34 + apps/client/src/lib/index.ts | 2 + apps/client/src/lib/jotai-helper.ts | 17 + apps/client/src/lib/local-emitter.ts | 3 + apps/client/src/lib/time.ts | 25 + apps/client/src/lib/types.ts | 41 + apps/client/src/lib/utils.tsx | 141 + apps/client/src/main.tsx | 64 + .../client/src/pages/auth/forgot-password.tsx | 11 + apps/client/src/pages/auth/invite-signup.tsx | 14 + apps/client/src/pages/auth/login.tsx | 14 + apps/client/src/pages/auth/password-reset.tsx | 51 + .../client/src/pages/auth/setup-workspace.tsx | 44 + apps/client/src/pages/dashboard/home.tsx | 27 + .../src/pages/favorites/favorites-page.tsx | 141 + apps/client/src/pages/label/label-page.tsx | 175 + apps/client/src/pages/page/page-redirect.tsx | 33 + apps/client/src/pages/page/page.tsx | 186 + .../public-space-directory-page.tsx | 235 + .../pages/public-space/public-space-page.tsx | 125 + .../settings/account/account-preferences.tsx | 43 + .../settings/account/account-settings.tsx | 41 + .../src/pages/settings/group/group-info.tsx | 18 + .../src/pages/settings/group/groups.tsx | 25 + .../src/pages/settings/shares/shares.tsx | 64 + .../src/pages/settings/space/spaces.tsx | 25 + .../settings/workspace/workspace-members.tsx | 72 + .../settings/workspace/workspace-settings.tsx | 47 + .../client/src/pages/share/share-redirect.tsx | 35 + apps/client/src/pages/share/shared-page.tsx | 92 + apps/client/src/pages/space/space-home.tsx | 21 + apps/client/src/pages/space/space-trash.tsx | 27 + apps/client/src/pages/spaces/spaces.tsx | 51 + apps/client/src/styles/a11y-overrides.css | 73 + apps/client/src/styles/public-typography.css | 39 + apps/client/src/theme.ts | 133 + apps/client/src/vite-env.d.ts | 2 + apps/client/tsconfig.json | 33 + apps/client/tsconfig.node.json | 12 + apps/client/vite.config.ts | 80 + apps/client/vitest.config.ts | 17 + apps/server/.dockerignore | 5 + apps/server/.gitignore | 38 + apps/server/.prettierrc | 4 + apps/server/README.md | 97 + apps/server/eslint.config.mjs | 34 + apps/server/nest-cli.json | 8 + apps/server/package.json | 204 + apps/server/src/app.controller.ts | 12 + apps/server/src/app.module.ts | 114 + apps/server/src/app.service.ts | 8 + .../adapter/collab-ws.adapter.ts | 51 + .../collaboration/collaboration.gateway.ts | 194 + .../collaboration/collaboration.handler.ts | 134 + .../src/collaboration/collaboration.module.ts | 74 + .../src/collaboration/collaboration.util.ts | 249 + apps/server/src/collaboration/constants.ts | 3 + .../extensions/authentication.extension.ts | 110 + .../extensions/logger.extension.ts | 19 + .../extensions/persistence.extension.ts | 296 + .../redis-sync/collab-proxy-socket.ts | 46 + .../extensions/redis-sync/index.ts | 2 + .../redis-sync/redis-sync.extension.ts | 428 + .../extensions/redis-sync/redis-sync.types.ts | 138 + .../redis-sync/ws-socket-wrapper.ts | 35 + .../processors/history.processor.ts | 142 + .../collaboration/server/collab-app.module.ts | 64 + .../src/collaboration/server/collab-main.ts | 47 + .../server/collaboration.controller.ts | 15 + .../services/collab-history.service.ts | 30 + apps/server/src/collaboration/yjs.util.ts | 177 + .../common/decorators/auth-user.decorator.ts | 16 + .../decorators/auth-workspace.decorator.ts | 18 + .../decorators/oauth-scope.decorator.ts | 8 + .../src/common/decorators/public.decorator.ts | 4 + .../require-session-auth.decorator.ts | 6 + .../decorators/skip-transform.decorator.ts | 4 + apps/server/src/common/events/audit-events.ts | 179 + .../src/common/events/event.contants.ts | 45 + apps/server/src/common/features.ts | 33 + .../src/common/guards/jwt-auth.guard.spec.ts | 186 + .../src/common/guards/jwt-auth.guard.ts | 114 + apps/server/src/common/helpers/cache-keys.ts | 12 + apps/server/src/common/helpers/constants.ts | 18 + apps/server/src/common/helpers/file.helper.ts | 7 + .../server/src/common/helpers/html-escaper.ts | 71 + apps/server/src/common/helpers/index.ts | 6 + .../server/src/common/helpers/nanoid.utils.ts | 13 + .../prosemirror/attachment-node-types.ts | 13 + .../helpers/prosemirror/html/generateHTML.ts | 29 + .../helpers/prosemirror/html/generateJSON.ts | 55 + .../prosemirror/html/getHTMLFromFragment.ts | 54 + .../common/helpers/prosemirror/html/index.ts | 2 + .../helpers/prosemirror/indent-schema.spec.ts | 63 + .../src/common/helpers/prosemirror/utils.ts | 170 + .../common/helpers/security-headers.spec.ts | 66 + .../src/common/helpers/security-headers.ts | 35 + .../src/common/helpers/text.utils.spec.ts | 14 + apps/server/src/common/helpers/text.utils.ts | 3 + .../helpers/types/export-metadata.types.ts | 16 + .../src/common/helpers/types/permission.ts | 30 + apps/server/src/common/helpers/utils.spec.ts | Bin 0 -> 3319 bytes apps/server/src/common/helpers/utils.ts | 217 + apps/server/src/common/helpers/with-cache.ts | 27 + .../interceptors/audit-actor.interceptor.ts | 29 + .../common/interceptors/file.interceptor.ts | 25 + .../interceptors/http-response.interceptor.ts | 40 + .../src/common/logger/internal-log-filter.ts | 82 + .../server/src/common/logger/logger.module.ts | 9 + apps/server/src/common/logger/pino.config.ts | 77 + .../middlewares/audit-context.middleware.ts | 39 + .../common/middlewares/domain.middleware.ts | 45 + .../src/common/validators/is-iso6391.ts | 34 + .../validators/no-urls.validator.spec.ts | 142 + .../common/validators/no-urls.validator.ts | 42 + .../core/attachment/attachment.constants.ts | 24 + .../core/attachment/attachment.controller.ts | 584 + .../src/core/attachment/attachment.module.ts | 15 + .../src/core/attachment/attachment.utils.ts | 81 + .../src/core/attachment/dto/attachment.dto.ts | 36 + .../processors/attachment.processor.ts | 96 + .../attachment/services/attachment.service.ts | 464 + apps/server/src/core/auth/auth.constants.ts | 4 + .../src/core/auth/auth.controller.spec.ts | 18 + apps/server/src/core/auth/auth.controller.ts | 231 + apps/server/src/core/auth/auth.module.ts | 15 + apps/server/src/core/auth/auth.util.ts | 53 + .../src/core/auth/dto/change-password.dto.ts | 13 + .../core/auth/dto/create-admin-user.dto.ts | 33 + .../src/core/auth/dto/create-user.dto.ts | 30 + .../src/core/auth/dto/forgot-password.dto.ts | 7 + apps/server/src/core/auth/dto/jwt-payload.ts | 73 + apps/server/src/core/auth/dto/login.dto.ts | 11 + .../src/core/auth/dto/password-reset.dto.ts | 10 + .../core/auth/dto/verify-user-token.dto.ts | 9 + .../src/core/auth/guards/setup.guard.ts | 23 + .../core/auth/services/auth.service.spec.ts | 18 + .../src/core/auth/services/auth.service.ts | 351 + .../src/core/auth/services/signup.service.ts | 144 + .../core/auth/services/token.service.spec.ts | 18 + .../src/core/auth/services/token.service.ts | 157 + .../src/core/auth/strategies/jwt.strategy.ts | 155 + apps/server/src/core/auth/token.module.ts | 25 + .../casl/abilities/space-ability.factory.ts | 72 + .../abilities/workspace-ability.factory.ts | 77 + apps/server/src/core/casl/casl.module.ts | 10 + .../casl/interfaces/space-ability.type.ts | 19 + .../casl/interfaces/workspace-ability.type.ts | 25 + .../src/core/comment/comment.controller.ts | 205 + .../server/src/core/comment/comment.module.ts | 12 + .../src/core/comment/comment.service.spec.ts | 18 + .../src/core/comment/comment.service.ts | 243 + .../src/core/comment/dto/comments.input.ts | 11 + .../core/comment/dto/create-comment.dto.ts | 46 + .../core/comment/dto/update-comment.dto.ts | 9 + apps/server/src/core/core.module.ts | 70 + .../src/core/favorite/dto/favorite-ids.dto.ts | 12 + .../src/core/favorite/dto/favorite.dto.ts | 28 + .../core/favorite/dto/list-favorites.dto.ts | 12 + .../src/core/favorite/favorite.controller.ts | 153 + .../src/core/favorite/favorite.module.ts | 10 + .../favorite/services/favorite.service.ts | 129 + .../src/core/group/dto/add-group-user.dto.ts | 12 + .../src/core/group/dto/create-group.dto.ts | 33 + .../server/src/core/group/dto/group-id.dto.ts | 7 + .../core/group/dto/remove-group-user.dto.ts | 7 + .../src/core/group/dto/update-group.dto.ts | 9 + .../src/core/group/group.controller.spec.ts | 20 + .../server/src/core/group/group.controller.ts | 176 + apps/server/src/core/group/group.module.ts | 12 + .../core/group/services/group-user.service.ts | 173 + .../core/group/services/group.service.spec.ts | 18 + .../src/core/group/services/group.service.ts | 230 + apps/server/src/core/label/dto/label.dto.ts | 84 + .../server/src/core/label/label.controller.ts | 122 + apps/server/src/core/label/label.module.ts | 10 + apps/server/src/core/label/label.service.ts | 154 + apps/server/src/core/label/utils.ts | 3 + .../core/notification/dto/notification.dto.ts | 21 + .../notification/notification.constants.ts | 59 + .../notification/notification.controller.ts | 55 + .../core/notification/notification.module.ts | 23 + .../notification/notification.processor.ts | 230 + .../core/notification/notification.service.ts | 130 + .../services/comment.notification.ts | 241 + .../page-update-email-rate-limiter.ts | 43 + .../services/page.notification.ts | 447 + .../services/verification.notification.ts | 355 + apps/server/src/core/page/dto/backlink.dto.ts | 11 + .../src/core/page/dto/create-page.dto.ts | 36 + .../src/core/page/dto/created-by-user.dto.ts | 11 + .../src/core/page/dto/deleted-page.dto.ts | 7 + .../src/core/page/dto/duplicate-page.dto.ts | 24 + .../server/src/core/page/dto/move-page.dto.ts | 31 + apps/server/src/core/page/dto/page.dto.ts | 48 + .../src/core/page/dto/recent-page.dto.ts | 7 + .../src/core/page/dto/sidebar-page.dto.ts | 11 + .../src/core/page/dto/update-page.dto.ts | 24 + .../page/page-access/page-access.module.ts | 9 + .../page/page-access/page-access.service.ts | 125 + .../src/core/page/page.controller.spec.ts | 20 + apps/server/src/core/page/page.controller.ts | 760 + apps/server/src/core/page/page.module.ts | 30 + .../page/services/backlink.service.spec.ts | 163 + .../core/page/services/backlink.service.ts | 56 + .../page/services/page-history.service.ts | 26 + .../core/page/services/page.service.spec.ts | 18 + .../src/core/page/services/page.service.ts | 1196 + .../page/services/trash-cleanup.service.ts | 127 + .../core/page/transclusion/dto/lookup.dto.ts | 26 + .../page/transclusion/dto/references.dto.ts | 9 + .../transclusion/dto/unsync-reference.dto.ts | 12 + .../transclusion-prosemirror.util.spec.ts | 240 + .../spec/transclusion-unsync.util.spec.ts | 161 + .../spec/transclusion.controller.spec.ts | 48 + .../transclusion/transclusion.controller.ts | 59 + .../page/transclusion/transclusion.module.ts | 10 + .../page/transclusion/transclusion.service.ts | 518 + .../page/transclusion/transclusion.types.ts | 14 + .../utils/transclusion-prosemirror.util.ts | 95 + .../utils/transclusion-unsync.util.ts | 65 + .../core/public-space/dto/public-space.dto.ts | 79 + .../public-space-seo.controller.ts | 173 + .../public-space/public-space.controller.ts | 249 + .../core/public-space/public-space.module.ts | 14 + .../public-space/public-space.service.spec.ts | 1103 + .../core/public-space/public-space.service.ts | 397 + .../core/search/dto/search-response.dto.ts | 16 + apps/server/src/core/search/dto/search.dto.ts | 85 + .../src/core/search/search.controller.spec.ts | 93 + .../src/core/search/search.controller.ts | 187 + apps/server/src/core/search/search.module.ts | 12 + .../src/core/search/search.service.spec.ts | 18 + apps/server/src/core/search/search.service.ts | 315 + .../core/session/dto/revoke-session.dto.ts | 7 + .../core/session/session-activity.service.ts | 36 + .../src/core/session/session.controller.ts | 80 + .../server/src/core/session/session.module.ts | 14 + .../src/core/session/session.service.ts | 127 + .../dto/share-transclusion-lookup.dto.ts | 8 + apps/server/src/core/share/dto/share.dto.ts | 58 + .../src/core/share/share-seo.controller.ts | 115 + .../server/src/core/share/share.controller.ts | 281 + apps/server/src/core/share/share.module.ts | 14 + apps/server/src/core/share/share.service.ts | 500 + apps/server/src/core/share/share.util.ts | 22 + .../core/space/dto/add-space-members.dto.ts | 26 + .../src/core/space/dto/create-space.dto.ts | 28 + .../src/core/space/dto/delete-space.dto.ts | 6 + .../core/space/dto/remove-space-member.dto.ts | 14 + .../server/src/core/space/dto/space-id.dto.ts | 8 + .../space/dto/update-space-member-role.dto.ts | 18 + .../src/core/space/dto/update-space.dto.ts | 18 + .../space/services/space-member.service.ts | 404 + .../core/space/services/space.service.spec.ts | 18 + .../src/core/space/services/space.service.ts | 298 + .../src/core/space/space.controller.spec.ts | 20 + .../server/src/core/space/space.controller.ts | 280 + apps/server/src/core/space/space.module.ts | 12 + .../src/core/user/dto/update-user.dto.ts | 58 + .../src/core/user/user.controller.spec.ts | 20 + apps/server/src/core/user/user.controller.ts | 56 + apps/server/src/core/user/user.module.ts | 11 + apps/server/src/core/user/user.service.ts | 147 + .../src/core/watcher/dto/space-watcher.dto.ts | 7 + .../src/core/watcher/dto/watcher.dto.ts | 7 + .../core/watcher/space-watcher.controller.ts | 104 + .../src/core/watcher/watcher.controller.ts | 86 + .../server/src/core/watcher/watcher.module.ts | 13 + .../src/core/watcher/watcher.service.ts | 151 + .../controllers/workspace.controller.ts | 358 + .../core/workspace/dto/check-hostname.dto.ts | 8 + .../workspace/dto/create-workspace.dto.ts | 27 + .../workspace/dto/delete-workspace.dto.ts | 6 + .../src/core/workspace/dto/invitation.dto.ts | 60 + .../dto/remove-workspace-user.dto.ts | 7 + .../dto/update-workspace-user-role.dto.ts | 12 + .../workspace/dto/update-workspace.dto.ts | 91 + .../services/workspace-invitation.service.ts | 484 + .../workspace/services/workspace.service.ts | 1070 + .../src/core/workspace/workspace.constants.ts | 117 + .../src/core/workspace/workspace.module.ts | 14 + .../src/core/workspace/workspace.util.ts | 23 + apps/server/src/database/database.module.ts | 173 + apps/server/src/database/helpers/helpers.ts | 22 + .../src/database/listeners/page.listener.ts | 80 + .../src/database/listeners/space.listener.ts | 37 + .../database/listeners/workspace.listener.ts | 36 + apps/server/src/database/migrate.ts | 29 + .../migrations/20240324T085400-uuid_v7_fn.ts | 53 + .../migrations/20240324T085500-workspaces.ts | 35 + .../migrations/20240324T085600-users.ts | 43 + .../migrations/20240324T085700-groups.ts | 57 + .../migrations/20240324T085900-spaces.ts | 81 + .../20240324T086100-add-workspace-fk.ts | 21 + .../20240324T086200-workspace_invitations.ts | 32 + .../migrations/20240324T086300-pages.ts | 59 + .../20240324T086400-page_history.ts | 39 + .../migrations/20240324T086600-comments.ts | 33 + .../migrations/20240324T086700-attachments.ts | 35 + .../20240324T086800-pages-tsvector-trigger.ts | 22 + ...5623-drop-redundant-pages-slug_id-index.ts | 7 + .../migrations/20240903T124647-user-tokens.ts | 27 + .../migrations/20241218T223249-backlinks.ts | 33 + .../migrations/20250106T195516-billing.ts | 85 + .../migrations/20250118T194658-sso-auth.ts | 86 + ...222T114520-add_license_key_to_workspace.ts | 12 + ...0327T145832-add-contributorIds-to-pages.ts | 12 + .../migrations/20250408T191830-shares.ts | 38 + .../migrations/20250521T154949-file_tasks.ts | 39 + .../20250623T215045-more-billing-columns.ts | 23 + .../migrations/20250715T070817-mfa.ts | 39 + ...0250725T052004-add-new-comments-columns.ts | 61 + ...56-add-unaccent-pg_trm-update-tsvector..ts | 50 + ...191600-add-group-sync-to-auth-providers.ts | 15 + .../migrations/20250831T202306-ldap-auth.ts | 68 + .../20250901T184612-attachments-search.ts | 29 + .../migrations/20250912T101500-api-keys.ts | 30 + .../20260205T214213-add-settings-to-spaces.ts | 9 + ...000-add-contributor_ids-to-page-history.ts | 15 + .../20260213T085259-notifications.ts | 53 + .../migrations/20260213T085320-watchers.ts | 57 + .../20260213T085337-backfill-watchers.ts | 29 + .../20260224T233803-page-permissions.ts | 90 + .../migrations/20260228T223532-audit.ts | 60 + .../20260326T121350-user-sessions.ts | 45 + .../20260329T163516-add-new-indexes.ts | 333 + .../migrations/20260409T132415-ai-chat.ts | 118 + .../migrations/20260412T135891-templates.ts | 76 + .../migrations/20260412T162318-favorites.ts | 63 + .../20260413T121647-page-verifications.ts | 117 + .../20260414T124451-update-file_tasks.ts | 32 + .../migrations/20260501T092214-scim.ts | 110 + .../20260501T202258-page-transclusions.ts | 76 + .../migrations/20260509T121236-labels.ts | 59 + .../migrations/20260529T125146-bases.ts | 249 + .../20260620T010047-personal-spaces.ts | 24 + .../20260824T211732-page-title-trgm-index.ts | 17 + .../migrations/20260825T022612-oauth.ts | 88 + .../20260902T121326-siem-destinations.ts | 66 + .../20260904T171920-public-spaces.ts | 38 + .../database/pagination/cursor-pagination.ts | 366 + .../database/pagination/pagination-options.ts | 34 + .../src/database/pagination/pagination.ts | 69 + .../repos/attachment/attachment.repo.ts | 220 + .../database/repos/backlink/backlink.repo.ts | 162 + .../database/repos/comment/comment.repo.ts | 118 + .../database/repos/favorite/favorite.repo.ts | 361 + .../database/repos/group/group-user.repo.ts | 192 + .../src/database/repos/group/group.repo.ts | 197 + .../src/database/repos/label/label.repo.ts | 345 + .../repos/notification/notification.repo.ts | 194 + .../page-transclusion-references.repo.ts | 98 + .../page-transclusions.repo.ts | 112 + .../database/repos/page/page-history.repo.ts | 143 + .../repos/page/page-permission.repo.ts | 1092 + .../src/database/repos/page/page.repo.ts | 733 + .../repos/page/types/page-permission.types.ts | 23 + .../repos/public-space/public-space.repo.ts | 196 + .../repos/session/user-session.repo.ts | 162 + .../src/database/repos/share/share.repo.ts | 266 + .../database/repos/space/space-member.repo.ts | 377 + .../src/database/repos/space/space.repo.ts | 260 + apps/server/src/database/repos/space/types.ts | 22 + apps/server/src/database/repos/space/utils.ts | 23 + .../database/repos/template/template.repo.ts | 158 + .../repos/user-token/user-token.repo.ts | 102 + .../src/database/repos/user/user.repo.ts | 245 + .../database/repos/watcher/watcher.repo.ts | 361 + .../repos/workspace/workspace.repo.ts | 330 + .../database/services/migration.service.ts | 47 + apps/server/src/database/types/db.d.ts | 780 + .../server/src/database/types/db.interface.ts | 6 + .../src/database/types/embeddings.types.ts | 20 + .../server/src/database/types/entity.types.ts | 281 + .../server/src/database/types/kysely.types.ts | 5 + apps/server/src/database/utils.ts | 33 + .../src/integrations/audit/audit.module.ts | 14 + .../src/integrations/audit/audit.service.ts | 63 + .../encryption/encryption.errors.ts | 13 + .../encryption/encryption.module.ts | 9 + .../encryption/encryption.service.spec.ts | 184 + .../encryption/encryption.service.ts | 108 + .../environment/domain.service.ts | 21 + .../environment/environment.module.ts | 22 + .../environment/environment.service.spec.ts | 18 + .../environment/environment.service.ts | 399 + .../environment/environment.validation.ts | 232 + .../environment/license-check.service.ts | 99 + .../src/integrations/export/dto/export-dto.ts | 44 + .../integrations/export/export.controller.ts | 162 + .../src/integrations/export/export.module.ts | 11 + .../src/integrations/export/export.service.ts | 611 + apps/server/src/integrations/export/utils.ts | 188 + .../integrations/health/health.controller.ts | 29 + .../src/integrations/health/health.module.ts | 13 + .../integrations/health/postgres.health.ts | 30 + .../src/integrations/health/redis.health.ts | 37 + .../integrations/import/dto/file-task-dto.ts | 19 + .../src/integrations/import/dto/import-dto.ts | 4 + .../import/file-task.controller.ts | 94 + .../integrations/import/import.controller.ts | 200 + .../src/integrations/import/import.module.ts | 22 + .../import/processors/file-task.processor.ts | 152 + .../services/file-import-task.service.ts | 637 + .../services/import-attachment.service.ts | 1001 + .../import/services/import.service.ts | 367 + .../integrations/import/utils/file.utils.ts | 238 + .../import/utils/import-formatter.ts | 410 + .../integrations/import/utils/import.utils.ts | 139 + .../integrations/import/utils/table-utils.ts | 107 + .../src/integrations/mail/drivers/index.ts | 3 + .../interfaces/mail-driver.interface.ts | 5 + .../integrations/mail/drivers/log.driver.ts | 23 + .../mail/drivers/postmark.driver.ts | 31 + .../integrations/mail/drivers/smtp.driver.ts | 33 + .../src/integrations/mail/interfaces/index.ts | 1 + .../mail/interfaces/mail.interface.ts | 30 + .../mail/interfaces/mail.message.ts | 9 + .../src/integrations/mail/mail.constants.ts | 2 + .../src/integrations/mail/mail.module.ts | 23 + .../src/integrations/mail/mail.service.ts | 65 + .../src/integrations/mail/mail.utils.ts | 3 + .../mail/processors/email.processor.ts | 57 + .../mail/providers/mail.provider.ts | 76 + .../outbound/outbound-agent.factory.spec.ts | 23 + .../outbound/outbound-agent.factory.ts | 55 + .../outbound/outbound-network-policy.spec.ts | 143 + .../outbound/outbound-network-policy.ts | 110 + .../outbound/outbound-url.guard.spec.ts | 412 + .../outbound/outbound-url.guard.ts | 231 + .../integrations/outbound/outbound.module.ts | 10 + .../src/integrations/queue/constants/index.ts | 1 + .../queue/constants/queue.constants.ts | 96 + .../queue/constants/queue.interface.ts | 159 + .../processors/general-queue.processor.ts | 87 + .../src/integrations/queue/queue.module.ts | 117 + .../queue/tasks/backlinks.task.ts | 97 + .../redis/redis-config.service.ts | 28 + .../security/robots.txt.controller.ts | 12 + .../integrations/security/security.module.ts | 10 + .../security/version.controller.ts | 27 + .../integrations/security/version.service.ts | 28 + .../src/integrations/static/static.module.ts | 95 + .../storage/constants/storage.constants.ts | 2 + .../storage/drivers/azure.driver.ts | 192 + .../src/integrations/storage/drivers/index.ts | 3 + .../storage/drivers/local.driver.spec.ts | 67 + .../storage/drivers/local.driver.ts | 132 + .../integrations/storage/drivers/s3.driver.ts | 214 + .../integrations/storage/interfaces/index.ts | 2 + .../interfaces/storage-driver.interface.ts | 32 + .../storage/interfaces/storage.interface.ts | 43 + .../storage/providers/storage.provider.ts | 100 + .../integrations/storage/storage.module.ts | 24 + .../storage/storage.service.spec.ts | 18 + .../integrations/storage/storage.service.ts | 62 + .../src/integrations/storage/storage.utils.ts | 10 + .../telemetry/telemetry.module.ts | 9 + .../telemetry/telemetry.service.ts | 87 + .../integrations/throttle/throttle.module.ts | 53 + .../integrations/throttle/throttler-names.ts | 16 + .../throttle/user-throttler.guard.ts | 13 + .../integrations/transactional/css/styles.ts | 66 + .../emails/approval-rejected-email.tsx | 41 + .../emails/approval-requested-email.tsx | 34 + .../emails/change-password-email.tsx | 23 + .../emails/comment-created-email.tsx | 31 + .../emails/comment-mention-email.tsx | 31 + .../emails/comment-resolved-email.tsx | 31 + .../emails/forgot-password-email.tsx | 31 + .../emails/invitation-accepted-email.tsx | 28 + .../transactional/emails/invitation-email.tsx | 25 + .../emails/page-mention-email.tsx | 27 + .../emails/page-update-digest-email.tsx | 76 + .../emails/page-update-email.tsx | 38 + .../emails/permission-granted-email.tsx | 33 + .../siem-destination-disabled-email.tsx | 41 + .../emails/siem-destination-failing-email.tsx | 41 + .../siem-destination-recovered-email.tsx | 35 + .../emails/verification-expired-email.tsx | 28 + .../emails/verification-expiring-email.tsx | 34 + .../transactional/partials/partials.tsx | 93 + .../integrations/transactional/utils/utils.ts | 6 + apps/server/src/main.ts | 183 + .../server/src/ws/adapter/ws-redis.adapter.ts | 38 + apps/server/src/ws/base-realtime.bridge.ts | 49 + apps/server/src/ws/ws-tree.service.ts | 47 + apps/server/src/ws/ws.gateway.ts | 107 + apps/server/src/ws/ws.module.ts | 14 + apps/server/src/ws/ws.service.ts | 208 + apps/server/src/ws/ws.utils.ts | 29 + apps/server/test/app.e2e-spec.ts | 24 + apps/server/test/jest-e2e.json | 14 + apps/server/tsconfig.build.json | 5 + apps/server/tsconfig.json | 34 + crowdin.yml | 4 + docker-compose.yml | 38 + nx.json | 22 + package.json | 99 + packages/base-formula/.gitignore | 2 + packages/base-formula/LICENSE | 37 + packages/base-formula/bench/formula-bench.ts | 329 + packages/base-formula/package.json | 28 + packages/base-formula/src/ast.ts | 33 + packages/base-formula/src/error.ts | 41 + packages/base-formula/src/eval.ts | 126 + packages/base-formula/src/format.ts | 31 + .../base-formula/src/functions/coercion.ts | 17 + packages/base-formula/src/functions/date.ts | 53 + packages/base-formula/src/functions/index.ts | 7 + packages/base-formula/src/functions/logic.ts | 11 + packages/base-formula/src/functions/math.ts | 160 + .../base-formula/src/functions/registry.ts | 24 + packages/base-formula/src/functions/string.ts | 35 + packages/base-formula/src/graph.ts | 88 + packages/base-formula/src/index.client.ts | 14 + packages/base-formula/src/index.server.ts | 15 + packages/base-formula/src/number.ts | 10 + packages/base-formula/src/parser.ts | 201 + packages/base-formula/src/resolver.ts | 68 + packages/base-formula/src/tokenizer.ts | 158 + packages/base-formula/src/typecheck.ts | 89 + packages/base-formula/src/types.ts | 74 + packages/base-formula/tsconfig.json | 12 + packages/editor-ext/.gitignore | 37 + packages/editor-ext/.prettierrc | 4 + packages/editor-ext/README.md | 3 + packages/editor-ext/package.json | 16 + packages/editor-ext/src/index.ts | 41 + .../src/lib/attachment/attachment-upload.ts | 125 + .../src/lib/attachment/attachment.ts | 136 + .../editor-ext/src/lib/attachment/index.ts | 2 + .../editor-ext/src/lib/audio/audio-upload.ts | 139 + packages/editor-ext/src/lib/audio/audio.ts | 134 + packages/editor-ext/src/lib/audio/index.ts | 2 + .../src/lib/base-embed/base-embed.ts | 133 + .../editor-ext/src/lib/base-embed/index.ts | 2 + .../editor-ext/src/lib/callout/callout.ts | 296 + packages/editor-ext/src/lib/callout/index.ts | 2 + packages/editor-ext/src/lib/callout/utils.ts | 21 + packages/editor-ext/src/lib/columns/column.ts | 127 + .../editor-ext/src/lib/columns/columns.ts | 237 + packages/editor-ext/src/lib/columns/index.ts | 4 + .../src/lib/comment/comment-decoration.ts | 35 + .../editor-ext/src/lib/comment/comment.ts | 217 + .../custom-code-block/custom-code-block.ts | 235 + .../src/lib/custom-code-block/index.ts | 1 + .../lib/custom-code-block/lowlight-plugin.ts | 202 + .../src/lib/details/details-content.ts | 111 + .../src/lib/details/details-summary.ts | 96 + .../editor-ext/src/lib/details/details.ts | 245 + packages/editor-ext/src/lib/details/index.ts | 3 + packages/editor-ext/src/lib/drawio.ts | 364 + packages/editor-ext/src/lib/embed-provider.ts | 146 + packages/editor-ext/src/lib/embed.ts | 138 + packages/editor-ext/src/lib/excalidraw.ts | 364 + .../editor-ext/src/lib/footnotes/footnote.ts | 189 + .../editor-ext/src/lib/footnotes/footnotes.ts | 46 + .../editor-ext/src/lib/footnotes/index.ts | 4 + .../editor-ext/src/lib/footnotes/reference.ts | 221 + .../editor-ext/src/lib/footnotes/rules.ts | 90 + .../editor-ext/src/lib/footnotes/utils.ts | 123 + .../editor-ext/src/lib/heading/heading.ts | 80 + packages/editor-ext/src/lib/highlight.ts | 40 + .../editor-ext/src/lib/image/image-upload.ts | 155 + packages/editor-ext/src/lib/image/image.ts | 389 + packages/editor-ext/src/lib/image/index.ts | 2 + packages/editor-ext/src/lib/indent.ts | 225 + packages/editor-ext/src/lib/link.ts | 96 + packages/editor-ext/src/lib/markdown/index.ts | 2 + .../src/lib/markdown/utils/basename.ts | 29 + .../src/lib/markdown/utils/callout.marked.ts | 41 + .../lib/markdown/utils/footnotes.marked.ts | 110 + .../src/lib/markdown/utils/marked.utils.ts | 71 + .../lib/markdown/utils/math-block.marked.ts | 37 + .../lib/markdown/utils/math-inline.marked.ts | 55 + .../src/lib/markdown/utils/turndown.d.ts | 12 + .../src/lib/markdown/utils/turndown.utils.ts | 272 + packages/editor-ext/src/lib/math/index.ts | 2 + .../editor-ext/src/lib/math/math-block.ts | 97 + .../editor-ext/src/lib/math/math-inline.ts | 97 + packages/editor-ext/src/lib/media-utils.ts | 43 + packages/editor-ext/src/lib/mention.ts | 354 + .../editor-ext/src/lib/page-break/index.ts | 1 + .../src/lib/page-break/page-break.ts | 60 + packages/editor-ext/src/lib/pdf/index.ts | 2 + packages/editor-ext/src/lib/pdf/pdf-upload.ts | 123 + packages/editor-ext/src/lib/pdf/pdf.ts | 156 + .../src/lib/prosemirror-docx/README.md | 167 + .../src/lib/prosemirror-docx/index.ts | 24 + .../src/lib/prosemirror-docx/numbering.ts | 47 + .../src/lib/prosemirror-docx/schema.ts | 315 + .../src/lib/prosemirror-docx/serializer.ts | 948 + .../src/lib/prosemirror-docx/types.ts | 34 + .../src/lib/prosemirror-docx/utils.ts | 91 + .../src/lib/recreate-transform/copy.ts | 3 + .../src/lib/recreate-transform/getFromPath.ts | 17 + .../lib/recreate-transform/getReplaceStep.ts | 29 + .../src/lib/recreate-transform/index.ts | 4 + .../recreate-transform/recreateTransform.ts | 279 + .../src/lib/recreate-transform/removeMarks.ts | 8 + .../recreate-transform/simplifyTransform.ts | 30 + .../src/lib/recreate-transform/types.ts | 3 + .../editor-ext/src/lib/resizable-nodeview.ts | 1098 + .../src/lib/search-and-replace/index.ts | 3 + .../search-and-replace/search-and-replace.ts | 519 + packages/editor-ext/src/lib/selection.ts | 36 + .../src/lib/shared-storage/index.ts | 1 + .../src/lib/shared-storage/shared-storage.ts | 17 + packages/editor-ext/src/lib/status.ts | 108 + packages/editor-ext/src/lib/subpages/index.ts | 2 + .../editor-ext/src/lib/subpages/subpages.ts | 72 + packages/editor-ext/src/lib/table/cell.ts | 43 + .../src/lib/table/dnd/calc-drag-over.ts | 44 + .../src/lib/table/dnd/dnd-extension.ts | 393 + .../editor-ext/src/lib/table/dnd/index.ts | 7 + .../dnd/preview/drop-indicator-controller.ts | 102 + .../table/dnd/preview/preview-controller.ts | 132 + .../lib/table/dnd/preview/render-preview.ts | 37 + .../editor-ext/src/lib/table/dnd/utils.ts | 119 + .../src/lib/table/header-pin/controller.ts | 186 + .../src/lib/table/header-pin/extension.ts | 78 + .../src/lib/table/header-pin/index.ts | 2 + .../src/lib/table/header-pin/offset.ts | 65 + packages/editor-ext/src/lib/table/header.ts | 43 + packages/editor-ext/src/lib/table/index.ts | 15 + packages/editor-ext/src/lib/table/row.ts | 5 + .../src/lib/table/table-readonly-sort.ts | 233 + .../editor-ext/src/lib/table/table-view.ts | 158 + packages/editor-ext/src/lib/table/table.ts | 110 + .../src/lib/table/utils/col-style.ts | 7 + .../convert-array-of-rows-to-table-node.ts | 44 + .../convert-table-node-to-array-of-rows.ts | 61 + .../lib/table/utils/get-cells-in-column.ts | 36 + .../src/lib/table/utils/get-cells-in-row.ts | 36 + .../utils/get-selection-range-in-column.ts | 91 + .../table/utils/get-selection-range-in-row.ts | 89 + .../editor-ext/src/lib/table/utils/index.ts | 3 + .../src/lib/table/utils/move-column.ts | 81 + .../table/utils/move-row-in-array-of-rows.ts | 30 + .../src/lib/table/utils/move-row.ts | 74 + .../editor-ext/src/lib/table/utils/query.ts | 122 + .../src/lib/table/utils/transpose.ts | 29 + .../editor-ext/src/lib/table/utils/types.ts | 18 + packages/editor-ext/src/lib/trailing-node.ts | 94 + .../src/lib/transclusion/constants.ts | 41 + .../editor-ext/src/lib/transclusion/index.ts | 3 + .../transclusion/transclusion-reference.ts | 92 + .../lib/transclusion/transclusion-source.ts | 134 + packages/editor-ext/src/lib/types.ts | 17 + .../editor-ext/src/lib/unique-id/index.ts | 2 + .../editor-ext/src/lib/unique-id/unique-id.ts | 11 + .../src/lib/unique-id/unique-id.util.ts | 78 + packages/editor-ext/src/lib/utils.ts | 423 + packages/editor-ext/src/lib/video/index.ts | 2 + .../editor-ext/src/lib/video/video-upload.ts | 175 + packages/editor-ext/src/lib/video/video.ts | 371 + packages/editor-ext/tsconfig.json | 23 + packages/ee/LICENSE | 37 + patches/scimmy@1.3.5.patch | 23 + pnpm-lock.yaml | 20834 ++++++++++++++++ pnpm-workspace.yaml | 44 + 1615 files changed, 202632 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 apps/client/.dockerignore create mode 100644 apps/client/.gitignore create mode 100644 apps/client/README.md create mode 100644 apps/client/eslint.config.mjs create mode 100644 apps/client/index.html create mode 100644 apps/client/package.json create mode 100644 apps/client/postcss.config.js create mode 100644 apps/client/public/icons/app-icon-192x192.png create mode 100644 apps/client/public/icons/app-icon-512x512.png create mode 100644 apps/client/public/icons/favicon-16x16.png create mode 100644 apps/client/public/icons/favicon-32x32.png create mode 100644 apps/client/public/locales/de-DE/translation.json create mode 100644 apps/client/public/locales/en-US/translation.json create mode 100644 apps/client/public/locales/es-ES/translation.json create mode 100644 apps/client/public/locales/fr-FR/translation.json create mode 100644 apps/client/public/locales/it-IT/translation.json create mode 100644 apps/client/public/locales/ja-JP/translation.json create mode 100644 apps/client/public/locales/ko-KR/translation.json create mode 100644 apps/client/public/locales/nl-NL/translation.json create mode 100644 apps/client/public/locales/pt-BR/translation.json create mode 100644 apps/client/public/locales/ru-RU/translation.json create mode 100644 apps/client/public/locales/uk-UA/translation.json create mode 100644 apps/client/public/locales/zh-CN/translation.json create mode 100644 apps/client/public/manifest.json create mode 100644 apps/client/public/vite.svg create mode 100644 apps/client/src/App.tsx create mode 100644 apps/client/src/assets/react.svg create mode 100644 apps/client/src/components/common/avatar-uploader.tsx create mode 100644 apps/client/src/components/common/copy-button.tsx create mode 100644 apps/client/src/components/common/copy.tsx create mode 100644 apps/client/src/components/common/export-modal.tsx create mode 100644 apps/client/src/components/common/no-table-results.tsx create mode 100644 apps/client/src/components/common/page-list-icon.tsx create mode 100644 apps/client/src/components/common/paginate.tsx create mode 100644 apps/client/src/components/common/recent-changes.tsx create mode 100644 apps/client/src/components/common/search-input.tsx create mode 100644 apps/client/src/components/common/user-info.tsx create mode 100644 apps/client/src/components/icons/airtable-icon.tsx create mode 100644 apps/client/src/components/icons/confluence-icon.tsx create mode 100644 apps/client/src/components/icons/figma-icon.tsx create mode 100644 apps/client/src/components/icons/framer-icon.tsx create mode 100644 apps/client/src/components/icons/google-drive-icon.tsx create mode 100644 apps/client/src/components/icons/google-icon.tsx create mode 100644 apps/client/src/components/icons/google-sheets-icon.tsx create mode 100644 apps/client/src/components/icons/icon-columns-4.tsx create mode 100644 apps/client/src/components/icons/icon-columns-5.tsx create mode 100644 apps/client/src/components/icons/icon-drawio.tsx create mode 100644 apps/client/src/components/icons/icon-excalidraw.tsx create mode 100644 apps/client/src/components/icons/icon-mermaid.tsx create mode 100644 apps/client/src/components/icons/icon-people-circle.tsx create mode 100644 apps/client/src/components/icons/index.ts create mode 100644 apps/client/src/components/icons/loom-icon.tsx create mode 100644 apps/client/src/components/icons/miro-icon.tsx create mode 100644 apps/client/src/components/icons/openid-icon.tsx create mode 100644 apps/client/src/components/icons/typeform-icon.tsx create mode 100644 apps/client/src/components/icons/vimeo-icon.tsx create mode 100644 apps/client/src/components/icons/youtube-icon.tsx create mode 100644 apps/client/src/components/layouts/global/app-header.module.css create mode 100644 apps/client/src/components/layouts/global/app-header.tsx create mode 100644 apps/client/src/components/layouts/global/app-shell.module.css create mode 100644 apps/client/src/components/layouts/global/aside.tsx create mode 100644 apps/client/src/components/layouts/global/global-app-shell.tsx create mode 100644 apps/client/src/components/layouts/global/global-sidebar.module.css create mode 100644 apps/client/src/components/layouts/global/global-sidebar.tsx create mode 100644 apps/client/src/components/layouts/global/hooks/atoms/sidebar-atom.ts create mode 100644 apps/client/src/components/layouts/global/hooks/hooks/use-toggle-sidebar.ts create mode 100644 apps/client/src/components/layouts/global/layout.tsx create mode 100644 apps/client/src/components/layouts/global/top-menu.tsx create mode 100644 apps/client/src/components/settings/app-version.tsx create mode 100644 apps/client/src/components/settings/atoms/settings-origin-atom.ts create mode 100644 apps/client/src/components/settings/settings-queries.tsx create mode 100644 apps/client/src/components/settings/settings-sidebar.tsx create mode 100644 apps/client/src/components/settings/settings-title.tsx create mode 100644 apps/client/src/components/settings/settings.module.css create mode 100644 apps/client/src/components/theme-toggle.module.css create mode 100644 apps/client/src/components/theme-toggle.tsx create mode 100644 apps/client/src/components/ui/auto-tooltip-text.tsx create mode 100644 apps/client/src/components/ui/card-carousel.module.css create mode 100644 apps/client/src/components/ui/card-carousel.tsx create mode 100644 apps/client/src/components/ui/checkbox-menu-item.tsx create mode 100644 apps/client/src/components/ui/clickable-table-row.module.css create mode 100644 apps/client/src/components/ui/custom-avatar.tsx create mode 100644 apps/client/src/components/ui/destination-picker/destination-picker-modal.tsx create mode 100644 apps/client/src/components/ui/destination-picker/destination-picker.module.css create mode 100644 apps/client/src/components/ui/destination-picker/destination-picker.tsx create mode 100644 apps/client/src/components/ui/destination-picker/destination-picker.types.ts create mode 100644 apps/client/src/components/ui/destination-picker/page-children.tsx create mode 100644 apps/client/src/components/ui/destination-picker/page-row.tsx create mode 100644 apps/client/src/components/ui/destination-picker/space-row.tsx create mode 100644 apps/client/src/components/ui/document-title.test.tsx create mode 100644 apps/client/src/components/ui/document-title.tsx create mode 100644 apps/client/src/components/ui/emoji-picker.tsx create mode 100644 apps/client/src/components/ui/empty-state.module.css create mode 100644 apps/client/src/components/ui/empty-state.tsx create mode 100644 apps/client/src/components/ui/error-404.module.css create mode 100644 apps/client/src/components/ui/error-404.tsx create mode 100644 apps/client/src/components/ui/page-list-skeleton.tsx create mode 100644 apps/client/src/components/ui/radio-menu-item.tsx create mode 100644 apps/client/src/components/ui/responsive-settings-row.tsx create mode 100644 apps/client/src/components/ui/role-select-menu.tsx create mode 100644 apps/client/src/components/ui/sidebar-toggle-button.tsx create mode 100644 apps/client/src/components/ui/skip-to-main.module.css create mode 100644 apps/client/src/components/ui/skip-to-main.tsx create mode 100644 apps/client/src/ee/LICENSE create mode 100644 apps/client/src/ee/ai-chat/components/ai-chat-layout.tsx create mode 100644 apps/client/src/ee/ai-chat/components/ai-chat-read-only.tsx create mode 100644 apps/client/src/ee/ai-chat/components/ai-chat-sidebar-item.tsx create mode 100644 apps/client/src/ee/ai-chat/components/ai-chat-sidebar.tsx create mode 100644 apps/client/src/ee/ai-chat/components/ai-chat-workspace-knowledge-only.tsx create mode 100644 apps/client/src/ee/ai-chat/components/aside-chat-history.tsx create mode 100644 apps/client/src/ee/ai-chat/components/aside-chat-panel.tsx create mode 100644 apps/client/src/ee/ai-chat/components/chat-empty-state.tsx create mode 100644 apps/client/src/ee/ai-chat/components/chat-input.tsx create mode 100644 apps/client/src/ee/ai-chat/components/chat-message-list.tsx create mode 100644 apps/client/src/ee/ai-chat/components/chat-message.tsx create mode 100644 apps/client/src/ee/ai-chat/components/chat-tool-group.tsx create mode 100644 apps/client/src/ee/ai-chat/components/chat-tool-result.tsx create mode 100644 apps/client/src/ee/ai-chat/components/enable-ai-chat.tsx create mode 100644 apps/client/src/ee/ai-chat/hooks/use-chat-stream.ts create mode 100644 apps/client/src/ee/ai-chat/pages/ai-chat.tsx create mode 100644 apps/client/src/ee/ai-chat/queries/ai-chat-query.ts create mode 100644 apps/client/src/ee/ai-chat/services/ai-chat-service.ts create mode 100644 apps/client/src/ee/ai-chat/styles/ai-chat.module.css create mode 100644 apps/client/src/ee/ai-chat/styles/aside-chat-panel.module.css create mode 100644 apps/client/src/ee/ai-chat/styles/chat-input.module.css create mode 100644 apps/client/src/ee/ai-chat/styles/chat-message.module.css create mode 100644 apps/client/src/ee/ai-chat/styles/chat-sidebar.module.css create mode 100644 apps/client/src/ee/ai-chat/types/ai-chat.types.ts create mode 100644 apps/client/src/ee/ai-chat/utils/group-chats-by-age.ts create mode 100644 apps/client/src/ee/ai/components/ai-search-result.tsx create mode 100644 apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.module.css create mode 100644 apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.tsx create mode 100644 apps/client/src/ee/ai/components/editor/ai-menu/command-items.ts create mode 100644 apps/client/src/ee/ai/components/editor/ai-menu/command-selector.tsx create mode 100644 apps/client/src/ee/ai/components/editor/ai-menu/result-preview.tsx create mode 100644 apps/client/src/ee/ai/components/enable-ai-search.tsx create mode 100644 apps/client/src/ee/ai/components/enable-generative-ai.tsx create mode 100644 apps/client/src/ee/ai/components/mcp-settings.tsx create mode 100644 apps/client/src/ee/ai/hooks/use-ai-search.ts create mode 100644 apps/client/src/ee/ai/hooks/use-ai.ts create mode 100644 apps/client/src/ee/ai/pages/ai-settings.tsx create mode 100644 apps/client/src/ee/ai/queries/ai-query.ts create mode 100644 apps/client/src/ee/ai/services/ai-search-service.ts create mode 100644 apps/client/src/ee/ai/services/ai-service.ts create mode 100644 apps/client/src/ee/ai/types/ai.types.ts create mode 100644 apps/client/src/ee/api-key/components/api-key-created-modal.tsx create mode 100644 apps/client/src/ee/api-key/components/api-key-table.tsx create mode 100644 apps/client/src/ee/api-key/components/create-api-key-modal.tsx create mode 100644 apps/client/src/ee/api-key/components/restrict-api-to-admins.tsx create mode 100644 apps/client/src/ee/api-key/components/revoke-api-key-modal.tsx create mode 100644 apps/client/src/ee/api-key/components/update-api-key-modal.tsx create mode 100644 apps/client/src/ee/api-key/index.ts create mode 100644 apps/client/src/ee/api-key/pages/user-api-keys.tsx create mode 100644 apps/client/src/ee/api-key/pages/workspace-api-keys.tsx create mode 100644 apps/client/src/ee/api-key/queries/api-key-query.ts create mode 100644 apps/client/src/ee/api-key/services/api-key-service.ts create mode 100644 apps/client/src/ee/api-key/types/api-key.types.ts create mode 100644 apps/client/src/ee/audit/components/audit-logs-table.tsx create mode 100644 apps/client/src/ee/audit/components/audit-logs.module.css create mode 100644 apps/client/src/ee/audit/lib/audit-event-labels.ts create mode 100644 apps/client/src/ee/audit/pages/audit-logs.tsx create mode 100644 apps/client/src/ee/audit/queries/audit-query.ts create mode 100644 apps/client/src/ee/audit/services/audit-service.ts create mode 100644 apps/client/src/ee/audit/types/audit.types.ts create mode 100644 apps/client/src/ee/base/atoms/base-atoms.ts create mode 100644 apps/client/src/ee/base/atoms/formula-recompute-atom.ts create mode 100644 apps/client/src/ee/base/atoms/reference-store-atom.ts create mode 100644 apps/client/src/ee/base/atoms/view-draft-atom.ts create mode 100644 apps/client/src/ee/base/components/base-embed-title.tsx create mode 100644 apps/client/src/ee/base/components/base-table-skeleton.tsx create mode 100644 apps/client/src/ee/base/components/base-table.tsx create mode 100644 apps/client/src/ee/base/components/base-toolbar.tsx create mode 100644 apps/client/src/ee/base/components/base-view-draft-banner.tsx create mode 100644 apps/client/src/ee/base/components/base-view.tsx create mode 100644 apps/client/src/ee/base/components/cells/badge-overflow.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-checkbox.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-created-at.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-date.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-email.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-file.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-formula.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-last-edited-at.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-last-edited-by.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-long-text.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-multi-select.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-number.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-page.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-person.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-select.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-status.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-text.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-url.tsx create mode 100644 apps/client/src/ee/base/components/cells/cell-value-equal.ts create mode 100644 apps/client/src/ee/base/components/cells/choice-badge.tsx create mode 100644 apps/client/src/ee/base/components/cells/choice-color.ts create mode 100644 apps/client/src/ee/base/components/cells/choice-picker.tsx create mode 100644 apps/client/src/ee/base/components/cells/person-read-list.tsx create mode 100644 apps/client/src/ee/base/components/formula/formula-editor.tsx create mode 100644 apps/client/src/ee/base/components/formula/formula-input.tsx create mode 100644 apps/client/src/ee/base/components/formula/formula-property-editor.tsx create mode 100644 apps/client/src/ee/base/components/formula/function-palette.tsx create mode 100644 apps/client/src/ee/base/components/formula/property-chip-row.tsx create mode 100644 apps/client/src/ee/base/components/grid/add-row-button.tsx create mode 100644 apps/client/src/ee/base/components/grid/base-drop-edge-indicator.tsx create mode 100644 apps/client/src/ee/base/components/grid/grid-cell.tsx create mode 100644 apps/client/src/ee/base/components/grid/grid-container.tsx create mode 100644 apps/client/src/ee/base/components/grid/grid-ghost-rows.tsx create mode 100644 apps/client/src/ee/base/components/grid/grid-header-cell.tsx create mode 100644 apps/client/src/ee/base/components/grid/grid-header.tsx create mode 100644 apps/client/src/ee/base/components/grid/grid-row.tsx create mode 100644 apps/client/src/ee/base/components/grid/row-number-cell.tsx create mode 100644 apps/client/src/ee/base/components/grid/row-number-header-cell.tsx create mode 100644 apps/client/src/ee/base/components/grid/selection-action-bar.tsx create mode 100644 apps/client/src/ee/base/components/kanban/base-kanban.tsx create mode 100644 apps/client/src/ee/base/components/kanban/card-field/card-field.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-add-card-button.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-card-properties.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-card.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-column-header.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-column-menu.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-column-title.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-column.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-empty-state.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-group-by-picker.tsx create mode 100644 apps/client/src/ee/base/components/property/choice-editor.tsx create mode 100644 apps/client/src/ee/base/components/property/conversion-warning.ts create mode 100644 apps/client/src/ee/base/components/property/create-property-popover.tsx create mode 100644 apps/client/src/ee/base/components/property/default-value-picker.tsx create mode 100644 apps/client/src/ee/base/components/property/property-menu.tsx create mode 100644 apps/client/src/ee/base/components/property/property-options.tsx create mode 100644 apps/client/src/ee/base/components/property/property-type-picker.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/fields/detail-field.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/fields/field-cell-adapter.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/fields/field-choice.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/fields/field-date.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/fields/field-long-text.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/fields/field-number.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/fields/field-text.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/property-row.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/row-detail-modal.tsx create mode 100644 apps/client/src/ee/base/components/row-detail-modal/row-detail-title.tsx create mode 100644 apps/client/src/ee/base/components/views/filter-date-input.tsx create mode 100644 apps/client/src/ee/base/components/views/filter-person-input.tsx create mode 100644 apps/client/src/ee/base/components/views/relative-date-presets.ts create mode 100644 apps/client/src/ee/base/components/views/view-create-menu.tsx create mode 100644 apps/client/src/ee/base/components/views/view-filter-config.tsx create mode 100644 apps/client/src/ee/base/components/views/view-property-visibility.tsx create mode 100644 apps/client/src/ee/base/components/views/view-renderer.tsx create mode 100644 apps/client/src/ee/base/components/views/view-sort-config.tsx create mode 100644 apps/client/src/ee/base/components/views/view-tabs.tsx create mode 100644 apps/client/src/ee/base/constants/currencies.ts create mode 100644 apps/client/src/ee/base/context/base-editable.tsx create mode 100644 apps/client/src/ee/base/context/grid-row-order.tsx create mode 100644 apps/client/src/ee/base/context/row-expand.tsx create mode 100644 apps/client/src/ee/base/formatters/cell-formatters.ts create mode 100644 apps/client/src/ee/base/hooks/use-base-socket.ts create mode 100644 apps/client/src/ee/base/hooks/use-base-table.ts create mode 100644 apps/client/src/ee/base/hooks/use-column-resize.ts create mode 100644 apps/client/src/ee/base/hooks/use-delete-selected-rows.tsx create mode 100644 apps/client/src/ee/base/hooks/use-editable-text-cell.ts create mode 100644 apps/client/src/ee/base/hooks/use-escape-close.ts create mode 100644 apps/client/src/ee/base/hooks/use-formula-parser.ts create mode 100644 apps/client/src/ee/base/hooks/use-grid-autoscroll.ts create mode 100644 apps/client/src/ee/base/hooks/use-grid-keyboard-nav.ts create mode 100644 apps/client/src/ee/base/hooks/use-horizontal-scroll-sync.ts create mode 100644 apps/client/src/ee/base/hooks/use-kanban-autoscroll.ts create mode 100644 apps/client/src/ee/base/hooks/use-kanban-card-dnd.ts create mode 100644 apps/client/src/ee/base/hooks/use-kanban-card-drop.ts create mode 100644 apps/client/src/ee/base/hooks/use-kanban-column-dnd.ts create mode 100644 apps/client/src/ee/base/hooks/use-kanban-columns.ts create mode 100644 apps/client/src/ee/base/hooks/use-list-keyboard-nav.ts create mode 100644 apps/client/src/ee/base/hooks/use-person-search.ts create mode 100644 apps/client/src/ee/base/hooks/use-row-autoscroll.ts create mode 100644 apps/client/src/ee/base/hooks/use-row-detail-modal.ts create mode 100644 apps/client/src/ee/base/hooks/use-row-selection.ts create mode 100644 apps/client/src/ee/base/hooks/use-view-draft.ts create mode 100644 apps/client/src/ee/base/pages/base-page.tsx create mode 100644 apps/client/src/ee/base/property-types/property-type.descriptor.ts create mode 100644 apps/client/src/ee/base/property-types/property-type.registry.tsx create mode 100644 apps/client/src/ee/base/queries/base-page-resolver-query.ts create mode 100644 apps/client/src/ee/base/queries/base-property-query.ts create mode 100644 apps/client/src/ee/base/queries/base-query.ts create mode 100644 apps/client/src/ee/base/queries/base-row-query.ts create mode 100644 apps/client/src/ee/base/queries/base-view-query.ts create mode 100644 apps/client/src/ee/base/queries/page-expand-loader.ts create mode 100644 apps/client/src/ee/base/reference/reference-store.ts create mode 100644 apps/client/src/ee/base/services/base-service.ts create mode 100644 apps/client/src/ee/base/services/format-kanban-count.ts create mode 100644 apps/client/src/ee/base/services/kanban-column-filter.ts create mode 100644 apps/client/src/ee/base/styles/base-table-skeleton.module.css create mode 100644 apps/client/src/ee/base/styles/base-toolbar.module.css create mode 100644 apps/client/src/ee/base/styles/base-view.module.css create mode 100644 apps/client/src/ee/base/styles/cells.module.css create mode 100644 apps/client/src/ee/base/styles/formula.module.css create mode 100644 apps/client/src/ee/base/styles/grid.module.css create mode 100644 apps/client/src/ee/base/styles/kanban.module.css create mode 100644 apps/client/src/ee/base/styles/property.module.css create mode 100644 apps/client/src/ee/base/styles/row-detail-modal.module.css create mode 100644 apps/client/src/ee/base/styles/views.module.css create mode 100644 apps/client/src/ee/base/types/base.types.ts create mode 100644 apps/client/src/ee/base/types/react-table.d.ts create mode 100644 apps/client/src/ee/base/utils/generate-base-id.ts create mode 100644 apps/client/src/ee/base/utils/grid-cell-nav.ts create mode 100644 apps/client/src/ee/billing/components/billing-details.tsx create mode 100644 apps/client/src/ee/billing/components/billing-incomplete.tsx create mode 100644 apps/client/src/ee/billing/components/billing-plans.tsx create mode 100644 apps/client/src/ee/billing/components/billing-trial.tsx create mode 100644 apps/client/src/ee/billing/components/billing.module.css create mode 100644 apps/client/src/ee/billing/components/manage-billing.tsx create mode 100644 apps/client/src/ee/billing/pages/billing.tsx create mode 100644 apps/client/src/ee/billing/queries/billing-query.ts create mode 100644 apps/client/src/ee/billing/services/billing-service.ts create mode 100644 apps/client/src/ee/billing/types/billing.types.ts create mode 100644 apps/client/src/ee/billing/utils.ts create mode 100644 apps/client/src/ee/cloud/query/cloud-query.ts create mode 100644 apps/client/src/ee/cloud/service/cloud-service.ts create mode 100644 apps/client/src/ee/comment/components/resolve-comment.tsx create mode 100644 apps/client/src/ee/comment/queries/comment-query.ts create mode 100644 apps/client/src/ee/components/cloud-login-form.tsx create mode 100644 apps/client/src/ee/components/joined-workspaces.module.css create mode 100644 apps/client/src/ee/components/joined-workspaces.tsx create mode 100644 apps/client/src/ee/components/ldap-login-modal.tsx create mode 100644 apps/client/src/ee/components/manage-hostname.tsx create mode 100644 apps/client/src/ee/components/posthog-user.tsx create mode 100644 apps/client/src/ee/components/sso-cloud-signup.tsx create mode 100644 apps/client/src/ee/components/sso-login.tsx create mode 100644 apps/client/src/ee/entitlement/entitlement-atom.ts create mode 100644 apps/client/src/ee/entitlement/entitlement-service.ts create mode 100644 apps/client/src/ee/entitlement/entitlement.types.ts create mode 100644 apps/client/src/ee/entitlement/use-entitlements.ts create mode 100644 apps/client/src/ee/features.ts create mode 100644 apps/client/src/ee/hooks/use-feature.ts create mode 100644 apps/client/src/ee/hooks/use-plan.tsx create mode 100644 apps/client/src/ee/hooks/use-redirect-to-cloud-select.tsx create mode 100644 apps/client/src/ee/hooks/use-trial-end-action.tsx create mode 100644 apps/client/src/ee/hooks/use-trial.tsx create mode 100644 apps/client/src/ee/hooks/use-upgrade-label.ts create mode 100644 apps/client/src/ee/licence/components/activate-license-modal.tsx create mode 100644 apps/client/src/ee/licence/components/installation-details.tsx create mode 100644 apps/client/src/ee/licence/components/license-details.tsx create mode 100644 apps/client/src/ee/licence/components/license-message.tsx create mode 100644 apps/client/src/ee/licence/components/oss-details.tsx create mode 100644 apps/client/src/ee/licence/components/remove-license.tsx create mode 100644 apps/client/src/ee/licence/license.utils.ts create mode 100644 apps/client/src/ee/licence/pages/license.tsx create mode 100644 apps/client/src/ee/licence/queries/license-query.ts create mode 100644 apps/client/src/ee/licence/services/license-service.ts create mode 100644 apps/client/src/ee/licence/types/license.types.ts create mode 100644 apps/client/src/ee/mfa/components/mfa-backup-code-input.tsx create mode 100644 apps/client/src/ee/mfa/components/mfa-backup-codes-modal.tsx create mode 100644 apps/client/src/ee/mfa/components/mfa-challenge.module.css create mode 100644 apps/client/src/ee/mfa/components/mfa-challenge.tsx create mode 100644 apps/client/src/ee/mfa/components/mfa-disable-modal.tsx create mode 100644 apps/client/src/ee/mfa/components/mfa-settings.tsx create mode 100644 apps/client/src/ee/mfa/components/mfa-setup-modal.tsx create mode 100644 apps/client/src/ee/mfa/components/mfa-setup-required.tsx create mode 100644 apps/client/src/ee/mfa/components/mfa.module.css create mode 100644 apps/client/src/ee/mfa/hooks/use-mfa-page-protection.ts create mode 100644 apps/client/src/ee/mfa/index.ts create mode 100644 apps/client/src/ee/mfa/pages/mfa-challenge-page.tsx create mode 100644 apps/client/src/ee/mfa/pages/mfa-setup-required-page.tsx create mode 100644 apps/client/src/ee/mfa/services/mfa-service.ts create mode 100644 apps/client/src/ee/mfa/types/mfa.types.ts create mode 100644 apps/client/src/ee/oauth/components/authorized-apps-panel.tsx create mode 100644 apps/client/src/ee/oauth/components/oauth-grants-table.tsx create mode 100644 apps/client/src/ee/oauth/pages/oauth-consent.tsx create mode 100644 apps/client/src/ee/oauth/queries/oauth-query.ts create mode 100644 apps/client/src/ee/oauth/services/oauth-service.ts create mode 100644 apps/client/src/ee/oauth/types/oauth.types.ts create mode 100644 apps/client/src/ee/page-permission/components/general-access-select.tsx create mode 100644 apps/client/src/ee/page-permission/components/page-permission-item.tsx create mode 100644 apps/client/src/ee/page-permission/components/page-permission-list.tsx create mode 100644 apps/client/src/ee/page-permission/components/page-permission-tab.tsx create mode 100644 apps/client/src/ee/page-permission/components/page-permission.module.css create mode 100644 apps/client/src/ee/page-permission/components/page-share-modal.tsx create mode 100644 apps/client/src/ee/page-permission/components/publish-tab.tsx create mode 100644 apps/client/src/ee/page-permission/hooks/use-page-permission.ts create mode 100644 apps/client/src/ee/page-permission/index.ts create mode 100644 apps/client/src/ee/page-permission/queries/page-permission-query.ts create mode 100644 apps/client/src/ee/page-permission/services/page-permission-service.ts create mode 100644 apps/client/src/ee/page-permission/types/page-permission-role-data.ts create mode 100644 apps/client/src/ee/page-permission/types/page-permission.types.ts create mode 100644 apps/client/src/ee/page-verification/components/expiration-fields.tsx create mode 100644 apps/client/src/ee/page-verification/components/manage-verification-form.tsx create mode 100644 apps/client/src/ee/page-verification/components/page-verification-modal.module.css create mode 100644 apps/client/src/ee/page-verification/components/page-verification-modal.tsx create mode 100644 apps/client/src/ee/page-verification/components/setup-verification-form.tsx create mode 100644 apps/client/src/ee/page-verification/components/user-option.tsx create mode 100644 apps/client/src/ee/page-verification/components/verification-list-table.tsx create mode 100644 apps/client/src/ee/page-verification/components/verification-status.ts create mode 100644 apps/client/src/ee/page-verification/components/verifier-list.tsx create mode 100644 apps/client/src/ee/page-verification/components/verifier-picker.tsx create mode 100644 apps/client/src/ee/page-verification/index.ts create mode 100644 apps/client/src/ee/page-verification/pages/verified-pages.tsx create mode 100644 apps/client/src/ee/page-verification/queries/page-verification-query.ts create mode 100644 apps/client/src/ee/page-verification/services/page-verification-service.ts create mode 100644 apps/client/src/ee/page-verification/types/page-verification.types.ts create mode 100644 apps/client/src/ee/pages/cloud-login.tsx create mode 100644 apps/client/src/ee/pages/create-workspace.tsx create mode 100644 apps/client/src/ee/pages/verify-email.tsx create mode 100644 apps/client/src/ee/pdf-export/pdf-render-page.tsx create mode 100644 apps/client/src/ee/personal-space/components/create-personal-space-modal.tsx create mode 100644 apps/client/src/ee/personal-space/components/personal-spaces-setting.tsx create mode 100644 apps/client/src/ee/personal-space/queries/personal-space-query.ts create mode 100644 apps/client/src/ee/personal-space/services/personal-space-service.ts create mode 100644 apps/client/src/ee/scim/components/create-scim-token-modal.tsx create mode 100644 apps/client/src/ee/scim/components/enable-scim.tsx create mode 100644 apps/client/src/ee/scim/components/revoke-scim-token-modal.tsx create mode 100644 apps/client/src/ee/scim/components/scim-token-created-modal.tsx create mode 100644 apps/client/src/ee/scim/components/scim-token-table.tsx create mode 100644 apps/client/src/ee/scim/components/scim-url-panel.tsx create mode 100644 apps/client/src/ee/scim/components/update-scim-token-modal.tsx create mode 100644 apps/client/src/ee/scim/index.ts create mode 100644 apps/client/src/ee/scim/queries/scim-token-query.ts create mode 100644 apps/client/src/ee/scim/services/scim-token-service.ts create mode 100644 apps/client/src/ee/scim/types/scim-token.types.ts create mode 100644 apps/client/src/ee/security/components/allow-member-templates.tsx create mode 100644 apps/client/src/ee/security/components/allowed-domains.tsx create mode 100644 apps/client/src/ee/security/components/create-sso-provider.tsx create mode 100644 apps/client/src/ee/security/components/disable-public-sharing.tsx create mode 100644 apps/client/src/ee/security/components/enforce-mfa.tsx create mode 100644 apps/client/src/ee/security/components/enforce-sso.tsx create mode 100644 apps/client/src/ee/security/components/space-public-sharing-toggle.tsx create mode 100644 apps/client/src/ee/security/components/space-viewer-comments-toggle.tsx create mode 100644 apps/client/src/ee/security/components/sso-google-form.tsx create mode 100644 apps/client/src/ee/security/components/sso-ldap-form.tsx create mode 100644 apps/client/src/ee/security/components/sso-oidc-form.tsx create mode 100644 apps/client/src/ee/security/components/sso-provider-list.tsx create mode 100644 apps/client/src/ee/security/components/sso-provider-modal.tsx create mode 100644 apps/client/src/ee/security/components/sso-saml-form.tsx create mode 100644 apps/client/src/ee/security/components/sso.module.css create mode 100644 apps/client/src/ee/security/components/trash-retention.tsx create mode 100644 apps/client/src/ee/security/contants.ts create mode 100644 apps/client/src/ee/security/pages/security.tsx create mode 100644 apps/client/src/ee/security/queries/security-query.ts create mode 100644 apps/client/src/ee/security/services/ldap-auth-service.ts create mode 100644 apps/client/src/ee/security/services/security-service.ts create mode 100644 apps/client/src/ee/security/sso.utils.ts create mode 100644 apps/client/src/ee/security/types/security.types.ts create mode 100644 apps/client/src/ee/siem/components/delete-destination-modal.tsx create mode 100644 apps/client/src/ee/siem/components/destination-form-modal.tsx create mode 100644 apps/client/src/ee/siem/components/destination-status-badge.tsx create mode 100644 apps/client/src/ee/siem/components/destination-table.tsx create mode 100644 apps/client/src/ee/siem/components/siem-streaming-panel.tsx create mode 100644 apps/client/src/ee/siem/lib/destination-form.ts create mode 100644 apps/client/src/ee/siem/queries/siem-query.ts create mode 100644 apps/client/src/ee/siem/services/siem-service.ts create mode 100644 apps/client/src/ee/siem/types/siem.types.ts create mode 100644 apps/client/src/ee/template/components/create-template-modal.tsx create mode 100644 apps/client/src/ee/template/components/readonly-template-editor.tsx create mode 100644 apps/client/src/ee/template/components/template-card.module.css create mode 100644 apps/client/src/ee/template/components/template-card.tsx create mode 100644 apps/client/src/ee/template/components/template-meta.tsx create mode 100644 apps/client/src/ee/template/components/template-picker-modal.module.css create mode 100644 apps/client/src/ee/template/components/template-picker-modal.tsx create mode 100644 apps/client/src/ee/template/components/template-preview-modal.tsx create mode 100644 apps/client/src/ee/template/components/use-template-modal.tsx create mode 100644 apps/client/src/ee/template/pages/template-editor.module.css create mode 100644 apps/client/src/ee/template/pages/template-editor.tsx create mode 100644 apps/client/src/ee/template/pages/template-list.tsx create mode 100644 apps/client/src/ee/template/queries/template-query.ts create mode 100644 apps/client/src/ee/template/services/template-service.ts create mode 100644 apps/client/src/ee/template/types/template.types.ts create mode 100644 apps/client/src/ee/utils.ts create mode 100644 apps/client/src/features/attachments/components/attachment-file-icon.tsx create mode 100644 apps/client/src/features/attachments/components/page-attachments-modal.tsx create mode 100644 apps/client/src/features/attachments/queries/attachment-query.ts create mode 100644 apps/client/src/features/attachments/services/attachment-service.ts create mode 100644 apps/client/src/features/attachments/services/index.ts create mode 100644 apps/client/src/features/attachments/types/attachment.types.ts create mode 100644 apps/client/src/features/auth/atoms/auth-tokens-atom.ts create mode 100644 apps/client/src/features/auth/components/auth-layout.tsx create mode 100644 apps/client/src/features/auth/components/auth.module.css create mode 100644 apps/client/src/features/auth/components/forgot-password-form.tsx create mode 100644 apps/client/src/features/auth/components/invite-sign-up-form.tsx create mode 100644 apps/client/src/features/auth/components/login-form.tsx create mode 100644 apps/client/src/features/auth/components/password-reset-form.tsx create mode 100644 apps/client/src/features/auth/components/setup-workspace-form.tsx create mode 100644 apps/client/src/features/auth/hooks/use-auth.ts create mode 100644 apps/client/src/features/auth/hooks/use-redirect-if-authenticated.ts create mode 100644 apps/client/src/features/auth/queries/auth-query.tsx create mode 100644 apps/client/src/features/auth/services/auth-service.ts create mode 100644 apps/client/src/features/auth/types/auth.types.ts create mode 100644 apps/client/src/features/comment/atoms/comment-atom.ts create mode 100644 apps/client/src/features/comment/components/comment-actions.tsx create mode 100644 apps/client/src/features/comment/components/comment-dialog.tsx create mode 100644 apps/client/src/features/comment/components/comment-editor.tsx create mode 100644 apps/client/src/features/comment/components/comment-list-item.tsx create mode 100644 apps/client/src/features/comment/components/comment-list-with-tabs.tsx create mode 100644 apps/client/src/features/comment/components/comment-menu.tsx create mode 100644 apps/client/src/features/comment/components/comment.module.css create mode 100644 apps/client/src/features/comment/queries/comment-query.ts create mode 100644 apps/client/src/features/comment/services/comment-service.ts create mode 100644 apps/client/src/features/comment/types/comment.types.ts create mode 100644 apps/client/src/features/editor/atoms/editor-atoms.ts create mode 100644 apps/client/src/features/editor/collab-socket.ts create mode 100644 apps/client/src/features/editor/components/attachment/attachment-view.tsx create mode 100644 apps/client/src/features/editor/components/attachment/upload-attachment-action.tsx create mode 100644 apps/client/src/features/editor/components/audio/audio-menu.tsx create mode 100644 apps/client/src/features/editor/components/audio/audio-view.module.css create mode 100644 apps/client/src/features/editor/components/audio/audio-view.tsx create mode 100644 apps/client/src/features/editor/components/audio/upload-audio-action.tsx create mode 100644 apps/client/src/features/editor/components/base-embed/base-embed-view.tsx create mode 100644 apps/client/src/features/editor/components/base-embed/base-embed.module.css create mode 100644 apps/client/src/features/editor/components/base-embed/insert-base-embed.ts create mode 100644 apps/client/src/features/editor/components/bubble-menu/bubble-menu.module.css create mode 100644 apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx create mode 100644 apps/client/src/features/editor/components/bubble-menu/color-selector.tsx create mode 100644 apps/client/src/features/editor/components/bubble-menu/link-selector.tsx create mode 100644 apps/client/src/features/editor/components/bubble-menu/node-selector.tsx create mode 100644 apps/client/src/features/editor/components/bubble-menu/readonly-bubble-menu.tsx create mode 100644 apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx create mode 100644 apps/client/src/features/editor/components/callout/callout-menu.tsx create mode 100644 apps/client/src/features/editor/components/callout/callout-view.tsx create mode 100644 apps/client/src/features/editor/components/callout/callout.module.css create mode 100644 apps/client/src/features/editor/components/code-block/code-block-view.tsx create mode 100644 apps/client/src/features/editor/components/code-block/code-block.module.css create mode 100644 apps/client/src/features/editor/components/code-block/mermaid-view.tsx create mode 100644 apps/client/src/features/editor/components/columns/columns-menu.tsx create mode 100644 apps/client/src/features/editor/components/common/editor-paste-handler.tsx create mode 100644 apps/client/src/features/editor/components/common/lightbox-view.tsx create mode 100644 apps/client/src/features/editor/components/common/node-resize-handles.ts create mode 100644 apps/client/src/features/editor/components/common/node-resize.module.css create mode 100644 apps/client/src/features/editor/components/common/node-width-resize.tsx create mode 100644 apps/client/src/features/editor/components/common/resizable-wrapper.module.css create mode 100644 apps/client/src/features/editor/components/common/resizable-wrapper.tsx create mode 100644 apps/client/src/features/editor/components/common/toolbar-menu.module.css create mode 100644 apps/client/src/features/editor/components/common/use-alt-text-control.tsx create mode 100644 apps/client/src/features/editor/components/drawio/drawio-menu.tsx create mode 100644 apps/client/src/features/editor/components/drawio/drawio-view.tsx create mode 100644 apps/client/src/features/editor/components/editor-skeleton.tsx create mode 100644 apps/client/src/features/editor/components/embed/embed-view.module.css create mode 100644 apps/client/src/features/editor/components/embed/embed-view.tsx create mode 100644 apps/client/src/features/editor/components/emoji-menu/emoji-items.ts create mode 100644 apps/client/src/features/editor/components/emoji-menu/emoji-list.tsx create mode 100644 apps/client/src/features/editor/components/emoji-menu/emoji-menu.module.css create mode 100644 apps/client/src/features/editor/components/emoji-menu/render-emoji-items.ts create mode 100644 apps/client/src/features/editor/components/emoji-menu/types.ts create mode 100644 apps/client/src/features/editor/components/emoji-menu/utils.ts create mode 100644 apps/client/src/features/editor/components/empty-page/empty-page-get-started.module.css create mode 100644 apps/client/src/features/editor/components/empty-page/empty-page-get-started.tsx create mode 100644 apps/client/src/features/editor/components/excalidraw/excalidraw-menu-lazy.tsx create mode 100644 apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx create mode 100644 apps/client/src/features/editor/components/excalidraw/excalidraw-utils.ts create mode 100644 apps/client/src/features/editor/components/excalidraw/excalidraw-view-lazy.tsx create mode 100644 apps/client/src/features/editor/components/excalidraw/excalidraw-view.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/fixed-toolbar.module.css create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/fixed-toolbar.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/alignment-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/ask-ai-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/block-type-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/color-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/history-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/inline-marks-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/lists-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/media-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/more-inserts-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/groups/quick-inserts-group.tsx create mode 100644 apps/client/src/features/editor/components/fixed-toolbar/use-toolbar-state.ts create mode 100644 apps/client/src/features/editor/components/image/image-menu.tsx create mode 100644 apps/client/src/features/editor/components/image/image-resize-handles.ts create mode 100644 apps/client/src/features/editor/components/image/image-resize.module.css create mode 100644 apps/client/src/features/editor/components/image/image-view.module.css create mode 100644 apps/client/src/features/editor/components/image/image-view.tsx create mode 100644 apps/client/src/features/editor/components/image/upload-image-action.tsx create mode 100644 apps/client/src/features/editor/components/link/internal-link-paste.ts create mode 100644 apps/client/src/features/editor/components/link/link-editor-panel.tsx create mode 100644 apps/client/src/features/editor/components/link/link-menu.tsx create mode 100644 apps/client/src/features/editor/components/link/link-view.tsx create mode 100644 apps/client/src/features/editor/components/link/link.module.css create mode 100644 apps/client/src/features/editor/components/link/types.ts create mode 100644 apps/client/src/features/editor/components/link/use-link-editor-state.tsx create mode 100644 apps/client/src/features/editor/components/math/math-block.tsx create mode 100644 apps/client/src/features/editor/components/math/math-inline.tsx create mode 100644 apps/client/src/features/editor/components/math/math.module.css create mode 100644 apps/client/src/features/editor/components/mention/mention-list.tsx create mode 100644 apps/client/src/features/editor/components/mention/mention-suggestion.ts create mode 100644 apps/client/src/features/editor/components/mention/mention-view.tsx create mode 100644 apps/client/src/features/editor/components/mention/mention.module.css create mode 100644 apps/client/src/features/editor/components/mention/mention.type.ts create mode 100644 apps/client/src/features/editor/components/pdf/pdf-menu.tsx create mode 100644 apps/client/src/features/editor/components/pdf/pdf-view.module.css create mode 100644 apps/client/src/features/editor/components/pdf/pdf-view.tsx create mode 100644 apps/client/src/features/editor/components/pdf/upload-pdf-action.tsx create mode 100644 apps/client/src/features/editor/components/search-and-replace/atoms/search-and-replace-state-atom.ts create mode 100644 apps/client/src/features/editor/components/search-and-replace/search-and-replace-dialog.tsx create mode 100644 apps/client/src/features/editor/components/search-and-replace/search-navigation-dialog.tsx create mode 100644 apps/client/src/features/editor/components/search-and-replace/search-replace.module.css create mode 100644 apps/client/src/features/editor/components/search-and-replace/use-search-navigation-params.ts create mode 100644 apps/client/src/features/editor/components/slash-menu/command-list.tsx create mode 100644 apps/client/src/features/editor/components/slash-menu/menu-items.ts create mode 100644 apps/client/src/features/editor/components/slash-menu/render-items.ts create mode 100644 apps/client/src/features/editor/components/slash-menu/slash-menu.module.css create mode 100644 apps/client/src/features/editor/components/slash-menu/types.ts create mode 100644 apps/client/src/features/editor/components/status/status-view.tsx create mode 100644 apps/client/src/features/editor/components/status/status.module.css create mode 100644 apps/client/src/features/editor/components/subpages/subpages-menu.tsx create mode 100644 apps/client/src/features/editor/components/subpages/subpages-view.tsx create mode 100644 apps/client/src/features/editor/components/subpages/subpages.module.css create mode 100644 apps/client/src/features/editor/components/table-of-contents/table-of-contents.module.css create mode 100644 apps/client/src/features/editor/components/table-of-contents/table-of-contents.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/cell-chevron.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/column-handle.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/handle.module.css create mode 100644 apps/client/src/features/editor/components/table/handle/hooks/use-column-row-menu-lifecycle.ts create mode 100644 apps/client/src/features/editor/components/table/handle/hooks/use-table-clear.ts create mode 100644 apps/client/src/features/editor/components/table/handle/hooks/use-table-handle-drag.ts create mode 100644 apps/client/src/features/editor/components/table/handle/hooks/use-table-handle-state.ts create mode 100644 apps/client/src/features/editor/components/table/handle/hooks/use-table-move-row-column.ts create mode 100644 apps/client/src/features/editor/components/table/handle/hooks/use-table-sort.ts create mode 100644 apps/client/src/features/editor/components/table/handle/lib/select-row-column.ts create mode 100644 apps/client/src/features/editor/components/table/handle/lib/sort-cells.ts create mode 100644 apps/client/src/features/editor/components/table/handle/menus/alignment-submenu.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/menus/cell-chevron-menu.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/menus/column-handle-menu.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/menus/row-handle-menu.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/row-handle.tsx create mode 100644 apps/client/src/features/editor/components/table/handle/table-handles-layer.tsx create mode 100644 apps/client/src/features/editor/components/table/table-background-color.tsx create mode 100644 apps/client/src/features/editor/components/table/table-cell-menu.tsx create mode 100644 apps/client/src/features/editor/components/table/table-menu.tsx create mode 100644 apps/client/src/features/editor/components/table/table-text-alignment.tsx create mode 100644 apps/client/src/features/editor/components/table/types/types.ts create mode 100644 apps/client/src/features/editor/components/transclusion/error-placeholder.tsx create mode 100644 apps/client/src/features/editor/components/transclusion/no-access-placeholder.tsx create mode 100644 apps/client/src/features/editor/components/transclusion/not-found-placeholder.tsx create mode 100644 apps/client/src/features/editor/components/transclusion/transclusion-content.tsx create mode 100644 apps/client/src/features/editor/components/transclusion/transclusion-lookup-context.tsx create mode 100644 apps/client/src/features/editor/components/transclusion/transclusion-reference-view.tsx create mode 100644 apps/client/src/features/editor/components/transclusion/transclusion-view.tsx create mode 100644 apps/client/src/features/editor/components/transclusion/transclusion.module.css create mode 100644 apps/client/src/features/editor/components/video/upload-video-action.tsx create mode 100644 apps/client/src/features/editor/components/video/video-menu.tsx create mode 100644 apps/client/src/features/editor/components/video/video-view.module.css create mode 100644 apps/client/src/features/editor/components/video/video-view.tsx create mode 100644 apps/client/src/features/editor/extensions/autojoiner.ts create mode 100644 apps/client/src/features/editor/extensions/clean-styles.ts create mode 100644 apps/client/src/features/editor/extensions/document.test.ts create mode 100644 apps/client/src/features/editor/extensions/document.ts create mode 100644 apps/client/src/features/editor/extensions/drag-handle.ts create mode 100644 apps/client/src/features/editor/extensions/emoji-command.ts create mode 100644 apps/client/src/features/editor/extensions/extensions.ts create mode 100644 apps/client/src/features/editor/extensions/markdown-clipboard.ts create mode 100644 apps/client/src/features/editor/extensions/placeholder.ts create mode 100644 apps/client/src/features/editor/extensions/slash-command.ts create mode 100644 apps/client/src/features/editor/extensions/utils.ts create mode 100644 apps/client/src/features/editor/full-editor.tsx create mode 100644 apps/client/src/features/editor/hooks/use-editor-scroll.ts create mode 100644 apps/client/src/features/editor/page-editor.tsx create mode 100644 apps/client/src/features/editor/readonly-page-editor.tsx create mode 100644 apps/client/src/features/editor/styles/base-embed.css create mode 100644 apps/client/src/features/editor/styles/code.css create mode 100644 apps/client/src/features/editor/styles/collaboration.css create mode 100644 apps/client/src/features/editor/styles/columns.css create mode 100644 apps/client/src/features/editor/styles/core.css create mode 100644 apps/client/src/features/editor/styles/details.css create mode 100644 apps/client/src/features/editor/styles/drag-handle.css create mode 100644 apps/client/src/features/editor/styles/editor.module.css create mode 100644 apps/client/src/features/editor/styles/find.css create mode 100644 apps/client/src/features/editor/styles/footnotes.css create mode 100644 apps/client/src/features/editor/styles/highlight.css create mode 100644 apps/client/src/features/editor/styles/indent.css create mode 100644 apps/client/src/features/editor/styles/index.css create mode 100644 apps/client/src/features/editor/styles/media.css create mode 100644 apps/client/src/features/editor/styles/mention.css create mode 100644 apps/client/src/features/editor/styles/ordered-list.css create mode 100644 apps/client/src/features/editor/styles/page-break.css create mode 100644 apps/client/src/features/editor/styles/placeholder.css create mode 100644 apps/client/src/features/editor/styles/print.css create mode 100644 apps/client/src/features/editor/styles/status.css create mode 100644 apps/client/src/features/editor/styles/table.css create mode 100644 apps/client/src/features/editor/styles/task-list.css create mode 100644 apps/client/src/features/editor/styles/youtube.css create mode 100644 apps/client/src/features/editor/title-editor.tsx create mode 100644 apps/client/src/features/editor/utils/index.ts create mode 100644 apps/client/src/features/editor/utils/is-custom-node-selected.ts create mode 100644 apps/client/src/features/editor/utils/is-text-selected.ts create mode 100644 apps/client/src/features/favorite/components/star-button.tsx create mode 100644 apps/client/src/features/favorite/queries/favorite-query.ts create mode 100644 apps/client/src/features/favorite/services/favorite-service.ts create mode 100644 apps/client/src/features/favorite/types/favorite.types.ts create mode 100644 apps/client/src/features/file-task/services/file-task-service.ts create mode 100644 apps/client/src/features/file-task/types/file-task.types.ts create mode 100644 apps/client/src/features/group/components/add-group-member-modal.tsx create mode 100644 apps/client/src/features/group/components/create-group-form.tsx create mode 100644 apps/client/src/features/group/components/create-group-modal.tsx create mode 100644 apps/client/src/features/group/components/edit-group-form.tsx create mode 100644 apps/client/src/features/group/components/edit-group-modal.tsx create mode 100644 apps/client/src/features/group/components/group-action-menu.tsx create mode 100644 apps/client/src/features/group/components/group-details.tsx create mode 100644 apps/client/src/features/group/components/group-list.tsx create mode 100644 apps/client/src/features/group/components/group-members.tsx create mode 100644 apps/client/src/features/group/components/multi-group-select.tsx create mode 100644 apps/client/src/features/group/components/multi-user-select.tsx create mode 100644 apps/client/src/features/group/queries/group-query.ts create mode 100644 apps/client/src/features/group/services/group-service.ts create mode 100644 apps/client/src/features/group/types/group.types.ts create mode 100644 apps/client/src/features/home/atoms/home-tab-atom.ts create mode 100644 apps/client/src/features/home/components/created-by-me.tsx create mode 100644 apps/client/src/features/home/components/favorites-pages.tsx create mode 100644 apps/client/src/features/home/components/home-ai-prompt.module.css create mode 100644 apps/client/src/features/home/components/home-ai-prompt.tsx create mode 100644 apps/client/src/features/home/components/home-tabs.tsx create mode 100644 apps/client/src/features/home/components/home.module.css create mode 100644 apps/client/src/features/label/components/label-chip.tsx create mode 100644 apps/client/src/features/label/components/label-page-row-skeleton.tsx create mode 100644 apps/client/src/features/label/components/label-page-row.tsx create mode 100644 apps/client/src/features/label/components/label-picker.tsx create mode 100644 apps/client/src/features/label/components/labels-section.tsx create mode 100644 apps/client/src/features/label/label.module.css create mode 100644 apps/client/src/features/label/queries/label-query.ts create mode 100644 apps/client/src/features/label/services/label-service.ts create mode 100644 apps/client/src/features/label/types/label.types.ts create mode 100644 apps/client/src/features/label/utils/format-label-date.ts create mode 100644 apps/client/src/features/label/utils/label-colors.ts create mode 100644 apps/client/src/features/label/utils/normalize-label.ts create mode 100644 apps/client/src/features/notification/components/notification-item.tsx create mode 100644 apps/client/src/features/notification/components/notification-list.tsx create mode 100644 apps/client/src/features/notification/components/notification-popover.tsx create mode 100644 apps/client/src/features/notification/hooks/use-notification-socket.ts create mode 100644 apps/client/src/features/notification/notification.module.css create mode 100644 apps/client/src/features/notification/notification.utils.ts create mode 100644 apps/client/src/features/notification/queries/notification-query.ts create mode 100644 apps/client/src/features/notification/services/notification-service.ts create mode 100644 apps/client/src/features/notification/types/notification.types.ts create mode 100644 apps/client/src/features/page-details/components/backlinks-list.tsx create mode 100644 apps/client/src/features/page-details/components/backlinks-modal.tsx create mode 100644 apps/client/src/features/page-details/components/page-details-aside.tsx create mode 100644 apps/client/src/features/page-details/queries/backlinks-query.ts create mode 100644 apps/client/src/features/page-details/services/backlinks-service.ts create mode 100644 apps/client/src/features/page-details/types/backlink.types.ts create mode 100644 apps/client/src/features/page-history/atoms/history-atoms.ts create mode 100644 apps/client/src/features/page-history/components/css/history-mobile.module.css create mode 100644 apps/client/src/features/page-history/components/css/history.module.css create mode 100644 apps/client/src/features/page-history/components/history-editor.tsx create mode 100644 apps/client/src/features/page-history/components/history-item.tsx create mode 100644 apps/client/src/features/page-history/components/history-list.tsx create mode 100644 apps/client/src/features/page-history/components/history-modal-body.tsx create mode 100644 apps/client/src/features/page-history/components/history-modal-mobile.tsx create mode 100644 apps/client/src/features/page-history/components/history-modal.tsx create mode 100644 apps/client/src/features/page-history/components/history-view.tsx create mode 100644 apps/client/src/features/page-history/hooks/index.ts create mode 100644 apps/client/src/features/page-history/hooks/use-diff-navigation.ts create mode 100644 apps/client/src/features/page-history/hooks/use-history-reset.ts create mode 100644 apps/client/src/features/page-history/hooks/use-history-restore.tsx create mode 100644 apps/client/src/features/page-history/queries/page-history-query.ts create mode 100644 apps/client/src/features/page-history/services/page-history-service.ts create mode 100644 apps/client/src/features/page-history/types/page.types.ts create mode 100644 apps/client/src/features/page-history/utils/resolve-compare-pair.test.ts create mode 100644 apps/client/src/features/page-history/utils/resolve-compare-pair.ts create mode 100644 apps/client/src/features/page/components/breadcrumbs/breadcrumb.module.css create mode 100644 apps/client/src/features/page/components/breadcrumbs/breadcrumb.tsx create mode 100644 apps/client/src/features/page/components/copy-page-modal.tsx create mode 100644 apps/client/src/features/page/components/header/page-header-menu.tsx create mode 100644 apps/client/src/features/page/components/header/page-header.module.css create mode 100644 apps/client/src/features/page/components/header/page-header.tsx create mode 100644 apps/client/src/features/page/components/move-page-modal.tsx create mode 100644 apps/client/src/features/page/components/page-import-modal.tsx create mode 100644 apps/client/src/features/page/hooks/use-delete-page-modal.tsx create mode 100644 apps/client/src/features/page/hooks/use-restore-page-modal.tsx create mode 100644 apps/client/src/features/page/page.utils.ts create mode 100644 apps/client/src/features/page/queries/page-query.ts create mode 100644 apps/client/src/features/page/queries/watcher-query.ts create mode 100644 apps/client/src/features/page/services/page-service.ts create mode 100644 apps/client/src/features/page/services/watcher-service.ts create mode 100644 apps/client/src/features/page/trash/components/deleted-page-banner.tsx create mode 100644 apps/client/src/features/page/trash/components/trash-banner.tsx create mode 100644 apps/client/src/features/page/trash/components/trash-page-content-modal.tsx create mode 100644 apps/client/src/features/page/trash/components/trash.tsx create mode 100644 apps/client/src/features/page/tree/atoms/open-tree-nodes-atom.ts create mode 100644 apps/client/src/features/page/tree/atoms/tree-data-atom.ts create mode 100644 apps/client/src/features/page/tree/components/doc-tree-drag-preview.module.css create mode 100644 apps/client/src/features/page/tree/components/doc-tree-drag-preview.tsx create mode 100644 apps/client/src/features/page/tree/components/doc-tree-drop-indicator.tsx create mode 100644 apps/client/src/features/page/tree/components/doc-tree-row.tsx create mode 100644 apps/client/src/features/page/tree/components/doc-tree.tsx create mode 100644 apps/client/src/features/page/tree/components/space-tree-node-menu.tsx create mode 100644 apps/client/src/features/page/tree/components/space-tree-row.tsx create mode 100644 apps/client/src/features/page/tree/components/space-tree.tsx create mode 100644 apps/client/src/features/page/tree/hooks/drop-op-to-move-payload.test.ts create mode 100644 apps/client/src/features/page/tree/hooks/drop-op-to-move-payload.ts create mode 100644 apps/client/src/features/page/tree/hooks/use-tree-mutation.ts create mode 100644 apps/client/src/features/page/tree/model/tree-model.test.ts create mode 100644 apps/client/src/features/page/tree/model/tree-model.ts create mode 100644 apps/client/src/features/page/tree/model/tree-model.types.ts create mode 100644 apps/client/src/features/page/tree/styles/tree.module.css create mode 100644 apps/client/src/features/page/tree/types.ts create mode 100644 apps/client/src/features/page/tree/utils/index.ts create mode 100644 apps/client/src/features/page/tree/utils/utils.ts create mode 100644 apps/client/src/features/page/types/page.types.ts create mode 100644 apps/client/src/features/public-space/atoms/public-space-atoms.ts create mode 100644 apps/client/src/features/public-space/components/appearance-settings.module.css create mode 100644 apps/client/src/features/public-space/components/appearance-settings.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-breadcrumbs.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-copy-page.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-edit-page.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-footer-branding.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-hub.module.css create mode 100644 apps/client/src/features/public-space/components/docs/docs-page-nav.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-search-button.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-shell.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-sidebar-tree.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-surface-context.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-theme-toggle.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs-toc.tsx create mode 100644 apps/client/src/features/public-space/components/docs/docs.module.css create mode 100644 apps/client/src/features/public-space/components/public-space-layout.tsx create mode 100644 apps/client/src/features/public-space/components/publish-space-settings.tsx create mode 100644 apps/client/src/features/public-space/components/published-spaces-list.tsx create mode 100644 apps/client/src/features/public-space/components/space-public-notice.tsx create mode 100644 apps/client/src/features/public-space/hooks/use-authenticated-user.ts create mode 100644 apps/client/src/features/public-space/hooks/use-docs-current-page.ts create mode 100644 apps/client/src/features/public-space/queries/public-space-query.ts create mode 100644 apps/client/src/features/public-space/services/public-space-service.ts create mode 100644 apps/client/src/features/public-space/theme/docs-theme.ts create mode 100644 apps/client/src/features/public-space/types/public-space.types.ts create mode 100644 apps/client/src/features/public-space/utils/docs-tree.ts create mode 100644 apps/client/src/features/public-space/utils/public-space-access.ts create mode 100644 apps/client/src/features/search/components/creator-filter-menu.tsx create mode 100644 apps/client/src/features/search/components/label-filter-menu.tsx create mode 100644 apps/client/src/features/search/components/public-space-search-spotlight.tsx create mode 100644 apps/client/src/features/search/components/search-control.module.css create mode 100644 apps/client/src/features/search/components/search-control.tsx create mode 100644 apps/client/src/features/search/components/search-result-item.tsx create mode 100644 apps/client/src/features/search/components/search-spotlight-filters.module.css create mode 100644 apps/client/src/features/search/components/search-spotlight-filters.tsx create mode 100644 apps/client/src/features/search/components/search-spotlight.tsx create mode 100644 apps/client/src/features/search/components/share-search-spotlight.tsx create mode 100644 apps/client/src/features/search/constants.ts create mode 100644 apps/client/src/features/search/hooks/use-unified-search.ts create mode 100644 apps/client/src/features/search/queries/search-query.ts create mode 100644 apps/client/src/features/search/services/search-service.ts create mode 100644 apps/client/src/features/search/types/search.types.ts create mode 100644 apps/client/src/features/session/components/session-list.tsx create mode 100644 apps/client/src/features/session/queries/session-query.ts create mode 100644 apps/client/src/features/session/services/session-service.ts create mode 100644 apps/client/src/features/session/types/session.types.ts create mode 100644 apps/client/src/features/share/atoms/shared-page-atom.ts create mode 100644 apps/client/src/features/share/components/share-action-menu.tsx create mode 100644 apps/client/src/features/share/components/share-layout.tsx create mode 100644 apps/client/src/features/share/components/share-list.tsx create mode 100644 apps/client/src/features/share/components/share-modal.tsx create mode 100644 apps/client/src/features/share/components/share.module.css create mode 100644 apps/client/src/features/share/hooks/use-shared-page-subpages.ts create mode 100644 apps/client/src/features/share/queries/share-query.ts create mode 100644 apps/client/src/features/share/services/share-service.ts create mode 100644 apps/client/src/features/share/types/share.types.ts create mode 100644 apps/client/src/features/share/utils.ts create mode 100644 apps/client/src/features/space/components/add-space-members-modal.tsx create mode 100644 apps/client/src/features/space/components/create-space-form.tsx create mode 100644 apps/client/src/features/space/components/create-space-modal.tsx create mode 100644 apps/client/src/features/space/components/delete-space-modal.tsx create mode 100644 apps/client/src/features/space/components/edit-space-form.tsx create mode 100644 apps/client/src/features/space/components/multi-member-select.tsx create mode 100644 apps/client/src/features/space/components/settings-modal.tsx create mode 100644 apps/client/src/features/space/components/sidebar/space-select.tsx create mode 100644 apps/client/src/features/space/components/sidebar/space-sidebar.module.css create mode 100644 apps/client/src/features/space/components/sidebar/space-sidebar.tsx create mode 100644 apps/client/src/features/space/components/sidebar/switch-space.module.css create mode 100644 apps/client/src/features/space/components/sidebar/switch-space.tsx create mode 100644 apps/client/src/features/space/components/space-carousel.module.css create mode 100644 apps/client/src/features/space/components/space-carousel.tsx create mode 100644 apps/client/src/features/space/components/space-details.tsx create mode 100644 apps/client/src/features/space/components/space-filter-menu.tsx create mode 100644 apps/client/src/features/space/components/space-grid.module.css create mode 100644 apps/client/src/features/space/components/space-grid.tsx create mode 100644 apps/client/src/features/space/components/space-home-tabs.tsx create mode 100644 apps/client/src/features/space/components/space-home.module.css create mode 100644 apps/client/src/features/space/components/space-list.tsx create mode 100644 apps/client/src/features/space/components/space-member-role.tsx create mode 100644 apps/client/src/features/space/components/space-members.tsx create mode 100644 apps/client/src/features/space/components/space-security-settings.tsx create mode 100644 apps/client/src/features/space/components/spaces-page/all-spaces-list.module.css create mode 100644 apps/client/src/features/space/components/spaces-page/all-spaces-list.tsx create mode 100644 apps/client/src/features/space/components/spaces-page/favorite-spaces-grid.tsx create mode 100644 apps/client/src/features/space/components/spaces-page/index.ts create mode 100644 apps/client/src/features/space/permissions/permissions.type.ts create mode 100644 apps/client/src/features/space/permissions/use-space-ability.ts create mode 100644 apps/client/src/features/space/queries/space-query.ts create mode 100644 apps/client/src/features/space/queries/space-watcher-query.ts create mode 100644 apps/client/src/features/space/services/space-service.ts create mode 100644 apps/client/src/features/space/services/space-watcher-service.ts create mode 100644 apps/client/src/features/space/types/space-role-data.ts create mode 100644 apps/client/src/features/space/types/space.types.ts create mode 100644 apps/client/src/features/transclusion/components/sync-block-references-dropdown.module.css create mode 100644 apps/client/src/features/transclusion/components/sync-block-references-dropdown.tsx create mode 100644 apps/client/src/features/transclusion/queries/transclusion-query.ts create mode 100644 apps/client/src/features/transclusion/services/transclusion-api.ts create mode 100644 apps/client/src/features/transclusion/types/transclusion.types.ts create mode 100644 apps/client/src/features/user/atoms/current-user-atom.ts create mode 100644 apps/client/src/features/user/components/account-avatar.tsx create mode 100644 apps/client/src/features/user/components/account-language.tsx create mode 100644 apps/client/src/features/user/components/account-mfa-section.tsx create mode 100644 apps/client/src/features/user/components/account-name-form.tsx create mode 100644 apps/client/src/features/user/components/account-theme.tsx create mode 100644 apps/client/src/features/user/components/change-email.tsx create mode 100644 apps/client/src/features/user/components/change-password.tsx create mode 100644 apps/client/src/features/user/components/fixed-toolbar-pref.tsx create mode 100644 apps/client/src/features/user/components/notification-pref.tsx create mode 100644 apps/client/src/features/user/components/page-state-pref.tsx create mode 100644 apps/client/src/features/user/components/page-width-pref.tsx create mode 100644 apps/client/src/features/user/hooks/use-current-user.ts create mode 100644 apps/client/src/features/user/services/user-service.ts create mode 100644 apps/client/src/features/user/types/user.types.ts create mode 100644 apps/client/src/features/user/user-provider.tsx create mode 100644 apps/client/src/features/websocket/atoms/socket-atom.ts create mode 100644 apps/client/src/features/websocket/types/constants.ts create mode 100644 apps/client/src/features/websocket/types/index.ts create mode 100644 apps/client/src/features/websocket/types/types.ts create mode 100644 apps/client/src/features/websocket/use-query-emit.ts create mode 100644 apps/client/src/features/websocket/use-query-subscription.ts create mode 100644 apps/client/src/features/websocket/use-tree-socket.ts create mode 100644 apps/client/src/features/workspace/components/members/components/invite-action-menu.tsx create mode 100644 apps/client/src/features/workspace/components/members/components/members-action-menu.tsx create mode 100644 apps/client/src/features/workspace/components/members/components/workspace-invite-form.tsx create mode 100644 apps/client/src/features/workspace/components/members/components/workspace-invite-modal.tsx create mode 100644 apps/client/src/features/workspace/components/members/components/workspace-invite-section.tsx create mode 100644 apps/client/src/features/workspace/components/members/components/workspace-invites-table.tsx create mode 100644 apps/client/src/features/workspace/components/members/components/workspace-members-table.tsx create mode 100644 apps/client/src/features/workspace/components/settings/components/allow-public-spaces.tsx create mode 100644 apps/client/src/features/workspace/components/settings/components/workspace-default-page-edit-mode.tsx create mode 100644 apps/client/src/features/workspace/components/settings/components/workspace-icon.tsx create mode 100644 apps/client/src/features/workspace/components/settings/components/workspace-name-form.tsx create mode 100644 apps/client/src/features/workspace/queries/workspace-query.ts create mode 100644 apps/client/src/features/workspace/services/workspace-service.ts create mode 100644 apps/client/src/features/workspace/types/user-role-data.ts create mode 100644 apps/client/src/features/workspace/types/workspace.types.ts create mode 100644 apps/client/src/hooks/use-clipboard.ts create mode 100644 apps/client/src/hooks/use-cursor-paginate.tsx create mode 100644 apps/client/src/hooks/use-idle.ts create mode 100644 apps/client/src/hooks/use-match-path.tsx create mode 100644 apps/client/src/hooks/use-paginate-and-search.tsx create mode 100644 apps/client/src/hooks/use-settings-navigation.ts create mode 100644 apps/client/src/hooks/use-time-ago.tsx create mode 100644 apps/client/src/hooks/use-toggle-aside.tsx create mode 100644 apps/client/src/hooks/use-track-origin.ts create mode 100644 apps/client/src/hooks/use-user-role.tsx create mode 100644 apps/client/src/i18n.ts create mode 100644 apps/client/src/lib/api-client.ts create mode 100644 apps/client/src/lib/api-error.ts create mode 100644 apps/client/src/lib/app-route.ts create mode 100644 apps/client/src/lib/config.ts create mode 100644 apps/client/src/lib/constants.ts create mode 100644 apps/client/src/lib/date-locale.ts create mode 100644 apps/client/src/lib/get-initials-color.ts create mode 100644 apps/client/src/lib/index.ts create mode 100644 apps/client/src/lib/jotai-helper.ts create mode 100644 apps/client/src/lib/local-emitter.ts create mode 100644 apps/client/src/lib/time.ts create mode 100644 apps/client/src/lib/types.ts create mode 100644 apps/client/src/lib/utils.tsx create mode 100644 apps/client/src/main.tsx create mode 100644 apps/client/src/pages/auth/forgot-password.tsx create mode 100644 apps/client/src/pages/auth/invite-signup.tsx create mode 100644 apps/client/src/pages/auth/login.tsx create mode 100644 apps/client/src/pages/auth/password-reset.tsx create mode 100644 apps/client/src/pages/auth/setup-workspace.tsx create mode 100644 apps/client/src/pages/dashboard/home.tsx create mode 100644 apps/client/src/pages/favorites/favorites-page.tsx create mode 100644 apps/client/src/pages/label/label-page.tsx create mode 100644 apps/client/src/pages/page/page-redirect.tsx create mode 100644 apps/client/src/pages/page/page.tsx create mode 100644 apps/client/src/pages/public-space/public-space-directory-page.tsx create mode 100644 apps/client/src/pages/public-space/public-space-page.tsx create mode 100644 apps/client/src/pages/settings/account/account-preferences.tsx create mode 100644 apps/client/src/pages/settings/account/account-settings.tsx create mode 100644 apps/client/src/pages/settings/group/group-info.tsx create mode 100644 apps/client/src/pages/settings/group/groups.tsx create mode 100644 apps/client/src/pages/settings/shares/shares.tsx create mode 100644 apps/client/src/pages/settings/space/spaces.tsx create mode 100644 apps/client/src/pages/settings/workspace/workspace-members.tsx create mode 100644 apps/client/src/pages/settings/workspace/workspace-settings.tsx create mode 100644 apps/client/src/pages/share/share-redirect.tsx create mode 100644 apps/client/src/pages/share/shared-page.tsx create mode 100644 apps/client/src/pages/space/space-home.tsx create mode 100644 apps/client/src/pages/space/space-trash.tsx create mode 100644 apps/client/src/pages/spaces/spaces.tsx create mode 100644 apps/client/src/styles/a11y-overrides.css create mode 100644 apps/client/src/styles/public-typography.css create mode 100644 apps/client/src/theme.ts create mode 100644 apps/client/src/vite-env.d.ts create mode 100644 apps/client/tsconfig.json create mode 100644 apps/client/tsconfig.node.json create mode 100644 apps/client/vite.config.ts create mode 100644 apps/client/vitest.config.ts create mode 100644 apps/server/.dockerignore create mode 100644 apps/server/.gitignore create mode 100644 apps/server/.prettierrc create mode 100644 apps/server/README.md create mode 100644 apps/server/eslint.config.mjs create mode 100644 apps/server/nest-cli.json create mode 100644 apps/server/package.json create mode 100644 apps/server/src/app.controller.ts create mode 100644 apps/server/src/app.module.ts create mode 100644 apps/server/src/app.service.ts create mode 100644 apps/server/src/collaboration/adapter/collab-ws.adapter.ts create mode 100644 apps/server/src/collaboration/collaboration.gateway.ts create mode 100644 apps/server/src/collaboration/collaboration.handler.ts create mode 100644 apps/server/src/collaboration/collaboration.module.ts create mode 100644 apps/server/src/collaboration/collaboration.util.ts create mode 100644 apps/server/src/collaboration/constants.ts create mode 100644 apps/server/src/collaboration/extensions/authentication.extension.ts create mode 100644 apps/server/src/collaboration/extensions/logger.extension.ts create mode 100644 apps/server/src/collaboration/extensions/persistence.extension.ts create mode 100644 apps/server/src/collaboration/extensions/redis-sync/collab-proxy-socket.ts create mode 100644 apps/server/src/collaboration/extensions/redis-sync/index.ts create mode 100644 apps/server/src/collaboration/extensions/redis-sync/redis-sync.extension.ts create mode 100644 apps/server/src/collaboration/extensions/redis-sync/redis-sync.types.ts create mode 100644 apps/server/src/collaboration/extensions/redis-sync/ws-socket-wrapper.ts create mode 100644 apps/server/src/collaboration/processors/history.processor.ts create mode 100644 apps/server/src/collaboration/server/collab-app.module.ts create mode 100644 apps/server/src/collaboration/server/collab-main.ts create mode 100644 apps/server/src/collaboration/server/collaboration.controller.ts create mode 100644 apps/server/src/collaboration/services/collab-history.service.ts create mode 100644 apps/server/src/collaboration/yjs.util.ts create mode 100644 apps/server/src/common/decorators/auth-user.decorator.ts create mode 100644 apps/server/src/common/decorators/auth-workspace.decorator.ts create mode 100644 apps/server/src/common/decorators/oauth-scope.decorator.ts create mode 100644 apps/server/src/common/decorators/public.decorator.ts create mode 100644 apps/server/src/common/decorators/require-session-auth.decorator.ts create mode 100644 apps/server/src/common/decorators/skip-transform.decorator.ts create mode 100644 apps/server/src/common/events/audit-events.ts create mode 100644 apps/server/src/common/events/event.contants.ts create mode 100644 apps/server/src/common/features.ts create mode 100644 apps/server/src/common/guards/jwt-auth.guard.spec.ts create mode 100644 apps/server/src/common/guards/jwt-auth.guard.ts create mode 100644 apps/server/src/common/helpers/cache-keys.ts create mode 100644 apps/server/src/common/helpers/constants.ts create mode 100644 apps/server/src/common/helpers/file.helper.ts create mode 100644 apps/server/src/common/helpers/html-escaper.ts create mode 100644 apps/server/src/common/helpers/index.ts create mode 100644 apps/server/src/common/helpers/nanoid.utils.ts create mode 100644 apps/server/src/common/helpers/prosemirror/attachment-node-types.ts create mode 100644 apps/server/src/common/helpers/prosemirror/html/generateHTML.ts create mode 100644 apps/server/src/common/helpers/prosemirror/html/generateJSON.ts create mode 100644 apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts create mode 100644 apps/server/src/common/helpers/prosemirror/html/index.ts create mode 100644 apps/server/src/common/helpers/prosemirror/indent-schema.spec.ts create mode 100644 apps/server/src/common/helpers/prosemirror/utils.ts create mode 100644 apps/server/src/common/helpers/security-headers.spec.ts create mode 100644 apps/server/src/common/helpers/security-headers.ts create mode 100644 apps/server/src/common/helpers/text.utils.spec.ts create mode 100644 apps/server/src/common/helpers/text.utils.ts create mode 100644 apps/server/src/common/helpers/types/export-metadata.types.ts create mode 100644 apps/server/src/common/helpers/types/permission.ts create mode 100644 apps/server/src/common/helpers/utils.spec.ts create mode 100644 apps/server/src/common/helpers/utils.ts create mode 100644 apps/server/src/common/helpers/with-cache.ts create mode 100644 apps/server/src/common/interceptors/audit-actor.interceptor.ts create mode 100644 apps/server/src/common/interceptors/file.interceptor.ts create mode 100644 apps/server/src/common/interceptors/http-response.interceptor.ts create mode 100644 apps/server/src/common/logger/internal-log-filter.ts create mode 100644 apps/server/src/common/logger/logger.module.ts create mode 100644 apps/server/src/common/logger/pino.config.ts create mode 100644 apps/server/src/common/middlewares/audit-context.middleware.ts create mode 100644 apps/server/src/common/middlewares/domain.middleware.ts create mode 100644 apps/server/src/common/validators/is-iso6391.ts create mode 100644 apps/server/src/common/validators/no-urls.validator.spec.ts create mode 100644 apps/server/src/common/validators/no-urls.validator.ts create mode 100644 apps/server/src/core/attachment/attachment.constants.ts create mode 100644 apps/server/src/core/attachment/attachment.controller.ts create mode 100644 apps/server/src/core/attachment/attachment.module.ts create mode 100644 apps/server/src/core/attachment/attachment.utils.ts create mode 100644 apps/server/src/core/attachment/dto/attachment.dto.ts create mode 100644 apps/server/src/core/attachment/processors/attachment.processor.ts create mode 100644 apps/server/src/core/attachment/services/attachment.service.ts create mode 100644 apps/server/src/core/auth/auth.constants.ts create mode 100644 apps/server/src/core/auth/auth.controller.spec.ts create mode 100644 apps/server/src/core/auth/auth.controller.ts create mode 100644 apps/server/src/core/auth/auth.module.ts create mode 100644 apps/server/src/core/auth/auth.util.ts create mode 100644 apps/server/src/core/auth/dto/change-password.dto.ts create mode 100644 apps/server/src/core/auth/dto/create-admin-user.dto.ts create mode 100644 apps/server/src/core/auth/dto/create-user.dto.ts create mode 100644 apps/server/src/core/auth/dto/forgot-password.dto.ts create mode 100644 apps/server/src/core/auth/dto/jwt-payload.ts create mode 100644 apps/server/src/core/auth/dto/login.dto.ts create mode 100644 apps/server/src/core/auth/dto/password-reset.dto.ts create mode 100644 apps/server/src/core/auth/dto/verify-user-token.dto.ts create mode 100644 apps/server/src/core/auth/guards/setup.guard.ts create mode 100644 apps/server/src/core/auth/services/auth.service.spec.ts create mode 100644 apps/server/src/core/auth/services/auth.service.ts create mode 100644 apps/server/src/core/auth/services/signup.service.ts create mode 100644 apps/server/src/core/auth/services/token.service.spec.ts create mode 100644 apps/server/src/core/auth/services/token.service.ts create mode 100644 apps/server/src/core/auth/strategies/jwt.strategy.ts create mode 100644 apps/server/src/core/auth/token.module.ts create mode 100644 apps/server/src/core/casl/abilities/space-ability.factory.ts create mode 100644 apps/server/src/core/casl/abilities/workspace-ability.factory.ts create mode 100644 apps/server/src/core/casl/casl.module.ts create mode 100644 apps/server/src/core/casl/interfaces/space-ability.type.ts create mode 100644 apps/server/src/core/casl/interfaces/workspace-ability.type.ts create mode 100644 apps/server/src/core/comment/comment.controller.ts create mode 100644 apps/server/src/core/comment/comment.module.ts create mode 100644 apps/server/src/core/comment/comment.service.spec.ts create mode 100644 apps/server/src/core/comment/comment.service.ts create mode 100644 apps/server/src/core/comment/dto/comments.input.ts create mode 100644 apps/server/src/core/comment/dto/create-comment.dto.ts create mode 100644 apps/server/src/core/comment/dto/update-comment.dto.ts create mode 100644 apps/server/src/core/core.module.ts create mode 100644 apps/server/src/core/favorite/dto/favorite-ids.dto.ts create mode 100644 apps/server/src/core/favorite/dto/favorite.dto.ts create mode 100644 apps/server/src/core/favorite/dto/list-favorites.dto.ts create mode 100644 apps/server/src/core/favorite/favorite.controller.ts create mode 100644 apps/server/src/core/favorite/favorite.module.ts create mode 100644 apps/server/src/core/favorite/services/favorite.service.ts create mode 100644 apps/server/src/core/group/dto/add-group-user.dto.ts create mode 100644 apps/server/src/core/group/dto/create-group.dto.ts create mode 100644 apps/server/src/core/group/dto/group-id.dto.ts create mode 100644 apps/server/src/core/group/dto/remove-group-user.dto.ts create mode 100644 apps/server/src/core/group/dto/update-group.dto.ts create mode 100644 apps/server/src/core/group/group.controller.spec.ts create mode 100644 apps/server/src/core/group/group.controller.ts create mode 100644 apps/server/src/core/group/group.module.ts create mode 100644 apps/server/src/core/group/services/group-user.service.ts create mode 100644 apps/server/src/core/group/services/group.service.spec.ts create mode 100644 apps/server/src/core/group/services/group.service.ts create mode 100644 apps/server/src/core/label/dto/label.dto.ts create mode 100644 apps/server/src/core/label/label.controller.ts create mode 100644 apps/server/src/core/label/label.module.ts create mode 100644 apps/server/src/core/label/label.service.ts create mode 100644 apps/server/src/core/label/utils.ts create mode 100644 apps/server/src/core/notification/dto/notification.dto.ts create mode 100644 apps/server/src/core/notification/notification.constants.ts create mode 100644 apps/server/src/core/notification/notification.controller.ts create mode 100644 apps/server/src/core/notification/notification.module.ts create mode 100644 apps/server/src/core/notification/notification.processor.ts create mode 100644 apps/server/src/core/notification/notification.service.ts create mode 100644 apps/server/src/core/notification/services/comment.notification.ts create mode 100644 apps/server/src/core/notification/services/page-update-email-rate-limiter.ts create mode 100644 apps/server/src/core/notification/services/page.notification.ts create mode 100644 apps/server/src/core/notification/services/verification.notification.ts create mode 100644 apps/server/src/core/page/dto/backlink.dto.ts create mode 100644 apps/server/src/core/page/dto/create-page.dto.ts create mode 100644 apps/server/src/core/page/dto/created-by-user.dto.ts create mode 100644 apps/server/src/core/page/dto/deleted-page.dto.ts create mode 100644 apps/server/src/core/page/dto/duplicate-page.dto.ts create mode 100644 apps/server/src/core/page/dto/move-page.dto.ts create mode 100644 apps/server/src/core/page/dto/page.dto.ts create mode 100644 apps/server/src/core/page/dto/recent-page.dto.ts create mode 100644 apps/server/src/core/page/dto/sidebar-page.dto.ts create mode 100644 apps/server/src/core/page/dto/update-page.dto.ts create mode 100644 apps/server/src/core/page/page-access/page-access.module.ts create mode 100644 apps/server/src/core/page/page-access/page-access.service.ts create mode 100644 apps/server/src/core/page/page.controller.spec.ts create mode 100644 apps/server/src/core/page/page.controller.ts create mode 100644 apps/server/src/core/page/page.module.ts create mode 100644 apps/server/src/core/page/services/backlink.service.spec.ts create mode 100644 apps/server/src/core/page/services/backlink.service.ts create mode 100644 apps/server/src/core/page/services/page-history.service.ts create mode 100644 apps/server/src/core/page/services/page.service.spec.ts create mode 100644 apps/server/src/core/page/services/page.service.ts create mode 100644 apps/server/src/core/page/services/trash-cleanup.service.ts create mode 100644 apps/server/src/core/page/transclusion/dto/lookup.dto.ts create mode 100644 apps/server/src/core/page/transclusion/dto/references.dto.ts create mode 100644 apps/server/src/core/page/transclusion/dto/unsync-reference.dto.ts create mode 100644 apps/server/src/core/page/transclusion/spec/transclusion-prosemirror.util.spec.ts create mode 100644 apps/server/src/core/page/transclusion/spec/transclusion-unsync.util.spec.ts create mode 100644 apps/server/src/core/page/transclusion/spec/transclusion.controller.spec.ts create mode 100644 apps/server/src/core/page/transclusion/transclusion.controller.ts create mode 100644 apps/server/src/core/page/transclusion/transclusion.module.ts create mode 100644 apps/server/src/core/page/transclusion/transclusion.service.ts create mode 100644 apps/server/src/core/page/transclusion/transclusion.types.ts create mode 100644 apps/server/src/core/page/transclusion/utils/transclusion-prosemirror.util.ts create mode 100644 apps/server/src/core/page/transclusion/utils/transclusion-unsync.util.ts create mode 100644 apps/server/src/core/public-space/dto/public-space.dto.ts create mode 100644 apps/server/src/core/public-space/public-space-seo.controller.ts create mode 100644 apps/server/src/core/public-space/public-space.controller.ts create mode 100644 apps/server/src/core/public-space/public-space.module.ts create mode 100644 apps/server/src/core/public-space/public-space.service.spec.ts create mode 100644 apps/server/src/core/public-space/public-space.service.ts create mode 100644 apps/server/src/core/search/dto/search-response.dto.ts create mode 100644 apps/server/src/core/search/dto/search.dto.ts create mode 100644 apps/server/src/core/search/search.controller.spec.ts create mode 100644 apps/server/src/core/search/search.controller.ts create mode 100644 apps/server/src/core/search/search.module.ts create mode 100644 apps/server/src/core/search/search.service.spec.ts create mode 100644 apps/server/src/core/search/search.service.ts create mode 100644 apps/server/src/core/session/dto/revoke-session.dto.ts create mode 100644 apps/server/src/core/session/session-activity.service.ts create mode 100644 apps/server/src/core/session/session.controller.ts create mode 100644 apps/server/src/core/session/session.module.ts create mode 100644 apps/server/src/core/session/session.service.ts create mode 100644 apps/server/src/core/share/dto/share-transclusion-lookup.dto.ts create mode 100644 apps/server/src/core/share/dto/share.dto.ts create mode 100644 apps/server/src/core/share/share-seo.controller.ts create mode 100644 apps/server/src/core/share/share.controller.ts create mode 100644 apps/server/src/core/share/share.module.ts create mode 100644 apps/server/src/core/share/share.service.ts create mode 100644 apps/server/src/core/share/share.util.ts create mode 100644 apps/server/src/core/space/dto/add-space-members.dto.ts create mode 100644 apps/server/src/core/space/dto/create-space.dto.ts create mode 100644 apps/server/src/core/space/dto/delete-space.dto.ts create mode 100644 apps/server/src/core/space/dto/remove-space-member.dto.ts create mode 100644 apps/server/src/core/space/dto/space-id.dto.ts create mode 100644 apps/server/src/core/space/dto/update-space-member-role.dto.ts create mode 100644 apps/server/src/core/space/dto/update-space.dto.ts create mode 100644 apps/server/src/core/space/services/space-member.service.ts create mode 100644 apps/server/src/core/space/services/space.service.spec.ts create mode 100644 apps/server/src/core/space/services/space.service.ts create mode 100644 apps/server/src/core/space/space.controller.spec.ts create mode 100644 apps/server/src/core/space/space.controller.ts create mode 100644 apps/server/src/core/space/space.module.ts create mode 100644 apps/server/src/core/user/dto/update-user.dto.ts create mode 100644 apps/server/src/core/user/user.controller.spec.ts create mode 100644 apps/server/src/core/user/user.controller.ts create mode 100644 apps/server/src/core/user/user.module.ts create mode 100644 apps/server/src/core/user/user.service.ts create mode 100644 apps/server/src/core/watcher/dto/space-watcher.dto.ts create mode 100644 apps/server/src/core/watcher/dto/watcher.dto.ts create mode 100644 apps/server/src/core/watcher/space-watcher.controller.ts create mode 100644 apps/server/src/core/watcher/watcher.controller.ts create mode 100644 apps/server/src/core/watcher/watcher.module.ts create mode 100644 apps/server/src/core/watcher/watcher.service.ts create mode 100644 apps/server/src/core/workspace/controllers/workspace.controller.ts create mode 100644 apps/server/src/core/workspace/dto/check-hostname.dto.ts create mode 100644 apps/server/src/core/workspace/dto/create-workspace.dto.ts create mode 100644 apps/server/src/core/workspace/dto/delete-workspace.dto.ts create mode 100644 apps/server/src/core/workspace/dto/invitation.dto.ts create mode 100644 apps/server/src/core/workspace/dto/remove-workspace-user.dto.ts create mode 100644 apps/server/src/core/workspace/dto/update-workspace-user-role.dto.ts create mode 100644 apps/server/src/core/workspace/dto/update-workspace.dto.ts create mode 100644 apps/server/src/core/workspace/services/workspace-invitation.service.ts create mode 100644 apps/server/src/core/workspace/services/workspace.service.ts create mode 100644 apps/server/src/core/workspace/workspace.constants.ts create mode 100644 apps/server/src/core/workspace/workspace.module.ts create mode 100644 apps/server/src/core/workspace/workspace.util.ts create mode 100644 apps/server/src/database/database.module.ts create mode 100644 apps/server/src/database/helpers/helpers.ts create mode 100644 apps/server/src/database/listeners/page.listener.ts create mode 100644 apps/server/src/database/listeners/space.listener.ts create mode 100644 apps/server/src/database/listeners/workspace.listener.ts create mode 100644 apps/server/src/database/migrate.ts create mode 100644 apps/server/src/database/migrations/20240324T085400-uuid_v7_fn.ts create mode 100644 apps/server/src/database/migrations/20240324T085500-workspaces.ts create mode 100644 apps/server/src/database/migrations/20240324T085600-users.ts create mode 100644 apps/server/src/database/migrations/20240324T085700-groups.ts create mode 100644 apps/server/src/database/migrations/20240324T085900-spaces.ts create mode 100644 apps/server/src/database/migrations/20240324T086100-add-workspace-fk.ts create mode 100644 apps/server/src/database/migrations/20240324T086200-workspace_invitations.ts create mode 100644 apps/server/src/database/migrations/20240324T086300-pages.ts create mode 100644 apps/server/src/database/migrations/20240324T086400-page_history.ts create mode 100644 apps/server/src/database/migrations/20240324T086600-comments.ts create mode 100644 apps/server/src/database/migrations/20240324T086700-attachments.ts create mode 100644 apps/server/src/database/migrations/20240324T086800-pages-tsvector-trigger.ts create mode 100644 apps/server/src/database/migrations/20240707T145623-drop-redundant-pages-slug_id-index.ts create mode 100644 apps/server/src/database/migrations/20240903T124647-user-tokens.ts create mode 100644 apps/server/src/database/migrations/20241218T223249-backlinks.ts create mode 100644 apps/server/src/database/migrations/20250106T195516-billing.ts create mode 100644 apps/server/src/database/migrations/20250118T194658-sso-auth.ts create mode 100644 apps/server/src/database/migrations/20250222T114520-add_license_key_to_workspace.ts create mode 100644 apps/server/src/database/migrations/20250327T145832-add-contributorIds-to-pages.ts create mode 100644 apps/server/src/database/migrations/20250408T191830-shares.ts create mode 100644 apps/server/src/database/migrations/20250521T154949-file_tasks.ts create mode 100644 apps/server/src/database/migrations/20250623T215045-more-billing-columns.ts create mode 100644 apps/server/src/database/migrations/20250715T070817-mfa.ts create mode 100644 apps/server/src/database/migrations/20250725T052004-add-new-comments-columns.ts create mode 100644 apps/server/src/database/migrations/20250729T213756-add-unaccent-pg_trm-update-tsvector..ts create mode 100644 apps/server/src/database/migrations/20250831T191600-add-group-sync-to-auth-providers.ts create mode 100644 apps/server/src/database/migrations/20250831T202306-ldap-auth.ts create mode 100644 apps/server/src/database/migrations/20250901T184612-attachments-search.ts create mode 100644 apps/server/src/database/migrations/20250912T101500-api-keys.ts create mode 100644 apps/server/src/database/migrations/20260205T214213-add-settings-to-spaces.ts create mode 100644 apps/server/src/database/migrations/20260209T120000-add-contributor_ids-to-page-history.ts create mode 100644 apps/server/src/database/migrations/20260213T085259-notifications.ts create mode 100644 apps/server/src/database/migrations/20260213T085320-watchers.ts create mode 100644 apps/server/src/database/migrations/20260213T085337-backfill-watchers.ts create mode 100644 apps/server/src/database/migrations/20260224T233803-page-permissions.ts create mode 100644 apps/server/src/database/migrations/20260228T223532-audit.ts create mode 100644 apps/server/src/database/migrations/20260326T121350-user-sessions.ts create mode 100644 apps/server/src/database/migrations/20260329T163516-add-new-indexes.ts create mode 100644 apps/server/src/database/migrations/20260409T132415-ai-chat.ts create mode 100644 apps/server/src/database/migrations/20260412T135891-templates.ts create mode 100644 apps/server/src/database/migrations/20260412T162318-favorites.ts create mode 100644 apps/server/src/database/migrations/20260413T121647-page-verifications.ts create mode 100644 apps/server/src/database/migrations/20260414T124451-update-file_tasks.ts create mode 100644 apps/server/src/database/migrations/20260501T092214-scim.ts create mode 100644 apps/server/src/database/migrations/20260501T202258-page-transclusions.ts create mode 100644 apps/server/src/database/migrations/20260509T121236-labels.ts create mode 100644 apps/server/src/database/migrations/20260529T125146-bases.ts create mode 100644 apps/server/src/database/migrations/20260620T010047-personal-spaces.ts create mode 100644 apps/server/src/database/migrations/20260824T211732-page-title-trgm-index.ts create mode 100644 apps/server/src/database/migrations/20260825T022612-oauth.ts create mode 100644 apps/server/src/database/migrations/20260902T121326-siem-destinations.ts create mode 100644 apps/server/src/database/migrations/20260904T171920-public-spaces.ts create mode 100644 apps/server/src/database/pagination/cursor-pagination.ts create mode 100644 apps/server/src/database/pagination/pagination-options.ts create mode 100644 apps/server/src/database/pagination/pagination.ts create mode 100644 apps/server/src/database/repos/attachment/attachment.repo.ts create mode 100644 apps/server/src/database/repos/backlink/backlink.repo.ts create mode 100644 apps/server/src/database/repos/comment/comment.repo.ts create mode 100644 apps/server/src/database/repos/favorite/favorite.repo.ts create mode 100644 apps/server/src/database/repos/group/group-user.repo.ts create mode 100644 apps/server/src/database/repos/group/group.repo.ts create mode 100644 apps/server/src/database/repos/label/label.repo.ts create mode 100644 apps/server/src/database/repos/notification/notification.repo.ts create mode 100644 apps/server/src/database/repos/page-transclusions/page-transclusion-references.repo.ts create mode 100644 apps/server/src/database/repos/page-transclusions/page-transclusions.repo.ts create mode 100644 apps/server/src/database/repos/page/page-history.repo.ts create mode 100644 apps/server/src/database/repos/page/page-permission.repo.ts create mode 100644 apps/server/src/database/repos/page/page.repo.ts create mode 100644 apps/server/src/database/repos/page/types/page-permission.types.ts create mode 100644 apps/server/src/database/repos/public-space/public-space.repo.ts create mode 100644 apps/server/src/database/repos/session/user-session.repo.ts create mode 100644 apps/server/src/database/repos/share/share.repo.ts create mode 100644 apps/server/src/database/repos/space/space-member.repo.ts create mode 100644 apps/server/src/database/repos/space/space.repo.ts create mode 100644 apps/server/src/database/repos/space/types.ts create mode 100644 apps/server/src/database/repos/space/utils.ts create mode 100644 apps/server/src/database/repos/template/template.repo.ts create mode 100644 apps/server/src/database/repos/user-token/user-token.repo.ts create mode 100644 apps/server/src/database/repos/user/user.repo.ts create mode 100644 apps/server/src/database/repos/watcher/watcher.repo.ts create mode 100644 apps/server/src/database/repos/workspace/workspace.repo.ts create mode 100644 apps/server/src/database/services/migration.service.ts create mode 100644 apps/server/src/database/types/db.d.ts create mode 100644 apps/server/src/database/types/db.interface.ts create mode 100644 apps/server/src/database/types/embeddings.types.ts create mode 100644 apps/server/src/database/types/entity.types.ts create mode 100644 apps/server/src/database/types/kysely.types.ts create mode 100644 apps/server/src/database/utils.ts create mode 100644 apps/server/src/integrations/audit/audit.module.ts create mode 100644 apps/server/src/integrations/audit/audit.service.ts create mode 100644 apps/server/src/integrations/encryption/encryption.errors.ts create mode 100644 apps/server/src/integrations/encryption/encryption.module.ts create mode 100644 apps/server/src/integrations/encryption/encryption.service.spec.ts create mode 100644 apps/server/src/integrations/encryption/encryption.service.ts create mode 100644 apps/server/src/integrations/environment/domain.service.ts create mode 100644 apps/server/src/integrations/environment/environment.module.ts create mode 100644 apps/server/src/integrations/environment/environment.service.spec.ts create mode 100644 apps/server/src/integrations/environment/environment.service.ts create mode 100644 apps/server/src/integrations/environment/environment.validation.ts create mode 100644 apps/server/src/integrations/environment/license-check.service.ts create mode 100644 apps/server/src/integrations/export/dto/export-dto.ts create mode 100644 apps/server/src/integrations/export/export.controller.ts create mode 100644 apps/server/src/integrations/export/export.module.ts create mode 100644 apps/server/src/integrations/export/export.service.ts create mode 100644 apps/server/src/integrations/export/utils.ts create mode 100644 apps/server/src/integrations/health/health.controller.ts create mode 100644 apps/server/src/integrations/health/health.module.ts create mode 100644 apps/server/src/integrations/health/postgres.health.ts create mode 100644 apps/server/src/integrations/health/redis.health.ts create mode 100644 apps/server/src/integrations/import/dto/file-task-dto.ts create mode 100644 apps/server/src/integrations/import/dto/import-dto.ts create mode 100644 apps/server/src/integrations/import/file-task.controller.ts create mode 100644 apps/server/src/integrations/import/import.controller.ts create mode 100644 apps/server/src/integrations/import/import.module.ts create mode 100644 apps/server/src/integrations/import/processors/file-task.processor.ts create mode 100644 apps/server/src/integrations/import/services/file-import-task.service.ts create mode 100644 apps/server/src/integrations/import/services/import-attachment.service.ts create mode 100644 apps/server/src/integrations/import/services/import.service.ts create mode 100644 apps/server/src/integrations/import/utils/file.utils.ts create mode 100644 apps/server/src/integrations/import/utils/import-formatter.ts create mode 100644 apps/server/src/integrations/import/utils/import.utils.ts create mode 100644 apps/server/src/integrations/import/utils/table-utils.ts create mode 100644 apps/server/src/integrations/mail/drivers/index.ts create mode 100644 apps/server/src/integrations/mail/drivers/interfaces/mail-driver.interface.ts create mode 100644 apps/server/src/integrations/mail/drivers/log.driver.ts create mode 100644 apps/server/src/integrations/mail/drivers/postmark.driver.ts create mode 100644 apps/server/src/integrations/mail/drivers/smtp.driver.ts create mode 100644 apps/server/src/integrations/mail/interfaces/index.ts create mode 100644 apps/server/src/integrations/mail/interfaces/mail.interface.ts create mode 100644 apps/server/src/integrations/mail/interfaces/mail.message.ts create mode 100644 apps/server/src/integrations/mail/mail.constants.ts create mode 100644 apps/server/src/integrations/mail/mail.module.ts create mode 100644 apps/server/src/integrations/mail/mail.service.ts create mode 100644 apps/server/src/integrations/mail/mail.utils.ts create mode 100644 apps/server/src/integrations/mail/processors/email.processor.ts create mode 100644 apps/server/src/integrations/mail/providers/mail.provider.ts create mode 100644 apps/server/src/integrations/outbound/outbound-agent.factory.spec.ts create mode 100644 apps/server/src/integrations/outbound/outbound-agent.factory.ts create mode 100644 apps/server/src/integrations/outbound/outbound-network-policy.spec.ts create mode 100644 apps/server/src/integrations/outbound/outbound-network-policy.ts create mode 100644 apps/server/src/integrations/outbound/outbound-url.guard.spec.ts create mode 100644 apps/server/src/integrations/outbound/outbound-url.guard.ts create mode 100644 apps/server/src/integrations/outbound/outbound.module.ts create mode 100644 apps/server/src/integrations/queue/constants/index.ts create mode 100644 apps/server/src/integrations/queue/constants/queue.constants.ts create mode 100644 apps/server/src/integrations/queue/constants/queue.interface.ts create mode 100644 apps/server/src/integrations/queue/processors/general-queue.processor.ts create mode 100644 apps/server/src/integrations/queue/queue.module.ts create mode 100644 apps/server/src/integrations/queue/tasks/backlinks.task.ts create mode 100644 apps/server/src/integrations/redis/redis-config.service.ts create mode 100644 apps/server/src/integrations/security/robots.txt.controller.ts create mode 100644 apps/server/src/integrations/security/security.module.ts create mode 100644 apps/server/src/integrations/security/version.controller.ts create mode 100644 apps/server/src/integrations/security/version.service.ts create mode 100644 apps/server/src/integrations/static/static.module.ts create mode 100644 apps/server/src/integrations/storage/constants/storage.constants.ts create mode 100644 apps/server/src/integrations/storage/drivers/azure.driver.ts create mode 100644 apps/server/src/integrations/storage/drivers/index.ts create mode 100644 apps/server/src/integrations/storage/drivers/local.driver.spec.ts create mode 100644 apps/server/src/integrations/storage/drivers/local.driver.ts create mode 100644 apps/server/src/integrations/storage/drivers/s3.driver.ts create mode 100644 apps/server/src/integrations/storage/interfaces/index.ts create mode 100644 apps/server/src/integrations/storage/interfaces/storage-driver.interface.ts create mode 100644 apps/server/src/integrations/storage/interfaces/storage.interface.ts create mode 100644 apps/server/src/integrations/storage/providers/storage.provider.ts create mode 100644 apps/server/src/integrations/storage/storage.module.ts create mode 100644 apps/server/src/integrations/storage/storage.service.spec.ts create mode 100644 apps/server/src/integrations/storage/storage.service.ts create mode 100644 apps/server/src/integrations/storage/storage.utils.ts create mode 100644 apps/server/src/integrations/telemetry/telemetry.module.ts create mode 100644 apps/server/src/integrations/telemetry/telemetry.service.ts create mode 100644 apps/server/src/integrations/throttle/throttle.module.ts create mode 100644 apps/server/src/integrations/throttle/throttler-names.ts create mode 100644 apps/server/src/integrations/throttle/user-throttler.guard.ts create mode 100644 apps/server/src/integrations/transactional/css/styles.ts create mode 100644 apps/server/src/integrations/transactional/emails/approval-rejected-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/approval-requested-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/change-password-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/comment-created-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/comment-mention-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/comment-resolved-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/forgot-password-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/invitation-accepted-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/invitation-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/page-mention-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/page-update-digest-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/page-update-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/permission-granted-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/siem-destination-disabled-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/siem-destination-failing-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/siem-destination-recovered-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/verification-expired-email.tsx create mode 100644 apps/server/src/integrations/transactional/emails/verification-expiring-email.tsx create mode 100644 apps/server/src/integrations/transactional/partials/partials.tsx create mode 100644 apps/server/src/integrations/transactional/utils/utils.ts create mode 100644 apps/server/src/main.ts create mode 100644 apps/server/src/ws/adapter/ws-redis.adapter.ts create mode 100644 apps/server/src/ws/base-realtime.bridge.ts create mode 100644 apps/server/src/ws/ws-tree.service.ts create mode 100644 apps/server/src/ws/ws.gateway.ts create mode 100644 apps/server/src/ws/ws.module.ts create mode 100644 apps/server/src/ws/ws.service.ts create mode 100644 apps/server/src/ws/ws.utils.ts create mode 100644 apps/server/test/app.e2e-spec.ts create mode 100644 apps/server/test/jest-e2e.json create mode 100644 apps/server/tsconfig.build.json create mode 100644 apps/server/tsconfig.json create mode 100644 crowdin.yml create mode 100644 docker-compose.yml create mode 100644 nx.json create mode 100644 package.json create mode 100644 packages/base-formula/.gitignore create mode 100644 packages/base-formula/LICENSE create mode 100644 packages/base-formula/bench/formula-bench.ts create mode 100644 packages/base-formula/package.json create mode 100644 packages/base-formula/src/ast.ts create mode 100644 packages/base-formula/src/error.ts create mode 100644 packages/base-formula/src/eval.ts create mode 100644 packages/base-formula/src/format.ts create mode 100644 packages/base-formula/src/functions/coercion.ts create mode 100644 packages/base-formula/src/functions/date.ts create mode 100644 packages/base-formula/src/functions/index.ts create mode 100644 packages/base-formula/src/functions/logic.ts create mode 100644 packages/base-formula/src/functions/math.ts create mode 100644 packages/base-formula/src/functions/registry.ts create mode 100644 packages/base-formula/src/functions/string.ts create mode 100644 packages/base-formula/src/graph.ts create mode 100644 packages/base-formula/src/index.client.ts create mode 100644 packages/base-formula/src/index.server.ts create mode 100644 packages/base-formula/src/number.ts create mode 100644 packages/base-formula/src/parser.ts create mode 100644 packages/base-formula/src/resolver.ts create mode 100644 packages/base-formula/src/tokenizer.ts create mode 100644 packages/base-formula/src/typecheck.ts create mode 100644 packages/base-formula/src/types.ts create mode 100644 packages/base-formula/tsconfig.json create mode 100644 packages/editor-ext/.gitignore create mode 100644 packages/editor-ext/.prettierrc create mode 100644 packages/editor-ext/README.md create mode 100644 packages/editor-ext/package.json create mode 100644 packages/editor-ext/src/index.ts create mode 100644 packages/editor-ext/src/lib/attachment/attachment-upload.ts create mode 100644 packages/editor-ext/src/lib/attachment/attachment.ts create mode 100644 packages/editor-ext/src/lib/attachment/index.ts create mode 100644 packages/editor-ext/src/lib/audio/audio-upload.ts create mode 100644 packages/editor-ext/src/lib/audio/audio.ts create mode 100644 packages/editor-ext/src/lib/audio/index.ts create mode 100644 packages/editor-ext/src/lib/base-embed/base-embed.ts create mode 100644 packages/editor-ext/src/lib/base-embed/index.ts create mode 100644 packages/editor-ext/src/lib/callout/callout.ts create mode 100644 packages/editor-ext/src/lib/callout/index.ts create mode 100644 packages/editor-ext/src/lib/callout/utils.ts create mode 100644 packages/editor-ext/src/lib/columns/column.ts create mode 100644 packages/editor-ext/src/lib/columns/columns.ts create mode 100644 packages/editor-ext/src/lib/columns/index.ts create mode 100644 packages/editor-ext/src/lib/comment/comment-decoration.ts create mode 100644 packages/editor-ext/src/lib/comment/comment.ts create mode 100644 packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts create mode 100644 packages/editor-ext/src/lib/custom-code-block/index.ts create mode 100644 packages/editor-ext/src/lib/custom-code-block/lowlight-plugin.ts create mode 100644 packages/editor-ext/src/lib/details/details-content.ts create mode 100644 packages/editor-ext/src/lib/details/details-summary.ts create mode 100644 packages/editor-ext/src/lib/details/details.ts create mode 100644 packages/editor-ext/src/lib/details/index.ts create mode 100644 packages/editor-ext/src/lib/drawio.ts create mode 100644 packages/editor-ext/src/lib/embed-provider.ts create mode 100644 packages/editor-ext/src/lib/embed.ts create mode 100644 packages/editor-ext/src/lib/excalidraw.ts create mode 100644 packages/editor-ext/src/lib/footnotes/footnote.ts create mode 100644 packages/editor-ext/src/lib/footnotes/footnotes.ts create mode 100644 packages/editor-ext/src/lib/footnotes/index.ts create mode 100644 packages/editor-ext/src/lib/footnotes/reference.ts create mode 100644 packages/editor-ext/src/lib/footnotes/rules.ts create mode 100644 packages/editor-ext/src/lib/footnotes/utils.ts create mode 100644 packages/editor-ext/src/lib/heading/heading.ts create mode 100644 packages/editor-ext/src/lib/highlight.ts create mode 100644 packages/editor-ext/src/lib/image/image-upload.ts create mode 100644 packages/editor-ext/src/lib/image/image.ts create mode 100644 packages/editor-ext/src/lib/image/index.ts create mode 100644 packages/editor-ext/src/lib/indent.ts create mode 100644 packages/editor-ext/src/lib/link.ts create mode 100644 packages/editor-ext/src/lib/markdown/index.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/basename.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/callout.marked.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/footnotes.marked.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/marked.utils.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/math-block.marked.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/math-inline.marked.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/turndown.d.ts create mode 100644 packages/editor-ext/src/lib/markdown/utils/turndown.utils.ts create mode 100644 packages/editor-ext/src/lib/math/index.ts create mode 100644 packages/editor-ext/src/lib/math/math-block.ts create mode 100644 packages/editor-ext/src/lib/math/math-inline.ts create mode 100644 packages/editor-ext/src/lib/media-utils.ts create mode 100644 packages/editor-ext/src/lib/mention.ts create mode 100644 packages/editor-ext/src/lib/page-break/index.ts create mode 100644 packages/editor-ext/src/lib/page-break/page-break.ts create mode 100644 packages/editor-ext/src/lib/pdf/index.ts create mode 100644 packages/editor-ext/src/lib/pdf/pdf-upload.ts create mode 100644 packages/editor-ext/src/lib/pdf/pdf.ts create mode 100644 packages/editor-ext/src/lib/prosemirror-docx/README.md create mode 100644 packages/editor-ext/src/lib/prosemirror-docx/index.ts create mode 100644 packages/editor-ext/src/lib/prosemirror-docx/numbering.ts create mode 100644 packages/editor-ext/src/lib/prosemirror-docx/schema.ts create mode 100644 packages/editor-ext/src/lib/prosemirror-docx/serializer.ts create mode 100644 packages/editor-ext/src/lib/prosemirror-docx/types.ts create mode 100644 packages/editor-ext/src/lib/prosemirror-docx/utils.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/copy.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/getFromPath.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/getReplaceStep.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/index.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/recreateTransform.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/removeMarks.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/simplifyTransform.ts create mode 100644 packages/editor-ext/src/lib/recreate-transform/types.ts create mode 100644 packages/editor-ext/src/lib/resizable-nodeview.ts create mode 100644 packages/editor-ext/src/lib/search-and-replace/index.ts create mode 100644 packages/editor-ext/src/lib/search-and-replace/search-and-replace.ts create mode 100644 packages/editor-ext/src/lib/selection.ts create mode 100644 packages/editor-ext/src/lib/shared-storage/index.ts create mode 100644 packages/editor-ext/src/lib/shared-storage/shared-storage.ts create mode 100644 packages/editor-ext/src/lib/status.ts create mode 100644 packages/editor-ext/src/lib/subpages/index.ts create mode 100644 packages/editor-ext/src/lib/subpages/subpages.ts create mode 100644 packages/editor-ext/src/lib/table/cell.ts create mode 100644 packages/editor-ext/src/lib/table/dnd/calc-drag-over.ts create mode 100644 packages/editor-ext/src/lib/table/dnd/dnd-extension.ts create mode 100644 packages/editor-ext/src/lib/table/dnd/index.ts create mode 100644 packages/editor-ext/src/lib/table/dnd/preview/drop-indicator-controller.ts create mode 100644 packages/editor-ext/src/lib/table/dnd/preview/preview-controller.ts create mode 100644 packages/editor-ext/src/lib/table/dnd/preview/render-preview.ts create mode 100644 packages/editor-ext/src/lib/table/dnd/utils.ts create mode 100644 packages/editor-ext/src/lib/table/header-pin/controller.ts create mode 100644 packages/editor-ext/src/lib/table/header-pin/extension.ts create mode 100644 packages/editor-ext/src/lib/table/header-pin/index.ts create mode 100644 packages/editor-ext/src/lib/table/header-pin/offset.ts create mode 100644 packages/editor-ext/src/lib/table/header.ts create mode 100644 packages/editor-ext/src/lib/table/index.ts create mode 100644 packages/editor-ext/src/lib/table/row.ts create mode 100644 packages/editor-ext/src/lib/table/table-readonly-sort.ts create mode 100644 packages/editor-ext/src/lib/table/table-view.ts create mode 100644 packages/editor-ext/src/lib/table/table.ts create mode 100644 packages/editor-ext/src/lib/table/utils/col-style.ts create mode 100644 packages/editor-ext/src/lib/table/utils/convert-array-of-rows-to-table-node.ts create mode 100644 packages/editor-ext/src/lib/table/utils/convert-table-node-to-array-of-rows.ts create mode 100644 packages/editor-ext/src/lib/table/utils/get-cells-in-column.ts create mode 100644 packages/editor-ext/src/lib/table/utils/get-cells-in-row.ts create mode 100644 packages/editor-ext/src/lib/table/utils/get-selection-range-in-column.ts create mode 100644 packages/editor-ext/src/lib/table/utils/get-selection-range-in-row.ts create mode 100644 packages/editor-ext/src/lib/table/utils/index.ts create mode 100644 packages/editor-ext/src/lib/table/utils/move-column.ts create mode 100644 packages/editor-ext/src/lib/table/utils/move-row-in-array-of-rows.ts create mode 100644 packages/editor-ext/src/lib/table/utils/move-row.ts create mode 100644 packages/editor-ext/src/lib/table/utils/query.ts create mode 100644 packages/editor-ext/src/lib/table/utils/transpose.ts create mode 100644 packages/editor-ext/src/lib/table/utils/types.ts create mode 100644 packages/editor-ext/src/lib/trailing-node.ts create mode 100644 packages/editor-ext/src/lib/transclusion/constants.ts create mode 100644 packages/editor-ext/src/lib/transclusion/index.ts create mode 100644 packages/editor-ext/src/lib/transclusion/transclusion-reference.ts create mode 100644 packages/editor-ext/src/lib/transclusion/transclusion-source.ts create mode 100644 packages/editor-ext/src/lib/types.ts create mode 100644 packages/editor-ext/src/lib/unique-id/index.ts create mode 100644 packages/editor-ext/src/lib/unique-id/unique-id.ts create mode 100644 packages/editor-ext/src/lib/unique-id/unique-id.util.ts create mode 100644 packages/editor-ext/src/lib/utils.ts create mode 100644 packages/editor-ext/src/lib/video/index.ts create mode 100644 packages/editor-ext/src/lib/video/video-upload.ts create mode 100644 packages/editor-ext/src/lib/video/video.ts create mode 100644 packages/editor-ext/tsconfig.json create mode 100644 packages/ee/LICENSE create mode 100644 patches/scimmy@1.3.5.patch create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f828e1f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +**/node_modules +**/.git +**/dist +/data +**/.env* +**/.nx diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..6c5756f --- /dev/null +++ b/.env.example @@ -0,0 +1,70 @@ +# your domain, e.g https://example.com +APP_URL=http://localhost:3000 +PORT=3000 + +# minimum of 32 characters. Generate one with: openssl rand -hex 32 +APP_SECRET=REPLACE_WITH_LONG_SECRET + +JWT_TOKEN_EXPIRES_IN=30d + +DATABASE_URL="postgresql://postgres:password@localhost:5432/docmost?schema=public" +REDIS_URL=redis://127.0.0.1:6379 + +# options: local | s3 | azure +STORAGE_DRIVER=local + +# S3 driver config +AWS_S3_ACCESS_KEY_ID= +AWS_S3_SECRET_ACCESS_KEY= +AWS_S3_REGION= +AWS_S3_BUCKET= +AWS_S3_ENDPOINT= +AWS_S3_FORCE_PATH_STYLE= + +# Azure Blob Storage driver config +AZURE_STORAGE_ACCOUNT_NAME= +AZURE_STORAGE_ACCOUNT_KEY= +AZURE_STORAGE_CONTAINER= + +# default: 50mb +FILE_UPLOAD_SIZE_LIMIT= + +# options: smtp | postmark +MAIL_DRIVER=smtp +MAIL_FROM_ADDRESS=hello@example.com +MAIL_FROM_NAME=Docmost + +# SMTP driver config +SMTP_HOST=127.0.0.1 +SMTP_PORT=587 +SMTP_USERNAME= +SMTP_PASSWORD= +SMTP_SECURE=false +SMTP_IGNORETLS=false + +# Postmark driver config +POSTMARK_TOKEN= + +# for custom drawio server +DRAWIO_URL= + +# Gotenberg URL for server-side PDF export +GOTENBERG_URL= + +DISABLE_TELEMETRY=false + +# Allow other sites to embed Docmost in an iframe. +IFRAME_EMBED_ALLOWED=false + +# Only used when IFRAME_EMBED_ALLOWED=true. When empty, any origin is allowed. +# Example: https://intranet.example.com,https://portal.example.com +IFRAME_ALLOWED_ORIGINS= + +# Enable debug logging in production (default: false) +DEBUG_MODE=false + +# Log database queries +DEBUG_DB=false + +# Log http requests +LOG_HTTP=false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f189893 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,154 @@ +name: Release + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + version: + description: 'Version tag (e.g. v0.25.3)' + required: true + +permissions: + contents: write + +env: + VERSION: ${{ inputs.version || github.ref_name }} + +jobs: + build: + strategy: + matrix: + include: + - platform: linux/amd64 + runner: ubuntu-latest + suffix: amd64 + - platform: linux/arm64 + runner: ubuntu-24.04-arm + suffix: arm64 + runs-on: ${{ matrix.runner }} + steps: + - name: Generate token + id: app-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ secrets.BUILD_APP_ID }} + private-key: ${{ secrets.BUILD_APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + + - name: Checkout with submodules + uses: actions/checkout@v4 + with: + submodules: recursive + token: ${{ steps.app-token.outputs.token }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + context: . + platforms: ${{ matrix.platform }} + outputs: type=image,name=docmost/docmost,push-by-digest=true,name-canonical=true,push=true + cache-from: type=gha,scope=${{ matrix.suffix }} + cache-to: type=gha,scope=${{ matrix.suffix }},mode=max + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digest-${{ matrix.suffix }} + path: /tmp/digests/* + if-no-files-found: error + + - name: Strip v prefix + id: strip-v + run: echo "version=${VERSION#v}" >> "$GITHUB_OUTPUT" + + - name: Export Docker image + uses: docker/build-push-action@v6 + with: + context: . + platforms: ${{ matrix.platform }} + push: false + tags: | + docmost/docmost:latest + docmost/docmost:${{ steps.strip-v.outputs.version }} + outputs: type=docker,dest=docmost-${{ matrix.suffix }}.docker.tar + cache-from: type=gha,scope=${{ matrix.suffix }} + + - name: Compress image + run: gzip docmost-${{ matrix.suffix }}.docker.tar + + - name: Upload image archive + uses: actions/upload-artifact@v4 + with: + name: docker-image-${{ matrix.suffix }} + path: docmost-${{ matrix.suffix }}.docker.tar.gz + if-no-files-found: error + + release: + needs: build + runs-on: ubuntu-latest + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + pattern: digest-* + path: /tmp/digests + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Extract metadata for tags + id: meta + uses: docker/metadata-action@v5 + with: + images: docmost/docmost + tags: | + type=semver,pattern={{version}},value=${{ env.VERSION }} + type=semver,pattern={{major}}.{{minor}},value=${{ env.VERSION }},enable=${{ !contains(env.VERSION, '-') }} + type=raw,value=latest,enable=${{ !contains(env.VERSION, '-') }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf 'docmost/docmost@sha256:%s ' *) + + - name: Download image archives + uses: actions/download-artifact@v4 + with: + pattern: docker-image-* + path: /tmp/images + merge-multiple: true + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.VERSION }} + files: | + /tmp/images/docmost-amd64.docker.tar.gz + /tmp/images/docmost-arm64.docker.tar.gz + draft: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..883b23f --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +.env +.env.dev +.env.prod +data +# compiled output +dist +/node_modules + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +.nx +.nx/installation +.nx/cache diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2bdf0e0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "apps/server/src/ee"] + path = apps/server/src/ee + url = https://github.com/docmost/ee diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..33cac22 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,62 @@ +FROM node:26-slim AS base +LABEL org.opencontainers.image.source="https://github.com/docmost/docmost" + +RUN npm install -g pnpm@11.25.0 + +FROM base AS builder + +WORKDIR /app + +COPY . . + +RUN pnpm install --frozen-lockfile +RUN pnpm build + +FROM base AS installer + +RUN apt-get update \ + && apt-get install -y --no-install-recommends curl bash \ + && rm -rf /var/lib/apt/lists/* + +# drop npm and corepack +RUN rm -rf /usr/local/lib/node_modules/npm \ + && rm -rf /usr/local/lib/node_modules/corepack \ + && rm -rf /usr/local/bin/npm \ + && rm -rf /usr/local/bin/npx \ + && rm -rf /usr/local/bin/corepack \ + && rm -rf /root/.npm \ + && rm -rf /root/.node-gyp + +WORKDIR /app + +# Copy apps +COPY --from=builder /app/apps/server/dist /app/apps/server/dist +COPY --from=builder /app/apps/client/dist /app/apps/client/dist +COPY --from=builder /app/apps/server/package.json /app/apps/server/package.json + +# Copy packages +COPY --from=builder /app/packages/editor-ext/dist /app/packages/editor-ext/dist +COPY --from=builder /app/packages/editor-ext/package.json /app/packages/editor-ext/package.json +COPY --from=builder /app/packages/base-formula/dist /app/packages/base-formula/dist +COPY --from=builder /app/packages/base-formula/package.json /app/packages/base-formula/package.json + +# Copy root package files +COPY --from=builder /app/package.json /app/package.json +COPY --from=builder /app/pnpm*.yaml /app/ + +# Copy patches +COPY --from=builder /app/patches /app/patches + +RUN chown -R node:node /app + +USER node + +RUN pnpm install --frozen-lockfile --prod && rm -rf /home/node/.cache/pnpm + +RUN mkdir -p /app/data/storage + +VOLUME ["/app/data/storage"] + +EXPOSE 3000 + +CMD ["pnpm", "start"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f09680e --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +
+

Docmost

+

+ Open-source collaborative wiki and documentation software. +
+ Website | + Documentation | + Twitter / X +

+
+
+ +## Getting started + +To get started with Docmost, please refer to our [documentation](https://docmost.com/docs) or try our [cloud version](https://docmost.com/pricing) . + +## Features + +- Real-time collaboration +- Diagrams (Draw.io, Excalidraw and Mermaid) +- Spaces +- Permissions management +- Groups +- Comments +- Page history +- Search +- File attachments +- Embeds (Airtable, Loom, Miro and more) +- Translations (10+ languages) + +### Screenshots + +

+home +editor +

+ +### License +Docmost core is licensed under the open-source AGPL 3.0 license. +Enterprise features are available under an enterprise license (Enterprise Edition). + +All files in the following directories are licensed under the Docmost Enterprise license defined in `packages/ee/License`. + - apps/server/src/ee + - apps/client/src/ee + - packages/ee + +### Contributing + +See the [development documentation](https://docmost.com/docs/self-hosting/development) + +## Thanks +Special thanks to; + +Crowdin + +[Crowdin](https://crowdin.com/) for providing access to their localization platform. + + +Algolia-mark-square-white + +[Algolia](https://www.algolia.com/) for providing full-text search to the docs. + diff --git a/apps/client/.dockerignore b/apps/client/.dockerignore new file mode 100644 index 0000000..325b561 --- /dev/null +++ b/apps/client/.dockerignore @@ -0,0 +1,4 @@ +node_modules +.git +.gitignore +dist diff --git a/apps/client/.gitignore b/apps/client/.gitignore new file mode 100644 index 0000000..4413984 --- /dev/null +++ b/apps/client/.gitignore @@ -0,0 +1,27 @@ +.env +package-lock.json + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/client/README.md b/apps/client/README.md new file mode 100644 index 0000000..1ebe379 --- /dev/null +++ b/apps/client/README.md @@ -0,0 +1,27 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/apps/client/eslint.config.mjs b/apps/client/eslint.config.mjs new file mode 100644 index 0000000..c2660d6 --- /dev/null +++ b/apps/client/eslint.config.mjs @@ -0,0 +1,36 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; +import pluginQuery from "@tanstack/eslint-plugin-query"; + +export default tseslint.config( + { ignores: ["dist"] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ["**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + "@tanstack/query": pluginQuery, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-unused-vars": "off", + "react-hooks/exhaustive-deps": "off", + "@typescript-eslint/no-unused-expressions": "off", + "no-useless-escape": "off", + }, + }, +); diff --git a/apps/client/index.html b/apps/client/index.html new file mode 100644 index 0000000..28679e4 --- /dev/null +++ b/apps/client/index.html @@ -0,0 +1,26 @@ + + + + + + + + Docmost + + + + + + + + + + + +
+ + + + + + diff --git a/apps/client/package.json b/apps/client/package.json new file mode 100644 index 0000000..09082c4 --- /dev/null +++ b/apps/client/package.json @@ -0,0 +1,100 @@ +{ + "name": "client", + "private": true, + "version": "0.96.0", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint .", + "preview": "vite preview", + "format": "prettier --write \"src/**/*.tsx\" \"src/**/*.ts\"", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "@atlaskit/pragmatic-drag-and-drop": "1.8.1", + "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "2.1.5", + "@atlaskit/pragmatic-drag-and-drop-flourish": "2.0.15", + "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.1.0", + "@atlaskit/pragmatic-drag-and-drop-live-region": "1.3.4", + "@casl/react": "5.0.1", + "@docmost/base-formula": "workspace:*", + "@docmost/editor-ext": "workspace:*", + "@excalidraw/excalidraw": "0.18.0-3a5ef40", + "@fontsource-variable/inter": "5.3.0", + "@mantine/core": "9.3.2", + "@mantine/dates": "9.3.2", + "@mantine/form": "9.3.2", + "@mantine/hooks": "9.3.2", + "@mantine/modals": "9.3.2", + "@mantine/notifications": "9.3.2", + "@mantine/spotlight": "9.3.2", + "@slidoapp/emoji-mart": "5.8.7", + "@slidoapp/emoji-mart-data": "1.2.4", + "@slidoapp/emoji-mart-react": "1.1.5", + "@tabler/icons-react": "3.40.0", + "@tanstack/react-query": "5.90.17", + "@tanstack/react-table": "8.21.3", + "@tanstack/react-virtual": "3.14.3", + "alfaaz": "1.1.0", + "axios": "1.18.1", + "blueimp-load-image": "5.16.0", + "clsx": "2.1.1", + "file-saver": "2.0.5", + "highlightjs-sap-abap": "0.3.0", + "i18next": "25.10.1", + "i18next-http-backend": "3.0.6", + "jotai": "2.20.1", + "jotai-optics": "0.4.0", + "js-cookie": "3.0.7", + "jwt-decode": "4.0.0", + "katex": "0.16.40", + "lowlight": "3.3.0", + "mantine-form-zod-resolver": "1.3.0", + "mermaid": "11.16.1", + "mitt": "3.0.1", + "nanoid": "3.3.18", + "posthog-js": "1.391.2", + "react": "19.2.7", + "react-clear-modal": "^2.0.18", + "react-dom": "19.2.7", + "react-drawio": "1.0.7", + "react-error-boundary": "6.1.1", + "react-helmet-async": "3.0.0", + "react-i18next": "16.5.8", + "react-router-dom": "7.18.2", + "semver": "7.7.4", + "socket.io-client": "4.8.3", + "yet-another-react-lightbox": "^3.32.2", + "zod": "4.3.6" + }, + "devDependencies": { + "@eslint/js": "9.28.0", + "@tanstack/eslint-plugin-query": "5.94.4", + "@testing-library/jest-dom": "6.6.0", + "@testing-library/react": "16.1.0", + "@types/blueimp-load-image": "5.16.6", + "@types/file-saver": "2.0.7", + "@types/js-cookie": "3.0.6", + "@types/katex": "0.16.8", + "@types/node": "22.19.1", + "@types/react": "19.2.17", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.1", + "eslint": "9.28.0", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "eslint-plugin-react-refresh": "0.5.2", + "globals": "15.13.0", + "jsdom": "25.0.0", + "optics-ts": "2.4.1", + "postcss": "8.5.25", + "postcss-preset-mantine": "1.18.0", + "postcss-simple-vars": "7.0.1", + "prettier": "3.8.1", + "typescript": "5.9.3", + "typescript-eslint": "8.57.1", + "vite": "8.0.16", + "vitest": "4.1.6" + } +} diff --git a/apps/client/postcss.config.js b/apps/client/postcss.config.js new file mode 100644 index 0000000..e817f56 --- /dev/null +++ b/apps/client/postcss.config.js @@ -0,0 +1,14 @@ +module.exports = { + plugins: { + "postcss-preset-mantine": {}, + "postcss-simple-vars": { + variables: { + "mantine-breakpoint-xs": "36em", + "mantine-breakpoint-sm": "48em", + "mantine-breakpoint-md": "62em", + "mantine-breakpoint-lg": "75em", + "mantine-breakpoint-xl": "88em", + }, + }, + }, +}; diff --git a/apps/client/public/icons/app-icon-192x192.png b/apps/client/public/icons/app-icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..46bce9e52cd0e83455e850638f0555f7f2fedd0b GIT binary patch literal 4722 zcmYLNcU)6T(>@6Sf)qoQ-ivgki1f;1zC?Xe7 z5RejzpvuWVW|h;geFMeHUt1@na>{xfPKmi08Ez*bhRxbpOT+NJYkvU z94LCN`%scY7e;x5R$3vo%&WFU81*HdGFb;fdmG_SG)J%)(UkF5rAYDPQl;3D32^fo z%-w83rf`DD^}cLjngik_g{IS6lY@^VZ!~tF)h+Rvf1O!x+*)7no@f@txs4`bOR?Tq zRxBASgtg!lfeWbCUac9PIjJwKGnj6juxz8VVl}27Wf>J6rAc$t7wA^4nyW9Yxvy(M zlt)%dJF109$HimbxjgnLsA|7qCNi3a#XDnJF<$Z38^3+N+g>qa9Q}zE!9H*ax|e{E z;ZnjYRn}jo$>^zG3#5>_gMh}HHfmeO_b4w^qm{ zQTR%;-Q@JY_&2ZFicg+%1YJp3rb-uA_j^MJITP#JAIfpumcOZFYReF|pJ=`KD=89a zy#C6T0n=czPG(%C!SL7Dvao-->wt5noD#VAKwZ@ ztQPi2ITGTKm7Gpyh_ca}cK`uad7OnlOfJ45FDzb--RTy>Wq^MJI-J`0MBiy;rl$uw z?0FXNZ-{WA^iXwjFO(j6n&Y0XQ+8!et-O?~fDvPpi;Q0&#MLHZxA+_I3O*N|ri-#yLW#9j;^ETU+!$}8W|}o-(C6=Tjylulnsw%t zhPQi)>#T5fH~C^MGq_YtMxS1_khX2sePP?8=fBux>rd>kA}`|Y$iz--^5-{`XImf@ zxZzIijWo8}#_l7-*u#~S@440vw;yYry+#$Og?+Da8F)0Yl|x<11vkjxRGK>8>S<)) z)2w$Xovb#+&8oN0sHpEdKt%jzij~_mO-T!@d z>T`DTtIoR7q0RvxwRh}&Ig|p@H<>?uIL69pnk9HcFj(VI#Pvdt-}Mv*D}v(#jngwu z7!iq_Z}auk8kn7b>6+5NHa*bjBnX{|tVa&lZBr00uUB*!g@0G_W`A4yK_{4+R5{>RaOq5XxK z#`V{{%yFYSG#bXT_`Pfi>jv)AGqD(8{Do)s*{^SW)AhCr)`WyD>d>$#ZTR}?K$_L@ zKG|w#bzq&$?@TdXYateHw{4LxgR)1_9(~*0-JRR#S^qMevp=gF94wEQ7Ip)8qeueb zT-z2~i+B`@)Lzh`MD7Qn$k{Txh- z$Lj+wB@hZK%-7TQg#Zici@a_N8HLR)E#z9>O=TfSYBLoBH+$Z}$jGhs=>l5Xd+O@A zzXE!hA(1-+muUA;uL4lf%ayXwapQ-oKI)VjgVwQTr7s3cwjB3cak zBrlI`Dv&(iMqWf@HRs1F`_KQim@Eu1vh6R^tR0N1EV(Tx7#660D|Li)Kulr$vuxs( zhPlo8%#Y4wN6`KgWt4ax13<8*FOiyhZ~ldyO1qL!5^*CtJDcQh07VGk_vd}%G{Jzt z%``fWwR==F)&IK~y;b>2ga(PhI26;yV%wvWypJ|p#=5qp|5%@nOL=5WZ0#g1fwt(_ zCE6%FIvdbM26pWvKOejE;_gd-jz*^?6DsZVo1){>{5jH3^Gn1S#}$Ly1xLyulA<# z#T~}`k9noES3|#+RF{DRTTx8PgWW4j)>Y5J0q$I#?WPR)ruliKC*<1P0Th* z0CsrhOfUk!&h96o^39gt4QfR1H+^6+e{ixxjW=Ne@;SBQ)bTQV#w%?7&J$3AhvVq02g1s#4eP z&~eDWo9({}m6py0BKZOKVRwRvz08|0Ou6~_gEF>AXWiMRN%!+4fTm#<9p6}mbu|~( zgl)_ehM&ouyYTjU_47{~s~9jjw-~XRrCj7w_SY>q51?LM<#5zfw88zVfSKqqjf3$G zAxKb-L5}DI$R!=oXxoyEYDd2vQtH%X0#f8d*|mg)Zf3gWOP4^&FNGm;>VWEDChAgk zYXA`o63TCeW&dF-$Of`CuQeADA~1|R*Lv>2MT5TX?&bz6m;Cf8cli2AtIxDVPW!Ej zb5GR#eG(Fd`Yh)=BXz!Vf7c`DPRay*q#)oJvqOoO36R^_&U|()qE5o9Zrm5tkiWjm zg)l&0An1?XCofd{%+wn+X25#m=@zH?g;hKDwt9YhnVuf~TyM()RLA$$C)dO7 zUC$9Up87%TocnsslvF71r3O1U4_YH;7F?UIvzpG6wwwLBo1@LO_UT-_g2zY+D2Eha z-x)65857s>bH?ruKQj*xQBbd6pnJ}J-DTFRoeMjcGE%4jN}+AHQ#7U;g;#Pt0dzSw zHGHsiYTEy?OR7XCxNEH_5R@_*dqBL|moSDh28{r0Y85#Mgd1IB0 zSu3IP(vU0U5JY#7H$|rC{Ofx{pf2)WiBf-ji7$Jz<8`TXf3gqg%bWi`6Z88bDb&YH z+q*f}a=v2?%A*nW7pi*~^9E_tI@WM*s2~g@D3LT#PTd(A_kL{5y3J?0jGzZfB^fw_ zCzkEnhJq_^B@64Rp8)SLVD4%$`X+YkV-Bk`$ocb|kaKJH#GTGo?oNK6#)f!_m%m_c6xi=Gn1pO$H#CSDzovjFwFbw5v3TCraN*!rX!% z8y>=XOM@O=1C1pd{on`jJd0gGz3MqTGD3w; z+}QKI01(l9qSSz?Jl$HW*TmZ&MxF$Td48C*UAxrYM<%N0P1jYHQ-&d`xPJy8FH8z` zgs!{DZYz5wSy=WqIyi?HY|OmiI^|3NVJ77gbXoUsS~YyL0IZ?%@4j?N;?#(0JuMw> zXtCH%OJVgei74!if+a?elc-iTfp|>fYEWFhwh=`?G;Rl%lEd3S0cP}D^KfgZQ+AWK zWs$N!>1Q~F!|}E+n_;B!J6Wm)9IV%A<)on~u)EM9M1@7x!M?JpYM$8t?E*>G1)s%DCv$mNrydg&*=7>9CYIt#bcoiKlNUOKAN-=wm4;8-rMzBs4lc zk276mKVODm)$cch*^TA2`<-|w1rr*I5lMAGsr~~YQ3(Ui@aUYVuu=5Nx%{_?JGLC* zt!7dr;7vss{EfcTt_;l}pvC@d3S$ zlj*tC7UNa3Fd8aFirzZ^PgQW(7W~yP{F=fY(2dfLci~KGKnb{OGu)&8=wQpVN9!I~ zlA8tT7m;F&iQJ4^peZ;)DFpf^89qQ? z%1dM^Mf|Xz6A@&j2+9Lnky&c1$2`|&H1EkNC`>L|KLF!)-#N@EU*^0gdSx1Pa(b{t zwxACQ4xR!bV!Bu(+A=P#TP^rYDxUR?H3rfMmdVrIvC+1)hymcKVlT$^5v!yJ-+VH! zke_6xf|ul-dM_;z+3rIZt8zVhuq~24R=VKp^K#vS`R=k0`|+g(`tasO0&PyUnQ&`g77$YmR!L)YBKNLBo+M zezPTD30l$aH&+%M5<=$Tmm_jizgQ*-oQ$UM#n}`eO;GwTsd=HZFi_8})yUF{3gKhn z+~BY8=XOsRoiMh_gBcvuig(%}VAt8lmhm&~&%iuGX&Mkp=;cSbf(@`Pf?d7p<-AuW zhm#({g=Rj6Im61TWe&KWfG|?_Hnj6pocJ>qwfRP3q@bhGsaJim?)R+xJ63~=of%`( zNzj8fp#j@10RXI zlr^u`{(^W=3S>Kd50RCm%l#xJ*W1Len=PK#=$}$4f#s&SMXMt`)E?tMpT#@1sodMe z&ytM7vgH|_4*pBZHqajDo(_F^p;Qo?^6^Aqe*m7qJnpgeD#rh{*;_u6_pdm^*-Iku z6|{AP`Y&1{*f%bg3&RrD-RzPgzsc&`T-(kSS)xq1Ut(N_o4gnJ*dljQy>eItRl{!& z_mFi0R5s(z^lO^eC`MP{C=9S!_Tbrx@Deo}EVX3Vz?rx5HUfI*bNMj~pQx5ycP;B|@@>tM wB&QPpk_MXDvCnInV}_A$R33fGK-=RNl_%7<4#Gahk9nSbY-|l?+{{Cp(z1H*fd_BkGIWEl1#9%G=W^M#Q)*2b=n8}cMh2toEq8|mvm6y zrKVU)aZg7NaK^PU);f$_!{S*E4i(RcO}udM9bUhgDxn z>KDF?=}{{K@602JEH@74Z>yy3AU5 zqvCSar{M~xdlPu0;&?TtVa@49vex(eQ4<=|dtln7O*eCHZ1`+{OrJvD)glLHBiiWL-4T&r88E(^LVRryy(+$)GH zm>mi1$L^KY@1Z9Fbwu@8U8|sgd^^ z&anLyq>)n}^b97Q|3;the|epYlMM-M>D>H^uYbUpmm6;TRYkh0_N=G?EPbXRTUEP< z_cj}RDhb>q4LkM$rvx>k@Y7!947jN?P^h2&-nEcy0 zpED))ZEe?d)v3WDUbv^$>XFYsni&-Hm00%vr@?m{Z%fWja9^a#oo!A%CfWS%qFwWgBhmW2YqzR2c3o*c>M}k4bMR@1sA7cH!nK8L!sy%f zFL#BNHn`M1IqTApaIq(V-aWTi?>E(I!@t=1G7jtNmzo$^pBtuT4J_Tb~9aC1U_V)$QOQ7^)uEPC*Atu)^6GVSkS@$>)hW6 z!rqPBEs2@ondjSHyUkAiaXNHwt6L9tNF?{_sO?mfbdG!b?p((T?ul=%i81XCgzmc{ zYHe$T70V~bx;yjS+v{82*xBI8fomk>kqYOM1hB$Zt`Zq3^!92Tb>QZ9VUq54>4_41v%`t9uCNM@G&rBHcQ&p86j}BC2?_#jRdhRu|7vYlk)Vy>TklESYRN zGT<)E$;iYrG97bpk9OI)Y%_^Fm+`*ucKN}GVITIJ{hUdBudLsk@4+)JPW8kn%yjlH zY;$O~%r2ek^={A@){EPJ;{Bzk1&a%ex)ZMP6~WI#w_w>iBD@A_q<42oRM&O;_U>}% zw7fR?)u1(G|HWMFgp1O}?|J2;5g}W>Lj8AL7l1p>XXWcgw)B5@&wQBasn~tB^Ww1H z6NT#PYNL}{ms_oDVmNr!%}U;Bb64?{X?8FYjfNeSXL1`f?MmvaFZ~P_e8ubf`Ln(8 zIn4Q%Ob0FRGB&QN_RWSHfRH;u>kd@Cb||$c(a-vmgIvkk)|tLW9bEm>)IEvD5u_~Y zi)eerp?F_W)7|=oKnm$c`r>a#j7_>dB`S+RG@Lw<<80I?%s;0exK~;p;XK!rY}7a6 zw&7IM)XPAS!D9ix9TP8hzLUOHbx%aChQTJwj%AZYY`hFGj549ALcz+(Kh3Qn_f%rE z2>3o>4qAc8a1TP$vqxxVFAhH}A2pPk?ZAC#9dQt#Ro^Oacy0T3``?!O&HK(*F;;Z& zz!ic5*6#S~Jlv8-os#Ef6uS2L?)T_=d~Iz`KzDYbL!bumM3n3qrq7QnvMKCZe|qt3 zwerC~{6*G;MMiIPN+}-?mHkJSJR>{*#rjhj#ni)CjKHmcUm`}O9iA)59I>x#GIvwN z%fVWxkZX-X_ut=kG>ZOVp@Y#NC~yB-(=vHQcKfQ1muprA&ITsjGl@TtMt{-a zIyKxH=IPi%%95vv@0C)b&I~2SW}GUj!Et9x!L(ZW(vu`i9=nD*U$SWiDH z&c+^Fu@&1NN$t^nUBwglYjz~lhN36+<Tv4wFR)EZNNBQ{-Mb44`8|H= zX~(ml6*ny1MM%*()Q?x<3|ONbFkM*HD|vRDDB$|_*+F$HzGFl|q_TH`raaZ7_wl56 z-9D)I7exmS7 znkv1^dw>*j7cQ}GC8DKx<+mADo}6~Fz-zD)L$JhbmZ*7u`IqrP&BK9!(7RwO&{>Z1 z<>vH{3A;&?=2K_H`#S7a66i&})wuP-@YqWSX{H_R=D|Ht_Dq<~;^TF6&`>|uC`L)N zx}GP-I_N^j9<2QPdX-;mro_b)22k1L+IlIlSUIw-pR?=(^25NRbp9$#u@9KCf+?bd zMU)aH5Wk0XnWjhZfy)v=k=w72YjOF3dP%)yzrus=!Y3)np7Wnyx~vU zP3m^}9{aireeP4-$Cs}PZbW93gRx&%H!3n-&G(6Bz-$$L|1~2f!}}K)l;|n#Z#ie{ zqNIn-^a9KAratiba(l5oB=np~c&TSD^B3=(89Qq+H3 zr+T(@s?BaV!o-m{HPRltX_svkU9GB`$;Z1w3KG<}T0d{{w_sw+Wp~(Q>^=HqZzKgv zj1ok+I07-*5kJEHMqe7oJX`3HaygNAE;7w7Kf}K_2wck2bARI1+WM!kGt&t>Ab-r6 zM*fzf8_Z25@ooUMKaGq_MyOK_lSk@z5W*BqHKrc;Q-W@?R%$K$ji_py8~?;R^srPv zAw9Fiwq#M;v~^j*i-XE9hG@4nsowQMiX`qfMkSkHLt|Ej$Z{8yOo zJN`a9f&34;y3Dt8p8Wk)&SAvPlVmlouv%^p?NN(&y{bV8Mq+@q_2;|7_nUk&Kq>p^ z*1G<6yjpXo!R^cS@<*C4UtNQC{BZjWzzIu&zAi0xD3M@aA|vr)d53!EFeH(0Fn2dQ& z$=R9*M#X`_#49yg{q>4s&o$Q$pW`r(L!hGAZe(fnGvq0~dx(&@jy?w7n%a;>){ z?9@H{0JJ{_a8)(kNGg2!VHal_k~7>p-(76Qgb|aSfmPIi4MvhID|6=K&E$;qfFy45 zm?%*Vzbg7+sbJR1W>c;BynW!H)4=;4BS`5+J(4e-YjOtLPe1bDF>97mgZllveQzT+ zZj)+m0*^a`58D865@kt@%4J9Mwp{%DY#7hWRn>VrPvl7bJ?=i05Vj$b#WaAF_j3~H z-M)#l&-tQqP6kZ1QZ@LcSsJJ4)|9*<^DOub{)S^RQWm-ATen-hJ#RHr66VM{13OkQ zbh!8tVSdD+6%#~!;5z=}12urZf@L|(o9Ib4sb(K`I+UE8S6F3)ZOb@SD|w?inngX2 ze6iUxpJHmwj#kWdVwK{hAKEiLVUEk>{jCr@l6P-nu+D<8LRX@;ui_4Nx3(Wk8)MY5 zUfJ!$%7rME!5cigiIhZHMb?u=+xw+;xL<3~pr_W#NKyUg{#H`w`46&)qEc(+1#xRZ zn(^6iLvh|MFZdSo# zE?p45DU!tuEWr0WZ}Gcq^UTm8nqwJgP&M6xyv%9$OcD^5n|Y}Ft$TE#zixj4IF^2f z9F66AQNgUR|HR3&30S5t%Fy09g}*(&y!-rA`yJ9PQ0pvMT5S01bNB#mJ8jvvhb#BU z(l#ex2V;O;ePYVwRmPQ7Ip@P#vHt}DNT!Aoa(2^;*(zwO*Cj_F38@j^8Woaq=s%SV90Vzy^9OJ z=4}&6LF*KI1L*OyzxX8T2n$1m|D6NK`RMm2q5+d%UFK(}h9mStcUA=C?Kd}J?LngV z92qW5xYid2+P@DhMW_@gyi)5ctNWD9>9s7WJdx`n9dL0}neC3CyftC3uGF6%QjtHQ zV%dQe19C@gRA$o41i!=ce^-U6gTn~@pBZ4_x#Ug_0U&!4%p>?pYnyoF0Jw^%|2YKS zXwQIq{KJQ5{pe%y?|%gnRg#ZAKSb5oRKybSuvx1V@M{X~C%wZ#*l(Z6b_|~V#UB-Q z5JH|0+uyuEdRM4S(WZ+_@W?#LblG}2uM(&ysx<#A*~kB9<}M)sc=YA`LHu6pay zePD{Z-gM%NQbQH}IQbBhpXCdeE$F%j(ouhs5dzja=0gyd%>D&1f99mu`f(3;*lg>0 zls0DCzijE0T<;YNDt`UIg}JaW9-{Slz2u?sn*PTrZp|rFO?^$4i?ctyAsifBOs7Xt z-5h0cA=9tgNdM;nB$I_8zQih<_V8SG%Jj`@mw?zzet1Ae4vlWbDf^a>$`;H|!-;2* z8&>GuTBDF|lWCpLW~4(l)fyJnW1SOesyU+%``D2Drpmjy{UwRmG>6iX;!+|DTT%gC z*WlO+)~WUr%S}1de8(*FIgQNyCVz`lc1W>^@dw*XwJ#epIq*kn0?>TAU67PGnhPjS zT;9hq^RNw_9iQ%4aXT!!hB$dIpzJ|m^zvv9M9WzD(-d<0S>+2INgn*>UpihMq-u-F zF9Rm!sWcoL<0?73@(HDcVbZ-l`LSwWsARv!ihw0pxSnB`TPT=Cpt0-VNGpv>PhR^O zOkKEM!UQ`I=ZjM~1t0+N+2DJTI9a1X?~NiJxs5$dt^}?6C4l&a-q%riWxs;_Kttx;-)qkeNZliX7+a z4d^KOxy#U(nCBkSIf+}ZH0n_8!xUH&#t1#(BcIfNz<2C5IvVHGc7m$8JQ_(UU9|7v zFrJymY--%keN%BX4p&a83Yxvb6AO zuLa#;d0j_)%`4d1>Zva01R$0)yE_8JFn*aDhGYthcF;I!pdHOoy!6;*uB|ygX@T`D zf53tO!>#E9q`>|na!zf_n}gg{klZ3$$*aR}D4ARwB5g2(g0 zLy92X?ydmw*4iyKI7t^4@%V)qS9BO~$EOKI{fpbn_-&N%$1Gd^tr(jNVq?oAxZ5&c z_?sjOeBkh9J6fV<-_2wArcxAV-0k8Vu}0*8Wsl&02cNCo1UtXY$<1xOc!*Zjk?k}P zuwIF!KePditzpmkBem-^_O&FAsMw;cY8CDMYnd-b!Q31B=iwfk_Z{x`kdoJ0n0{W2`Hxia5J2i)kAi_s zK1Gqm7rNdb>)~Z_oM4`2E{)X^+dR*p+vIPl=JD*i%Ti7wG_3-=UK#5;(d|*bI&;N6 zR;X+AaJv3YY$KKtjV;B~3tXB`IN#nNgZnn)RC}aPhT_ zo{+e>tv}bIqG5UAfT8_82pNGttN=TVw8yxcH?$t|+pj!SqoVmu zRCIs?%g3f$??R6S16_iyMSbqSwML`g-vSqY7cb0?3_p^@y0vG-18ltKRM&!U1;=grhUL540{;`5n%Ps@zM}&{1mG@D|4@(pN(n@jk^gqw>QyBU;&CO#Bz}oGXj+6JzKx|GoA;g*g9jaYli#y+$72Q} z(*N#==Ct8OW~t4sAhR|0;@@KBD5hDZnyYz^8LD@7c4H60)q%s?;h;RGv{oh-%3W>({{8Wd+;o(RCbEFbL{V1*1;2JJd47m#qXj z_{=b%>q3Zaz>V*LbaWqrMvzey98V?L_d&Q%lyrkfnouy z>9Xcle>K4DqHrZAkUE2=`EeSz3jeb(H`&BQP1HvB`lPRy;Z+|G{AYXmA3NQPM9mA7 zWl;070FhzMKZ|w`k}W{aR7TO*0dz4GaHt8(_T~OyT`Wje8i2w*=%9w*B$2Ma%!Isi zUv+zU4M{~~g-1}Uwj|O28AP{lIWLOgCV+j9!A(9+C`&LQ2BGPd)sCejOBejmUBM+k z`nT(nr3PDh>dM!HKri-Np-;M;)vE{pb0gnU251%0?`oqY-uZ7|1!(rNTmvLP366%K z20!~p#;0igCmgbZC7xhAB|$u$z|epko!MsmSd0?P@{d|>o$ubDhW3tp$#Hn_FXKNy z4UqU)K28P_$i?Vr&BGnBP`OIA+f6H&9R@h^-wc_!OE*yIhKS*4w^z0)eXM&R;NNKc zl_+$SW1ULbYrA}t?yK4B+Pn3c0CfRg55K#JtmxBOabVy179w5y3rq9k{HfKTZ+T?B zbK6W4UVD&^qhTX;DuRV)zyn-+Wlt)cA?G%mh>J7My>ai>+1eULgF-cZ04sTR)Ym)NW z@mV5Zb}};4cMTH;CdOU;4z4ILfwX6jnp!97C%U7A!|(bdtz>LEI$&&!j%X8*i|N5iL?J-vZND^71>E<^n$%>SYj6H_kq-&Lw7 z(mCdw9Yph>6y%r0yd=>^CJ@t*#Ju%>P`_}-@`7;#7%^zY$pSt z!V`jQB}nwd6_qXYAj4IR%xzUoPj~(uzZ*PE2$!=EgLh!1Vj;>;`#k@EgyMGYulU4pZWwcf} z;JzFf$po!j8%5_(G=+p;9VDreJUrz;=3ihXp=HqQ4;&FgZsvg3aLEOn<`Y{Rb^pH8 z`Ic01hdYm%p^Vnd+(ZKy*)MG%Cb|AIUOwqZK5_&WGh^S13-~;?l$2FlD{>vfEfb;ge-#f?%P)oGc(LmG%koE98 zQ!JUXh}s&ACo}LYJ?Z!71)!Td=kYA91>Q!lvM1%X9~v5xa)AVN6cQgsJV_a%1bmE zW_I+RjX?cluNa=p@rulo-X!NgPZ3#y&&dwti?)l?m0DlUgotdTV9HGax_((I)UBm$ zv2#L^U?mSThon9G**H0&BAMA5bYZ2FnIXg9&mQ-zk@_?bVwrKNL^leC!!rPa`T37&;MBiksK^`Ao~ z!v(US!|#+JJ*5nlgh&i8D@`cXnqA62(X6fBp;ZhK;gRB6-SrHM6%h@zC(I)SvIS+o z6U1LJM80MT{&;h$Xg^hxQR}cEu}JQaSz<6TRnfDjxcuR-;RJ)d>og|KlpqmSHS0b% z{Wk^LJ*W-g0ZR!_BuugSrK$3X6DO!8277Cwi^x)dh>e0+4 zwpY?N`lOdp-~J}c@^wOM9=b6rocfVyH35hD3T2p>7&TvyCcobR{uEIp&=AbbbtA`| zA)8rTD|U-)${xhUYcltDw+C4=t1^6xD+>A+)maI3J}Z~{xaxy;3RYm|%X=oEt7223 z1DRje;I7b_dk2PPvGcO~moCY7cA8tchy2SA(x2`b00kx*2n)@{6ZL9?;DQaiH1@c+ z?NmDRafOm|6|vkYrJzb)a>*$M$~rAt*#Hcm!6ITCn6ES3p)B;Ofdh$L(p%(MrDn-n zNKa6`*|ckxEMwp_5dvN#{BFdMnK$BdXiBq?nVCVvm~|y>|J9k7ITg`*x)2g-y7c&Q z2$5M;64N{jLY-p!_B?fhUHdSTjOj;eWAF9w_J|=ftl;a-fiM~EteGib6Z^wtz5m^S z6|ZNz5aJakp_*t~Vh}Pmj}kFR6w|$xx1(OWco$#QPS&KMXLoi-B}yVu%;>y)2t=~Q z@|C3#J^?Z0X0oqW>Du_|87#Y)9P6Y8C@2_%Dhv#92QuqAh*1c%?;OHsAhOJ?6Y+|n ziOD^;?!vco{%mFv%+vlv#VEPfGzcQBT27RS>f+qQz|fjNX5|Jkdg(t=r<~$HL#0lv z)Xrw!KG`mVM6;d2awHvRp5L@ww!{}5lG?vkHCjE2BEm!Z|H21$ff|A-o^ zuCITTXn=4ZTrz!9-ML-^hbEu(LW>{xPnF262|mDT9_|1A3{5gM zmYMda@C$6L#L|X#v?1YtKhFUofY|Z?)tiqMgb-C+JF?FFzt3P+Px2u82F!;aE12%P zGcY91iv7hdH$b6NQj7OGGqy&;aO4K$Z0)0miFdTuFol=T$u{qtxR&5`A*Q_$|2$Vo zmz~B=|T$n%+ZEtOX}8PF=Hk zuOWUny8@t=duUy0X(Hsn23QkS1|C=}O`IfuvtUhJ$50f|?MwKyPR*G04Q?8W2(1ix z@toHu3(WEB*wKUoP6)bW{CKzNKLTS`-Jm13t)KHWFA8>-zC@dLmcIlaqyPnd3(BXP z`UwNI(XnU?o9Zew78dxC66;}3sel2rFpoY7C>p2Ak3fzuAPcPw1@Xv=g^|+pt*@xw zyeQi{?m(6172O#Msfi1dGBc`NjWzr<})f3gF*3%p%tR9B*jU4f5*Y#d8{ zLyUdmMn}Lr74%0P=^xs}2e8=8kR~BlvRW*LPwk6~t7~n894fU*tLhJo?DXK3a*GG> z`xw$@)eX|fEW4RLfSJAE5p5{HZVITPc`en2>0bk2NI+v`Q^3tVMvIp8E4thdp}pqY zQrln;g6f#`X-d2%n7umCyD!iZ)`C+PFRg}zbKOC~Q&L(s2#Qjq!UFs+0Z^zzF-p(1 zUu#kKMqR@uac7hSzTgvNel75T_sp`IgCvNKXc-csIm2^}N!L}OUxWXi+L+2xaV+KN z7PL6F0_X5fMCvuPzer`Yy#sstz5K}SokiKa7)|vvEvd&=JAJ;Z(4fh<@DXiLL_0B| z1M?IL25v$Q<>OAfIhy-a+^arOECk6)NG%vY~kr#_vG?>S|Dc zI*cWmQc=2YJEZeX*KBVSc8!Y^vOM53{6H(UBl9sq#ByP7NNb39J8jepW}zJ@3t7~W zBr516eCr84ObbblnQx|j%uaxvb2Q7own^{9w|5s~V-EPdnwh5%JOSLwP$Ut?TUCMA z^dvs9HxG87IzTW(vs)8f51|x}ewb>pm?*W%7QFCXX8@}4RT#^R!r@nQI-p!0)fme| zcZDLgQXvs0PB=c}V}=FggSDnw^Lq(q*)|=E2T~z3uJM8}KDt=Rpp<%!LGH6$`4Ck4 z9%Zf$lsF;CZS7~aDo`K|1jErR4KjZVNsx4Dh6BLw)&mnbUzFn0n@S0bb$>O>qyIbzNnls(?Bv(($`5PXAIW2xiU)mrxP81qXD-4FLg1)wkY*~B&3_nkqy z(4l)}Yz-#|t2fy6>5r|v+|a%I^^Xwu6Ra6D$%ocQK25rCE_SKYxTSML4L6k<#_U&) z|`$uy! z3`ZN+@!np6Al11VmP#F__EXH}ZHpk?erU>umg8z~BePJ;)n1tbmV(fGe7L^nr_DZD zXVHnI)6n1U_56lJzZ5Sw5Fp*YU)FIDXSNr5^-BtL6uiQ?f}vTwZ)Br@!mslEMmujIoe-OVIGLl9+f>5^#|h2uB8V_bj{}HkMBa@R}uq-Vyn}HWg;lM*=5cIGP50x3-MkWpe;PY)@Itpcex%MUP3+m;Rd0^` ziAyXm9s${i1xNZt#K9F zTK!_^`wr}XBG9iH+A#8f=P1u47Y`C>JZ_unPu!L!^hEeKFErr)A$N<>A2IR{w+8wG zx6Mw%&rnKVxCt|eH*Daj6^K~8F|SwYQPYu*-d*qa@F9U8vjykAjr>uRpp79O>sP>! z2gtpLDVa2RlN>!Y_IWn=(S;0cHK9kdU*?3W@{ewKkhvPo&fcO*M#}cJdKj+Rpmj)K z(_GneL5BWDTu9k_Z34WSna~#JvWE-O)fioOj(J^ZQx9JIw1>?o`B>R~_<=+WrOqrU zko?H}=@IslweYJ8QAXy1`;9fE3i%Uhf_|Ef^6(>x>hTMy9@^aT&3cLOQx*;+NoCWm z16;|+vrYN7^4W_17Tf^jPm5nUNMtDAeXxfXz)q99u?Akn;mx{kf%3Vw63Z8d&zYTb zOL91eAg?KU$~U)jNe#$t8RmZ?_*+mE;WPCP>SD}{_DV?@jx?q=e%9_?1HWByS!`1m z9v0&BG~d^vyjLSnqfvP^BBpc!nC_KmP4uNpD&d^hIg2DuQAFD>d$Eb2aOFhm zA?+r`0bSRdw?cY&F0P#n=S0Tu%y*7^{LT=gtL~l4NW7lLcR;#|6kApj-e_O`!3;tE zo}tgFg0v&Jsgn8F)1JyQ3dYu{ms2f>jAAx5w(p-GZ}!ugv?AgNLxq8f0`Lo%tDf(0 zdEM!w2^Z-eMIoJ}xq2~Q&wSimq|R6ZhA~HIz+fLW+DFEMav(+rP4qK#Pv7`ICX7Gn literal 0 HcmV?d00001 diff --git a/apps/client/public/icons/favicon-16x16.png b/apps/client/public/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d2d56fe4abab83637996db42875793894aba47 GIT binary patch literal 509 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6XVU3I`u#fXMsm#F#`j) zFbFd;%$g$s6kHeJ6XFV_F@dhGu9ugWwY9Z?fPjaGhoPY%6BE<@`}hC<|F5E=vT@_a zr%#_oMn*n<{MgUW@7J$i|Ni}Ra&pSb%DR2~_LC=1_V3@XqoecZ&mT@sPG)B2Z{NNt zDJi{w|6WZ^O;1m6%9JUBf`WVY?3plOLUeTW;>C+gOG_U;di3?{S5Z;X`uh5|wzl5h z-lRZ(`HAFd*NmB*-t=@5%pv7u1dc-9!rbyW^blK`eO~XKX?fmf zc`=8OT8N_|pY8$GWdAt1SN#sHMawo+o_1X@alsLZ4;5wsYVRGsW-KUc`0qA%Vq18V z-1>}nTnz_V*RE~*#wIcELS*)fPm+m8re<=noWB2s>G9r}UokZY&plwzT3#8~UUF&w i(`6;eK@{oCO|{#S9GG z!XV7ZFl&wkP=Q5&Plzi}l1LyWCDq;CJ$drv=;&x$Tif2=-bs@t)z;Q}dwX+oa&Fza z_5c6>Ha0dwLPB4@d|AGHxwN$Ov17-AgM&LdIzE2<=;PxP5)#7B&i?Avt6#rR$X2F>C-0# z1qD%2QDtRi4Gj%lU0ow1BXe_eXJ=;-5fQXdvg`3#1{BID3GxeO;Gg&M-~V5i(iv}u z9Qg?h2I_;%V0%C%TlhJhU`; zJEy%>%BWmjzk1q5t&S54O$%H&s-7=n*PZ0hw1izF<>XqM;xq2gOMZ(P&zUK2eBbg8 zcay+N6{-A&iPy`P>X^&;&9bJgxlqPKOOM|P zqML*(ez0z-|8QuEz5CJ5?^X-=PKdm|=M%+j@@VUp-J0`58q;j1-rX9v+Ce&=QB&`y zzR7{99gdk7KFrl}IL;~W_THjYPSfGKqWrM}?Md&07_0b}?Elc)ajl!_$tIy054gV^ z{m-Igv&ViJLt`@Mmrun!Z?q3Qn8&hgg2s`Bv8)_wa^2@8R@qD63zT2AKrp9x9^1Ap z4886vy|^3}o~>^%Ff%#evnQr&O?Jc0h?Pd2TeS{+JzA+JDKP&~<#uuHskOrI{5M^; vv6-g3f#LDpch6&Dm?WQR72R6LsdL%9_<8gT0m*DNP=tHB`njxgN@xNAgAS1J literal 0 HcmV?d00001 diff --git a/apps/client/public/locales/de-DE/translation.json b/apps/client/public/locales/de-DE/translation.json new file mode 100644 index 0000000..fb7dda0 --- /dev/null +++ b/apps/client/public/locales/de-DE/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Konto", + "Active": "Aktiv", + "Add": "Hinzufügen", + "Add group members": "Gruppenmitglieder hinzufügen", + "Add groups": "Gruppen hinzufügen", + "Add members": "Mitglieder hinzufügen", + "Add to groups": "Zu Gruppen hinzufügen", + "Add space members": "Bereichsmitglieder hinzufügen", + "Add to favorites": "Zu Favoriten hinzufügen", + "Admin": "Administrator", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Sind Sie sicher, dass Sie diese Gruppe löschen möchten? Mitglieder verlieren den Zugang zu den Ressourcen, auf die diese Gruppe zugreifen kann.", + "Are you sure you want to delete this page?": "Sind Sie sicher, dass Sie diese Seite löschen möchten?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Sind Sie sicher, dass Sie diesen Benutzer aus der Gruppe entfernen möchten? Der Benutzer verliert den Zugang zu den Ressourcen, auf die diese Gruppe zugreifen kann.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Sind Sie sicher, dass Sie diesen Benutzer aus dem Bereich entfernen möchten? Der Benutzer verliert den gesamten Zugang zu diesem Bereich.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Sind Sie sicher, dass Sie diese Version wiederherstellen möchten? Alle nicht versionierten Änderungen gehen verloren.", + "Can become members of groups and spaces in workspace": "Kann Mitglied von Gruppen und Bereichen im Arbeitsbereich werden", + "Can create and edit pages in space.": "Kann Seiten im Bereich erstellen und bearbeiten.", + "Can edit": "Kann bearbeiten", + "Can manage workspace": "Kann Arbeitsbereich verwalten", + "Can manage workspace but cannot delete it": "Kann Arbeitsbereich verwalten, aber nicht löschen", + "Can view": "Kann anzeigen", + "Can view pages in space but not edit.": "Kann Seiten im Bereich anzeigen, aber nicht bearbeiten.", + "Cancel": "Abbrechen", + "Change email": "E-Mail ändern", + "Change password": "Passwort ändern", + "Change photo": "Foto ändern", + "Choose a role": "Wählen Sie eine Rolle", + "Choose your preferred color scheme.": "Wählen Sie Ihr bevorzugtes Farbschema.", + "Choose your preferred interface language.": "Wählen Sie Ihre bevorzugte Benutzersprache.", + "Choose your preferred page width.": "Wählen Sie Ihre bevorzugte Seitenbreite.", + "Confirm": "Bestätigen", + "Copy as Markdown": "Als Markdown kopieren", + "Copy link": "Link kopieren", + "Create": "Erstellen", + "Create group": "Gruppe erstellen", + "Create page": "Seite erstellen", + "Create space": "Bereich erstellen", + "Create workspace": "Arbeitsbereich erstellen", + "Current password": "Aktuelles Passwort", + "Dark": "Dunkel", + "Date": "Datum", + "Delete": "Löschen", + "Remove from page": "Von Seite entfernen", + "Base options": "Basisoptionen", + "Delete group": "Gruppe löschen", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Sind Sie sicher, dass Sie diese Seite löschen möchten? Dabei werden auch alle Unterseiten und der Seitenverlauf gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.", + "Description": "Beschreibung", + "Details": "Details", + "e.g ACME": "z. B. ACME", + "e.g ACME Inc": "z. B. ACME GmbH", + "e.g Developers": "z. B. Entwickler", + "e.g Group for developers": "z. B. Gruppe für Entwickler", + "e.g product": "z. B. Produkt", + "e.g Product Team": "z. B. Produktteam", + "e.g Sales": "z. B. Vertrieb", + "e.g Space for product team": "z. B. Bereich für das Produktteam", + "e.g Space for sales team to collaborate": "z. B. Bereich zur Zusammenarbeit für das Vertriebsteam", + "Edit": "Bearbeiten", + "Read": "Lesen", + "Edit group": "Gruppe bearbeiten", + "Email": "E-Mail", + "Enter a strong password": "Geben Sie ein starkes Passwort ein", + "Enter valid email addresses separated by comma or space max_50": "Geben Sie gültige E-Mail-Adressen ein, getrennt durch Kommas oder Leerzeichen [max: 50]", + "enter valid emails addresses": "Geben Sie gültige E-Mail-Adressen ein", + "Enter your current password": "Geben Sie Ihr aktuelles Passwort ein", + "enter your full name": "Geben Sie Ihren vollständigen Namen ein", + "Enter your new password": "Geben Sie Ihr neues Passwort ein", + "Enter your new preferred email": "Geben Sie Ihre neue bevorzugte E-Mail ein", + "Enter your password": "Geben Sie Ihr Passwort ein", + "Error fetching page data.": "Fehler beim Abrufen der Seitendaten.", + "Error loading page history.": "Fehler beim Laden des Seitenverlaufs.", + "Export": "Exportieren", + "Failed to create page": "Erstellung der Seite fehlgeschlagen", + "Failed to delete page": "Löschen der Seite fehlgeschlagen", + "Failed to restore page": "Seite konnte nicht wiederhergestellt werden", + "Failed to fetch recent pages": "Fehler beim Abrufen der letzten Seiten", + "Failed to import pages": "Import der Seiten fehlgeschlagen", + "Failed to load page. An error occurred.": "Seite konnte nicht geladen werden. Es ist ein Fehler aufgetreten.", + "Failed to update data": "Aktualisierung der Daten fehlgeschlagen", + "Failed to create base": "Basis konnte nicht erstellt werden", + "Failed to update base": "Basis konnte nicht aktualisiert werden", + "Failed to delete base": "Basis konnte nicht gelöscht werden", + "Failed to create property": "Eigenschaft konnte nicht erstellt werden", + "Failed to update property": "Eigenschaft konnte nicht aktualisiert werden", + "Failed to delete property": "Eigenschaft konnte nicht gelöscht werden", + "Failed to reorder property": "Eigenschaft konnte nicht neu angeordnet werden", + "Failed to create view": "Ansicht konnte nicht erstellt werden", + "Failed to update view": "Ansicht konnte nicht aktualisiert werden", + "Failed to delete view": "Ansicht konnte nicht gelöscht werden", + "Failed to create row": "Zeile konnte nicht erstellt werden", + "Failed to update row": "Zeile konnte nicht aktualisiert werden", + "Failed to delete row": "Zeile konnte nicht gelöscht werden", + "Failed to delete rows": "Zeilen konnten nicht gelöscht werden", + "Failed to reorder row": "Zeile konnte nicht neu angeordnet werden", + "Failed to move card": "Karte konnte nicht verschoben werden", + "Failed to add card": "Karte konnte nicht hinzugefügt werden", + "Failed to export CSV": "CSV konnte nicht exportiert werden", + "Favorite spaces": "Favorisierte Bereiche", + "Favorite spaces appear here": "Favorisierte Bereiche werden hier angezeigt", + "Favorites": "Favoriten", + "Full access": "Voller Zugriff", + "Full page width": "Volle Seitenbreite", + "Full width": "Volle Breite", + "General": "Allgemein", + "Group": "Gruppe", + "Group description": "Gruppenbeschreibung", + "Group name": "Gruppenname", + "Groups": "Gruppen", + "Has full access to space settings and pages.": "Hat vollen Zugriff auf die Bereichseinstellungen und Seiten.", + "Home": "Startseite", + "Import pages": "Seiten importieren", + "Import pages & space settings": "Seiten und Bereichseinstellungen importieren", + "Importing pages": "Seiten werden importiert", + "invalid invitation link": "Ungültiger Einladungslink", + "Invitation signup": "Einladung zur Anmeldung", + "Invite by email": "Einladen per E-Mail", + "Invite members": "Mitglieder einladen", + "Invite new members": "Neue Mitglieder einladen", + "Invite People": "Personen einladen", + "Invited members who are yet to accept their invitation will appear here.": "Eingeladene Mitglieder, die ihre Einladung noch nicht angenommen haben, werden hier angezeigt.", + "Invited members will be granted access to spaces the groups can access": "Eingeladene Mitglieder erhalten Zugriff auf die Bereiche, auf die die Gruppen zugreifen können", + "Join the workspace": "Dem Arbeitsbereich beitreten", + "Language": "Sprache", + "Light": "Hell", + "Link copied": "Link kopiert", + "Login": "Anmelden", + "Logout": "Abmelden", + "Manage Group": "Gruppe verwalten", + "Manage members": "Mitglieder verwalten", + "member": "Mitglied", + "Member": "Mitglied", + "members": "Mitglieder", + "Members": "Mitglieder", + "My preferences": "Meine Einstellungen", + "My Profile": "Mein Profil", + "My profile": "Mein Profil", + "Name": "Name", + "New email": "Neue E-Mail", + "New page": "Neue Seite", + "New password": "Neues Passwort", + "No group found": "Keine Gruppe gefunden", + "No page history saved yet.": "Es wurde noch kein Seitenverlauf gespeichert.", + "No pages yet": "Noch keine Seiten", + "No shared pages": "Keine freigegebenen Seiten", + "No results found...": "Keine Ergebnisse gefunden...", + "No user found": "Kein Benutzer gefunden", + "Overview": "Überblick", + "Owner": "Besitzer", + "page": "Seite", + "Page deleted successfully": "Seite erfolgreich gelöscht", + "Page history": "Seitenverlauf", + "Select version": "Version auswählen", + "Highlight changes": "Änderungen hervorheben", + "Page import is in progress. Please do not close this tab.": "Der Seitenimport läuft. Bitte schließen Sie diesen Tab nicht.", + "Pages": "Seiten", + "pages": "Seiten", + "Password": "Passwort", + "Password changed successfully": "Passwort erfolgreich geändert", + "People": "Personen", + "Pending": "Ausstehend", + "Please confirm your action": "Bitte bestätigen Sie Ihre Aktion", + "Preferences": "Einstellungen", + "Print PDF": "PDF drucken", + "Profile": "Profil", + "Recently updated": "Kürzlich aktualisiert", + "Remove": "Entfernen", + "Remove from favorites": "Aus Favoriten entfernen", + "Remove group member": "Gruppenmitglied entfernen", + "Remove space member": "Bereichsmitglied entfernen", + "Restore": "Wiederherstellen", + "Role": "Rolle", + "Save": "Speichern", + "Search": "Suche", + "Search for groups": "Suche nach Gruppen", + "Search for users": "Suche nach Benutzern", + "Search for users and groups": "Suche nach Benutzern und Gruppen", + "Search...": "Suche...", + "Select language": "Sprache auswählen", + "Select role": "Rolle auswählen", + "Select role to assign to all invited members": "Wählen Sie die Rolle aus, die allen eingeladenen Mitgliedern zugewiesen werden soll", + "Select theme": "Design auswählen", + "Send invitation": "Einladung senden", + "Invitation sent": "Einladung gesendet", + "Settings": "Einstellungen", + "Setup workspace": "Workspace einrichten", + "Sign In": "Anmelden", + "Sign Up": "Registrieren", + "Slug": "Slug", + "Space": "Bereich", + "Space description": "Bereichsbeschreibung", + "Space menu": "Bereichsmenü", + "Space name": "Bereichsname", + "Space settings": "Bereichseinstellungen", + "Space slug": "Bereichs-Slug", + "Spaces": "Bereiche", + "Spaces you belong to": "Bereiche, zu denen Sie gehören", + "No space found": "Kein Bereich gefunden", + "Search for spaces": "Nach Bereichen suchen", + "Start typing to search...": "Anfangen zu tippen, um zu suchen...", + "Status": "Status", + "Successfully imported": "Erfolgreich importiert", + "Successfully restored": "Erfolgreich wiederhergestellt", + "System settings": "Systemeinstellungen", + "Templates": "Vorlagen", + "Theme": "Design", + "To change your email, you have to enter your password and new email.": "Um Ihre E-Mail-Adresse zu ändern, müssen Sie Ihr Passwort und Ihre neue E-Mail-Adresse eingeben.", + "Toggle full page width": "Volle Seitenbreite umschalten", + "Unable to import pages. Please try again.": "Seiten konnten nicht importiert werden. Bitte versuchen Sie es erneut.", + "untitled": "ohne Titel", + "Untitled": "Ohne Titel", + "Updated successfully": "Erfolgreich aktualisiert", + "User": "Benutzer", + "Workspace": "Workspace", + "Workspace Name": "Workspace-Name", + "Workspace settings": "Workspace-Einstellungen", + "You can change your password here.": "Hier können Sie Ihr Passwort ändern.", + "Your Email": "Ihre E-Mail", + "Your import is complete.": "Ihr Import ist abgeschlossen.", + "Your name": "Ihr Name", + "Your Name": "Ihr Name", + "Your password": "Ihr Passwort", + "Your password must be a minimum of 8 characters.": "Ihr Passwort muss mindestens 8 Zeichen lang sein.", + "Sidebar toggle": "Seitenleiste umschalten", + "Comments": "Kommentare", + "404 page not found": "404 Seite nicht gefunden", + "Sorry, we can't find the page you are looking for.": "Entschuldigung, wir können die gesuchte Seite nicht finden.", + "Take me back to homepage": "Zurück zur Startseite", + "Forgot password": "Passwort vergessen", + "Forgot your password?": "Passwort vergessen?", + "A password reset link has been sent to your email. Please check your inbox.": "Ein Link zum Zurücksetzen des Passworts wurde an Ihre E-Mail gesendet. Bitte überprüfen Sie Ihren Posteingang.", + "Send reset link": "Zurücksetzungslink senden", + "Password reset": "Passwort zurücksetzen", + "Your new password": "Ihr neues Passwort", + "Set password": "Passwort festlegen", + "Write a comment": "Einen Kommentar schreiben", + "Reply...": "Antworten...", + "Error loading comments.": "Fehler beim Laden der Kommentare.", + "No comments yet.": "Noch keine Kommentare.", + "No open comments.": "Keine offenen Kommentare.", + "No resolved comments.": "Keine gelösten Kommentare.", + "Add a comment...": "Kommentar hinzufügen...", + "Edit comment": "Kommentar bearbeiten", + "Delete comment": "Kommentar löschen", + "Are you sure you want to delete this comment?": "Sind Sie sicher, dass Sie diesen Kommentar löschen möchten?", + "Delete chat": "Chat löschen", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Sind Sie sicher, dass Sie '{{title}}' löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "Comment created successfully": "Kommentar erfolgreich erstellt", + "Error creating comment": "Fehler beim Erstellen des Kommentars", + "Comment updated successfully": "Kommentar erfolgreich aktualisiert", + "Failed to update comment": "Aktualisierung des Kommentars fehlgeschlagen", + "Comment deleted successfully": "Kommentar erfolgreich gelöscht", + "Failed to delete comment": "Löschen des Kommentars fehlgeschlagen", + "Comment resolved successfully": "Kommentar erfolgreich gelöst", + "Comment re-opened successfully": "Kommentar erfolgreich wieder geöffnet", + "Comment unresolved successfully": "Kommentar erfolgreich als ungelöst markiert", + "Failed to resolve comment": "Lösen des Kommentars fehlgeschlagen", + "Resolve comment": "Kommentar lösen", + "Unresolve comment": "Kommentar als ungelöst markieren", + "Resolve Comment Thread": "Kommentarthread lösen", + "Unresolve Comment Thread": "Kommentarthread als ungelöst markieren", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Sind Sie sicher, dass Sie diesen Kommentarthread lösen möchten? Dies wird als abgeschlossen markiert.", + "Are you sure you want to unresolve this comment thread?": "Sind Sie sicher, dass Sie diesen Kommentarthread nicht lösen möchten?", + "Resolved": "Gelöst", + "No active comments.": "Keine aktiven Kommentare.", + "Revoke invitation": "Einladung widerrufen", + "Revoke": "Widerrufen", + "Don't": "Nicht", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Sind Sie sicher, dass Sie diese Einladung widerrufen möchten? Der Benutzer kann dem Arbeitsbereich nicht beitreten.", + "Resend invitation": "Einladung erneut senden", + "Anyone with this link can join this workspace.": "Jeder mit diesem Link kann dem Arbeitsbereich beitreten.", + "Invite link": "Einladungslink", + "Copy": "Kopieren", + "Copy to space": "In Bereich kopieren", + "Copied": "Kopiert", + "Duplicate": "Duplizieren", + "Select a user": "Benutzer auswählen", + "Select a group": "Gruppe auswählen", + "Export all pages and attachments in this space.": "Alle Seiten und Anhänge in diesem Bereich exportieren.", + "Delete space": "Bereich löschen", + "Are you sure you want to delete this space?": "Sind Sie sicher, dass Sie diesen Bereich löschen möchten?", + "Delete this space with all its pages and data.": "Diesen Bereich mit allen Seiten und Daten löschen.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Alle Seiten, Kommentare, Anhänge und Berechtigungen in diesem Bereich werden unwiderruflich gelöscht.", + "Confirm space name": "Bereichsnamen bestätigen", + "Type the space name {{spaceName}} to confirm your action.": "Geben Sie den Namen des Bereichs {{spaceName}} ein, um Ihre Aktion zu bestätigen.", + "Format": "Format", + "Include subpages": "Unterseiten einbeziehen", + "Include attachments": "Anhänge einbeziehen", + "Select export format": "Exportformat auswählen", + "Export failed:": "Export fehlgeschlagen:", + "export error": "Exportfehler", + "Export page": "Seite exportieren", + "Export successful": "Export erfolgreich", + "Export space": "Bereich exportieren", + "Export {{type}}": "Exportiere {{type}}", + "File exceeds the {{limit}} attachment limit": "Datei überschreitet das Anhängelimit von {{limit}}", + "Media": "Medien", + "Align left": "Links ausrichten", + "Align right": "Rechts ausrichten", + "Align center": "Zentrieren", + "Alt text": "Alternativtext", + "Describe this for accessibility.": "Beschreiben Sie dies für die Barrierefreiheit.", + "Add a description": "Beschreibung hinzufügen", + "Justify": "Blocksatz", + "Merge cells": "Zellen zusammenführen", + "Split cell": "Zelle teilen", + "Delete column": "Spalte löschen", + "Delete row": "Zeile löschen", + "Add left column": "Linke Spalte hinzufügen", + "Add right column": "Rechte Spalte hinzufügen", + "Add row above": "Zeile oben hinzufügen", + "Add row below": "Zeile unten hinzufügen", + "Delete table": "Tabelle löschen", + "Add column left": "Spalte links hinzufügen", + "Add column right": "Spalte rechts hinzufügen", + "Clear cell": "Zelle leeren", + "Clear cells": "Zellen leeren", + "Toggle header cell": "Kopfzelle umschalten", + "Toggle header column": "Kopfspalte umschalten", + "Toggle header row": "Kopfzeile umschalten", + "Move column left": "Spalte nach links verschieben", + "Move column right": "Spalte nach rechts verschieben", + "Move row down": "Zeile nach unten verschieben", + "Move row up": "Zeile nach oben verschieben", + "Sort A → Z": "A → Z sortieren", + "Sort Z → A": "Z → A sortieren", + "Info": "Info", + "Note": "Hinweis", + "Success": "Erfolg", + "Warning": "Warnung", + "Danger": "Gefahr", + "Mermaid diagram error:": "Fehler im Mermaid-Diagramm:", + "Invalid Mermaid diagram": "Ungültiges Mermaid-Diagramm", + "Double-click to edit Draw.io diagram": "Zum Bearbeiten des Draw.io-Diagramms doppelklicken", + "Exit": "Beenden", + "Save & Exit": "Speichern & Beenden", + "Double-click to edit Excalidraw diagram": "Zum Bearbeiten des Excalidraw-Diagramms doppelklicken", + "Paste link": "Link einfügen", + "Paste link or search pages": "Link einfügen oder Seiten durchsuchen", + "Link to web page": "Link zur Webseite", + "Recents": "Zuletzt verwendet", + "Page or URL": "Seite oder URL", + "Link title": "Linktitel", + "Edit link": "Link bearbeiten", + "Remove link": "Link entfernen", + "Add link": "Link hinzufügen", + "Please enter a valid url": "Bitte geben Sie eine gültige URL ein", + "Empty equation": "Leere Gleichung", + "Invalid equation": "Ungültige Gleichung", + "Color": "Farbe", + "Text color": "Textfarbe", + "Default": "Standard", + "Blue": "Blau", + "Green": "Grün", + "Purple": "Lila", + "Red": "Rot", + "Yellow": "Gelb", + "Orange": "Orange", + "Pink": "Rosa", + "Gray": "Grau", + "Embed link": "Link einbetten", + "Invalid {{provider}} embed link": "Ungültiger {{provider}}-Einbettungslink", + "Embed {{provider}}": "{{provider}} einbetten", + "Enter {{provider}} link to embed": "Geben Sie den Einbettungslink für {{provider}} ein", + "Bold": "Fett", + "Italic": "Kursiv", + "Underline": "Unterstreichen", + "Strike": "Durchstreichen", + "Code": "Code", + "Comment": "Kommentar", + "Text": "Text", + "Heading 1": "Überschrift 1", + "Heading 2": "Überschrift 2", + "Heading 3": "Überschrift 3", + "To-do List": "To-do-Liste", + "Bullet List": "Aufzählungsliste", + "Numbered List": "Nummerierte Liste", + "Blockquote": "Blockzitat", + "Just start typing with plain text.": "Tippen Sie einfach mit normalem Text los.", + "Track tasks with a to-do list.": "Verfolgen Sie Aufgaben mit einer To-do-Liste.", + "Big section heading.": "Große Abschnittsüberschrift.", + "Medium section heading.": "Mittlere Abschnittsüberschrift.", + "Small section heading.": "Kleine Abschnittsüberschrift.", + "Create a simple bullet list.": "Erstellen Sie eine einfache Aufzählungsliste.", + "Create a list with numbering.": "Erstellen Sie eine nummerierte Liste.", + "Create block quote.": "Erstellen Sie ein Blockzitat.", + "Insert code snippet.": "Code-Snippet einfügen.", + "Insert horizontal rule divider": "Horizontale Trennlinie einfügen", + "Page break": "Seitenumbruch", + "Insert a page break for printing.": "Einen Seitenumbruch zum Drucken einfügen.", + "Footnote": "Fußnote", + "Insert a footnote reference.": "Einen Fußnotenverweis einfügen.", + "Upload any image from your device.": "Laden Sie ein beliebiges Bild von Ihrem Gerät hoch.", + "Upload any video from your device.": "Laden Sie ein beliebiges Video von Ihrem Gerät hoch.", + "Upload any audio from your device.": "Laden Sie beliebige Audiodateien von Ihrem Gerät hoch.", + "Upload any file from your device.": "Laden Sie eine beliebige Datei von Ihrem Gerät hoch.", + "Uploading {{name}}": "Lade {{name}} hoch", + "Uploading file": "Datei wird hochgeladen", + "Table": "Tabelle", + "Insert a table.": "Tabelle einfügen.", + "Insert collapsible block.": "Einklappbaren Block einfügen.", + "Video": "Video", + "Divider": "Trennlinie", + "Quote": "Zitat", + "Image": "Bild", + "Audio": "Audio", + "Embed PDF": "PDF einbetten", + "Upload and embed a PDF file.": "Laden Sie eine PDF-Datei hoch und betten Sie sie ein.", + "Embed as PDF": "Als PDF einbetten", + "Failed to load PDF": "Fehler beim Laden der PDF", + "Convert to attachment": "In Anhang umwandeln", + "File attachment": "Dateianhang", + "Toggle block": "Umschaltblock", + "Callout": "Hinweisblock", + "Insert callout notice.": "Hinweisbox einfügen.", + "Math inline": "Mathe inline", + "Insert inline math equation.": "Mathe-Gleichung inline einfügen.", + "Math block": "Matheblock", + "Insert math equation": "Mathematische Gleichung einfügen", + "Mermaid diagram": "Mermaid-Diagramm", + "Insert mermaid diagram": "Mermaid-Diagramm einfügen", + "Insert and design Drawio diagrams": "Drawio-Diagramme einfügen und gestalten", + "Insert current date": "Aktuelles Datum einfügen", + "Time": "Uhrzeit", + "Insert current time": "Aktuelle Uhrzeit einfügen", + "Draw and sketch excalidraw diagrams": "Excalidraw-Diagramme zeichnen und skizzieren", + "Multiple": "Mehrfach", + "Turn into": "In verwandeln", + "Text align": "Text ausrichten", + "This page may have been deleted, moved, or you may not have access.": "\"Diese Seite wurde möglicherweise gelöscht, verschoben oder Sie haben keinen Zugriff darauf.\"", + "Go to homepage": "Zur Startseite", + "Pages you create will show up here.": "\"Die von Ihnen erstellten Seiten werden hier angezeigt.\"", + "Heading {{level}}": "Überschrift {{level}}", + "Toggle title": "Titel umschalten", + "Write anything. Enter \"/\" for commands": "Schreiben Sie etwas. Geben Sie \"/\" für Befehle ein", + "Write...": "\"Schreiben...\"", + "Column count": "Spaltenanzahl", + "{{count}} Columns": "{{count}} Spalten", + "{{count}} command available_one": "1 Befehl verfügbar", + "{{count}} command available_other": "{{count}} Befehle verfügbar", + "{{count}} result available_one": "1 Ergebnis verfügbar", + "{{count}} result available_other": "{{count}} Ergebnisse verfügbar", + "Equal columns": "Gleich breite Spalten", + "Left sidebar": "Linke Seitenleiste", + "Right sidebar": "Rechte Seitenleiste", + "Wide center": "Breiter Mittelbereich", + "Left wide": "Breiter linker Bereich", + "Right wide": "Breiter rechter Bereich", + "Names do not match": "Namen stimmen nicht überein", + "Today, {{time}}": "Heute, {{time}}", + "Yesterday, {{time}}": "Gestern, {{time}}", + "now": "jetzt", + "Space created successfully": "Bereich erfolgreich erstellt", + "Space updated successfully": "Bereich erfolgreich aktualisiert", + "Space deleted successfully": "Bereich erfolgreich gelöscht", + "Members added successfully": "Mitglieder erfolgreich hinzugefügt", + "Member removed successfully": "Mitglied erfolgreich entfernt", + "Member role updated successfully": "Mitgliederrolle erfolgreich aktualisiert", + "Created by: {{creatorName}}": "Erstellt von: {{creatorName}}", + "Created at: {{time}}": "Erstellt am: {{time}}", + "Edited by {{name}} {{time}}": "Bearbeitet von {{name}} {{time}}", + "Word count: {{wordCount}}": "Wortanzahl: {{wordCount}}", + "Character count: {{characterCount}}": "Zeichenanzahl: {{characterCount}}", + "New update": "Neues Update", + "{{latestVersion}} is available": "{{latestVersion}} ist verfügbar", + "Default page edit mode": "Standard-Bearbeitungsmodus für Seiten", + "Choose your preferred page edit mode. Avoid accidental edits.": "Wählen Sie Ihren bevorzugten Seitenbearbeitungsmodus. Vermeiden Sie versehentliche Bearbeitungen.", + "Choose {{format}} file": "{{format}}-Datei auswählen", + "Reading": "Lesen", + "Delete member": "Mitglied löschen", + "Member deleted successfully": "Mitglied erfolgreich gelöscht", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Sind Sie sicher, dass Sie dieses Arbeitsbereichsmitglied löschen möchten? Diese Aktion ist unwiderruflich.", + "Deactivate member": "Mitglied deaktivieren", + "Activate member": "Mitglied aktivieren", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Sind Sie sicher, dass Sie dieses Mitglied des Arbeitsbereichs deaktivieren möchten? Dieses Mitglied kann danach nicht mehr auf diesen Arbeitsbereich zugreifen.", + "Are you sure you want to activate this workspace member?": "Sind Sie sicher, dass Sie dieses Mitglied des Arbeitsbereichs aktivieren möchten?", + "Deactivate": "Deaktivieren", + "Activate": "Aktivieren", + "Deactivated": "Deaktiviert", + "Move": "Verschieben", + "Move page": "Seite verschieben", + "Move page to a different space.": "Seite in einen anderen Bereich verschieben.", + "Real-time editor connection lost. Retrying...": "Echtzeit-Editor-Verbindung verloren. Wiederholen...", + "Table of contents": "Inhaltsverzeichnis", + "Add headings (H1, H2, H3) to generate a table of contents.": "Fügen Sie Überschriften (H1, H2, H3) hinzu, um ein Inhaltsverzeichnis zu erstellen.", + "Share": "Teilen", + "Public sharing": "Öffentliche Freigabe", + "Shared by": "Geteilt von", + "Shared at": "Geteilt am", + "Inherits public sharing from": "Übernimmt öffentliche Freigabe von", + "Share to web": "Im Web teilen", + "Shared to web": "Im Web geteilt", + "Anyone with the link can view this page": "Jeder mit dem Link kann diese Seite ansehen", + "Make this page publicly accessible": "Diese Seite öffentlich zugänglich machen", + "Include sub-pages": "Unterseiten einschließen", + "Make sub-pages public too": "Unterseiten ebenfalls öffentlich machen", + "Allow search engines to index page": "Suchmaschinen das Indexieren der Seite erlauben", + "Open page": "Seite öffnen", + "Page": "Seite", + "Delete public share link": "Öffentlichen Freigabelink löschen", + "Delete share": "Freigabe löschen", + "Are you sure you want to delete this shared link?": "Möchten Sie diesen Freigabelink wirklich löschen?", + "Publicly shared pages from spaces you are a member of will appear here": "Öffentlich freigegebene Seiten aus Bereichen, in denen Sie Mitglied sind, werden hier angezeigt", + "Share deleted successfully": "Freigabe erfolgreich gelöscht", + "Share not found": "Freigabe nicht gefunden", + "Failed to share page": "Seite konnte nicht geteilt werden", + "Disable public sharing": "Öffentliches Teilen deaktivieren", + "Prevent members from sharing pages publicly.": "Verhindern Sie, dass Mitglieder Seiten öffentlich teilen.", + "Toggle public sharing": "Öffentliches Teilen umschalten", + "Toggle space public sharing": "Öffentliches Teilen im Bereich umschalten", + "Allow viewers to comment": "Zuschauern erlauben, Kommentare zu hinterlassen", + "Allow viewers to add comments on pages in this space.": "Erlauben Sie Zuschauern, Kommentare auf Seiten in diesem Bereich hinzuzufügen.", + "Toggle viewer comments": "Zuschauerkommentare umschalten", + "Public sharing is disabled at the workspace level": "Öffentliches Teilen ist auf der Arbeitsbereichsebene deaktiviert", + "Prevent pages in this space from being shared publicly.": "Verhindern Sie, dass Seiten in diesem Bereich öffentlich geteilt werden.", + "Page permissions": "Seitenberechtigungen", + "Control who can view and edit individual pages. Available with an enterprise license.": "Steuern Sie, wer einzelne Seiten ansehen und bearbeiten kann. Verfügbar mit einer Enterprise-Lizenz.", + "Enable public sharing": "Öffentliches Teilen aktivieren", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Sind Sie sicher, dass Sie das öffentliche Teilen aktivieren möchten? Mitglieder können Seiten öffentlich teilen.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Sind Sie sicher, dass Sie das öffentliche Teilen deaktivieren möchten? Alle bestehenden Freigabelinks in diesem Arbeitsbereich werden gelöscht.", + "Are you sure you want to enable public sharing for this space?": "Sind Sie sicher, dass Sie das öffentliche Teilen für diesen Bereich aktivieren möchten?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Sind Sie sicher, dass Sie das öffentliche Teilen deaktivieren möchten? Alle bestehenden Freigabelinks in diesem Bereich werden gelöscht.", + "Public sharing is disabled": "Öffentliches Teilen ist deaktiviert", + "Public sharing has been disabled at the workspace level.": "Das öffentliche Teilen wurde auf der Arbeitsbereichsebene deaktiviert.", + "Public sharing has been disabled for this space.": "Das öffentliche Teilen wurde für diesen Bereich deaktiviert.", + "Copy page": "Seite kopieren", + "Copy page to a different space.": "Seite in einen anderen Bereich kopieren.", + "Page copied successfully": "Seite erfolgreich kopiert", + "Page duplicated successfully": "Seite erfolgreich dupliziert", + "Find": "Suchen", + "Not found": "Nicht gefunden", + "Previous Match (Shift+Enter)": "Vorheriger Treffer (Umschalt+Eingabe)", + "Next match (Enter)": "Nächster Treffer (Eingabe)", + "Match case (Alt+C)": "Groß-/Kleinschreibung beachten (Alt+C)", + "Replace": "Ersetzen", + "Close (Escape)": "Schließen (Escape)", + "Replace (Enter)": "Ersetzen (Eingabe)", + "Replace all (Ctrl+Alt+Enter)": "Alle ersetzen (Strg+Alt+Eingabe)", + "Replace all": "Alle ersetzen", + "View all": "Alle anzeigen", + "View all spaces": "Alle Bereiche anzeigen", + "Error": "Fehler", + "Failed to disable MFA": "MFA konnte nicht deaktiviert werden", + "Disable two-factor authentication": "Zwei-Faktor-Authentifizierung deaktivieren", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Die Deaktivierung der Zwei-Faktor-Authentifizierung macht Ihr Konto weniger sicher. Sie benötigen nur Ihr Passwort, um sich anzumelden.", + "Please enter your password to disable two-factor authentication:": "Bitte geben Sie Ihr Passwort ein, um die Zwei-Faktor-Authentifizierung zu deaktivieren:", + "Two-factor authentication has been enabled": "Die Zwei-Faktor-Authentifizierung wurde aktiviert", + "Two-factor authentication has been disabled": "Die Zwei-Faktor-Authentifizierung wurde deaktiviert", + "2-step verification": "Bestätigung in zwei Schritten", + "Protect your account with an additional verification layer when signing in.": "Schützen Sie Ihr Konto mit einer zusätzlichen Verifizierungsschicht beim Anmelden.", + "Two-factor authentication is active on your account.": "Die Zwei-Faktor-Authentifizierung ist auf Ihrem Konto aktiv.", + "Add 2FA method": "2FA-Methode hinzufügen", + "Backup codes": "Backup-Codes", + "Disable": "Deaktivieren", + "Invalid verification code": "Ungültiger Bestätigungscode", + "New backup codes have been generated": "Neue Backup-Codes wurden erstellt", + "Failed to regenerate backup codes": "Backup-Codes konnten nicht neu erstellt werden", + "About backup codes": "Über Backup-Codes", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Sicherungscodes können verwendet werden, um auf Ihr Konto zuzugreifen, wenn Sie den Zugang zu Ihrer Authenticator-App verlieren. Jeder Code kann nur einmal verwendet werden.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "Sie können jederzeit neue Sicherungscodes generieren. Dies wird alle vorhandenen Codes ungültig machen.", + "Confirm password": "Passwort bestätigen", + "Generate new backup codes": "Neue Backup-Codes erstellen", + "Save your new backup codes": "Speichern Sie Ihre neuen Backup-Codes", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Speichern Sie diese Codes an einem sicheren Ort. Ihre alten Sicherungscodes sind nicht mehr gültig.", + "Your new backup codes": "Ihre neuen Backup-Codes", + "I've saved my backup codes": "Ich habe meine Backup-Codes gespeichert", + "Failed to setup MFA": "MFA konnte nicht eingerichtet werden", + "Setup & Verify": "Einrichten und bestätigen", + "Add to authenticator": "Zum Authenticator hinzufügen", + "1. Scan this QR code with your authenticator app": "1. Scannen Sie diesen QR-Code mit Ihrer Authenticator-App", + "Can't scan the code?": "Code kann nicht gescannt werden?", + "Enter this code manually in your authenticator app:": "Geben Sie diesen Code manuell in Ihrer Authenticator-App ein:", + "2. Enter the 6-digit code from your authenticator": "2. Geben Sie den 6-stelligen Code aus Ihrem Authenticator ein", + "Verify and enable": "Bestätigen und aktivieren", + "Failed to generate QR code. Please try again.": "Fehler beim Generieren des QR-Codes. Bitte versuchen Sie es erneut.", + "Backup": "Backup", + "Save codes": "Codes speichern", + "Save your backup codes": "Speichern Sie Ihre Backup-Codes", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Diese Codes können verwendet werden, um auf Ihr Konto zuzugreifen, wenn Sie den Zugang zu Ihrer Authenticator-App verlieren. Jeder Code kann nur einmal verwendet werden.", + "Print": "Drucken", + "Two-factor authentication has been set up. Please log in again.": "Zwei-Faktor-Authentifizierung wurde eingerichtet. Bitte melden Sie sich erneut an.", + "Two-Factor authentication required": "Zwei-Faktor-Authentifizierung erforderlich", + "Your workspace requires two-factor authentication for all users": "Ihr Workspace erfordert Zwei-Faktor-Authentifizierung für alle Benutzer", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Um weiterhin auf Ihren Arbeitsbereich zuzugreifen, müssen Sie die Zwei-Faktor-Authentifizierung einrichten. Dies fügt Ihrem Konto eine zusätzliche Sicherheitsebene hinzu.", + "Set up two-factor authentication": "Zwei-Faktor-Authentifizierung einrichten", + "Cancel and logout": "Abbrechen und abmelden", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Ihr Arbeitsbereich erfordert eine Zwei-Faktor-Authentifizierung. Bitte richten Sie diese ein, um fortzufahren.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Dadurch wird Ihrem Konto eine zusätzliche Sicherheitsebene hinzugefügt, indem ein Bestätigungscode von Ihrer Authenticator-App verlangt wird.", + "Password is required": "Passwort ist erforderlich", + "Password must be at least 8 characters": "Das Passwort muss mindestens 8 Zeichen lang sein", + "Please enter a 6-digit code": "Bitte geben Sie einen 6-stelligen Code ein", + "Code must be exactly 6 digits": "Der Code muss genau 6 Ziffern haben", + "Enter the 6-digit code found in your authenticator app": "Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein", + "Need help authenticating?": "Brauchen Sie Hilfe bei der Authentifizierung?", + "MFA QR Code": "MFA-QR-Code", + "Account created successfully. Please log in to set up two-factor authentication.": "Konto erfolgreich erstellt. Bitte melden Sie sich an, um die Zwei-Faktor-Authentifizierung einzurichten.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Passwort erfolgreich zurückgesetzt. Bitte melden Sie sich mit Ihrem neuen Passwort an und führen Sie die Zwei-Faktor-Authentifizierung durch.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Passwort erfolgreich zurückgesetzt. Bitte melden Sie sich mit Ihrem neuen Passwort an, um die Zwei-Faktor-Authentifizierung einzurichten.", + "Password reset was successful. Please log in with your new password.": "Passwort erfolgreich zurückgesetzt. Bitte melden Sie sich mit Ihrem neuen Passwort an.", + "Two-factor authentication": "Zwei-Faktor-Authentifizierung", + "Use authenticator app instead": "Stattdessen Authenticator-App verwenden", + "Verify backup code": "Backup-Code bestätigen", + "Use backup code": "Backup-Code verwenden", + "Enter one of your backup codes": "Geben Sie einen Ihrer Backup-Codes ein", + "Backup code": "Backup-Code", + "Enter one of your backup codes. Each backup code can only be used once.": "Geben Sie einen Ihrer Sicherungscodes ein. Jeder Sicherungscode kann nur einmal verwendet werden.", + "Verify": "Bestätigen", + "Trash": "Papierkorb", + "Pages in trash will be permanently deleted after {{count}} days.": "Seiten im Papierkorb werden nach {{count}} Tagen endgültig gelöscht.", + "Deleted": "Gelöscht", + "No pages in trash": "Keine Seiten im Papierkorb", + "Permanently delete page?": "Seite endgültig löschen?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Sind Sie sicher, dass Sie '{{title}}' endgültig löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "Restore '{{title}}' and its sub-pages?": "'{{title}}' und seine Unterseiten wiederherstellen?", + "Move to trash": "In den Papierkorb verschieben", + "Move this page to trash?": "Diese Seite in den Papierkorb verschieben?", + "Restore page": "Seite wiederherstellen", + "Permanently delete": "Endgültig löschen", + "{{name}} moved this page to Trash {{time}}.": "{{name}} hat diese Seite {{time}} in den Papierkorb verschoben.", + "Page moved to trash": "Seite in den Papierkorb verschoben", + "Page restored successfully": "Seite erfolgreich wiederhergestellt", + "Deleted by": "Gelöscht von", + "Deleted at": "Gelöscht am", + "Preview": "Vorschau", + "Base preview unavailable": "Basisvorschau nicht verfügbar", + "Restore this base to view its contents.": "Stelle diese Basis wieder her, um ihren Inhalt anzuzeigen.", + "Subpages": "Unterseiten", + "Failed to load subpages": "Unterseiten konnten nicht geladen werden", + "No subpages": "Keine Unterseiten", + "Subpages (Child pages)": "Unterseiten (untergeordnete Seiten)", + "List all subpages of the current page": "Alle Unterseiten der aktuellen Seite auflisten", + "Attachments": "Anhänge", + "All spaces": "Alle Bereiche", + "Unknown": "Unbekannt", + "Find a space": "Einen Bereich finden", + "Search in all your spaces": "In all Ihren Bereichen suchen", + "Type": "Typ", + "Enterprise": "Enterprise", + "Download attachment": "Anhang herunterladen", + "Allowed email domains": "Erlaubte E-Mail-Domains", + "Only users with email addresses from these domains can signup via SSO.": "Nur Benutzer mit E-Mail-Adressen aus diesen Domains können sich per SSO registrieren.", + "Enter valid domain names separated by comma or space": "Geben Sie gültige Domainnamen ein, getrennt durch Komma oder Leerzeichen", + "Enforce two-factor authentication": "Zwei-Faktor-Authentifizierung erzwingen", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Sobald es erzwungen wird, müssen alle Mitglieder die Zwei-Faktor-Authentifizierung aktivieren, um auf den Arbeitsbereich zugreifen zu können.", + "Toggle MFA enforcement": "MFA-Erzwingung umschalten", + "Display name": "Anzeigename", + "Allow signup": "Registrierung erlauben", + "Enabled": "Aktiviert", + "Advanced Settings": "Erweiterte Einstellungen", + "Enable TLS/SSL": "TLS/SSL aktivieren", + "Use secure connection to LDAP server": "Sichere Verbindung zum LDAP-Server verwenden", + "Group sync": "Gruppensynchronisierung", + "No SSO providers found.": "Keine SSO-Anbieter gefunden.", + "Delete SSO provider": "SSO-Anbieter löschen", + "Are you sure you want to delete this SSO provider?": "Sind Sie sicher, dass Sie diesen SSO-Anbieter löschen möchten?", + "Action": "Aktion", + "{{ssoProviderType}} configuration": "{{ssoProviderType}}-Konfiguration", + "Icon": "Symbol", + "Upload image": "Bild hochladen", + "Remove image": "Bild entfernen", + "Failed to remove image": "Fehler beim Entfernen des Bildes", + "Image exceeds 10MB limit.": "Bild überschreitet das Limit von 10 MB.", + "Image removed successfully": "Bild erfolgreich entfernt", + "API key": "API-Schlüssel", + "API keys": "API-Schlüssel", + "API management": "API-Verwaltung", + "Custom expiration date": "Benutzerdefiniertes Ablaufdatum", + "Enter a descriptive token name": "Geben Sie einen beschreibenden Token-Namen ein", + "Expiration": "Ablauf", + "Expired": "Abgelaufen", + "Expires": "Läuft ab", + "Last use": "Zuletzt verwendet", + "No API keys found": "Keine API-Schlüssel gefunden", + "No expiration": "Kein Ablauf", + "Revoked successfully": "Erfolgreich widerrufen", + "Select expiration date": "Ablaufdatum wählen", + "This action cannot be undone. Any applications using this API key will stop working.": "Diese Aktion kann nicht rückgängig gemacht werden. Alle Anwendungen, die diesen API-Schlüssel verwenden, werden nicht mehr funktionieren.", + "Update": "Aktualisieren", + "Update {{credential}}": "{{credential}} aktualisieren", + "Manage API keys for all users in the workspace": "Verwalten Sie API-Schlüssel für alle Benutzer im Arbeitsbereich", + "Restrict API key creation to admins": "API-Schlüsselerstellung auf Administratoren beschränken", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Nur Administratoren und Eigentümer können neue API-Schlüssel erstellen. Bestehende Mitgliederschlüssel funktionieren weiterhin.", + "Toggle restrict API keys to admins": "Beschränkung der API-Schlüssel auf Administratoren umschalten", + "API key creation is restricted to admins by your workspace administrator.": "Die Erstellung von API-Schlüsseln ist durch Ihren Workspace-Administrator auf Administratoren beschränkt.", + "AI settings": "KI-Einstellungen", + "AI search": "KI-Suche", + "AI Answer": "KI-Antwort", + "Ask AI": "KI fragen", + "AI is thinking...": "Die KI überlegt...", + "Thinking": "Denkt nach", + "Ask a question...": "Fragen stellen...", + "AI Answers": "KI-Antworten", + "AI-powered search (AI Answers)": "KI-unterstützte Suche (KI-Antworten)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "Die KI-Suche verwendet Vektor-Einbettungen, um semantische Suchfunktionen in Ihrem Arbeitsbereich bereitzustellen.", + "Toggle AI search": "KI-Suche umschalten", + "Generative AI (Ask AI)": "Generative KI (KI fragen)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Aktivieren Sie die KI-unterstützte Inhaltserstellung im Editor. Ermöglicht Benutzern das Erzeugen, Verbessern, Übersetzen und Transformieren von Text.", + "Toggle generative AI": "Generative KI umschalten", + "Upgrade your plan": "Upgrade Ihres Plans", + "Available with a paid license": "Verfügbar mit einer kostenpflichtigen Lizenz", + "Upgrade your license tier.": "Stufen Sie Ihre Lizenz hoch.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "KI ist in den kostenpflichtigen Docmost-Editionen verfügbar. Kontaktieren Sie sales@docmost.com.", + "AI & MCP": "KI & MCP", + "AI": "KI", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Model Context Protocol (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Aktivieren Sie den MCP-Server, damit KI-Assistenten und -Tools mit den Inhalten Ihres Arbeitsbereichs interagieren können.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP ist nur in der Docmost Enterprise-Edition verfügbar. Kontaktieren Sie sales@docmost.com.", + "MCP Server URL": "MCP-Server-URL", + "Connect AI assistants with your Docmost account via OAuth.": "Verbinde AI-Assistenten über OAuth mit deinem Docmost-Konto.", + "Enforce OAuth": "OAuth erzwingen", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI-Assistenten müssen sich über OAuth mit einem Docmost-Konto verbinden. API-Schlüssel können nicht mit dem MCP-Server verwendet werden.", + "Toggle enforce OAuth for MCP": "OAuth-Erzwingung für MCP umschalten", + "Supported tools": "Unterstützte Tools", + "MCP server URL:": "MCP-Server-URL:", + "Learn more": "Mehr erfahren", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Verwalten Sie API-Schlüssel für alle Nutzer im Arbeitsbereich. Siehe die API-Dokumentation für Details zur Verwendung.", + "View the API documentation for usage details.": "Siehe die API-Dokumentation für Details zur Verwendung.", + "View the MCP documentation.": "Sehen Sie die MCP-Dokumentation ein.", + "Sources": "Quellen", + "AI Answers not available for attachments": "KI-Antworten sind für Anhänge nicht verfügbar", + "No answer available": "Keine Antwort verfügbar", + "Background color": "Hintergrundfarbe", + "Highlight color": "Hervorhebungsfarbe", + "Remove color": "Farbe entfernen", + "Notifications": "Benachrichtigungen", + "No notifications": "Keine Benachrichtigungen", + "No unread notifications": "Keine ungelesenen Benachrichtigungen", + "All notifications": "Alle Benachrichtigungen", + "Unread only": "Nur ungelesen", + "Mark all as read": "Alle als gelesen markieren", + "Mark as read": "Als gelesen markieren", + "More options": "Weitere Optionen", + "{{name}} mentioned you in a comment": "{{name}} hat Sie in einem Kommentar erwähnt", + "{{name}} commented on a page": "{{name}} hat einen Kommentar auf einer Seite hinterlassen", + "{{name}} resolved a comment": "{{name}} hat einen Kommentar gelöst", + "{{name}} mentioned you on a page": "{{name}} hat Sie auf einer Seite erwähnt", + "{{name}} gave you edit access to a page": "{{name}} hat Ihnen Bearbeitungszugriff auf eine Seite gegeben", + "{{name}} gave you view access to a page": "{{name}} hat Ihnen Ansichtszugriff auf eine Seite gegeben", + "{{name}} updated a page": "{{name}} hat eine Seite aktualisiert", + "Watch page": "Seite beobachten", + "Stop watching": "Nicht mehr beobachten", + "Watch space": "Bereich beobachten", + "Stop watching space": "Bereich nicht mehr beobachten", + "Email notifications": "E-Mail-Benachrichtigungen", + "Page updates": "Seitenaktualisierungen", + "Get notified when pages you watch are updated.": "Erhalten Sie eine Benachrichtigung, wenn Seiten, die Sie beobachten, aktualisiert werden.", + "Page mentions": "Seiten-Erwähnungen", + "Get notified when someone mentions you on a page.": "Erhalten Sie eine Benachrichtigung, wenn Sie jemand auf einer Seite erwähnt.", + "Comment mentions": "Kommentar-Erwähnungen", + "Get notified when someone mentions you in a comment.": "Erhalten Sie eine Benachrichtigung, wenn Sie jemand in einem Kommentar erwähnt.", + "New comments": "Neue Kommentare", + "Get notified about new comments on threads you participate in.": "Erhalten Sie eine Benachrichtigung über neue Kommentare in Threads, an denen Sie teilnehmen.", + "Resolved comments": "Erledigte Kommentare", + "Get notified when your comment is resolved.": "Erhalten Sie eine Benachrichtigung, wenn Ihr Kommentar erledigt wurde.", + "You are now watching this page": "Sie beobachten diese Seite jetzt", + "You are no longer watching this page": "Sie beobachten diese Seite nicht mehr", + "You are now watching this space": "Sie beobachten diesen Bereich jetzt", + "You are no longer watching this space": "Sie beobachten diesen Bereich nicht mehr", + "Direct": "Direkt", + "Updates": "Aktualisierungen", + "Today": "Heute", + "Yesterday": "Gestern", + "This week": "Diese Woche", + "Older": "Älter", + "Restricted page": "Eingeschränkte Seite", + "Restricted pages cannot be shared publicly.": "Eingeschränkte Seiten können nicht öffentlich geteilt werden.", + "Restricted by parent": "Eingeschränkt durch die übergeordnete Seite", + "Restricted": "Eingeschränkt", + "Open": "Offen", + "Inherits restrictions from ancestor page": "Erbt Einschränkungen von einer übergeordneten Seite", + "Only people listed below can access this page": "Nur die unten aufgeführten Personen können auf diese Seite zugreifen.", + "Everyone in this space can access": "Jeder in diesem Bereich kann darauf zugreifen.", + "No additional restrictions on this page": "Keine zusätzlichen Einschränkungen auf dieser Seite", + "Only specific people can access": "Nur bestimmte Personen können zugreifen", + "Use only inherited restrictions": "Nur geerbte Einschränkungen verwenden", + "Add restrictions on top of inherited": "Einschränkungen zusätzlich zu den geerbten hinzufügen", + "Inherited restriction": "Geerbte Einschränkung", + "Access limited by": "Zugriff beschränkt durch", + "Restrict access to control who can view and edit this page": "Beschränken Sie den Zugriff, um festzulegen, wer diese Seite ansehen und bearbeiten kann.", + "Add additional restrictions specific to this page": "Fügen Sie zusätzliche, für diese Seite spezifische Einschränkungen hinzu.", + "Access": "Zugriff", + "People with access": "Personen mit Zugriff", + "Remove all": "Alle entfernen", + "Remove access": "Zugriff entfernen", + "Remove all access": "Alle Zugriffsrechte entfernen", + "Are you sure you want to remove this member's access to the page?": "Sind Sie sicher, dass Sie den Zugriff dieses Mitglieds auf die Seite entfernen möchten?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Sind Sie sicher, dass Sie alle spezifischen Zugriffsrechte entfernen möchten? Dadurch wird die Seite für alle in diesem Bereich zugänglich.", + "Trash retention": "Aufbewahrungsdauer des Papierkorbs", + "Pages in trash will be permanently deleted after this period.": "Seiten im Papierkorb werden nach Ablauf dieses Zeitraums endgültig gelöscht.", + "Trash retention updated": "Aufbewahrungsdauer des Papierkorbs aktualisiert", + "Failed to update trash retention": "Aktualisierung der Aufbewahrungsdauer des Papierkorbs fehlgeschlagen", + "Removed page restriction": "Seitenbeschränkung entfernt", + "Added page permission": "Seitenberechtigung hinzugefügt", + "Removed page permission": "Seitenberechtigung entfernt", + "Changed page permission": "Seitenberechtigung geändert", + "Requested password reset": "Zurücksetzen des Passworts angefordert", + "Created template": "Vorlage erstellt", + "Deleted template": "Vorlage gelöscht", + "day": "Tag", + "days": "Tage", + "week": "Woche", + "weeks": "Wochen", + "month": "Monat", + "months": "Monate", + "year": "Jahr", + "years": "Jahre", + "Period": "Zeitraum", + "Fixed date": "Festes Datum", + "Indefinitely": "Unbegrenzt", + "Days": "Tage", + "Weeks": "Wochen", + "Months": "Monate", + "Years": "Jahre", + "Pick a date": "Datum auswählen", + "Maximum is {{max}} {{unit}} for this unit": "Das Maximum für diese Einheit beträgt {{max}} {{unit}}", + "Never expires. Verifiers can re-verify at any time.": "Läuft nie ab. Prüfer können die Seite jederzeit erneut verifizieren.", + "Verified": "Verifiziert", + "Review needed": "Prüfung erforderlich", + "Verification expired": "Verifizierung abgelaufen", + "Draft": "Entwurf", + "In Approval": "In Genehmigung", + "In approval": "In Genehmigung", + "Approved": "Genehmigt", + "Obsolete": "Veraltet", + "Expiring": "Läuft bald ab", + "Set up verification": "Verifizierung einrichten", + "Verify page": "Seite verifizieren", + "Page verification": "Seitenverifizierung", + "Add verification": "Verifizierung hinzufügen", + "Edit verification": "Verifizierung bearbeiten", + "Search by title": "Nach Titel suchen", + "Choose how this page should stay accurate.": "Wählen Sie aus, wie diese Seite aktuell gehalten werden soll.", + "Recurring verification": "Wiederkehrende Verifizierung", + "Verifiers re-confirm this page on a schedule.": "Prüfer bestätigen diese Seite nach einem Zeitplan erneut.", + "Re-verify on a schedule (e.g every 30 days )": "Nach einem Zeitplan erneut verifizieren (z. B. alle 30 Tage)", + "Page stays editable at all times": "Die Seite bleibt jederzeit bearbeitbar", + "Best for runbooks, FAQs, living documentation": "Am besten für Runbooks, FAQs und lebende Dokumentation geeignet", + "Approval workflow": "Genehmigungsworkflow", + "Formal document lifecycle with named approvers.": "Formaler Dokumentenlebenszyklus mit benannten Genehmigern.", + "Draft → In approval → Approved → Obsolete": "Entwurf → In Genehmigung → Genehmigt → Veraltet", + "Locked once approved, with full history": "Nach der Genehmigung gesperrt, mit vollständiger Historie", + "Designed for ISO 9001, ISO 13485, and FDA": "Entwickelt für ISO 9001, ISO 13485 und FDA", + "Best for SOPs and controlled documents": "Am besten für SOPs und kontrollierte Dokumente geeignet", + "Back": "Zurück", + "Quality management": "Qualitätsmanagement", + "Recurring": "Wiederkehrend", + "Pages move through draft, approval, and approved stages.": "Seiten durchlaufen die Phasen Entwurf, Genehmigung und Genehmigt.", + "Verifiers": "Prüfer", + "Add verifier": "Prüfer hinzufügen", + "I've reviewed this page for accuracy": "Ich habe diese Seite auf Richtigkeit geprüft", + "Set up": "Einrichten", + "Remove verification": "Verifizierung entfernen", + "Are you sure you want to remove verification from this page?": "Möchten Sie die Verifizierung wirklich von dieser Seite entfernen?", + "Assigned verifiers must periodically re-verify this page.": "Zugewiesene Prüfer müssen diese Seite regelmäßig erneut verifizieren.", + "Last verified by {{name}} {{time}} (expired)": "Zuletzt von {{name}} {{time}} verifiziert (abgelaufen)", + "The fixed expiration date has passed.": "Das feste Ablaufdatum ist überschritten.", + "Verified by {{name}} {{time}}": "Verifiziert von {{name}} {{time}}", + "Expires {{date}}": "Läuft ab am {{date}}", + "Expired {{date}}": "Abgelaufen am {{date}}", + "Mark as obsolete": "Als veraltet markieren", + "Mark obsolete": "Als veraltet markieren", + "Returned by {{name}} {{time}}": "Zurückgegeben von {{name}} {{time}}", + "No approval has been requested yet.": "Es wurde noch keine Genehmigung angefordert.", + "Submitted by {{name}} {{time}}": "Eingereicht von {{name}} {{time}}", + "Someone": "Jemand", + "Approved by {{name}} {{time}}": "Genehmigt von {{name}} {{time}}", + "This document has been marked as obsolete.": "Dieses Dokument wurde als veraltet markiert.", + "Rejection comment": "Ablehnungskommentar", + "Reason for returning this document...": "Grund für die Rückgabe dieses Dokuments...", + "Confirm rejection": "Ablehnung bestätigen", + "Submit for approval": "Zur Genehmigung einreichen", + "Reject": "Ablehnen", + "Approve": "Genehmigen", + "Re-submit for approval": "Erneut zur Genehmigung einreichen", + "Verified until": "Verifiziert bis", + "QMS": "QMS", + "Verified pages": "Verifizierte Seiten", + "Search pages...": "Seiten suchen...", + "Filter by space": "Nach Bereich filtern", + "Filter by type": "Nach Typ filtern", + "{{name}} verified a page": "{{name}} hat eine Seite verifiziert", + "{{name}} submitted a page for your approval": "{{name}} hat eine Seite zu Ihrer Genehmigung eingereicht", + "{{name}} returned a page for revision": "{{name}} hat eine Seite zur Überarbeitung zurückgegeben", + "Page verification expires soon": "Die Seitenverifizierung läuft bald ab", + "Page verification has expired": "Die Seitenverifizierung ist abgelaufen", + "SIEM destination {{name}} is failing": "SIEM-Ziel {{name}} schlägt fehl", + "SIEM destination {{name}} was disabled after 24 hours of failures": "SIEM-Ziel {{name}} wurde nach 24 Stunden mit Fehlern deaktiviert", + "SIEM destination {{name}} recovered": "SIEM-Ziel {{name}} wurde wiederhergestellt", + "Verifying your email": "Ihre E-Mail wird bestätigt", + "Please wait...": "Bitte warten...", + "Verification failed. The link may have expired.": "Überprüfung fehlgeschlagen. Der Link ist möglicherweise abgelaufen.", + "Check your email": "Prüfen Sie Ihre E-Mails", + "We sent a verification link to {{email}}.": "Wir haben einen Bestätigungslink an {{email}} gesendet.", + "We sent a verification link to your email.": "Wir haben einen Bestätigungslink an Ihre E-Mail-Adresse gesendet.", + "Click the link to verify your email and access your workspace.": "Klicken Sie auf den Link, um Ihre E-Mail zu bestätigen und auf Ihren Arbeitsbereich zuzugreifen.", + "Resend verification email": "Bestätigungs-E-Mail erneut senden", + "Verification email sent. Please check your inbox.": "Bestätigungs-E-Mail gesendet. Bitte überprüfen Sie Ihr Postfach.", + "Failed to resend verification email. Please try again.": "Fehler beim erneuten Senden der Bestätigungs-E-Mail. Bitte versuchen Sie es erneut.", + "We've sent you an email with your associated workspaces.": "Wir haben Ihnen eine E-Mail mit Ihren zugehörigen Arbeitsbereichen gesendet.", + "Load more": "Mehr laden", + "Log out of all devices": "Auf allen Geräten abmelden", + "Log out of all sessions except this device": "Von allen Sitzungen außer diesem Gerät abmelden", + "This Device": "Dieses Gerät", + "Unknown device": "Unbekanntes Gerät", + "No active sessions": "Keine aktiven Sitzungen", + "Session revoked": "Sitzung widerrufen", + "All other sessions revoked": "Alle anderen Sitzungen widerrufen", + "Last used": "Zuletzt verwendet", + "Created": "Erstellt", + "Rename": "Umbenennen", + "Publish": "Veröffentlichen", + "Security": "Sicherheit", + "Enforce SSO": "SSO erzwingen", + "Once enforced, members will not be able to login with email and password.": "Sobald dies erzwungen wird, können sich Mitglieder nicht mehr mit E-Mail und Passwort anmelden.", + "AI-generated content may not be accurate.": "KI-generierte Inhalte sind möglicherweise nicht korrekt.", + "AI Chat": "KI-Chat", + "Analyze for insights": "Für Erkenntnisse analysieren", + "Ask anything...": "Fragen Sie irgendetwas...", + "Assistant said:": "Assistent sagte:", + "Chat history": "Chatverlauf", + "Chat name": "Chatname", + "Chat transcript": "Chatprotokoll", + "Close": "Schließen", + "Copy assistant response": "Antwort des Assistenten kopieren", + "Docmost AI": "Docmost KI", + "Failed to load chat. An error occurred.": "Chat konnte nicht geladen werden. Ein Fehler ist aufgetreten.", + "Failed to render this message.": "Diese Nachricht konnte nicht dargestellt werden.", + "How can I help you today?": "Wie kann ich Ihnen heute helfen?", + "New chat": "Neuer Chat", + "No chat history": "Kein Chatverlauf", + "No chats found": "Keine Chats gefunden", + "No conversations yet": "Noch keine Unterhaltungen", + "Open full page": "Ganze Seite öffnen", + "Scroll to bottom": "Nach unten scrollen", + "You said:": "Sie sagten:", + "Previous 7 days": "Letzte 7 Tage", + "Previous 30 days": "Letzte 30 Tage", + "Search chats...": "Chats durchsuchen...", + "Search chats": "Chats durchsuchen", + "Ask anything... Use @ to mention pages": "Frag etwas ... Verwende @, um Seiten zu erwähnen", + "Ask anything or search your workspace": "Fragen Sie etwas oder durchsuchen Sie Ihren Workspace", + "Welcome to {{name}}": "Willkommen bei {{name}}", + "Add files": "Dateien hinzufügen", + "Mention a page": "Eine Seite einfügen", + "Start a new chat to see it here.": "Starten Sie einen neuen Chat, damit er hier angezeigt wird.", + "Summarize this page": "Diese Seite zusammenfassen", + "Toggle AI Chat": "KI-Chat umschalten", + "Translate this page": "Diese Seite übersetzen", + "Try a different search term.": "Versuchen Sie einen anderen Suchbegriff.", + "Try again": "Erneut versuchen", + "Untitled chat": "Chat ohne Titel", + "What can I help you with?": "Womit kann ich Ihnen helfen?", + "Are you sure you want to revoke this {{credential}}": "Sind Sie sicher, dass Sie diese(n) {{credential}} widerrufen möchten?", + "Automatically provision users and groups from your identity provider via SCIM.": "Stellen Sie Benutzer und Gruppen automatisch über SCIM von Ihrem Identitätsanbieter bereit.", + "Configure your identity provider with this URL to provision users and groups.": "Konfigurieren Sie Ihren Identitätsanbieter mit dieser URL, um Benutzer und Gruppen bereitzustellen.", + "Create {{credential}}": "{{credential}} erstellen", + "{{credential}} created": "{{credential}} erstellt", + "{{credential}} created successfully": "{{credential}} erfolgreich erstellt", + "Created by": "Erstellt von", + "Custom": "Benutzerdefiniert", + "Enable SCIM": "SCIM aktivieren", + "Enter a descriptive name": "Geben Sie einen beschreibenden Namen ein", + "I've saved my {{credential}}": "Ich habe meine(n) {{credential}} gespeichert", + "Important": "Wichtig", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Stellen Sie sicher, dass Sie Ihre(n) {{credential}} jetzt kopieren. Sie können sie/ihn später nicht erneut anzeigen!", + "Never": "Nie", + "Revoke {{credential}}": "{{credential}} widerrufen", + "SCIM endpoint URL": "SCIM-Endpunkt-URL", + "SCIM provisioning": "SCIM-Bereitstellung", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM hat Vorrang vor der SSO-Gruppensynchronisierung, solange es aktiviert ist.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "Sie haben die maximale Anzahl von {{max}} SCIM-Token erreicht. Löschen Sie ein vorhandenes Token, um ein neues zu erstellen.", + "SCIM token": "SCIM-Token", + "SCIM tokens": "SCIM-Token", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Diese Aktion kann nicht rückgängig gemacht werden. Ihr Identitätsanbieter wird die Synchronisierung sofort beenden.", + "Toggle SCIM provisioning": "SCIM-Bereitstellung umschalten", + "Token": "Token", + "Page menu": "Seitenmenü", + "Expand": "Erweitern", + "Collapse": "Reduzieren", + "Comment menu": "Kommentarmenü", + "Group menu": "Gruppenmenü", + "Show hidden breadcrumbs": "Ausgeblendete Breadcrumbs anzeigen", + "Breadcrumbs": "Navigationspfade", + "Page actions": "Seitenaktionen", + "Pick emoji": "Emoji auswählen", + "Template menu": "Vorlagenmenü", + "Use": "Verwenden", + "Use template": "Vorlage verwenden", + "Preview template: {{title}}": "Vorlage anzeigen: {{title}}", + "Use a template": "Eine Vorlage verwenden", + "Search templates...": "Vorlagen suchen...", + "Search spaces...": "Bereiche suchen...", + "No templates found": "Keine Vorlagen gefunden", + "No spaces found": "Keine Bereiche gefunden", + "Browse all templates": "Alle Vorlagen durchsuchen", + "This space": "Dieser Bereich", + "All templates": "Alle Vorlagen", + "Global": "Global", + "New template": "Neue Vorlage", + "Edit template": "Vorlage bearbeiten", + "Are you sure you want to delete this template?": "Sind Sie sicher, dass Sie diese Vorlage löschen möchten?", + "Template scope updated": "Vorlagenbereich aktualisiert", + "Choose which space this template belongs to": "Wählen Sie den Bereich aus, zu dem diese Vorlage gehört", + "Only workspace admins can create global templates.": "Nur Workspace-Admins können globale Vorlagen erstellen.", + "You need edit access to this space to create templates.": "Sie benötigen Bearbeitungszugriff auf diesen Space, um Vorlagen zu erstellen.", + "Scope": "Bereich", + "Select scope": "Bereich auswählen", + "Title": "Titel", + "Saving...": "Wird gespeichert...", + "Saved": "Gespeichert", + "Save failed. Retry": "Speichern fehlgeschlagen. Erneut versuchen", + "By {{name}}": "Von {{name}}", + "Updated {{time}}": "Aktualisiert {{time}}", + "Choose destination": "Ziel auswählen", + "Search pages and spaces...": "Seiten und Bereiche suchen...", + "No results found": "Keine Ergebnisse gefunden", + "You don't have permission to create pages here": "Sie haben hier keine Berechtigung, Seiten zu erstellen", + "Chat menu for {{title}}": "Chat-Menü für {{title}}", + "API key menu": "API-Schlüssel-Menü", + "Jump to comment selection": "Zur Kommentarauswahl springen", + "Slash commands": "Slash-Befehle", + "Mention suggestions": "Erwähnungsvorschläge", + "Link suggestions": "Linkvorschläge", + "Diagram editor": "Diagrammeditor", + "Add comment": "Kommentar hinzufügen", + "Find and replace": "Suchen und ersetzen", + "Main navigation": "Hauptnavigation", + "Space navigation": "Bereichsnavigation", + "Settings navigation": "Einstellungsnavigation", + "AI navigation": "KI-Navigation", + "Breadcrumb": "Navigationspfad", + "Synced block": "Synchronisierter Block", + "Create a block that stays in sync across pages.": "Erstellt einen Block der über mehrere Seiten synchronisiert wird", + "Editing original": "Original bearbeiten", + "Copy synced block": "Synchronisierten Block kopieren", + "Unsync": "Synchronisierung aufheben", + "Delete synced block": "Synchronisierten Block löschen", + "Synced to {{count}} other page_one": "Mit {{count}} anderer Seite synchronisiert", + "Synced to {{count}} other page_other": "Mit {{count}} anderen Seiten synchronisiert", + "ORIGINAL": "ORIGINAL", + "THIS PAGE": "DIESE SEITE", + "No pages": "Keine Seiten", + "The original synced block no longer exists": "Der originale synchronisierte Block existiert nicht mehr", + "You don't have access to this synced block": "Sie haben keinen Zugriff auf diesen synchronisierten Block", + "Failed to load this synced block": "Dieser synchronisierte Block konnte nicht geladen werden", + "Fixed editor toolbar": "Fixierte Editor-Symbolleiste", + "Show a formatting toolbar above the editor with quick access to common actions.": "Anzeige einer Formatierungs-Symbolleiste über dem Editor für schnellen Zugriff auf Aktionen.", + "Toggle fixed editor toolbar": "Fixierte Editor-Symbolleiste ein/aus", + "Normal text": "Normaler Text", + "More inline formatting": "Weitere Formatierung", + "Subscript": "Tiefgestellt", + "Superscript": "Hochgestellt", + "Inline code": "Inline-Code", + "Insert media": "Medien einfügen", + "Mention": "Erwähnung", + "Emoji": "Emoji", + "Columns": "Spalten", + "More inserts": "Weiteren Inhalt einfügen", + "Embeds": "Einbettungen", + "Diagrams": "Diagramme", + "Advanced": "Erweitert", + "Utility": "Dienstprogramme", + "Decrease indent": "Einzug verkleinern", + "Increase indent": "Einzug vergrößern", + "Clear formatting": "Formatierung zurücksetzen", + "Code block": "Codeblock", + "Experimental": "Experimentell", + "Strikethrough": "Durchgestrichen", + "Undo": "Rückgängig", + "Redo": "Wiederholen", + "Backlinks": "Rückverweise", + "Last updated by": "Zuletzt aktualisiert von", + "Last updated": "Zuletzt aktualisiert", + "Stats": "Statistiken", + "Word count": "Wörter", + "Characters": "Zeichen", + "Incoming links": "Eingehende Links", + "Outgoing links": "Ausgehende Links", + "Incoming links ({{count}})": "Eingehende Links ({{count}})", + "Outgoing links ({{count}})": "Ausgehende Links ({{count}})", + "No pages link here yet.": "Aktuell verlinken keine Seiten hierher.", + "This page doesn't link to other pages yet.": "Diese Seite verlinkt noch nicht auf andere Seiten.", + "Verified until {{date}}": "Verifiziert bis zum {{date}}", + "Labels": "Beschriftungen", + "Add label": "Beschriftung hinzufügen", + "No labels yet": "Noch keine Beschriftungen", + "Already added": "Bereits hinzugefügt", + "Invalid label name": "Ungültiger Beschriftungsname", + "No matches": "Keine Treffer", + "Search or create…": "Suchen oder erstellen…", + "Remove label {{name}}": "Beschriftung {{name}} entfernen", + "Failed to add label": "Beschriftung konnte nicht hinzugefügt werden", + "Failed to remove label": "Beschriftung konnte nicht entfernt werden", + "No pages with this label": "Keine Seiten mit dieser Beschriftung", + "Pages tagged with this label will appear here.": "Hier werden Seiten angezeigt, die mit dieser Beschriftung versehen sind.", + "No pages match your search.": "Es konnten keine Seiten gefunden werden, die mit Ihrer Suche übereinstimmen.", + "Updated {{date}}": "Aktualisiert am {{date}}", + "Cell actions": "Zellaktionen", + "Column actions": "Spaltenaktionen", + "Row actions": "Zeilenaktionen", + "Filter": "Filter", + "Page title": "Seitentitel", + "Page content": "Seiteninhalt", + "Member actions for {{name}}": "Mitgliederaktionen für {{name}}", + "Toggle password visibility": "Passwortsichtbarkeit umschalten", + "Send comment": "Kommentar senden", + "Token actions": "Token-Aktionen", + "Template settings": "Vorlageneinstellungen", + "Edit diagram": "Diagramm bearbeiten", + "Edit embed": "Einbettung bearbeiten", + "Edit drawing": "Zeichnung bearbeiten", + "Delete equation": "Gleichung löschen", + "Invite actions": "Einladungsaktionen", + "Get started": "Erste Schritte", + "* indicates required fields": "* kennzeichnet Pflichtfelder", + "List of spaces in this workspace": "Liste der Bereiche in diesem Workspace", + "Active sessions": "Aktive Sitzungen", + "Add {{name}} to favorites": "{{name}} zu Favoriten hinzufügen", + "Remove {{name}} from favorites": "{{name}} aus Favoriten entfernen", + "Added to favorites": "Zu Favoriten hinzugefügt", + "Removed from favorites": "Aus Favoriten entfernt", + "Added {{name}} to favorites": "{{name}} zu Favoriten hinzugefügt", + "Removed {{name}} from favorites": "{{name}} aus Favoriten entfernt", + "Page menu for {{name}}": "Seitenmenü für {{name}}", + "Create subpage of {{name}}": "Unterseite von {{name}} erstellen", + "Allow personal spaces": "Persönliche Bereiche erlauben", + "Members can create their own personal space.": "Mitglieder können ihren eigenen persönlichen Bereich erstellen.", + "Toggle allow personal spaces": "Persönliche Bereiche erlauben umschalten", + "Create personal space": "Persönlichen Bereich erstellen", + "Personal space": "Persönlicher Bereich", + "{{name}}'s space": "Bereich von {{name}}", + "Apply": "Anwenden", + "Cells that aren't already a page reference will be cleared.": "Zellen, die noch keine Seitenreferenz sind, werden geleert.", + "Cells that aren't a valid URL will be cleared.": "Zellen, die keine gültige URL sind, werden geleert.", + "Cells that aren't a valid email address will be cleared.": "Zellen, die keine gültige E-Mail-Adresse sind, werden geleert.", + "Cells that can't be parsed as a date will be cleared.": "Zellen, die nicht als Datum geparst werden können, werden geleert.", + "Cells that can't be parsed as a number will be cleared.": "Zellen, die nicht als Zahl geparst werden können, werden geleert.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Zellen werden umgewandelt (yes/true/1 werden als ausgewählt markiert; alles andere wird als nicht ausgewählt markiert oder geleert).", + "Cells will be reinterpreted under the new type.": "Zellen werden unter dem neuen Typ neu interpretiert.", + "Cells will be replaced with a comma-separated list of file names.": "Zellen werden durch eine kommagetrennte Liste von Dateinamen ersetzt.", + "Cells will be replaced with a comma-separated list of option names.": "Zellen werden durch eine kommagetrennte Liste von Optionsnamen ersetzt.", + "Cells will be replaced with the option name.": "Zellen werden durch den Optionsnamen ersetzt.", + "Cells will be replaced with the page title.": "Zellen werden durch den Seitentitel ersetzt.", + "Cells will be replaced with the person's name.": "Zellen werden durch den Namen der Person ersetzt.", + "Change type": "Typ ändern", + "Change type to {{label}}?": "Typ in {{label}} ändern?", + "Converting…": "Wird umgewandelt…", + "Existing values become single-item lists. No data is lost.": "Vorhandene Werte werden zu Einzellisten. Es gehen keine Daten verloren.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Nur das erste ausgewählte Element pro Zeile wird beibehalten; der Rest wird verworfen.", + "Previous record": "Vorheriger Datensatz", + "Next record": "Nächster Datensatz", + "Record actions": "Datensatzaktionen", + "Delete record": "Datensatz löschen", + "Delete record?": "Datensatz löschen?", + "This action cannot be undone.": "Diese Aktion kann nicht rückgängig gemacht werden.", + "to navigate": "zum Navigieren", + "to close": "zum Schließen", + "Expand row {{number}}": "Zeile {{number}} erweitern", + "Saving…": "Wird gespeichert…", + "Read-only": "Schreibgeschützt", + "Loading…": "Wird geladen…", + "Updated {{when}}": "Aktualisiert {{when}}", + "Add property": "Eigenschaft hinzufügen", + "Create property": "Eigenschaft erstellen", + "Hide properties": "Eigenschaften ausblenden", + "Find a property type": "Einen Eigenschaftstyp finden", + "Properties": "Eigenschaften", + "A property with this name already exists": "Eine Eigenschaft mit diesem Namen existiert bereits", + "Add card": "Karte hinzufügen", + "Add filter": "Filter hinzufügen", + "Add option": "Option hinzufügen", + "Add sort": "Sortierung hinzufügen", + "Add view": "Ansicht hinzufügen", + "All data in this column will be lost.": "Alle Daten in dieser Spalte gehen verloren.", + "Allow multiple people": "Mehrere Personen zulassen", + "Alphabetize": "Alphabetisch sortieren", + "Are you sure you want to delete": "Sind Sie sicher, dass Sie löschen möchten", + "Ascending": "Aufsteigend", + "Base deleted": "Base gelöscht", + "Base name": "Base-Name", + "Base table": "Base-Tabelle", + "Card properties": "Karteneigenschaften", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Zellen, die das Textlimit überschreiten, werden abgeschnitten und der zusätzliche Inhalt geht dauerhaft verloren.", + "Checkbox": "Kontrollkästchen", + "Checked by default": "Standardmäßig aktiviert", + "Choose a property": "Wählen Sie eine Eigenschaft", + "Clear selection": "Auswahl aufheben", + "Column options": "Spaltenoptionen", + "Comma, period": "Komma, Punkt", + "Complete": "Abgeschlossen", + "Contains": "Enthält", + "Copy link to view": "Link zur Ansicht kopieren", + "Create a status property": "Eine Statuseigenschaft erstellen", + "Created at": "Erstellt am", + "Currency": "Währung", + "Decimal places": "Dezimalstellen", + "Default value": "Standardwert", + "Delete property": "Eigenschaft löschen", + "Delete view": "Ansicht löschen", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Absteigend", + "Discard": "Verwerfen", + "Doesn't contain": "Enthält nicht", + "Done": "Fertig", + "Edit formula": "Formel bearbeiten", + "Edit property": "Eigenschaft bearbeiten", + "Export CSV": "CSV exportieren", + "Failed to load base": "Base konnte nicht geladen werden", + "False": "Falsch", + "File": "Datei", + "Filter and sort changes are visible only to you": "Änderungen an Filtern und Sortierungen sind nur für Sie sichtbar", + "Filter by": "Filtern nach", + "Formula": "Formel", + "Get started with": "Erste Schritte mit", + "Greater than": "Größer als", + "Group by": "Gruppieren nach", + "Group this board by a select or status property.": "Gruppieren Sie dieses Board nach einer Auswahl- oder Statuseigenschaft.", + "Hide all": "Alle ausblenden", + "Hide group": "Gruppe ausblenden", + "In Progress": "In Bearbeitung", + "In progress": "In Bearbeitung", + "Include time": "Uhrzeit einschließen", + "Insert a kanban board on this page": "Fügen Sie ein Kanban-Board auf dieser Seite ein", + "Insert an inline base on this page": "Fügen Sie eine Inline-Base auf dieser Seite ein", + "Is": "Ist", + "Is after": "Ist nach", + "Is any of": "Ist eines von", + "Is before": "Ist vor", + "Is empty": "Ist leer", + "Is none of": "Ist keines von", + "Is not": "Ist nicht", + "Is not empty": "Ist nicht leer", + "Is on or after": "Ist am oder nach", + "Is on or before": "Ist am oder vor", + "Is within": "Ist innerhalb von", + "Keep editing": "Weiter bearbeiten", + "Last edited at": "Zuletzt bearbeitet am", + "Last edited by": "Zuletzt bearbeitet von", + "Less than": "Kleiner als", + "Link copied to clipboard": "Link in die Zwischenablage kopiert", + "Local": "Lokal", + "Long text": "Langer Text", + "Moved card to {{column}}": "Karte nach {{column}} verschoben", + "Moved column to {{column}}": "Spalte nach {{column}} verschoben", + "Multi-select": "Mehrfachauswahl", + "New row": "Neue Zeile", + "Next month": "Nächster Monat", + "Next week": "Nächste Woche", + "Next year": "Nächstes Jahr", + "No filters applied": "Keine Filter angewendet", + "No match": "Keine Übereinstimmung", + "No options for this property type": "Keine Optionen für diesen Eigenschaftstyp", + "No sorts applied": "Keine Sortierungen angewendet", + "No value": "Kein Wert", + "None": "Keine", + "Not started": "Nicht begonnen", + "Number": "Zahl", + "One month ago": "Vor einem Monat", + "One month from now": "In einem Monat", + "One week ago": "Vor einer Woche", + "One week from now": "In einer Woche", + "Open as page": "Als Seite öffnen", + "Options": "Optionen", + "Past month": "Letzter Monat", + "Past week": "Letzte Woche", + "Past year": "Letztes Jahr", + "Percent": "Prozent", + "Period, comma": "Punkt, Komma", + "Person": "Person", + "Please enter a valid email": "Bitte geben Sie eine gültige E-Mail-Adresse ein", + "Progress": "Fortschritt", + "Property options": "Eigenschaftsoptionen", + "Relative": "Relativ", + "Rename property": "Eigenschaft umbenennen", + "Reset": "Zurücksetzen", + "Save for everyone": "Für alle speichern", + "Select": "Auswahl", + "Select a property": "Eigenschaft auswählen", + "Select all loaded rows": "Alle geladenen Zeilen auswählen", + "Show all": "Alle anzeigen", + "Sort": "Sortieren", + "Sort by": "Sortieren nach", + "Space, comma": "Leerzeichen, Komma", + "Space, period": "Leerzeichen, Punkt", + "This board has no grouping property yet.": "Dieses Board hat noch keine Gruppierungseigenschaft.", + "This month": "Diesen Monat", + "This year": "Dieses Jahr", + "Thousands and decimal separators": "Tausender- und Dezimaltrennzeichen", + "Time format": "Zeitformat", + "To Do": "Zu erledigen", + "Tomorrow": "Morgen", + "True": "Wahr", + "Unsaved changes": "Nicht gespeicherte Änderungen", + "Untitled base": "Unbenannte Base", + "URL": "URL", + "Value": "Wert", + "View updated for everyone": "Ansicht für alle aktualisiert", + "You have unsaved changes. Do you want to discard them?": "Sie haben nicht gespeicherte Änderungen. Möchten Sie sie verwerfen?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected", + "Compare": "Vergleichen", + "Compare versions": "Versionen vergleichen", + "Select version from {{date}}": "Version vom {{date}} auswählen", + "Version actions for {{date}}": "Versionsaktionen für {{date}}", + "Comparing {{newer}} and {{older}}": "{{newer}} und {{older}} werden verglichen", + "Exit compare": "Vergleich beenden", + "Search attachments...": "Anhänge suchen...", + "Error loading attachments.": "Fehler beim Laden der Anhänge.", + "No attachments on this page yet.": "Auf dieser Seite gibt es noch keine Anhänge.", + "Uploaded by {{name}}": "Hochgeladen von {{name}}", + "Download {{name}}": "{{name}} herunterladen", + "Access revoked": "Zugriff widerrufen", + "Authorize application": "Anwendung autorisieren", + "{{name}} wants to access {{workspace}}": "{{name}} möchte auf {{workspace}} zugreifen", + "Not you? Switch account": "Nicht du? Konto wechseln", + "This application will be able to:": "Diese Anwendung kann Folgendes:", + "Write": "Schreiben", + "Invalid authorization request": "Ungültige Autorisierungsanfrage", + "Authorize": "Autorisieren", + "Application": "Anwendung", + "Permissions": "Berechtigungen", + "Authorized": "Autorisiert", + "Revoke access": "Zugriff widerrufen", + "Revoke access for {{name}}": "Zugriff für {{name}} widerrufen", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Möchtest du den Zugriff für {{name}} wirklich widerrufen? Die Anwendung kann dann nicht mehr auf dein Konto zugreifen.", + "Something went wrong. Please try again.": "Etwas ist schiefgelaufen. Bitte versuche es erneut.", + "Remove {{name}}": "{{name}} entfernen", + "Make sure you trust this application before authorizing it.": "Stelle sicher, dass du dieser Anwendung vertraust, bevor du sie autorisierst.", + "You will be redirected to": "Du wirst weitergeleitet zu", + "View content without making changes.": "Inhalte ansehen, ohne Änderungen vorzunehmen.", + "Create and modify content.": "Inhalte erstellen und bearbeiten.", + "Applications and AI assistants you have authorized to access your account.": "Anwendungen und AI-Assistenten, denen du den Zugriff auf dein Konto autorisiert hast.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "MCP ist für deinen Workspace aktiviert. Verbinde AI-Assistenten über OAuth mit deinem Docmost-Konto.", + "Authorized apps": "Autorisierte Apps", + "No authorized apps yet.": "Noch keine autorisierten Apps.", + "Workspace knowledge only": "Nur Workspace-Wissen", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Beschränke den AI-Chat darauf, nur anhand deiner Workspace-Seiten und hochgeladenen Dateien zu antworten. Es wird kein externes Wissen verwendet.", + "Toggle workspace knowledge only": "Nur Workspace-Wissen umschalten", + "Read-only mode": "Schreibgeschützter Modus", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI-Chat kann Workspace-Inhalte durchsuchen und lesen, aber keine Seiten erstellen oder bearbeiten.", + "Toggle AI Chat read-only mode": "Schreibgeschützten Modus für AI-Chat umschalten", + "Title only": "Nur Titel", + "you": "du", + "Allow public spaces": "Öffentliche Bereiche zulassen", + "Space admins can publish their spaces to the web.": "Bereichsadministratoren können ihre Bereiche im Web veröffentlichen.", + "Toggle allow public spaces": "Öffentliche Bereiche umschalten", + "Publish space to the web": "Bereich im Web veröffentlichen", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Jeder im Internet kann jede Seite in diesem Bereich lesen, außer eingeschränkten Seiten. Sind Sie sicher?", + "Make this space publicly readable by anyone on the internet.": "Diesen Bereich für jeden im Internet öffentlich lesbar machen.", + "Toggle publish space to the web": "Veröffentlichung des Bereichs im Web umschalten", + "Allow search engines to index": "Suchmaschinen das Indexieren erlauben", + "Let public pages in this space appear in search engine results.": "Öffentliche Seiten in diesem Bereich in Suchmaschinenergebnissen erscheinen lassen.", + "Toggle search engine indexing": "Suchmaschinenindexierung umschalten", + "Public space link": "Öffentlicher Bereichslink", + "Copy public space link": "Öffentlichen Bereichslink kopieren", + "Renaming the space slug will break public links.": "Das Umbenennen des Bereichs-Slugs führt dazu, dass öffentliche Links nicht mehr funktionieren.", + "Failed to update space": "Bereich konnte nicht aktualisiert werden", + "This space is public": "Dieser Bereich ist öffentlich", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Jeder im Internet kann die Seiten in diesem Bereich lesen, außer eingeschränkten Seiten.", + "Open public site": "Öffentliche Website öffnen", + "Public": "Öffentlich", + "This space has no public pages yet.": "Dieser Bereich hat noch keine öffentlichen Seiten.", + "On this page": "Auf dieser Seite", + "Previous": "Zurück", + "Next": "Weiter", + "Show hidden pages": "Ausgeblendete Seiten anzeigen", + "Page navigation": "Seitennavigation", + "Toggle sidebar": "Seitenleiste umschalten", + "Toggle table of contents": "Inhaltsverzeichnis umschalten", + "Appearance": "Erscheinungsbild", + "Forest": "Wald", + "Violet": "Violett", + "Light mode color": "Farbe für den hellen Modus", + "Dark mode color": "Farbe für den dunklen Modus", + "Choose the primary color of the public docs site.": "Wählen Sie die Primärfarbe der öffentlichen Dokumentationswebsite aus.", + "Show page author": "Seitenautor anzeigen", + "Display the page creator's name on public pages.": "Den Namen des Seitenerstellers auf öffentlichen Seiten anzeigen.", + "Toggle show page author": "Anzeige des Seitenautors umschalten", + "Show last updated": "Zuletzt aktualisiert anzeigen", + "Display when each page was last updated.": "Anzeigen, wann jede Seite zuletzt aktualisiert wurde.", + "Toggle show last updated": "Anzeige der letzten Aktualisierung umschalten", + "Open public page": "Öffentliche Seite öffnen", + "Toggle color scheme": "Farbschema umschalten", + "Ember": "Glut", + "Rose": "Rosa", + "Documentation": "Dokumentation", + "All published spaces.": "Alle veröffentlichten Bereiche.", + "No public spaces yet.": "Noch keine öffentlichen Bereiche.", + "Show public directory": "Öffentliches Verzeichnis anzeigen", + "List published spaces at /docs for anyone to browse.": "Veröffentlichte Bereiche unter /docs auflisten, damit sie von allen durchsucht werden können.", + "Toggle show public directory": "Anzeige des öffentlichen Verzeichnisses umschalten", + "Show in public directory": "Im öffentlichen Verzeichnis anzeigen", + "List this space in the public directory at /docs.": "Diesen Bereich im öffentlichen Verzeichnis unter /docs auflisten.", + "Toggle show in public directory": "Anzeige im öffentlichen Verzeichnis umschalten", + "Open public space link": "Öffentlichen Bereichslink öffnen", + "Disable public spaces": "Öffentliche Bereiche deaktivieren", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Bereichsadministratoren können ihre Bereiche für jeden im Internet öffentlich lesbar machen. Sind Sie sicher?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Dadurch wird die Veröffentlichung aller veröffentlichten Bereiche sofort aufgehoben. Ein späteres erneutes Aktivieren veröffentlicht sie nicht erneut. Sind Sie sicher?", + "Allow": "Zulassen", + "Shared pages": "Geteilte Seiten", + "Published spaces": "Veröffentlichte Bereiche", + "Spaces published to the web will appear here": "Hier werden im Web veröffentlichte Bereiche angezeigt", + "No published spaces": "Keine veröffentlichten Bereiche", + "Published by": "Veröffentlicht von", + "Published at": "Veröffentlicht am", + "Open space": "Bereich öffnen", + "Unpublish": "Veröffentlichung aufheben", + "Unpublish space": "Veröffentlichung des Bereichs aufheben", + "This space will no longer be publicly accessible. Are you sure?": "Dieser Bereich wird nicht mehr öffentlich zugänglich sein. Sind Sie sicher?", + "More options for {{name}}": "Weitere Optionen für {{name}}", + "Edit page": "Seite bearbeiten", + "Sign in": "Anmelden", + "Open app": "App öffnen", + "No spaces match your search.": "Keine Bereiche entsprechen Ihrer Suche.", + "Welcome to our documentation": "Willkommen in unserer Dokumentation", + "Guides, references and answers across all our published spaces.": "Anleitungen, Referenzen und Antworten aus all unseren veröffentlichten Bereichen.", + "Guides, references and answers across all our spaces.": "Anleitungen, Referenzen und Antworten aus all unseren Bereichen.", + "Search documentation...": "Dokumentation durchsuchen...", + "1 published space": "1 veröffentlichter Bereich", + "{{count}} published spaces": "{{count}} veröffentlichte Bereiche", + "Actions": "Aktionen", + "Add destination": "Ziel hinzufügen", + "Are you sure you want to delete the destination": "Sind Sie sicher, dass Sie das Ziel löschen möchten", + "Audit logs": "Audit-Protokolle", + "Audit logs & SIEM": "Audit-Protokolle & SIEM", + "Auth header name": "Name des Auth-Headers", + "Auth header prefix": "Präfix des Auth-Headers", + "Body format": "Body-Format", + "Created SIEM destination": "SIEM-Ziel erstellt", + "Datadog site": "Datadog-Website", + "Defaults to this instance's hostname": "Standardmäßig wird der Hostname dieser Instanz verwendet", + "Delete destination": "Ziel löschen", + "Deleted SIEM destination": "SIEM-Ziel gelöscht", + "Destination created": "Ziel erstellt", + "Destination deleted": "Ziel gelöscht", + "Destination updated": "Ziel aktualisiert", + "Disabled": "Deaktiviert", + "Edit destination": "Ziel bearbeiten", + "Endpoint URL": "Endpunkt-URL", + "Failing": "Fehlerhaft", + "Failing since {{time}}": "Fehlerhaft seit {{time}}", + "HEC token": "HEC-Token", + "HEC URL": "HEC-URL", + "Healthy": "Fehlerfrei", + "Hide advanced options": "Erweiterte Optionen ausblenden", + "Host": "Host", + "Index": "Index", + "Insecure: connections can be intercepted.": "Unsicher: Verbindungen können abgefangen werden.", + "JSON array": "JSON-Array", + "Last delivered": "Zuletzt zugestellt", + "Last error": "Letzter Fehler", + "Leave empty to use the token's default index": "Leer lassen, um den Standardindex des Tokens zu verwenden", + "Maximum of {{limit}} destinations reached": "Maximale Anzahl von {{limit}} Zielen erreicht", + "Could not load SIEM destinations: {{message}}": "SIEM-Ziele konnten nicht geladen werden: {{message}}", + "No destinations yet": "Noch keine Ziele", + "Preset": "Voreinstellung", + "Retry now": "Jetzt erneut versuchen", + "Retry scheduled": "Wiederholung geplant", + "Send test event": "Testereignis senden", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Wird im unten stehenden Auth-Header gesendet. Leer lassen, wenn Ihr Empfänger keinen benötigt.", + "Service": "Dienst", + "Show advanced options": "Erweiterte Optionen anzeigen", + "SIEM": "SIEM", + "SIEM streaming": "SIEM-Streaming", + "SIEM streaming requires an Enterprise license.": "SIEM-Streaming erfordert eine Enterprise-Lizenz.", + "Source": "Quelle", + "Sourcetype": "Quelltyp", + "Tags": "Tags", + "Test connection": "Verbindung testen", + "Test event delivered successfully.": "Testereignis erfolgreich zugestellt.", + "Test the connection before saving.": "Testen Sie die Verbindung vor dem Speichern.", + "Test event delivered to {{name}}": "Testereignis an {{name}} zugestellt", + "Updated SIEM destination": "SIEM-Ziel aktualisiert", + "Verify TLS certificate": "TLS-Zertifikat verifizieren", + "e.g. Splunk prod": "z. B. Splunk Prod" +} diff --git a/apps/client/public/locales/en-US/translation.json b/apps/client/public/locales/en-US/translation.json new file mode 100644 index 0000000..3dc11c1 --- /dev/null +++ b/apps/client/public/locales/en-US/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Account", + "Active": "Active", + "Add": "Add", + "Add group members": "Add group members", + "Add groups": "Add groups", + "Add members": "Add members", + "Add to groups": "Add to groups", + "Add space members": "Add space members", + "Add to favorites": "Add to favorites", + "Admin": "Admin", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Are you sure you want to delete this group? Members will lose access to resources this group has access to.", + "Are you sure you want to delete this page?": "Are you sure you want to delete this page?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Are you sure you want to remove this user from the space? The user will lose all access to this space.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Are you sure you want to restore this version? Any changes not versioned will be lost.", + "Can become members of groups and spaces in workspace": "Can become members of groups and spaces in workspace", + "Can create and edit pages in space.": "Can create and edit pages in space.", + "Can edit": "Can edit", + "Can manage workspace": "Can manage workspace", + "Can manage workspace but cannot delete it": "Can manage workspace but cannot delete it", + "Can view": "Can view", + "Can view pages in space but not edit.": "Can view pages in space but not edit.", + "Cancel": "Cancel", + "Change email": "Change email", + "Change password": "Change password", + "Change photo": "Change photo", + "Choose a role": "Choose a role", + "Choose your preferred color scheme.": "Choose your preferred color scheme.", + "Choose your preferred interface language.": "Choose your preferred interface language.", + "Choose your preferred page width.": "Choose your preferred page width.", + "Confirm": "Confirm", + "Copy as Markdown": "Copy as Markdown", + "Copy link": "Copy link", + "Create": "Create", + "Create group": "Create group", + "Create page": "Create page", + "Create space": "Create space", + "Create workspace": "Create workspace", + "Current password": "Current password", + "Dark": "Dark", + "Date": "Date", + "Delete": "Delete", + "Remove from page": "Remove from page", + "Base options": "Base options", + "Delete group": "Delete group", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.", + "Description": "Description", + "Details": "Details", + "e.g ACME": "e.g. ACME", + "e.g ACME Inc": "e.g. ACME Inc", + "e.g Developers": "e.g. Developers", + "e.g Group for developers": "e.g. Group for developers", + "e.g product": "e.g. product", + "e.g Product Team": "e.g. Product Team", + "e.g Sales": "e.g. Sales", + "e.g Space for product team": "e.g. Space for product team", + "e.g Space for sales team to collaborate": "e.g. Space for sales team to collaborate", + "Edit": "Edit", + "Read": "Read", + "Edit group": "Edit group", + "Email": "Email", + "Enter a strong password": "Enter a strong password", + "Enter valid email addresses separated by comma or space max_50": "Enter valid email addresses separated by comma or space [max: 50]", + "enter valid emails addresses": "Enter valid email addresses", + "Enter your current password": "Enter your current password", + "enter your full name": "Enter your full name", + "Enter your new password": "Enter your new password", + "Enter your new preferred email": "Enter your new preferred email", + "Enter your password": "Enter your password", + "Error fetching page data.": "Error fetching page data.", + "Error loading page history.": "Error loading page history.", + "Export": "Export", + "Failed to create page": "Failed to create page", + "Failed to delete page": "Failed to delete page", + "Failed to restore page": "Failed to restore page", + "Failed to fetch recent pages": "Failed to fetch recent pages", + "Failed to import pages": "Failed to import pages", + "Failed to load page. An error occurred.": "Failed to load page. An error occurred.", + "Failed to update data": "Failed to update data", + "Failed to create base": "Failed to create base", + "Failed to update base": "Failed to update base", + "Failed to delete base": "Failed to delete base", + "Failed to create property": "Failed to create property", + "Failed to update property": "Failed to update property", + "Failed to delete property": "Failed to delete property", + "Failed to reorder property": "Failed to reorder property", + "Failed to create view": "Failed to create view", + "Failed to update view": "Failed to update view", + "Failed to delete view": "Failed to delete view", + "Failed to create row": "Failed to create row", + "Failed to update row": "Failed to update row", + "Failed to delete row": "Failed to delete row", + "Failed to delete rows": "Failed to delete rows", + "Failed to reorder row": "Failed to reorder row", + "Failed to move card": "Failed to move card", + "Failed to add card": "Failed to add card", + "Failed to export CSV": "Failed to export CSV", + "Favorite spaces": "Favorite spaces", + "Favorite spaces appear here": "Favorite spaces appear here", + "Favorites": "Favorites", + "Full access": "Full access", + "Full page width": "Full page width", + "Full width": "Full width", + "General": "General", + "Group": "Group", + "Group description": "Group description", + "Group name": "Group name", + "Groups": "Groups", + "Has full access to space settings and pages.": "Has full access to space settings and pages.", + "Home": "Home", + "Import pages": "Import pages", + "Import pages & space settings": "Import pages & space settings", + "Importing pages": "Importing pages", + "invalid invitation link": "Invalid invitation link", + "Invitation signup": "Invitation signup", + "Invite by email": "Invite by email", + "Invite members": "Invite members", + "Invite new members": "Invite new members", + "Invite People": "Invite People", + "Invited members who are yet to accept their invitation will appear here.": "Invited members who are yet to accept their invitation will appear here.", + "Invited members will be granted access to spaces the groups can access": "Invited members will be granted access to spaces the groups can access", + "Join the workspace": "Join the workspace", + "Language": "Language", + "Light": "Light", + "Link copied": "Link copied", + "Login": "Login", + "Logout": "Logout", + "Manage Group": "Manage Group", + "Manage members": "Manage members", + "member": "member", + "Member": "Member", + "members": "members", + "Members": "Members", + "My preferences": "My preferences", + "My Profile": "My Profile", + "My profile": "My profile", + "Name": "Name", + "New email": "New email", + "New page": "New page", + "New password": "New password", + "No group found": "No group found", + "No page history saved yet.": "No page history saved yet.", + "No pages yet": "No pages yet", + "No shared pages": "No shared pages", + "No results found...": "No results found...", + "No user found": "No user found", + "Overview": "Overview", + "Owner": "Owner", + "page": "page", + "Page deleted successfully": "Page deleted successfully", + "Page history": "Page history", + "Select version": "Select version", + "Highlight changes": "Highlight changes", + "Page import is in progress. Please do not close this tab.": "Page import is in progress. Please do not close this tab.", + "Pages": "Pages", + "pages": "pages", + "Password": "Password", + "Password changed successfully": "Password changed successfully", + "People": "People", + "Pending": "Pending", + "Please confirm your action": "Please confirm your action", + "Preferences": "Preferences", + "Print PDF": "Print PDF", + "Profile": "Profile", + "Recently updated": "Recently updated", + "Remove": "Remove", + "Remove from favorites": "Remove from favorites", + "Remove group member": "Remove group member", + "Remove space member": "Remove space member", + "Restore": "Restore", + "Role": "Role", + "Save": "Save", + "Search": "Search", + "Search for groups": "Search for groups", + "Search for users": "Search for users", + "Search for users and groups": "Search for users and groups", + "Search...": "Search...", + "Select language": "Select language", + "Select role": "Select role", + "Select role to assign to all invited members": "Select role to assign to all invited members", + "Select theme": "Select theme", + "Send invitation": "Send invitation", + "Invitation sent": "Invitation sent", + "Settings": "Settings", + "Setup workspace": "Setup workspace", + "Sign In": "Sign In", + "Sign Up": "Sign Up", + "Slug": "Slug", + "Space": "Space", + "Space description": "Space description", + "Space menu": "Space menu", + "Space name": "Space name", + "Space settings": "Space settings", + "Space slug": "Space slug", + "Spaces": "Spaces", + "Spaces you belong to": "Spaces you belong to", + "No space found": "No space found", + "Search for spaces": "Search for spaces", + "Start typing to search...": "Start typing to search...", + "Status": "Status", + "Successfully imported": "Successfully imported", + "Successfully restored": "Successfully restored", + "System settings": "System settings", + "Templates": "Templates", + "Theme": "Theme", + "To change your email, you have to enter your password and new email.": "To change your email, you have to enter your password and new email.", + "Toggle full page width": "Toggle full page width", + "Unable to import pages. Please try again.": "Unable to import pages. Please try again.", + "untitled": "untitled", + "Untitled": "Untitled", + "Updated successfully": "Updated successfully", + "User": "User", + "Workspace": "Workspace", + "Workspace Name": "Workspace Name", + "Workspace settings": "Workspace settings", + "You can change your password here.": "You can change your password here.", + "Your Email": "Your Email", + "Your import is complete.": "Your import is complete.", + "Your name": "Your name", + "Your Name": "Your Name", + "Your password": "Your password", + "Your password must be a minimum of 8 characters.": "Your password must be a minimum of 8 characters.", + "Sidebar toggle": "Sidebar toggle", + "Comments": "Comments", + "404 page not found": "404! Page not found", + "Sorry, we can't find the page you are looking for.": "Sorry, we can't find the page you are looking for.", + "Take me back to homepage": "Take me back to homepage", + "Forgot password": "Forgot password", + "Forgot your password?": "Forgot your password?", + "A password reset link has been sent to your email. Please check your inbox.": "A password reset link has been sent to your email. Please check your inbox.", + "Send reset link": "Send reset link", + "Password reset": "Password reset", + "Your new password": "Your new password", + "Set password": "Set password", + "Write a comment": "Write a comment", + "Reply...": "Reply...", + "Error loading comments.": "Error loading comments.", + "No comments yet.": "No comments yet.", + "No open comments.": "No open comments.", + "No resolved comments.": "No resolved comments.", + "Add a comment...": "Add a comment...", + "Edit comment": "Edit comment", + "Delete comment": "Delete comment", + "Are you sure you want to delete this comment?": "Are you sure you want to delete this comment?", + "Delete chat": "Delete chat", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Are you sure you want to delete '{{title}}'? This action cannot be undone.", + "Comment created successfully": "Comment created successfully", + "Error creating comment": "Error creating comment", + "Comment updated successfully": "Comment updated successfully", + "Failed to update comment": "Failed to update comment", + "Comment deleted successfully": "Comment deleted successfully", + "Failed to delete comment": "Failed to delete comment", + "Comment resolved successfully": "Comment resolved successfully", + "Comment re-opened successfully": "Comment re-opened successfully", + "Comment unresolved successfully": "Comment unresolved successfully", + "Failed to resolve comment": "Failed to resolve comment", + "Resolve comment": "Resolve comment", + "Unresolve comment": "Unresolve comment", + "Resolve Comment Thread": "Resolve Comment Thread", + "Unresolve Comment Thread": "Unresolve Comment Thread", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Are you sure you want to resolve this comment thread? This will mark it as completed.", + "Are you sure you want to unresolve this comment thread?": "Are you sure you want to unresolve this comment thread?", + "Resolved": "Resolved", + "No active comments.": "No active comments.", + "Revoke invitation": "Revoke invitation", + "Revoke": "Revoke", + "Don't": "Don't", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.", + "Resend invitation": "Resend invitation", + "Anyone with this link can join this workspace.": "Anyone with this link can join this workspace.", + "Invite link": "Invite link", + "Copy": "Copy", + "Copy to space": "Copy to space", + "Copied": "Copied", + "Duplicate": "Duplicate", + "Select a user": "Select a user", + "Select a group": "Select a group", + "Export all pages and attachments in this space.": "Export all pages and attachments in this space.", + "Delete space": "Delete space", + "Are you sure you want to delete this space?": "Are you sure you want to delete this space?", + "Delete this space with all its pages and data.": "Delete this space with all its pages and data.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "All pages, comments, attachments and permissions in this space will be deleted irreversibly.", + "Confirm space name": "Confirm space name", + "Type the space name {{spaceName}} to confirm your action.": "Type the space name {{spaceName}} to confirm your action.", + "Format": "Format", + "Include subpages": "Include subpages", + "Include attachments": "Include attachments", + "Select export format": "Select export format", + "Export failed:": "Export failed:", + "export error": "export error", + "Export page": "Export page", + "Export successful": "Export successful", + "Export space": "Export space", + "Export {{type}}": "Export {{type}}", + "File exceeds the {{limit}} attachment limit": "File exceeds the {{limit}} attachment limit", + "Media": "Media", + "Align left": "Align left", + "Align right": "Align right", + "Align center": "Align center", + "Alt text": "Alt text", + "Describe this for accessibility.": "Describe this for accessibility.", + "Add a description": "Add a description", + "Justify": "Justify", + "Merge cells": "Merge cells", + "Split cell": "Split cell", + "Delete column": "Delete column", + "Delete row": "Delete row", + "Add left column": "Add left column", + "Add right column": "Add right column", + "Add row above": "Add row above", + "Add row below": "Add row below", + "Delete table": "Delete table", + "Add column left": "Add column left", + "Add column right": "Add column right", + "Clear cell": "Clear cell", + "Clear cells": "Clear cells", + "Toggle header cell": "Toggle header cell", + "Toggle header column": "Toggle header column", + "Toggle header row": "Toggle header row", + "Move column left": "Move column left", + "Move column right": "Move column right", + "Move row down": "Move row down", + "Move row up": "Move row up", + "Sort A → Z": "Sort A → Z", + "Sort Z → A": "Sort Z → A", + "Info": "Info", + "Note": "Note", + "Success": "Success", + "Warning": "Warning", + "Danger": "Danger", + "Mermaid diagram error:": "Mermaid diagram error:", + "Invalid Mermaid diagram": "Invalid Mermaid diagram", + "Double-click to edit Draw.io diagram": "Double-click to edit Draw.io diagram", + "Exit": "Exit", + "Save & Exit": "Save & Exit", + "Double-click to edit Excalidraw diagram": "Double-click to edit Excalidraw diagram", + "Paste link": "Paste link", + "Paste link or search pages": "Paste link or search pages", + "Link to web page": "Link to web page", + "Recents": "Recents", + "Page or URL": "Page or URL", + "Link title": "Link title", + "Edit link": "Edit link", + "Remove link": "Remove link", + "Add link": "Add link", + "Please enter a valid url": "Please enter a valid url", + "Empty equation": "Empty equation", + "Invalid equation": "Invalid equation", + "Color": "Color", + "Text color": "Text color", + "Default": "Default", + "Blue": "Blue", + "Green": "Green", + "Purple": "Purple", + "Red": "Red", + "Yellow": "Yellow", + "Orange": "Orange", + "Pink": "Pink", + "Gray": "Gray", + "Embed link": "Embed link", + "Invalid {{provider}} embed link": "Invalid {{provider}} embed link", + "Embed {{provider}}": "Embed {{provider}}", + "Enter {{provider}} link to embed": "Enter {{provider}} link to embed", + "Bold": "Bold", + "Italic": "Italic", + "Underline": "Underline", + "Strike": "Strike", + "Code": "Code", + "Comment": "Comment", + "Text": "Text", + "Heading 1": "Heading 1", + "Heading 2": "Heading 2", + "Heading 3": "Heading 3", + "To-do List": "To-do List", + "Bullet List": "Bullet List", + "Numbered List": "Numbered List", + "Blockquote": "Blockquote", + "Just start typing with plain text.": "Just start typing with plain text.", + "Track tasks with a to-do list.": "Track tasks with a to-do list.", + "Big section heading.": "Big section heading.", + "Medium section heading.": "Medium section heading.", + "Small section heading.": "Small section heading.", + "Create a simple bullet list.": "Create a simple bullet list.", + "Create a list with numbering.": "Create a list with numbering.", + "Create block quote.": "Create block quote.", + "Insert code snippet.": "Insert code snippet.", + "Insert horizontal rule divider": "Insert horizontal rule divider", + "Page break": "Page break", + "Insert a page break for printing.": "Insert a page break for printing.", + "Footnote": "Footnote", + "Insert a footnote reference.": "Insert a footnote reference.", + "Upload any image from your device.": "Upload any image from your device.", + "Upload any video from your device.": "Upload any video from your device.", + "Upload any audio from your device.": "Upload any audio from your device.", + "Upload any file from your device.": "Upload any file from your device.", + "Uploading {{name}}": "Uploading {{name}}", + "Uploading file": "Uploading file", + "Table": "Table", + "Insert a table.": "Insert a table.", + "Insert collapsible block.": "Insert collapsible block.", + "Video": "Video", + "Divider": "Divider", + "Quote": "Quote", + "Image": "Image", + "Audio": "Audio", + "Embed PDF": "Embed PDF", + "Upload and embed a PDF file.": "Upload and embed a PDF file.", + "Embed as PDF": "Embed as PDF", + "Failed to load PDF": "Failed to load PDF", + "Convert to attachment": "Convert to attachment", + "File attachment": "File attachment", + "Toggle block": "Toggle block", + "Callout": "Callout", + "Insert callout notice.": "Insert callout notice.", + "Math inline": "Math inline", + "Insert inline math equation.": "Insert inline math equation.", + "Math block": "Math block", + "Insert math equation": "Insert math equation", + "Mermaid diagram": "Mermaid diagram", + "Insert mermaid diagram": "Insert mermaid diagram", + "Insert and design Drawio diagrams": "Insert and design Drawio diagrams", + "Insert current date": "Insert current date", + "Time": "Time", + "Insert current time": "Insert current time", + "Draw and sketch excalidraw diagrams": "Draw and sketch Excalidraw diagrams", + "Multiple": "Multiple", + "Turn into": "Turn into", + "Text align": "Text align", + "This page may have been deleted, moved, or you may not have access.": "This page may have been deleted, moved, or you may not have access.", + "Go to homepage": "Go to homepage", + "Pages you create will show up here.": "Pages you create will show up here.", + "Heading {{level}}": "Heading {{level}}", + "Toggle title": "Toggle title", + "Write anything. Enter \"/\" for commands": "Write anything. Enter \"/\" for commands", + "Write...": "Write...", + "Column count": "Column count", + "{{count}} Columns": "{{count}} Columns", + "{{count}} command available_one": "1 command available", + "{{count}} command available_other": "{{count}} commands available", + "{{count}} result available_one": "1 result available", + "{{count}} result available_other": "{{count}} results available", + "Equal columns": "Equal columns", + "Left sidebar": "Left sidebar", + "Right sidebar": "Right sidebar", + "Wide center": "Wide center", + "Left wide": "Left wide", + "Right wide": "Right wide", + "Names do not match": "Names do not match", + "Today, {{time}}": "Today, {{time}}", + "Yesterday, {{time}}": "Yesterday, {{time}}", + "now": "now", + "Space created successfully": "Space created successfully", + "Space updated successfully": "Space updated successfully", + "Space deleted successfully": "Space deleted successfully", + "Members added successfully": "Members added successfully", + "Member removed successfully": "Member removed successfully", + "Member role updated successfully": "Member role updated successfully", + "Created by: {{creatorName}}": "Created by: {{creatorName}}", + "Created at: {{time}}": "Created at: {{time}}", + "Edited by {{name}} {{time}}": "Edited by {{name}} {{time}}", + "Word count: {{wordCount}}": "Word count: {{wordCount}}", + "Character count: {{characterCount}}": "Character count: {{characterCount}}", + "New update": "New update", + "{{latestVersion}} is available": "{{latestVersion}} is available", + "Default page edit mode": "Default page edit mode", + "Choose your preferred page edit mode. Avoid accidental edits.": "Choose your preferred page edit mode. Avoid accidental edits.", + "Choose {{format}} file": "Choose {{format}} file", + "Reading": "Reading", + "Delete member": "Delete member", + "Member deleted successfully": "Member deleted successfully", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Are you sure you want to delete this workspace member? This action is irreversible.", + "Deactivate member": "Deactivate member", + "Activate member": "Activate member", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.", + "Are you sure you want to activate this workspace member?": "Are you sure you want to activate this workspace member?", + "Deactivate": "Deactivate", + "Activate": "Activate", + "Deactivated": "Deactivated", + "Move": "Move", + "Move page": "Move page", + "Move page to a different space.": "Move page to a different space.", + "Real-time editor connection lost. Retrying...": "Real-time editor connection lost. Retrying...", + "Table of contents": "Table of contents", + "Add headings (H1, H2, H3) to generate a table of contents.": "Add headings (H1, H2, H3) to generate a table of contents.", + "Share": "Share", + "Public sharing": "Public sharing", + "Shared by": "Shared by", + "Shared at": "Shared at", + "Inherits public sharing from": "Inherits public sharing from", + "Share to web": "Share to web", + "Shared to web": "Shared to web", + "Anyone with the link can view this page": "Anyone with the link can view this page", + "Make this page publicly accessible": "Make this page publicly accessible", + "Include sub-pages": "Include sub-pages", + "Make sub-pages public too": "Make sub-pages public too", + "Allow search engines to index page": "Allow search engines to index page", + "Open page": "Open page", + "Page": "Page", + "Delete public share link": "Delete public share link", + "Delete share": "Delete share", + "Are you sure you want to delete this shared link?": "Are you sure you want to delete this shared link?", + "Publicly shared pages from spaces you are a member of will appear here": "Publicly shared pages from spaces you are a member of will appear here", + "Share deleted successfully": "Share deleted successfully", + "Share not found": "Share not found", + "Failed to share page": "Failed to share page", + "Disable public sharing": "Disable public sharing", + "Prevent members from sharing pages publicly.": "Prevent members from sharing pages publicly.", + "Toggle public sharing": "Toggle public sharing", + "Toggle space public sharing": "Toggle space public sharing", + "Allow viewers to comment": "Allow viewers to comment", + "Allow viewers to add comments on pages in this space.": "Allow viewers to add comments on pages in this space.", + "Toggle viewer comments": "Toggle viewer comments", + "Public sharing is disabled at the workspace level": "Public sharing is disabled at the workspace level", + "Prevent pages in this space from being shared publicly.": "Prevent pages in this space from being shared publicly.", + "Page permissions": "Page permissions", + "Control who can view and edit individual pages. Available with an enterprise license.": "Control who can view and edit individual pages. Available with an enterprise license.", + "Enable public sharing": "Enable public sharing", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Are you sure you want to enable public sharing? Members will be able to share pages publicly.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.", + "Are you sure you want to enable public sharing for this space?": "Are you sure you want to enable public sharing for this space?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.", + "Public sharing is disabled": "Public sharing is disabled", + "Public sharing has been disabled at the workspace level.": "Public sharing has been disabled at the workspace level.", + "Public sharing has been disabled for this space.": "Public sharing has been disabled for this space.", + "Copy page": "Copy page", + "Copy page to a different space.": "Copy page to a different space.", + "Page copied successfully": "Page copied successfully", + "Page duplicated successfully": "Page duplicated successfully", + "Find": "Find", + "Not found": "Not found", + "Previous Match (Shift+Enter)": "Previous Match (Shift+Enter)", + "Next match (Enter)": "Next match (Enter)", + "Match case (Alt+C)": "Match case (Alt+C)", + "Replace": "Replace", + "Close (Escape)": "Close (Escape)", + "Replace (Enter)": "Replace (Enter)", + "Replace all (Ctrl+Alt+Enter)": "Replace all (Ctrl+Alt+Enter)", + "Replace all": "Replace all", + "View all": "View all", + "View all spaces": "View all spaces", + "Error": "Error", + "Failed to disable MFA": "Failed to disable MFA", + "Disable two-factor authentication": "Disable two-factor authentication", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.", + "Please enter your password to disable two-factor authentication:": "Please enter your password to disable two-factor authentication:", + "Two-factor authentication has been enabled": "Two-factor authentication has been enabled", + "Two-factor authentication has been disabled": "Two-factor authentication has been disabled", + "2-step verification": "2-step verification", + "Protect your account with an additional verification layer when signing in.": "Protect your account with an additional verification layer when signing in.", + "Two-factor authentication is active on your account.": "Two-factor authentication is active on your account.", + "Add 2FA method": "Add 2FA method", + "Backup codes": "Backup codes", + "Disable": "Disable", + "Invalid verification code": "Invalid verification code", + "New backup codes have been generated": "New backup codes have been generated", + "Failed to regenerate backup codes": "Failed to regenerate backup codes", + "About backup codes": "About backup codes", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "You can regenerate new backup codes at any time. This will invalidate all existing codes.", + "Confirm password": "Confirm password", + "Generate new backup codes": "Generate new backup codes", + "Save your new backup codes": "Save your new backup codes", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.", + "Your new backup codes": "Your new backup codes", + "I've saved my backup codes": "I've saved my backup codes", + "Failed to setup MFA": "Failed to set up MFA", + "Setup & Verify": "Setup & Verify", + "Add to authenticator": "Add to authenticator", + "1. Scan this QR code with your authenticator app": "1. Scan this QR code with your authenticator app", + "Can't scan the code?": "Can't scan the code?", + "Enter this code manually in your authenticator app:": "Enter this code manually in your authenticator app:", + "2. Enter the 6-digit code from your authenticator": "2. Enter the 6-digit code from your authenticator", + "Verify and enable": "Verify and enable", + "Failed to generate QR code. Please try again.": "Failed to generate QR code. Please try again.", + "Backup": "Backup", + "Save codes": "Save codes", + "Save your backup codes": "Save your backup codes", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.", + "Print": "Print", + "Two-factor authentication has been set up. Please log in again.": "Two-factor authentication has been set up. Please log in again.", + "Two-Factor authentication required": "Two-factor authentication required", + "Your workspace requires two-factor authentication for all users": "Your workspace requires two-factor authentication for all users", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.", + "Set up two-factor authentication": "Set up two-factor authentication", + "Cancel and logout": "Cancel and logout", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Your workspace requires two-factor authentication. Please set it up to continue.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.", + "Password is required": "Password is required", + "Password must be at least 8 characters": "Password must be at least 8 characters", + "Please enter a 6-digit code": "Please enter a 6-digit code", + "Code must be exactly 6 digits": "Code must be exactly 6 digits", + "Enter the 6-digit code found in your authenticator app": "Enter the 6-digit code found in your authenticator app", + "Need help authenticating?": "Need help authenticating?", + "MFA QR Code": "MFA QR Code", + "Account created successfully. Please log in to set up two-factor authentication.": "Account created successfully. Please log in to set up two-factor authentication.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Password reset successful. Please log in with your new password and complete two-factor authentication.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Password reset successful. Please log in with your new password to set up two-factor authentication.", + "Password reset was successful. Please log in with your new password.": "Password reset was successful. Please log in with your new password.", + "Two-factor authentication": "Two-factor authentication", + "Use authenticator app instead": "Use authenticator app instead", + "Verify backup code": "Verify backup code", + "Use backup code": "Use backup code", + "Enter one of your backup codes": "Enter one of your backup codes", + "Backup code": "Backup code", + "Enter one of your backup codes. Each backup code can only be used once.": "Enter one of your backup codes. Each backup code can only be used once.", + "Verify": "Verify", + "Trash": "Trash", + "Pages in trash will be permanently deleted after {{count}} days.": "Pages in trash will be permanently deleted after {{count}} days.", + "Deleted": "Deleted", + "No pages in trash": "No pages in trash", + "Permanently delete page?": "Permanently delete page?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.", + "Restore '{{title}}' and its sub-pages?": "Restore '{{title}}' and its sub-pages?", + "Move to trash": "Move to trash", + "Move this page to trash?": "Move this page to trash?", + "Restore page": "Restore page", + "Permanently delete": "Permanently delete", + "{{name}} moved this page to Trash {{time}}.": "{{name}} moved this page to Trash {{time}}.", + "Page moved to trash": "Page moved to trash", + "Page restored successfully": "Page restored successfully", + "Deleted by": "Deleted by", + "Deleted at": "Deleted at", + "Preview": "Preview", + "Base preview unavailable": "Base preview unavailable", + "Restore this base to view its contents.": "Restore this base to view its contents.", + "Subpages": "Subpages", + "Failed to load subpages": "Failed to load subpages", + "No subpages": "No subpages", + "Subpages (Child pages)": "Subpages (Child pages)", + "List all subpages of the current page": "List all subpages of the current page", + "Attachments": "Attachments", + "All spaces": "All spaces", + "Unknown": "Unknown", + "Find a space": "Find a space", + "Search in all your spaces": "Search in all your spaces", + "Type": "Type", + "Enterprise": "Enterprise", + "Download attachment": "Download attachment", + "Allowed email domains": "Allowed email domains", + "Only users with email addresses from these domains can signup via SSO.": "Only users with email addresses from these domains can sign up via SSO.", + "Enter valid domain names separated by comma or space": "Enter valid domain names separated by comma or space", + "Enforce two-factor authentication": "Enforce two-factor authentication", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Once enforced, all members must enable two-factor authentication to access the workspace.", + "Toggle MFA enforcement": "Toggle MFA enforcement", + "Display name": "Display name", + "Allow signup": "Allow signup", + "Enabled": "Enabled", + "Advanced Settings": "Advanced Settings", + "Enable TLS/SSL": "Enable TLS/SSL", + "Use secure connection to LDAP server": "Use secure connection to LDAP server", + "Group sync": "Group sync", + "No SSO providers found.": "No SSO providers found.", + "Delete SSO provider": "Delete SSO provider", + "Are you sure you want to delete this SSO provider?": "Are you sure you want to delete this SSO provider?", + "Action": "Action", + "{{ssoProviderType}} configuration": "{{ssoProviderType}} configuration", + "Icon": "Icon", + "Upload image": "Upload image", + "Remove image": "Remove image", + "Failed to remove image": "Failed to remove image", + "Image exceeds 10MB limit.": "Image exceeds 10MB limit.", + "Image removed successfully": "Image removed successfully", + "API key": "API key", + "API keys": "API keys", + "API management": "API management", + "Custom expiration date": "Custom expiration date", + "Enter a descriptive token name": "Enter a descriptive token name", + "Expiration": "Expiration", + "Expired": "Expired", + "Expires": "Expires", + "Last use": "Last Used", + "No API keys found": "No API keys found", + "No expiration": "No expiration", + "Revoked successfully": "Revoked successfully", + "Select expiration date": "Select expiration date", + "This action cannot be undone. Any applications using this API key will stop working.": "This action cannot be undone. Any applications using this API key will stop working.", + "Update": "Update", + "Update {{credential}}": "Update {{credential}}", + "Manage API keys for all users in the workspace": "Manage API keys for all users in the workspace", + "Restrict API key creation to admins": "Restrict API key creation to admins", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Only admins and owners can create new API keys. Existing member keys will continue to work.", + "Toggle restrict API keys to admins": "Toggle restrict API keys to admins", + "API key creation is restricted to admins by your workspace administrator.": "API key creation is restricted to admins by your workspace administrator.", + "AI settings": "AI settings", + "AI search": "AI search", + "AI Answer": "AI Answer", + "Ask AI": "Ask AI", + "AI is thinking...": "AI is thinking...", + "Thinking": "Thinking", + "Ask a question...": "Ask a question...", + "AI Answers": "AI Answers", + "AI-powered search (AI Answers)": "AI-powered search (AI Answers)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.", + "Toggle AI search": "Toggle AI search", + "Generative AI (Ask AI)": "Generative AI (Ask AI)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.", + "Toggle generative AI": "Toggle generative AI", + "Upgrade your plan": "Upgrade your plan", + "Available with a paid license": "Available with a paid license", + "Upgrade your license tier.": "Upgrade your license tier.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "AI is available in the Docmost paid editions. Contact sales@docmost.com.", + "AI & MCP": "AI & MCP", + "AI": "AI", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Model Context Protocol (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.", + "MCP Server URL": "MCP Server URL", + "Connect AI assistants with your Docmost account via OAuth.": "Connect AI assistants with your Docmost account via OAuth.", + "Enforce OAuth": "Enforce OAuth", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.", + "Toggle enforce OAuth for MCP": "Toggle enforce OAuth for MCP", + "Supported tools": "Supported tools", + "MCP server URL:": "MCP server URL:", + "Learn more": "Learn more", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Manage API keys for all users in the workspace. View the API documentation for usage details.", + "View the API documentation for usage details.": "View the API documentation for usage details.", + "View the MCP documentation.": "View the MCP documentation.", + "Sources": "Sources", + "AI Answers not available for attachments": "AI Answers not available for attachments", + "No answer available": "No answer available", + "Background color": "Background color", + "Highlight color": "Highlight color", + "Remove color": "Remove color", + "Notifications": "Notifications", + "No notifications": "No notifications", + "No unread notifications": "No unread notifications", + "All notifications": "All notifications", + "Unread only": "Unread only", + "Mark all as read": "Mark all as read", + "Mark as read": "Mark as read", + "More options": "More options", + "{{name}} mentioned you in a comment": "{{name}} mentioned you in a comment", + "{{name}} commented on a page": "{{name}} commented on a page", + "{{name}} resolved a comment": "{{name}} resolved a comment", + "{{name}} mentioned you on a page": "{{name}} mentioned you on a page", + "{{name}} gave you edit access to a page": "{{name}} gave you edit access to a page", + "{{name}} gave you view access to a page": "{{name}} gave you view access to a page", + "{{name}} updated a page": "{{name}} updated a page", + "Watch page": "Watch page", + "Stop watching": "Stop watching", + "Watch space": "Watch space", + "Stop watching space": "Stop watching space", + "Email notifications": "Email notifications", + "Page updates": "Page updates", + "Get notified when pages you watch are updated.": "Receive notifications when the pages you watch are updated.", + "Page mentions": "Page mentions", + "Get notified when someone mentions you on a page.": "Receive notifications when someone mentions you on a page.", + "Comment mentions": "Comment mentions", + "Get notified when someone mentions you in a comment.": "Receive notifications when someone mentions you in a comment.", + "New comments": "New comments", + "Get notified about new comments on threads you participate in.": "Receive notifications about new comments in threads you are participating in.", + "Resolved comments": "Resolved comments", + "Get notified when your comment is resolved.": "Receive a notification when your comment is resolved.", + "You are now watching this page": "You’re now watching this page", + "You are no longer watching this page": "You’re no longer watching this page", + "You are now watching this space": "You’re now watching this space", + "You are no longer watching this space": "You’re no longer watching this space", + "Direct": "Direct", + "Updates": "Updates", + "Today": "Today", + "Yesterday": "Yesterday", + "This week": "This week", + "Older": "Older", + "Restricted page": "Restricted page", + "Restricted pages cannot be shared publicly.": "Restricted pages cannot be shared publicly.", + "Restricted by parent": "Restricted by parent", + "Restricted": "Restricted", + "Open": "Open", + "Inherits restrictions from ancestor page": "Inherits restrictions from ancestor page", + "Only people listed below can access this page": "Only people listed below can access this page", + "Everyone in this space can access": "Everyone in this space can access", + "No additional restrictions on this page": "No additional restrictions on this page", + "Only specific people can access": "Only specific people can access", + "Use only inherited restrictions": "Use only inherited restrictions", + "Add restrictions on top of inherited": "Add restrictions on top of inherited", + "Inherited restriction": "Inherited restriction", + "Access limited by": "Access limited by", + "Restrict access to control who can view and edit this page": "Restrict access to control who can view and edit this page", + "Add additional restrictions specific to this page": "Add additional restrictions specific to this page", + "Access": "Access", + "People with access": "People with access", + "Remove all": "Remove all", + "Remove access": "Remove access", + "Remove all access": "Remove all access", + "Are you sure you want to remove this member's access to the page?": "Are you sure you want to remove this member's access to the page?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.", + "Trash retention": "Trash retention", + "Pages in trash will be permanently deleted after this period.": "Pages in trash will be permanently deleted after this period.", + "Trash retention updated": "Trash retention updated", + "Failed to update trash retention": "Failed to update trash retention", + "Removed page restriction": "Removed page restriction", + "Added page permission": "Added page permission", + "Removed page permission": "Removed page permission", + "Changed page permission": "Changed page permission", + "Requested password reset": "Requested password reset", + "Created template": "Created template", + "Deleted template": "Deleted template", + "day": "day", + "days": "days", + "week": "week", + "weeks": "weeks", + "month": "month", + "months": "months", + "year": "year", + "years": "years", + "Period": "Period", + "Fixed date": "Fixed date", + "Indefinitely": "Indefinitely", + "Days": "Days", + "Weeks": "Weeks", + "Months": "Months", + "Years": "Years", + "Pick a date": "Pick a date", + "Maximum is {{max}} {{unit}} for this unit": "Maximum is {{max}} {{unit}} for this unit", + "Never expires. Verifiers can re-verify at any time.": "Never expires. Verifiers can re-verify at any time.", + "Verified": "Verified", + "Review needed": "Review needed", + "Verification expired": "Verification expired", + "Draft": "Draft", + "In Approval": "In Approval", + "In approval": "In approval", + "Approved": "Approved", + "Obsolete": "Obsolete", + "Expiring": "Expiring", + "Set up verification": "Set up verification", + "Verify page": "Verify page", + "Page verification": "Page verification", + "Add verification": "Add verification", + "Edit verification": "Edit verification", + "Search by title": "Search by title", + "Choose how this page should stay accurate.": "Choose how this page should stay accurate.", + "Recurring verification": "Recurring verification", + "Verifiers re-confirm this page on a schedule.": "Verifiers re-confirm this page on a schedule.", + "Re-verify on a schedule (e.g every 30 days )": "Re-verify on a schedule (e.g. every 30 days)", + "Page stays editable at all times": "Page stays editable at all times", + "Best for runbooks, FAQs, living documentation": "Best for runbooks, FAQs, living documentation", + "Approval workflow": "Approval workflow", + "Formal document lifecycle with named approvers.": "Formal document lifecycle with named approvers.", + "Draft → In approval → Approved → Obsolete": "Draft → In approval → Approved → Obsolete", + "Locked once approved, with full history": "Locked once approved, with full history", + "Designed for ISO 9001, ISO 13485, and FDA": "Designed for ISO 9001, ISO 13485, and FDA", + "Best for SOPs and controlled documents": "Best for SOPs and controlled documents", + "Back": "Back", + "Quality management": "Quality management", + "Recurring": "Recurring", + "Pages move through draft, approval, and approved stages.": "Pages move through draft, approval, and approved stages.", + "Verifiers": "Verifiers", + "Add verifier": "Add verifier", + "I've reviewed this page for accuracy": "I've reviewed this page for accuracy", + "Set up": "Set up", + "Remove verification": "Remove verification", + "Are you sure you want to remove verification from this page?": "Are you sure you want to remove verification from this page?", + "Assigned verifiers must periodically re-verify this page.": "Assigned verifiers must periodically re-verify this page.", + "Last verified by {{name}} {{time}} (expired)": "Last verified by {{name}} {{time}} (expired)", + "The fixed expiration date has passed.": "The fixed expiration date has passed.", + "Verified by {{name}} {{time}}": "Verified by {{name}} {{time}}", + "Expires {{date}}": "Expires {{date}}", + "Expired {{date}}": "Expired {{date}}", + "Mark as obsolete": "Mark as obsolete", + "Mark obsolete": "Mark obsolete", + "Returned by {{name}} {{time}}": "Returned by {{name}} {{time}}", + "No approval has been requested yet.": "No approval has been requested yet.", + "Submitted by {{name}} {{time}}": "Submitted by {{name}} {{time}}", + "Someone": "Someone", + "Approved by {{name}} {{time}}": "Approved by {{name}} {{time}}", + "This document has been marked as obsolete.": "This document has been marked as obsolete.", + "Rejection comment": "Rejection comment", + "Reason for returning this document...": "Reason for returning this document...", + "Confirm rejection": "Confirm rejection", + "Submit for approval": "Submit for approval", + "Reject": "Reject", + "Approve": "Approve", + "Re-submit for approval": "Re-submit for approval", + "Verified until": "Verified until", + "QMS": "QMS", + "Verified pages": "Verified pages", + "Search pages...": "Search pages...", + "Filter by space": "Filter by space", + "Filter by type": "Filter by type", + "{{name}} verified a page": "{{name}} verified a page", + "{{name}} submitted a page for your approval": "{{name}} submitted a page for your approval", + "{{name}} returned a page for revision": "{{name}} returned a page for revision", + "Page verification expires soon": "Page verification expires soon", + "Page verification has expired": "Page verification has expired", + "SIEM destination {{name}} is failing": "SIEM destination {{name}} is failing", + "SIEM destination {{name}} was disabled after 24 hours of failures": "SIEM destination {{name}} was disabled after 24 hours of failures", + "SIEM destination {{name}} recovered": "SIEM destination {{name}} recovered", + "Verifying your email": "Verifying your email", + "Please wait...": "Please wait...", + "Verification failed. The link may have expired.": "Verification failed. The link may have expired.", + "Check your email": "Check your email", + "We sent a verification link to {{email}}.": "We sent a verification link to {{email}}.", + "We sent a verification link to your email.": "We sent a verification link to your email.", + "Click the link to verify your email and access your workspace.": "Click the link to verify your email and access your workspace.", + "Resend verification email": "Resend verification email", + "Verification email sent. Please check your inbox.": "Verification email sent. Please check your inbox.", + "Failed to resend verification email. Please try again.": "Failed to resend verification email. Please try again.", + "We've sent you an email with your associated workspaces.": "We've sent you an email with your associated workspaces.", + "Load more": "Load more", + "Log out of all devices": "Log out of all devices", + "Log out of all sessions except this device": "Log out of all sessions except this device", + "This Device": "This Device", + "Unknown device": "Unknown device", + "No active sessions": "No active sessions", + "Session revoked": "Session revoked", + "All other sessions revoked": "All other sessions revoked", + "Last used": "Last used", + "Created": "Created", + "Rename": "Rename", + "Publish": "Publish", + "Security": "Security", + "Enforce SSO": "Enforce SSO", + "Once enforced, members will not be able to login with email and password.": "Once enforced, members will not be able to log in with email and password.", + "AI-generated content may not be accurate.": "AI-generated content may not be accurate.", + "AI Chat": "AI Chat", + "Analyze for insights": "Analyze for insights", + "Ask anything...": "Ask anything...", + "Assistant said:": "Assistant said:", + "Chat history": "Chat history", + "Chat name": "Chat name", + "Chat transcript": "Chat transcript", + "Close": "Close", + "Copy assistant response": "Copy assistant response", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "Failed to load chat. An error occurred.", + "Failed to render this message.": "Failed to render this message.", + "How can I help you today?": "How can I help you today?", + "New chat": "New chat", + "No chat history": "No chat history", + "No chats found": "No chats found", + "No conversations yet": "No conversations yet", + "Open full page": "Open full page", + "Scroll to bottom": "Scroll to bottom", + "You said:": "You said:", + "Previous 7 days": "Previous 7 days", + "Previous 30 days": "Previous 30 days", + "Search chats...": "Search chats...", + "Search chats": "Search chats", + "Ask anything... Use @ to mention pages": "Ask anything... Use @ to mention pages", + "Ask anything or search your workspace": "Ask anything or search your workspace", + "Welcome to {{name}}": "Welcome to {{name}}", + "Add files": "Add files", + "Mention a page": "Mention a page", + "Start a new chat to see it here.": "Start a new chat to see it here.", + "Summarize this page": "Summarize this page", + "Toggle AI Chat": "Toggle AI Chat", + "Translate this page": "Translate this page", + "Try a different search term.": "Try a different search term.", + "Try again": "Try again", + "Untitled chat": "Untitled chat", + "What can I help you with?": "What can I help you with?", + "Are you sure you want to revoke this {{credential}}": "Are you sure you want to revoke this {{credential}}", + "Automatically provision users and groups from your identity provider via SCIM.": "Automatically provision users and groups from your identity provider via SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Configure your identity provider with this URL to provision users and groups.", + "Create {{credential}}": "Create {{credential}}", + "{{credential}} created": "{{credential}} created", + "{{credential}} created successfully": "{{credential}} created successfully", + "Created by": "Created by", + "Custom": "Custom", + "Enable SCIM": "Enable SCIM", + "Enter a descriptive name": "Enter a descriptive name", + "I've saved my {{credential}}": "I've saved my {{credential}}", + "Important": "Important", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Make sure to copy your {{credential}} now. You won't be able to see it again!", + "Never": "Never", + "Revoke {{credential}}": "Revoke {{credential}}", + "SCIM endpoint URL": "SCIM endpoint URL", + "SCIM provisioning": "SCIM provisioning", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM takes precedence over SSO group sync while enabled.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.", + "SCIM token": "SCIM token", + "SCIM tokens": "SCIM tokens", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "This action cannot be undone. Your identity provider will stop syncing immediately.", + "Toggle SCIM provisioning": "Toggle SCIM provisioning", + "Token": "Token", + "Page menu": "Page menu", + "Expand": "Expand", + "Collapse": "Collapse", + "Comment menu": "Comment menu", + "Group menu": "Group menu", + "Show hidden breadcrumbs": "Show hidden breadcrumbs", + "Breadcrumbs": "Breadcrumbs", + "Page actions": "Page actions", + "Pick emoji": "Pick emoji", + "Template menu": "Template menu", + "Use": "Use", + "Use template": "Use template", + "Preview template: {{title}}": "Preview template: {{title}}", + "Use a template": "Use a template", + "Search templates...": "Search templates...", + "Search spaces...": "Search spaces...", + "No templates found": "No templates found", + "No spaces found": "No spaces found", + "Browse all templates": "Browse all templates", + "This space": "This space", + "All templates": "All templates", + "Global": "Global", + "New template": "New template", + "Edit template": "Edit template", + "Are you sure you want to delete this template?": "Are you sure you want to delete this template?", + "Template scope updated": "Template scope updated", + "Choose which space this template belongs to": "Choose which space this template belongs to", + "Only workspace admins can create global templates.": "Only workspace admins can create global templates.", + "You need edit access to this space to create templates.": "You need edit access to this space to create templates.", + "Scope": "Scope", + "Select scope": "Select scope", + "Title": "Title", + "Saving...": "Saving...", + "Saved": "Saved", + "Save failed. Retry": "Save failed. Retry", + "By {{name}}": "By {{name}}", + "Updated {{time}}": "Updated {{time}}", + "Choose destination": "Choose destination", + "Search pages and spaces...": "Search pages and spaces...", + "No results found": "No results found", + "You don't have permission to create pages here": "You don't have permission to create pages here", + "Chat menu for {{title}}": "Chat menu for {{title}}", + "API key menu": "API key menu", + "Jump to comment selection": "Jump to comment selection", + "Slash commands": "Slash commands", + "Mention suggestions": "Mention suggestions", + "Link suggestions": "Link suggestions", + "Diagram editor": "Diagram editor", + "Add comment": "Add comment", + "Find and replace": "Find and replace", + "Main navigation": "Main navigation", + "Space navigation": "Space navigation", + "Settings navigation": "Settings navigation", + "AI navigation": "AI navigation", + "Breadcrumb": "Breadcrumb", + "Synced block": "Synced block", + "Create a block that stays in sync across pages.": "Create a block that stays in sync across pages.", + "Editing original": "Editing original", + "Copy synced block": "Copy synced block", + "Unsync": "Unsync", + "Delete synced block": "Delete synced block", + "Synced to {{count}} other page_one": "Synced to {{count}} other page", + "Synced to {{count}} other page_other": "Synced to {{count}} other pages", + "ORIGINAL": "ORIGINAL", + "THIS PAGE": "THIS PAGE", + "No pages": "No pages", + "The original synced block no longer exists": "The original synced block no longer exists", + "You don't have access to this synced block": "You don't have access to this synced block", + "Failed to load this synced block": "Failed to load this synced block", + "Fixed editor toolbar": "Fixed editor toolbar", + "Show a formatting toolbar above the editor with quick access to common actions.": "Show a formatting toolbar above the editor with quick access to common actions.", + "Toggle fixed editor toolbar": "Toggle fixed editor toolbar", + "Normal text": "Normal text", + "More inline formatting": "More inline formatting", + "Subscript": "Subscript", + "Superscript": "Superscript", + "Inline code": "Inline code", + "Insert media": "Insert media", + "Mention": "Mention", + "Emoji": "Emoji", + "Columns": "Columns", + "More inserts": "More inserts", + "Embeds": "Embeds", + "Diagrams": "Diagrams", + "Advanced": "Advanced", + "Utility": "Utility", + "Decrease indent": "Decrease indent", + "Increase indent": "Increase indent", + "Clear formatting": "Clear formatting", + "Code block": "Code block", + "Experimental": "Experimental", + "Strikethrough": "Strikethrough", + "Undo": "Undo", + "Redo": "Redo", + "Backlinks": "Backlinks", + "Last updated by": "Last updated by", + "Last updated": "Last updated", + "Stats": "Stats", + "Word count": "Word count", + "Characters": "Characters", + "Incoming links": "Incoming links", + "Outgoing links": "Outgoing links", + "Incoming links ({{count}})": "Incoming links ({{count}})", + "Outgoing links ({{count}})": "Outgoing links ({{count}})", + "No pages link here yet.": "No pages link here yet.", + "This page doesn't link to other pages yet.": "This page doesn't link to other pages yet.", + "Verified until {{date}}": "Verified until {{date}}", + "Labels": "Labels", + "Add label": "Add label", + "No labels yet": "No labels yet", + "Already added": "Already added", + "Invalid label name": "Invalid label name", + "No matches": "No matches", + "Search or create…": "Search or create…", + "Remove label {{name}}": "Remove label {{name}}", + "Failed to add label": "Failed to add label", + "Failed to remove label": "Failed to remove label", + "No pages with this label": "No pages with this label", + "Pages tagged with this label will appear here.": "Pages tagged with this label will appear here.", + "No pages match your search.": "No pages match your search.", + "Updated {{date}}": "Updated {{date}}", + "Cell actions": "Cell actions", + "Column actions": "Column actions", + "Row actions": "Row actions", + "Filter": "Filter", + "Page title": "Page title", + "Page content": "Page content", + "Member actions for {{name}}": "Member actions for {{name}}", + "Toggle password visibility": "Toggle password visibility", + "Send comment": "Send comment", + "Token actions": "Token actions", + "Template settings": "Template settings", + "Edit diagram": "Edit diagram", + "Edit embed": "Edit embed", + "Edit drawing": "Edit drawing", + "Delete equation": "Delete equation", + "Invite actions": "Invite actions", + "Get started": "Get started", + "* indicates required fields": "* indicates required fields", + "List of spaces in this workspace": "List of spaces in this workspace", + "Active sessions": "Active sessions", + "Add {{name}} to favorites": "Add {{name}} to favorites", + "Remove {{name}} from favorites": "Remove {{name}} from favorites", + "Added to favorites": "Added to favorites", + "Removed from favorites": "Removed from favorites", + "Added {{name}} to favorites": "Added {{name}} to favorites", + "Removed {{name}} from favorites": "Removed {{name}} from favorites", + "Page menu for {{name}}": "Page menu for {{name}}", + "Create subpage of {{name}}": "Create subpage of {{name}}", + "Allow personal spaces": "Allow personal spaces", + "Members can create their own personal space.": "Members can create their own personal space.", + "Toggle allow personal spaces": "Toggle allow personal spaces", + "Create personal space": "Create personal space", + "Personal space": "Personal space", + "{{name}}'s space": "{{name}}'s space", + "Apply": "Apply", + "Cells that aren't already a page reference will be cleared.": "Cells that aren't already a page reference will be cleared.", + "Cells that aren't a valid URL will be cleared.": "Cells that aren't a valid URL will be cleared.", + "Cells that aren't a valid email address will be cleared.": "Cells that aren't a valid email address will be cleared.", + "Cells that can't be parsed as a date will be cleared.": "Cells that can't be parsed as a date will be cleared.", + "Cells that can't be parsed as a number will be cleared.": "Cells that can't be parsed as a number will be cleared.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).", + "Cells will be reinterpreted under the new type.": "Cells will be reinterpreted under the new type.", + "Cells will be replaced with a comma-separated list of file names.": "Cells will be replaced with a comma-separated list of file names.", + "Cells will be replaced with a comma-separated list of option names.": "Cells will be replaced with a comma-separated list of option names.", + "Cells will be replaced with the option name.": "Cells will be replaced with the option name.", + "Cells will be replaced with the page title.": "Cells will be replaced with the page title.", + "Cells will be replaced with the person's name.": "Cells will be replaced with the person's name.", + "Change type": "Change type", + "Change type to {{label}}?": "Change type to {{label}}?", + "Converting…": "Converting…", + "Existing values become single-item lists. No data is lost.": "Existing values become single-item lists. No data is lost.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Only the first selected item per row will be kept; the rest will be discarded.", + "Previous record": "Previous record", + "Next record": "Next record", + "Record actions": "Record actions", + "Delete record": "Delete record", + "Delete record?": "Delete record?", + "This action cannot be undone.": "This action cannot be undone.", + "to navigate": "to navigate", + "to close": "to close", + "Expand row {{number}}": "Expand row {{number}}", + "Saving…": "Saving…", + "Read-only": "Read-only", + "Loading…": "Loading…", + "Updated {{when}}": "Updated {{when}}", + "Add property": "Add property", + "Create property": "Create property", + "Hide properties": "Hide properties", + "Find a property type": "Find a property type", + "Properties": "Properties", + "A property with this name already exists": "A property with this name already exists", + "Add card": "Add card", + "Add filter": "Add filter", + "Add option": "Add option", + "Add sort": "Add sort", + "Add view": "Add view", + "All data in this column will be lost.": "All data in this column will be lost.", + "Allow multiple people": "Allow multiple people", + "Alphabetize": "Alphabetize", + "Are you sure you want to delete": "Are you sure you want to delete", + "Ascending": "Ascending", + "Base deleted": "Base deleted", + "Base name": "Base name", + "Base table": "Base table", + "Card properties": "Card properties", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Cells longer than the Text limit will be truncated and the extra content permanently lost.", + "Checkbox": "Checkbox", + "Checked by default": "Checked by default", + "Choose a property": "Choose a property", + "Clear selection": "Clear selection", + "Column options": "Column options", + "Comma, period": "Comma, period", + "Complete": "Complete", + "Contains": "Contains", + "Copy link to view": "Copy link to view", + "Create a status property": "Create a status property", + "Created at": "Created at", + "Currency": "Currency", + "Decimal places": "Decimal places", + "Default value": "Default value", + "Delete property": "Delete property", + "Delete view": "Delete view", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Descending", + "Discard": "Discard", + "Doesn't contain": "Doesn't contain", + "Done": "Done", + "Edit formula": "Edit formula", + "Edit property": "Edit property", + "Export CSV": "Export CSV", + "Failed to load base": "Failed to load base", + "False": "False", + "File": "File", + "Filter and sort changes are visible only to you": "Filter and sort changes are visible only to you", + "Filter by": "Filter by", + "Formula": "Formula", + "Get started with": "Get started with", + "Greater than": "Greater than", + "Group by": "Group by", + "Group this board by a select or status property.": "Group this board by a select or status property.", + "Hide all": "Hide all", + "Hide group": "Hide group", + "In Progress": "In Progress", + "In progress": "In progress", + "Include time": "Include time", + "Insert a kanban board on this page": "Insert a kanban board on this page", + "Insert an inline base on this page": "Insert an inline base on this page", + "Is": "Is", + "Is after": "Is after", + "Is any of": "Is any of", + "Is before": "Is before", + "Is empty": "Is empty", + "Is none of": "Is none of", + "Is not": "Is not", + "Is not empty": "Is not empty", + "Is on or after": "Is on or after", + "Is on or before": "Is on or before", + "Is within": "Is within", + "Keep editing": "Keep editing", + "Last edited at": "Last edited at", + "Last edited by": "Last edited by", + "Less than": "Less than", + "Link copied to clipboard": "Link copied to clipboard", + "Local": "Local", + "Long text": "Long text", + "Moved card to {{column}}": "Moved card to {{column}}", + "Moved column to {{column}}": "Moved column to {{column}}", + "Multi-select": "Multi-select", + "New row": "New row", + "Next month": "Next month", + "Next week": "Next week", + "Next year": "Next year", + "No filters applied": "No filters applied", + "No match": "No match", + "No options for this property type": "No options for this property type", + "No sorts applied": "No sorts applied", + "No value": "No value", + "None": "None", + "Not started": "Not started", + "Number": "Number", + "One month ago": "One month ago", + "One month from now": "In one month", + "One week ago": "One week ago", + "One week from now": "One week from now", + "Open as page": "Open as page", + "Options": "Options", + "Past month": "Past month", + "Past week": "Past week", + "Past year": "Past year", + "Percent": "Percent", + "Period, comma": "Period, comma", + "Person": "Person", + "Please enter a valid email": "Please enter a valid email", + "Progress": "Progress", + "Property options": "Property options", + "Relative": "Relative", + "Rename property": "Rename property", + "Reset": "Reset", + "Save for everyone": "Save for everyone", + "Select": "Select", + "Select a property": "Select a property", + "Select all loaded rows": "Select all loaded rows", + "Show all": "Show all", + "Sort": "Sort", + "Sort by": "Sort by", + "Space, comma": "Space, comma", + "Space, period": "Space, period", + "This board has no grouping property yet.": "This board has no grouping property yet.", + "This month": "This month", + "This year": "This year", + "Thousands and decimal separators": "Thousands and decimal separators", + "Time format": "Time format", + "To Do": "To Do", + "Tomorrow": "Tomorrow", + "True": "True", + "Unsaved changes": "Unsaved changes", + "Untitled base": "Untitled base", + "URL": "URL", + "Value": "Value", + "View updated for everyone": "View updated for everyone", + "You have unsaved changes. Do you want to discard them?": "You have unsaved changes. Do you want to discard them?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected", + "Compare": "Compare", + "Compare versions": "Compare versions", + "Select version from {{date}}": "Select version from {{date}}", + "Version actions for {{date}}": "Version actions for {{date}}", + "Comparing {{newer}} and {{older}}": "Comparing {{newer}} and {{older}}", + "Exit compare": "Exit compare", + "Search attachments...": "Search attachments...", + "Error loading attachments.": "Error loading attachments.", + "No attachments on this page yet.": "No attachments on this page yet.", + "Uploaded by {{name}}": "Uploaded by {{name}}", + "Download {{name}}": "Download {{name}}", + "Access revoked": "Access revoked", + "Authorize application": "Authorize application", + "{{name}} wants to access {{workspace}}": "{{name}} wants to access {{workspace}}", + "Not you? Switch account": "Not you? Switch account", + "This application will be able to:": "This application will be able to:", + "Write": "Write", + "Invalid authorization request": "Invalid authorization request", + "Authorize": "Authorize", + "Application": "Application", + "Permissions": "Permissions", + "Authorized": "Authorized", + "Revoke access": "Revoke access", + "Revoke access for {{name}}": "Revoke access for {{name}}", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.", + "Something went wrong. Please try again.": "Something went wrong. Please try again.", + "Remove {{name}}": "Remove {{name}}", + "Make sure you trust this application before authorizing it.": "Make sure you trust this application before authorizing it.", + "You will be redirected to": "You will be redirected to", + "View content without making changes.": "View content without making changes.", + "Create and modify content.": "Create and modify content.", + "Applications and AI assistants you have authorized to access your account.": "Applications and AI assistants you have authorized to access your account.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.", + "Authorized apps": "Authorized apps", + "No authorized apps yet.": "No authorized apps yet.", + "Workspace knowledge only": "Workspace knowledge only", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.", + "Toggle workspace knowledge only": "Toggle workspace knowledge only", + "Read-only mode": "Read-only mode", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI Chat can search and read workspace content, but cannot create or edit pages.", + "Toggle AI Chat read-only mode": "Toggle AI Chat read-only mode", + "Title only": "Title only", + "you": "you", + "Allow public spaces": "Allow public spaces", + "Space admins can publish their spaces to the web.": "Space admins can publish their spaces to the web.", + "Toggle allow public spaces": "Toggle allow public spaces", + "Publish space to the web": "Publish space to the web", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?", + "Make this space publicly readable by anyone on the internet.": "Make this space publicly readable by anyone on the internet.", + "Toggle publish space to the web": "Toggle publish space to the web", + "Allow search engines to index": "Allow search engines to index", + "Let public pages in this space appear in search engine results.": "Let public pages in this space appear in search engine results.", + "Toggle search engine indexing": "Toggle search engine indexing", + "Public space link": "Public space link", + "Copy public space link": "Copy public space link", + "Renaming the space slug will break public links.": "Renaming the space slug will break public links.", + "Failed to update space": "Failed to update space", + "This space is public": "This space is public", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Anyone on the internet can read the pages in this space, except restricted pages.", + "Open public site": "Open public site", + "Public": "Public", + "This space has no public pages yet.": "This space has no public pages yet.", + "On this page": "On this page", + "Previous": "Previous", + "Next": "Next", + "Show hidden pages": "Show hidden pages", + "Page navigation": "Page navigation", + "Toggle sidebar": "Toggle sidebar", + "Toggle table of contents": "Toggle table of contents", + "Appearance": "Appearance", + "Forest": "Forest", + "Violet": "Violet", + "Light mode color": "Light mode color", + "Dark mode color": "Dark mode color", + "Choose the primary color of the public docs site.": "Choose the primary color of the public docs site.", + "Show page author": "Show page author", + "Display the page creator's name on public pages.": "Display the page creator's name on public pages.", + "Toggle show page author": "Toggle show page author", + "Show last updated": "Show last updated", + "Display when each page was last updated.": "Display when each page was last updated.", + "Toggle show last updated": "Toggle show last updated", + "Open public page": "Open public page", + "Toggle color scheme": "Toggle color scheme", + "Ember": "Ember", + "Rose": "Rose", + "Documentation": "Documentation", + "All published spaces.": "All published spaces.", + "No public spaces yet.": "No public spaces yet.", + "Show public directory": "Show public directory", + "List published spaces at /docs for anyone to browse.": "List published spaces at /docs for anyone to browse.", + "Toggle show public directory": "Toggle show public directory", + "Show in public directory": "Show in public directory", + "List this space in the public directory at /docs.": "List this space in the public directory at /docs.", + "Toggle show in public directory": "Toggle show in public directory", + "Open public space link": "Open public space link", + "Disable public spaces": "Disable public spaces", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?", + "Allow": "Allow", + "Shared pages": "Shared pages", + "Published spaces": "Published spaces", + "Spaces published to the web will appear here": "Spaces published to the web will appear here", + "No published spaces": "No published spaces", + "Published by": "Published by", + "Published at": "Published at", + "Open space": "Open space", + "Unpublish": "Unpublish", + "Unpublish space": "Unpublish space", + "This space will no longer be publicly accessible. Are you sure?": "This space will no longer be publicly accessible. Are you sure?", + "More options for {{name}}": "More options for {{name}}", + "Edit page": "Edit page", + "Sign in": "Sign in", + "Open app": "Open app", + "No spaces match your search.": "No spaces match your search.", + "Welcome to our documentation": "Welcome to our documentation", + "Guides, references and answers across all our published spaces.": "Guides, references and answers across all our published spaces.", + "Guides, references and answers across all our spaces.": "Guides, references and answers across all our spaces.", + "Search documentation...": "Search documentation...", + "1 published space": "1 published space", + "{{count}} published spaces": "{{count}} published spaces", + "Actions": "Actions", + "Add destination": "Add destination", + "Are you sure you want to delete the destination": "Are you sure you want to delete the destination", + "Audit logs": "Audit logs", + "Audit logs & SIEM": "Audit logs & SIEM", + "Auth header name": "Auth header name", + "Auth header prefix": "Auth header prefix", + "Body format": "Body format", + "Created SIEM destination": "Created SIEM destination", + "Datadog site": "Datadog site", + "Defaults to this instance's hostname": "Defaults to this instance's hostname", + "Delete destination": "Delete destination", + "Deleted SIEM destination": "Deleted SIEM destination", + "Destination created": "Destination created", + "Destination deleted": "Destination deleted", + "Destination updated": "Destination updated", + "Disabled": "Disabled", + "Edit destination": "Edit destination", + "Endpoint URL": "Endpoint URL", + "Failing": "Failing", + "Failing since {{time}}": "Failing since {{time}}", + "HEC token": "HEC token", + "HEC URL": "HEC URL", + "Healthy": "Healthy", + "Hide advanced options": "Hide advanced options", + "Host": "Host", + "Index": "Index", + "Insecure: connections can be intercepted.": "Insecure: connections can be intercepted.", + "JSON array": "JSON array", + "Last delivered": "Last delivered", + "Last error": "Last error", + "Leave empty to use the token's default index": "Leave empty to use the token's default index", + "Maximum of {{limit}} destinations reached": "Maximum of {{limit}} destinations reached", + "Could not load SIEM destinations: {{message}}": "Could not load SIEM destinations: {{message}}", + "No destinations yet": "No destinations yet", + "Preset": "Preset", + "Retry now": "Retry now", + "Retry scheduled": "Retry scheduled", + "Send test event": "Send test event", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Sent in the auth header below. Leave empty if your receiver does not need one.", + "Service": "Service", + "Show advanced options": "Show advanced options", + "SIEM": "SIEM", + "SIEM streaming": "SIEM streaming", + "SIEM streaming requires an Enterprise license.": "SIEM streaming requires an Enterprise license.", + "Source": "Source", + "Sourcetype": "Sourcetype", + "Tags": "Tags", + "Test connection": "Test connection", + "Test event delivered successfully.": "Test event delivered successfully.", + "Test the connection before saving.": "Test the connection before saving.", + "Test event delivered to {{name}}": "Test event delivered to {{name}}", + "Updated SIEM destination": "Updated SIEM destination", + "Verify TLS certificate": "Verify TLS certificate", + "e.g. Splunk prod": "e.g. Splunk prod" +} diff --git a/apps/client/public/locales/es-ES/translation.json b/apps/client/public/locales/es-ES/translation.json new file mode 100644 index 0000000..d380843 --- /dev/null +++ b/apps/client/public/locales/es-ES/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Cuenta", + "Active": "Activo", + "Add": "Agregar", + "Add group members": "Agregar miembros del grupo", + "Add groups": "Agregar grupos", + "Add members": "Agregar miembros", + "Add to groups": "Agregar a grupos", + "Add space members": "Agregar miembros al espacio", + "Add to favorites": "Agregar a favoritos", + "Admin": "Administrador", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "¿Estás seguro de que deseas eliminar este grupo? Los miembros perderán acceso a los recursos a los que este grupo tiene acceso.", + "Are you sure you want to delete this page?": "¿Está seguro de que desea eliminar esta página?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "¿Está seguro de que desea eliminar a este usuario del grupo? El usuario perderá acceso a los recursos a los que tiene acceso este grupo.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "¿Está seguro de que desea eliminar a este usuario del espacio? El usuario perderá todo acceso a este espacio.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "¿Está seguro de que desea restaurar esta versión? Cualquier cambio no versionado se perderá.", + "Can become members of groups and spaces in workspace": "Pueden convertirse en miembros de grupos y espacios en el espacio de trabajo", + "Can create and edit pages in space.": "Puede crear y editar páginas en el espacio.", + "Can edit": "Puede editar", + "Can manage workspace": "Puede gestionar el espacio de trabajo", + "Can manage workspace but cannot delete it": "Puede gestionar el espacio de trabajo pero no puede eliminarlo", + "Can view": "Puede ver", + "Can view pages in space but not edit.": "Puede ver páginas en el espacio pero no editarlas.", + "Cancel": "Cancelar", + "Change email": "Cambiar correo electrónico", + "Change password": "Cambiar contraseña", + "Change photo": "Cambiar foto", + "Choose a role": "Seleccione un rol", + "Choose your preferred color scheme.": "Elige tu esquema de color preferido.", + "Choose your preferred interface language.": "Elige tu idioma de interfaz preferido.", + "Choose your preferred page width.": "Elige el ancho de página que prefieras.", + "Confirm": "Confirmar", + "Copy as Markdown": "Copiar como Markdown", + "Copy link": "Copiar enlace", + "Create": "Crear", + "Create group": "Crear grupo", + "Create page": "Crear página", + "Create space": "Crear espacio", + "Create workspace": "Crear espacio de trabajo", + "Current password": "Contraseña actual", + "Dark": "Oscuro", + "Date": "Fecha", + "Delete": "Eliminar", + "Remove from page": "Quitar de la página", + "Base options": "Opciones de la base", + "Delete group": "Eliminar grupo", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "¿Está seguro de que desea eliminar esta página? Esto eliminará sus dependientes y el historial de la página. Esta acción es irreversible.", + "Description": "Descripción", + "Details": "Detalles", + "e.g ACME": "p. ej., ACME", + "e.g ACME Inc": "p. ej., ACME Inc", + "e.g Developers": "p. ej., Desarrolladores", + "e.g Group for developers": "p. ej., Grupo para desarrolladores", + "e.g product": "p. ej., producto", + "e.g Product Team": "p. ej., Equipo de producto", + "e.g Sales": "p. ej., Ventas", + "e.g Space for product team": "p. ej., Espacio para el equipo de producto", + "e.g Space for sales team to collaborate": "p. ej., Espacio para que el equipo de ventas colabore", + "Edit": "Editar", + "Read": "Leer", + "Edit group": "Editar grupo", + "Email": "Correo electrónico", + "Enter a strong password": "Introduce una contraseña fuerte", + "Enter valid email addresses separated by comma or space max_50": "Ingrese direcciones de correo electrónico válidas separadas por coma o espacio [max: 50]", + "enter valid emails addresses": "introduce direcciones de correo electrónico válidas", + "Enter your current password": "Introduce tu contraseña actual", + "enter your full name": "introduce tu nombre completo", + "Enter your new password": "Ingrese su nueva contraseña", + "Enter your new preferred email": "Introduce tu nuevo correo electrónico preferido", + "Enter your password": "Introduce tu contraseña", + "Error fetching page data.": "Error al obtener los datos de la página.", + "Error loading page history.": "Error al cargar el historial de la página.", + "Export": "Exportar", + "Failed to create page": "No se pudo crear la página", + "Failed to delete page": "No se pudo eliminar la página", + "Failed to restore page": "No se pudo restaurar la página", + "Failed to fetch recent pages": "Error al obtener las páginas recientes", + "Failed to import pages": "No se pudieron importar las páginas", + "Failed to load page. An error occurred.": "Error al cargar la página. Se produjo un error.", + "Failed to update data": "No se pudo actualizar los datos", + "Failed to create base": "No se pudo crear la base", + "Failed to update base": "No se pudo actualizar la base", + "Failed to delete base": "No se pudo eliminar la base", + "Failed to create property": "No se pudo crear la propiedad", + "Failed to update property": "No se pudo actualizar la propiedad", + "Failed to delete property": "No se pudo eliminar la propiedad", + "Failed to reorder property": "No se pudo reordenar la propiedad", + "Failed to create view": "No se pudo crear la vista", + "Failed to update view": "No se pudo actualizar la vista", + "Failed to delete view": "No se pudo eliminar la vista", + "Failed to create row": "No se pudo crear la fila", + "Failed to update row": "No se pudo actualizar la fila", + "Failed to delete row": "No se pudo eliminar la fila", + "Failed to delete rows": "No se pudieron eliminar las filas", + "Failed to reorder row": "No se pudo reordenar la fila", + "Failed to move card": "No se pudo mover la tarjeta", + "Failed to add card": "No se pudo añadir la tarjeta", + "Failed to export CSV": "No se pudo exportar el CSV", + "Favorite spaces": "Espacios favoritos", + "Favorite spaces appear here": "Los espacios favoritos aparecen aquí", + "Favorites": "Favoritos", + "Full access": "Acceso completo", + "Full page width": "Ancho de página completa", + "Full width": "Ancho completo", + "General": "General", + "Group": "Grupo", + "Group description": "Descripción del grupo", + "Group name": "Nombre del grupo", + "Groups": "Grupos", + "Has full access to space settings and pages.": "Tiene acceso completo a la configuración y páginas del espacio.", + "Home": "Inicio", + "Import pages": "Importar páginas", + "Import pages & space settings": "Importar páginas y configuraciones del espacio", + "Importing pages": "Importando páginas", + "invalid invitation link": "enlace de invitación no válido", + "Invitation signup": "Registro por invitación", + "Invite by email": "Invitar por correo electrónico", + "Invite members": "Invitar a miembros", + "Invite new members": "Invitar a nuevos miembros", + "Invite People": "Invitar personas", + "Invited members who are yet to accept their invitation will appear here.": "Los miembros invitados que aún no han aceptado su invitación aparecerán aquí.", + "Invited members will be granted access to spaces the groups can access": "Los miembros invitados recibirán acceso a los espacios a los que los grupos pueden acceder", + "Join the workspace": "Unirse al espacio de trabajo", + "Language": "Idioma", + "Light": "Claro", + "Link copied": "Enlace copiado", + "Login": "Iniciar sesión", + "Logout": "Cerrar sesión", + "Manage Group": "Gestionar Grupo", + "Manage members": "Gestionar miembros", + "member": "miembro", + "Member": "Miembro", + "members": "miembros", + "Members": "Miembros", + "My preferences": "Mis preferencias", + "My Profile": "Mi Perfil", + "My profile": "Mi perfil", + "Name": "Nombre", + "New email": "Nuevo correo electrónico", + "New page": "Nueva página", + "New password": "Nueva contraseña", + "No group found": "No se encontró ningún grupo", + "No page history saved yet.": "No hay historial de la página guardado aún.", + "No pages yet": "No hay páginas todavía", + "No shared pages": "No hay páginas compartidas", + "No results found...": "No se encontraron resultados...", + "No user found": "No se encontró usuario", + "Overview": "Visión general", + "Owner": "Propietario", + "page": "página", + "Page deleted successfully": "Página eliminada con éxito", + "Page history": "Historial de la página", + "Select version": "Seleccionar versión", + "Highlight changes": "Resaltar cambios", + "Page import is in progress. Please do not close this tab.": "La importación de la página está en curso. Por favor, no cierre esta pestaña.", + "Pages": "Páginas", + "pages": "páginas", + "Password": "Contraseña", + "Password changed successfully": "Contraseña cambiada con éxito", + "People": "Personas", + "Pending": "Pendiente", + "Please confirm your action": "Por favor, confirme su acción", + "Preferences": "Preferencias", + "Print PDF": "Imprimir PDF", + "Profile": "Perfil", + "Recently updated": "Recientemente actualizado", + "Remove": "Eliminar", + "Remove from favorites": "Quitar de favoritos", + "Remove group member": "Eliminar miembro del grupo", + "Remove space member": "Eliminar miembro del espacio", + "Restore": "Restaurar", + "Role": "Rol", + "Save": "Guardar", + "Search": "Buscar", + "Search for groups": "Buscar grupos", + "Search for users": "Buscar usuarios", + "Search for users and groups": "Buscar usuarios y grupos", + "Search...": "Buscar...", + "Select language": "Seleccionar idioma", + "Select role": "Seleccionar rol", + "Select role to assign to all invited members": "Selecciona el rol que se asignará a todos los miembros invitados", + "Select theme": "Seleccionar tema", + "Send invitation": "Enviar invitación", + "Invitation sent": "Invitación enviada", + "Settings": "Configuración", + "Setup workspace": "Configurar espacio de trabajo", + "Sign In": "Iniciar sesión", + "Sign Up": "Registrarse", + "Slug": "Slug", + "Space": "Espacio", + "Space description": "Descripción del espacio", + "Space menu": "Menú del espacio", + "Space name": "Nombre del espacio", + "Space settings": "Configuración del espacio", + "Space slug": "Slug del espacio", + "Spaces": "Espacios", + "Spaces you belong to": "Espacios a los que perteneces", + "No space found": "No se encontró ningún espacio", + "Search for spaces": "Buscar espacios", + "Start typing to search...": "Empieza a escribir para buscar...", + "Status": "Estado", + "Successfully imported": "Importado correctamente", + "Successfully restored": "Restaurado correctamente", + "System settings": "Configuración del sistema", + "Templates": "Plantillas", + "Theme": "Tema", + "To change your email, you have to enter your password and new email.": "Para cambiar tu correo electrónico, debes ingresar tu contraseña y nuevo correo electrónico.", + "Toggle full page width": "Alternar ancho completo de la página", + "Unable to import pages. Please try again.": "No se pueden importar las páginas. Por favor, inténtelo de nuevo.", + "untitled": "sin título", + "Untitled": "Sin título", + "Updated successfully": "Actualizado correctamente", + "User": "Usuario", + "Workspace": "Espacio de trabajo", + "Workspace Name": "Nombre del espacio de trabajo", + "Workspace settings": "Configuración del espacio de trabajo", + "You can change your password here.": "Puede cambiar su contraseña aquí.", + "Your Email": "Tu correo electrónico", + "Your import is complete.": "Su importación está completa.", + "Your name": "Tu nombre", + "Your Name": "Tu nombre", + "Your password": "Tu contraseña", + "Your password must be a minimum of 8 characters.": "Su contraseña debe tener un mínimo de 8 caracteres.", + "Sidebar toggle": "Alternar barra lateral", + "Comments": "Comentarios", + "404 page not found": "404 página no encontrada", + "Sorry, we can't find the page you are looking for.": "Lo sentimos, no podemos encontrar la página que buscas.", + "Take me back to homepage": "Llévame de vuelta a la página principal", + "Forgot password": "Olvidé mi contraseña", + "Forgot your password?": "¿Olvidó su contraseña?", + "A password reset link has been sent to your email. Please check your inbox.": "Se ha enviado un enlace para restablecer la contraseña a tu correo electrónico. Por favor, revisa tu bandeja de entrada.", + "Send reset link": "Enviar enlace de restablecimiento", + "Password reset": "Restablecimiento de contraseña", + "Your new password": "Tu nueva contraseña", + "Set password": "Establecer contraseña", + "Write a comment": "Escribir un comentario", + "Reply...": "Responder...", + "Error loading comments.": "Error al cargar comentarios.", + "No comments yet.": "No hay comentarios todavía.", + "No open comments.": "No hay comentarios abiertos.", + "No resolved comments.": "No hay comentarios resueltos.", + "Add a comment...": "Agregar un comentario...", + "Edit comment": "Editar comentario", + "Delete comment": "Eliminar comentario", + "Are you sure you want to delete this comment?": "¿Está seguro de que desea eliminar este comentario?", + "Delete chat": "Eliminar chat", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "¿Está seguro de que desea eliminar '{{title}}'? Esta acción no se puede deshacer.", + "Comment created successfully": "Comentario creado con éxito", + "Error creating comment": "Error al crear comentario", + "Comment updated successfully": "Comentario actualizado con éxito", + "Failed to update comment": "No se pudo actualizar el comentario", + "Comment deleted successfully": "Comentario eliminado con éxito", + "Failed to delete comment": "No se pudo eliminar el comentario", + "Comment resolved successfully": "Comentario resuelto con éxito", + "Comment re-opened successfully": "Comentario reabierto correctamente", + "Comment unresolved successfully": "Comentario marcado como no resuelto correctamente", + "Failed to resolve comment": "No se pudo resolver el comentario", + "Resolve comment": "Resolver comentario", + "Unresolve comment": "Marcar comentario como no resuelto", + "Resolve Comment Thread": "Resolver hilo de comentarios", + "Unresolve Comment Thread": "Marcar hilo de comentarios como no resuelto", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "¿Está seguro de que desea resolver este hilo de comentarios? Esto lo marcará como completado.", + "Are you sure you want to unresolve this comment thread?": "¿Está seguro de que desea no resolver este hilo de comentarios?", + "Resolved": "Resuelto", + "No active comments.": "No hay comentarios activos.", + "Revoke invitation": "Revocar invitación", + "Revoke": "Revocar", + "Don't": "No", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "¿Está seguro de que desea revocar esta invitación? El usuario no podrá unirse al espacio de trabajo.", + "Resend invitation": "Reenviar invitación", + "Anyone with this link can join this workspace.": "Cualquiera con este enlace puede unirse a este espacio de trabajo.", + "Invite link": "Enlace de invitación", + "Copy": "Copiar", + "Copy to space": "Copiar al espacio", + "Copied": "Copiado", + "Duplicate": "Duplicar", + "Select a user": "Seleccionar un usuario", + "Select a group": "Seleccionar un grupo", + "Export all pages and attachments in this space.": "Exportar todas las páginas y archivos adjuntos en este espacio.", + "Delete space": "Eliminar espacio", + "Are you sure you want to delete this space?": "¿Está seguro de que desea eliminar este espacio?", + "Delete this space with all its pages and data.": "Eliminar este espacio con todas sus páginas y datos.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Todas las páginas, comentarios, archivos adjuntos y permisos en este espacio se eliminarán de forma irreversible.", + "Confirm space name": "Confirmar nombre del espacio", + "Type the space name {{spaceName}} to confirm your action.": "Escribe el nombre del espacio {{spaceName}} para confirmar tu acción.", + "Format": "Formato", + "Include subpages": "Incluir subpáginas", + "Include attachments": "Incluir adjuntos", + "Select export format": "Seleccionar formato de exportación", + "Export failed:": "Exportación fallida:", + "export error": "error de exportación", + "Export page": "Exportar página", + "Export successful": "Exportación exitosa", + "Export space": "Exportar espacio", + "Export {{type}}": "Exportar {{type}}", + "File exceeds the {{limit}} attachment limit": "El archivo supera el límite de {{limit}} adjuntos", + "Media": "Multimedia", + "Align left": "Alinear a la izquierda", + "Align right": "Alinear a la derecha", + "Align center": "Alinear al centro", + "Alt text": "Texto alternativo", + "Describe this for accessibility.": "Describe esto para la accesibilidad.", + "Add a description": "Agregar una descripción", + "Justify": "Justificar", + "Merge cells": "Combinar celdas", + "Split cell": "Dividir celda", + "Delete column": "Eliminar columna", + "Delete row": "Eliminar fila", + "Add left column": "Agregar columna izquierda", + "Add right column": "Agregar columna derecha", + "Add row above": "Agregar fila arriba", + "Add row below": "Agregar fila debajo", + "Delete table": "Eliminar tabla", + "Add column left": "Agregar columna a la izquierda", + "Add column right": "Agregar columna a la derecha", + "Clear cell": "Borrar celda", + "Clear cells": "Borrar celdas", + "Toggle header cell": "Alternar celda de encabezado", + "Toggle header column": "Alternar columna de encabezado", + "Toggle header row": "Alternar fila de encabezado", + "Move column left": "Mover columna a la izquierda", + "Move column right": "Mover columna a la derecha", + "Move row down": "Mover fila hacia abajo", + "Move row up": "Mover fila hacia arriba", + "Sort A → Z": "Ordenar de A → Z", + "Sort Z → A": "Ordenar de Z → A", + "Info": "Información", + "Note": "Nota", + "Success": "Satisfactorio", + "Warning": "Advertencia", + "Danger": "Peligro", + "Mermaid diagram error:": "Error en diagrama de Mermaid:", + "Invalid Mermaid diagram": "Diagrama de Mermaid no válido", + "Double-click to edit Draw.io diagram": "Doble clic para editar el diagrama de Draw.io", + "Exit": "Salir", + "Save & Exit": "Guardar y Salir", + "Double-click to edit Excalidraw diagram": "Doble clic para editar el diagrama de Excalidraw", + "Paste link": "Pegar enlace", + "Paste link or search pages": "Pega un enlace o busca páginas", + "Link to web page": "Enlazar a una página web", + "Recents": "Recientes", + "Page or URL": "Página o URL", + "Link title": "Título del enlace", + "Edit link": "Editar enlace", + "Remove link": "Eliminar enlace", + "Add link": "Agregar enlace", + "Please enter a valid url": "Por favor, ingrese una URL válida", + "Empty equation": "Ecuación vacía", + "Invalid equation": "Ecuación no válida", + "Color": "Color", + "Text color": "Color del texto", + "Default": "Predeterminado", + "Blue": "Azul", + "Green": "Verde", + "Purple": "Morado", + "Red": "Rojo", + "Yellow": "Amarillo", + "Orange": "Naranja", + "Pink": "Rosa", + "Gray": "Gris", + "Embed link": "Enlace adjunto", + "Invalid {{provider}} embed link": "Enlace de inserción de {{provider}} no válido", + "Embed {{provider}}": "Incrustar {{provider}}", + "Enter {{provider}} link to embed": "Introduzca el enlace de {{provider}} para incrustar", + "Bold": "Negrita", + "Italic": "Cursiva", + "Underline": "Subrayar", + "Strike": "Tachar", + "Code": "Código", + "Comment": "Comentario", + "Text": "Texto", + "Heading 1": "Encabezado 1", + "Heading 2": "Encabezado 2", + "Heading 3": "Encabezado 3", + "To-do List": "Lista de cosas por hacer", + "Bullet List": "Lista con viñetas", + "Numbered List": "Lista numerada", + "Blockquote": "Cita en bloque", + "Just start typing with plain text.": "Simplemente comienza a escribir con texto sin formato.", + "Track tasks with a to-do list.": "Administra tareas con una lista de tareas pendientes.", + "Big section heading.": "Gran encabezado de sección.", + "Medium section heading.": "Encabezado de sección mediano.", + "Small section heading.": "Pequeño encabezado de sección.", + "Create a simple bullet list.": "Crear una lista con viñetas simple.", + "Create a list with numbering.": "Crear una lista con numeración.", + "Create block quote.": "Crear una cita en bloque.", + "Insert code snippet.": "Insertar fragmento de código.", + "Insert horizontal rule divider": "Insertar regla horizontal", + "Page break": "Salto de página", + "Insert a page break for printing.": "Inserta un salto de página para imprimir.", + "Footnote": "Nota al pie", + "Insert a footnote reference.": "Insertar una referencia de nota al pie.", + "Upload any image from your device.": "Sube cualquier imagen desde tu dispositivo.", + "Upload any video from your device.": "Sube cualquier video desde tu dispositivo.", + "Upload any audio from your device.": "Sube cualquier audio desde tu dispositivo.", + "Upload any file from your device.": "Sube cualquier archivo desde tu dispositivo.", + "Uploading {{name}}": "Subiendo {{name}}", + "Uploading file": "Subiendo archivo", + "Table": "Tabla", + "Insert a table.": "Insertar una tabla.", + "Insert collapsible block.": "Insertar bloque desplegable.", + "Video": "Vídeo", + "Divider": "Separador", + "Quote": "Cita", + "Image": "Imagen", + "Audio": "Audio", + "Embed PDF": "Adjuntar PDF", + "Upload and embed a PDF file.": "Sube y adjunta un archivo PDF.", + "Embed as PDF": "Adjuntar como PDF", + "Failed to load PDF": "Error al cargar el PDF", + "Convert to attachment": "Convertir en adjunto", + "File attachment": "Archivo adjunto", + "Toggle block": "Bloque desplegable", + "Callout": "Llamada de atención", + "Insert callout notice.": "Insertar aviso de llamada.", + "Math inline": "Matemáticas en línea", + "Insert inline math equation.": "Insertar ecuación matemática en línea.", + "Math block": "Bloque matemático", + "Insert math equation": "Insertar ecuación matemática", + "Mermaid diagram": "Diagrama Mermaid", + "Insert mermaid diagram": "Insertar diagrama Mermaid", + "Insert and design Drawio diagrams": "Insertar y diseñar diagramas de Drawio", + "Insert current date": "Insertar fecha actual", + "Time": "Hora", + "Insert current time": "Insertar hora actual", + "Draw and sketch excalidraw diagrams": "Dibujar y crear bocetos de diagramas de Excalidraw", + "Multiple": "Múltiple", + "Turn into": "Convertir en", + "Text align": "Alineación del texto", + "This page may have been deleted, moved, or you may not have access.": "Es posible que esta página haya sido eliminada, movida o que no tengas acceso.", + "Go to homepage": "Ir a la página principal", + "Pages you create will show up here.": "Las páginas que crees aparecerán aquí.", + "Heading {{level}}": "Encabezado {{level}}", + "Toggle title": "Alternar título", + "Write anything. Enter \"/\" for commands": "Escribe cualquier cosa. Introduce \"/\" para ver los comandos", + "Write...": "Escribe...", + "Column count": "Número de columnas", + "{{count}} Columns": "{count, plural, one {# columna} other {# columnas}}", + "{{count}} command available_one": "1 comando disponible", + "{{count}} command available_other": "{{count}} comandos disponibles", + "{{count}} result available_one": "1 resultado disponible", + "{{count}} result available_other": "{{count}} resultados disponibles", + "Equal columns": "Columnas iguales", + "Left sidebar": "Barra lateral izquierda", + "Right sidebar": "Barra lateral derecha", + "Wide center": "Centro ancho", + "Left wide": "Izquierda ancha", + "Right wide": "Derecha ancha", + "Names do not match": "Los nombres no coinciden", + "Today, {{time}}": "Hoy, {{time}}", + "Yesterday, {{time}}": "Ayer, {{time}}", + "now": "ahora", + "Space created successfully": "Espacio creado correctamente", + "Space updated successfully": "Espacio actualizado correctamente", + "Space deleted successfully": "Espacio eliminado correctamente", + "Members added successfully": "Miembros agregados correctamente", + "Member removed successfully": "Miembro eliminado correctamente", + "Member role updated successfully": "Rol del miembro actualizado correctamente", + "Created by: {{creatorName}}": "Creado por: {{creatorName}}", + "Created at: {{time}}": "Creado el: {{time}}", + "Edited by {{name}} {{time}}": "Editado por {{name}} {{time}}", + "Word count: {{wordCount}}": "Recuento de palabras: {{wordCount}}", + "Character count: {{characterCount}}": "Recuento de caracteres: {{characterCount}}", + "New update": "Nueva actualización", + "{{latestVersion}} is available": "{{latestVersion}} está disponible", + "Default page edit mode": "Modo de edición predeterminado de la página", + "Choose your preferred page edit mode. Avoid accidental edits.": "Elige tu modo de edición de página preferido. Evita ediciones accidentales.", + "Choose {{format}} file": "Elegir archivo {{format}}", + "Reading": "Lectura", + "Delete member": "Eliminar miembro", + "Member deleted successfully": "Miembro eliminado correctamente", + "Are you sure you want to delete this workspace member? This action is irreversible.": "¿Está seguro que desea eliminar este miembro del área de trabajo? Esta acción es irreversible.", + "Deactivate member": "Desactivar miembro", + "Activate member": "Activar miembro", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "¿Está seguro de que desea desactivar a este miembro del espacio de trabajo? Ya no podrá acceder a este espacio de trabajo.", + "Are you sure you want to activate this workspace member?": "¿Está seguro de que desea activar a este miembro del espacio de trabajo?", + "Deactivate": "Desactivar", + "Activate": "Activar", + "Deactivated": "Desactivado", + "Move": "Mover", + "Move page": "Mover página", + "Move page to a different space.": "Mover página a un espacio diferente.", + "Real-time editor connection lost. Retrying...": "Conexión del editor en tiempo real perdida. Reintentando...", + "Table of contents": "Tabla de contenido", + "Add headings (H1, H2, H3) to generate a table of contents.": "Añadir encabezados (H1, H2, H3) para generar un índice de contenidos.", + "Share": "Compartir", + "Public sharing": "Uso compartido público", + "Shared by": "Compartido por", + "Shared at": "Compartido el", + "Inherits public sharing from": "Hereda el uso compartido público de", + "Share to web": "Compartir en la web", + "Shared to web": "Compartido en la web", + "Anyone with the link can view this page": "Cualquier persona con el enlace puede ver esta página", + "Make this page publicly accessible": "Hacer que esta página sea accesible públicamente", + "Include sub-pages": "Incluir subpáginas", + "Make sub-pages public too": "Hacer públicas también las subpáginas", + "Allow search engines to index page": "Permitir que los motores de búsqueda indexen la página", + "Open page": "Abrir página", + "Page": "Página", + "Delete public share link": "Eliminar enlace público compartido", + "Delete share": "Eliminar recurso compartido", + "Are you sure you want to delete this shared link?": "¿Está seguro de que desea eliminar este enlace compartido?", + "Publicly shared pages from spaces you are a member of will appear here": "Las páginas compartidas públicamente de los espacios de los que eres miembro aparecerán aquí", + "Share deleted successfully": "Recurso compartido eliminado correctamente", + "Share not found": "Recurso compartido no encontrado", + "Failed to share page": "No se pudo compartir la página", + "Disable public sharing": "Desactivar el uso compartido público", + "Prevent members from sharing pages publicly.": "Evitar que los miembros compartan páginas públicamente.", + "Toggle public sharing": "Alternar el uso compartido público", + "Toggle space public sharing": "Alternar el uso compartido público del espacio", + "Allow viewers to comment": "Permitir que los espectadores comenten", + "Allow viewers to add comments on pages in this space.": "Permitir que los espectadores agreguen comentarios en las páginas de este espacio.", + "Toggle viewer comments": "Activar/desactivar comentarios de los espectadores", + "Public sharing is disabled at the workspace level": "El uso compartido público está desactivado a nivel de espacio de trabajo", + "Prevent pages in this space from being shared publicly.": "Evitar que las páginas en este espacio se compartan públicamente.", + "Page permissions": "Permisos de la página},{", + "Control who can view and edit individual pages. Available with an enterprise license.": "Controla quién puede ver y editar páginas individuales. Disponible con una licencia empresarial.", + "Enable public sharing": "Activar el uso compartido público", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "¿Está seguro de que desea activar el uso compartido público? Los miembros podrán compartir páginas públicamente.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "¿Está seguro de que desea desactivar el uso compartido público? Todos los enlaces compartidos existentes en este espacio de trabajo se eliminarán.", + "Are you sure you want to enable public sharing for this space?": "¿Está seguro de que desea activar el uso compartido público para este espacio?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "¿Está seguro de que desea desactivar el uso compartido público? Todos los enlaces compartidos existentes en este espacio se eliminarán.", + "Public sharing is disabled": "El uso compartido público está desactivado", + "Public sharing has been disabled at the workspace level.": "El uso compartido público se ha desactivado a nivel de espacio de trabajo.", + "Public sharing has been disabled for this space.": "El uso compartido público se ha desactivado para este espacio.", + "Copy page": "Copiar página", + "Copy page to a different space.": "Copiar página en otro espacio", + "Page copied successfully": "Página copiada correctamente", + "Page duplicated successfully": "Página duplicada correctamente", + "Find": "Buscar", + "Not found": "No encontrado", + "Previous Match (Shift+Enter)": "Coincidencia anterior (Mayús+Enter)", + "Next match (Enter)": "Siguiente coincidencia (Enter)", + "Match case (Alt+C)": "Distinguir mayúsculas y minúsculas (Alt+C)", + "Replace": "Reemplazar", + "Close (Escape)": "Cerrar (Escape)", + "Replace (Enter)": "Reemplazar (Enter)", + "Replace all (Ctrl+Alt+Enter)": "Reemplazar todo (Ctrl+Alt+Enter)", + "Replace all": "Reemplazar todo", + "View all": "Ver todo", + "View all spaces": "Ver todos los espacios", + "Error": "Error", + "Failed to disable MFA": "No se pudo desactivar la MFA", + "Disable two-factor authentication": "Desactivar la autenticación de dos factores", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Desactivar la autenticación de dos factores hará que tu cuenta sea menos segura. Solo necesitarás tu contraseña para iniciar sesión.", + "Please enter your password to disable two-factor authentication:": "Por favor ingresa tu contraseña para desactivar la autenticación de dos factores:", + "Two-factor authentication has been enabled": "La autenticación de dos factores se ha activado", + "Two-factor authentication has been disabled": "La autenticación de dos factores se ha desactivado", + "2-step verification": "Verificación en 2 pasos", + "Protect your account with an additional verification layer when signing in.": "Protege tu cuenta con una capa adicional de verificación al iniciar sesión.", + "Two-factor authentication is active on your account.": "La autenticación de dos factores está activa en tu cuenta.", + "Add 2FA method": "Agregar método de 2FA", + "Backup codes": "Códigos de respaldo", + "Disable": "Desactivar", + "Invalid verification code": "Código de verificación no válido", + "New backup codes have been generated": "Se han generado nuevos códigos de respaldo", + "Failed to regenerate backup codes": "No se pudieron regenerar los códigos de respaldo", + "About backup codes": "Acerca de los códigos de respaldo", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Los códigos de seguridad pueden usarse para acceder a tu cuenta si pierdes acceso a tu aplicación autenticadora. Cada código solo puede ser usado una vez.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "Puedes regenerar nuevos códigos de seguridad en cualquier momento. Esto invalidará todos los códigos existentes.", + "Confirm password": "Confirmar contraseña", + "Generate new backup codes": "Generar nuevos códigos de respaldo", + "Save your new backup codes": "Guarda tus nuevos códigos de respaldo", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Asegúrate de guardar estos códigos en un lugar seguro. Tus viejos códigos de seguridad ya no son válidos.", + "Your new backup codes": "Tus nuevos códigos de respaldo", + "I've saved my backup codes": "He guardado mis códigos de respaldo", + "Failed to setup MFA": "No se pudo configurar la MFA", + "Setup & Verify": "Configurar y verificar", + "Add to authenticator": "Agregar al autenticador", + "1. Scan this QR code with your authenticator app": "1. Escanea este código QR con tu aplicación de autenticación", + "Can't scan the code?": "¿No puedes escanear el código?", + "Enter this code manually in your authenticator app:": "Introduce este código manualmente en tu aplicación autenticadora:", + "2. Enter the 6-digit code from your authenticator": "2. Introduce el código de 6 dígitos de tu autenticador", + "Verify and enable": "Verificar y activar", + "Failed to generate QR code. Please try again.": "No se pudo generar el código QR. Por favor, intente de nuevo.", + "Backup": "Respaldo", + "Save codes": "Guardar códigos", + "Save your backup codes": "Guarda tus códigos de respaldo", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Estos códigos pueden usarse para acceder a tu cuenta si pierdes acceso a tu aplicación autenticadora. Cada código solo puede ser usado una vez.", + "Print": "Imprimir", + "Two-factor authentication has been set up. Please log in again.": "La autenticación de dos factores ha sido configurada. Por favor, inicie sesión nuevamente.", + "Two-Factor authentication required": "Se requiere autenticación de dos factores", + "Your workspace requires two-factor authentication for all users": "Tu espacio de trabajo requiere autenticación de dos factores para todos los usuarios", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Para continuar accediendo a tu espacio de trabajo, debes configurar la autenticación de dos factores. Esto añade una capa extra de seguridad a tu cuenta.", + "Set up two-factor authentication": "Configurar autenticación de dos factores", + "Cancel and logout": "Cancelar y cerrar sesión", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Tu espacio de trabajo requiere autenticación de dos factores. Por favor, configúralo para continuar.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Esto añade una capa extra de seguridad a tu cuenta al requerir un código de verificación de tu aplicación autenticadora.", + "Password is required": "La contraseña es obligatoria", + "Password must be at least 8 characters": "La contraseña debe tener al menos 8 caracteres", + "Please enter a 6-digit code": "Introduce un código de 6 dígitos", + "Code must be exactly 6 digits": "El código debe tener exactamente 6 dígitos", + "Enter the 6-digit code found in your authenticator app": "Introduce el código de 6 dígitos que aparece en tu aplicación de autenticación", + "Need help authenticating?": "¿Necesitas ayuda para autenticar?", + "MFA QR Code": "Código QR de MFA", + "Account created successfully. Please log in to set up two-factor authentication.": "Cuenta creada exitosamente. Por favor, inicie sesión para configurar la autenticación de dos factores.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Restablecimiento de contraseña exitoso. Por favor, inicie sesión con su nueva contraseña y complete la autenticación de dos factores.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Restablecimiento de contraseña exitoso. Por favor, inicie sesión con su nueva contraseña para configurar la autenticación de dos factores.", + "Password reset was successful. Please log in with your new password.": "El restablecimiento de contraseña fue exitoso. Por favor, inicie sesión con su nueva contraseña.", + "Two-factor authentication": "Autenticación de dos factores", + "Use authenticator app instead": "Usar la aplicación de autenticación en su lugar", + "Verify backup code": "Verificar código de respaldo", + "Use backup code": "Usar código de respaldo", + "Enter one of your backup codes": "Introduce uno de tus códigos de respaldo", + "Backup code": "Código de respaldo", + "Enter one of your backup codes. Each backup code can only be used once.": "Introduce uno de tus códigos de seguridad. Cada código de seguridad solo puede ser usado una vez.", + "Verify": "Verificar", + "Trash": "Papelera", + "Pages in trash will be permanently deleted after {{count}} days.": "{count, plural, one{Las páginas en la papelera se eliminarán permanentemente después de # día.} other{Las páginas en la papelera se eliminarán permanentemente después de # días.}}", + "Deleted": "Eliminado", + "No pages in trash": "No hay páginas en la papelera", + "Permanently delete page?": "¿Eliminar página permanentemente?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "¿Está seguro de que desea eliminar '{{title}}' permanentemente? Esta acción no se puede deshacer.", + "Restore '{{title}}' and its sub-pages?": "¿Restaurar '{{title}}' y sus subpáginas?", + "Move to trash": "Mover a la papelera", + "Move this page to trash?": "¿Mover esta página a la papelera?", + "Restore page": "Restaurar página", + "Permanently delete": "Eliminar permanentemente", + "{{name}} moved this page to Trash {{time}}.": "{{name}} movió esta página a la Papelera {{time}}.", + "Page moved to trash": "Página movida a la papelera", + "Page restored successfully": "Página restaurada correctamente", + "Deleted by": "Eliminado por", + "Deleted at": "Eliminado el", + "Preview": "Vista previa", + "Base preview unavailable": "Vista previa de la base no disponible", + "Restore this base to view its contents.": "Restaura esta base para ver su contenido.", + "Subpages": "Subpáginas", + "Failed to load subpages": "No se pudieron cargar las subpáginas", + "No subpages": "No hay subpáginas", + "Subpages (Child pages)": "Subpáginas (páginas hijas)", + "List all subpages of the current page": "Listar todas las subpáginas de la página actual", + "Attachments": "Archivos adjuntos", + "All spaces": "Todos los espacios", + "Unknown": "Desconocido", + "Find a space": "Buscar un espacio", + "Search in all your spaces": "Buscar en todos tus espacios", + "Type": "Tipo", + "Enterprise": "Empresarial", + "Download attachment": "Descargar archivo adjunto", + "Allowed email domains": "Dominios de correo electrónico permitidos", + "Only users with email addresses from these domains can signup via SSO.": "Solo los usuarios con direcciones de correo electrónico de estos dominios pueden registrarse mediante SSO.", + "Enter valid domain names separated by comma or space": "Introduce nombres de dominio válidos separados por comas o espacios", + "Enforce two-factor authentication": "Exigir autenticación de dos factores", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Una vez aplicada, todos los miembros deben habilitar la autenticación de dos factores para acceder al espacio de trabajo.", + "Toggle MFA enforcement": "Alternar exigencia de MFA", + "Display name": "Nombre para mostrar", + "Allow signup": "Permitir registro", + "Enabled": "Activado", + "Advanced Settings": "Configuración avanzada", + "Enable TLS/SSL": "Activar TLS/SSL", + "Use secure connection to LDAP server": "Usar una conexión segura al servidor LDAP", + "Group sync": "Sincronización de grupos", + "No SSO providers found.": "No se encontraron proveedores de SSO.", + "Delete SSO provider": "Eliminar proveedor de SSO", + "Are you sure you want to delete this SSO provider?": "¿Está seguro de que desea eliminar este proveedor de SSO?", + "Action": "Acción", + "{{ssoProviderType}} configuration": "Configuración de {{ssoProviderType}}", + "Icon": "Icono", + "Upload image": "Subir imagen", + "Remove image": "Eliminar imagen", + "Failed to remove image": "No se ha podido eliminar la imagen", + "Image exceeds 10MB limit.": "La imagen excede del límite de 10 MB", + "Image removed successfully": "Imagen eliminada correctamente", + "API key": "Clave API", + "API keys": "Claves API", + "API management": "Gestión de API", + "Custom expiration date": "Fecha de vencimiento personalizada", + "Enter a descriptive token name": "Introduce un nombre descriptivo del token", + "Expiration": "Vencimiento", + "Expired": "Vencido", + "Expires": "Vence", + "Last use": "Último uso", + "No API keys found": "No se han encontrado claves API", + "No expiration": "Sin vencimiento", + "Revoked successfully": "Revocada correctamente", + "Select expiration date": "Seleccionar fecha de vencimiento", + "This action cannot be undone. Any applications using this API key will stop working.": "Esta acción no se puede deshacer. Las aplicaciones que utilicen esta clave API dejarán de funcionar.", + "Update": "Actualizar", + "Update {{credential}}": "Actualizar {{credential}}", + "Manage API keys for all users in the workspace": "Gestionar claves API para todos los usuarios en el espacio de trabajo", + "Restrict API key creation to admins": "Restringir la creación de claves API a administradores", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Solo los administradores y propietarios pueden crear nuevas claves API. Las claves de miembros existentes seguirán funcionando.", + "Toggle restrict API keys to admins": "Activar o desactivar la restricción de claves API solo a administradores", + "API key creation is restricted to admins by your workspace administrator.": "La creación de claves API está restringida a administradores por el administrador de tu espacio de trabajo.", + "AI settings": "Configuración de IA", + "AI search": "Búsqueda de IA", + "AI Answer": "Respuesta de IA", + "Ask AI": "Preguntar a IA", + "AI is thinking...": "IA está pensando...", + "Thinking": "Pensando", + "Ask a question...": "Haz una pregunta...", + "AI Answers": "Respuestas de IA", + "AI-powered search (AI Answers)": "Búsqueda impulsada por IA (Respuestas de IA)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "La búsqueda de IA utiliza incrustaciones vectoriales para proporcionar capacidades de búsqueda semántica en todo el contenido de su espacio de trabajo.", + "Toggle AI search": "Alternar búsqueda de IA", + "Generative AI (Ask AI)": "IA generativa (Preguntar a la IA)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Habilitar la generación de contenido impulsada por IA en el editor. Permite a los usuarios generar, mejorar, traducir y transformar texto.", + "Toggle generative AI": "Activar IA generativa", + "Upgrade your plan": "Mejora tu plan", + "Available with a paid license": "Disponible con una licencia de pago", + "Upgrade your license tier.": "Mejora el nivel de tu licencia.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "La IA está disponible en las ediciones de pago de Docmost. Contacte con sales@docmost.com.", + "AI & MCP": "IA y MCP", + "AI": "IA", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Protocolo de Contexto del Modelo (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Habilite el servidor MCP para permitir que asistentes de IA y herramientas interactúen con el contenido de su espacio de trabajo.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP solo está disponible en la edición empresarial de Docmost. Contacte con sales@docmost.com.", + "MCP Server URL": "URL del servidor MCP", + "Connect AI assistants with your Docmost account via OAuth.": "Conecta asistentes de IA con tu cuenta de Docmost mediante OAuth.", + "Enforce OAuth": "Exigir OAuth", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "Los asistentes de IA deben conectarse con una cuenta de Docmost mediante OAuth. No se pueden usar claves API con el servidor MCP.", + "Toggle enforce OAuth for MCP": "Activar o desactivar la exigencia de OAuth para MCP", + "Supported tools": "Herramientas compatibles", + "MCP server URL:": "URL del servidor MCP:", + "Learn more": "Más información", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Gestiona las claves de API para todos los usuarios en el espacio de trabajo. Consulta la documentación de la API para detalles de uso.", + "View the API documentation for usage details.": "Consulta la documentación de la API para detalles de uso.", + "View the MCP documentation.": "Consulta la documentación de MCP.", + "Sources": "Fuentes", + "AI Answers not available for attachments": "Respuestas de IA no disponibles para archivos adjuntos", + "No answer available": "No hay respuesta disponible", + "Background color": "Color de fondo", + "Highlight color": "Color de resaltado", + "Remove color": "Eliminar color", + "Notifications": "Notificaciones", + "No notifications": "Sin notificaciones", + "No unread notifications": "No hay notificaciones no leídas", + "All notifications": "Todas las notificaciones", + "Unread only": "Solo no leídas", + "Mark all as read": "Marcar todo como leído", + "Mark as read": "Marcar como leído", + "More options": "Más opciones", + "{{name}} mentioned you in a comment": "{{name}} te mencionó en un comentario", + "{{name}} commented on a page": "{{name}} comentó en una página", + "{{name}} resolved a comment": "{{name}} resolvió un comentario", + "{{name}} mentioned you on a page": "{{name}} te mencionó en una página", + "{{name}} gave you edit access to a page": "{{name}} te dio acceso de edición a una página", + "{{name}} gave you view access to a page": "{{name}} te dio acceso de visualización a una página", + "{{name}} updated a page": "{{name}} actualizó una página", + "Watch page": "Seguir página", + "Stop watching": "Dejar de seguir", + "Watch space": "Seguir espacio", + "Stop watching space": "Dejar de seguir espacio", + "Email notifications": "Notificaciones por correo electrónico", + "Page updates": "Actualizaciones de página", + "Get notified when pages you watch are updated.": "Recibe una notificación cuando se actualicen las páginas que sigues.", + "Page mentions": "Menciones en la página", + "Get notified when someone mentions you on a page.": "Recibe una notificación cuando alguien te mencione en una página.", + "Comment mentions": "Menciones en comentarios", + "Get notified when someone mentions you in a comment.": "Recibe una notificación cuando alguien te mencione en un comentario.", + "New comments": "Nuevos comentarios", + "Get notified about new comments on threads you participate in.": "Recibe una notificación sobre nuevos comentarios en los hilos donde participas.", + "Resolved comments": "Comentarios resueltos", + "Get notified when your comment is resolved.": "Recibe una notificación cuando tu comentario sea resuelto.", + "You are now watching this page": "Ahora sigues esta página", + "You are no longer watching this page": "Ya no sigues esta página", + "You are now watching this space": "Ahora sigues este espacio", + "You are no longer watching this space": "Ya no sigues este espacio", + "Direct": "Directo", + "Updates": "Actualizaciones", + "Today": "Hoy", + "Yesterday": "Ayer", + "This week": "Esta semana", + "Older": "Más antiguo", + "Restricted page": "Página restringida", + "Restricted pages cannot be shared publicly.": "Las páginas restringidas no pueden compartirse públicamente.", + "Restricted by parent": "Restringida por la página padre", + "Restricted": "Restringida", + "Open": "Abierta", + "Inherits restrictions from ancestor page": "Hereda las restricciones de una página superior.", + "Only people listed below can access this page": "Solo las personas que figuran a continuación pueden acceder a esta página.", + "Everyone in this space can access": "Todos en este espacio pueden acceder.", + "No additional restrictions on this page": "No hay restricciones adicionales en esta página.", + "Only specific people can access": "Solo determinadas personas pueden acceder.", + "Use only inherited restrictions": "Usar solo las restricciones heredadas.", + "Add restrictions on top of inherited": "Agregar restricciones además de las heredadas.", + "Inherited restriction": "Restricción heredada", + "Access limited by": "Acceso limitado por", + "Restrict access to control who can view and edit this page": "Restringir el acceso para controlar quién puede ver y editar esta página.", + "Add additional restrictions specific to this page": "Agregar restricciones adicionales específicas para esta página.", + "Access": "Acceso", + "People with access": "Personas con acceso", + "Remove all": "Eliminar todo", + "Remove access": "Eliminar acceso", + "Remove all access": "Eliminar todo el acceso", + "Are you sure you want to remove this member's access to the page?": "¿Está seguro de que desea eliminar el acceso de este miembro a la página?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "¿Está seguro de que desea eliminar todo el acceso específico? Esto hará que la página esté abierta a todos en el espacio.", + "Trash retention": "Retención de la papelera", + "Pages in trash will be permanently deleted after this period.": "Las páginas en la papelera se eliminarán permanentemente después de este período.", + "Trash retention updated": "Retención de la papelera actualizada", + "Failed to update trash retention": "No se pudo actualizar la retención de la papelera.", + "Removed page restriction": "Restricción de página eliminada", + "Added page permission": "Permiso de página añadido", + "Removed page permission": "Permiso de página eliminado", + "Changed page permission": "Permiso de página cambiado", + "Requested password reset": "Se solicitó el restablecimiento de contraseña", + "Created template": "Plantilla creada", + "Deleted template": "Plantilla eliminada", + "day": "día", + "days": "días", + "week": "semana", + "weeks": "semanas", + "month": "mes", + "months": "meses", + "year": "año", + "years": "años", + "Period": "Período", + "Fixed date": "Fecha fija", + "Indefinitely": "Indefinidamente", + "Days": "Días", + "Weeks": "Semanas", + "Months": "Meses", + "Years": "Años", + "Pick a date": "Selecciona una fecha", + "Maximum is {{max}} {{unit}} for this unit": "El máximo es {{max}} {{unit}} para esta unidad", + "Never expires. Verifiers can re-verify at any time.": "Nunca caduca. Los verificadores pueden volver a verificar en cualquier momento.", + "Verified": "Verificado", + "Review needed": "Revisión necesaria", + "Verification expired": "La verificación ha caducado", + "Draft": "Borrador", + "In Approval": "En aprobación", + "In approval": "En aprobación", + "Approved": "Aprobado", + "Obsolete": "Obsoleto", + "Expiring": "Próximo a caducar", + "Set up verification": "Configurar verificación", + "Verify page": "Verificar página", + "Page verification": "Verificación de página", + "Add verification": "Añadir verificación", + "Edit verification": "Editar verificación", + "Search by title": "Buscar por título", + "Choose how this page should stay accurate.": "Elige cómo debe mantenerse precisa esta página.", + "Recurring verification": "Verificación periódica", + "Verifiers re-confirm this page on a schedule.": "Los verificadores vuelven a confirmar esta página según una programación.", + "Re-verify on a schedule (e.g every 30 days )": "Volver a verificar según una programación (p. ej., cada 30 días)", + "Page stays editable at all times": "La página permanece editable en todo momento", + "Best for runbooks, FAQs, living documentation": "Ideal para runbooks, preguntas frecuentes y documentación viva", + "Approval workflow": "Flujo de aprobación", + "Formal document lifecycle with named approvers.": "Ciclo de vida formal del documento con aprobadores designados.", + "Draft → In approval → Approved → Obsolete": "Borrador → En aprobación → Aprobado → Obsoleto", + "Locked once approved, with full history": "Bloqueado una vez aprobado, con historial completo", + "Designed for ISO 9001, ISO 13485, and FDA": "Diseñado para ISO 9001, ISO 13485 y FDA", + "Best for SOPs and controlled documents": "Ideal para SOP y documentos controlados", + "Back": "Atrás", + "Quality management": "Gestión de calidad", + "Recurring": "Periódica", + "Pages move through draft, approval, and approved stages.": "Las páginas pasan por las etapas de borrador, aprobación y aprobado.", + "Verifiers": "Verificadores", + "Add verifier": "Añadir verificador", + "I've reviewed this page for accuracy": "He revisado la exactitud de esta página", + "Set up": "Configurar", + "Remove verification": "Eliminar verificación", + "Are you sure you want to remove verification from this page?": "¿Seguro que quieres eliminar la verificación de esta página?", + "Assigned verifiers must periodically re-verify this page.": "Los verificadores asignados deben volver a verificar esta página periódicamente.", + "Last verified by {{name}} {{time}} (expired)": "Última verificación por {{name}} {{time}} (caducada)", + "The fixed expiration date has passed.": "La fecha fija de vencimiento ya pasó.", + "Verified by {{name}} {{time}}": "Verificado por {{name}} {{time}}", + "Expires {{date}}": "Caduca el {{date}}", + "Expired {{date}}": "Caducó el {{date}}", + "Mark as obsolete": "Marcar como obsoleto", + "Mark obsolete": "Marcar como obsoleto", + "Returned by {{name}} {{time}}": "Devuelto por {{name}} {{time}}", + "No approval has been requested yet.": "Aún no se ha solicitado aprobación.", + "Submitted by {{name}} {{time}}": "Enviado por {{name}} {{time}}", + "Someone": "Alguien", + "Approved by {{name}} {{time}}": "Aprobado por {{name}} {{time}}", + "This document has been marked as obsolete.": "Este documento ha sido marcado como obsoleto.", + "Rejection comment": "Comentario de rechazo", + "Reason for returning this document...": "Motivo de la devolución de este documento...", + "Confirm rejection": "Confirmar rechazo", + "Submit for approval": "Enviar para aprobación", + "Reject": "Rechazar", + "Approve": "Aprobar", + "Re-submit for approval": "Volver a enviar para aprobación", + "Verified until": "Verificado hasta", + "QMS": "SGC", + "Verified pages": "Páginas verificadas", + "Search pages...": "Buscar páginas...", + "Filter by space": "Filtrar por espacio", + "Filter by type": "Filtrar por tipo", + "{{name}} verified a page": "{{name}} verificó una página", + "{{name}} submitted a page for your approval": "{{name}} envió una página para tu aprobación", + "{{name}} returned a page for revision": "{{name}} devolvió una página para revisión", + "Page verification expires soon": "La verificación de la página caduca pronto", + "Page verification has expired": "La verificación de la página ha caducado", + "SIEM destination {{name}} is failing": "El destino SIEM {{name}} está fallando", + "SIEM destination {{name}} was disabled after 24 hours of failures": "El destino SIEM {{name}} se deshabilitó después de 24 horas de fallos", + "SIEM destination {{name}} recovered": "El destino SIEM {{name}} se recuperó", + "Verifying your email": "Verificando tu correo electrónico", + "Please wait...": "Por favor, espera...", + "Verification failed. The link may have expired.": "La verificación ha fallado. Es posible que el enlace haya expirado.", + "Check your email": "Revisa tu correo electrónico", + "We sent a verification link to {{email}}.": "Te enviamos un enlace de verificación a {{email}}.", + "We sent a verification link to your email.": "Te enviamos un enlace de verificación a tu correo.", + "Click the link to verify your email and access your workspace.": "Haz clic en el enlace para verificar tu correo electrónico y acceder a tu espacio de trabajo.", + "Resend verification email": "Reenviar correo de verificación", + "Verification email sent. Please check your inbox.": "Correo de verificación enviado. Por favor, revisa tu bandeja de entrada.", + "Failed to resend verification email. Please try again.": "No se pudo reenviar el correo de verificación. Por favor, intente de nuevo.", + "We've sent you an email with your associated workspaces.": "Te hemos enviado un correo electrónico con tus espacios de trabajo asociados.", + "Load more": "Cargar más", + "Log out of all devices": "Cerrar sesión en todos los dispositivos", + "Log out of all sessions except this device": "Cerrar sesión en todas las sesiones excepto en este dispositivo", + "This Device": "Este dispositivo", + "Unknown device": "Dispositivo desconocido", + "No active sessions": "No hay sesiones activas", + "Session revoked": "Sesión revocada", + "All other sessions revoked": "Todas las demás sesiones revocadas", + "Last used": "Último uso", + "Created": "Creado", + "Rename": "Renombrar", + "Publish": "Publicar", + "Security": "Seguridad", + "Enforce SSO": "Exigir SSO", + "Once enforced, members will not be able to login with email and password.": "Una vez que se exija, los miembros no podrán iniciar sesión con correo electrónico y contraseña.", + "AI-generated content may not be accurate.": "Es posible que el contenido generado por IA no sea preciso.", + "AI Chat": "Chat de IA", + "Analyze for insights": "Analizar para obtener información", + "Ask anything...": "Pregunta lo que quieras...", + "Assistant said:": "El asistente dijo:", + "Chat history": "Historial de chat", + "Chat name": "Nombre del chat", + "Chat transcript": "Transcripción del chat", + "Close": "Cerrar", + "Copy assistant response": "Copiar respuesta del asistente", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "No se pudo cargar el chat. Se produjo un error.", + "Failed to render this message.": "No se pudo mostrar este mensaje.", + "How can I help you today?": "¿Cómo puedo ayudarte hoy?", + "New chat": "Nuevo chat", + "No chat history": "No hay historial de chat", + "No chats found": "No se encontraron chats", + "No conversations yet": "Aún no hay conversaciones", + "Open full page": "Abrir página completa", + "Scroll to bottom": "Desplazarse hasta abajo", + "You said:": "Dijiste:", + "Previous 7 days": "Últimos 7 días", + "Previous 30 days": "Últimos 30 días", + "Search chats...": "Buscar chats...", + "Search chats": "Buscar chats", + "Ask anything... Use @ to mention pages": "Pregunta lo que sea... Usa @ para mencionar páginas", + "Ask anything or search your workspace": "Pregunta cualquier cosa o busca en tu espacio de trabajo", + "Welcome to {{name}}": "Te damos la bienvenida a {{name}}", + "Add files": "Agregar archivos", + "Mention a page": "Mencionar una página", + "Start a new chat to see it here.": "Inicia un nuevo chat para verlo aquí.", + "Summarize this page": "Resumir esta página", + "Toggle AI Chat": "Alternar chat de IA", + "Translate this page": "Traducir esta página", + "Try a different search term.": "Prueba con otro término de búsqueda.", + "Try again": "Intentar de nuevo", + "Untitled chat": "Chat sin título", + "What can I help you with?": "¿En qué puedo ayudarte?", + "Are you sure you want to revoke this {{credential}}": "¿Está seguro de que desea revocar esta {{credential}}?", + "Automatically provision users and groups from your identity provider via SCIM.": "Aprovisione automáticamente usuarios y grupos desde su proveedor de identidad mediante SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Configure su proveedor de identidad con esta URL para aprovisionar usuarios y grupos.", + "Create {{credential}}": "Crear {{credential}}", + "{{credential}} created": "{{credential}} creada", + "{{credential}} created successfully": "{{credential}} creada con éxito", + "Created by": "Creado por", + "Custom": "Personalizado", + "Enable SCIM": "Habilitar SCIM", + "Enter a descriptive name": "Introduzca un nombre descriptivo", + "I've saved my {{credential}}": "He guardado mi {{credential}}", + "Important": "Importante", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Asegúrese de copiar su {{credential}} ahora. ¡No podrá volver a verla!", + "Never": "Nunca", + "Revoke {{credential}}": "Revocar {{credential}}", + "SCIM endpoint URL": "URL del endpoint de SCIM", + "SCIM provisioning": "Aprovisionamiento SCIM", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM tiene prioridad sobre la sincronización de grupos de SSO mientras esté habilitado.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "Ha alcanzado el máximo de {{max}} tokens SCIM. Elimine un token existente para crear uno nuevo.", + "SCIM token": "Token SCIM", + "SCIM tokens": "Tokens SCIM", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Esta acción no se puede deshacer. Su proveedor de identidad dejará de sincronizarse inmediatamente.", + "Toggle SCIM provisioning": "Activar o desactivar el aprovisionamiento SCIM", + "Token": "Token", + "Page menu": "Menú de la página", + "Expand": "Expandir", + "Collapse": "Contraer", + "Comment menu": "Menú de comentarios", + "Group menu": "Menú del grupo", + "Show hidden breadcrumbs": "Mostrar rutas de navegación ocultas", + "Breadcrumbs": "Rutas de navegación", + "Page actions": "Acciones de la página", + "Pick emoji": "Elegir emoji", + "Template menu": "Menú de plantillas", + "Use": "Usar", + "Use template": "Usar plantilla", + "Preview template: {{title}}": "Vista previa de la plantilla: {{title}}", + "Use a template": "Usar una plantilla", + "Search templates...": "Buscar plantillas...", + "Search spaces...": "Buscar espacios...", + "No templates found": "No se encontraron plantillas", + "No spaces found": "No se encontraron espacios", + "Browse all templates": "Ver todas las plantillas", + "This space": "Este espacio", + "All templates": "Todas las plantillas", + "Global": "Global", + "New template": "Nueva plantilla", + "Edit template": "Editar plantilla", + "Are you sure you want to delete this template?": "¿Seguro que quieres eliminar esta plantilla?", + "Template scope updated": "Alcance de la plantilla actualizado", + "Choose which space this template belongs to": "Elige a qué espacio pertenece esta plantilla", + "Only workspace admins can create global templates.": "Solo los administradores del espacio de trabajo pueden crear plantillas globales.", + "You need edit access to this space to create templates.": "Necesitas acceso de edición a este espacio para crear plantillas.", + "Scope": "Alcance", + "Select scope": "Seleccionar alcance", + "Title": "Título", + "Saving...": "Guardando...", + "Saved": "Guardado", + "Save failed. Retry": "Error al guardar. Reintentar", + "By {{name}}": "Por {{name}}", + "Updated {{time}}": "Actualizado {{time}}", + "Choose destination": "Elegir destino", + "Search pages and spaces...": "Buscar páginas y espacios...", + "No results found": "No se encontraron resultados", + "You don't have permission to create pages here": "No tienes permiso para crear páginas aquí", + "Chat menu for {{title}}": "Menú del chat de {{title}}", + "API key menu": "Menú de la clave API", + "Jump to comment selection": "Ir a la selección de comentarios", + "Slash commands": "Comandos de barra", + "Mention suggestions": "Sugerencias de menciones", + "Link suggestions": "Sugerencias de enlaces", + "Diagram editor": "Editor de diagramas", + "Add comment": "Agregar comentario", + "Find and replace": "Buscar y reemplazar", + "Main navigation": "Navegación principal", + "Space navigation": "Navegación del espacio", + "Settings navigation": "Navegación de configuración", + "AI navigation": "Navegación de IA", + "Breadcrumb": "Ruta de navegación", + "Synced block": "Bloque sincronizado", + "Create a block that stays in sync across pages.": "Crea un bloque que se mantenga sincronizado entre páginas.", + "Editing original": "Editando original", + "Copy synced block": "Copiar bloque sincronizado", + "Unsync": "Desincronizar", + "Delete synced block": "Eliminar bloque sincronizado", + "Synced to {{count}} other page_one": "Sincronizado con {{count}} página más", + "Synced to {{count}} other page_other": "Sincronizado con {{count}} páginas más", + "ORIGINAL": "ORIGINAL", + "THIS PAGE": "ESTA PÁGINA", + "No pages": "No hay páginas", + "The original synced block no longer exists": "El bloque sincronizado original ya no existe", + "You don't have access to this synced block": "No tienes acceso a este bloque sincronizado", + "Failed to load this synced block": "No se pudo cargar este bloque sincronizado", + "Fixed editor toolbar": "Barra de herramientas fija del editor", + "Show a formatting toolbar above the editor with quick access to common actions.": "Muestra una barra de herramientas de formato sobre el editor con acceso rápido a acciones comunes.", + "Toggle fixed editor toolbar": "Alternar barra de herramientas fija del editor", + "Normal text": "Texto normal", + "More inline formatting": "Más formato en línea", + "Subscript": "Subíndice", + "Superscript": "Superíndice", + "Inline code": "Código en línea", + "Insert media": "Insertar contenido multimedia", + "Mention": "Mención", + "Emoji": "Emojis", + "Columns": "Columnas", + "More inserts": "Más inserciones", + "Embeds": "Integraciones", + "Diagrams": "Diagramas", + "Advanced": "Avanzado", + "Utility": "Utilidad", + "Decrease indent": "Disminuir sangría", + "Increase indent": "Aumentar sangría", + "Clear formatting": "Borrar formato", + "Code block": "Bloque de código", + "Experimental": "Experimental", + "Strikethrough": "Tachado", + "Undo": "Deshacer", + "Redo": "Rehacer", + "Backlinks": "Enlaces entrantes", + "Last updated by": "Última actualización por", + "Last updated": "Última actualización", + "Stats": "Estadísticas", + "Word count": "Recuento de palabras", + "Characters": "Caracteres", + "Incoming links": "Enlaces entrantes", + "Outgoing links": "Enlaces salientes", + "Incoming links ({{count}})": "Enlaces entrantes ({{count}})", + "Outgoing links ({{count}})": "Enlaces salientes ({{count}})", + "No pages link here yet.": "Todavía no hay páginas que enlacen aquí.", + "This page doesn't link to other pages yet.": "Esta página todavía no enlaza a otras páginas.", + "Verified until {{date}}": "Verificado hasta {{date}}", + "Labels": "Etiquetas", + "Add label": "Agregar etiqueta", + "No labels yet": "Todavía no hay etiquetas", + "Already added": "Ya agregado", + "Invalid label name": "Nombre de etiqueta no válido", + "No matches": "Sin coincidencias", + "Search or create…": "Buscar o crear…", + "Remove label {{name}}": "Eliminar etiqueta {{name}}", + "Failed to add label": "No se pudo agregar la etiqueta", + "Failed to remove label": "No se pudo eliminar la etiqueta", + "No pages with this label": "No hay páginas con esta etiqueta", + "Pages tagged with this label will appear here.": "Las páginas etiquetadas con esta etiqueta aparecerán aquí.", + "No pages match your search.": "Ninguna página coincide con tu búsqueda.", + "Updated {{date}}": "Actualizado el {{date}}", + "Cell actions": "Acciones de celda", + "Column actions": "Acciones de columna", + "Row actions": "Acciones de fila", + "Filter": "Filtrar", + "Page title": "Título de la página", + "Page content": "Contenido de la página", + "Member actions for {{name}}": "Acciones de miembro para {{name}}", + "Toggle password visibility": "Alternar visibilidad de la contraseña", + "Send comment": "Enviar comentario", + "Token actions": "Acciones de token", + "Template settings": "Configuración de la plantilla", + "Edit diagram": "Editar diagrama", + "Edit embed": "Editar contenido integrado", + "Edit drawing": "Editar dibujo", + "Delete equation": "Eliminar ecuación", + "Invite actions": "Acciones de invitación", + "Get started": "Comenzar", + "* indicates required fields": "* indica los campos obligatorios", + "List of spaces in this workspace": "Lista de espacios en este espacio de trabajo", + "Active sessions": "Sesiones activas", + "Add {{name}} to favorites": "Agregar {{name}} a favoritos", + "Remove {{name}} from favorites": "Quitar {{name}} de favoritos", + "Added to favorites": "Agregado a favoritos", + "Removed from favorites": "Quitado de favoritos", + "Added {{name}} to favorites": "Se agregó {{name}} a favoritos", + "Removed {{name}} from favorites": "Se quitó {{name}} de favoritos", + "Page menu for {{name}}": "Menú de página para {{name}}", + "Create subpage of {{name}}": "Crear subpágina de {{name}}", + "Allow personal spaces": "Permitir espacios personales", + "Members can create their own personal space.": "Los miembros pueden crear su propio espacio personal.", + "Toggle allow personal spaces": "Alternar permitir espacios personales", + "Create personal space": "Crear espacio personal", + "Personal space": "Espacio personal", + "{{name}}'s space": "Espacio de {{name}}", + "Apply": "Aplicar", + "Cells that aren't already a page reference will be cleared.": "Las celdas que aún no sean una referencia de página se borrarán.", + "Cells that aren't a valid URL will be cleared.": "Las celdas que no sean una URL válida se borrarán.", + "Cells that aren't a valid email address will be cleared.": "Las celdas que no sean una dirección de correo electrónico válida se borrarán.", + "Cells that can't be parsed as a date will be cleared.": "Las celdas que no puedan interpretarse como una fecha se borrarán.", + "Cells that can't be parsed as a number will be cleared.": "Las celdas que no puedan interpretarse como un número se borrarán.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Las celdas se convertirán de forma forzada (yes/true/1 pasarán a estar marcadas; todo lo demás pasará a estar desmarcado o se borrará).", + "Cells will be reinterpreted under the new type.": "Las celdas se reinterpretarán según el nuevo tipo.", + "Cells will be replaced with a comma-separated list of file names.": "Las celdas se reemplazarán por una lista de nombres de archivo separados por comas.", + "Cells will be replaced with a comma-separated list of option names.": "Las celdas se reemplazarán por una lista de nombres de opciones separados por comas.", + "Cells will be replaced with the option name.": "Las celdas se reemplazarán por el nombre de la opción.", + "Cells will be replaced with the page title.": "Las celdas se reemplazarán por el título de la página.", + "Cells will be replaced with the person's name.": "Las celdas se reemplazarán por el nombre de la persona.", + "Change type": "Cambiar tipo", + "Change type to {{label}}?": "¿Cambiar el tipo a {{label}}?", + "Converting…": "Convirtiendo…", + "Existing values become single-item lists. No data is lost.": "Los valores existentes se convierten en listas de un solo elemento. No se pierde ningún dato.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Solo se conservará el primer elemento seleccionado por fila; el resto se descartará.", + "Previous record": "Registro anterior", + "Next record": "Siguiente registro", + "Record actions": "Acciones del registro", + "Delete record": "Eliminar registro", + "Delete record?": "¿Eliminar registro?", + "This action cannot be undone.": "Esta acción no se puede deshacer.", + "to navigate": "para navegar", + "to close": "para cerrar", + "Expand row {{number}}": "Expandir fila {{number}}", + "Saving…": "Guardando…", + "Read-only": "Solo lectura", + "Loading…": "Cargando…", + "Updated {{when}}": "Actualizado {{when}}", + "Add property": "Añadir propiedad", + "Create property": "Crear propiedad", + "Hide properties": "Ocultar propiedades", + "Find a property type": "Buscar un tipo de propiedad", + "Properties": "Propiedades", + "A property with this name already exists": "Ya existe una propiedad con este nombre", + "Add card": "Agregar tarjeta", + "Add filter": "Agregar filtro", + "Add option": "Agregar opción", + "Add sort": "Agregar orden", + "Add view": "Agregar vista", + "All data in this column will be lost.": "Todos los datos de esta columna se perderán.", + "Allow multiple people": "Permitir varias personas", + "Alphabetize": "Ordenar alfabéticamente", + "Are you sure you want to delete": "¿Está seguro de que desea eliminar", + "Ascending": "Ascendente", + "Base deleted": "Base eliminada", + "Base name": "Nombre de la base", + "Base table": "Tabla base", + "Card properties": "Propiedades de la tarjeta", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Las celdas más largas que el límite de texto se truncarán y el contenido adicional se perderá permanentemente.", + "Checkbox": "Casilla de verificación", + "Checked by default": "Marcado por defecto", + "Choose a property": "Seleccione una propiedad", + "Clear selection": "Borrar selección", + "Column options": "Opciones de columna", + "Comma, period": "Coma, punto", + "Complete": "Completo", + "Contains": "Contiene", + "Copy link to view": "Copiar enlace a la vista", + "Create a status property": "Crear una propiedad de estado", + "Created at": "Creado el", + "Currency": "Moneda", + "Decimal places": "Decimales", + "Default value": "Valor predeterminado", + "Delete property": "Eliminar propiedad", + "Delete view": "Eliminar vista", + "Delete {{count}} rows?_one": "¿Eliminar 1 fila?", + "Delete {{count}} rows?_other": "¿Eliminar {{count}} filas?", + "Descending": "Descendente", + "Discard": "Descartar", + "Doesn't contain": "No contiene", + "Done": "Hecho", + "Edit formula": "Editar fórmula", + "Edit property": "Editar propiedad", + "Export CSV": "Exportar CSV", + "Failed to load base": "No se pudo cargar la base", + "False": "Falso", + "File": "Archivo", + "Filter and sort changes are visible only to you": "Los cambios de filtro y ordenación solo son visibles para usted", + "Filter by": "Filtrar por", + "Formula": "Fórmula", + "Get started with": "Comenzar con", + "Greater than": "Mayor que", + "Group by": "Agrupar por", + "Group this board by a select or status property.": "Agrupe este tablero por una propiedad de selección o estado.", + "Hide all": "Ocultar todo", + "Hide group": "Ocultar grupo", + "In Progress": "En curso", + "In progress": "En curso", + "Include time": "Incluir hora", + "Insert a kanban board on this page": "Insertar un tablero kanban en esta página", + "Insert an inline base on this page": "Insertar una base integrada en esta página", + "Is": "Es", + "Is after": "Es posterior a", + "Is any of": "Es cualquiera de", + "Is before": "Es anterior a", + "Is empty": "Está vacío", + "Is none of": "No es ninguno de", + "Is not": "No es", + "Is not empty": "No está vacío", + "Is on or after": "Es en o después de", + "Is on or before": "Es en o antes de", + "Is within": "Está dentro de", + "Keep editing": "Seguir editando", + "Last edited at": "Última edición el", + "Last edited by": "Última edición por", + "Less than": "Menor que", + "Link copied to clipboard": "Enlace copiado al portapapeles", + "Local": "Local", + "Long text": "Texto largo", + "Moved card to {{column}}": "Tarjeta movida a {{column}}", + "Moved column to {{column}}": "Columna movida a {{column}}", + "Multi-select": "Selección múltiple", + "New row": "Nueva fila", + "Next month": "Próximo mes", + "Next week": "Próxima semana", + "Next year": "Próximo año", + "No filters applied": "No hay filtros aplicados", + "No match": "Sin coincidencias", + "No options for this property type": "No hay opciones para este tipo de propiedad", + "No sorts applied": "No hay ordenaciones aplicadas", + "No value": "Sin valor", + "None": "Ninguno", + "Not started": "No iniciado", + "Number": "Número", + "One month ago": "Hace un mes", + "One month from now": "Dentro de un mes", + "One week ago": "Hace una semana", + "One week from now": "Dentro de una semana", + "Open as page": "Abrir como página", + "Options": "Opciones", + "Past month": "Último mes", + "Past week": "Última semana", + "Past year": "Último año", + "Percent": "Porcentaje", + "Period, comma": "Punto, coma", + "Person": "Persona", + "Please enter a valid email": "Por favor, introduzca un correo electrónico válido", + "Progress": "Progreso", + "Property options": "Opciones de propiedad", + "Relative": "Relativo", + "Rename property": "Renombrar propiedad", + "Reset": "Restablecer", + "Save for everyone": "Guardar para todos", + "Select": "Selección", + "Select a property": "Seleccionar una propiedad", + "Select all loaded rows": "Seleccionar todas las filas cargadas", + "Show all": "Mostrar todo", + "Sort": "Ordenar", + "Sort by": "Ordenar por", + "Space, comma": "Espacio, coma", + "Space, period": "Espacio, punto", + "This board has no grouping property yet.": "Este tablero aún no tiene una propiedad de agrupación.", + "This month": "Este mes", + "This year": "Este año", + "Thousands and decimal separators": "Separadores de miles y decimales", + "Time format": "Formato de hora", + "To Do": "Por hacer", + "Tomorrow": "Mañana", + "True": "Verdadero", + "Unsaved changes": "Cambios no guardados", + "Untitled base": "Base sin título", + "URL": "URL", + "Value": "Valor", + "View updated for everyone": "Vista actualizada para todos", + "You have unsaved changes. Do you want to discard them?": "Tiene cambios no guardados. ¿Quiere descartarlos?", + "{{count}} rows deleted_one": "1 fila eliminada", + "{{count}} rows deleted_other": "{{count}} filas eliminadas", + "{{count}} selected_one": "1 seleccionado", + "{{count}} selected_other": "{{count}} seleccionadas", + "Compare": "Comparar", + "Compare versions": "Comparar versiones", + "Select version from {{date}}": "Seleccionar la versión del {{date}}", + "Version actions for {{date}}": "Acciones de la versión del {{date}}", + "Comparing {{newer}} and {{older}}": "Comparando {{newer}} y {{older}}", + "Exit compare": "Salir de la comparación", + "Search attachments...": "Buscar archivos adjuntos...", + "Error loading attachments.": "Error al cargar los archivos adjuntos.", + "No attachments on this page yet.": "Todavía no hay archivos adjuntos en esta página.", + "Uploaded by {{name}}": "Subido por {{name}}", + "Download {{name}}": "Descargar {{name}}", + "Access revoked": "Acceso revocado", + "Authorize application": "Autorizar aplicación", + "{{name}} wants to access {{workspace}}": "{{name}} quiere acceder a {{workspace}}", + "Not you? Switch account": "¿No eres tú? Cambiar de cuenta", + "This application will be able to:": "Esta aplicación podrá:", + "Write": "Escribir", + "Invalid authorization request": "Solicitud de autorización no válida", + "Authorize": "Autorizar", + "Application": "Aplicación", + "Permissions": "Permisos", + "Authorized": "Autorizado", + "Revoke access": "Revocar acceso", + "Revoke access for {{name}}": "Revocar acceso para {{name}}", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "¿Seguro que quieres revocar el acceso de {{name}}? La aplicación ya no podrá acceder a tu cuenta.", + "Something went wrong. Please try again.": "Algo salió mal. Inténtalo de nuevo.", + "Remove {{name}}": "Eliminar {{name}}", + "Make sure you trust this application before authorizing it.": "Asegúrate de confiar en esta aplicación antes de autorizarla.", + "You will be redirected to": "Serás redirigido a", + "View content without making changes.": "Ver contenido sin realizar cambios.", + "Create and modify content.": "Crear y modificar contenido.", + "Applications and AI assistants you have authorized to access your account.": "Aplicaciones y asistentes de IA que has autorizado para acceder a tu cuenta.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "Tu espacio de trabajo tiene MCP habilitado. Conecta asistentes de IA con tu cuenta de Docmost mediante OAuth.", + "Authorized apps": "Aplicaciones autorizadas", + "No authorized apps yet.": "Todavía no hay aplicaciones autorizadas.", + "Workspace knowledge only": "Solo conocimiento del espacio de trabajo", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Restringe AI Chat para que responda solo con información de las páginas y archivos subidos de tu espacio de trabajo. No usará conocimiento externo.", + "Toggle workspace knowledge only": "Alternar solo conocimiento del espacio de trabajo", + "Read-only mode": "Modo de solo lectura", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI Chat puede buscar y leer el contenido del espacio de trabajo, pero no puede crear ni editar páginas.", + "Toggle AI Chat read-only mode": "Alternar modo de solo lectura de AI Chat", + "Title only": "Solo título", + "you": "tú", + "Allow public spaces": "Permitir espacios públicos", + "Space admins can publish their spaces to the web.": "Los administradores de espacios pueden publicar sus espacios en la web.", + "Toggle allow public spaces": "Alternar permitir espacios públicos", + "Publish space to the web": "Publicar espacio en la web", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Cualquier persona en internet podrá leer todas las páginas de este espacio, excepto las páginas restringidas. ¿Está seguro?", + "Make this space publicly readable by anyone on the internet.": "Haga que este espacio sea legible públicamente por cualquier persona en internet.", + "Toggle publish space to the web": "Alternar publicar espacio en la web", + "Allow search engines to index": "Permitir que los motores de búsqueda indexen", + "Let public pages in this space appear in search engine results.": "Permita que las páginas públicas de este espacio aparezcan en los resultados de los motores de búsqueda.", + "Toggle search engine indexing": "Alternar indexación en motores de búsqueda", + "Public space link": "Enlace público del espacio", + "Copy public space link": "Copiar enlace público del espacio", + "Renaming the space slug will break public links.": "Cambiar el slug del espacio romperá los enlaces públicos.", + "Failed to update space": "No se pudo actualizar el espacio", + "This space is public": "Este espacio es público", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Cualquier persona en internet puede leer las páginas de este espacio, excepto las páginas restringidas.", + "Open public site": "Abrir sitio público", + "Public": "Público", + "This space has no public pages yet.": "Este espacio aún no tiene páginas públicas.", + "On this page": "En esta página", + "Previous": "Anterior", + "Next": "Siguiente", + "Show hidden pages": "Mostrar páginas ocultas", + "Page navigation": "Navegación de páginas", + "Toggle sidebar": "Alternar barra lateral", + "Toggle table of contents": "Alternar tabla de contenido", + "Appearance": "Apariencia", + "Forest": "Bosque", + "Violet": "Violeta", + "Light mode color": "Color del modo claro", + "Dark mode color": "Color del modo oscuro", + "Choose the primary color of the public docs site.": "Elija el color principal del sitio de documentación pública.", + "Show page author": "Mostrar autor de la página", + "Display the page creator's name on public pages.": "Mostrar el nombre del creador de la página en las páginas públicas.", + "Toggle show page author": "Alternar mostrar autor de la página", + "Show last updated": "Mostrar última actualización", + "Display when each page was last updated.": "Mostrar cuándo se actualizó por última vez cada página.", + "Toggle show last updated": "Alternar mostrar última actualización", + "Open public page": "Abrir página pública", + "Toggle color scheme": "Alternar esquema de color", + "Ember": "Ascua", + "Rose": "Rosa", + "Documentation": "Documentación", + "All published spaces.": "Todos los espacios publicados.", + "No public spaces yet.": "Aún no hay espacios públicos.", + "Show public directory": "Mostrar directorio público", + "List published spaces at /docs for anyone to browse.": "Enumere los espacios publicados en /docs para que cualquiera pueda explorarlos.", + "Toggle show public directory": "Alternar mostrar directorio público", + "Show in public directory": "Mostrar en el directorio público", + "List this space in the public directory at /docs.": "Enumere este espacio en el directorio público en /docs.", + "Toggle show in public directory": "Alternar mostrar en el directorio público", + "Open public space link": "Abrir enlace público del espacio", + "Disable public spaces": "Desactivar espacios públicos", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Los administradores de espacios podrán hacer que sus espacios sean legibles públicamente por cualquier persona en internet. ¿Está seguro?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Esto despublicará inmediatamente todos los espacios publicados. Volver a habilitarlos más tarde no los volverá a publicar. ¿Está seguro?", + "Allow": "Permitir", + "Shared pages": "Páginas compartidas", + "Published spaces": "Espacios publicados", + "Spaces published to the web will appear here": "Los espacios publicados en la web aparecerán aquí", + "No published spaces": "No hay espacios publicados", + "Published by": "Publicado por", + "Published at": "Publicado el", + "Open space": "Abrir espacio", + "Unpublish": "Despublicar", + "Unpublish space": "Despublicar espacio", + "This space will no longer be publicly accessible. Are you sure?": "Este espacio dejará de ser accesible públicamente. ¿Está seguro?", + "More options for {{name}}": "Más opciones para {{name}}", + "Edit page": "Editar página", + "Sign in": "Iniciar sesión", + "Open app": "Abrir aplicación", + "No spaces match your search.": "Ningún espacio coincide con su búsqueda.", + "Welcome to our documentation": "Bienvenido a nuestra documentación", + "Guides, references and answers across all our published spaces.": "Guías, referencias y respuestas en todos nuestros espacios publicados.", + "Guides, references and answers across all our spaces.": "Guías, referencias y respuestas en todos nuestros espacios.", + "Search documentation...": "Buscar en la documentación...", + "1 published space": "1 espacio publicado", + "{{count}} published spaces": "{{count, plural, one {# espacio publicado} other {# espacios publicados}}}", + "Actions": "Acciones", + "Add destination": "Añadir destino", + "Are you sure you want to delete the destination": "¿Está seguro de que desea eliminar el destino", + "Audit logs": "Registros de auditoría", + "Audit logs & SIEM": "Registros de auditoría y SIEM", + "Auth header name": "Nombre del encabezado de autenticación", + "Auth header prefix": "Prefijo del encabezado de autenticación", + "Body format": "Formato del cuerpo", + "Created SIEM destination": "Destino SIEM creado", + "Datadog site": "Sitio de Datadog", + "Defaults to this instance's hostname": "Usa de forma predeterminada el nombre de host de esta instancia", + "Delete destination": "Eliminar destino", + "Deleted SIEM destination": "Destino SIEM eliminado", + "Destination created": "Destino creado", + "Destination deleted": "Destino eliminado", + "Destination updated": "Destino actualizado", + "Disabled": "Deshabilitado", + "Edit destination": "Editar destino", + "Endpoint URL": "URL del endpoint", + "Failing": "Con fallos", + "Failing since {{time}}": "Con fallos desde {{time}}", + "HEC token": "Token HEC", + "HEC URL": "URL de HEC", + "Healthy": "Correcto", + "Hide advanced options": "Ocultar opciones avanzadas", + "Host": "Host", + "Index": "Índice", + "Insecure: connections can be intercepted.": "Inseguro: las conexiones pueden ser interceptadas.", + "JSON array": "Matriz JSON", + "Last delivered": "Última entrega", + "Last error": "Último error", + "Leave empty to use the token's default index": "Déjelo vacío para usar el índice predeterminado del token", + "Maximum of {{limit}} destinations reached": "Se alcanzó el máximo de {{limit}} destinos", + "Could not load SIEM destinations: {{message}}": "No se pudieron cargar los destinos SIEM: {{message}}", + "No destinations yet": "Aún no hay destinos", + "Preset": "Preajuste", + "Retry now": "Reintentar ahora", + "Retry scheduled": "Reintento programado", + "Send test event": "Enviar evento de prueba", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Se envía en el encabezado de autenticación de abajo. Déjelo vacío si su receptor no necesita uno.", + "Service": "Servicio", + "Show advanced options": "Mostrar opciones avanzadas", + "SIEM": "SIEM", + "SIEM streaming": "Transmisión SIEM", + "SIEM streaming requires an Enterprise license.": "La transmisión SIEM requiere una licencia Enterprise.", + "Source": "Origen", + "Sourcetype": "Tipo de origen", + "Tags": "Etiquetas", + "Test connection": "Probar conexión", + "Test event delivered successfully.": "El evento de prueba se entregó correctamente.", + "Test the connection before saving.": "Pruebe la conexión antes de guardar.", + "Test event delivered to {{name}}": "Evento de prueba entregado a {{name}}", + "Updated SIEM destination": "Destino SIEM actualizado", + "Verify TLS certificate": "Verificar certificado TLS", + "e.g. Splunk prod": "p. ej., Splunk producción" +} diff --git a/apps/client/public/locales/fr-FR/translation.json b/apps/client/public/locales/fr-FR/translation.json new file mode 100644 index 0000000..26ded49 --- /dev/null +++ b/apps/client/public/locales/fr-FR/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Compte", + "Active": "Actif", + "Add": "Ajouter", + "Add group members": "Ajouter des membres au groupe", + "Add groups": "Ajouter des groupes", + "Add members": "Ajouter des membres", + "Add to groups": "Ajouter aux groupes", + "Add space members": "Ajouter des membres à l'espace", + "Add to favorites": "Ajouter aux favoris", + "Admin": "Admin", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Êtes-vous sûr de vouloir supprimer ce groupe ? Les membres perdront l'accès aux ressources auxquelles ce groupe a accès.", + "Are you sure you want to delete this page?": "Êtes-vous sûr de vouloir supprimer cette page ?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Êtes-vous sûr de vouloir retirer cet utilisateur du groupe ? L'utilisateur perdra l'accès aux ressources auxquelles ce groupe a accès.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Êtes-vous sûr de vouloir retirer cet utilisateur de l'espace ? L'utilisateur perdra tout accès à cet espace.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Êtes-vous sûr de vouloir restaurer cette version ? Toutes les modifications non versionnées seront perdues.", + "Can become members of groups and spaces in workspace": "Peut devenir membre de groupes et d'espaces dans l'espace de travail", + "Can create and edit pages in space.": "Peut créer et modifier des pages dans l'espace.", + "Can edit": "Peut modifier", + "Can manage workspace": "Peut gérer l'espace de travail", + "Can manage workspace but cannot delete it": "Peut gérer l'espace de travail mais ne peut pas le supprimer", + "Can view": "Peut voir", + "Can view pages in space but not edit.": "Peut voir les pages dans l'espace mais ne peut pas les modifier.", + "Cancel": "Annuler", + "Change email": "Changer le courriel", + "Change password": "Changer le mot de passe", + "Change photo": "Changer la photo", + "Choose a role": "Choisir un rôle", + "Choose your preferred color scheme.": "Choisissez votre palette de couleurs préférée.", + "Choose your preferred interface language.": "Choisissez votre langue d'interface préférée.", + "Choose your preferred page width.": "Choisissez votre largeur de page préférée.", + "Confirm": "Confirmer", + "Copy as Markdown": "Copier comme Markdown", + "Copy link": "Copier le lien", + "Create": "Créer", + "Create group": "Créer groupe", + "Create page": "Créer page", + "Create space": "Créer espace", + "Create workspace": "Créer espace de travail", + "Current password": "Mot de passe actuel", + "Dark": "Sombre", + "Date": "Date", + "Delete": "Supprimer", + "Remove from page": "Supprimer de la page", + "Base options": "Options de la base", + "Delete group": "Supprimer groupe", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Êtes-vous sûr de vouloir supprimer cette page ? Cela supprimera ses enfants et l'historique de la page. Cette action est irréversible.", + "Description": "Description", + "Details": "Détails", + "e.g ACME": "p. ex. ACME", + "e.g ACME Inc": "p. ex. ACME Inc", + "e.g Developers": "p. ex. Développeurs", + "e.g Group for developers": "p. ex. Groupe pour les développeurs", + "e.g product": "p. ex. produit", + "e.g Product Team": "p. ex. Équipe produit", + "e.g Sales": "p. ex. Ventes", + "e.g Space for product team": "p. ex. Espace pour l’équipe produit", + "e.g Space for sales team to collaborate": "p. ex. Espace pour que l’équipe commerciale collabore", + "Edit": "Modifier", + "Read": "Lire", + "Edit group": "Modifier groupe", + "Email": "Email", + "Enter a strong password": "Entrez un mot de passe fort", + "Enter valid email addresses separated by comma or space max_50": "Entrez des adresses email valides séparées par une virgule ou un espace [max : 50]", + "enter valid emails addresses": "saisissez des adresses e-mail valides", + "Enter your current password": "Entrez votre mot de passe actuel", + "enter your full name": "saisissez votre nom complet", + "Enter your new password": "Entrez votre nouveau mot de passe", + "Enter your new preferred email": "Entrez votre nouvel email préféré", + "Enter your password": "Entrez votre mot de passe", + "Error fetching page data.": "Erreur lors de la récupération des données de la page.", + "Error loading page history.": "Erreur lors du chargement de l'historique de la page.", + "Export": "Exporter", + "Failed to create page": "Échec de la création de la page", + "Failed to delete page": "Échec de la suppression de la page", + "Failed to restore page": "Échec de la restauration de la page", + "Failed to fetch recent pages": "Échec de la récupération des pages récentes", + "Failed to import pages": "Échec de l'importation des pages", + "Failed to load page. An error occurred.": "Échec du chargement de la page. Une erreur s'est produite.", + "Failed to update data": "Échec de la mise à jour des données", + "Failed to create base": "Échec de la création de la base", + "Failed to update base": "Échec de la mise à jour de la base", + "Failed to delete base": "Échec de la suppression de la base", + "Failed to create property": "Échec de la création de la propriété", + "Failed to update property": "Échec de la mise à jour de la propriété", + "Failed to delete property": "Échec de la suppression de la propriété", + "Failed to reorder property": "Échec de la réorganisation de la propriété", + "Failed to create view": "Échec de la création de la vue", + "Failed to update view": "Échec de la mise à jour de la vue", + "Failed to delete view": "Échec de la suppression de la vue", + "Failed to create row": "Échec de la création de la ligne", + "Failed to update row": "Échec de la mise à jour de la ligne", + "Failed to delete row": "Échec de la suppression de la ligne", + "Failed to delete rows": "Échec de la suppression des lignes", + "Failed to reorder row": "Échec de la réorganisation de la ligne", + "Failed to move card": "Échec du déplacement de la carte", + "Failed to add card": "Échec de l'ajout de la carte", + "Failed to export CSV": "Échec de l'exportation du CSV", + "Favorite spaces": "Espaces favoris", + "Favorite spaces appear here": "Les espaces favoris apparaissent ici", + "Favorites": "Favoris", + "Full access": "Accès complet", + "Full page width": "Largeur de page complète", + "Full width": "Largeur complète", + "General": "Général", + "Group": "Groupe", + "Group description": "Description du groupe", + "Group name": "Nom du groupe", + "Groups": "Groupes", + "Has full access to space settings and pages.": "A un accès complet aux paramètres de l'espace et aux pages.", + "Home": "Accueil", + "Import pages": "Importer des pages", + "Import pages & space settings": "Importer des pages et paramètres de l'espace", + "Importing pages": "Importation des pages", + "invalid invitation link": "lien d’invitation invalide", + "Invitation signup": "Inscription par invitation", + "Invite by email": "Inviter par email", + "Invite members": "Inviter des membres", + "Invite new members": "Inviter de nouveaux membres", + "Invite People": "Inviter des personnes", + "Invited members who are yet to accept their invitation will appear here.": "Les membres invités qui n'ont pas encore accepté leur invitation apparaîtront ici.", + "Invited members will be granted access to spaces the groups can access": "Les membres invités auront accès aux espaces auxquels les groupes peuvent accéder", + "Join the workspace": "Rejoindre l'espace de travail", + "Language": "Langue", + "Light": "Clair", + "Link copied": "Lien copié", + "Login": "Connexion", + "Logout": "Déconnexion", + "Manage Group": "Gérer le groupe", + "Manage members": "Gérer les membres", + "member": "membre", + "Member": "Membre", + "members": "membres", + "Members": "Membres", + "My preferences": "Mes préférences", + "My Profile": "Mon Profil", + "My profile": "Mon profil", + "Name": "Nom", + "New email": "Nouvel email", + "New page": "Nouvelle page", + "New password": "Nouveau mot de passe", + "No group found": "Aucun groupe trouvé", + "No page history saved yet.": "Aucun historique de la page enregistré pour l'instant.", + "No pages yet": "Aucune page pour l'instant", + "No shared pages": "Aucune page partagée", + "No results found...": "Aucun résultat trouvé...", + "No user found": "Aucun utilisateur trouvé", + "Overview": "Vue d'ensemble", + "Owner": "Propriétaire", + "page": "page", + "Page deleted successfully": "Page supprimée avec succès", + "Page history": "Historique de la page", + "Select version": "Sélectionner la version", + "Highlight changes": "Mettre en évidence les changements", + "Page import is in progress. Please do not close this tab.": "L'importation de la page est en cours. Veuillez ne pas fermer cet onglet.", + "Pages": "Pages", + "pages": "pages", + "Password": "Mot de passe", + "Password changed successfully": "Mot de passe changé avec succès", + "People": "Personnes", + "Pending": "En attente", + "Please confirm your action": "Veuillez confirmer votre action", + "Preferences": "Préférences", + "Print PDF": "Imprimer PDF", + "Profile": "Profil", + "Recently updated": "Récemment mis à jour", + "Remove": "Retirer", + "Remove from favorites": "Retirer des favoris", + "Remove group member": "Retirer un membre du groupe", + "Remove space member": "Retirer un membre de l'espace", + "Restore": "Restaurer", + "Role": "Rôle", + "Save": "Enregistrer", + "Search": "Rechercher", + "Search for groups": "Rechercher des groupes", + "Search for users": "Rechercher des utilisateurs", + "Search for users and groups": "Rechercher des utilisateurs et des groupes", + "Search...": "Rechercher...", + "Select language": "Sélectionner la langue", + "Select role": "Sélectionner un rôle", + "Select role to assign to all invited members": "Sélectionnez le rôle à attribuer à tous les membres invités", + "Select theme": "Sélectionner le thème", + "Send invitation": "Envoyer l’invitation", + "Invitation sent": "Invitation envoyée", + "Settings": "Paramètres", + "Setup workspace": "Configurer l’espace de travail", + "Sign In": "Se connecter", + "Sign Up": "S’inscrire", + "Slug": "Slug", + "Space": "Espace", + "Space description": "Description de l’espace", + "Space menu": "Menu de l’espace", + "Space name": "Nom de l’espace", + "Space settings": "Paramètres de l’espace", + "Space slug": "Slug de l’espace", + "Spaces": "Espaces", + "Spaces you belong to": "Espaces auxquels vous appartenez", + "No space found": "Aucun espace trouvé", + "Search for spaces": "Rechercher des espaces", + "Start typing to search...": "Commencez à taper pour rechercher...", + "Status": "Statut", + "Successfully imported": "Importation réussie", + "Successfully restored": "Restauration réussie", + "System settings": "Paramètres système", + "Templates": "Modèles", + "Theme": "Thème", + "To change your email, you have to enter your password and new email.": "Pour changer votre email, vous devez entrer votre mot de passe et votre nouvel email.", + "Toggle full page width": "Basculer la largeur complète de la page", + "Unable to import pages. Please try again.": "Impossible d'importer les pages. Veuillez réessayer.", + "untitled": "sans titre", + "Untitled": "Sans titre", + "Updated successfully": "Mise à jour réussie", + "User": "Utilisateur", + "Workspace": "Espace de travail", + "Workspace Name": "Nom de l’espace de travail", + "Workspace settings": "Paramètres de l’espace de travail", + "You can change your password here.": "Vous pouvez changer votre mot de passe ici.", + "Your Email": "Votre e-mail", + "Your import is complete.": "Votre importation est terminée.", + "Your name": "Votre nom", + "Your Name": "Votre nom", + "Your password": "Votre mot de passe", + "Your password must be a minimum of 8 characters.": "Votre mot de passe doit contenir au moins 8 caractères.", + "Sidebar toggle": "Basculer la barre latérale", + "Comments": "Commentaires", + "404 page not found": "404 page non trouvée", + "Sorry, we can't find the page you are looking for.": "Désolé, nous ne pouvons pas trouver la page que vous cherchez.", + "Take me back to homepage": "Retour à la page d’accueil", + "Forgot password": "Mot de passe oublié", + "Forgot your password?": "Mot de passe oublié?", + "A password reset link has been sent to your email. Please check your inbox.": "Un lien de réinitialisation de mot de passe a été envoyé à votre e-mail. Veuillez vérifier votre boîte de réception.", + "Send reset link": "Envoyer le lien de réinitialisation", + "Password reset": "Réinitialisation du mot de passe", + "Your new password": "Votre nouveau mot de passe", + "Set password": "Définir le mot de passe", + "Write a comment": "Écrire un commentaire", + "Reply...": "Répondre...", + "Error loading comments.": "Erreur lors du chargement des commentaires.", + "No comments yet.": "Pas de commentaires pour l'instant.", + "No open comments.": "Aucun commentaire ouvert.", + "No resolved comments.": "Aucun commentaire résolu.", + "Add a comment...": "Ajouter un commentaire...", + "Edit comment": "Modifier le commentaire", + "Delete comment": "Supprimer le commentaire", + "Are you sure you want to delete this comment?": "Êtes-vous sûr de vouloir supprimer ce commentaire ?", + "Delete chat": "Supprimer la conversation", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Êtes-vous sûr de vouloir supprimer '{{title}}' ? Cette action est irréversible.", + "Comment created successfully": "Commentaire créé avec succès", + "Error creating comment": "Erreur lors de la création du commentaire", + "Comment updated successfully": "Commentaire mis à jour avec succès", + "Failed to update comment": "Échec de la mise à jour du commentaire", + "Comment deleted successfully": "Commentaire supprimé avec succès", + "Failed to delete comment": "Échec de la suppression du commentaire", + "Comment resolved successfully": "Commentaire résolu avec succès", + "Comment re-opened successfully": "Commentaire rouvert avec succès", + "Comment unresolved successfully": "Commentaire marqué comme non résolu avec succès", + "Failed to resolve comment": "Échec de la résolution du commentaire", + "Resolve comment": "Résoudre le commentaire", + "Unresolve comment": "Marquer le commentaire comme non résolu", + "Resolve Comment Thread": "Résoudre le fil de commentaires", + "Unresolve Comment Thread": "Marquer le fil de commentaires comme non résolu", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Êtes-vous sûr de vouloir résoudre ce fil de commentaires ? Cela le marquera comme terminé.", + "Are you sure you want to unresolve this comment thread?": "Êtes-vous sûr de vouloir désorganiser ce fil de commentaires ?", + "Resolved": "Résolu", + "No active comments.": "Aucun commentaire actif.", + "Revoke invitation": "Révoquer l'invitation", + "Revoke": "Révoquer", + "Don't": "Ne pas", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Êtes-vous sûr de vouloir révoquer cette invitation ? L'utilisateur ne pourra pas rejoindre l'espace de travail.", + "Resend invitation": "Renvoyer l'invitation", + "Anyone with this link can join this workspace.": "Toute personne ayant ce lien peut rejoindre cet espace de travail.", + "Invite link": "Lien d'invitation", + "Copy": "Copier", + "Copy to space": "Copier vers l’espace", + "Copied": "Copié", + "Duplicate": "Dupliquer", + "Select a user": "Sélectionner un utilisateur", + "Select a group": "Sélectionner un groupe", + "Export all pages and attachments in this space.": "Exporter toutes les pages et pièces jointes dans cet espace.", + "Delete space": "Supprimer l'espace", + "Are you sure you want to delete this space?": "Êtes-vous sûr de vouloir supprimer cet espace ?", + "Delete this space with all its pages and data.": "Supprimer cet espace avec toutes ses pages et données.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Toutes les pages, commentaires, pièces jointes et autorisations dans cet espace seront supprimés irréversiblement.", + "Confirm space name": "Confirmer le nom de l’espace", + "Type the space name {{spaceName}} to confirm your action.": "Tapez le nom de l'espace {{spaceName}} pour confirmer votre action.", + "Format": "Format", + "Include subpages": "Inclure les sous-pages", + "Include attachments": "Inclure les pièces jointes", + "Select export format": "Sélectionner le format d'exportation", + "Export failed:": "Échec de l'exportation :", + "export error": "exporter l'erreur", + "Export page": "Exporter la page", + "Export successful": "Exportation réussie", + "Export space": "Exporter l'espace", + "Export {{type}}": "Exporter {{type}}", + "File exceeds the {{limit}} attachment limit": "Le fichier dépasse la limite de {{limit}} pièces jointes", + "Media": "Médias", + "Align left": "Aligner à gauche", + "Align right": "Aligner à droite", + "Align center": "Aligner au centre", + "Alt text": "Texte alternatif", + "Describe this for accessibility.": "Décrivez ceci pour l’accessibilité.", + "Add a description": "Ajouter une description", + "Justify": "Justifier", + "Merge cells": "Fusionner les cellules", + "Split cell": "Diviser la cellule", + "Delete column": "Supprimer la colonne", + "Delete row": "Supprimer la ligne", + "Add left column": "Ajouter colonne à gauche", + "Add right column": "Ajouter colonne à droite", + "Add row above": "Ajouter une ligne au-dessus", + "Add row below": "Ajouter une ligne en dessous", + "Delete table": "Supprimer le tableau", + "Add column left": "Ajouter une colonne à gauche", + "Add column right": "Ajouter une colonne à droite", + "Clear cell": "Effacer la cellule", + "Clear cells": "Effacer les cellules", + "Toggle header cell": "Activer/désactiver la cellule d’en-tête", + "Toggle header column": "Activer/désactiver la colonne d’en-tête", + "Toggle header row": "Activer/désactiver la ligne d’en-tête", + "Move column left": "Déplacer la colonne vers la gauche", + "Move column right": "Déplacer la colonne vers la droite", + "Move row down": "Déplacer la ligne vers le bas", + "Move row up": "Déplacer la ligne vers le haut", + "Sort A → Z": "Trier de A à Z", + "Sort Z → A": "Trier de Z à A", + "Info": "Info", + "Note": "Remarque", + "Success": "Succès", + "Warning": "Avertissement", + "Danger": "Danger", + "Mermaid diagram error:": "Erreur de diagramme Mermaid :", + "Invalid Mermaid diagram": "Diagramme Mermaid invalide", + "Double-click to edit Draw.io diagram": "Double-cliquez pour modifier le diagramme Draw.io", + "Exit": "Quitter", + "Save & Exit": "Enregistrer & Quitter", + "Double-click to edit Excalidraw diagram": "Double-cliquez pour modifier le diagramme Excalidraw", + "Paste link": "Coller le lien", + "Paste link or search pages": "Coller le lien ou rechercher des pages", + "Link to web page": "Lien vers une page web", + "Recents": "Récents", + "Page or URL": "Page ou URL", + "Link title": "Titre du lien", + "Edit link": "Modifier le lien", + "Remove link": "Supprimer le lien", + "Add link": "Ajouter un lien", + "Please enter a valid url": "Veuillez entrer une URL valide", + "Empty equation": "Équation vide", + "Invalid equation": "Équation invalide", + "Color": "Couleur", + "Text color": "Couleur du texte", + "Default": "Par défaut", + "Blue": "Bleu", + "Green": "Vert", + "Purple": "Violet", + "Red": "Rouge", + "Yellow": "Jaune", + "Orange": "Orange", + "Pink": "Rose", + "Gray": "Gris", + "Embed link": "Intégrer un lien", + "Invalid {{provider}} embed link": "Lien d’intégration {{provider}} invalide", + "Embed {{provider}}": "Intégrer {{provider}}", + "Enter {{provider}} link to embed": "Entrez le lien {{provider}} à intégrer", + "Bold": "Gras", + "Italic": "Italique", + "Underline": "Souligner", + "Strike": "Barrer", + "Code": "Code", + "Comment": "Commentaire", + "Text": "Texte", + "Heading 1": "Titre 1", + "Heading 2": "Titre 2", + "Heading 3": "Titre 3", + "To-do List": "Liste de tâches", + "Bullet List": "Liste à puces", + "Numbered List": "Liste numérotée", + "Blockquote": "Bloc de citation", + "Just start typing with plain text.": "Commencez simplement à taper avec du texte brut.", + "Track tasks with a to-do list.": "Suivez les tâches avec une liste de tâches.", + "Big section heading.": "Grand titre de section.", + "Medium section heading.": "Titre de section moyen.", + "Small section heading.": "Petit titre de section.", + "Create a simple bullet list.": "Créez une simple liste à puces.", + "Create a list with numbering.": "Créez une liste numérotée.", + "Create block quote.": "Créez un bloc de citation.", + "Insert code snippet.": "Insérez un extrait de code.", + "Insert horizontal rule divider": "Insérer un séparateur de règle horizontale", + "Page break": "Saut de page", + "Insert a page break for printing.": "Insérer un saut de page pour l’impression.", + "Footnote": "Note de bas de page", + "Insert a footnote reference.": "Insérer une référence de note de bas de page.", + "Upload any image from your device.": "Téléchargez n'importe quelle image depuis votre appareil.", + "Upload any video from your device.": "Téléchargez n'importe quelle vidéo depuis votre appareil.", + "Upload any audio from your device.": "Téléchargez n'importe quel fichier audio depuis votre appareil.", + "Upload any file from your device.": "Téléchargez n'importe quel fichier depuis votre appareil.", + "Uploading {{name}}": "Téléchargement de {{name}}", + "Uploading file": "Téléchargement du fichier", + "Table": "Tableau", + "Insert a table.": "Insérez un tableau.", + "Insert collapsible block.": "Insérer un bloc repliable.", + "Video": "Vidéo", + "Divider": "Séparateur", + "Quote": "Citation", + "Image": "Image", + "Audio": "Audio", + "Embed PDF": "Intégrer un PDF", + "Upload and embed a PDF file.": "Téléchargez et intégrez un fichier PDF.", + "Embed as PDF": "Intégrer comme PDF", + "Failed to load PDF": "Échec du chargement du PDF", + "Convert to attachment": "Convertir en pièce jointe", + "File attachment": "Fichier joint", + "Toggle block": "Bloc basculable", + "Callout": "Encadré", + "Insert callout notice.": "Insérer un avis d'appel.", + "Math inline": "Maths en ligne", + "Insert inline math equation.": "Insérez une équation mathématique en ligne.", + "Math block": "Bloc mathématique", + "Insert math equation": "Insérer une équation mathématique", + "Mermaid diagram": "Diagramme Mermaid", + "Insert mermaid diagram": "Insérer un diagramme Mermaid", + "Insert and design Drawio diagrams": "Insérer et concevoir des diagrammes Drawio", + "Insert current date": "Insérer la date actuelle", + "Time": "Heure", + "Insert current time": "Insérer l'heure actuelle", + "Draw and sketch excalidraw diagrams": "Dessiner et esquisser des diagrammes Excalidraw", + "Multiple": "Multiple", + "Turn into": "Transformer en", + "Text align": "Alignement du texte", + "This page may have been deleted, moved, or you may not have access.": "Cette page a peut-être été supprimée, déplacée ou vous n'y avez peut-être pas accès.", + "Go to homepage": "Aller à l'accueil", + "Pages you create will show up here.": "Les pages que vous créez apparaîtront ici.", + "Heading {{level}}": "Titre {{level}}", + "Toggle title": "Titre du bloc basculable", + "Write anything. Enter \"/\" for commands": "Écrivez n’importe quoi. Saisissez \"/\" pour les commandes", + "Write...": "Écrire...", + "Column count": "Nombre de colonnes", + "{{count}} Columns": "{count, plural, one {# colonne} other {# colonnes}}", + "{{count}} command available_one": "1 commande disponible", + "{{count}} command available_other": "{{count}} commandes disponibles", + "{{count}} result available_one": "1 résultat disponible", + "{{count}} result available_other": "{{count}} résultats disponibles", + "Equal columns": "Colonnes égales", + "Left sidebar": "Barre latérale gauche", + "Right sidebar": "Barre latérale droite", + "Wide center": "Large au centre", + "Left wide": "Large à gauche", + "Right wide": "Large à droite", + "Names do not match": "Les noms ne correspondent pas", + "Today, {{time}}": "Aujourd’hui, {{time}}", + "Yesterday, {{time}}": "Hier, {{time}}", + "now": "maintenant", + "Space created successfully": "Espace créé avec succès", + "Space updated successfully": "Espace mis à jour avec succès", + "Space deleted successfully": "Espace supprimé avec succès", + "Members added successfully": "Membres ajoutés avec succès", + "Member removed successfully": "Membre supprimé avec succès", + "Member role updated successfully": "Rôle du membre mis à jour avec succès", + "Created by: {{creatorName}}": "Créé par : {{creatorName}}", + "Created at: {{time}}": "Créé le : {{time}}", + "Edited by {{name}} {{time}}": "Modifié par {{name}} {{time}}", + "Word count: {{wordCount}}": "Nombre de mots : {{wordCount}}", + "Character count: {{characterCount}}": "Nombre de caractères : {{characterCount}}", + "New update": "Nouvelle mise à jour", + "{{latestVersion}} is available": "{{latestVersion}} est disponible", + "Default page edit mode": "Mode d’édition par défaut de la page", + "Choose your preferred page edit mode. Avoid accidental edits.": "Choisissez votre mode d'édition de page préféré. Évitez les modifications accidentelles.", + "Choose {{format}} file": "Choisir un fichier {{format}}", + "Reading": "Lecture", + "Delete member": "Supprimer le membre", + "Member deleted successfully": "Membre supprimé avec succès", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Êtes-vous sûr de vouloir supprimer ce membre de l'espace de travail? Cette action est irréversible.", + "Deactivate member": "Désactiver le membre", + "Activate member": "Activer le membre", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Êtes-vous sûr de vouloir désactiver ce membre de l'espace de travail ? Cette personne ne pourra plus accéder à cet espace de travail.", + "Are you sure you want to activate this workspace member?": "Êtes-vous sûr de vouloir activer ce membre de l'espace de travail ?", + "Deactivate": "Désactiver", + "Activate": "Activer", + "Deactivated": "Désactivé", + "Move": "Déplacer", + "Move page": "Déplacer la page", + "Move page to a different space.": "Déplacer la page vers un autre espace.", + "Real-time editor connection lost. Retrying...": "Connexion avec l'éditeur en temps réel perdue. Nouvelle tentative...", + "Table of contents": "Table des matières", + "Add headings (H1, H2, H3) to generate a table of contents.": "Ajoutez des titres (H1, H2, H3) pour générer une table des matières.", + "Share": "Partager", + "Public sharing": "Partage public", + "Shared by": "Partagé par", + "Shared at": "Partagé le", + "Inherits public sharing from": "Hérite du partage public de", + "Share to web": "Partager sur le web", + "Shared to web": "Partagé sur le web", + "Anyone with the link can view this page": "Toute personne disposant du lien peut voir cette page", + "Make this page publicly accessible": "Rendre cette page accessible publiquement", + "Include sub-pages": "Inclure les sous-pages", + "Make sub-pages public too": "Rendre aussi les sous-pages publiques", + "Allow search engines to index page": "Autoriser les moteurs de recherche à indexer la page", + "Open page": "Ouvrir la page", + "Page": "Page", + "Delete public share link": "Supprimer le lien de partage public", + "Delete share": "Supprimer le partage", + "Are you sure you want to delete this shared link?": "Êtes-vous sûr de vouloir supprimer ce lien partagé ?", + "Publicly shared pages from spaces you are a member of will appear here": "Les pages partagées publiquement des espaces dont vous êtes membre apparaîtront ici", + "Share deleted successfully": "Partage supprimé avec succès", + "Share not found": "Partage introuvable", + "Failed to share page": "Échec du partage de la page", + "Disable public sharing": "Désactiver le partage public", + "Prevent members from sharing pages publicly.": "Empêcher les membres de partager des pages publiquement.", + "Toggle public sharing": "Basculer le partage public", + "Toggle space public sharing": "Basculer le partage public de l'espace", + "Allow viewers to comment": "Autoriser les spectateurs à commenter", + "Allow viewers to add comments on pages in this space.": "Autoriser les spectateurs à ajouter des commentaires sur les pages de cet espace.", + "Toggle viewer comments": "Basculer les commentaires des spectateurs", + "Public sharing is disabled at the workspace level": "Le partage public est désactivé au niveau de l'espace de travail", + "Prevent pages in this space from being shared publicly.": "Empêcher les pages de cet espace d'être partagées publiquement.", + "Page permissions": "Autorisations de la page", + "Control who can view and edit individual pages. Available with an enterprise license.": "Contrôlez qui peut consulter et modifier chaque page. Disponible avec une licence Entreprise.", + "Enable public sharing": "Activer le partage public", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Êtes-vous sûr de vouloir activer le partage public ? Les membres pourront partager des pages publiquement.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Êtes-vous sûr de vouloir désactiver le partage public ? Tous les liens partagés existants dans cet espace de travail seront supprimés.", + "Are you sure you want to enable public sharing for this space?": "Êtes-vous sûr de vouloir activer le partage public pour cet espace ?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Êtes-vous sûr de vouloir désactiver le partage public ? Tous les liens partagés existants dans cet espace seront supprimés.", + "Public sharing is disabled": "Le partage public est désactivé", + "Public sharing has been disabled at the workspace level.": "Le partage public a été désactivé au niveau de l'espace de travail.", + "Public sharing has been disabled for this space.": "Le partage public a été désactivé pour cet espace.", + "Copy page": "Copier la page", + "Copy page to a different space.": "Copier la page dans un autre espace.", + "Page copied successfully": "Page copiée avec succès", + "Page duplicated successfully": "Page dupliquée avec succès", + "Find": "Rechercher", + "Not found": "Introuvable", + "Previous Match (Shift+Enter)": "Occurrence précédente (Maj+Entrée)", + "Next match (Enter)": "Occurrence suivante (Entrée)", + "Match case (Alt+C)": "Respecter la casse (Alt+C)", + "Replace": "Remplacer", + "Close (Escape)": "Fermer (Échap)", + "Replace (Enter)": "Remplacer (Entrée)", + "Replace all (Ctrl+Alt+Enter)": "Remplacer tout (Ctrl+Alt+Entrée)", + "Replace all": "Remplacer tout", + "View all": "Voir tout", + "View all spaces": "Voir tous les espaces", + "Error": "Erreur", + "Failed to disable MFA": "Échec de la désactivation de l’authentification multifacteur", + "Disable two-factor authentication": "Désactiver l’authentification à deux facteurs", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "La désactivation de l'authentification à deux facteurs rendra votre compte moins sécurisé. Vous n'aurez besoin que de votre mot de passe pour vous connecter.", + "Please enter your password to disable two-factor authentication:": "Veuillez entrer votre mot de passe pour désactiver l'authentification à deux facteurs :", + "Two-factor authentication has been enabled": "L’authentification à deux facteurs a été activée", + "Two-factor authentication has been disabled": "L’authentification à deux facteurs a été désactivée", + "2-step verification": "Vérification en 2 étapes", + "Protect your account with an additional verification layer when signing in.": "Protégez votre compte avec une couche de vérification supplémentaire lors de la connexion.", + "Two-factor authentication is active on your account.": "L'authentification à deux facteurs est active sur votre compte.", + "Add 2FA method": "Ajouter une méthode d’A2F", + "Backup codes": "Codes de secours", + "Disable": "Désactiver", + "Invalid verification code": "Code de vérification invalide", + "New backup codes have been generated": "De nouveaux codes de secours ont été générés", + "Failed to regenerate backup codes": "Échec de la régénération des codes de secours", + "About backup codes": "À propos des codes de secours", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Les codes de sauvegarde peuvent être utilisés pour accéder à votre compte si vous perdez l'accès à votre application d'authentification. Chaque code ne peut être utilisé qu'une seule fois.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "Vous pouvez régénérer de nouveaux codes de sauvegarde à tout moment. Cela invalidera tous les codes existants.", + "Confirm password": "Confirmer le mot de passe", + "Generate new backup codes": "Générer de nouveaux codes de secours", + "Save your new backup codes": "Enregistrez vos nouveaux codes de secours", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Assurez-vous d'enregistrer ces codes dans un endroit sécurisé. Vos anciens codes de sauvegarde ne sont plus valides.", + "Your new backup codes": "Vos nouveaux codes de secours", + "I've saved my backup codes": "J’ai enregistré mes codes de secours", + "Failed to setup MFA": "Échec de la configuration de l’authentification multifacteur", + "Setup & Verify": "Configurer et vérifier", + "Add to authenticator": "Ajouter à l’application d’authentification", + "1. Scan this QR code with your authenticator app": "1. Scannez ce code QR avec votre application d’authentification", + "Can't scan the code?": "Impossible de scanner le code ?", + "Enter this code manually in your authenticator app:": "Entrez ce code manuellement dans votre application d'authentification :", + "2. Enter the 6-digit code from your authenticator": "2. Saisissez le code à 6 chiffres de votre application d’authentification", + "Verify and enable": "Vérifier et activer", + "Failed to generate QR code. Please try again.": "Échec de la génération du code QR. Veuillez réessayer.", + "Backup": "Secours", + "Save codes": "Enregistrer les codes", + "Save your backup codes": "Enregistrez vos codes de secours", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Ces codes peuvent être utilisés pour accéder à votre compte si vous perdez l'accès à votre application d'authentification. Chaque code ne peut être utilisé qu'une seule fois.", + "Print": "Imprimer", + "Two-factor authentication has been set up. Please log in again.": "L'authentification à deux facteurs a été configurée. Veuillez vous reconnecter.", + "Two-Factor authentication required": "Authentification à deux facteurs requise", + "Your workspace requires two-factor authentication for all users": "Votre espace de travail exige l’authentification à deux facteurs pour tous les utilisateurs", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Pour continuer à accéder à votre espace de travail, vous devez configurer l'authentification à deux facteurs. Cela ajoute une couche de sécurité supplémentaire à votre compte.", + "Set up two-factor authentication": "Configurer l’authentification à deux facteurs", + "Cancel and logout": "Annuler et se déconnecter", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Votre espace de travail nécessite l'authentification à deux facteurs. Veuillez le configurer pour continuer.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Cela ajoute une couche de sécurité supplémentaire à votre compte en exigeant un code de vérification provenant de votre application d'authentification.", + "Password is required": "Le mot de passe est requis", + "Password must be at least 8 characters": "Le mot de passe doit comporter au moins 8 caractères", + "Please enter a 6-digit code": "Veuillez saisir un code à 6 chiffres", + "Code must be exactly 6 digits": "Le code doit comporter exactement 6 chiffres", + "Enter the 6-digit code found in your authenticator app": "Saisissez le code à 6 chiffres indiqué dans votre application d’authentification", + "Need help authenticating?": "Besoin d'aide pour l'authentification ?", + "MFA QR Code": "Code QR d’authentification multifacteur", + "Account created successfully. Please log in to set up two-factor authentication.": "Compte créé avec succès. Veuillez vous connecter pour configurer l'authentification à deux facteurs.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Réinitialisation du mot de passe réussie. Veuillez vous connecter avec votre nouveau mot de passe et compléter l'authentification à deux facteurs.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Réinitialisation du mot de passe réussie. Veuillez vous connecter avec votre nouveau mot de passe pour configurer l'authentification à deux facteurs.", + "Password reset was successful. Please log in with your new password.": "La réinitialisation du mot de passe a réussi. Veuillez vous connecter avec votre nouveau mot de passe.", + "Two-factor authentication": "Authentification à deux facteurs", + "Use authenticator app instead": "Utiliser l’application d’authentification à la place", + "Verify backup code": "Vérifier le code de secours", + "Use backup code": "Utiliser un code de secours", + "Enter one of your backup codes": "Saisissez l’un de vos codes de secours", + "Backup code": "Code de secours", + "Enter one of your backup codes. Each backup code can only be used once.": "Entrez un de vos codes de sauvegarde. Chaque code de sauvegarde ne peut être utilisé qu'une seule fois.", + "Verify": "Vérifier", + "Trash": "Corbeille", + "Pages in trash will be permanently deleted after {{count}} days.": "Les pages dans la corbeille seront définitivement supprimées après {{count}} jours.", + "Deleted": "Supprimé", + "No pages in trash": "Aucune page dans la corbeille", + "Permanently delete page?": "Supprimer définitivement la page ?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Êtes-vous sûr de vouloir supprimer définitivement « {{title}} » ? Cette action ne peut pas être annulée.", + "Restore '{{title}}' and its sub-pages?": "Restaurer « {{title}} » et ses sous-pages ?", + "Move to trash": "Déplacer vers la corbeille", + "Move this page to trash?": "Déplacer cette page vers la corbeille ?", + "Restore page": "Restaurer la page", + "Permanently delete": "Supprimer définitivement", + "{{name}} moved this page to Trash {{time}}.": "{{name}} a déplacé cette page vers la corbeille {{time}}.", + "Page moved to trash": "Page déplacée vers la corbeille", + "Page restored successfully": "Page restaurée avec succès", + "Deleted by": "Supprimé par", + "Deleted at": "Supprimé le", + "Preview": "Aperçu", + "Base preview unavailable": "Aperçu de la base indisponible", + "Restore this base to view its contents.": "Restaurez cette base pour afficher son contenu.", + "Subpages": "Sous-pages", + "Failed to load subpages": "Échec du chargement des sous-pages", + "No subpages": "Aucune sous-page", + "Subpages (Child pages)": "Sous-pages (pages enfants)", + "List all subpages of the current page": "Lister toutes les sous-pages de la page actuelle", + "Attachments": "Pièces jointes", + "All spaces": "Tous les espaces", + "Unknown": "Inconnu", + "Find a space": "Trouver un espace", + "Search in all your spaces": "Rechercher dans tous vos espaces", + "Type": "Type", + "Enterprise": "Entreprise", + "Download attachment": "Télécharger la pièce jointe", + "Allowed email domains": "Domaines e-mail autorisés", + "Only users with email addresses from these domains can signup via SSO.": "Seuls les utilisateurs disposant d’adresses e-mail provenant de ces domaines peuvent s’inscrire via l’authentification unique (SSO).", + "Enter valid domain names separated by comma or space": "Saisissez des noms de domaine valides séparés par une virgule ou un espace", + "Enforce two-factor authentication": "Imposer l’authentification à deux facteurs", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Une fois appliquée, tous les membres doivent activer l'authentification à deux facteurs pour accéder à l'espace de travail.", + "Toggle MFA enforcement": "Basculer l’obligation d’authentification multifacteur", + "Display name": "Nom d’affichage", + "Allow signup": "Autoriser l’inscription", + "Enabled": "Activé", + "Advanced Settings": "Paramètres avancés", + "Enable TLS/SSL": "Activer TLS/SSL", + "Use secure connection to LDAP server": "Utiliser une connexion sécurisée au serveur LDAP", + "Group sync": "Synchronisation des groupes", + "No SSO providers found.": "Aucun fournisseur SSO trouvé.", + "Delete SSO provider": "Supprimer le fournisseur SSO", + "Are you sure you want to delete this SSO provider?": "Êtes-vous sûr de vouloir supprimer ce fournisseur SSO ?", + "Action": "Action", + "{{ssoProviderType}} configuration": "Configuration de {{ssoProviderType}}", + "Icon": "Icône", + "Upload image": "Téléverser une image", + "Remove image": "Supprimer l'image", + "Failed to remove image": "Échec de la suppression de l'image", + "Image exceeds 10MB limit.": "L'image dépasse la limite de 10 Mo.", + "Image removed successfully": "Image supprimée avec succès", + "API key": "Clé API", + "API keys": "Clés API", + "API management": "Gestion des API", + "Custom expiration date": "Date d'expiration personnalisée", + "Enter a descriptive token name": "Entrez un nom descriptif pour le jeton", + "Expiration": "Expiration", + "Expired": "Expiré(e)", + "Expires": "Expire", + "Last use": "Dernière utilisation", + "No API keys found": "Aucune clé API trouvée", + "No expiration": "Pas d'expiration", + "Revoked successfully": "Révoqué(e) avec succès", + "Select expiration date": "Sélectionnez la date d'expiration", + "This action cannot be undone. Any applications using this API key will stop working.": "Cette action ne peut pas être annulée. Toutes les applications utilisant cette clé API cesseront de fonctionner.", + "Update": "Mettre à jour", + "Update {{credential}}": "Mettre à jour {{credential}}", + "Manage API keys for all users in the workspace": "Gérer les clés API pour tous les utilisateurs dans l'espace de travail", + "Restrict API key creation to admins": "Restreindre la création de clés API aux administrateurs", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Seuls les administrateurs et les propriétaires peuvent créer de nouvelles clés API. Les clés des membres existants continueront de fonctionner.", + "Toggle restrict API keys to admins": "Activer ou désactiver la restriction des clés API aux administrateurs", + "API key creation is restricted to admins by your workspace administrator.": "La création de clés API est restreinte aux administrateurs par l’administrateur de votre espace de travail.", + "AI settings": "Paramètres de l'IA", + "AI search": "Recherche IA", + "AI Answer": "Réponse IA", + "Ask AI": "Demander à l'IA", + "AI is thinking...": "L'IA réfléchit...", + "Thinking": "Réflexion en cours", + "Ask a question...": "Posez une question...", + "AI Answers": "Réponses IA", + "AI-powered search (AI Answers)": "Recherche propulsée par IA (Réponses IA)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "La recherche IA utilise des incorporations vectorielles pour fournir des capacités de recherche sémantique à travers le contenu de votre espace de travail.", + "Toggle AI search": "Basculer la recherche IA", + "Generative AI (Ask AI)": "IA générative (Demandez à l'IA)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Activer la génération de contenu assistée par IA dans l'éditeur. Permet aux utilisateurs de générer, améliorer, traduire et transformer du texte.", + "Toggle generative AI": "Activer/désactiver l'IA générative", + "Upgrade your plan": "Mettez à niveau votre forfait", + "Available with a paid license": "Disponible avec une licence payante", + "Upgrade your license tier.": "Mettez à niveau votre niveau de licence.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "L'IA est disponible dans les éditions payantes de Docmost. Contactez sales@docmost.com.", + "AI & MCP": "IA & MCP", + "AI": "IA", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Protocole de contexte de modèle (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Activez le serveur MCP pour permettre aux assistants et outils IA d'interagir avec le contenu de votre espace de travail.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP n'est disponible que dans l'édition Entreprise de Docmost. Contactez sales@docmost.com.", + "MCP Server URL": "URL du serveur MCP", + "Connect AI assistants with your Docmost account via OAuth.": "Connectez des assistants IA à votre compte Docmost via OAuth.", + "Enforce OAuth": "Imposer OAuth", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "Les assistants IA doivent se connecter avec un compte Docmost via OAuth. Les clés API ne peuvent pas être utilisées avec le serveur MCP.", + "Toggle enforce OAuth for MCP": "Activer ou désactiver l’imposition d’OAuth pour MCP", + "Supported tools": "Outils pris en charge", + "MCP server URL:": "URL du serveur MCP :", + "Learn more": "En savoir plus", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Gérez les clés API pour tous les utilisateurs de l'espace de travail. Consultez la documentation API pour plus de détails sur l'utilisation.", + "View the API documentation for usage details.": "Consultez la documentation API pour plus de détails sur l'utilisation.", + "View the MCP documentation.": "Consultez la documentation MCP.", + "Sources": "Sources", + "AI Answers not available for attachments": "Réponses IA non disponibles pour les pièces jointes", + "No answer available": "Pas de réponse disponible", + "Background color": "Couleur de fond", + "Highlight color": "Couleur de surbrillance", + "Remove color": "Supprimer la couleur", + "Notifications": "Notifications", + "No notifications": "Aucune notification", + "No unread notifications": "Aucune notification non lue", + "All notifications": "Toutes les notifications", + "Unread only": "Non lues uniquement", + "Mark all as read": "Tout marquer comme lu", + "Mark as read": "Marquer comme lu", + "More options": "Plus d'options", + "{{name}} mentioned you in a comment": "{{name}} vous a mentionné dans un commentaire", + "{{name}} commented on a page": "{{name}} a commenté une page", + "{{name}} resolved a comment": "{{name}} a résolu un commentaire", + "{{name}} mentioned you on a page": "{{name}} vous a mentionné sur une page", + "{{name}} gave you edit access to a page": "{{name}} vous a donné un accès de modification à une page", + "{{name}} gave you view access to a page": "{{name}} vous a donné un accès en lecture à une page", + "{{name}} updated a page": "{{name}} a mis à jour une page", + "Watch page": "Suivre la page", + "Stop watching": "Arrêter de suivre", + "Watch space": "Suivre l’espace", + "Stop watching space": "Arrêter de suivre l’espace", + "Email notifications": "Notifications par e-mail", + "Page updates": "Mises à jour de la page", + "Get notified when pages you watch are updated.": "Recevez une notification lorsque les pages que vous surveillez sont mises à jour.", + "Page mentions": "Mentions sur la page", + "Get notified when someone mentions you on a page.": "Recevez une notification lorsqu'une personne vous mentionne sur une page.", + "Comment mentions": "Mentions dans les commentaires", + "Get notified when someone mentions you in a comment.": "Recevez une notification lorsqu'une personne vous mentionne dans un commentaire.", + "New comments": "Nouveaux commentaires", + "Get notified about new comments on threads you participate in.": "Recevez une notification concernant les nouveaux commentaires dans les fils auxquels vous participez.", + "Resolved comments": "Commentaires résolus", + "Get notified when your comment is resolved.": "Recevez une notification lorsque votre commentaire est résolu.", + "You are now watching this page": "Vous surveillez désormais cette page", + "You are no longer watching this page": "Vous ne surveillez plus cette page", + "You are now watching this space": "Vous suivez maintenant cet espace", + "You are no longer watching this space": "Vous ne suivez plus cet espace", + "Direct": "Direct", + "Updates": "Mises à jour", + "Today": "Aujourd'hui", + "Yesterday": "Hier", + "This week": "Cette semaine", + "Older": "Plus ancien", + "Restricted page": "Page restreinte", + "Restricted pages cannot be shared publicly.": "Les pages restreintes ne peuvent pas être partagées publiquement.", + "Restricted by parent": "Restreint par la page parente", + "Restricted": "Restreint", + "Open": "Ouvert", + "Inherits restrictions from ancestor page": "Hérite des restrictions d'une page ancêtre", + "Only people listed below can access this page": "Seules les personnes listées ci-dessous peuvent accéder à cette page", + "Everyone in this space can access": "Tout le monde dans cet espace y a accès", + "No additional restrictions on this page": "Aucune restriction supplémentaire sur cette page", + "Only specific people can access": "Seules certaines personnes peuvent y accéder", + "Use only inherited restrictions": "Utiliser uniquement les restrictions héritées", + "Add restrictions on top of inherited": "Ajouter des restrictions en plus de celles héritées", + "Inherited restriction": "Restriction héritée", + "Access limited by": "Accès limité par", + "Restrict access to control who can view and edit this page": "Restreindre l'accès pour contrôler qui peut consulter et modifier cette page", + "Add additional restrictions specific to this page": "Ajouter des restrictions supplémentaires propres à cette page", + "Access": "Accès", + "People with access": "Personnes ayant accès", + "Remove all": "Tout retirer", + "Remove access": "Retirer l'accès", + "Remove all access": "Retirer tous les accès", + "Are you sure you want to remove this member's access to the page?": "Êtes-vous sûr de vouloir retirer l'accès de ce membre à la page ?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Êtes-vous sûr de vouloir supprimer tous les accès spécifiques ? Cela rendra la page accessible à tous les membres de l'espace.", + "Trash retention": "Conservation de la corbeille", + "Pages in trash will be permanently deleted after this period.": "Les pages dans la corbeille seront définitivement supprimées après cette période.", + "Trash retention updated": "Durée de conservation de la corbeille mise à jour", + "Failed to update trash retention": "Échec de la mise à jour de la durée de conservation de la corbeille", + "Removed page restriction": "Restriction de la page supprimée", + "Added page permission": "Autorisation de la page ajoutée", + "Removed page permission": "Autorisation de la page supprimée", + "Changed page permission": "Autorisation de page modifiée", + "Requested password reset": "Réinitialisation du mot de passe demandée", + "Created template": "Modèle créé", + "Deleted template": "Modèle supprimé", + "day": "jour", + "days": "jours", + "week": "semaine", + "weeks": "semaines", + "month": "mois", + "months": "mois", + "year": "an", + "years": "ans", + "Period": "Période", + "Fixed date": "Date fixe", + "Indefinitely": "Indéfiniment", + "Days": "Jours", + "Weeks": "Semaines", + "Months": "Mois", + "Years": "Ans", + "Pick a date": "Choisir une date", + "Maximum is {{max}} {{unit}} for this unit": "Le maximum est de {{max}} {{unit}} pour cette unité", + "Never expires. Verifiers can re-verify at any time.": "N’expire jamais. Les vérificateurs peuvent revérifier à tout moment.", + "Verified": "Vérifié", + "Review needed": "Révision nécessaire", + "Verification expired": "Vérification expirée", + "Draft": "Brouillon", + "In Approval": "En approbation", + "In approval": "En approbation", + "Approved": "Approuvé", + "Obsolete": "Obsolète", + "Expiring": "Expire bientôt", + "Set up verification": "Configurer la vérification", + "Verify page": "Vérifier la page", + "Page verification": "Vérification de la page", + "Add verification": "Ajouter une vérification", + "Edit verification": "Modifier la vérification", + "Search by title": "Rechercher par titre", + "Choose how this page should stay accurate.": "Choisissez comment cette page doit rester exacte.", + "Recurring verification": "Vérification récurrente", + "Verifiers re-confirm this page on a schedule.": "Les vérificateurs reconfirment cette page selon une fréquence définie.", + "Re-verify on a schedule (e.g every 30 days )": "Revérifier selon une fréquence définie (p. ex. tous les 30 jours)", + "Page stays editable at all times": "La page reste modifiable en permanence", + "Best for runbooks, FAQs, living documentation": "Idéal pour les runbooks, FAQ et la documentation évolutive", + "Approval workflow": "Flux d’approbation", + "Formal document lifecycle with named approvers.": "Cycle de vie formel du document avec des approbateurs désignés.", + "Draft → In approval → Approved → Obsolete": "Brouillon → En approbation → Approuvé → Obsolète", + "Locked once approved, with full history": "Verrouillé une fois approuvé, avec historique complet", + "Designed for ISO 9001, ISO 13485, and FDA": "Conçu pour l’ISO 9001, l’ISO 13485 et la FDA", + "Best for SOPs and controlled documents": "Idéal pour les SOP et les documents contrôlés", + "Back": "Retour", + "Quality management": "Gestion de la qualité", + "Recurring": "Récurrent", + "Pages move through draft, approval, and approved stages.": "Les pages passent par les étapes brouillon, approbation et approuvé.", + "Verifiers": "Vérificateurs", + "Add verifier": "Ajouter un vérificateur", + "I've reviewed this page for accuracy": "J’ai vérifié l’exactitude de cette page", + "Set up": "Configurer", + "Remove verification": "Supprimer la vérification", + "Are you sure you want to remove verification from this page?": "Voulez-vous vraiment supprimer la vérification de cette page ?", + "Assigned verifiers must periodically re-verify this page.": "Les vérificateurs assignés doivent revérifier périodiquement cette page.", + "Last verified by {{name}} {{time}} (expired)": "Dernière vérification par {{name}} {{time}} (expirée)", + "The fixed expiration date has passed.": "La date d’expiration fixe est passée.", + "Verified by {{name}} {{time}}": "Vérifié par {{name}} {{time}}", + "Expires {{date}}": "Expire le {{date}}", + "Expired {{date}}": "Expiré le {{date}}", + "Mark as obsolete": "Marquer comme obsolète", + "Mark obsolete": "Marquer comme obsolète", + "Returned by {{name}} {{time}}": "Renvoyé par {{name}} {{time}}", + "No approval has been requested yet.": "Aucune approbation n’a encore été demandée.", + "Submitted by {{name}} {{time}}": "Soumis par {{name}} {{time}}", + "Someone": "Quelqu’un", + "Approved by {{name}} {{time}}": "Approuvé par {{name}} {{time}}", + "This document has been marked as obsolete.": "Ce document a été marqué comme obsolète.", + "Rejection comment": "Commentaire de rejet", + "Reason for returning this document...": "Raison du renvoi de ce document...", + "Confirm rejection": "Confirmer le rejet", + "Submit for approval": "Soumettre pour approbation", + "Reject": "Rejeter", + "Approve": "Approuver", + "Re-submit for approval": "Soumettre à nouveau pour approbation", + "Verified until": "Vérifié jusqu’au", + "QMS": "SMQ", + "Verified pages": "Pages vérifiées", + "Search pages...": "Rechercher des pages...", + "Filter by space": "Filtrer par espace", + "Filter by type": "Filtrer par type", + "{{name}} verified a page": "{{name}} a vérifié une page", + "{{name}} submitted a page for your approval": "{{name}} a soumis une page à votre approbation", + "{{name}} returned a page for revision": "{{name}} a renvoyé une page pour révision", + "Page verification expires soon": "La vérification de la page expire bientôt", + "Page verification has expired": "La vérification de la page a expiré", + "SIEM destination {{name}} is failing": "La destination SIEM {{name}} est en échec", + "SIEM destination {{name}} was disabled after 24 hours of failures": "La destination SIEM {{name}} a été désactivée après 24 heures d’échecs", + "SIEM destination {{name}} recovered": "La destination SIEM {{name}} a récupéré", + "Verifying your email": "Vérification de votre e-mail", + "Please wait...": "Veuillez patienter...", + "Verification failed. The link may have expired.": "Échec de la vérification. Le lien a peut-être expiré.", + "Check your email": "Vérifiez votre e-mail", + "We sent a verification link to {{email}}.": "Nous avons envoyé un lien de vérification à {{email}}.", + "We sent a verification link to your email.": "Nous avons envoyé un lien de vérification à votre adresse e-mail.", + "Click the link to verify your email and access your workspace.": "Cliquez sur le lien pour vérifier votre adresse et accéder à votre espace de travail.", + "Resend verification email": "Renvoyer l’e-mail de vérification", + "Verification email sent. Please check your inbox.": "E-mail de vérification envoyé. Veuillez vérifier votre boîte de réception.", + "Failed to resend verification email. Please try again.": "Échec de l'envoi du nouvel e-mail de vérification. Veuillez réessayer.", + "We've sent you an email with your associated workspaces.": "Nous vous avons envoyé un e-mail avec vos espaces de travail associés.", + "Load more": "Charger plus", + "Log out of all devices": "Se déconnecter de tous les appareils", + "Log out of all sessions except this device": "Se déconnecter de toutes les sessions sauf cet appareil", + "This Device": "Cet appareil", + "Unknown device": "Appareil inconnu", + "No active sessions": "Aucune session active", + "Session revoked": "Session révoquée", + "All other sessions revoked": "Toutes les autres sessions ont été révoquées", + "Last used": "Dernière utilisation", + "Created": "Créé", + "Rename": "Renommer", + "Publish": "Publier", + "Security": "Sécurité", + "Enforce SSO": "Imposer le SSO", + "Once enforced, members will not be able to login with email and password.": "Une fois activé, les membres ne pourront plus se connecter avec leur e-mail et leur mot de passe.", + "AI-generated content may not be accurate.": "Le contenu généré par l’IA peut ne pas être exact.", + "AI Chat": "Chat IA", + "Analyze for insights": "Analyser pour obtenir des informations", + "Ask anything...": "Posez n’importe quelle question...", + "Assistant said:": "L’assistant a dit :", + "Chat history": "Historique des discussions", + "Chat name": "Nom de la discussion", + "Chat transcript": "Transcription du chat", + "Close": "Fermer", + "Copy assistant response": "Copier la réponse de l’assistant", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "Échec du chargement de la discussion. Une erreur s’est produite.", + "Failed to render this message.": "Échec de l’affichage de ce message.", + "How can I help you today?": "Comment puis-je vous aider aujourd’hui ?", + "New chat": "Nouvelle discussion", + "No chat history": "Aucun historique de discussion", + "No chats found": "Aucune discussion trouvée", + "No conversations yet": "Aucune conversation pour le moment", + "Open full page": "Ouvrir la page complète", + "Scroll to bottom": "Faire défiler jusqu’en bas", + "You said:": "Vous avez dit :", + "Previous 7 days": "7 derniers jours", + "Previous 30 days": "30 derniers jours", + "Search chats...": "Rechercher des discussions...", + "Search chats": "Rechercher des discussions", + "Ask anything... Use @ to mention pages": "Demandez n’importe quoi… Utilisez @ pour mentionner des pages", + "Ask anything or search your workspace": "Posez n’importe quelle question ou recherchez dans votre espace de travail", + "Welcome to {{name}}": "Bienvenue sur {{name}}", + "Add files": "Ajouter des fichiers", + "Mention a page": "Mentionner une page", + "Start a new chat to see it here.": "Commencez une nouvelle discussion pour la voir ici.", + "Summarize this page": "Résumer cette page", + "Toggle AI Chat": "Basculer le chat IA", + "Translate this page": "Traduire cette page", + "Try a different search term.": "Essayez un autre terme de recherche.", + "Try again": "Réessayer", + "Untitled chat": "Discussion sans titre", + "What can I help you with?": "Que puis-je faire pour vous aider ?", + "Are you sure you want to revoke this {{credential}}": "Êtes-vous sûr de vouloir révoquer ce/cette {{credential}}", + "Automatically provision users and groups from your identity provider via SCIM.": "Provisionnez automatiquement les utilisateurs et les groupes depuis votre fournisseur d’identité via SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Configurez votre fournisseur d’identité avec cette URL pour provisionner les utilisateurs et les groupes.", + "Create {{credential}}": "Créer {{credential}}", + "{{credential}} created": "{{credential}} créé", + "{{credential}} created successfully": "{{credential}} créé avec succès", + "Created by": "Créé par", + "Custom": "Personnalisé", + "Enable SCIM": "Activer SCIM", + "Enter a descriptive name": "Saisissez un nom descriptif", + "I've saved my {{credential}}": "J’ai enregistré mon/ma {{credential}}", + "Important": "Important", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Assurez-vous de copier votre {{credential}} maintenant. Vous ne pourrez plus le/la voir ensuite !", + "Never": "Jamais", + "Revoke {{credential}}": "Révoquer {{credential}}", + "SCIM endpoint URL": "URL du point de terminaison SCIM", + "SCIM provisioning": "Provisionnement SCIM", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM a priorité sur la synchronisation des groupes SSO lorsqu’il est activé.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "Vous avez atteint le maximum de {{max}} jetons SCIM. Supprimez un jeton existant pour en créer un nouveau.", + "SCIM token": "Jeton SCIM", + "SCIM tokens": "Jetons SCIM", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Cette action est irréversible. Votre fournisseur d’identité cessera immédiatement la synchronisation.", + "Toggle SCIM provisioning": "Activer/désactiver le provisionnement SCIM", + "Token": "Jeton", + "Page menu": "Menu de la page", + "Expand": "Développer", + "Collapse": "Réduire", + "Comment menu": "Menu du commentaire", + "Group menu": "Menu du groupe", + "Show hidden breadcrumbs": "Afficher les fils d’Ariane masqués", + "Breadcrumbs": "Fils d’Ariane", + "Page actions": "Actions de la page", + "Pick emoji": "Choisir un emoji", + "Template menu": "Menu du modèle", + "Use": "Utiliser", + "Use template": "Utiliser le modèle", + "Preview template: {{title}}": "Aperçu du modèle : {{title}}", + "Use a template": "Utiliser un modèle", + "Search templates...": "Rechercher des modèles...", + "Search spaces...": "Rechercher des espaces...", + "No templates found": "Aucun modèle trouvé", + "No spaces found": "Aucun espace trouvé", + "Browse all templates": "Parcourir tous les modèles", + "This space": "Cet espace", + "All templates": "Tous les modèles", + "Global": "Global", + "New template": "Nouveau modèle", + "Edit template": "Modifier le modèle", + "Are you sure you want to delete this template?": "Êtes-vous sûr de vouloir supprimer ce modèle ?", + "Template scope updated": "Portée du modèle mise à jour", + "Choose which space this template belongs to": "Choisissez à quel espace appartient ce modèle", + "Only workspace admins can create global templates.": "Seuls les administrateurs de l’espace de travail peuvent créer des modèles globaux.", + "You need edit access to this space to create templates.": "Vous devez disposer d’un accès en modification à cet espace pour créer des modèles.", + "Scope": "Portée", + "Select scope": "Sélectionner la portée", + "Title": "Titre", + "Saving...": "Enregistrement...", + "Saved": "Enregistré", + "Save failed. Retry": "Échec de l’enregistrement. Réessayer", + "By {{name}}": "Par {{name}}", + "Updated {{time}}": "Mis à jour {{time}}", + "Choose destination": "Choisir la destination", + "Search pages and spaces...": "Rechercher des pages et des espaces...", + "No results found": "Aucun résultat trouvé", + "You don't have permission to create pages here": "Vous n’avez pas l’autorisation de créer des pages ici", + "Chat menu for {{title}}": "Menu de discussion pour {{title}}", + "API key menu": "Menu de la clé API", + "Jump to comment selection": "Aller à la sélection de commentaires", + "Slash commands": "Commandes slash", + "Mention suggestions": "Suggestions de mention", + "Link suggestions": "Suggestions de liens", + "Diagram editor": "Éditeur de diagrammes", + "Add comment": "Ajouter un commentaire", + "Find and replace": "Rechercher et remplacer", + "Main navigation": "Navigation principale", + "Space navigation": "Navigation de l’espace", + "Settings navigation": "Navigation des paramètres", + "AI navigation": "Navigation IA", + "Breadcrumb": "Fil d’Ariane", + "Synced block": "Bloc synchronisé", + "Create a block that stays in sync across pages.": "Créez un bloc qui reste synchronisé entre les pages.", + "Editing original": "Modification de l’original", + "Copy synced block": "Copier le bloc synchronisé", + "Unsync": "Désynchroniser", + "Delete synced block": "Supprimer le bloc synchronisé", + "Synced to {{count}} other page_one": "Synchronisée avec {{count}} autre page", + "Synced to {{count}} other page_other": "Synchronisée avec {{count}} autres pages", + "ORIGINAL": "ORIGINAL", + "THIS PAGE": "CETTE PAGE", + "No pages": "Aucune page", + "The original synced block no longer exists": "Le bloc synchronisé d’origine n’existe plus", + "You don't have access to this synced block": "Vous n’avez pas accès à ce bloc synchronisé", + "Failed to load this synced block": "Échec du chargement de ce bloc synchronisé", + "Fixed editor toolbar": "Barre d’outils de l’éditeur fixe", + "Show a formatting toolbar above the editor with quick access to common actions.": "Afficher une barre d’outils de mise en forme au-dessus de l’éditeur avec un accès rapide aux actions courantes.", + "Toggle fixed editor toolbar": "Activer/désactiver la barre d’outils de l’éditeur fixe", + "Normal text": "Texte normal", + "More inline formatting": "Plus de mise en forme en ligne", + "Subscript": "Indice", + "Superscript": "Exposant", + "Inline code": "Code en ligne", + "Insert media": "Insérer un média", + "Mention": "Mention", + "Emoji": "Emoji", + "Columns": "Colonnes", + "More inserts": "Plus d’insertions", + "Embeds": "Intégrations", + "Diagrams": "Diagrammes", + "Advanced": "Avancé", + "Utility": "Utilitaire", + "Decrease indent": "Réduire le retrait", + "Increase indent": "Augmenter le retrait", + "Clear formatting": "Effacer la mise en forme", + "Code block": "Bloc de code", + "Experimental": "Expérimental", + "Strikethrough": "Barré", + "Undo": "Annuler", + "Redo": "Rétablir", + "Backlinks": "Liens retour", + "Last updated by": "Dernière mise à jour par", + "Last updated": "Dernière mise à jour", + "Stats": "Statistiques", + "Word count": "Nombre de mots", + "Characters": "Caractères", + "Incoming links": "Liens entrants", + "Outgoing links": "Liens sortants", + "Incoming links ({{count}})": "Liens entrants ({{count}})", + "Outgoing links ({{count}})": "Liens sortants ({{count}})", + "No pages link here yet.": "Aucune page ne pointe encore ici.", + "This page doesn't link to other pages yet.": "Cette page ne renvoie pas encore vers d’autres pages.", + "Verified until {{date}}": "Vérifié jusqu’au {{date}}", + "Labels": "Étiquettes", + "Add label": "Ajouter une étiquette", + "No labels yet": "Aucune étiquette pour l’instant", + "Already added": "Déjà ajouté", + "Invalid label name": "Nom d’étiquette invalide", + "No matches": "Aucune correspondance", + "Search or create…": "Rechercher ou créer…", + "Remove label {{name}}": "Supprimer l’étiquette {{name}}", + "Failed to add label": "Échec de l’ajout de l’étiquette", + "Failed to remove label": "Échec de la suppression de l’étiquette", + "No pages with this label": "Aucune page avec cette étiquette", + "Pages tagged with this label will appear here.": "Les pages portant cette étiquette apparaîtront ici.", + "No pages match your search.": "Aucune page ne correspond à votre recherche.", + "Updated {{date}}": "Mis à jour le {{date}}", + "Cell actions": "Actions de cellule", + "Column actions": "Actions de colonne", + "Row actions": "Actions de ligne", + "Filter": "Filtrer", + "Page title": "Titre de la page", + "Page content": "Contenu de la page", + "Member actions for {{name}}": "Actions du membre pour {{name}}", + "Toggle password visibility": "Afficher/masquer le mot de passe", + "Send comment": "Envoyer le commentaire", + "Token actions": "Actions du jeton", + "Template settings": "Paramètres du modèle", + "Edit diagram": "Modifier le diagramme", + "Edit embed": "Modifier l’intégration", + "Edit drawing": "Modifier le dessin", + "Delete equation": "Supprimer l’équation", + "Invite actions": "Actions d’invitation", + "Get started": "Commencer", + "* indicates required fields": "* indique les champs obligatoires", + "List of spaces in this workspace": "Liste des espaces de cet espace de travail", + "Active sessions": "Sessions actives", + "Add {{name}} to favorites": "Ajouter {{name}} aux favoris", + "Remove {{name}} from favorites": "Retirer {{name}} des favoris", + "Added to favorites": "Ajouté aux favoris", + "Removed from favorites": "Retiré des favoris", + "Added {{name}} to favorites": "{{name}} a été ajouté aux favoris", + "Removed {{name}} from favorites": "{{name}} a été retiré des favoris", + "Page menu for {{name}}": "Menu de la page pour {{name}}", + "Create subpage of {{name}}": "Créer une sous-page de {{name}}", + "Allow personal spaces": "Autoriser les espaces personnels", + "Members can create their own personal space.": "Les membres peuvent créer leur propre espace personnel.", + "Toggle allow personal spaces": "Activer/désactiver l'autorisation des espaces personnels", + "Create personal space": "Créer un espace personnel", + "Personal space": "Espace personnel", + "{{name}}'s space": "Espace de {{name}}", + "Apply": "Appliquer", + "Cells that aren't already a page reference will be cleared.": "Les cellules qui ne sont pas déjà une référence de page seront effacées.", + "Cells that aren't a valid URL will be cleared.": "Les cellules qui ne sont pas une URL valide seront effacées.", + "Cells that aren't a valid email address will be cleared.": "Les cellules qui ne sont pas une adresse e-mail valide seront effacées.", + "Cells that can't be parsed as a date will be cleared.": "Les cellules qui ne peuvent pas être interprétées comme une date seront effacées.", + "Cells that can't be parsed as a number will be cleared.": "Les cellules qui ne peuvent pas être interprétées comme un nombre seront effacées.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Les cellules seront converties (yes/true/1 deviendront cochées ; tout le reste deviendra décoché ou sera effacé).", + "Cells will be reinterpreted under the new type.": "Les cellules seront réinterprétées selon le nouveau type.", + "Cells will be replaced with a comma-separated list of file names.": "Les cellules seront remplacées par une liste de noms de fichiers séparés par des virgules.", + "Cells will be replaced with a comma-separated list of option names.": "Les cellules seront remplacées par une liste de noms d'options séparés par des virgules.", + "Cells will be replaced with the option name.": "Les cellules seront remplacées par le nom de l'option.", + "Cells will be replaced with the page title.": "Les cellules seront remplacées par le titre de la page.", + "Cells will be replaced with the person's name.": "Les cellules seront remplacées par le nom de la personne.", + "Change type": "Changer le type", + "Change type to {{label}}?": "Changer le type en {{label}} ?", + "Converting…": "Conversion…", + "Existing values become single-item lists. No data is lost.": "Les valeurs existantes deviennent des listes à un seul élément. Aucune donnée n'est perdue.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Seul le premier élément sélectionné par ligne sera conservé ; les autres seront ignorés.", + "Previous record": "Enregistrement précédent", + "Next record": "Enregistrement suivant", + "Record actions": "Actions de l'enregistrement", + "Delete record": "Supprimer l'enregistrement", + "Delete record?": "Supprimer l'enregistrement ?", + "This action cannot be undone.": "Cette action ne peut pas être annulée.", + "to navigate": "pour naviguer", + "to close": "pour fermer", + "Expand row {{number}}": "Développer la ligne {{number}}", + "Saving…": "Enregistrement…", + "Read-only": "Lecture seule", + "Loading…": "Chargement…", + "Updated {{when}}": "Mis à jour {{when}}", + "Add property": "Ajouter une propriété", + "Create property": "Créer une propriété", + "Hide properties": "Masquer les propriétés", + "Find a property type": "Rechercher un type de propriété", + "Properties": "Propriétés", + "A property with this name already exists": "Une propriété portant ce nom existe déjà", + "Add card": "Ajouter une carte", + "Add filter": "Ajouter un filtre", + "Add option": "Ajouter une option", + "Add sort": "Ajouter un tri", + "Add view": "Ajouter une vue", + "All data in this column will be lost.": "Toutes les données de cette colonne seront perdues.", + "Allow multiple people": "Autoriser plusieurs personnes", + "Alphabetize": "Trier par ordre alphabétique", + "Are you sure you want to delete": "Êtes-vous sûr de vouloir supprimer", + "Ascending": "Croissant", + "Base deleted": "Base supprimée", + "Base name": "Nom de la base", + "Base table": "Table de base", + "Card properties": "Propriétés de la carte", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Les cellules dépassant la limite de texte seront tronquées et le contenu supplémentaire sera définitivement perdu.", + "Checkbox": "Case à cocher", + "Checked by default": "Coché par défaut", + "Choose a property": "Choisir une propriété", + "Clear selection": "Effacer la sélection", + "Column options": "Options de la colonne", + "Comma, period": "Virgule, point", + "Complete": "Terminé", + "Contains": "Contient", + "Copy link to view": "Copier le lien vers la vue", + "Create a status property": "Créer une propriété de statut", + "Created at": "Créé le", + "Currency": "Devise", + "Decimal places": "Décimales", + "Default value": "Valeur par défaut", + "Delete property": "Supprimer la propriété", + "Delete view": "Supprimer la vue", + "Delete {{count}} rows?_one": "Supprimer 1 ligne ?", + "Delete {{count}} rows?_other": "Supprimer {{count}} lignes ?", + "Descending": "Décroissant", + "Discard": "Ignorer", + "Doesn't contain": "Ne contient pas", + "Done": "Terminé", + "Edit formula": "Modifier la formule", + "Edit property": "Modifier la propriété", + "Export CSV": "Exporter en CSV", + "Failed to load base": "Échec du chargement de la base", + "False": "Faux", + "File": "Fichier", + "Filter and sort changes are visible only to you": "Les modifications de filtre et de tri ne sont visibles que par vous", + "Filter by": "Filtrer par", + "Formula": "Formule", + "Get started with": "Commencer avec", + "Greater than": "Supérieur à", + "Group by": "Grouper par", + "Group this board by a select or status property.": "Groupez ce tableau par une propriété de sélection ou de statut.", + "Hide all": "Tout masquer", + "Hide group": "Masquer le groupe", + "In Progress": "En cours", + "In progress": "En cours", + "Include time": "Inclure l'heure", + "Insert a kanban board on this page": "Insérer un tableau kanban sur cette page", + "Insert an inline base on this page": "Insérer une base intégrée sur cette page", + "Is": "Est", + "Is after": "Est après", + "Is any of": "Est l'un de", + "Is before": "Est avant", + "Is empty": "Est vide", + "Is none of": "N'est aucun de", + "Is not": "N'est pas", + "Is not empty": "N'est pas vide", + "Is on or after": "Est le ou après le", + "Is on or before": "Est le ou avant le", + "Is within": "Est dans la plage", + "Keep editing": "Continuer la modification", + "Last edited at": "Dernière modification le", + "Last edited by": "Dernière modification par", + "Less than": "Inférieur à", + "Link copied to clipboard": "Lien copié dans le presse-papiers", + "Local": "Local", + "Long text": "Texte long", + "Moved card to {{column}}": "Carte déplacée vers {{column}}", + "Moved column to {{column}}": "Colonne déplacée vers {{column}}", + "Multi-select": "Sélection multiple", + "New row": "Nouvelle ligne", + "Next month": "Le mois prochain", + "Next week": "La semaine prochaine", + "Next year": "L'année prochaine", + "No filters applied": "Aucun filtre appliqué", + "No match": "Aucune correspondance", + "No options for this property type": "Aucune option pour ce type de propriété", + "No sorts applied": "Aucun tri appliqué", + "No value": "Aucune valeur", + "None": "Aucun", + "Not started": "Non commencé", + "Number": "Nombre", + "One month ago": "Il y a un mois", + "One month from now": "Dans un mois", + "One week ago": "Il y a une semaine", + "One week from now": "Dans une semaine", + "Open as page": "Ouvrir comme page", + "Options": "Options", + "Past month": "Le mois dernier", + "Past week": "La semaine dernière", + "Past year": "L'année dernière", + "Percent": "Pourcentage", + "Period, comma": "Point, virgule", + "Person": "Personne", + "Please enter a valid email": "Veuillez entrer une adresse e-mail valide", + "Progress": "Progression", + "Property options": "Options de la propriété", + "Relative": "Relatif", + "Rename property": "Renommer la propriété", + "Reset": "Réinitialiser", + "Save for everyone": "Enregistrer pour tout le monde", + "Select": "Sélection", + "Select a property": "Sélectionner une propriété", + "Select all loaded rows": "Sélectionner toutes les lignes chargées", + "Show all": "Tout afficher", + "Sort": "Trier", + "Sort by": "Trier par", + "Space, comma": "Espace, virgule", + "Space, period": "Espace, point", + "This board has no grouping property yet.": "Ce tableau n'a pas encore de propriété de groupement.", + "This month": "Ce mois-ci", + "This year": "Cette année", + "Thousands and decimal separators": "Séparateurs des milliers et des décimales", + "Time format": "Format de l'heure", + "To Do": "À faire", + "Tomorrow": "Demain", + "True": "Vrai", + "Unsaved changes": "Modifications non enregistrées", + "Untitled base": "Base sans titre", + "URL": "URL", + "Value": "Valeur", + "View updated for everyone": "Vue mise à jour pour tout le monde", + "You have unsaved changes. Do you want to discard them?": "Vous avez des modifications non enregistrées. Voulez-vous les ignorer ?", + "{{count}} rows deleted_one": "1 ligne supprimée", + "{{count}} rows deleted_other": "{{count}} lignes supprimées", + "{{count}} selected_one": "1 sélectionné(e)", + "{{count}} selected_other": "{{count}} sélectionné(e)s", + "Compare": "Comparer", + "Compare versions": "Comparer les versions", + "Select version from {{date}}": "Sélectionner la version du {{date}}", + "Version actions for {{date}}": "Actions de version pour le {{date}}", + "Comparing {{newer}} and {{older}}": "Comparaison de {{newer}} et {{older}}", + "Exit compare": "Quitter la comparaison", + "Search attachments...": "Rechercher des pièces jointes...", + "Error loading attachments.": "Erreur lors du chargement des pièces jointes.", + "No attachments on this page yet.": "Aucune pièce jointe sur cette page pour le moment.", + "Uploaded by {{name}}": "Téléversé par {{name}}", + "Download {{name}}": "Télécharger {{name}}", + "Access revoked": "Accès révoqué", + "Authorize application": "Autoriser l’application", + "{{name}} wants to access {{workspace}}": "{{name}} souhaite accéder à {{workspace}}", + "Not you? Switch account": "Ce n’est pas vous ? Changer de compte", + "This application will be able to:": "Cette application pourra :", + "Write": "Écriture", + "Invalid authorization request": "Demande d’autorisation invalide", + "Authorize": "Autoriser", + "Application": "Application", + "Permissions": "Autorisations", + "Authorized": "Autorisé", + "Revoke access": "Révoquer l’accès", + "Revoke access for {{name}}": "Révoquer l’accès pour {{name}}", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Êtes-vous sûr de vouloir révoquer l’accès pour {{name}} ? L’application ne pourra plus accéder à votre compte.", + "Something went wrong. Please try again.": "Une erreur s’est produite. Veuillez réessayer.", + "Remove {{name}}": "Supprimer {{name}}", + "Make sure you trust this application before authorizing it.": "Assurez-vous de faire confiance à cette application avant de l’autoriser.", + "You will be redirected to": "Vous serez redirigé vers", + "View content without making changes.": "Afficher le contenu sans apporter de modifications.", + "Create and modify content.": "Créer et modifier du contenu.", + "Applications and AI assistants you have authorized to access your account.": "Applications et assistants IA que vous avez autorisés à accéder à votre compte.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "MCP est activé dans votre espace de travail. Connectez des assistants IA à votre compte Docmost via OAuth.", + "Authorized apps": "Applications autorisées", + "No authorized apps yet.": "Aucune application autorisée pour le moment.", + "Workspace knowledge only": "Connaissances de l’espace de travail uniquement", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Limiter AI Chat aux réponses provenant uniquement des pages de votre espace de travail et des fichiers téléversés. Il n’utilisera pas de connaissances externes.", + "Toggle workspace knowledge only": "Activer/désactiver les connaissances de l’espace de travail uniquement", + "Read-only mode": "Mode lecture seule", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI Chat peut rechercher et lire le contenu de l’espace de travail, mais ne peut pas créer ni modifier des pages.", + "Toggle AI Chat read-only mode": "Activer/désactiver le mode lecture seule d’AI Chat", + "Title only": "Titre uniquement", + "you": "vous", + "Allow public spaces": "Autoriser les espaces publics", + "Space admins can publish their spaces to the web.": "Les administrateurs d’espace peuvent publier leurs espaces sur le Web.", + "Toggle allow public spaces": "Basculer l’autorisation des espaces publics", + "Publish space to the web": "Publier l’espace sur le Web", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Toute personne sur Internet pourra lire chaque page de cet espace, sauf les pages restreintes. Êtes-vous sûr ?", + "Make this space publicly readable by anyone on the internet.": "Rendre cet espace lisible publiquement par toute personne sur Internet.", + "Toggle publish space to the web": "Basculer la publication de l’espace sur le Web", + "Allow search engines to index": "Autoriser les moteurs de recherche à indexer", + "Let public pages in this space appear in search engine results.": "Permettre aux pages publiques de cet espace d’apparaître dans les résultats des moteurs de recherche.", + "Toggle search engine indexing": "Basculer l’indexation par les moteurs de recherche", + "Public space link": "Lien public de l’espace", + "Copy public space link": "Copier le lien public de l’espace", + "Renaming the space slug will break public links.": "Renommer l’identifiant d’espace cassera les liens publics.", + "Failed to update space": "Échec de la mise à jour de l’espace", + "This space is public": "Cet espace est public", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Toute personne sur Internet peut lire les pages de cet espace, sauf les pages restreintes.", + "Open public site": "Ouvrir le site public", + "Public": "Public", + "This space has no public pages yet.": "Cet espace n’a encore aucune page publique.", + "On this page": "Sur cette page", + "Previous": "Précédent", + "Next": "Suivant", + "Show hidden pages": "Afficher les pages masquées", + "Page navigation": "Navigation de page", + "Toggle sidebar": "Basculer la barre latérale", + "Toggle table of contents": "Basculer la table des matières", + "Appearance": "Apparence", + "Forest": "Forêt", + "Violet": "Violet", + "Light mode color": "Couleur du mode clair", + "Dark mode color": "Couleur du mode sombre", + "Choose the primary color of the public docs site.": "Choisissez la couleur principale du site de documentation public.", + "Show page author": "Afficher l’auteur de la page", + "Display the page creator's name on public pages.": "Afficher le nom du créateur de la page sur les pages publiques.", + "Toggle show page author": "Basculer l’affichage de l’auteur de la page", + "Show last updated": "Afficher la dernière mise à jour", + "Display when each page was last updated.": "Afficher la date de dernière mise à jour de chaque page.", + "Toggle show last updated": "Basculer l’affichage de la dernière mise à jour", + "Open public page": "Ouvrir la page publique", + "Toggle color scheme": "Basculer le schéma de couleurs", + "Ember": "Braise", + "Rose": "Rose", + "Documentation": "Documentation", + "All published spaces.": "Tous les espaces publiés.", + "No public spaces yet.": "Aucun espace public pour le moment.", + "Show public directory": "Afficher le répertoire public", + "List published spaces at /docs for anyone to browse.": "Lister les espaces publiés dans /docs pour que tout le monde puisse les parcourir.", + "Toggle show public directory": "Basculer l’affichage du répertoire public", + "Show in public directory": "Afficher dans le répertoire public", + "List this space in the public directory at /docs.": "Lister cet espace dans le répertoire public à /docs.", + "Toggle show in public directory": "Basculer l’affichage dans le répertoire public", + "Open public space link": "Ouvrir le lien public de l’espace", + "Disable public spaces": "Désactiver les espaces publics", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Les administrateurs d’espace pourront rendre leurs espaces lisibles publiquement par toute personne sur Internet. Êtes-vous sûr ?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Cela dépubliera immédiatement chaque espace publié. Les réactiver plus tard ne les republiera pas. Êtes-vous sûr ?", + "Allow": "Autoriser", + "Shared pages": "Pages partagées", + "Published spaces": "Espaces publiés", + "Spaces published to the web will appear here": "Les espaces publiés sur le Web apparaîtront ici", + "No published spaces": "Aucun espace publié", + "Published by": "Publié par", + "Published at": "Publié le", + "Open space": "Ouvrir l’espace", + "Unpublish": "Dépublier", + "Unpublish space": "Dépublier l’espace", + "This space will no longer be publicly accessible. Are you sure?": "Cet espace ne sera plus accessible publiquement. Êtes-vous sûr ?", + "More options for {{name}}": "Plus d’options pour {{name}}", + "Edit page": "Modifier la page", + "Sign in": "Se connecter", + "Open app": "Ouvrir l’application", + "No spaces match your search.": "Aucun espace ne correspond à votre recherche.", + "Welcome to our documentation": "Bienvenue dans notre documentation", + "Guides, references and answers across all our published spaces.": "Guides, références et réponses dans tous nos espaces publiés.", + "Guides, references and answers across all our spaces.": "Guides, références et réponses dans tous nos espaces.", + "Search documentation...": "Rechercher dans la documentation...", + "1 published space": "1 espace publié", + "{{count}} published spaces": "{{count}} published spaces", + "Actions": "Actions", + "Add destination": "Ajouter une destination", + "Are you sure you want to delete the destination": "Êtes-vous sûr de vouloir supprimer la destination", + "Audit logs": "Journaux d’audit", + "Audit logs & SIEM": "Journaux d’audit et SIEM", + "Auth header name": "Nom de l’en-tête d’authentification", + "Auth header prefix": "Préfixe de l’en-tête d’authentification", + "Body format": "Format du corps", + "Created SIEM destination": "Destination SIEM créée", + "Datadog site": "Site Datadog", + "Defaults to this instance's hostname": "Utilise par défaut le nom d’hôte de cette instance", + "Delete destination": "Supprimer la destination", + "Deleted SIEM destination": "Destination SIEM supprimée", + "Destination created": "Destination créée", + "Destination deleted": "Destination supprimée", + "Destination updated": "Destination mise à jour", + "Disabled": "Désactivé", + "Edit destination": "Modifier la destination", + "Endpoint URL": "URL du point de terminaison", + "Failing": "En échec", + "Failing since {{time}}": "En échec depuis {{time}}", + "HEC token": "Jeton HEC", + "HEC URL": "URL HEC", + "Healthy": "Sain", + "Hide advanced options": "Masquer les options avancées", + "Host": "Hôte", + "Index": "Index", + "Insecure: connections can be intercepted.": "Non sécurisé : les connexions peuvent être interceptées.", + "JSON array": "Tableau JSON", + "Last delivered": "Dernière livraison", + "Last error": "Dernière erreur", + "Leave empty to use the token's default index": "Laissez vide pour utiliser l’index par défaut du jeton", + "Maximum of {{limit}} destinations reached": "Nombre maximal de destinations atteint : {{limit}}", + "Could not load SIEM destinations: {{message}}": "Impossible de charger les destinations SIEM : {{message}}", + "No destinations yet": "Aucune destination pour le moment", + "Preset": "Préréglage", + "Retry now": "Réessayer maintenant", + "Retry scheduled": "Nouvelle tentative planifiée", + "Send test event": "Envoyer un événement de test", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Envoyé dans l’en-tête d’authentification ci-dessous. Laissez vide si votre récepteur n’en a pas besoin.", + "Service": "Service", + "Show advanced options": "Afficher les options avancées", + "SIEM": "SIEM", + "SIEM streaming": "Streaming SIEM", + "SIEM streaming requires an Enterprise license.": "Le streaming SIEM nécessite une licence Enterprise.", + "Source": "Source", + "Sourcetype": "Type de source", + "Tags": "Tags", + "Test connection": "Tester la connexion", + "Test event delivered successfully.": "Événement de test envoyé avec succès.", + "Test the connection before saving.": "Testez la connexion avant d’enregistrer.", + "Test event delivered to {{name}}": "Événement de test envoyé à {{name}}", + "Updated SIEM destination": "Destination SIEM mise à jour", + "Verify TLS certificate": "Vérifier le certificat TLS", + "e.g. Splunk prod": "p. ex. Splunk prod" +} diff --git a/apps/client/public/locales/it-IT/translation.json b/apps/client/public/locales/it-IT/translation.json new file mode 100644 index 0000000..9476815 --- /dev/null +++ b/apps/client/public/locales/it-IT/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Account", + "Active": "Attivo", + "Add": "Aggiungi", + "Add group members": "Aggiungi membri al gruppo", + "Add groups": "Aggiungi gruppi", + "Add members": "Aggiungi membri", + "Add to groups": "Aggiungi ai gruppi", + "Add space members": "Aggiungi membri allo spazio", + "Add to favorites": "Aggiungi ai preferiti", + "Admin": "Amministratore", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Sei sicuro di voler eliminare questo gruppo? I membri perderanno l'accesso alle risorse accessibili da questo gruppo.", + "Are you sure you want to delete this page?": "Sei sicuro di voler eliminare questa pagina?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Sei sicuro di voler rimuovere questo utente dal gruppo? L'utente perderà l'accesso alle risorse accessibili da questo gruppo.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Sei sicuro di voler rimuovere questo utente dallo spazio? L'utente perderà tutti gli accessi a questo spazio.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Sei sicuro di voler ripristinare questa versione? Qualsiasi modifica non versionata verrà persa.", + "Can become members of groups and spaces in workspace": "Può diventare membro di gruppi e spazi nell'area di lavoro", + "Can create and edit pages in space.": "Può creare e modificare le pagine nello spazio.", + "Can edit": "Può modificare", + "Can manage workspace": "Può gestire l'area di lavoro", + "Can manage workspace but cannot delete it": "Può gestire lo spazio di lavoro ma non può eliminarlo", + "Can view": "Può visualizzare", + "Can view pages in space but not edit.": "Può visualizzare le pagine nello spazio ma non può modificarle.", + "Cancel": "Annulla", + "Change email": "Cambia email", + "Change password": "Cambia password", + "Change photo": "Cambia foto", + "Choose a role": "Scegli un ruolo", + "Choose your preferred color scheme.": "Scegli il tema che preferisci.", + "Choose your preferred interface language.": "Scegli la lingua da utilizzare per l'interfaccia.", + "Choose your preferred page width.": "Scegli la larghezza della pagina che preferisci.", + "Confirm": "Conferma", + "Copy as Markdown": "Copia come Markdown", + "Copy link": "Copia link", + "Create": "Crea", + "Create group": "Crea gruppo", + "Create page": "Crea pagina", + "Create space": "Crea spazio", + "Create workspace": "Crea area di lavoro", + "Current password": "Password attuale", + "Dark": "Scuro", + "Date": "Data", + "Delete": "Elimina", + "Remove from page": "Rimuovi dalla pagina", + "Base options": "Opzioni della base", + "Delete group": "Elimina gruppo", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Sei sicuro di voler eliminare questa pagina? Verranno cancellate anche le sue sottopagine e la cronologia. Questa azione è irreversibile.", + "Description": "Descrizione", + "Details": "Dettagli", + "e.g ACME": "es. ACME", + "e.g ACME Inc": "es. ACME Inc", + "e.g Developers": "es. Sviluppatori", + "e.g Group for developers": "es. Gruppo per sviluppatori", + "e.g product": "es. prodotto", + "e.g Product Team": "es. Team di prodotto", + "e.g Sales": "es. Vendite", + "e.g Space for product team": "es. Spazio per il team di prodotto", + "e.g Space for sales team to collaborate": "es. Spazio per la collaborazione del team vendite", + "Edit": "Modifica", + "Read": "Leggi", + "Edit group": "Modifica gruppo", + "Email": "Email", + "Enter a strong password": "Inserisci una password sicura", + "Enter valid email addresses separated by comma or space max_50": "Inserisci degli indirizzi email validi separati da virgola o spazio [max: 50]", + "enter valid emails addresses": "inserisci indirizzi email validi", + "Enter your current password": "Inserisci la tua password attuale", + "enter your full name": "inserisci il tuo nome completo", + "Enter your new password": "Inserisci la tua nuova password", + "Enter your new preferred email": "Inserisci la tua nuova email preferita", + "Enter your password": "Inserisci la tua password", + "Error fetching page data.": "Si è verificato un errore durante il recupero dei dati della pagina.", + "Error loading page history.": "Si è verificato un errore durante il caricamento della cronologia della pagina.", + "Export": "Esporta", + "Failed to create page": "Impossibile creare la pagina", + "Failed to delete page": "Impossibile eliminare la pagina", + "Failed to restore page": "Impossibile ripristinare la pagina", + "Failed to fetch recent pages": "Impossibile recuperare le pagine recenti", + "Failed to import pages": "Impossibile importare le pagine", + "Failed to load page. An error occurred.": "Il caricamento della pagina è fallito. Si è verificato un errore.", + "Failed to update data": "Impossibile aggiornare i dati", + "Failed to create base": "Impossibile creare la base", + "Failed to update base": "Impossibile aggiornare la base", + "Failed to delete base": "Impossibile eliminare la base", + "Failed to create property": "Impossibile creare la proprietà", + "Failed to update property": "Impossibile aggiornare la proprietà", + "Failed to delete property": "Impossibile eliminare la proprietà", + "Failed to reorder property": "Impossibile riordinare la proprietà", + "Failed to create view": "Impossibile creare la vista", + "Failed to update view": "Impossibile aggiornare la vista", + "Failed to delete view": "Impossibile eliminare la vista", + "Failed to create row": "Impossibile creare la riga", + "Failed to update row": "Impossibile aggiornare la riga", + "Failed to delete row": "Impossibile eliminare la riga", + "Failed to delete rows": "Impossibile eliminare le righe", + "Failed to reorder row": "Impossibile riordinare la riga", + "Failed to move card": "Impossibile spostare la scheda", + "Failed to add card": "Impossibile aggiungere la scheda", + "Failed to export CSV": "Impossibile esportare il CSV", + "Favorite spaces": "Spazi preferiti", + "Favorite spaces appear here": "Gli spazi preferiti appariranno qui", + "Favorites": "Preferiti", + "Full access": "Accesso completo", + "Full page width": "Pagina a larghezza intera", + "Full width": "Larghezza intera", + "General": "Generale", + "Group": "Gruppo", + "Group description": "Descrizione del gruppo", + "Group name": "Nome del gruppo", + "Groups": "Gruppi", + "Has full access to space settings and pages.": "Ha pieno accesso alle impostazioni dello spazio e alle sue pagine.", + "Home": "Casa", + "Import pages": "Importa pagine", + "Import pages & space settings": "Importa pagine e impostazioni dello spazio", + "Importing pages": "Importazione pagine", + "invalid invitation link": "link di invito non valido", + "Invitation signup": "Iscrizione invito", + "Invite by email": "Invita tramite email", + "Invite members": "Invita membri", + "Invite new members": "Invita nuovi membri", + "Invite People": "Invita persone", + "Invited members who are yet to accept their invitation will appear here.": "I membri invitati che non hanno ancora accettato il loro invito appariranno qui.", + "Invited members will be granted access to spaces the groups can access": "I membri invitati avranno accesso agli spazi a cui i gruppi possono accedere", + "Join the workspace": "Unisciti all'area di lavoro", + "Language": "Lingua", + "Light": "Chiaro", + "Link copied": "Link copiato", + "Login": "Login", + "Logout": "Esci", + "Manage Group": "Gestisci Gruppo", + "Manage members": "Gestisci membri", + "member": "membro", + "Member": "Membro", + "members": "membri", + "Members": "Membri", + "My preferences": "Le mie preferenze", + "My Profile": "Il Mio Profilo", + "My profile": "Il mio profilo", + "Name": "Nome", + "New email": "Nuova email", + "New page": "Nuova pagina", + "New password": "Nuova password", + "No group found": "Nessun gruppo trovato", + "No page history saved yet.": "La pagina non ha una cronologia per ora.", + "No pages yet": "Nessuna pagina per ora", + "No shared pages": "Nessuna pagina condivisa.", + "No results found...": "Nessun risultato trovato...", + "No user found": "Nessun utente trovato", + "Overview": "Panoramica", + "Owner": "Proprietario", + "page": "pagina", + "Page deleted successfully": "Pagina eliminata con successo", + "Page history": "Cronologia della pagina", + "Select version": "Seleziona versione", + "Highlight changes": "Evidenzia modifiche", + "Page import is in progress. Please do not close this tab.": "L'importazione della pagina è in corso. Si prega di non chiudere questa scheda.", + "Pages": "Pagine", + "pages": "pagine", + "Password": "Password", + "Password changed successfully": "Password cambiata con successo", + "People": "Persone", + "Pending": "In sospeso", + "Please confirm your action": "Si prega di confermare la propria azione", + "Preferences": "Preferenze", + "Print PDF": "Stampa PDF", + "Profile": "Profilo", + "Recently updated": "Aggiornato di recente", + "Remove": "Rimuovi", + "Remove from favorites": "Rimuovi dai preferiti", + "Remove group member": "Rimuovi membro dal gruppo", + "Remove space member": "Rimuovi membro dallo spazio", + "Restore": "Ripristina", + "Role": "Ruolo", + "Save": "Salva", + "Search": "Cerca", + "Search for groups": "Cerca un gruppo", + "Search for users": "Cerca un utente", + "Search for users and groups": "Cerca un utente o un gruppo", + "Search...": "Cerca...", + "Select language": "Seleziona lingua", + "Select role": "Seleziona ruolo", + "Select role to assign to all invited members": "Seleziona il ruolo da assegnare a tutti i membri invitati", + "Select theme": "Seleziona tema", + "Send invitation": "Invia invito", + "Invitation sent": "Invito inviato", + "Settings": "Impostazioni", + "Setup workspace": "Configura workspace", + "Sign In": "Accedi", + "Sign Up": "Registrati", + "Slug": "Slug", + "Space": "Spazio", + "Space description": "Descrizione dello spazio", + "Space menu": "Menu dello spazio", + "Space name": "Nome dello spazio", + "Space settings": "Impostazioni dello spazio", + "Space slug": "Slug dello spazio", + "Spaces": "Spazi", + "Spaces you belong to": "Spazi di cui fai parte", + "No space found": "Nessuno spazio trovato", + "Search for spaces": "Cerca spazi", + "Start typing to search...": "Inizia a digitare per cercare...", + "Status": "Stato", + "Successfully imported": "Importato con successo", + "Successfully restored": "Ripristinato con successo", + "System settings": "Impostazioni di sistema", + "Templates": "Modelli", + "Theme": "Tema", + "To change your email, you have to enter your password and new email.": "Per cambiare la tua email, devi inserire la tua password e la nuova email.", + "Toggle full page width": "Attiva/disattiva larghezza intera della pagina", + "Unable to import pages. Please try again.": "Impossibile importare le pagine. Riprova.", + "untitled": "senza titolo", + "Untitled": "Senza titolo", + "Updated successfully": "Aggiornato con successo", + "User": "Utente", + "Workspace": "Workspace", + "Workspace Name": "Nome del workspace", + "Workspace settings": "Impostazioni del workspace", + "You can change your password here.": "Qui puoi cambiare la tua password.", + "Your Email": "La tua email", + "Your import is complete.": "La tua importazione è completata.", + "Your name": "Il tuo nome", + "Your Name": "Il tuo nome", + "Your password": "La tua password", + "Your password must be a minimum of 8 characters.": "La tua password deve contenere almeno 8 caratteri.", + "Sidebar toggle": "Attiva/disattiva barra laterale", + "Comments": "Commenti", + "404 page not found": "404 pagina non trovata", + "Sorry, we can't find the page you are looking for.": "Siamo spiacenti, non riusciamo a trovare la pagina che stai cercando.", + "Take me back to homepage": "Torna alla homepage", + "Forgot password": "Password dimenticata", + "Forgot your password?": "Hai dimenticato la password?", + "A password reset link has been sent to your email. Please check your inbox.": "Un link per il reset della password è stato inviato al tuo indirizzo email. Per favore, controlla la tua casella di posta.", + "Send reset link": "Invia link per il ripristino della password", + "Password reset": "Reimposta password", + "Your new password": "La tua nuova password", + "Set password": "Imposta password", + "Write a comment": "Scrivi un commento", + "Reply...": "Rispondi...", + "Error loading comments.": "Si è verificato un errore durante il caricamento dei commenti.", + "No comments yet.": "Nessun commento per ora.", + "No open comments.": "Nessun commento aperto.", + "No resolved comments.": "Nessun commento risolto.", + "Add a comment...": "Aggiungi un commento...", + "Edit comment": "Modifica commento", + "Delete comment": "Elimina commento", + "Are you sure you want to delete this comment?": "Sei sicuro di voler eliminare questo commento?", + "Delete chat": "Elimina chat", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Sei sicuro di voler eliminare '{{title}}'? Questa azione non può essere annullata.", + "Comment created successfully": "Commento creato con successo", + "Error creating comment": "Si è verificato un errore durante la creazione del commento", + "Comment updated successfully": "Commento aggiornato con successo", + "Failed to update comment": "Impossibile aggiornare il commento", + "Comment deleted successfully": "Commento eliminato con successo", + "Failed to delete comment": "Impossibile eliminare il commento", + "Comment resolved successfully": "Commento risolto con successo", + "Comment re-opened successfully": "Commento riaperto con successo", + "Comment unresolved successfully": "Commento contrassegnato come non risolto con successo", + "Failed to resolve comment": "Impossibile risolvere il commento", + "Resolve comment": "Risolvi commento", + "Unresolve comment": "Segna commento come non risolto", + "Resolve Comment Thread": "Risolvi discussione del commento", + "Unresolve Comment Thread": "Segna discussione del commento come non risolta", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Sei sicuro di voler risolvere questa discussione di commenti? Questo la contrassegnerà come completata.", + "Are you sure you want to unresolve this comment thread?": "Sei sicuro di voler annullare la risoluzione di questa discussione di commenti?", + "Resolved": "Risolto", + "No active comments.": "Nessun commento attivo.", + "Revoke invitation": "Revoca invito", + "Revoke": "Revoca", + "Don't": "Non", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Sei sicuro di voler revocare questo invito? L'utente non potrà unirsi all'area di lavoro.", + "Resend invitation": "Rispedisci invito", + "Anyone with this link can join this workspace.": "Chiunque con questo link può unirsi a questa area di lavoro.", + "Invite link": "Link d'invito", + "Copy": "Copia", + "Copy to space": "Copia nello spazio", + "Copied": "Copiato", + "Duplicate": "Duplica", + "Select a user": "Seleziona un utente", + "Select a group": "Seleziona un gruppo", + "Export all pages and attachments in this space.": "Esporta tutte le pagine e gli allegati di questo spazio.", + "Delete space": "Elimina spazio", + "Are you sure you want to delete this space?": "Sei sicuro di voler eliminare questo spazio?", + "Delete this space with all its pages and data.": "Elimina questo spazio con tutte le sue pagine e i suoi dati.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Tutte le pagine, i commenti, gli allegati e i permessi di questo spazio verranno eliminati irreversibilmente.", + "Confirm space name": "Conferma nome dello spazio", + "Type the space name {{spaceName}} to confirm your action.": "Digita il nome dello spazio {{spaceName}} per confermare la tua azione.", + "Format": "Formato", + "Include subpages": "Includi sottopagine", + "Include attachments": "Includi allegati", + "Select export format": "Seleziona formato di esportazione", + "Export failed:": "Esportazione fallita:", + "export error": "errore di esportazione", + "Export page": "Esporta pagina", + "Export successful": "Esportazione riuscita", + "Export space": "Esporta spazio", + "Export {{type}}": "Esporta {{type}}", + "File exceeds the {{limit}} attachment limit": "Il file supera il limite per gli allegati di {{limit}}", + "Media": "Contenuti multimediali", + "Align left": "Allinea a sinistra", + "Align right": "Allinea a destra", + "Align center": "Allinea al centro", + "Alt text": "Testo alternativo", + "Describe this for accessibility.": "Descrivi questo contenuto per l'accessibilità.", + "Add a description": "Aggiungi una descrizione", + "Justify": "Giustifica", + "Merge cells": "Unisci celle", + "Split cell": "Dividi cella", + "Delete column": "Elimina colonna", + "Delete row": "Elimina riga", + "Add left column": "Aggiungi colonna a sinistra", + "Add right column": "Aggiungi colonna a destra", + "Add row above": "Aggiungi riga sopra", + "Add row below": "Aggiungi riga sotto", + "Delete table": "Elimina tabella", + "Add column left": "Aggiungi colonna a sinistra", + "Add column right": "Aggiungi colonna a destra", + "Clear cell": "Cancella cella", + "Clear cells": "Cancella celle", + "Toggle header cell": "Attiva/disattiva cella di intestazione", + "Toggle header column": "Attiva/disattiva colonna di intestazione", + "Toggle header row": "Attiva/disattiva riga di intestazione", + "Move column left": "Sposta colonna a sinistra", + "Move column right": "Sposta colonna a destra", + "Move row down": "Sposta riga in basso", + "Move row up": "Sposta riga in alto", + "Sort A → Z": "Ordina A → Z", + "Sort Z → A": "Ordina Z → A", + "Info": "Informazioni", + "Note": "Nota", + "Success": "Successo", + "Warning": "Avviso", + "Danger": "Pericolo", + "Mermaid diagram error:": "Errore nel diagramma di Mermaid:", + "Invalid Mermaid diagram": "Diagramma di Mermaid non valido", + "Double-click to edit Draw.io diagram": "Fai doppio clic per modificare il diagramma di Draw.io", + "Exit": "Esci", + "Save & Exit": "Salva ed esci", + "Double-click to edit Excalidraw diagram": "Fai doppio clic per modificare il diagramma di Excalidraw", + "Paste link": "Incolla link", + "Paste link or search pages": "Incolla il link o cerca le pagine", + "Link to web page": "Collega a una pagina web", + "Recents": "Recenti", + "Page or URL": "Pagina o URL", + "Link title": "Titolo del link", + "Edit link": "Modifica link", + "Remove link": "Rimuovi link", + "Add link": "Aggiungi link", + "Please enter a valid url": "Per favore inserisci un URL valido", + "Empty equation": "Equazione vuota", + "Invalid equation": "Equazione non valida", + "Color": "Colore", + "Text color": "Colore del testo", + "Default": "Predefinito", + "Blue": "Blu", + "Green": "Verde", + "Purple": "Viola", + "Red": "Rosso", + "Yellow": "Giallo", + "Orange": "Arancione", + "Pink": "Rosa", + "Gray": "Grigio", + "Embed link": "Incorpora collegamento", + "Invalid {{provider}} embed link": "Link incorporato {{provider}} non valido", + "Embed {{provider}}": "Incorpora {{provider}}", + "Enter {{provider}} link to embed": "Inserisci il link {{provider}} per incorporare", + "Bold": "Grassetto", + "Italic": "Corsivo", + "Underline": "Sottolineato", + "Strike": "Barrato", + "Code": "Codice", + "Comment": "Commento", + "Text": "Testo", + "Heading 1": "Intestazione 1", + "Heading 2": "Intestazione 2", + "Heading 3": "Intestazione 3", + "To-do List": "Lista delle cose da fare", + "Bullet List": "Elenco Puntato", + "Numbered List": "Elenco Numerato", + "Blockquote": "Citazione", + "Just start typing with plain text.": "Inizia a digitare con testo semplice.", + "Track tasks with a to-do list.": "Tieni traccia delle attività con una lista di cose da fare.", + "Big section heading.": "Intestazione di una grande sezione.", + "Medium section heading.": "Intestazione di sezione media.", + "Small section heading.": "Piccolo titolo di sezione.", + "Create a simple bullet list.": "Crea un semplice elenco puntato.", + "Create a list with numbering.": "Crea un elenco numerato.", + "Create block quote.": "Crea blocco citazione.", + "Insert code snippet.": "Inserisci frammento di codice.", + "Insert horizontal rule divider": "Inserisci divisore di regola orizzontale", + "Page break": "Interruzione di pagina", + "Insert a page break for printing.": "Inserisci un'interruzione di pagina per la stampa.", + "Footnote": "Nota a piè di pagina", + "Insert a footnote reference.": "Inserisci un riferimento a una nota a piè di pagina.", + "Upload any image from your device.": "Carica un'immagine dal tuo dispositivo.", + "Upload any video from your device.": "Carica qualsiasi video dal tuo dispositivo.", + "Upload any audio from your device.": "Carica qualsiasi audio dal tuo dispositivo.", + "Upload any file from your device.": "Carica qualsiasi file dal tuo dispositivo.", + "Uploading {{name}}": "Caricamento di {{name}}", + "Uploading file": "Caricamento file", + "Table": "Tabella", + "Insert a table.": "Inserisci una tabella.", + "Insert collapsible block.": "Inserisci blocco comprimibile.", + "Video": "Video", + "Divider": "Separatore", + "Quote": "Citazione", + "Image": "Immagine", + "Audio": "Audio", + "Embed PDF": "Incorpora PDF", + "Upload and embed a PDF file.": "Carica e incorpora un file PDF.", + "Embed as PDF": "Incorpora come PDF", + "Failed to load PDF": "Caricamento del PDF non riuscito", + "Convert to attachment": "Converti in allegato", + "File attachment": "Allegato file", + "Toggle block": "Blocco a comparsa", + "Callout": "Riquadro evidenziato", + "Insert callout notice.": "Inserisci avviso di richiamo.", + "Math inline": "Formula matematica in linea", + "Insert inline math equation.": "Inserisci equazione matematica in linea.", + "Math block": "Blocco matematico", + "Insert math equation": "Inserisci equazione matematica", + "Mermaid diagram": "Diagramma Mermaid", + "Insert mermaid diagram": "Inserisci diagramma Mermaid", + "Insert and design Drawio diagrams": "Inserisci e progetta diagrammi Drawio", + "Insert current date": "Inserisci data corrente", + "Time": "Ora", + "Insert current time": "Inserisci ora corrente", + "Draw and sketch excalidraw diagrams": "Disegna e abbozza diagrammi Excalidraw", + "Multiple": "Multiplo", + "Turn into": "Trasforma in", + "Text align": "Allinea testo", + "This page may have been deleted, moved, or you may not have access.": "Questa pagina potrebbe essere stata eliminata o spostata, oppure potresti non avere accesso.", + "Go to homepage": "Vai alla pagina principale", + "Pages you create will show up here.": "Le pagine che crei appariranno qui.", + "Heading {{level}}": "Intestazione {{level}}", + "Toggle title": "Attiva/disattiva titolo", + "Write anything. Enter \"/\" for commands": "Scrivi qualsiasi cosa. Digita \"/\" per i comandi", + "Write...": "Scrivi...", + "Column count": "Numero di colonne", + "{{count}} Columns": "{{count}} colonne", + "{{count}} command available_one": "1 comando disponibile", + "{{count}} command available_other": "{{count}} comandi disponibili", + "{{count}} result available_one": "1 risultato disponibile", + "{{count}} result available_other": "{{count}} risultati disponibili", + "Equal columns": "Colonne uguali", + "Left sidebar": "Barra laterale sinistra", + "Right sidebar": "Barra laterale destra", + "Wide center": "Centro ampio", + "Left wide": "Ampia a sinistra", + "Right wide": "Ampia a destra", + "Names do not match": "I nomi non corrispondono", + "Today, {{time}}": "Oggi, {{time}}", + "Yesterday, {{time}}": "Ieri, {{time}}", + "now": "ora", + "Space created successfully": "Spazio creato con successo", + "Space updated successfully": "Spazio aggiornato con successo", + "Space deleted successfully": "Spazio eliminato con successo", + "Members added successfully": "Membri aggiunti con successo", + "Member removed successfully": "Membro rimosso con successo", + "Member role updated successfully": "Ruolo del membro aggiornato con successo", + "Created by: {{creatorName}}": "Creato da: {{creatorName}}", + "Created at: {{time}}": "Creato il: {{time}}", + "Edited by {{name}} {{time}}": "Modificato da {{name}} {{time}}", + "Word count: {{wordCount}}": "Conteggio parole: {{wordCount}}", + "Character count: {{characterCount}}": "Conteggio caratteri: {{characterCount}}", + "New update": "Nuovo aggiornamento", + "{{latestVersion}} is available": "{{latestVersion}} è disponibile", + "Default page edit mode": "Modalità di modifica predefinita della pagina", + "Choose your preferred page edit mode. Avoid accidental edits.": "Scegli la tua modalità di modifica della pagina preferita. Evita modifiche accidentali.", + "Choose {{format}} file": "Scegli file {{format}}", + "Reading": "Lettura", + "Delete member": "Elimina membro", + "Member deleted successfully": "Membro eliminato con successo", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Sei sicuro di voler eliminare questo membro del workspace? Questa azione è irreversibile.", + "Deactivate member": "Disattiva membro", + "Activate member": "Attiva membro", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Sei sicuro di voler disattivare questo membro dello spazio di lavoro? Non potrà più accedere a questo spazio di lavoro.", + "Are you sure you want to activate this workspace member?": "Sei sicuro di voler attivare questo membro dello spazio di lavoro?", + "Deactivate": "Disattiva", + "Activate": "Attiva", + "Deactivated": "Disattivato", + "Move": "Sposta", + "Move page": "Sposta pagina", + "Move page to a different space.": "Sposta la pagina in un altro spazio.", + "Real-time editor connection lost. Retrying...": "Connessione all'editor in tempo reale persa. Riprovo...", + "Table of contents": "Indice", + "Add headings (H1, H2, H3) to generate a table of contents.": "Aggiungi intestazioni (H1, H2, H3) per generare un sommario.", + "Share": "Condividi", + "Public sharing": "Condivisione pubblica", + "Shared by": "Condiviso da", + "Shared at": "Condiviso il", + "Inherits public sharing from": "Eredita la condivisione pubblica da", + "Share to web": "Condividi sul web", + "Shared to web": "Condiviso sul web", + "Anyone with the link can view this page": "Chiunque abbia il link può visualizzare questa pagina", + "Make this page publicly accessible": "Rendi questa pagina accessibile pubblicamente", + "Include sub-pages": "Includi sottopagine", + "Make sub-pages public too": "Rendi pubbliche anche le sottopagine", + "Allow search engines to index page": "Consenti ai motori di ricerca di indicizzare la pagina", + "Open page": "Apri pagina", + "Page": "Pagina", + "Delete public share link": "Elimina link di condivisione pubblica", + "Delete share": "Elimina condivisione", + "Are you sure you want to delete this shared link?": "Sei sicuro di voler eliminare questo link condiviso?", + "Publicly shared pages from spaces you are a member of will appear here": "Le pagine condivise pubblicamente degli spazi di cui fai parte appariranno qui", + "Share deleted successfully": "Condivisione eliminata con successo", + "Share not found": "Condivisione non trovata", + "Failed to share page": "Condivisione della pagina non riuscita", + "Disable public sharing": "Disabilita la condivisione pubblica", + "Prevent members from sharing pages publicly.": "Impedisci ai membri di condividere pubblicamente le pagine.", + "Toggle public sharing": "Attiva/disattiva la condivisione pubblica", + "Toggle space public sharing": "Attiva/disattiva la condivisione pubblica nello spazio", + "Allow viewers to comment": "Consenti agli utenti di commentare", + "Allow viewers to add comments on pages in this space.": "Consenti agli utenti di aggiungere commenti alle pagine in questo spazio.", + "Toggle viewer comments": "Attiva/disattiva i commenti degli utenti", + "Public sharing is disabled at the workspace level": "La condivisione pubblica è disabilitata a livello di area di lavoro", + "Prevent pages in this space from being shared publicly.": "Impedisci che le pagine in questo spazio vengano condivise pubblicamente.", + "Page permissions": "Autorizzazioni della pagina.", + "Control who can view and edit individual pages. Available with an enterprise license.": "Controlla chi può visualizzare e modificare le singole pagine. Disponibile con una licenza Enterprise.", + "Enable public sharing": "Abilita la condivisione pubblica", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Sei sicuro di voler abilitare la condivisione pubblica? I membri potranno condividere le pagine pubblicamente.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Sei sicuro di voler disabilitare la condivisione pubblica? Tutti i link condivisi esistenti in questa area di lavoro verranno eliminati.", + "Are you sure you want to enable public sharing for this space?": "Sei sicuro di voler abilitare la condivisione pubblica per questo spazio?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Sei sicuro di voler disabilitare la condivisione pubblica? Tutti i link condivisi esistenti in questo spazio verranno eliminati.", + "Public sharing is disabled": "La condivisione pubblica è disabilitata", + "Public sharing has been disabled at the workspace level.": "La condivisione pubblica è stata disabilitata a livello di area di lavoro.", + "Public sharing has been disabled for this space.": "La condivisione pubblica è stata disabilitata per questo spazio.", + "Copy page": "Copia pagina", + "Copy page to a different space.": "Copia pagina in un altro spazio.", + "Page copied successfully": "Pagina copiata con successo", + "Page duplicated successfully": "Pagina duplicata con successo", + "Find": "Trova", + "Not found": "Non trovato", + "Previous Match (Shift+Enter)": "Corrispondenza precedente (Maiusc+Invio)", + "Next match (Enter)": "Corrispondenza successiva (Invio)", + "Match case (Alt+C)": "Distingui maiuscole/minuscole (Alt+C)", + "Replace": "Sostituisci", + "Close (Escape)": "Chiudi (Esc)", + "Replace (Enter)": "Sostituisci (Invio)", + "Replace all (Ctrl+Alt+Enter)": "Sostituisci tutto (Ctrl+Alt+Invio)", + "Replace all": "Sostituisci tutto", + "View all": "Visualizza tutto", + "View all spaces": "Visualizza tutti gli spazi", + "Error": "Errore", + "Failed to disable MFA": "Disattivazione MFA non riuscita", + "Disable two-factor authentication": "Disattiva autenticazione a due fattori", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Disabilitare l'autenticazione a due fattori renderà il tuo account meno sicuro. Avrai bisogno solo della tua password per accedere.", + "Please enter your password to disable two-factor authentication:": "Inserisci la tua password per disabilitare l'autenticazione a due fattori:", + "Two-factor authentication has been enabled": "L'autenticazione a due fattori è stata abilitata", + "Two-factor authentication has been disabled": "L'autenticazione a due fattori è stata disabilitata", + "2-step verification": "Verifica in 2 passaggi", + "Protect your account with an additional verification layer when signing in.": "Proteggi il tuo account con un ulteriore livello di verifica durante l'accesso.", + "Two-factor authentication is active on your account.": "L'autenticazione a due fattori è attiva sul tuo account.", + "Add 2FA method": "Aggiungi metodo 2FA", + "Backup codes": "Codici di backup", + "Disable": "Disattiva", + "Invalid verification code": "Codice di verifica non valido", + "New backup codes have been generated": "Sono stati generati nuovi codici di backup", + "Failed to regenerate backup codes": "Rigenerazione dei codici di backup non riuscita", + "About backup codes": "Informazioni sui codici di backup", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "I codici di backup possono essere utilizzati per accedere al tuo account se perdi l'accesso alla tua app di autenticazione. Ogni codice può essere usato solo una volta.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "Puoi rigenerare nuovi codici di backup in qualsiasi momento. Questo invaliderà tutti i codici esistenti.", + "Confirm password": "Conferma password", + "Generate new backup codes": "Genera nuovi codici di backup", + "Save your new backup codes": "Salva i tuoi nuovi codici di backup", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Assicurati di salvare questi codici in un luogo sicuro. I tuoi vecchi codici di backup non sono più validi.", + "Your new backup codes": "I tuoi nuovi codici di backup", + "I've saved my backup codes": "Ho salvato i miei codici di backup", + "Failed to setup MFA": "Configurazione MFA non riuscita", + "Setup & Verify": "Configura e verifica", + "Add to authenticator": "Aggiungi all'autenticatore", + "1. Scan this QR code with your authenticator app": "1. Scansiona questo codice QR con la tua app di autenticazione", + "Can't scan the code?": "Non riesci a scansionare il codice?", + "Enter this code manually in your authenticator app:": "Inserisci questo codice manualmente nella tua app di autenticazione:", + "2. Enter the 6-digit code from your authenticator": "2. Inserisci il codice a 6 cifre dal tuo autenticatore", + "Verify and enable": "Verifica e abilita", + "Failed to generate QR code. Please try again.": "Generazione del codice QR non riuscita. Si prega di riprovare.", + "Backup": "Backup", + "Save codes": "Salva codici", + "Save your backup codes": "Salva i tuoi codici di backup", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Questi codici possono essere utilizzati per accedere al tuo account se perdi l'accesso alla tua app di autenticazione. Ogni codice può essere usato solo una volta.", + "Print": "Stampa", + "Two-factor authentication has been set up. Please log in again.": "L'autenticazione a due fattori è stata impostata. Effettua nuovamente l'accesso, per favore.", + "Two-Factor authentication required": "Autenticazione a due fattori richiesta", + "Your workspace requires two-factor authentication for all users": "Il tuo workspace richiede l'autenticazione a due fattori per tutti gli utenti", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Per continuare ad accedere al tuo spazio di lavoro, devi impostare l'autenticazione a due fattori. Questo aggiunge un ulteriore livello di sicurezza al tuo account.", + "Set up two-factor authentication": "Configura l'autenticazione a due fattori", + "Cancel and logout": "Annulla e disconnettiti", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Il tuo spazio di lavoro richiede l'autenticazione a due fattori. Impostala per continuare.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Questo aggiunge un ulteriore livello di sicurezza al tuo account richiedendo un codice di verifica dalla tua app di autenticazione.", + "Password is required": "La password è obbligatoria", + "Password must be at least 8 characters": "La password deve contenere almeno 8 caratteri", + "Please enter a 6-digit code": "Inserisci un codice di 6 cifre", + "Code must be exactly 6 digits": "Il codice deve essere esattamente di 6 cifre", + "Enter the 6-digit code found in your authenticator app": "Inserisci il codice di 6 cifre presente nella tua app di autenticazione", + "Need help authenticating?": "Hai bisogno di aiuto per autenticarti?", + "MFA QR Code": "Codice QR MFA", + "Account created successfully. Please log in to set up two-factor authentication.": "Account creato con successo. Effettua l'accesso per impostare l'autenticazione a due fattori.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Reimpostazione della password riuscita. Accedi con la tua nuova password e completa l'autenticazione a due fattori.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Reimpostazione della password riuscita. Accedi con la tua nuova password per impostare l'autenticazione a due fattori.", + "Password reset was successful. Please log in with your new password.": "Reimpostazione della password riuscita. Accedi con la tua nuova password.", + "Two-factor authentication": "Autenticazione a due fattori", + "Use authenticator app instead": "Usa invece l'app di autenticazione", + "Verify backup code": "Verifica codice di backup", + "Use backup code": "Usa codice di backup", + "Enter one of your backup codes": "Inserisci uno dei tuoi codici di backup", + "Backup code": "Codice di backup", + "Enter one of your backup codes. Each backup code can only be used once.": "Inserisci uno dei tuoi codici di backup. Ogni codice di backup può essere utilizzato solo una volta.", + "Verify": "Verifica", + "Trash": "Cestino", + "Pages in trash will be permanently deleted after {{count}} days.": "Le pagine nel cestino verranno eliminate definitivamente dopo {{count}} giorni.", + "Deleted": "Eliminato", + "No pages in trash": "Nessuna pagina nel cestino", + "Permanently delete page?": "Eliminare definitivamente la pagina?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Sei sicuro di voler eliminare definitivamente '{{title}}'? Questa azione non può essere annullata.", + "Restore '{{title}}' and its sub-pages?": "Ripristinare '{{title}}' e le sue sottopagine?", + "Move to trash": "Sposta nel cestino", + "Move this page to trash?": "Spostare questa pagina nel cestino?", + "Restore page": "Ripristina pagina", + "Permanently delete": "Elimina definitivamente", + "{{name}} moved this page to Trash {{time}}.": "{{name}} ha spostato questa pagina nel Cestino {{time}}.", + "Page moved to trash": "Pagina spostata nel cestino", + "Page restored successfully": "Pagina ripristinata con successo", + "Deleted by": "Eliminato da", + "Deleted at": "Eliminato il", + "Preview": "Anteprima", + "Base preview unavailable": "Anteprima della base non disponibile", + "Restore this base to view its contents.": "Ripristina questa base per visualizzarne i contenuti.", + "Subpages": "Sottopagine", + "Failed to load subpages": "Caricamento delle sottopagine non riuscito", + "No subpages": "Nessuna sottopagina", + "Subpages (Child pages)": "Sottopagine (Pagine figlie)", + "List all subpages of the current page": "Elenca tutte le sottopagine della pagina corrente", + "Attachments": "Allegati", + "All spaces": "Tutti gli spazi", + "Unknown": "Sconosciuto", + "Find a space": "Trova uno spazio", + "Search in all your spaces": "Cerca in tutti i tuoi spazi", + "Type": "Tipo", + "Enterprise": "Enterprise", + "Download attachment": "Scarica allegato", + "Allowed email domains": "Domini email consentiti", + "Only users with email addresses from these domains can signup via SSO.": "Solo gli utenti con indirizzi email di questi domini possono registrarsi tramite SSO.", + "Enter valid domain names separated by comma or space": "Inserisci nomi di dominio validi separati da virgola o spazio", + "Enforce two-factor authentication": "Rendi obbligatoria l'autenticazione a due fattori", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Una volta impostata, tutti i membri devono abilitare l'autenticazione a due fattori per accedere all'area di lavoro.", + "Toggle MFA enforcement": "Attiva/disattiva obbligatorietà MFA", + "Display name": "Nome visualizzato", + "Allow signup": "Consenti registrazione", + "Enabled": "Abilitato", + "Advanced Settings": "Impostazioni avanzate", + "Enable TLS/SSL": "Abilita TLS/SSL", + "Use secure connection to LDAP server": "Usa una connessione sicura al server LDAP", + "Group sync": "Sincronizzazione gruppi", + "No SSO providers found.": "Nessun provider SSO trovato.", + "Delete SSO provider": "Elimina provider SSO", + "Are you sure you want to delete this SSO provider?": "Sei sicuro di voler eliminare questo provider SSO?", + "Action": "Azione", + "{{ssoProviderType}} configuration": "Configurazione {{ssoProviderType}}", + "Icon": "Icona", + "Upload image": "Carica immagine", + "Remove image": "Rimuovi immagine", + "Failed to remove image": "Rimozione immagine fallita", + "Image exceeds 10MB limit.": "L'immagine supera il limite di 10MB.", + "Image removed successfully": "Immagine rimossa con successo", + "API key": "Chiave API", + "API keys": "Chiavi API", + "API management": "Gestione API", + "Custom expiration date": "Data di scadenza personalizzata", + "Enter a descriptive token name": "Inserisci un nome descrittivo del token", + "Expiration": "Scadenza", + "Expired": "Scaduto", + "Expires": "Scade", + "Last use": "Ultimo utilizzo", + "No API keys found": "Nessuna chiave API trovata", + "No expiration": "Nessuna scadenza", + "Revoked successfully": "Revocata con successo", + "Select expiration date": "Seleziona la data di scadenza", + "This action cannot be undone. Any applications using this API key will stop working.": "Questa azione non può essere annullata. Qualsiasi applicazione che utilizza questa chiave API smetterà di funzionare.", + "Update": "Aggiorna", + "Update {{credential}}": "Aggiorna {{credential}}", + "Manage API keys for all users in the workspace": "Gestisci le chiavi API per tutti gli utenti nell'area di lavoro", + "Restrict API key creation to admins": "Limita la creazione delle chiavi API agli amministratori", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Solo gli amministratori e i proprietari possono creare nuove chiavi API. Le chiavi dei membri esistenti continueranno a funzionare.", + "Toggle restrict API keys to admins": "Attiva/disattiva la limitazione delle chiavi API agli amministratori", + "API key creation is restricted to admins by your workspace administrator.": "La creazione delle chiavi API è limitata agli amministratori dal tuo amministratore dello spazio di lavoro.", + "AI settings": "Impostazioni AI", + "AI search": "Ricerca AI", + "AI Answer": "Risposta AI", + "Ask AI": "Chiedi all'AI", + "AI is thinking...": "L'AI sta pensando...", + "Thinking": "Sto pensando", + "Ask a question...": "Fai una domanda...", + "AI Answers": "Risposte AI", + "AI-powered search (AI Answers)": "Ricerca con AI (Risposte AI)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "La ricerca AI utilizza embeddings vettoriali per fornire capacità di ricerca semantica nel contenuto della tua area di lavoro.", + "Toggle AI search": "Attiva/disattiva ricerca AI", + "Generative AI (Ask AI)": "AI generativa (Chiedi AI)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Abilita la generazione di contenuti con AI nell'editor. Consente agli utenti di generare, migliorare, tradurre e trasformare il testo.", + "Toggle generative AI": "Attiva/Disattiva AI generativa", + "Upgrade your plan": "Aggiorna il tuo piano", + "Available with a paid license": "Disponibile con una licenza a pagamento", + "Upgrade your license tier.": "Aggiorna il livello della tua licenza.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "L'IA è disponibile nelle edizioni a pagamento di Docmost. Contatta sales@docmost.com.", + "AI & MCP": "IA e MCP", + "AI": "IA", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Model Context Protocol (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Abilita il server MCP per consentire ad assistenti e strumenti IA di interagire con i contenuti del tuo spazio di lavoro.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP è disponibile solo nell'edizione Enterprise di Docmost. Contatta sales@docmost.com.", + "MCP Server URL": "URL del server MCP", + "Connect AI assistants with your Docmost account via OAuth.": "Connetti gli assistenti AI al tuo account Docmost tramite OAuth.", + "Enforce OAuth": "Rendi obbligatorio OAuth", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "Gli assistenti AI devono connettersi con un account Docmost tramite OAuth. Le chiavi API non possono essere utilizzate con il server MCP.", + "Toggle enforce OAuth for MCP": "Attiva/disattiva l'obbligo di OAuth per MCP", + "Supported tools": "Strumenti supportati", + "MCP server URL:": "URL del server MCP:", + "Learn more": "Scopri di più", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Gestisci le API key per tutti gli utenti nello spazio di lavoro. Consulta la documentazione API per i dettagli sull'utilizzo.", + "View the API documentation for usage details.": "Consulta la documentazione API per i dettagli sull'utilizzo.", + "View the MCP documentation.": "Consulta la documentazione MCP.", + "Sources": "Fonti", + "AI Answers not available for attachments": "Risposte AI non disponibili per gli allegati", + "No answer available": "Nessuna risposta disponibile", + "Background color": "Colore di sfondo", + "Highlight color": "Colore evidenziato", + "Remove color": "Rimuovi colore", + "Notifications": "Notifiche", + "No notifications": "Nessuna notifica", + "No unread notifications": "Nessuna notifica non letta", + "All notifications": "Tutte le notifiche", + "Unread only": "Solo non lette", + "Mark all as read": "Segna tutto come letto", + "Mark as read": "Segna come letto", + "More options": "Altre opzioni", + "{{name}} mentioned you in a comment": "{{name}} ti ha menzionato in un commento", + "{{name}} commented on a page": "{{name}} ha commentato una pagina", + "{{name}} resolved a comment": "{{name}} ha risolto un commento", + "{{name}} mentioned you on a page": "{{name}} ti ha menzionato in una pagina", + "{{name}} gave you edit access to a page": "{{name}} ti ha dato accesso in modifica a una pagina", + "{{name}} gave you view access to a page": "{{name}} ti ha dato accesso in visualizzazione a una pagina", + "{{name}} updated a page": "{{name}} ha aggiornato una pagina", + "Watch page": "Segui pagina", + "Stop watching": "Smetti di seguire", + "Watch space": "Segui spazio", + "Stop watching space": "Smetti di seguire lo spazio", + "Email notifications": "Notifiche email", + "Page updates": "Aggiornamenti pagina", + "Get notified when pages you watch are updated.": "Ricevi una notifica quando le pagine che segui vengono aggiornate.", + "Page mentions": "Menzioni nella pagina", + "Get notified when someone mentions you on a page.": "Ricevi una notifica quando qualcuno ti menziona su una pagina.", + "Comment mentions": "Menzioni nei commenti", + "Get notified when someone mentions you in a comment.": "Ricevi una notifica quando qualcuno ti menziona in un commento.", + "New comments": "Nuovi commenti", + "Get notified about new comments on threads you participate in.": "Ricevi una notifica sui nuovi commenti nelle discussioni a cui partecipi.", + "Resolved comments": "Commenti risolti", + "Get notified when your comment is resolved.": "Ricevi una notifica quando il tuo commento viene risolto.", + "You are now watching this page": "Ora stai seguendo questa pagina", + "You are no longer watching this page": "Non stai più seguendo questa pagina", + "You are now watching this space": "Ora stai seguendo questo spazio", + "You are no longer watching this space": "Non stai più seguendo questo spazio", + "Direct": "Diretto", + "Updates": "Aggiornamenti", + "Today": "Oggi", + "Yesterday": "Ieri", + "This week": "Questa settimana", + "Older": "Più vecchie", + "Restricted page": "Pagina con accesso ristretto", + "Restricted pages cannot be shared publicly.": "Le pagine con accesso ristretto non possono essere condivise pubblicamente.", + "Restricted by parent": "Limitata dalla pagina genitore", + "Restricted": "Limitata", + "Open": "Aperta", + "Inherits restrictions from ancestor page": "Eredita le restrizioni dalla pagina genitore", + "Only people listed below can access this page": "Solo le persone elencate di seguito possono accedere a questa pagina", + "Everyone in this space can access": "Chiunque in questo spazio può accedere", + "No additional restrictions on this page": "Nessuna restrizione aggiuntiva su questa pagina", + "Only specific people can access": "Solo persone specifiche possono accedere", + "Use only inherited restrictions": "Usa solo le restrizioni ereditate", + "Add restrictions on top of inherited": "Aggiungi restrizioni oltre a quelle ereditate", + "Inherited restriction": "Restrizione ereditata", + "Access limited by": "Accesso limitato da", + "Restrict access to control who can view and edit this page": "Limita l'accesso per controllare chi può visualizzare e modificare questa pagina", + "Add additional restrictions specific to this page": "Aggiungi restrizioni aggiuntive specifiche per questa pagina", + "Access": "Accesso", + "People with access": "Persone con accesso", + "Remove all": "Rimuovi tutto", + "Remove access": "Rimuovi accesso", + "Remove all access": "Rimuovi tutti gli accessi", + "Are you sure you want to remove this member's access to the page?": "Sei sicuro di voler rimuovere l'accesso di questo membro alla pagina?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Sei sicuro di voler rimuovere tutti gli accessi specifici? Questo renderà la pagina accessibile a tutti nello spazio.", + "Trash retention": "Conservazione del cestino", + "Pages in trash will be permanently deleted after this period.": "Le pagine nel cestino verranno eliminate definitivamente dopo questo periodo.", + "Trash retention updated": "Conservazione del cestino aggiornata", + "Failed to update trash retention": "Impossibile aggiornare la conservazione del cestino", + "Removed page restriction": "Restrizione della pagina rimossa", + "Added page permission": "Permesso sulla pagina aggiunto", + "Removed page permission": "Permesso sulla pagina rimosso", + "Changed page permission": "Autorizzazione pagina modificata", + "Requested password reset": "Richiesta reimpostazione password", + "Created template": "Modello creato", + "Deleted template": "Modello eliminato", + "day": "giorno", + "days": "giorni", + "week": "settimana", + "weeks": "settimane", + "month": "mese", + "months": "mesi", + "year": "anno", + "years": "anni", + "Period": "Periodo", + "Fixed date": "Data fissa", + "Indefinitely": "A tempo indeterminato", + "Days": "Giorni", + "Weeks": "Settimane", + "Months": "Mesi", + "Years": "Anni", + "Pick a date": "Scegli una data", + "Maximum is {{max}} {{unit}} for this unit": "Il massimo consentito è {{max}} {{unit}} per questa unità", + "Never expires. Verifiers can re-verify at any time.": "Non scade mai. I verificatori possono verificare nuovamente in qualsiasi momento.", + "Verified": "Verificato", + "Review needed": "Revisione necessaria", + "Verification expired": "Verifica scaduta", + "Draft": "Bozza", + "In Approval": "In approvazione", + "In approval": "In approvazione", + "Approved": "Approvato", + "Obsolete": "Obsoleto", + "Expiring": "In scadenza", + "Set up verification": "Configura la verifica", + "Verify page": "Verifica la pagina", + "Page verification": "Verifica della pagina", + "Add verification": "Aggiungi verifica", + "Edit verification": "Modifica verifica", + "Search by title": "Cerca per titolo", + "Choose how this page should stay accurate.": "Scegli come mantenere accurata questa pagina.", + "Recurring verification": "Verifica ricorrente", + "Verifiers re-confirm this page on a schedule.": "I verificatori riconfermano questa pagina secondo una pianificazione.", + "Re-verify on a schedule (e.g every 30 days )": "Verifica nuovamente secondo una pianificazione (ad es. ogni 30 giorni)", + "Page stays editable at all times": "La pagina resta sempre modificabile", + "Best for runbooks, FAQs, living documentation": "Ideale per runbook, FAQ e documentazione dinamica", + "Approval workflow": "Flusso di approvazione", + "Formal document lifecycle with named approvers.": "Ciclo di vita formale del documento con approvatori nominati.", + "Draft → In approval → Approved → Obsolete": "Bozza → In approvazione → Approvato → Obsoleto", + "Locked once approved, with full history": "Bloccato una volta approvato, con cronologia completa", + "Designed for ISO 9001, ISO 13485, and FDA": "Progettato per ISO 9001, ISO 13485 e FDA", + "Best for SOPs and controlled documents": "Ideale per SOP e documenti controllati", + "Back": "Indietro", + "Quality management": "Gestione della qualità", + "Recurring": "Ricorrente", + "Pages move through draft, approval, and approved stages.": "Le pagine passano attraverso le fasi di bozza, approvazione e approvato.", + "Verifiers": "Verificatori", + "Add verifier": "Aggiungi verificatore", + "I've reviewed this page for accuracy": "Ho controllato l'accuratezza di questa pagina", + "Set up": "Configura", + "Remove verification": "Rimuovi verifica", + "Are you sure you want to remove verification from this page?": "Sei sicuro di voler rimuovere la verifica da questa pagina?", + "Assigned verifiers must periodically re-verify this page.": "I verificatori assegnati devono verificare nuovamente questa pagina periodicamente.", + "Last verified by {{name}} {{time}} (expired)": "Ultima verifica effettuata da {{name}} {{time}} (scaduta)", + "The fixed expiration date has passed.": "La data di scadenza fissa è trascorsa.", + "Verified by {{name}} {{time}}": "Verificato da {{name}} {{time}}", + "Expires {{date}}": "Scade il {{date}}", + "Expired {{date}}": "Scaduto il {{date}}", + "Mark as obsolete": "Contrassegna come obsoleto", + "Mark obsolete": "Contrassegna come obsoleto", + "Returned by {{name}} {{time}}": "Restituito da {{name}} {{time}}", + "No approval has been requested yet.": "Non è stata ancora richiesta alcuna approvazione.", + "Submitted by {{name}} {{time}}": "Inviato da {{name}} {{time}}", + "Someone": "Qualcuno", + "Approved by {{name}} {{time}}": "Approvato da {{name}} {{time}}", + "This document has been marked as obsolete.": "Questo documento è stato contrassegnato come obsoleto.", + "Rejection comment": "Commento di rifiuto", + "Reason for returning this document...": "Motivo della restituzione di questo documento...", + "Confirm rejection": "Conferma rifiuto", + "Submit for approval": "Invia per approvazione", + "Reject": "Rifiuta", + "Approve": "Approva", + "Re-submit for approval": "Invia nuovamente per approvazione", + "Verified until": "Verificato fino al", + "QMS": "QMS", + "Verified pages": "Pagine verificate", + "Search pages...": "Cerca pagine...", + "Filter by space": "Filtra per spazio", + "Filter by type": "Filtra per tipo", + "{{name}} verified a page": "{{name}} ha verificato una pagina", + "{{name}} submitted a page for your approval": "{{name}} ha inviato una pagina per la tua approvazione", + "{{name}} returned a page for revision": "{{name}} ha restituito una pagina per la revisione", + "Page verification expires soon": "La verifica della pagina scadrà presto", + "Page verification has expired": "La verifica della pagina è scaduta", + "SIEM destination {{name}} is failing": "La destinazione SIEM {{name}} non funziona", + "SIEM destination {{name}} was disabled after 24 hours of failures": "La destinazione SIEM {{name}} è stata disattivata dopo 24 ore di errori", + "SIEM destination {{name}} recovered": "La destinazione SIEM {{name}} è stata ripristinata", + "Verifying your email": "Verifica della tua email in corso", + "Please wait...": "Attendere...", + "Verification failed. The link may have expired.": "Verifica non riuscita. Il link potrebbe essere scaduto.", + "Check your email": "Controlla la tua email", + "We sent a verification link to {{email}}.": "Abbiamo inviato un link di verifica a {{email}}.", + "We sent a verification link to your email.": "Abbiamo inviato un link di verifica alla tua email.", + "Click the link to verify your email and access your workspace.": "Clicca sul link per verificare la tua email e accedere al tuo workspace.", + "Resend verification email": "Invia nuovamente email di verifica", + "Verification email sent. Please check your inbox.": "Email di verifica inviata. Controlla la tua casella di posta.", + "Failed to resend verification email. Please try again.": "Invio dell'email di verifica non riuscito. Si prega di riprovare.", + "We've sent you an email with your associated workspaces.": "Ti abbiamo inviato un'email con i workspace associati.", + "Load more": "Carica altro", + "Log out of all devices": "Disconnetti da tutti i dispositivi", + "Log out of all sessions except this device": "Disconnetti da tutte le sessioni tranne questo dispositivo", + "This Device": "Questo dispositivo", + "Unknown device": "Dispositivo sconosciuto", + "No active sessions": "Nessuna sessione attiva", + "Session revoked": "Sessione revocata", + "All other sessions revoked": "Tutte le altre sessioni sono state revocate", + "Last used": "Ultimo utilizzo", + "Created": "Creato", + "Rename": "Rinomina", + "Publish": "Pubblica", + "Security": "Sicurezza", + "Enforce SSO": "Rendi obbligatorio SSO", + "Once enforced, members will not be able to login with email and password.": "Una volta reso obbligatorio, i membri non potranno accedere con email e password.", + "AI-generated content may not be accurate.": "I contenuti generati dall'IA potrebbero non essere accurati.", + "AI Chat": "Chat IA", + "Analyze for insights": "Analizza per ottenere approfondimenti", + "Ask anything...": "Chiedi qualsiasi cosa...", + "Assistant said:": "L'assistente ha detto:", + "Chat history": "Cronologia chat", + "Chat name": "Nome chat", + "Chat transcript": "Trascrizione della chat", + "Close": "Chiudi", + "Copy assistant response": "Copia risposta dell'assistente", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "Caricamento della chat non riuscito. Si è verificato un errore.", + "Failed to render this message.": "Impossibile visualizzare questo messaggio.", + "How can I help you today?": "Come posso aiutarti oggi?", + "New chat": "Nuova chat", + "No chat history": "Nessuna cronologia chat", + "No chats found": "Nessuna chat trovata", + "No conversations yet": "Nessuna conversazione al momento", + "Open full page": "Apri pagina completa", + "Scroll to bottom": "Scorri in basso", + "You said:": "Hai detto:", + "Previous 7 days": "Ultimi 7 giorni", + "Previous 30 days": "Ultimi 30 giorni", + "Search chats...": "Cerca nelle chat...", + "Search chats": "Cerca nelle chat", + "Ask anything... Use @ to mention pages": "Chiedi qualsiasi cosa... Usa @ per menzionare le pagine", + "Ask anything or search your workspace": "Chiedi qualsiasi cosa o cerca nel tuo spazio di lavoro", + "Welcome to {{name}}": "Benvenuto in {{name}}", + "Add files": "Aggiungi file", + "Mention a page": "Menziona una pagina", + "Start a new chat to see it here.": "Avvia una nuova chat per vederla qui.", + "Summarize this page": "Riassumi questa pagina", + "Toggle AI Chat": "Attiva/disattiva Chat IA", + "Translate this page": "Traduci questa pagina", + "Try a different search term.": "Prova un termine di ricerca diverso.", + "Try again": "Riprova", + "Untitled chat": "Chat senza titolo", + "What can I help you with?": "Con cosa posso aiutarti?", + "Are you sure you want to revoke this {{credential}}": "Sei sicuro di voler revocare questa {{credential}}", + "Automatically provision users and groups from your identity provider via SCIM.": "Esegui automaticamente il provisioning di utenti e gruppi dal tuo provider di identità tramite SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Configura il tuo provider di identità con questo URL per eseguire il provisioning di utenti e gruppi.", + "Create {{credential}}": "Crea {{credential}}", + "{{credential}} created": "{{credential}} creata", + "{{credential}} created successfully": "{{credential}} creata con successo", + "Created by": "Creata da", + "Custom": "Personalizzato", + "Enable SCIM": "Abilita SCIM", + "Enter a descriptive name": "Inserisci un nome descrittivo", + "I've saved my {{credential}}": "Ho salvato la mia {{credential}}", + "Important": "Importante", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Assicurati di copiare subito la tua {{credential}}. Non potrai più visualizzarla!", + "Never": "Mai", + "Revoke {{credential}}": "Revoca {{credential}}", + "SCIM endpoint URL": "URL dell'endpoint SCIM", + "SCIM provisioning": "Provisioning SCIM", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM ha la precedenza sulla sincronizzazione dei gruppi SSO quando è abilitato.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "Hai raggiunto il numero massimo di {{max}} token SCIM. Elimina un token esistente per crearne uno nuovo.", + "SCIM token": "Token SCIM", + "SCIM tokens": "Token SCIM", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Questa azione non può essere annullata. Il tuo provider di identità smetterà di sincronizzarsi immediatamente.", + "Toggle SCIM provisioning": "Attiva/disattiva il provisioning SCIM", + "Token": "Token", + "Page menu": "Menu della pagina", + "Expand": "Espandi", + "Collapse": "Comprimi", + "Comment menu": "Menu dei commenti", + "Group menu": "Menu del gruppo", + "Show hidden breadcrumbs": "Mostra breadcrumb nascosti", + "Breadcrumbs": "Breadcrumb", + "Page actions": "Azioni della pagina", + "Pick emoji": "Scegli emoji", + "Template menu": "Menu del modello", + "Use": "Usa", + "Use template": "Usa modello", + "Preview template: {{title}}": "Anteprima modello: {{title}}", + "Use a template": "Usa un modello", + "Search templates...": "Cerca modelli...", + "Search spaces...": "Cerca spazi...", + "No templates found": "Nessun modello trovato", + "No spaces found": "Nessuno spazio trovato", + "Browse all templates": "Sfoglia tutti i modelli", + "This space": "Questo spazio", + "All templates": "Tutti i modelli", + "Global": "Globale", + "New template": "Nuovo modello", + "Edit template": "Modifica modello", + "Are you sure you want to delete this template?": "Sei sicuro di voler eliminare questo modello?", + "Template scope updated": "Ambito del modello aggiornato", + "Choose which space this template belongs to": "Scegli a quale spazio appartiene questo modello", + "Only workspace admins can create global templates.": "Solo gli amministratori dell'area di lavoro possono creare modelli globali.", + "You need edit access to this space to create templates.": "Hai bisogno dell'accesso in modifica a questo spazio per creare modelli.", + "Scope": "Ambito", + "Select scope": "Seleziona ambito", + "Title": "Titolo", + "Saving...": "Salvataggio...", + "Saved": "Salvato", + "Save failed. Retry": "Salvataggio non riuscito. Riprova", + "By {{name}}": "Di {{name}}", + "Updated {{time}}": "Aggiornato {{time}}", + "Choose destination": "Scegli destinazione", + "Search pages and spaces...": "Cerca pagine e spazi...", + "No results found": "Nessun risultato trovato", + "You don't have permission to create pages here": "Non hai l'autorizzazione per creare pagine qui", + "Chat menu for {{title}}": "Menu chat per {{title}}", + "API key menu": "Menu della chiave API", + "Jump to comment selection": "Vai alla selezione dei commenti", + "Slash commands": "Comandi slash", + "Mention suggestions": "Suggerimenti di menzione", + "Link suggestions": "Suggerimenti di link", + "Diagram editor": "Editor di diagrammi", + "Add comment": "Aggiungi commento", + "Find and replace": "Trova e sostituisci", + "Main navigation": "Navigazione principale", + "Space navigation": "Navigazione dello spazio", + "Settings navigation": "Navigazione delle impostazioni", + "AI navigation": "Navigazione AI", + "Breadcrumb": "Percorso di navigazione", + "Synced block": "Blocco sincronizzato", + "Create a block that stays in sync across pages.": "Crea un blocco che rimanga sincronizzato tra le pagine.", + "Editing original": "Modifica originale", + "Copy synced block": "Copia blocco sincronizzato", + "Unsync": "Annulla sincronizzazione", + "Delete synced block": "Elimina blocco sincronizzato", + "Synced to {{count}} other page_one": "Sincronizzato con {{count}} altra pagina", + "Synced to {{count}} other page_other": "Sincronizzato con {{count}} altre pagine", + "ORIGINAL": "ORIGINALE", + "THIS PAGE": "QUESTA PAGINA", + "No pages": "Nessuna pagina", + "The original synced block no longer exists": "Il blocco sincronizzato originale non esiste più", + "You don't have access to this synced block": "Non hai accesso a questo blocco sincronizzato", + "Failed to load this synced block": "Impossibile caricare questo blocco sincronizzato", + "Fixed editor toolbar": "Barra degli strumenti dell'editor fissa", + "Show a formatting toolbar above the editor with quick access to common actions.": "Mostra una barra degli strumenti di formattazione sopra l'editor con accesso rapido alle azioni comuni.", + "Toggle fixed editor toolbar": "Attiva/disattiva barra degli strumenti dell'editor fissa", + "Normal text": "Testo normale", + "More inline formatting": "Altra formattazione in linea", + "Subscript": "Pedice", + "Superscript": "Apice", + "Inline code": "Codice in linea", + "Insert media": "Inserisci contenuti multimediali", + "Mention": "Menzione", + "Emoji": "Emoji", + "Columns": "Colonne", + "More inserts": "Altri inserimenti", + "Embeds": "Incorporamenti", + "Diagrams": "Diagrammi", + "Advanced": "Avanzate", + "Utility": "Utilità", + "Decrease indent": "Riduci rientro", + "Increase indent": "Aumenta rientro", + "Clear formatting": "Cancella formattazione", + "Code block": "Blocco di codice", + "Experimental": "Sperimentale", + "Strikethrough": "Barrato", + "Undo": "Annulla", + "Redo": "Ripeti", + "Backlinks": "Backlink", + "Last updated by": "Ultimo aggiornamento di", + "Last updated": "Ultimo aggiornamento", + "Stats": "Statistiche", + "Word count": "Conteggio parole", + "Characters": "Caratteri", + "Incoming links": "Link in entrata", + "Outgoing links": "Link in uscita", + "Incoming links ({{count}})": "Link in entrata ({{count}})", + "Outgoing links ({{count}})": "Link in uscita ({{count}})", + "No pages link here yet.": "Nessuna pagina rimanda ancora qui.", + "This page doesn't link to other pages yet.": "Questa pagina non rimanda ancora ad altre pagine.", + "Verified until {{date}}": "Verificato fino al {{date}}", + "Labels": "Etichette", + "Add label": "Aggiungi etichetta", + "No labels yet": "Nessuna etichetta per ora", + "Already added": "Già aggiunto", + "Invalid label name": "Nome etichetta non valido", + "No matches": "Nessuna corrispondenza", + "Search or create…": "Cerca o crea…", + "Remove label {{name}}": "Rimuovi etichetta {{name}}", + "Failed to add label": "Impossibile aggiungere l'etichetta", + "Failed to remove label": "Impossibile rimuovere l'etichetta", + "No pages with this label": "Nessuna pagina con questa etichetta", + "Pages tagged with this label will appear here.": "Le pagine contrassegnate con questa etichetta appariranno qui.", + "No pages match your search.": "Nessuna pagina corrisponde alla tua ricerca.", + "Updated {{date}}": "Aggiornato il {{date}}", + "Cell actions": "Azioni cella", + "Column actions": "Azioni colonna", + "Row actions": "Azioni riga", + "Filter": "Filtro", + "Page title": "Titolo pagina", + "Page content": "Contenuto della pagina", + "Member actions for {{name}}": "Azioni membro per {{name}}", + "Toggle password visibility": "Attiva/disattiva visibilità password", + "Send comment": "Invia commento", + "Token actions": "Azioni token", + "Template settings": "Impostazioni modello", + "Edit diagram": "Modifica diagramma", + "Edit embed": "Modifica incorporamento", + "Edit drawing": "Modifica disegno", + "Delete equation": "Elimina equazione", + "Invite actions": "Azioni invito", + "Get started": "Inizia", + "* indicates required fields": "* indica i campi obbligatori", + "List of spaces in this workspace": "Elenco degli spazi in questo spazio di lavoro", + "Active sessions": "Sessioni attive", + "Add {{name}} to favorites": "Aggiungi {{name}} ai preferiti", + "Remove {{name}} from favorites": "Rimuovi {{name}} dai preferiti", + "Added to favorites": "Aggiunto ai preferiti", + "Removed from favorites": "Rimosso dai preferiti", + "Added {{name}} to favorites": "{{name}} aggiunto ai preferiti", + "Removed {{name}} from favorites": "{{name}} rimosso dai preferiti", + "Page menu for {{name}}": "Menu della pagina per {{name}}", + "Create subpage of {{name}}": "Crea sottopagina di {{name}}", + "Allow personal spaces": "Consenti spazi personali", + "Members can create their own personal space.": "I membri possono creare il proprio spazio personale.", + "Toggle allow personal spaces": "Attiva/disattiva spazi personali", + "Create personal space": "Crea spazio personale", + "Personal space": "Spazio personale", + "{{name}}'s space": "Spazio di {{name}}", + "Apply": "Applica", + "Cells that aren't already a page reference will be cleared.": "Le celle che non sono già un riferimento a una pagina verranno svuotate.", + "Cells that aren't a valid URL will be cleared.": "Le celle che non contengono un URL valido verranno svuotate.", + "Cells that aren't a valid email address will be cleared.": "Le celle che non contengono un indirizzo email valido verranno svuotate.", + "Cells that can't be parsed as a date will be cleared.": "Le celle che non possono essere interpretate come una data verranno svuotate.", + "Cells that can't be parsed as a number will be cleared.": "Le celle che non possono essere interpretate come un numero verranno svuotate.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Le celle verranno convertite forzatamente (yes/true/1 diventeranno selezionate; tutto il resto diventerà non selezionato o verrà svuotato).", + "Cells will be reinterpreted under the new type.": "Le celle verranno reinterpretate con il nuovo tipo.", + "Cells will be replaced with a comma-separated list of file names.": "Le celle verranno sostituite con un elenco di nomi file separati da virgole.", + "Cells will be replaced with a comma-separated list of option names.": "Le celle verranno sostituite con un elenco di nomi di opzioni separati da virgole.", + "Cells will be replaced with the option name.": "Le celle verranno sostituite con il nome dell'opzione.", + "Cells will be replaced with the page title.": "Le celle verranno sostituite con il titolo della pagina.", + "Cells will be replaced with the person's name.": "Le celle verranno sostituite con il nome della persona.", + "Change type": "Cambia tipo", + "Change type to {{label}}?": "Cambiare tipo in {{label}}?", + "Converting…": "Conversione…", + "Existing values become single-item lists. No data is lost.": "I valori esistenti diventano elenchi con un solo elemento. Nessun dato andrà perso.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Verrà mantenuto solo il primo elemento selezionato per riga; gli altri verranno scartati.", + "Previous record": "Record precedente", + "Next record": "Record successivo", + "Record actions": "Azioni record", + "Delete record": "Elimina record", + "Delete record?": "Eliminare il record?", + "This action cannot be undone.": "Questa azione non può essere annullata.", + "to navigate": "per navigare", + "to close": "per chiudere", + "Expand row {{number}}": "Espandi riga {{number}}", + "Saving…": "Salvataggio…", + "Read-only": "Sola lettura", + "Loading…": "Caricamento…", + "Updated {{when}}": "Aggiornato {{when}}", + "Add property": "Aggiungi proprietà", + "Create property": "Crea proprietà", + "Hide properties": "Nascondi proprietà", + "Find a property type": "Trova un tipo di proprietà", + "Properties": "Proprietà", + "A property with this name already exists": "Esiste già una proprietà con questo nome", + "Add card": "Aggiungi scheda", + "Add filter": "Aggiungi filtro", + "Add option": "Aggiungi opzione", + "Add sort": "Aggiungi ordinamento", + "Add view": "Aggiungi vista", + "All data in this column will be lost.": "Tutti i dati in questa colonna andranno persi.", + "Allow multiple people": "Consenti più persone", + "Alphabetize": "Ordina alfabeticamente", + "Are you sure you want to delete": "Sei sicuro di voler eliminare", + "Ascending": "Crescente", + "Base deleted": "Base eliminata", + "Base name": "Nome della base", + "Base table": "Tabella della base", + "Card properties": "Proprietà della scheda", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Le celle più lunghe del limite del testo verranno troncate e il contenuto aggiuntivo andrà perso in modo permanente.", + "Checkbox": "Casella di controllo", + "Checked by default": "Selezionata per impostazione predefinita", + "Choose a property": "Scegli una proprietà", + "Clear selection": "Cancella selezione", + "Column options": "Opzioni della colonna", + "Comma, period": "Virgola, punto", + "Complete": "Completato", + "Contains": "Contiene", + "Copy link to view": "Copia link alla vista", + "Create a status property": "Crea una proprietà di stato", + "Created at": "Creato il", + "Currency": "Valuta", + "Decimal places": "Posizioni decimali", + "Default value": "Valore predefinito", + "Delete property": "Elimina proprietà", + "Delete view": "Elimina vista", + "Delete {{count}} rows?_one": "Eliminare 1 riga?", + "Delete {{count}} rows?_other": "Eliminare {{count}} righe?", + "Descending": "Decrescente", + "Discard": "Ignora", + "Doesn't contain": "Non contiene", + "Done": "Fatto", + "Edit formula": "Modifica formula", + "Edit property": "Modifica proprietà", + "Export CSV": "Esporta CSV", + "Failed to load base": "Impossibile caricare la base", + "False": "Falso", + "File": "File", + "Filter and sort changes are visible only to you": "Le modifiche a filtri e ordinamenti sono visibili solo a te", + "Filter by": "Filtra per", + "Formula": "Formula", + "Get started with": "Inizia con", + "Greater than": "Maggiore di", + "Group by": "Raggruppa per", + "Group this board by a select or status property.": "Raggruppa questa bacheca per una proprietà di selezione o di stato.", + "Hide all": "Nascondi tutto", + "Hide group": "Nascondi gruppo", + "In Progress": "In corso", + "In progress": "In corso", + "Include time": "Includi ora", + "Insert a kanban board on this page": "Inserisci una bacheca kanban in questa pagina", + "Insert an inline base on this page": "Inserisci una base in linea in questa pagina", + "Is": "È", + "Is after": "È dopo", + "Is any of": "È uno tra", + "Is before": "È prima", + "Is empty": "È vuoto", + "Is none of": "Non è nessuno di", + "Is not": "Non è", + "Is not empty": "Non è vuoto", + "Is on or after": "È il o dopo il", + "Is on or before": "È il o prima del", + "Is within": "È entro", + "Keep editing": "Continua a modificare", + "Last edited at": "Ultima modifica il", + "Last edited by": "Ultima modifica di", + "Less than": "Minore di", + "Link copied to clipboard": "Link copiato negli appunti", + "Local": "Locale", + "Long text": "Testo lungo", + "Moved card to {{column}}": "Scheda spostata in {{column}}", + "Moved column to {{column}}": "Colonna spostata in {{column}}", + "Multi-select": "Selezione multipla", + "New row": "Nuova riga", + "Next month": "Prossimo mese", + "Next week": "Prossima settimana", + "Next year": "Prossimo anno", + "No filters applied": "Nessun filtro applicato", + "No match": "Nessuna corrispondenza", + "No options for this property type": "Nessuna opzione per questo tipo di proprietà", + "No sorts applied": "Nessun ordinamento applicato", + "No value": "Nessun valore", + "None": "Nessuno", + "Not started": "Non iniziato", + "Number": "Numero", + "One month ago": "Un mese fa", + "One month from now": "Tra un mese", + "One week ago": "Una settimana fa", + "One week from now": "Tra una settimana", + "Open as page": "Apri come pagina", + "Options": "Opzioni", + "Past month": "Mese scorso", + "Past week": "Settimana scorsa", + "Past year": "Anno scorso", + "Percent": "Percentuale", + "Period, comma": "Punto, virgola", + "Person": "Persona", + "Please enter a valid email": "Inserisci un indirizzo email valido", + "Progress": "Avanzamento", + "Property options": "Opzioni della proprietà", + "Relative": "Relativo", + "Rename property": "Rinomina proprietà", + "Reset": "Reimposta", + "Save for everyone": "Salva per tutti", + "Select": "Seleziona", + "Select a property": "Seleziona una proprietà", + "Select all loaded rows": "Seleziona tutte le righe caricate", + "Show all": "Mostra tutto", + "Sort": "Ordina", + "Sort by": "Ordina per", + "Space, comma": "Spazio, virgola", + "Space, period": "Spazio, punto", + "This board has no grouping property yet.": "Questa bacheca non ha ancora una proprietà di raggruppamento.", + "This month": "Questo mese", + "This year": "Quest'anno", + "Thousands and decimal separators": "Separatori delle migliaia e dei decimali", + "Time format": "Formato ora", + "To Do": "Da fare", + "Tomorrow": "Domani", + "True": "Vero", + "Unsaved changes": "Modifiche non salvate", + "Untitled base": "Base senza titolo", + "URL": "URL", + "Value": "Valore", + "View updated for everyone": "Vista aggiornata per tutti", + "You have unsaved changes. Do you want to discard them?": "Hai modifiche non salvate. Vuoi ignorarle?", + "{{count}} rows deleted_one": "1 riga eliminata", + "{{count}} rows deleted_other": "{{count}} righe eliminate", + "{{count}} selected_one": "1 selezionato", + "{{count}} selected_other": "{{count}} selezionati", + "Compare": "Confronta", + "Compare versions": "Confronta versioni", + "Select version from {{date}}": "Seleziona la versione del {{date}}", + "Version actions for {{date}}": "Azioni della versione del {{date}}", + "Comparing {{newer}} and {{older}}": "Confronto tra {{newer}} e {{older}}", + "Exit compare": "Esci dal confronto", + "Search attachments...": "Cerca allegati...", + "Error loading attachments.": "Errore durante il caricamento degli allegati.", + "No attachments on this page yet.": "Ancora nessun allegato in questa pagina.", + "Uploaded by {{name}}": "Caricato da {{name}}", + "Download {{name}}": "Scarica {{name}}", + "Access revoked": "Accesso revocato", + "Authorize application": "Autorizza applicazione", + "{{name}} wants to access {{workspace}}": "{{name}} vuole accedere a {{workspace}}", + "Not you? Switch account": "Non sei tu? Cambia account", + "This application will be able to:": "Questa applicazione potrà:", + "Write": "Scrivere", + "Invalid authorization request": "Richiesta di autorizzazione non valida", + "Authorize": "Autorizza", + "Application": "Applicazione", + "Permissions": "Autorizzazioni", + "Authorized": "Autorizzato", + "Revoke access": "Revoca accesso", + "Revoke access for {{name}}": "Revoca l'accesso per {{name}}", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Sei sicuro di voler revocare l'accesso per {{name}}? L'applicazione non potrà più accedere al tuo account.", + "Something went wrong. Please try again.": "Qualcosa è andato storto. Riprova.", + "Remove {{name}}": "Rimuovi {{name}}", + "Make sure you trust this application before authorizing it.": "Assicurati di fidarti di questa applicazione prima di autorizzarla.", + "You will be redirected to": "Verrai reindirizzato a", + "View content without making changes.": "Visualizza il contenuto senza apportare modifiche.", + "Create and modify content.": "Crea e modifica contenuti.", + "Applications and AI assistants you have authorized to access your account.": "Applicazioni e assistenti AI che hai autorizzato ad accedere al tuo account.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "Il tuo workspace ha MCP abilitato. Connetti gli assistenti AI al tuo account Docmost tramite OAuth.", + "Authorized apps": "App autorizzate", + "No authorized apps yet.": "Ancora nessuna app autorizzata.", + "Workspace knowledge only": "Solo conoscenze del workspace", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Limita AI Chat a rispondere solo in base alle pagine del tuo workspace e ai file caricati. Non userà conoscenze esterne.", + "Toggle workspace knowledge only": "Attiva/disattiva solo conoscenze del workspace", + "Read-only mode": "Modalità di sola lettura", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI Chat può cercare e leggere i contenuti del workspace, ma non può creare o modificare pagine.", + "Toggle AI Chat read-only mode": "Attiva/disattiva la modalità di sola lettura di AI Chat", + "Title only": "Solo titolo", + "you": "tu", + "Allow public spaces": "Consenti spazi pubblici", + "Space admins can publish their spaces to the web.": "Gli amministratori degli spazi possono pubblicare i loro spazi sul web.", + "Toggle allow public spaces": "Attiva/disattiva spazi pubblici", + "Publish space to the web": "Pubblica spazio sul web", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Chiunque su internet potrà leggere ogni pagina in questo spazio, eccetto le pagine con restrizioni. Sei sicuro?", + "Make this space publicly readable by anyone on the internet.": "Rendi questo spazio leggibile pubblicamente da chiunque su internet.", + "Toggle publish space to the web": "Attiva/disattiva pubblicazione dello spazio sul web", + "Allow search engines to index": "Consenti ai motori di ricerca di indicizzare", + "Let public pages in this space appear in search engine results.": "Consenti alle pagine pubbliche in questo spazio di apparire nei risultati dei motori di ricerca.", + "Toggle search engine indexing": "Attiva/disattiva indicizzazione dei motori di ricerca", + "Public space link": "Link pubblico dello spazio", + "Copy public space link": "Copia link pubblico dello spazio", + "Renaming the space slug will break public links.": "La ridenominazione dello slug dello spazio interromperà i link pubblici.", + "Failed to update space": "Impossibile aggiornare lo spazio", + "This space is public": "Questo spazio è pubblico", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Chiunque su internet può leggere le pagine in questo spazio, eccetto le pagine con restrizioni.", + "Open public site": "Apri sito pubblico", + "Public": "Pubblico", + "This space has no public pages yet.": "Questo spazio non ha ancora pagine pubbliche.", + "On this page": "In questa pagina", + "Previous": "Precedente", + "Next": "Successivo", + "Show hidden pages": "Mostra pagine nascoste", + "Page navigation": "Navigazione pagina", + "Toggle sidebar": "Attiva/disattiva barra laterale", + "Toggle table of contents": "Attiva/disattiva sommario", + "Appearance": "Aspetto", + "Forest": "Foresta", + "Violet": "Viola", + "Light mode color": "Colore modalità chiara", + "Dark mode color": "Colore modalità scura", + "Choose the primary color of the public docs site.": "Scegli il colore principale del sito pubblico della documentazione.", + "Show page author": "Mostra autore della pagina", + "Display the page creator's name on public pages.": "Mostra il nome del creatore della pagina nelle pagine pubbliche.", + "Toggle show page author": "Attiva/disattiva mostra autore della pagina", + "Show last updated": "Mostra ultimo aggiornamento", + "Display when each page was last updated.": "Mostra quando ogni pagina è stata aggiornata l'ultima volta.", + "Toggle show last updated": "Attiva/disattiva mostra ultimo aggiornamento", + "Open public page": "Apri pagina pubblica", + "Toggle color scheme": "Attiva/disattiva schema colori", + "Ember": "Brace", + "Rose": "Rosa", + "Documentation": "Documentazione", + "All published spaces.": "Tutti gli spazi pubblicati.", + "No public spaces yet.": "Nessuno spazio pubblico al momento.", + "Show public directory": "Mostra directory pubblica", + "List published spaces at /docs for anyone to browse.": "Elenca gli spazi pubblicati in /docs affinché chiunque possa consultarli.", + "Toggle show public directory": "Attiva/disattiva mostra directory pubblica", + "Show in public directory": "Mostra nella directory pubblica", + "List this space in the public directory at /docs.": "Elenca questo spazio nella directory pubblica in /docs.", + "Toggle show in public directory": "Attiva/disattiva mostra nella directory pubblica", + "Open public space link": "Apri link pubblico dello spazio", + "Disable public spaces": "Disabilita spazi pubblici", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Gli amministratori degli spazi potranno rendere i loro spazi leggibili pubblicamente da chiunque su internet. Sei sicuro?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Questo annullerà immediatamente la pubblicazione di ogni spazio pubblicato. Riattivarlo in seguito non li ripubblicherà. Sei sicuro?", + "Allow": "Consenti", + "Shared pages": "Pagine condivise", + "Published spaces": "Spazi pubblicati", + "Spaces published to the web will appear here": "Gli spazi pubblicati sul web appariranno qui", + "No published spaces": "Nessuno spazio pubblicato", + "Published by": "Pubblicato da", + "Published at": "Pubblicato il", + "Open space": "Apri spazio", + "Unpublish": "Annulla pubblicazione", + "Unpublish space": "Annulla pubblicazione dello spazio", + "This space will no longer be publicly accessible. Are you sure?": "Questo spazio non sarà più accessibile pubblicamente. Sei sicuro?", + "More options for {{name}}": "Altre opzioni per {{name}}", + "Edit page": "Modifica pagina", + "Sign in": "Accedi", + "Open app": "Apri app", + "No spaces match your search.": "Nessuno spazio corrisponde alla tua ricerca.", + "Welcome to our documentation": "Benvenuto nella nostra documentazione", + "Guides, references and answers across all our published spaces.": "Guide, riferimenti e risposte in tutti i nostri spazi pubblicati.", + "Guides, references and answers across all our spaces.": "Guide, riferimenti e risposte in tutti i nostri spazi.", + "Search documentation...": "Cerca nella documentazione...", + "1 published space": "1 published space", + "{{count}} published spaces": "{{count}} published spaces", + "Actions": "Azioni", + "Add destination": "Aggiungi destinazione", + "Are you sure you want to delete the destination": "Sei sicuro di voler eliminare la destinazione", + "Audit logs": "Log di controllo", + "Audit logs & SIEM": "Log di controllo e SIEM", + "Auth header name": "Nome intestazione di autenticazione", + "Auth header prefix": "Prefisso intestazione di autenticazione", + "Body format": "Formato del corpo", + "Created SIEM destination": "Destinazione SIEM creata", + "Datadog site": "Sito Datadog", + "Defaults to this instance's hostname": "Per impostazione predefinita usa il nome host di questa istanza", + "Delete destination": "Elimina destinazione", + "Deleted SIEM destination": "Destinazione SIEM eliminata", + "Destination created": "Destinazione creata", + "Destination deleted": "Destinazione eliminata", + "Destination updated": "Destinazione aggiornata", + "Disabled": "Disattivata", + "Edit destination": "Modifica destinazione", + "Endpoint URL": "URL endpoint", + "Failing": "Non funzionante", + "Failing since {{time}}": "Non funzionante da {{time}}", + "HEC token": "Token HEC", + "HEC URL": "URL HEC", + "Healthy": "Funzionante", + "Hide advanced options": "Nascondi opzioni avanzate", + "Host": "Host", + "Index": "Indice", + "Insecure: connections can be intercepted.": "Non sicuro: le connessioni possono essere intercettate.", + "JSON array": "Array JSON", + "Last delivered": "Ultima consegna", + "Last error": "Ultimo errore", + "Leave empty to use the token's default index": "Lascia vuoto per usare l'indice predefinito del token", + "Maximum of {{limit}} destinations reached": "Raggiunto il numero massimo di {{limit}} destinazioni", + "Could not load SIEM destinations: {{message}}": "Impossibile caricare le destinazioni SIEM: {{message}}", + "No destinations yet": "Nessuna destinazione al momento", + "Preset": "Predefinito", + "Retry now": "Riprova ora", + "Retry scheduled": "Riprova pianificata", + "Send test event": "Invia evento di test", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Inviato nell'intestazione di autenticazione qui sotto. Lascia vuoto se il ricevente non ne ha bisogno.", + "Service": "Servizio", + "Show advanced options": "Mostra opzioni avanzate", + "SIEM": "SIEM", + "SIEM streaming": "Streaming SIEM", + "SIEM streaming requires an Enterprise license.": "Lo streaming SIEM richiede una licenza Enterprise.", + "Source": "Origine", + "Sourcetype": "Tipo di origine", + "Tags": "Tag", + "Test connection": "Testa connessione", + "Test event delivered successfully.": "Evento di test inviato con successo.", + "Test the connection before saving.": "Testa la connessione prima di salvare.", + "Test event delivered to {{name}}": "Evento di test inviato a {{name}}", + "Updated SIEM destination": "Destinazione SIEM aggiornata", + "Verify TLS certificate": "Verifica certificato TLS", + "e.g. Splunk prod": "ad es. Splunk produzione" +} diff --git a/apps/client/public/locales/ja-JP/translation.json b/apps/client/public/locales/ja-JP/translation.json new file mode 100644 index 0000000..d3c6735 --- /dev/null +++ b/apps/client/public/locales/ja-JP/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "アカウント", + "Active": "アクティブ", + "Add": "追加", + "Add group members": "グループメンバーを追加", + "Add groups": "グループを追加", + "Add members": "メンバーを追加", + "Add to groups": "グループに追加", + "Add space members": "スペースメンバーを追加", + "Add to favorites": "お気に入りに追加", + "Admin": "管理者", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "このグループを削除してもよろしいですか? メンバーはこのグループがアクセス権を持つリソースにアクセスできなくなります。", + "Are you sure you want to delete this page?": "このページを削除してもよろしいですか?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "このユーザをグループから削除してもよろしいですか? ユーザはこのグループがアクセス権を持つリソースにアクセスできなくなります。", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "このユーザをスペースから削除してもよろしいですか? ユーザはこのスペースへのアクセス権をすべて失います。", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "このバージョンを復元してもよろしいですか? バージョン管理されていない変更は失われます。", + "Can become members of groups and spaces in workspace": "ワークスペース内のグループやスペースのメンバーになれます", + "Can create and edit pages in space.": "スペース内のページを作成・編集できます", + "Can edit": "編集可能", + "Can manage workspace": "ワークスペースを管理できます", + "Can manage workspace but cannot delete it": "ワークスペースを管理できますが削除はできません", + "Can view": "閲覧可能", + "Can view pages in space but not edit.": "スペース内のページを閲覧できますが編集はできません", + "Cancel": "キャンセル", + "Change email": "メールアドレスの変更", + "Change password": "パスワードの変更", + "Change photo": "画像の変更", + "Choose a role": "ロールを選んでください", + "Choose your preferred color scheme.": "お好みのカラースキームを選択してください", + "Choose your preferred interface language.": "お好みの言語を選択してください", + "Choose your preferred page width.": "お好みのページ幅を選択してください", + "Confirm": "確認", + "Copy as Markdown": "Markdownとしてコピー", + "Copy link": "リンクをコピー", + "Create": "新規作成", + "Create group": "グループを作成", + "Create page": "新規ページ", + "Create space": "新規スペース", + "Create workspace": "ワークスペースを作成", + "Current password": "現在のパスワード", + "Dark": "ダーク", + "Date": "日付", + "Delete": "削除", + "Remove from page": "ページから削除", + "Base options": "ベースのオプション", + "Delete group": "グループを削除", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "このページを削除してもよろしいですか?子ページとページ履歴も削除されます。この操作は取り消せません。", + "Description": "説明", + "Details": "詳細", + "e.g ACME": "例: ACME", + "e.g ACME Inc": "例: ACME Inc", + "e.g Developers": "例: 開発者", + "e.g Group for developers": "例: 開発者向けグループ", + "e.g product": "例: product", + "e.g Product Team": "例: プロダクトチーム", + "e.g Sales": "例: 営業", + "e.g Space for product team": "例: プロダクトチーム用スペース", + "e.g Space for sales team to collaborate": "例: 営業チームがコラボレーションするためのスペース", + "Edit": "編集", + "Read": "閲覧", + "Edit group": "グループを編集", + "Email": "メールアドレス", + "Enter a strong password": "強力なパスワードを入力してください", + "Enter valid email addresses separated by comma or space max_50": "メールアドレスをカンマまたはスペース区切りで入力(最大50件)", + "enter valid emails addresses": "有効なメールアドレスを入力してください", + "Enter your current password": "現在のパスワードを入力してください", + "enter your full name": "氏名を入力してください", + "Enter your new password": "新しいパスワードを入力してください", + "Enter your new preferred email": "新しいメールアドレスを入力してください", + "Enter your password": "パスワードを入力してください", + "Error fetching page data.": "ページデータ取得中にエラーが発生しました。", + "Error loading page history.": "ページ履歴の読み込み中にエラーが発生しました。", + "Export": "エクスポート", + "Failed to create page": "ページの作成に失敗しました", + "Failed to delete page": "ページの削除に失敗しました", + "Failed to restore page": "ページの復元に失敗しました", + "Failed to fetch recent pages": "最近のページを取得できませんでした", + "Failed to import pages": "ページのインポートに失敗しました", + "Failed to load page. An error occurred.": "ページの読み込みに失敗しました。エラーが発生しました。", + "Failed to update data": "データの更新に失敗しました", + "Failed to create base": "ベースの作成に失敗しました", + "Failed to update base": "ベースの更新に失敗しました", + "Failed to delete base": "ベースの削除に失敗しました", + "Failed to create property": "プロパティの作成に失敗しました", + "Failed to update property": "プロパティの更新に失敗しました", + "Failed to delete property": "プロパティの削除に失敗しました", + "Failed to reorder property": "プロパティの並べ替えに失敗しました", + "Failed to create view": "ビューの作成に失敗しました", + "Failed to update view": "ビューの更新に失敗しました", + "Failed to delete view": "ビューの削除に失敗しました", + "Failed to create row": "行の作成に失敗しました", + "Failed to update row": "行の更新に失敗しました", + "Failed to delete row": "行の削除に失敗しました", + "Failed to delete rows": "行の削除に失敗しました", + "Failed to reorder row": "行の並べ替えに失敗しました", + "Failed to move card": "カードの移動に失敗しました", + "Failed to add card": "カードの追加に失敗しました", + "Failed to export CSV": "CSV のエクスポートに失敗しました", + "Favorite spaces": "お気に入りのスペース", + "Favorite spaces appear here": "お気に入りのスペースがここに表示されます", + "Favorites": "お気に入り", + "Full access": "フルアクセス", + "Full page width": "フルページ幅で表示", + "Full width": "左右の余白を縮小", + "General": "一般", + "Group": "グループ", + "Group description": "グループ説明", + "Group name": "グループ名", + "Groups": "グループ", + "Has full access to space settings and pages.": "スペース設定とページにフルアクセスできます", + "Home": "ホーム", + "Import pages": "ページをインポート", + "Import pages & space settings": "ページとスペース設定をインポート", + "Importing pages": "ページをインポートしています", + "invalid invitation link": "招待リンクが無効です", + "Invitation signup": "招待登録", + "Invite by email": "メールアドレスで招待する", + "Invite members": "メンバーを招待する", + "Invite new members": "新しいメンバーを招待する", + "Invite People": "ユーザーを招待", + "Invited members who are yet to accept their invitation will appear here.": "招待を承諾していないメンバーがここに表示されます", + "Invited members will be granted access to spaces the groups can access": "招待されたメンバーはグループがアクセスできるスペースにアクセスできます", + "Join the workspace": "ワークスペースに参加", + "Language": "言語", + "Light": "ライト", + "Link copied": "リンクをコピーしました", + "Login": "ログイン", + "Logout": "ログアウト", + "Manage Group": "グループを管理", + "Manage members": "メンバーを管理", + "member": "メンバー", + "Member": "メンバー", + "members": "メンバー", + "Members": "メンバー", + "My preferences": "個人設定", + "My Profile": "プロフィール", + "My profile": "プロフィール", + "Name": "名前", + "New email": "新しいメールアドレス", + "New page": "新規ページ", + "New password": "新しいパスワード", + "No group found": "グループが見つかりません", + "No page history saved yet.": "ページ履歴がありません", + "No pages yet": "ページがありません", + "No shared pages": "共有ページはありません。", + "No results found...": "結果が見つかりません", + "No user found": "ユーザーが見つかりません", + "Overview": "概要", + "Owner": "所有者", + "page": "ページ", + "Page deleted successfully": "ページを削除しました", + "Page history": "ページ履歴", + "Select version": "バージョンを選択", + "Highlight changes": "変更を強調表示", + "Page import is in progress. Please do not close this tab.": "ページをインポート中です。このタブを閉じないでください", + "Pages": "ページ", + "pages": "ページ", + "Password": "パスワード", + "Password changed successfully": "パスワードを変更しました", + "People": "メンバー", + "Pending": "保留中", + "Please confirm your action": "アクションを確認してください", + "Preferences": "設定", + "Print PDF": "PDFを印刷", + "Profile": "プロフィール", + "Recently updated": "最近の更新", + "Remove": "削除", + "Remove from favorites": "お気に入りから削除", + "Remove group member": "グループメンバーを削除", + "Remove space member": "スペースメンバーを削除", + "Restore": "復元", + "Role": "役割", + "Save": "保存", + "Search": "検索", + "Search for groups": "グループを検索", + "Search for users": "ユーザーを検索", + "Search for users and groups": "ユーザーとグループを検索", + "Search...": "検索", + "Select language": "言語を選択", + "Select role": "ロールを選択", + "Select role to assign to all invited members": "招待したすべてのメンバーに割り当てるロールを選択", + "Select theme": "テーマを選択", + "Send invitation": "招待を送信", + "Invitation sent": "招待を送信しました", + "Settings": "設定", + "Setup workspace": "ワークスペースを設定", + "Sign In": "サインイン", + "Sign Up": "サインアップ", + "Slug": "スラッグ", + "Space": "スペース", + "Space description": "スペースの説明", + "Space menu": "スペースメニュー", + "Space name": "スペース名", + "Space settings": "スペース設定", + "Space slug": "スペーススラッグ", + "Spaces": "スペース", + "Spaces you belong to": "所属しているスペース", + "No space found": "スペースが見つかりません", + "Search for spaces": "スペースを検索", + "Start typing to search...": "入力して検索", + "Status": "ステータス", + "Successfully imported": "正常にインポートされました", + "Successfully restored": "正常に復元されました", + "System settings": "システム設定", + "Templates": "テンプレート", + "Theme": "テーマ", + "To change your email, you have to enter your password and new email.": "メールアドレスを変更するには、パスワードと新しいメールアドレスを入力してください", + "Toggle full page width": "ページ全幅表示を切り替え", + "Unable to import pages. Please try again.": "ページをインポートできませんでした。もう一度お試しください", + "untitled": "無題", + "Untitled": "無題", + "Updated successfully": "正常に更新されました", + "User": "ユーザー", + "Workspace": "ワークスペース", + "Workspace Name": "ワークスペース名", + "Workspace settings": "ワークスペース設定", + "You can change your password here.": "パスワードを変更できます", + "Your Email": "メールアドレス", + "Your import is complete.": "インポートが完了しました", + "Your name": "あなたの名前", + "Your Name": "あなたの名前", + "Your password": "パスワード", + "Your password must be a minimum of 8 characters.": "パスワードは8文字以上にしてください", + "Sidebar toggle": "サイドバー切り替え", + "Comments": "コメント", + "404 page not found": "404 ページが見つかりません", + "Sorry, we can't find the page you are looking for.": "お探しのページが見つかりません", + "Take me back to homepage": "ホームページに戻る", + "Forgot password": "パスワードを忘れた場合", + "Forgot your password?": "パスワードを忘れましたか?", + "A password reset link has been sent to your email. Please check your inbox.": "パスワードリセット用のリンクをメールに送信しました。受信トレイを確認してください", + "Send reset link": "リセットリンクを送信", + "Password reset": "パスワードリセット", + "Your new password": "新しいパスワード", + "Set password": "パスワードを設定", + "Write a comment": "コメントを書く", + "Reply...": "返信...", + "Error loading comments.": "コメントの読み込みに失敗しました", + "No comments yet.": "コメントがありません", + "No open comments.": "未解決のコメントはありません。", + "No resolved comments.": "解決済みのコメントはありません", + "Add a comment...": "コメントを追加...", + "Edit comment": "コメントを編集する", + "Delete comment": "コメントを削除する", + "Are you sure you want to delete this comment?": "このコメントを削除してもよろしいですか?", + "Delete chat": "チャットを削除", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "「{{title}}」を削除してもよろしいですか?この操作は元に戻せません。", + "Comment created successfully": "コメントを作成しました", + "Error creating comment": "コメントの作成に失敗しました", + "Comment updated successfully": "コメントを更新しました", + "Failed to update comment": "コメントの更新に失敗しました", + "Comment deleted successfully": "コメントを削除しました", + "Failed to delete comment": "コメントの削除に失敗しました", + "Comment resolved successfully": "コメントを解決しました", + "Comment re-opened successfully": "コメントを正常に再オープンしました", + "Comment unresolved successfully": "コメントの解決を正常に取り消しました", + "Failed to resolve comment": "コメントの解決に失敗しました", + "Resolve comment": "コメントを解決", + "Unresolve comment": "コメントの解決を取り消す", + "Resolve Comment Thread": "コメントスレッドを解決", + "Unresolve Comment Thread": "コメントスレッドの解決を取り消す", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "このコメントスレッドを解決しますか?完了としてマークされます", + "Are you sure you want to unresolve this comment thread?": "このコメントスレッドを未解決に戻しますか?", + "Resolved": "解決済み", + "No active comments.": "アクティブなコメントはありません", + "Revoke invitation": "招待を取り消す", + "Revoke": "取り消す", + "Don't": "取り消さない", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "この招待を取り消してもよろしいですか?ユーザーはワークスペースに参加できなくなります", + "Resend invitation": "招待を再度送る", + "Anyone with this link can join this workspace.": "このリンクを知っている人は誰でもワークスペースに参加できます", + "Invite link": "招待リンク", + "Copy": "コピー", + "Copy to space": "スペースにコピー", + "Copied": "コピーしました", + "Duplicate": "複製", + "Select a user": "ユーザを選択", + "Select a group": "グループを選択", + "Export all pages and attachments in this space.": "このスペースのすべてのページと添付ファイルをエクスポートします", + "Delete space": "スペースを削除", + "Are you sure you want to delete this space?": "このスペースを削除してもよろしいですか?", + "Delete this space with all its pages and data.": "このスペースとすべてのページ、データを削除します", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "スペース内のすべてのページ、コメント、添付ファイル、権限が完全に削除されます", + "Confirm space name": "スペース名を確認", + "Type the space name {{spaceName}} to confirm your action.": "確認のためスペース名 {{spaceName}} を入力してください", + "Format": "フォーマット", + "Include subpages": "サブページを含める", + "Include attachments": "添付ファイルを含める", + "Select export format": "エクスポート形式を選択", + "Export failed:": "エクスポートに失敗しました:", + "export error": "エクスポートエラー", + "Export page": "エクスポートページ", + "Export successful": "エクスポート成功", + "Export space": "エクスポートスペース", + "Export {{type}}": "{{type}}をエクスポート", + "File exceeds the {{limit}} attachment limit": "ファイルが{{limit}}の添付制限を超えています", + "Media": "メディア", + "Align left": "左揃え", + "Align right": "右揃え", + "Align center": "中央揃え", + "Alt text": "代替テキスト", + "Describe this for accessibility.": "アクセシビリティのために説明を追加してください。", + "Add a description": "説明を追加", + "Justify": "両端揃え", + "Merge cells": "セルを結合", + "Split cell": "セルを分割", + "Delete column": "列を削除", + "Delete row": "行を削除", + "Add left column": "左側に列を追加", + "Add right column": "右側の列を追加", + "Add row above": "上に行を追加", + "Add row below": "下に行を追加", + "Delete table": "テーブルを削除", + "Add column left": "左に列を追加", + "Add column right": "右に列を追加", + "Clear cell": "セルをクリア", + "Clear cells": "セルをクリア", + "Toggle header cell": "ヘッダーセルを切り替え", + "Toggle header column": "ヘッダー列を切り替え", + "Toggle header row": "ヘッダー行を切り替え", + "Move column left": "列を左に移動", + "Move column right": "列を右に移動", + "Move row down": "行を下に移動", + "Move row up": "行を上に移動", + "Sort A → Z": "A → Z で並べ替え", + "Sort Z → A": "Z → A で並べ替え", + "Info": "情報", + "Note": "ノート", + "Success": "成功", + "Warning": "警告", + "Danger": "危険", + "Mermaid diagram error:": "Mermaid ダイアグラムエラー:", + "Invalid Mermaid diagram": "無効な Mermaid ダイアグラムです", + "Double-click to edit Draw.io diagram": "ダブルクリックして Draw.io 図を編集", + "Exit": "終了", + "Save & Exit": "保存して終了", + "Double-click to edit Excalidraw diagram": "ダブルクリックして Excalidraw 図を編集", + "Paste link": "リンクを貼り付け", + "Paste link or search pages": "リンクを貼り付けるかページを検索してください。 ", + "Link to web page": "ウェブページへのリンク", + "Recents": "最近使用したもの", + "Page or URL": "ページまたはURL", + "Link title": "リンクタイトル", + "Edit link": "リンクを編集", + "Remove link": "リンクを削除", + "Add link": "リンクを追加", + "Please enter a valid url": "有効なURLを入力してください", + "Empty equation": "空の数式です", + "Invalid equation": "不正な数式です", + "Color": "カラー", + "Text color": "テキストカラー", + "Default": "デフォルト", + "Blue": "青色", + "Green": "緑色", + "Purple": "紫色", + "Red": "赤色", + "Yellow": "黄色", + "Orange": "オレンジ色", + "Pink": "ピンク色", + "Gray": "灰色", + "Embed link": "リンクを埋め込む", + "Invalid {{provider}} embed link": "{{provider}} の埋め込みリンクが無効です", + "Embed {{provider}}": "埋め込まれた {{provider}}", + "Enter {{provider}} link to embed": "埋め込みたい {{provider}} のリンクを入力してください", + "Bold": "太字", + "Italic": "斜線", + "Underline": "下線", + "Strike": "打ち消し線", + "Code": "コードブロック", + "Comment": "コメント", + "Text": "テキスト", + "Heading 1": "見出し 1", + "Heading 2": "見出し 2", + "Heading 3": "見出し 3", + "To-do List": "To-doリスト", + "Bullet List": "箇条書きリスト", + "Numbered List": "番号付きリスト", + "Blockquote": "引用", + "Just start typing with plain text.": "プレーンテキストを入力します", + "Track tasks with a to-do list.": "Todo リストでタスクを管理します", + "Big section heading.": "大見出し", + "Medium section heading.": "中見出し", + "Small section heading.": "小見出し", + "Create a simple bullet list.": "箇条書きリストを作成します", + "Create a list with numbering.": "番号付きリストを作成します", + "Create block quote.": "引用ブロックを作成します", + "Insert code snippet.": "コードスニペットを挿入します", + "Insert horizontal rule divider": "区切り線を挿入します", + "Page break": "改ページ", + "Insert a page break for printing.": "印刷用に改ページを挿入します。", + "Footnote": "脚注", + "Insert a footnote reference.": "脚注参照を挿入します。", + "Upload any image from your device.": "デバイスから画像をアップロードします", + "Upload any video from your device.": "デバイスから動画をアップロードします", + "Upload any audio from your device.": "デバイスから音声ファイルをアップロードします。", + "Upload any file from your device.": "デバイスからファイルをアップロードします", + "Uploading {{name}}": "{{name}} をアップロード中", + "Uploading file": "ファイルをアップロード中", + "Table": "表", + "Insert a table.": "テーブルを挿入します", + "Insert collapsible block.": "折りたたみブロックを挿入します", + "Video": "動画", + "Divider": "区切り線", + "Quote": "引用", + "Image": "画像", + "Audio": "音声", + "Embed PDF": "PDFを埋め込む", + "Upload and embed a PDF file.": "PDFファイルをアップロードして埋め込みます。", + "Embed as PDF": "PDFとして埋め込む", + "Failed to load PDF": "PDFの読み込みに失敗しました", + "Convert to attachment": "添付ファイルに変換", + "File attachment": "ファイル添付", + "Toggle block": "トグルブロック", + "Callout": "コールアウト", + "Insert callout notice.": "コールアウトを挿入します", + "Math inline": "インライン数式", + "Insert inline math equation.": "インライン数式を挿入します", + "Math block": "数式ブロック", + "Insert math equation": "数式を挿入", + "Mermaid diagram": "Mermaid ダイアグラム", + "Insert mermaid diagram": "Mermaid ダイアグラムを挿入", + "Insert and design Drawio diagrams": "Drawio ダイアグラムを挿入して作成", + "Insert current date": "現在の日付を挿入", + "Time": "時刻", + "Insert current time": "現在の時刻を挿入", + "Draw and sketch excalidraw diagrams": "Excalidraw ダイアグラムを描画・スケッチ", + "Multiple": "複数", + "Turn into": "変換する", + "Text align": "テキストの配置", + "This page may have been deleted, moved, or you may not have access.": "このページは削除されたか移動されたか、またはアクセス権がない可能性があります。},{", + "Go to homepage": "ホームページへ移動", + "Pages you create will show up here.": "ここに作成したページが表示されます。", + "Heading {{level}}": "見出し {{level}}", + "Toggle title": "トグルタイトル", + "Write anything. Enter \"/\" for commands": "何でも入力してください。コマンドを使うには「/」を入力", + "Write...": "ここに入力...", + "Column count": "列数", + "{{count}} Columns": "{{count}}列", + "{{count}} command available_one": "利用可能なコマンドが1件あります", + "{{count}} command available_other": "利用可能なコマンドが{{count}}件あります", + "{{count}} result available_one": "結果が1件あります", + "{{count}} result available_other": "結果が{{count}}件あります", + "Equal columns": "均等な列", + "Left sidebar": "左サイドバー", + "Right sidebar": "右サイドバー", + "Wide center": "中央ワイド", + "Left wide": "左ワイド", + "Right wide": "右ワイド", + "Names do not match": "名前が一致しません", + "Today, {{time}}": "今日 {{time}}", + "Yesterday, {{time}}": "昨日 {{time}}", + "now": "今すぐ", + "Space created successfully": "スペースが正常に作成されました", + "Space updated successfully": "スペースが正常に更新されました", + "Space deleted successfully": "スペースが正常に削除されました", + "Members added successfully": "メンバーが正常に追加されました", + "Member removed successfully": "メンバーが正常に削除されました", + "Member role updated successfully": "メンバーのロールが正常に更新されました", + "Created by: {{creatorName}}": "作成者: {{creatorName}}", + "Created at: {{time}}": "作成日時: {{time}}", + "Edited by {{name}} {{time}}": "{{name}} が {{time}} に編集", + "Word count: {{wordCount}}": "単語数: {{wordCount}}", + "Character count: {{characterCount}}": "文字数: {{characterCount}}", + "New update": "新しいアップデート", + "{{latestVersion}} is available": "{{latestVersion}} が利用可能です", + "Default page edit mode": "デフォルトのページ編集モード", + "Choose your preferred page edit mode. Avoid accidental edits.": "お好みのページ編集モードを選択してください(誤編集を防止します)", + "Choose {{format}} file": "{{format}} ファイルを選択", + "Reading": "閲覧", + "Delete member": "メンバーを削除", + "Member deleted successfully": "メンバーが正常に削除されました", + "Are you sure you want to delete this workspace member? This action is irreversible.": "このメンバーを削除してもよろしいですか?この操作は取り消せません", + "Deactivate member": "メンバーを無効化", + "Activate member": "メンバーを有効化", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "本当にこのワークスペースのメンバーを無効化しますか?無効化すると、このワークスペースにアクセスできなくなります。", + "Are you sure you want to activate this workspace member?": "本当にこのワークスペースのメンバーを有効化しますか?", + "Deactivate": "無効化", + "Activate": "有効化", + "Deactivated": "無効化済み", + "Move": "移動", + "Move page": "ページを移動", + "Move page to a different space.": "ページを別のスペースに移動します", + "Real-time editor connection lost. Retrying...": "リアルタイム編集の接続が切断されました。再接続中...", + "Table of contents": "目次", + "Add headings (H1, H2, H3) to generate a table of contents.": "見出し(H1、H2、H3)を追加すると目次が生成されます", + "Share": "共有", + "Public sharing": "公開共有", + "Shared by": "共有者", + "Shared at": "共有日時", + "Inherits public sharing from": "公開共有を次から継承", + "Share to web": "Web に公開", + "Shared to web": "Web に公開済み", + "Anyone with the link can view this page": "リンクを知っている人は誰でもこのページを閲覧できます", + "Make this page publicly accessible": "このページを公開アクセス可能にする", + "Include sub-pages": "サブページを含める", + "Make sub-pages public too": "サブページも公開する", + "Allow search engines to index page": "検索エンジンによるページのインデックスを許可", + "Open page": "ページを開く", + "Page": "ページ", + "Delete public share link": "公開共有リンクを削除", + "Delete share": "共有を削除", + "Are you sure you want to delete this shared link?": "この共有リンクを削除してもよろしいですか?", + "Publicly shared pages from spaces you are a member of will appear here": "あなたがメンバーであるスペースの公開共有ページがここに表示されます", + "Share deleted successfully": "共有が正常に削除されました", + "Share not found": "共有が見つかりません", + "Failed to share page": "ページの共有に失敗しました", + "Disable public sharing": "公開共有を無効にする", + "Prevent members from sharing pages publicly.": "メンバーがページを公開で共有するのを防ぐ。", + "Toggle public sharing": "公開共有を切り替える", + "Toggle space public sharing": "スペースの公開共有を切り替える", + "Allow viewers to comment": "閲覧者によるコメントを許可", + "Allow viewers to add comments on pages in this space.": "このスペース内のページに閲覧者がコメントを追加できるようにします。", + "Toggle viewer comments": "閲覧者コメントの切り替え", + "Public sharing is disabled at the workspace level": "ワークスペースレベルで公開共有が無効になっています", + "Prevent pages in this space from being shared publicly.": "このスペース内のページが公開で共有されるのを防ぐ。", + "Page permissions": "ページのアクセス権", + "Control who can view and edit individual pages. Available with an enterprise license.": "個々のページを誰が表示・編集できるかを制御します。エンタープライズライセンスで利用可能です。", + "Enable public sharing": "公開共有を有効にする", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "本当に公開共有を有効にしますか?メンバーはページを公開で共有できるようになります。", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "本当に公開共有を無効にしますか?このワークスペース内のすべての既存の共有リンクが削除されます。", + "Are you sure you want to enable public sharing for this space?": "本当にこのスペースの公開共有を有効にしますか?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "本当に公開共有を無効にしますか?このスペースのすべての既存の共有リンクが削除されます。", + "Public sharing is disabled": "公開共有が無効になっています", + "Public sharing has been disabled at the workspace level.": "ワークスペースレベルで公開共有が無効になりました。", + "Public sharing has been disabled for this space.": "このスペースで公開共有が無効になりました。", + "Copy page": "ページをコピー", + "Copy page to a different space.": "ページを別のスペースにコピーします", + "Page copied successfully": "ページが正常にコピーされました", + "Page duplicated successfully": "ページが正常に複製されました", + "Find": "検索", + "Not found": "見つかりません", + "Previous Match (Shift+Enter)": "前の一致 (Shift+Enter)", + "Next match (Enter)": "次の一致 (Enter)", + "Match case (Alt+C)": "大文字と小文字を区別 (Alt+C)", + "Replace": "置換", + "Close (Escape)": "閉じる (Escape)", + "Replace (Enter)": "置換 (Enter)", + "Replace all (Ctrl+Alt+Enter)": "すべて置換 (Ctrl+Alt+Enter)", + "Replace all": "すべて置換", + "View all": "すべて表示", + "View all spaces": "すべてのスペースを表示", + "Error": "エラー", + "Failed to disable MFA": "MFA を無効化できませんでした", + "Disable two-factor authentication": "二要素認証を無効化", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "二要素認証を無効にすると、アカウントのセキュリティが低下します。サインインにはパスワードのみが必要になります", + "Please enter your password to disable two-factor authentication:": "二要素認証を無効にするにはパスワードを入力してください", + "Two-factor authentication has been enabled": "二要素認証が有効になりました", + "Two-factor authentication has been disabled": "二要素認証が無効になりました", + "2-step verification": "2 段階認証", + "Protect your account with an additional verification layer when signing in.": "サインイン時に追加の認証でアカウントを保護します", + "Two-factor authentication is active on your account.": "二要素認証が有効です", + "Add 2FA method": "2FA 方法を追加", + "Backup codes": "バックアップコード", + "Disable": "無効化", + "Invalid verification code": "認証コードが無効です", + "New backup codes have been generated": "新しいバックアップコードが生成されました", + "Failed to regenerate backup codes": "バックアップコードの再生成に失敗しました", + "About backup codes": "バックアップコードについて", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "認証アプリにアクセスできない場合、バックアップコードでアカウントにアクセスできます。各コードは1回のみ使用可能です", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "新しいバックアップコードはいつでも再生成できます。既存のコードはすべて無効になります", + "Confirm password": "パスワードを確認", + "Generate new backup codes": "新しいバックアップコードを生成", + "Save your new backup codes": "新しいバックアップコードを保存してください", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "これらのコードを安全な場所に保存してください。古いバックアップコードは無効になりました", + "Your new backup codes": "新しいバックアップコード", + "I've saved my backup codes": "バックアップコードを保存しました", + "Failed to setup MFA": "MFA の設定に失敗しました", + "Setup & Verify": "設定して認証", + "Add to authenticator": "認証アプリに追加", + "1. Scan this QR code with your authenticator app": "1. 認証アプリでこの QR コードをスキャンしてください", + "Can't scan the code?": "コードをスキャンできませんか?", + "Enter this code manually in your authenticator app:": "このコードを認証アプリに手動で入力してください:", + "2. Enter the 6-digit code from your authenticator": "2. 認証アプリに表示された 6 桁のコードを入力してください", + "Verify and enable": "認証して有効化", + "Failed to generate QR code. Please try again.": "QRコードの生成に失敗しました。もう一度お試しください", + "Backup": "バックアップ", + "Save codes": "コードを保存", + "Save your backup codes": "バックアップコードを保存してください", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "認証アプリにアクセスできない場合、これらのコードでアカウントにアクセスできます。各コードは1回のみ使用可能です", + "Print": "印刷", + "Two-factor authentication has been set up. Please log in again.": "二要素認証を設定しました。再度ログインしてください", + "Two-Factor authentication required": "二要素認証が必要です", + "Your workspace requires two-factor authentication for all users": "このワークスペースではすべてのユーザーに二要素認証が必要です", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "ワークスペースにアクセスするには二要素認証を設定してください。アカウントのセキュリティが強化されます", + "Set up two-factor authentication": "二要素認証を設定", + "Cancel and logout": "キャンセルしてログアウト", + "Your workspace requires two-factor authentication. Please set it up to continue.": "このワークスペースでは二要素認証が必要です。続行するには設定してください", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "認証アプリからの確認コードでアカウントのセキュリティが強化されます", + "Password is required": "パスワードは必須です", + "Password must be at least 8 characters": "パスワードは 8 文字以上である必要があります", + "Please enter a 6-digit code": "6 桁のコードを入力してください", + "Code must be exactly 6 digits": "コードはちょうど 6 桁である必要があります", + "Enter the 6-digit code found in your authenticator app": "認証アプリに表示された 6 桁のコードを入力してください", + "Need help authenticating?": "認証に関するヘルプが必要ですか?", + "MFA QR Code": "MFA QR コード", + "Account created successfully. Please log in to set up two-factor authentication.": "アカウントを作成しました。二要素認証を設定するためにログインしてください", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "パスワードをリセットしました。新しいパスワードでログインして二要素認証を完了してください", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "パスワードをリセットしました。新しいパスワードでログインして二要素認証を設定してください", + "Password reset was successful. Please log in with your new password.": "パスワードをリセットしました。新しいパスワードでログインしてください", + "Two-factor authentication": "二要素認証", + "Use authenticator app instead": "代わりに認証アプリを使用", + "Verify backup code": "バックアップコードを認証", + "Use backup code": "バックアップコードを使用", + "Enter one of your backup codes": "バックアップコードのいずれか 1 つを入力してください", + "Backup code": "バックアップコード", + "Enter one of your backup codes. Each backup code can only be used once.": "バックアップコードを入力してください。各コードは1回のみ使用可能です", + "Verify": "認証", + "Trash": "ゴミ箱", + "Pages in trash will be permanently deleted after {{count}} days.": "{count, plural, other {ゴミ箱内のページは#日後に完全に削除されます。}}", + "Deleted": "削除済み", + "No pages in trash": "ゴミ箱にページはありません", + "Permanently delete page?": "ページを完全に削除しますか?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "「{{title}}」を完全に削除しますか?この操作は取り消せません", + "Restore '{{title}}' and its sub-pages?": "「{{title}}」とそのサブページを復元しますか?", + "Move to trash": "ゴミ箱に移動", + "Move this page to trash?": "このページをごみ箱に移動しますか?", + "Restore page": "ページを復元", + "Permanently delete": "完全に削除", + "{{name}} moved this page to Trash {{time}}.": "{{name}} が {{time}} にこのページをゴミ箱に移動しました。", + "Page moved to trash": "ページをゴミ箱に移動しました", + "Page restored successfully": "ページが正常に復元されました", + "Deleted by": "削除者", + "Deleted at": "削除日時", + "Preview": "プレビュー", + "Base preview unavailable": "ベースのプレビューを利用できません", + "Restore this base to view its contents.": "内容を表示するには、このベースを復元してください。", + "Subpages": "サブページ", + "Failed to load subpages": "サブページの読み込みに失敗しました", + "No subpages": "サブページはありません", + "Subpages (Child pages)": "サブページ(子ページ)", + "List all subpages of the current page": "現在のページのすべてのサブページを一覧表示", + "Attachments": "添付ファイル", + "All spaces": "すべてのスペース", + "Unknown": "不明", + "Find a space": "スペースを探す", + "Search in all your spaces": "すべてのスペースを検索", + "Type": "タイプ", + "Enterprise": "エンタープライズ", + "Download attachment": "添付ファイルをダウンロード", + "Allowed email domains": "許可されたメールドメイン", + "Only users with email addresses from these domains can signup via SSO.": "これらのドメインのメールアドレスを持つユーザーのみが SSO 経由でサインアップできます。", + "Enter valid domain names separated by comma or space": "有効なドメイン名をカンマまたはスペース区切りで入力してください", + "Enforce two-factor authentication": "二要素認証を必須化", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "有効にすると、すべてのメンバーが二要素認証を設定しないとワークスペースにアクセスできなくなります", + "Toggle MFA enforcement": "MFA 必須化を切り替え", + "Display name": "表示名", + "Allow signup": "サインアップを許可", + "Enabled": "有効", + "Advanced Settings": "詳細設定", + "Enable TLS/SSL": "TLS/SSL を有効化", + "Use secure connection to LDAP server": "LDAP サーバーへの安全な接続を使用", + "Group sync": "グループ同期", + "No SSO providers found.": "SSOプロバイダーが見つかりませんでした。", + "Delete SSO provider": "SSO プロバイダーを削除", + "Are you sure you want to delete this SSO provider?": "このSSOプロバイダーを削除してもよろしいですか?", + "Action": "操作", + "{{ssoProviderType}} configuration": "{{ssoProviderType}} の設定", + "Icon": "アイコン", + "Upload image": "画像をアップロード", + "Remove image": "画像を削除", + "Failed to remove image": "画像の削除に失敗しました", + "Image exceeds 10MB limit.": "画像が10MBの制限を超えています", + "Image removed successfully": "画像を削除しました", + "API key": "APIキー", + "API keys": "APIキー", + "API management": "API管理", + "Custom expiration date": "カスタム有効期限", + "Enter a descriptive token name": "説明的なトークン名を入力してください", + "Expiration": "有効期限", + "Expired": "期限切れ", + "Expires": "期限が切れます", + "Last use": "最終使用", + "No API keys found": "APIキーが見つかりません", + "No expiration": "期限なし", + "Revoked successfully": "無効にしました", + "Select expiration date": "有効期限を選択してください", + "This action cannot be undone. Any applications using this API key will stop working.": "この操作は取り消せません。このAPIキーを使用しているアプリケーションは動作しなくなります", + "Update": "更新", + "Update {{credential}}": "{{credential}}を更新", + "Manage API keys for all users in the workspace": "ワークスペース内のすべてのユーザーのAPIキーを管理", + "Restrict API key creation to admins": "APIキーの作成を管理者のみに制限する", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "新しいAPIキーを作成できるのは管理者とオーナーのみです。既存のメンバーキーは引き続き有効です。", + "Toggle restrict API keys to admins": "APIキーの作成制限(管理者のみ)を切り替える", + "API key creation is restricted to admins by your workspace administrator.": "ワークスペース管理者によってAPIキーの作成が管理者のみに制限されています。", + "AI settings": "AI設定", + "AI search": "AI検索", + "AI Answer": "AI回答", + "Ask AI": "AIに質問する", + "AI is thinking...": "AIが考え中...", + "Thinking": "考えています", + "Ask a question...": "質問を入力...", + "AI Answers": "AI回答", + "AI-powered search (AI Answers)": "AI搭載検索 (AI回答)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI検索はベクター埋め込みを使用してワークスペース全体の意味検索を実現します", + "Toggle AI search": "AI検索を切り替え", + "Generative AI (Ask AI)": "生成AI (Ask AI)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "エディターでAIを活用したコンテンツ生成を有効にします。ユーザーがテキストの生成、改善、翻訳、および変換を行うことができます。", + "Toggle generative AI": "生成AIを切り替える", + "Upgrade your plan": "プランをアップグレードする", + "Available with a paid license": "有料ライセンスで利用可能", + "Upgrade your license tier.": "ライセンスタイアをアップグレードしてください。", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "AI は Docmost の有料版で利用可能です。sales@docmost.com までお問い合わせください。", + "AI & MCP": "AI と MCP", + "AI": "AI", + "MCP": "MCP", + "Model Context Protocol (MCP)": "モデルコンテキストプロトコル(MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "MCP サーバーを有効にして、AI アシスタントやツールがワークスペースのコンテンツとやり取りできるようにします。", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP は Docmost のエンタープライズ版でのみ利用可能です。sales@docmost.com までお問い合わせください。", + "MCP Server URL": "MCP サーバーの URL", + "Connect AI assistants with your Docmost account via OAuth.": "OAuth を使用して AI アシスタントを Docmost アカウントに接続します。", + "Enforce OAuth": "OAuth を必須化", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI アシスタントは OAuth を使用して Docmost アカウントに接続する必要があります。MCP サーバーでは API キーは使用できません。", + "Toggle enforce OAuth for MCP": "MCP の OAuth 必須化を切り替え", + "Supported tools": "サポートされているツール", + "MCP server URL:": "MCP サーバーの URL:", + "Learn more": "詳細を見る", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "ワークスペース内のすべてのユーザーのAPIキーを管理します。利用方法の詳細はAPIドキュメントをご覧ください。", + "View the API documentation for usage details.": "利用方法の詳細はAPIドキュメントをご覧ください。", + "View the MCP documentation.": "MCPドキュメントをご覧ください。", + "Sources": "ソース", + "AI Answers not available for attachments": "添付ファイルにはAI回答を利用できません", + "No answer available": "回答がありません", + "Background color": "背景色", + "Highlight color": "ハイライト色", + "Remove color": "色を削除", + "Notifications": "通知", + "No notifications": "通知なし", + "No unread notifications": "未読の通知はありません", + "All notifications": "すべての通知", + "Unread only": "未読のみ", + "Mark all as read": "すべてを既読にする", + "Mark as read": "既読にする", + "More options": "その他のオプション", + "{{name}} mentioned you in a comment": "{{name}}さんがコメントであなたに言及しました", + "{{name}} commented on a page": "{{name}}さんがページにコメントしました", + "{{name}} resolved a comment": "{{name}} さんがコメントを解決しました", + "{{name}} mentioned you on a page": "{{name}} さんがページであなたにメンションしました", + "{{name}} gave you edit access to a page": "{{name}} さんがあなたにページの編集権限を付与しました", + "{{name}} gave you view access to a page": "{{name}} さんがあなたにページの閲覧権限を付与しました", + "{{name}} updated a page": "{{name}} さんがページを更新しました", + "Watch page": "ページをウォッチ", + "Stop watching": "ウォッチを解除", + "Watch space": "スペースをウォッチ", + "Stop watching space": "スペースのウォッチを解除", + "Email notifications": "メール通知", + "Page updates": "ページの更新", + "Get notified when pages you watch are updated.": "ウォッチしているページが更新されたときに通知を受け取ります。", + "Page mentions": "ページでの言及", + "Get notified when someone mentions you on a page.": "誰かがページであなたに言及したとき通知を受け取ります。", + "Comment mentions": "コメントでの言及", + "Get notified when someone mentions you in a comment.": "誰かがコメントであなたに言及したとき通知を受け取ります。", + "New comments": "新しいコメント", + "Get notified about new comments on threads you participate in.": "参加しているスレッドに新しいコメントがあると通知されます。", + "Resolved comments": "解決済みコメント", + "Get notified when your comment is resolved.": "あなたのコメントが解決されたとき通知を受け取ります。", + "You are now watching this page": "このページをウォッチしています", + "You are no longer watching this page": "このページのウォッチを解除しました", + "You are now watching this space": "このスペースのウォッチを開始しました", + "You are no longer watching this space": "このスペースのウォッチを解除しました", + "Direct": "直接", + "Updates": "アップデート", + "Today": "今日", + "Yesterday": "昨日", + "This week": "今週", + "Older": "以前のもの", + "Restricted page": "アクセス制限されたページ", + "Restricted pages cannot be shared publicly.": "アクセス制限されたページは公開共有できません。", + "Restricted by parent": "親ページによって制限されています", + "Restricted": "制限あり", + "Open": "制限なし", + "Inherits restrictions from ancestor page": "上位ページから制限を継承しています", + "Only people listed below can access this page": "以下に記載されている人のみがこのページにアクセスできます", + "Everyone in this space can access": "このスペース内の全員がアクセスできます", + "No additional restrictions on this page": "このページに追加の制限はありません", + "Only specific people can access": "特定の人のみがアクセスできます", + "Use only inherited restrictions": "継承された制限のみを適用する", + "Add restrictions on top of inherited": "継承された制限に追加の制限を加える", + "Inherited restriction": "継承された制限", + "Access limited by": "アクセス制限元", + "Restrict access to control who can view and edit this page": "このページを誰が表示・編集できるかを制御するためにアクセスを制限します", + "Add additional restrictions specific to this page": "このページ固有の追加制限を設定する", + "Access": "アクセス", + "People with access": "アクセスできる人", + "Remove all": "すべてを削除", + "Remove access": "アクセス権を削除", + "Remove all access": "すべてのアクセス権を削除", + "Are you sure you want to remove this member's access to the page?": "このメンバーのページへのアクセス権を削除してもよろしいですか?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "すべての特定のアクセスを削除してもよろしいですか?これによりページはスペース内の全員に公開されます。", + "Trash retention": "ゴミ箱の保持期間", + "Pages in trash will be permanently deleted after this period.": "この期間を過ぎるとゴミ箱内のページは完全に削除されます。", + "Trash retention updated": "ゴミ箱保持期間が更新されました", + "Failed to update trash retention": "ゴミ箱保持期間の更新に失敗しました", + "Removed page restriction": "ページの制限を解除しました", + "Added page permission": "ページの権限を追加しました", + "Removed page permission": "ページの権限を削除しました", + "Changed page permission": "ページの権限を変更しました", + "Requested password reset": "パスワードのリセットをリクエストしました", + "Created template": "テンプレートを作成しました", + "Deleted template": "テンプレートを削除しました", + "day": "日", + "days": "日", + "week": "週", + "weeks": "週", + "month": "か月", + "months": "か月", + "year": "年", + "years": "年", + "Period": "期間", + "Fixed date": "指定日", + "Indefinitely": "無期限", + "Days": "日", + "Weeks": "週", + "Months": "か月", + "Years": "年", + "Pick a date": "日付を選択", + "Maximum is {{max}} {{unit}} for this unit": "この単位の最大値は{{max}}{{unit}}です", + "Never expires. Verifiers can re-verify at any time.": "有効期限はありません。検証者はいつでも再検証できます。", + "Verified": "検証済み", + "Review needed": "確認が必要", + "Verification expired": "検証期限切れ", + "Draft": "下書き", + "In Approval": "承認中", + "In approval": "承認中", + "Approved": "承認済み", + "Obsolete": "廃止", + "Expiring": "期限間近", + "Set up verification": "検証を設定", + "Verify page": "ページを検証", + "Page verification": "ページ検証", + "Add verification": "検証を追加", + "Edit verification": "検証を編集", + "Search by title": "タイトルで検索", + "Choose how this page should stay accurate.": "このページの正確性をどのように維持するか選択してください。", + "Recurring verification": "定期検証", + "Verifiers re-confirm this page on a schedule.": "検証者がこのページを定期的に再確認します。", + "Re-verify on a schedule (e.g every 30 days )": "スケジュールに従って再検証(例:30日ごと)", + "Page stays editable at all times": "ページは常に編集可能です", + "Best for runbooks, FAQs, living documentation": "運用手順書、FAQ、継続的に更新されるドキュメントに最適", + "Approval workflow": "承認ワークフロー", + "Formal document lifecycle with named approvers.": "指定された承認者による正式な文書ライフサイクルです。", + "Draft → In approval → Approved → Obsolete": "下書き → 承認中 → 承認済み → 廃止", + "Locked once approved, with full history": "承認後はロックされ、完全な履歴が残ります", + "Designed for ISO 9001, ISO 13485, and FDA": "ISO 9001、ISO 13485、FDA向けに設計", + "Best for SOPs and controlled documents": "SOPや管理文書に最適", + "Back": "戻る", + "Quality management": "品質管理", + "Recurring": "定期", + "Pages move through draft, approval, and approved stages.": "ページは下書き、承認中、承認済みの各段階を進みます。", + "Verifiers": "検証者", + "Add verifier": "検証者を追加", + "I've reviewed this page for accuracy": "このページの正確性を確認しました", + "Set up": "設定", + "Remove verification": "検証を削除", + "Are you sure you want to remove verification from this page?": "このページから検証を削除してもよろしいですか?", + "Assigned verifiers must periodically re-verify this page.": "割り当てられた検証者はこのページを定期的に再検証する必要があります。", + "Last verified by {{name}} {{time}} (expired)": "最終検証者:{{name}} {{time}}(期限切れ)", + "The fixed expiration date has passed.": "指定された有効期限を過ぎています。", + "Verified by {{name}} {{time}}": "{{name}}が{{time}}に検証", + "Expires {{date}}": "有効期限:{{date}}", + "Expired {{date}}": "{{date}}に期限切れ", + "Mark as obsolete": "廃止としてマーク", + "Mark obsolete": "廃止にする", + "Returned by {{name}} {{time}}": "{{name}}が{{time}}に差し戻し", + "No approval has been requested yet.": "まだ承認は依頼されていません。", + "Submitted by {{name}} {{time}}": "{{name}}が{{time}}に提出", + "Someone": "誰か", + "Approved by {{name}} {{time}}": "{{name}}が{{time}}に承認", + "This document has been marked as obsolete.": "この文書は廃止としてマークされています。", + "Rejection comment": "差し戻しコメント", + "Reason for returning this document...": "この文書を差し戻す理由...", + "Confirm rejection": "差し戻しを確定", + "Submit for approval": "承認を申請", + "Reject": "差し戻す", + "Approve": "承認", + "Re-submit for approval": "再度承認を申請", + "Verified until": "検証有効期限", + "QMS": "QMS", + "Verified pages": "検証済みページ", + "Search pages...": "ページを検索...", + "Filter by space": "スペースで絞り込み", + "Filter by type": "タイプで絞り込み", + "{{name}} verified a page": "{{name}}がページを検証しました", + "{{name}} submitted a page for your approval": "{{name}}があなたの承認のためにページを提出しました", + "{{name}} returned a page for revision": "{{name}}がページを修正のため差し戻しました", + "Page verification expires soon": "ページ検証の期限が間もなく切れます", + "Page verification has expired": "ページ検証の期限が切れています", + "SIEM destination {{name}} is failing": "SIEM 宛先 {{name}} で障害が発生しています", + "SIEM destination {{name}} was disabled after 24 hours of failures": "SIEM 宛先 {{name}} は24時間障害が続いたため無効化されました", + "SIEM destination {{name}} recovered": "SIEM 宛先 {{name}} が復旧しました", + "Verifying your email": "メールアドレスを確認しています", + "Please wait...": "お待ちください…", + "Verification failed. The link may have expired.": "認証に失敗しました。リンクの有効期限が切れている可能性があります。", + "Check your email": "メールを確認してください", + "We sent a verification link to {{email}}.": "確認用リンクを{{email}}に送信しました。", + "We sent a verification link to your email.": "確認用リンクをあなたのメールアドレスに送信しました。", + "Click the link to verify your email and access your workspace.": "リンクをクリックしてメールを認証し、ワークスペースにアクセスしてください。", + "Resend verification email": "確認メールを再送信", + "Verification email sent. Please check your inbox.": "確認メールを送信しました。受信箱をご確認ください。", + "Failed to resend verification email. Please try again.": "確認メールの再送信に失敗しました。もう一度お試しください。", + "We've sent you an email with your associated workspaces.": "紐づいているワークスペース情報をメールでお送りしました。", + "Load more": "もっと読み込む", + "Log out of all devices": "すべてのデバイスからログアウト", + "Log out of all sessions except this device": "このデバイス以外のすべてのセッションからログアウト", + "This Device": "このデバイス", + "Unknown device": "不明なデバイス", + "No active sessions": "アクティブなセッションはありません", + "Session revoked": "セッションを無効化しました", + "All other sessions revoked": "他のすべてのセッションを無効化しました", + "Last used": "最終使用", + "Created": "作成日", + "Rename": "名前を変更", + "Publish": "公開", + "Security": "セキュリティ", + "Enforce SSO": "SSO を必須化", + "Once enforced, members will not be able to login with email and password.": "必須化すると、メンバーはメールアドレスとパスワードでログインできなくなります。", + "AI-generated content may not be accurate.": "AI が生成したコンテンツは正確でない場合があります。", + "AI Chat": "AI チャット", + "Analyze for insights": "分析してインサイトを得る", + "Ask anything...": "何でも聞いてください...", + "Assistant said:": "アシスタントの回答:", + "Chat history": "チャット履歴", + "Chat name": "チャット名", + "Chat transcript": "チャットの記録", + "Close": "閉じる", + "Copy assistant response": "アシスタントの回答をコピー", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "チャットの読み込みに失敗しました。エラーが発生しました。", + "Failed to render this message.": "このメッセージの表示に失敗しました。", + "How can I help you today?": "本日はどのようにお手伝いできますか?", + "New chat": "新しいチャット", + "No chat history": "チャット履歴はありません", + "No chats found": "チャットが見つかりません", + "No conversations yet": "会話はまだありません", + "Open full page": "全ページで開く", + "Scroll to bottom": "一番下までスクロール", + "You said:": "あなたの発言:", + "Previous 7 days": "過去 7 日間", + "Previous 30 days": "過去 30 日間", + "Search chats...": "チャットを検索...", + "Search chats": "チャットを検索", + "Ask anything... Use @ to mention pages": "何でも質問してください… @ を使ってページにメンションできます", + "Ask anything or search your workspace": "何でも質問するか、ワークスペースを検索", + "Welcome to {{name}}": "{{name}} へようこそ", + "Add files": "ファイルを追加", + "Mention a page": "ページにメンション", + "Start a new chat to see it here.": "ここに表示するには新しいチャットを開始してください。", + "Summarize this page": "このページを要約", + "Toggle AI Chat": "AI チャットを切り替え", + "Translate this page": "このページを翻訳", + "Try a different search term.": "別の検索語を試してください。", + "Try again": "再試行", + "Untitled chat": "無題のチャット", + "What can I help you with?": "何をお手伝いしましょうか?", + "Are you sure you want to revoke this {{credential}}": "この{{credential}}を無効にしてもよろしいですか", + "Automatically provision users and groups from your identity provider via SCIM.": "SCIM を介して、ID プロバイダーからユーザーとグループを自動的にプロビジョニングします。", + "Configure your identity provider with this URL to provision users and groups.": "この URL を使用して ID プロバイダーを設定し、ユーザーとグループをプロビジョニングします。", + "Create {{credential}}": "{{credential}}を作成", + "{{credential}} created": "{{credential}}を作成しました", + "{{credential}} created successfully": "{{credential}}を正常に作成しました", + "Created by": "作成者", + "Custom": "カスタム", + "Enable SCIM": "SCIM を有効にする", + "Enter a descriptive name": "説明的な名前を入力してください", + "I've saved my {{credential}}": "{{credential}}を保存しました", + "Important": "重要", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "今すぐ {{credential}} をコピーしてください。後でもう一度表示することはできません!", + "Never": "なし", + "Revoke {{credential}}": "{{credential}}を無効にする", + "SCIM endpoint URL": "SCIM エンドポイント URL", + "SCIM provisioning": "SCIM プロビジョニング", + "SCIM takes precedence over SSO group sync while enabled.": "有効になっている間は、SCIM が SSO グループ同期より優先されます。", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "SCIM トークンの上限 {{max}} に達しました。新しいトークンを作成するには、既存のトークンを削除してください。", + "SCIM token": "SCIM トークン", + "SCIM tokens": "SCIM トークン", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "この操作は元に戻せません。ID プロバイダーは直ちに同期を停止します。", + "Toggle SCIM provisioning": "SCIM プロビジョニングを切り替える", + "Token": "トークン", + "Page menu": "ページメニュー", + "Expand": "展開", + "Collapse": "折りたたむ", + "Comment menu": "コメントメニュー", + "Group menu": "グループメニュー", + "Show hidden breadcrumbs": "非表示のパンくずリストを表示", + "Breadcrumbs": "パンくずリスト", + "Page actions": "ページアクション", + "Pick emoji": "絵文字を選択", + "Template menu": "テンプレートメニュー", + "Use": "使用", + "Use template": "テンプレートを使用", + "Preview template: {{title}}": "テンプレートをプレビュー: {{title}}", + "Use a template": "テンプレートを使用", + "Search templates...": "テンプレートを検索…", + "Search spaces...": "スペースを検索…", + "No templates found": "テンプレートが見つかりません", + "No spaces found": "スペースが見つかりません", + "Browse all templates": "すべてのテンプレートを表示", + "This space": "このスペース", + "All templates": "すべてのテンプレート", + "Global": "グローバル", + "New template": "新しいテンプレート", + "Edit template": "テンプレートを編集", + "Are you sure you want to delete this template?": "このテンプレートを削除してもよろしいですか?", + "Template scope updated": "テンプレートのスコープを更新しました", + "Choose which space this template belongs to": "このテンプレートを所属させるスペースを選択", + "Only workspace admins can create global templates.": "グローバルテンプレートを作成できるのは、ワークスペース管理者のみです。", + "You need edit access to this space to create templates.": "テンプレートを作成するには、このスペースへの編集アクセス権が必要です。", + "Scope": "スコープ", + "Select scope": "スコープを選択", + "Title": "タイトル", + "Saving...": "保存中…", + "Saved": "保存しました", + "Save failed. Retry": "保存に失敗しました。再試行", + "By {{name}}": "{{name}} 作成", + "Updated {{time}}": "{{time}} に更新", + "Choose destination": "保存先を選択", + "Search pages and spaces...": "ページとスペースを検索…", + "No results found": "結果が見つかりません", + "You don't have permission to create pages here": "ここにページを作成する権限がありません", + "Chat menu for {{title}}": "{{title}} のチャットメニュー", + "API key menu": "API キーメニュー", + "Jump to comment selection": "コメント選択に移動", + "Slash commands": "スラッシュコマンド", + "Mention suggestions": "メンション候補", + "Link suggestions": "リンク候補", + "Diagram editor": "ダイアグラムエディター", + "Add comment": "コメントを追加", + "Find and replace": "検索と置換", + "Main navigation": "メインナビゲーション", + "Space navigation": "スペースナビゲーション", + "Settings navigation": "設定ナビゲーション", + "AI navigation": "AI ナビゲーション", + "Breadcrumb": "パンくずリスト", + "Synced block": "同期ブロック", + "Create a block that stays in sync across pages.": "ページ間で同期されたままになるブロックを作成します。", + "Editing original": "オリジナルを編集中", + "Copy synced block": "同期ブロックをコピー", + "Unsync": "同期解除", + "Delete synced block": "同期ブロックを削除", + "Synced to {{count}} other page_one": "他の{{count}}ページに同期済みです", + "Synced to {{count}} other page_other": "他の{{count}}ページに同期済みです", + "ORIGINAL": "オリジナル", + "THIS PAGE": "このページ", + "No pages": "ページがありません", + "The original synced block no longer exists": "元の同期ブロックは存在しなくなりました", + "You don't have access to this synced block": "この同期ブロックにアクセスできません", + "Failed to load this synced block": "この同期ブロックの読み込みに失敗しました", + "Fixed editor toolbar": "固定エディターツールバー", + "Show a formatting toolbar above the editor with quick access to common actions.": "一般的な操作にすばやくアクセスできる書式設定ツールバーをエディターの上に表示します。", + "Toggle fixed editor toolbar": "固定エディターツールバーを切り替え", + "Normal text": "通常のテキスト", + "More inline formatting": "その他のインライン書式", + "Subscript": "下付き", + "Superscript": "上付き", + "Inline code": "インラインコード", + "Insert media": "メディアを挿入", + "Mention": "メンション", + "Emoji": "絵文字", + "Columns": "列", + "More inserts": "その他の挿入", + "Embeds": "埋め込み", + "Diagrams": "ダイアグラム", + "Advanced": "詳細", + "Utility": "ユーティリティ", + "Decrease indent": "インデントを減らす", + "Increase indent": "インデントを増やす", + "Clear formatting": "書式をクリア", + "Code block": "コードブロック", + "Experimental": "実験的", + "Strikethrough": "取り消し線", + "Undo": "元に戻す", + "Redo": "やり直す", + "Backlinks": "バックリンク", + "Last updated by": "最終更新者", + "Last updated": "最終更新", + "Stats": "統計", + "Word count": "単語数", + "Characters": "文字数", + "Incoming links": "被リンク", + "Outgoing links": "発リンク", + "Incoming links ({{count}})": "被リンク ({{count}})", + "Outgoing links ({{count}})": "発リンク ({{count}})", + "No pages link here yet.": "まだこのページにリンクしているページはありません。", + "This page doesn't link to other pages yet.": "このページはまだ他のページにリンクしていません。", + "Verified until {{date}}": "{{date}} まで検証済み", + "Labels": "ラベル", + "Add label": "ラベルを追加", + "No labels yet": "まだラベルはありません", + "Already added": "追加済み", + "Invalid label name": "無効なラベル名", + "No matches": "一致するものがありません", + "Search or create…": "検索または作成…", + "Remove label {{name}}": "ラベル {{name}} を削除", + "Failed to add label": "ラベルの追加に失敗しました", + "Failed to remove label": "ラベルの削除に失敗しました", + "No pages with this label": "このラベルが付いたページはありません", + "Pages tagged with this label will appear here.": "このラベルが付いたページがここに表示されます。", + "No pages match your search.": "検索に一致するページはありません。", + "Updated {{date}}": "{{date}} に更新", + "Cell actions": "セルの操作", + "Column actions": "列の操作", + "Row actions": "行の操作", + "Filter": "フィルター", + "Page title": "ページタイトル", + "Page content": "ページ内容", + "Member actions for {{name}}": "{{name}} のメンバー操作", + "Toggle password visibility": "パスワードの表示を切り替え", + "Send comment": "コメントを送信", + "Token actions": "トークンの操作", + "Template settings": "テンプレート設定", + "Edit diagram": "ダイアグラムを編集", + "Edit embed": "埋め込みを編集", + "Edit drawing": "図を編集", + "Delete equation": "数式を削除", + "Invite actions": "招待の操作", + "Get started": "始める", + "* indicates required fields": "* は必須項目を示します", + "List of spaces in this workspace": "このワークスペース内のスペース一覧", + "Active sessions": "アクティブなセッション", + "Add {{name}} to favorites": "{{name}} をお気に入りに追加", + "Remove {{name}} from favorites": "{{name}} をお気に入りから削除", + "Added to favorites": "お気に入りに追加しました", + "Removed from favorites": "お気に入りから削除しました", + "Added {{name}} to favorites": "{{name}} をお気に入りに追加しました", + "Removed {{name}} from favorites": "{{name}} をお気に入りから削除しました", + "Page menu for {{name}}": "{{name}} のページメニュー", + "Create subpage of {{name}}": "{{name}} のサブページを作成", + "Allow personal spaces": "パーソナルスペースを許可", + "Members can create their own personal space.": "メンバーは自分専用のパーソナルスペースを作成できます。", + "Toggle allow personal spaces": "パーソナルスペースの許可を切り替える", + "Create personal space": "パーソナルスペースを作成", + "Personal space": "パーソナルスペース", + "{{name}}'s space": "{{name}} のスペース", + "Apply": "適用", + "Cells that aren't already a page reference will be cleared.": "すでにページ参照になっているセル以外は消去されます。", + "Cells that aren't a valid URL will be cleared.": "有効な URL ではないセルは消去されます。", + "Cells that aren't a valid email address will be cleared.": "有効なメールアドレスではないセルは消去されます。", + "Cells that can't be parsed as a date will be cleared.": "日付として解析できないセルは消去されます。", + "Cells that can't be parsed as a number will be cleared.": "数値として解析できないセルは消去されます。", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "セルは強制変換されます(yes/true/1 はチェック済みになり、それ以外は未チェックまたは空になります)。", + "Cells will be reinterpreted under the new type.": "セルは新しい型で再解釈されます。", + "Cells will be replaced with a comma-separated list of file names.": "セルは、ファイル名のカンマ区切りリストに置き換えられます。", + "Cells will be replaced with a comma-separated list of option names.": "セルは、オプション名のカンマ区切りリストに置き換えられます。", + "Cells will be replaced with the option name.": "セルはオプション名に置き換えられます。", + "Cells will be replaced with the page title.": "セルはページタイトルに置き換えられます。", + "Cells will be replaced with the person's name.": "セルはその人の名前に置き換えられます。", + "Change type": "型を変更", + "Change type to {{label}}?": "型を {{label}} に変更しますか?", + "Converting…": "変換中…", + "Existing values become single-item lists. No data is lost.": "既存の値は単一項目のリストになります。データは失われません。", + "Only the first selected item per row will be kept; the rest will be discarded.": "各行で最初に選択された項目のみ保持され、残りは破棄されます。", + "Previous record": "前のレコード", + "Next record": "次のレコード", + "Record actions": "レコード操作", + "Delete record": "レコードを削除", + "Delete record?": "レコードを削除しますか?", + "This action cannot be undone.": "この操作は元に戻せません。", + "to navigate": "移動するには", + "to close": "閉じるには", + "Expand row {{number}}": "行 {{number}} を展開", + "Saving…": "保存中…", + "Read-only": "読み取り専用", + "Loading…": "読み込み中…", + "Updated {{when}}": "{{when}} に更新", + "Add property": "プロパティを追加", + "Create property": "プロパティを作成", + "Hide properties": "プロパティを非表示", + "Find a property type": "プロパティの種類を検索", + "Properties": "プロパティ", + "A property with this name already exists": "この名前のプロパティはすでに存在します", + "Add card": "カードを追加", + "Add filter": "フィルターを追加", + "Add option": "オプションを追加", + "Add sort": "並べ替えを追加", + "Add view": "ビューを追加", + "All data in this column will be lost.": "この列内のすべてのデータは失われます。", + "Allow multiple people": "複数のユーザーを許可", + "Alphabetize": "アルファベット順", + "Are you sure you want to delete": "削除してもよろしいですか", + "Ascending": "昇順", + "Base deleted": "ベースを削除しました", + "Base name": "ベース名", + "Base table": "ベーステーブル", + "Card properties": "カードのプロパティ", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "テキストの制限を超える長さのセルは切り詰められ、超過分の内容は完全に失われます。", + "Checkbox": "チェックボックス", + "Checked by default": "デフォルトでチェックを入れる", + "Choose a property": "プロパティを選択", + "Clear selection": "選択をクリア", + "Column options": "列のオプション", + "Comma, period": "カンマ、小数点", + "Complete": "完了", + "Contains": "含む", + "Copy link to view": "ビューへのリンクをコピー", + "Create a status property": "ステータスプロパティを作成", + "Created at": "作成日時", + "Currency": "通貨", + "Decimal places": "小数点以下の桁数", + "Default value": "デフォルト値", + "Delete property": "プロパティを削除", + "Delete view": "ビューを削除", + "Delete {{count}} rows?_one": "1行を削除しますか?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "降順", + "Discard": "破棄", + "Doesn't contain": "含まない", + "Done": "完了", + "Edit formula": "数式を編集", + "Edit property": "プロパティを編集", + "Export CSV": "CSVをエクスポート", + "Failed to load base": "ベースの読み込みに失敗しました", + "False": "偽", + "File": "ファイル", + "Filter and sort changes are visible only to you": "フィルターと並べ替えの変更は自分にのみ表示されます", + "Filter by": "条件", + "Formula": "数式", + "Get started with": "次から始める", + "Greater than": "より大きい", + "Group by": "グループ化", + "Group this board by a select or status property.": "このボードをセレクトまたはステータスのプロパティでグループ化します。", + "Hide all": "すべて非表示", + "Hide group": "グループを非表示", + "In Progress": "進行中", + "In progress": "進行中", + "Include time": "時刻を含める", + "Insert a kanban board on this page": "このページにカンバンボードを挿入", + "Insert an inline base on this page": "このページにインラインベースを挿入", + "Is": "次に等しい", + "Is after": "次より後", + "Is any of": "次のいずれか", + "Is before": "次より前", + "Is empty": "空である", + "Is none of": "次のいずれでもない", + "Is not": "次に等しくない", + "Is not empty": "空ではない", + "Is on or after": "次以降", + "Is on or before": "次以前", + "Is within": "次の期間内", + "Keep editing": "編集を続ける", + "Last edited at": "最終編集日時", + "Last edited by": "最終編集者", + "Less than": "より小さい", + "Link copied to clipboard": "リンクをクリップボードにコピーしました", + "Local": "ローカル", + "Long text": "長いテキスト", + "Moved card to {{column}}": "カードを{{column}}に移動しました", + "Moved column to {{column}}": "列を{{column}}に移動しました", + "Multi-select": "複数選択", + "New row": "新規行", + "Next month": "来月", + "Next week": "来週", + "Next year": "来年", + "No filters applied": "フィルターは適用されていません", + "No match": "一致なし", + "No options for this property type": "このプロパティタイプにはオプションがありません", + "No sorts applied": "並べ替えは適用されていません", + "No value": "値なし", + "None": "なし", + "Not started": "未着手", + "Number": "数値", + "One month ago": "1か月前", + "One month from now": "1か月後", + "One week ago": "1週間前", + "One week from now": "1週間後", + "Open as page": "ページとして開く", + "Options": "オプション", + "Past month": "先月", + "Past week": "先週", + "Past year": "昨年", + "Percent": "パーセント", + "Period, comma": "小数点、カンマ", + "Person": "ユーザー", + "Please enter a valid email": "有効なメールアドレスを入力してください", + "Progress": "進捗", + "Property options": "プロパティのオプション", + "Relative": "相対", + "Rename property": "プロパティ名を変更", + "Reset": "リセット", + "Save for everyone": "全員に保存", + "Select": "選択", + "Select a property": "プロパティを選択", + "Select all loaded rows": "読み込まれているすべての行を選択", + "Show all": "すべて表示", + "Sort": "並べ替え", + "Sort by": "並べ替え条件", + "Space, comma": "スペース、カンマ", + "Space, period": "スペース、小数点", + "This board has no grouping property yet.": "このボードにはまだグループ化プロパティがありません。", + "This month": "今月", + "This year": "今年", + "Thousands and decimal separators": "桁区切りと小数点区切り", + "Time format": "時刻形式", + "To Do": "To Do", + "Tomorrow": "明日", + "True": "真", + "Unsaved changes": "未保存の変更", + "Untitled base": "無題のベース", + "URL": "URL", + "Value": "値", + "View updated for everyone": "ビューが全員向けに更新されました", + "You have unsaved changes. Do you want to discard them?": "未保存の変更があります。破棄しますか?", + "{{count}} rows deleted_one": "1行を削除しました", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1件を選択中", + "{{count}} selected_other": "{{count}} selected", + "Compare": "比較", + "Compare versions": "バージョンを比較", + "Select version from {{date}}": "{{date}} のバージョンを選択", + "Version actions for {{date}}": "{{date}} のバージョンの操作", + "Comparing {{newer}} and {{older}}": "{{newer}} と {{older}} を比較中", + "Exit compare": "比較を終了", + "Search attachments...": "添付ファイルを検索…", + "Error loading attachments.": "添付ファイルの読み込み中にエラーが発生しました。", + "No attachments on this page yet.": "このページにはまだ添付ファイルがありません。", + "Uploaded by {{name}}": "アップロード者: {{name}}", + "Download {{name}}": "{{name}} をダウンロード", + "Access revoked": "アクセスが取り消されました", + "Authorize application": "アプリケーションを認可", + "{{name}} wants to access {{workspace}}": "{{name}} が {{workspace}} へのアクセスを求めています", + "Not you? Switch account": "あなたではありませんか? アカウントを切り替え", + "This application will be able to:": "このアプリケーションで可能なこと:", + "Write": "書き込み", + "Invalid authorization request": "無効な認可リクエストです", + "Authorize": "認可", + "Application": "アプリケーション", + "Permissions": "権限", + "Authorized": "認可済み", + "Revoke access": "アクセスを取り消す", + "Revoke access for {{name}}": "{{name}} のアクセスを取り消す", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "{{name}} のアクセスを取り消してもよろしいですか? このアプリケーションは今後あなたのアカウントにアクセスできなくなります。", + "Something went wrong. Please try again.": "問題が発生しました。もう一度お試しください。", + "Remove {{name}}": "{{name}} を削除", + "Make sure you trust this application before authorizing it.": "認可する前に、このアプリケーションを信頼できることを確認してください。", + "You will be redirected to": "次へリダイレクトされます", + "View content without making changes.": "変更を加えずにコンテンツを表示します。", + "Create and modify content.": "コンテンツを作成および変更します。", + "Applications and AI assistants you have authorized to access your account.": "あなたのアカウントへのアクセスを認可したアプリケーションと AI アシスタント。", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "このワークスペースでは MCP が有効になっています。OAuth を使用して AI アシスタントを Docmost アカウントに接続します。", + "Authorized apps": "認可済みアプリ", + "No authorized apps yet.": "認可済みアプリはまだありません。", + "Workspace knowledge only": "ワークスペースの知識のみ", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "AIチャットの回答を、ワークスペース内のページとアップロードされたファイルのみに制限します。外部の知識は使用されません。", + "Toggle workspace knowledge only": "「ワークスペースの知識のみ」を切り替え", + "Read-only mode": "読み取り専用モード", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AIチャットはワークスペースのコンテンツを検索および閲覧できますが、ページの作成や編集はできません。", + "Toggle AI Chat read-only mode": "AIチャットの読み取り専用モードを切り替え", + "Title only": "タイトルのみ", + "you": "あなた", + "Allow public spaces": "公開スペースを許可", + "Space admins can publish their spaces to the web.": "スペース管理者は、自分のスペースをウェブに公開できるようになります。", + "Toggle allow public spaces": "公開スペースの許可を切り替える", + "Publish space to the web": "スペースをウェブに公開", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "インターネット上の誰でも、このスペース内の制限付きページを除くすべてのページを読めるようになります。よろしいですか?", + "Make this space publicly readable by anyone on the internet.": "このスペースをインターネット上の誰でも読めるようにします。", + "Toggle publish space to the web": "スペースのウェブ公開を切り替える", + "Allow search engines to index": "検索エンジンによるインデックスを許可", + "Let public pages in this space appear in search engine results.": "このスペース内の公開ページを検索エンジンの検索結果に表示できるようにします。", + "Toggle search engine indexing": "検索エンジンのインデックス登録を切り替える", + "Public space link": "公開スペースリンク", + "Copy public space link": "公開スペースリンクをコピー", + "Renaming the space slug will break public links.": "スペースのスラッグ名を変更すると公開リンクは使えなくなります。", + "Failed to update space": "スペースの更新に失敗しました", + "This space is public": "このスペースは公開されています", + "Anyone on the internet can read the pages in this space, except restricted pages.": "インターネット上の誰でも、このスペース内の制限付きページを除くページを読めます。", + "Open public site": "公開サイトを開く", + "Public": "公開", + "This space has no public pages yet.": "このスペースにはまだ公開ページがありません。", + "On this page": "このページ内", + "Previous": "前へ", + "Next": "次へ", + "Show hidden pages": "非表示のページを表示", + "Page navigation": "ページナビゲーション", + "Toggle sidebar": "サイドバーを切り替える", + "Toggle table of contents": "目次を切り替える", + "Appearance": "外観", + "Forest": "フォレスト", + "Violet": "バイオレット", + "Light mode color": "ライトモードの色", + "Dark mode color": "ダークモードの色", + "Choose the primary color of the public docs site.": "公開ドキュメントサイトのメインカラーを選択します。", + "Show page author": "ページ作成者を表示", + "Display the page creator's name on public pages.": "公開ページにページ作成者の名前を表示します。", + "Toggle show page author": "ページ作成者の表示を切り替える", + "Show last updated": "最終更新を表示", + "Display when each page was last updated.": "各ページが最後に更新された日時を表示します。", + "Toggle show last updated": "最終更新の表示を切り替える", + "Open public page": "公開ページを開く", + "Toggle color scheme": "カラースキームを切り替える", + "Ember": "アンバー", + "Rose": "ローズ", + "Documentation": "ドキュメント", + "All published spaces.": "公開されているすべてのスペース。", + "No public spaces yet.": "まだ公開スペースはありません。", + "Show public directory": "公開ディレクトリを表示", + "List published spaces at /docs for anyone to browse.": "/docs に公開されたスペースを一覧表示し、誰でも閲覧できるようにします。", + "Toggle show public directory": "公開ディレクトリの表示を切り替える", + "Show in public directory": "公開ディレクトリに表示", + "List this space in the public directory at /docs.": "このスペースを /docs の公開ディレクトリに一覧表示します。", + "Toggle show in public directory": "公開ディレクトリへの表示を切り替える", + "Open public space link": "公開スペースリンクを開く", + "Disable public spaces": "公開スペースを無効にする", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "スペース管理者は、自分のスペースをインターネット上の誰でも読めるように設定できるようになります。よろしいですか?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "これにより、公開されているすべてのスペースが直ちに非公開になります。後で再度有効にしても、再公開はされません。よろしいですか?", + "Allow": "許可", + "Shared pages": "共有ページ", + "Published spaces": "公開スペース", + "Spaces published to the web will appear here": "ウェブに公開されたスペースがここに表示されます", + "No published spaces": "公開スペースはありません", + "Published by": "公開者", + "Published at": "公開日時", + "Open space": "スペースを開く", + "Unpublish": "公開を停止", + "Unpublish space": "スペースの公開を停止", + "This space will no longer be publicly accessible. Are you sure?": "このスペースには今後公開アクセスできなくなります。よろしいですか?", + "More options for {{name}}": "{{name}} のその他のオプション", + "Edit page": "ページを編集", + "Sign in": "サインイン", + "Open app": "アプリを開く", + "No spaces match your search.": "検索に一致するスペースはありません。", + "Welcome to our documentation": "ドキュメントへようこそ", + "Guides, references and answers across all our published spaces.": "公開されているすべてのスペースにわたるガイド、リファレンス、回答。", + "Guides, references and answers across all our spaces.": "すべてのスペースにわたるガイド、リファレンス、回答。", + "Search documentation...": "ドキュメントを検索…", + "1 published space": "1 件の公開スペース", + "{{count}} published spaces": "{{count}} published spaces", + "Actions": "操作", + "Add destination": "宛先を追加", + "Are you sure you want to delete the destination": "この宛先を削除してもよろしいですか", + "Audit logs": "監査ログ", + "Audit logs & SIEM": "監査ログと SIEM", + "Auth header name": "認証ヘッダー名", + "Auth header prefix": "認証ヘッダープレフィックス", + "Body format": "本文形式", + "Created SIEM destination": "SIEM 宛先を作成しました", + "Datadog site": "Datadog サイト", + "Defaults to this instance's hostname": "デフォルトではこのインスタンスのホスト名が使用されます", + "Delete destination": "宛先を削除", + "Deleted SIEM destination": "SIEM 宛先を削除しました", + "Destination created": "宛先を作成しました", + "Destination deleted": "宛先を削除しました", + "Destination updated": "宛先を更新しました", + "Disabled": "無効", + "Edit destination": "宛先を編集", + "Endpoint URL": "エンドポイント URL", + "Failing": "障害発生中", + "Failing since {{time}}": "{{time}} から障害発生中", + "HEC token": "HEC トークン", + "HEC URL": "HEC URL", + "Healthy": "正常", + "Hide advanced options": "詳細オプションを隠す", + "Host": "ホスト", + "Index": "インデックス", + "Insecure: connections can be intercepted.": "安全ではありません: 接続が傍受される可能性があります。", + "JSON array": "JSON 配列", + "Last delivered": "最終配信", + "Last error": "最後のエラー", + "Leave empty to use the token's default index": "トークンのデフォルトインデックスを使用するには空欄のままにしてください", + "Maximum of {{limit}} destinations reached": "宛先は最大 {{limit}} 件までです", + "Could not load SIEM destinations: {{message}}": "SIEM 宛先を読み込めませんでした: {{message}}", + "No destinations yet": "宛先はまだありません", + "Preset": "プリセット", + "Retry now": "今すぐ再試行", + "Retry scheduled": "再試行予定", + "Send test event": "テストイベントを送信", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "以下の認証ヘッダーで送信されます。受信側で不要な場合は空欄のままにしてください。", + "Service": "サービス", + "Show advanced options": "詳細オプションを表示", + "SIEM": "SIEM", + "SIEM streaming": "SIEM ストリーミング", + "SIEM streaming requires an Enterprise license.": "SIEM ストリーミングにはエンタープライズライセンスが必要です。", + "Source": "ソース", + "Sourcetype": "ソースタイプ", + "Tags": "タグ", + "Test connection": "接続をテスト", + "Test event delivered successfully.": "テストイベントは正常に配信されました。", + "Test the connection before saving.": "保存する前に接続をテストしてください。", + "Test event delivered to {{name}}": "テストイベントを {{name}} に配信しました", + "Updated SIEM destination": "SIEM 宛先を更新しました", + "Verify TLS certificate": "TLS 証明書を検証", + "e.g. Splunk prod": "例: Splunk 本番" +} diff --git a/apps/client/public/locales/ko-KR/translation.json b/apps/client/public/locales/ko-KR/translation.json new file mode 100644 index 0000000..02630f6 --- /dev/null +++ b/apps/client/public/locales/ko-KR/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "계정", + "Active": "활성", + "Add": "추가", + "Add group members": "그룹에 멤버 추가", + "Add groups": "그룹 추가", + "Add members": "사용자 추가", + "Add to groups": "그룹에 추가", + "Add space members": "스페이스에 사용자 추가", + "Add to favorites": "즐겨찾기에 추가", + "Admin": "관리자", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "이 그룹을 삭제하시겠습니까? 그룹 멤버는 이 그룹이 가진 모든 권한을 잃게 됩니다.", + "Are you sure you want to delete this page?": "이 페이지를 삭제하시겠습니까?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "이 사용자를 그룹에서 제거하시겠습니까? 사용자는 이 그룹이 가진 모든 권한을 잃게 됩니다.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "이 사용자를 스페이스에서 제거하시겠습니까? 사용자는 이 스페이스에 대한 모든 접근 권한을 잃게 됩니다.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "이 버전으로 복원하시겠습니까? 저장되지 않은 모든 변경사항이 손실됩니다.", + "Can become members of groups and spaces in workspace": "워크스페이스의 그룹 및 스페이스의 멤버가 될 수 있음", + "Can create and edit pages in space.": "스페이스에서 페이지를 생성하고 편집할 수 있습니다.", + "Can edit": "편집할 수 있음", + "Can manage workspace": "워크스페이스를 관리할 수 있음", + "Can manage workspace but cannot delete it": "워크스페이스를 관리할 수 있지만, 삭제는 할 수 없음", + "Can view": "볼 수 있음", + "Can view pages in space but not edit.": "스페이스의 페이지를 볼 수 있지만, 편집은 할 수 없음.", + "Cancel": "취소", + "Change email": "이메일 변경", + "Change password": "비밀번호 변경", + "Change photo": "사진 변경", + "Choose a role": "역할 선택", + "Choose your preferred color scheme.": "선호하는 배경 색을 선택하세요.", + "Choose your preferred interface language.": "선호하는 인터페이스 언어를 선택하세요.", + "Choose your preferred page width.": "선호하는 페이지 너비를 선택하세요.", + "Confirm": "확인", + "Copy as Markdown": "Markdown으로 복사", + "Copy link": "링크 복사", + "Create": "생성", + "Create group": "그룹 생성", + "Create page": "페이지 생성", + "Create space": "스페이스 생성", + "Create workspace": "워크스페이스 생성", + "Current password": "현재 비밀번호", + "Dark": "어두운", + "Date": "날짜", + "Delete": "삭제", + "Remove from page": "페이지에서 제거", + "Base options": "베이스 옵션", + "Delete group": "그룹 삭제", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "이 페이지를 삭제하시겠습니까? 하위 페이지와 페이지 기록이 모두 삭제됩니다. 이 작업은 되돌릴 수 없습니다.", + "Description": "설명", + "Details": "세부사항", + "e.g ACME": "예: ACME", + "e.g ACME Inc": "예: ACME Inc", + "e.g Developers": "예: 개발자", + "e.g Group for developers": "예: 개발자를 위한 그룹", + "e.g product": "예: 제품", + "e.g Product Team": "예: 제품 팀", + "e.g Sales": "예: 영업", + "e.g Space for product team": "예: 제품 팀용 스페이스", + "e.g Space for sales team to collaborate": "예: 영업 팀이 협업하는 스페이스", + "Edit": "편집", + "Read": "읽기", + "Edit group": "그룹 편집", + "Email": "이메일", + "Enter a strong password": "강력한 비밀번호를 입력하세요", + "Enter valid email addresses separated by comma or space max_50": "유효한 이메일 주소를 쉼표나 공백으로 구분하여 입력하세요 [최대: 50]", + "enter valid emails addresses": "유효한 이메일 주소를 입력하세요", + "Enter your current password": "기존 비밀번호를 입력하세요", + "enter your full name": "성명을 입력하세요", + "Enter your new password": "새 비밀번호를 입력하세요", + "Enter your new preferred email": "새로운 이메일을 입력하세요", + "Enter your password": "비밀번호를 입력하세요", + "Error fetching page data.": "페이지 데이터 불러오기 오류.", + "Error loading page history.": "페이지 기록 불러오기 오류.", + "Export": "내보내기", + "Failed to create page": "페이지 생성 실패", + "Failed to delete page": "페이지 삭제 실패", + "Failed to restore page": "페이지를 복원하지 못했습니다", + "Failed to fetch recent pages": "최근 페이지 불러오기 실패", + "Failed to import pages": "페이지 가져오기 실패", + "Failed to load page. An error occurred.": "페이지 불러오기 실패. 오류가 발생했습니다.", + "Failed to update data": "데이터 갱신 실패", + "Failed to create base": "베이스를 만들지 못했습니다", + "Failed to update base": "베이스를 업데이트하지 못했습니다", + "Failed to delete base": "베이스를 삭제하지 못했습니다", + "Failed to create property": "속성을 만들지 못했습니다", + "Failed to update property": "속성을 업데이트하지 못했습니다", + "Failed to delete property": "속성을 삭제하지 못했습니다", + "Failed to reorder property": "속성 순서를 변경하지 못했습니다", + "Failed to create view": "보기를 만들지 못했습니다", + "Failed to update view": "보기를 업데이트하지 못했습니다", + "Failed to delete view": "보기를 삭제하지 못했습니다", + "Failed to create row": "행을 만들지 못했습니다", + "Failed to update row": "행을 업데이트하지 못했습니다", + "Failed to delete row": "행을 삭제하지 못했습니다", + "Failed to delete rows": "행을 삭제하지 못했습니다", + "Failed to reorder row": "행 순서를 변경하지 못했습니다", + "Failed to move card": "카드를 이동하지 못했습니다", + "Failed to add card": "카드를 추가하지 못했습니다", + "Failed to export CSV": "CSV를 내보내지 못했습니다", + "Favorite spaces": "즐겨찾는 스페이스", + "Favorite spaces appear here": "즐겨찾는 스페이스가 여기에 표시됩니다", + "Favorites": "즐겨찾기", + "Full access": "전체 권한", + "Full page width": "전체 페이지 너비", + "Full width": "전체 너비", + "General": "일반", + "Group": "그룹", + "Group description": "그룹 설명", + "Group name": "그룹 이름", + "Groups": "그룹", + "Has full access to space settings and pages.": "스페이스 설정과 페이지에 대한 전체 접근 권한이 있습니다.", + "Home": "홈", + "Import pages": "페이지 가져오기", + "Import pages & space settings": "페이지 및 스페이스 설정 가져오기", + "Importing pages": "페이지 가져오는 중", + "invalid invitation link": "유효하지 않은 초대 링크입니다", + "Invitation signup": "초대 가입", + "Invite by email": "이메일로 초대", + "Invite members": "사용자 초대", + "Invite new members": "새 사용자 초대", + "Invite People": "사용자 초대", + "Invited members who are yet to accept their invitation will appear here.": "초대를 아직 수락하지 않은 초대된 사용자가 여기에 표시됩니다.", + "Invited members will be granted access to spaces the groups can access": "초대된 멤버에게는 그룹이 접근할 수 있는 스페이스에 대한 액세스 권한이 부여됩니다", + "Join the workspace": "워크스페이스 참여", + "Language": "언어", + "Light": "밝은", + "Link copied": "링크 복사됨", + "Login": "로그인", + "Logout": "로그아웃", + "Manage Group": "그룹 관리", + "Manage members": "사용자 관리", + "member": "사용자", + "Member": "사용자", + "members": "사용자들", + "Members": "사용자들", + "My preferences": "내 설정", + "My Profile": "내 프로필", + "My profile": "내 프로필", + "Name": "이름", + "New email": "새 이메일", + "New page": "새 페이지", + "New password": "새 비밀번호", + "No group found": "그룹을 찾을 수 없음", + "No page history saved yet.": "아직 저장된 페이지 기록이 없습니다.", + "No pages yet": "아직 페이지가 없습니다", + "No shared pages": "공유된 페이지가 없습니다.", + "No results found...": "결과를 찾을 수 없습니다...", + "No user found": "사용자를 찾을 수 없음", + "Overview": "개요", + "Owner": "소유자", + "page": "페이지", + "Page deleted successfully": "페이지 삭제됨", + "Page history": "페이지 기록", + "Select version": "버전 선택", + "Highlight changes": "변경 사항 강조", + "Page import is in progress. Please do not close this tab.": "페이지 가져오기가 진행 중입니다. 이 탭을 닫지 마세요.", + "Pages": "페이지", + "pages": "페이지", + "Password": "비밀번호", + "Password changed successfully": "비밀번호 변경됨", + "People": "사용자", + "Pending": "대기 중", + "Please confirm your action": "작업을 확인해 주세요", + "Preferences": "설정", + "Print PDF": "PDF로 인쇄", + "Profile": "프로필", + "Recently updated": "최근 업데이트", + "Remove": "제거", + "Remove from favorites": "즐겨찾기에서 제거", + "Remove group member": "그룹 멤버 제거", + "Remove space member": "스페이스에서 사용자 제거", + "Restore": "복원", + "Role": "역할", + "Save": "저장", + "Search": "검색", + "Search for groups": "그룹 검색", + "Search for users": "사용자 검색", + "Search for users and groups": "사용자 및 그룹 검색", + "Search...": "검색...", + "Select language": "언어 선택", + "Select role": "역할 선택", + "Select role to assign to all invited members": "초대된 모든 멤버에게 할당할 역할을 선택하세요", + "Select theme": "테마 선택", + "Send invitation": "초대 보내기", + "Invitation sent": "초대를 보냈습니다", + "Settings": "설정", + "Setup workspace": "워크스페이스 설정", + "Sign In": "로그인", + "Sign Up": "회원가입", + "Slug": "슬러그", + "Space": "스페이스", + "Space description": "스페이스 설명", + "Space menu": "스페이스 메뉴", + "Space name": "스페이스 이름", + "Space settings": "스페이스 설정", + "Space slug": "스페이스 슬러그", + "Spaces": "스페이스", + "Spaces you belong to": "내가 속한 스페이스", + "No space found": "스페이스를 찾을 수 없습니다", + "Search for spaces": "스페이스 검색", + "Start typing to search...": "검색하려면 입력을 시작하세요...", + "Status": "상태", + "Successfully imported": "가져오기 완료", + "Successfully restored": "복원 완료", + "System settings": "시스템 설정", + "Templates": "템플릿", + "Theme": "테마", + "To change your email, you have to enter your password and new email.": "이메일을 변경하려면 기존 비밀번호와 새 이메일을 입력해야 합니다.", + "Toggle full page width": "전체 페이지 너비 전환", + "Unable to import pages. Please try again.": "페이지를 가져올 수 없습니다. 다시 시도해주세요.", + "untitled": "제목 없음", + "Untitled": "제목 없음", + "Updated successfully": "업데이트 완료", + "User": "사용자", + "Workspace": "워크스페이스", + "Workspace Name": "워크스페이스 이름", + "Workspace settings": "워크스페이스 설정", + "You can change your password here.": "여기서 비밀번호를 변경할 수 있습니다.", + "Your Email": "이메일", + "Your import is complete.": "가져오기가 완료되었습니다.", + "Your name": "이름", + "Your Name": "이름", + "Your password": "비밀번호", + "Your password must be a minimum of 8 characters.": "비밀번호는 최소 8자 이상이어야 합니다.", + "Sidebar toggle": "사이드바 전환", + "Comments": "댓글", + "404 page not found": "404 페이지를 찾을 수 없습니다", + "Sorry, we can't find the page you are looking for.": "죄송합니다. 페이지를 찾을 수 없습니다.", + "Take me back to homepage": "홈페이지로 돌아가기", + "Forgot password": "비밀번호를 잊으셨나요", + "Forgot your password?": "비밀번호를 잊으셨나요?", + "A password reset link has been sent to your email. Please check your inbox.": "비밀번호 재설정 링크가 이메일로 전송되었습니다. 받은 편지함을 확인해주세요.", + "Send reset link": "재설정 링크 보내기", + "Password reset": "비밀번호 재설정", + "Your new password": "새 비밀번호", + "Set password": "비밀번호 설정", + "Write a comment": "댓글 작성", + "Reply...": "답글...", + "Error loading comments.": "댓글 불러오기 오류.", + "No comments yet.": "아직 댓글이 없습니다.", + "No open comments.": "열린 댓글이 없습니다.", + "No resolved comments.": "해결된 댓글이 없습니다.", + "Add a comment...": "댓글 추가...", + "Edit comment": "댓글 수정", + "Delete comment": "댓글 삭제", + "Are you sure you want to delete this comment?": "이 댓글을 삭제하시겠습니까?", + "Delete chat": "채팅 삭제", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "'{{title}}'을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "Comment created successfully": "댓글 생성됨", + "Error creating comment": "댓글 생성 오류", + "Comment updated successfully": "댓글 업데이트됨", + "Failed to update comment": "댓글 업데이트 실패", + "Comment deleted successfully": "댓글 삭제됨", + "Failed to delete comment": "댓글 삭제 실패", + "Comment resolved successfully": "댓글이 해결로 표시됨", + "Comment re-opened successfully": "댓글이 열린 상태로 표시됨", + "Comment unresolved successfully": "댓글이 미해결로 표시됨", + "Failed to resolve comment": "댓글 처리 실패", + "Resolve comment": "댓글 해결", + "Unresolve comment": "댓글 해결 취소", + "Resolve Comment Thread": "댓글 스레드 해결", + "Unresolve Comment Thread": "댓글 스레드 해결 취소", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "이 댓글 스레드를 해결하시겠습니까? 완료로 표시됩니다.", + "Are you sure you want to unresolve this comment thread?": "이 댓글 스레드를 미해결로 변경하시겠습니까?", + "Resolved": "해결됨", + "No active comments.": "활성 댓글이 없습니다.", + "Revoke invitation": "초대 폐기", + "Revoke": "폐기", + "Don't": "하지 않음", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "이 초대를 폐기하시겠습니까? 사용자가 워크스페이스에 참여할 수 없게 됩니다.", + "Resend invitation": "초대 재전송", + "Anyone with this link can join this workspace.": "이 링크를 가진 모든 사용자가 이 워크스페이스에 참여할 수 있습니다.", + "Invite link": "초대 링크", + "Copy": "복사", + "Copy to space": "스페이스로 복사", + "Copied": "복사됨", + "Duplicate": "복제", + "Select a user": "사용자 선택", + "Select a group": "그룹 선택", + "Export all pages and attachments in this space.": "이 스페이스의 모든 페이지와 첨부 파일을 내보냅니다.", + "Delete space": "스페이스 삭제", + "Are you sure you want to delete this space?": "이 스페이스를 삭제하시겠습니까?", + "Delete this space with all its pages and data.": "이 스페이스의 모든 페이지와 데이터를 삭제합니다.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "이 스페이스의 모든 페이지, 댓글, 첨부 파일 및 권한이 영구적으로 삭제됩니다.", + "Confirm space name": "스페이스 이름 확인", + "Type the space name {{spaceName}} to confirm your action.": "작업을 진행하려면 스페이스 이름 {{spaceName}}을(를) 입력하세요.", + "Format": "형식", + "Include subpages": "하위 페이지 포함", + "Include attachments": "첨부 파일 포함", + "Select export format": "내보내기 형식 선택", + "Export failed:": "내보내기 실패:", + "export error": "내보내기 오류", + "Export page": "페이지 내보내기", + "Export successful": "내보내기 완료", + "Export space": "스페이스 내보내기", + "Export {{type}}": "{{type}} 내보내기", + "File exceeds the {{limit}} attachment limit": "첨부 파일 크기 제한 {{limit}}을 초과했습니다", + "Media": "미디어", + "Align left": "왼쪽 정렬", + "Align right": "오른쪽 정렬", + "Align center": "가운데 정렬", + "Alt text": "대체 텍스트", + "Describe this for accessibility.": "접근성을 위해 이를 설명하세요.", + "Add a description": "설명 추가", + "Justify": "양쪽 정렬", + "Merge cells": "셀 병합", + "Split cell": "셀 분할", + "Delete column": "열 삭제", + "Delete row": "행 삭제", + "Add left column": "왼쪽 열 추가", + "Add right column": "오른쪽 열 추가", + "Add row above": "위에 행 추가", + "Add row below": "아래에 행 추가", + "Delete table": "테이블 삭제", + "Add column left": "왼쪽에 열 추가", + "Add column right": "오른쪽에 열 추가", + "Clear cell": "셀 지우기", + "Clear cells": "셀 지우기", + "Toggle header cell": "헤더 셀 전환", + "Toggle header column": "헤더 열 전환", + "Toggle header row": "헤더 행 전환", + "Move column left": "열 왼쪽으로 이동", + "Move column right": "열 오른쪽으로 이동", + "Move row down": "행 아래로 이동", + "Move row up": "행 위로 이동", + "Sort A → Z": "A → Z 정렬", + "Sort Z → A": "Z → A 정렬", + "Info": "정보", + "Note": "참고", + "Success": "완료", + "Warning": "주의", + "Danger": "위험", + "Mermaid diagram error:": "Mermaid diagram 오류:", + "Invalid Mermaid diagram": "잘못된 Mermaid diagram", + "Double-click to edit Draw.io diagram": "Draw.io diagram을 편집하려면 더블 클릭하세요", + "Exit": "나가기", + "Save & Exit": "저장 후 나가기", + "Double-click to edit Excalidraw diagram": "Excalidraw diagram을 편집하려면 더블 클릭하세요", + "Paste link": "링크 붙여넣기", + "Paste link or search pages": "링크를 붙여넣거나 페이지를 검색", + "Link to web page": "웹페이지에 링크하기", + "Recents": "최근 항목", + "Page or URL": "페이지 또는 URL", + "Link title": "링크 제목", + "Edit link": "링크 수정", + "Remove link": "링크 제거", + "Add link": "링크 추가", + "Please enter a valid url": "유효한 URL을 입력하세요", + "Empty equation": "빈 수식", + "Invalid equation": "잘못된 수식", + "Color": "색상", + "Text color": "텍스트 색상", + "Default": "기본값", + "Blue": "파란색", + "Green": "초록색", + "Purple": "보라색", + "Red": "빨간색", + "Yellow": "노란색", + "Orange": "주황색", + "Pink": "분홍색", + "Gray": "회색", + "Embed link": "임베드 링크", + "Invalid {{provider}} embed link": "유효하지 않은 {{provider}} 임베드 링크입니다", + "Embed {{provider}}": "{{provider}} 임베드", + "Enter {{provider}} link to embed": "임베드를 할 {{provider}} 링크 입력", + "Bold": "굵게", + "Italic": "기울임", + "Underline": "밑줄", + "Strike": "취소선", + "Code": "코드", + "Comment": "댓글", + "Text": "텍스트", + "Heading 1": "제목 1", + "Heading 2": "제목 2", + "Heading 3": "제목 3", + "To-do List": "할 일 목록", + "Bullet List": "글머리 표", + "Numbered List": "문단 번호", + "Blockquote": "인용구", + "Just start typing with plain text.": "일반 텍스트로 입력을 시작하세요.", + "Track tasks with a to-do list.": "할 일 목록으로 작업을 정리하세요.", + "Big section heading.": "대제목.", + "Medium section heading.": "중제목.", + "Small section heading.": "소제목.", + "Create a simple bullet list.": "글머리 기호 만들기.", + "Create a list with numbering.": "숫자 목록 만들기.", + "Create block quote.": "인용구 만들기.", + "Insert code snippet.": "코드 블록 삽입.", + "Insert horizontal rule divider": "가로 구분선 삽입", + "Page break": "페이지 나누기", + "Insert a page break for printing.": "인쇄용 페이지 나누기를 삽입합니다.", + "Footnote": "각주", + "Insert a footnote reference.": "각주 참조를 삽입합니다.", + "Upload any image from your device.": "기기에서 이미지를 업로드하세요.", + "Upload any video from your device.": "기기에서 비디오를 업로드하세요.", + "Upload any audio from your device.": "기기에서 오디오를 업로드하세요.", + "Upload any file from your device.": "기기에서 파일을 업로드하세요.", + "Uploading {{name}}": "{{name}} 업로드 중", + "Uploading file": "파일 업로드 중", + "Table": "표", + "Insert a table.": "테이블 삽입.", + "Insert collapsible block.": "접을 수 있는 블록 삽입.", + "Video": "동영상", + "Divider": "구분선", + "Quote": "인용문", + "Image": "이미지", + "Audio": "오디오", + "Embed PDF": "PDF 임베드", + "Upload and embed a PDF file.": "PDF 파일을 업로드하고 임베드하세요.", + "Embed as PDF": "PDF로 임베드", + "Failed to load PDF": "PDF 로드 실패", + "Convert to attachment": "첨부 파일로 변환", + "File attachment": "파일 첨부", + "Toggle block": "토글 블록", + "Callout": "콜아웃", + "Insert callout notice.": "돋보이는 글을 작성하기.", + "Math inline": "인라인 수식", + "Insert inline math equation.": "수식 삽입.", + "Math block": "수식 블록", + "Insert math equation": "수식 삽입", + "Mermaid diagram": "Mermaid 다이어그램", + "Insert mermaid diagram": "Mermaid 다이어그램 삽입", + "Insert and design Drawio diagrams": "Drawio 다이어그램 삽입 및 편집", + "Insert current date": "현재 날짜 삽입", + "Time": "시간", + "Insert current time": "현재 시간 삽입", + "Draw and sketch excalidraw diagrams": "Excalidraw 다이어그램 그리기 및 스케치", + "Multiple": "다중", + "Turn into": "변경하기", + "Text align": "텍스트 정렬", + "This page may have been deleted, moved, or you may not have access.": "이 페이지는 삭제되었거나 이동되었거나 접근 권한이 없을 수 있습니다.", + "Go to homepage": "홈으로 이동", + "Pages you create will show up here.": "여기에 생성한 페이지가 표시됩니다.", + "Heading {{level}}": "제목 {{level}}", + "Toggle title": "토글 제목", + "Write anything. Enter \"/\" for commands": "무엇이든 입력하세요. 명령어를 사용하려면 \"/\"를 입력하세요", + "Write...": "작성...", + "Column count": "열 개수", + "{{count}} Columns": "{{count}}열", + "{{count}} command available_one": "사용 가능한 명령 1개", + "{{count}} command available_other": "사용 가능한 명령 {{count}}개", + "{{count}} result available_one": "사용 가능한 결과 1개", + "{{count}} result available_other": "사용 가능한 결과 {{count}}개", + "Equal columns": "열 너비 균등", + "Left sidebar": "왼쪽 사이드바", + "Right sidebar": "오른쪽 사이드바", + "Wide center": "가운데 넓게", + "Left wide": "왼쪽 넓게", + "Right wide": "오른쪽 넓게", + "Names do not match": "이름이 일치하지 않습니다", + "Today, {{time}}": "오늘, {{time}}", + "Yesterday, {{time}}": "어제, {{time}}", + "now": "지금", + "Space created successfully": "스페이스 생성됨", + "Space updated successfully": "스페이스 업데이트됨", + "Space deleted successfully": "스페이스 삭제됨", + "Members added successfully": "멤버 추가됨", + "Member removed successfully": "멤버 삭제됨", + "Member role updated successfully": "멤버 역할 업데이트됨", + "Created by: {{creatorName}}": "작성자: {{creatorName}}", + "Created at: {{time}}": "작성 시간: {{time}}", + "Edited by {{name}} {{time}}": "{{name}}님이 {{time}}에 편집함", + "Word count: {{wordCount}}": "단어 수: {{wordCount}}", + "Character count: {{characterCount}}": "문자 수: {{characterCount}}", + "New update": "새 업데이트", + "{{latestVersion}} is available": "{{latestVersion}} 버전을 사용할 수 있습니다", + "Default page edit mode": "기본 페이지 편집 모드", + "Choose your preferred page edit mode. Avoid accidental edits.": "선호하는 페이지 편집 모드를 선택하세요. 실수로 인한 편집을 방지하세요.", + "Choose {{format}} file": "{{format}} 파일 선택", + "Reading": "읽기", + "Delete member": "멤버 삭제", + "Member deleted successfully": "멤버 삭제됨", + "Are you sure you want to delete this workspace member? This action is irreversible.": "이 워크스페이스 멤버를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "Deactivate member": "멤버 비활성화", + "Activate member": "멤버 활성화", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "이 워크스페이스 멤버를 비활성화하시겠습니까? 해당 사용자는 더 이상 이 워크스페이스에 접근할 수 없습니다.", + "Are you sure you want to activate this workspace member?": "이 워크스페이스 멤버를 활성화하시겠습니까?", + "Deactivate": "비활성화", + "Activate": "활성화", + "Deactivated": "비활성화됨", + "Move": "이동", + "Move page": "페이지 이동", + "Move page to a different space.": "페이지를 다른 공간으로 이동합니다.", + "Real-time editor connection lost. Retrying...": "실시간 편집기 연결이 끊어졌습니다. 재시도 중...", + "Table of contents": "목차", + "Add headings (H1, H2, H3) to generate a table of contents.": "목차를 생성하려면 제목 (H1, H2, H3)을 추가하세요.", + "Share": "공유", + "Public sharing": "공개 공유", + "Shared by": "공유한 사람", + "Shared at": "공유 시간", + "Inherits public sharing from": "다음으로부터 공개 공유를 상속받음", + "Share to web": "웹에 공유", + "Shared to web": "웹에 공유됨", + "Anyone with the link can view this page": "링크가 있는 누구나 이 페이지를 볼 수 있습니다", + "Make this page publicly accessible": "이 페이지를 공개적으로 접근 가능하게 설정", + "Include sub-pages": "하위 페이지 포함", + "Make sub-pages public too": "하위 페이지도 공개로 설정", + "Allow search engines to index page": "검색 엔진이 페이지를 색인하도록 허용", + "Open page": "페이지 열기", + "Page": "페이지", + "Delete public share link": "공개 공유 링크 삭제", + "Delete share": "공유 삭제", + "Are you sure you want to delete this shared link?": "이 공유 링크를 삭제하시겠습니까?", + "Publicly shared pages from spaces you are a member of will appear here": "회원으로 속한 스페이스의 공개 공유 페이지가 여기에 표시됩니다", + "Share deleted successfully": "공유 삭제됨", + "Share not found": "공유를 찾을 수 없습니다", + "Failed to share page": "페이지 공유에 실패했습니다", + "Disable public sharing": "공개 공유 비활성화", + "Prevent members from sharing pages publicly.": "멤버가 페이지를 공개적으로 공유하지 못하게 합니다.", + "Toggle public sharing": "공개 공유 전환", + "Toggle space public sharing": "스페이스 공개 공유 전환", + "Allow viewers to comment": "뷰어가 댓글을 달 수 있도록 허용", + "Allow viewers to add comments on pages in this space.": "이 공간 내 페이지에 뷰어가 댓글을 추가할 수 있도록 허용합니다.", + "Toggle viewer comments": "뷰어 댓글 전환", + "Public sharing is disabled at the workspace level": "공개 공유가 워크스페이스 수준에서 비활성화됨", + "Prevent pages in this space from being shared publicly.": "이 스페이스의 페이지가 공개 공유되지 않도록 합니다.", + "Page permissions": "페이지 권한", + "Control who can view and edit individual pages. Available with an enterprise license.": "개별 페이지의 조회 및 편집 권한을 제어합니다. 엔터프라이즈 라이선스에서 이용 가능합니다.", + "Enable public sharing": "공개 공유 활성화", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "공개 공유를 활성화하시겠습니까? 멤버가 페이지를 공개적으로 공유할 수 있게 됩니다.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "공개 공유를 비활성화하시겠습니까? 이 워크스페이스의 기존 공유 링크가 모두 삭제됩니다.", + "Are you sure you want to enable public sharing for this space?": "이 스페이스에 대해 공개 공유를 활성화하시겠습니까?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "공개 공유를 비활성화하시겠습니까? 이 스페이스의 기존 공유 링크가 모두 삭제됩니다.", + "Public sharing is disabled": "공개 공유가 비활성화됨", + "Public sharing has been disabled at the workspace level.": "공개 공유가 워크스페이스 수준에서 비활성화되었습니다.", + "Public sharing has been disabled for this space.": "이 스페이스의 공개 공유가 비활성화되었습니다.", + "Copy page": "페이지 복사", + "Copy page to a different space.": "다른 공간으로 페이지 복사하기.", + "Page copied successfully": "페이지 복사됨", + "Page duplicated successfully": "페이지 복제됨", + "Find": "찾기", + "Not found": "찾을 수 없음", + "Previous Match (Shift+Enter)": "이전 일치 항목 (Shift+Enter)", + "Next match (Enter)": "다음 일치 항목 (Enter)", + "Match case (Alt+C)": "대소문자 구분 (Alt+C)", + "Replace": "바꾸기", + "Close (Escape)": "닫기 (Escape)", + "Replace (Enter)": "바꾸기 (Enter)", + "Replace all (Ctrl+Alt+Enter)": "모두 바꾸기 (Ctrl+Alt+Enter)", + "Replace all": "모두 바꾸기", + "View all": "모두 보기", + "View all spaces": "모든 스페이스 보기", + "Error": "오류", + "Failed to disable MFA": "MFA 비활성화에 실패했습니다", + "Disable two-factor authentication": "2단계 인증 비활성화", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "2단계 인증을 비활성화하면 계정의 보안이 낮아집니다. 로그인 시 비밀번호만 필요하게 됩니다.", + "Please enter your password to disable two-factor authentication:": "2단계 인증 비활성화를 위해 비밀번호를 입력하세요:", + "Two-factor authentication has been enabled": "2단계 인증이 활성화됨", + "Two-factor authentication has been disabled": "2단계 인증이 비활성화됨", + "2-step verification": "2단계 인증", + "Protect your account with an additional verification layer when signing in.": "로그인 시 추가 인증 단계를 통해 계정을 보호하세요.", + "Two-factor authentication is active on your account.": "2단계 인증이 계정에 활성화되어 있습니다.", + "Add 2FA method": "2FA 방법 추가", + "Backup codes": "백업 코드", + "Disable": "비활성화", + "Invalid verification code": "유효하지 않은 인증 코드입니다", + "New backup codes have been generated": "새 백업 코드가 생성되었습니다", + "Failed to regenerate backup codes": "백업 코드 재생성에 실패했습니다", + "About backup codes": "백업 코드 정보", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "인증 앱에 접근할 수 없게 된 경우, 백업 코드를 사용하여 계정에 접근할 수 있습니다. 각 코드는 한 번만 사용할 수 있습니다.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "언제든지 새 백업 코드를 재생성할 수 있습니다. 이 작업은 기존 모든 코드를 무효화합니다.", + "Confirm password": "비밀번호 확인", + "Generate new backup codes": "새 백업 코드 생성", + "Save your new backup codes": "새 백업 코드를 저장하세요", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "이 코드를 안전한 장소에 저장하세요. 이전 백업 코드는 더 이상 유효하지 않습니다.", + "Your new backup codes": "새 백업 코드", + "I've saved my backup codes": "백업 코드를 저장했습니다", + "Failed to setup MFA": "MFA 설정에 실패했습니다", + "Setup & Verify": "설정 및 확인", + "Add to authenticator": "인증 앱에 추가", + "1. Scan this QR code with your authenticator app": "1. 인증 앱으로 이 QR 코드를 스캔하세요", + "Can't scan the code?": "코드를 스캔할 수 없습니까?", + "Enter this code manually in your authenticator app:": "이 코드를 인증앱에 수동으로 입력해 주세요:", + "2. Enter the 6-digit code from your authenticator": "2. 인증 앱에 표시된 6자리 코드를 입력하세요", + "Verify and enable": "확인 후 활성화", + "Failed to generate QR code. Please try again.": "QR 코드 생성 실패. 다시 시도해 주세요.", + "Backup": "백업", + "Save codes": "코드 저장", + "Save your backup codes": "백업 코드를 저장하세요", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "인증 앱에 대한 접근 권한을 잃은 경우, 이 코드를 사용하여 귀하의 계정에 접근할 수 있습니다. 각 코드는 한 번만 사용할 수 있습니다.", + "Print": "인쇄", + "Two-factor authentication has been set up. Please log in again.": "2단계 인증이 설정되었습니다. 다시 로그인해 주세요.", + "Two-Factor authentication required": "2단계 인증 필요", + "Your workspace requires two-factor authentication for all users": "이 워크스페이스는 모든 사용자에게 2단계 인증을 요구합니다", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "워크스페이스에 계속 액세스하려면 2단계 인증을 설정해야 합니다. 이는 계정의 보안을 한층 강화합니다.", + "Set up two-factor authentication": "2단계 인증 설정", + "Cancel and logout": "취소하고 로그아웃", + "Your workspace requires two-factor authentication. Please set it up to continue.": "워크스페이스에서는 2단계 인증이 필요합니다. 계속하려면 설정해 주세요.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "인증앱에서 얻은 인증 코드를 요구하여 계정의 보안에 추가적인 계층을 추가합니다.", + "Password is required": "비밀번호는 필수입니다", + "Password must be at least 8 characters": "비밀번호는 8자 이상이어야 합니다", + "Please enter a 6-digit code": "6자리 코드를 입력하세요", + "Code must be exactly 6 digits": "코드는 정확히 6자리여야 합니다", + "Enter the 6-digit code found in your authenticator app": "인증 앱에 표시된 6자리 코드를 입력하세요", + "Need help authenticating?": "인증에 도움이 필요하십니까?", + "MFA QR Code": "MFA QR 코드", + "Account created successfully. Please log in to set up two-factor authentication.": "계정 생성됨. 2단계 인증을 설정하려면 로그인해 주세요.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "비밀번호 재설정됨. 새 비밀번호로 로그인하여 2단계 인증을 완료하세요.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "비밀번호 재설정됨. 새 비밀번호로 로그인하여 2단계 인증을 설정하세요.", + "Password reset was successful. Please log in with your new password.": "비밀번호 재설정됨. 새 비밀번호로 로그인하세요.", + "Two-factor authentication": "2단계 인증", + "Use authenticator app instead": "대신 인증 앱 사용", + "Verify backup code": "백업 코드 확인", + "Use backup code": "백업 코드 사용", + "Enter one of your backup codes": "백업 코드 중 하나를 입력하세요", + "Backup code": "백업 코드", + "Enter one of your backup codes. Each backup code can only be used once.": "백업 코드 중 하나를 입력하세요. 각 백업 코드는 한 번만 사용할 수 있습니다.", + "Verify": "확인", + "Trash": "휴지통", + "Pages in trash will be permanently deleted after {{count}} days.": "휴지통의 페이지는 {{count}}일 후 영구적으로 삭제됩니다.", + "Deleted": "삭제됨", + "No pages in trash": "휴지통에 페이지가 없습니다", + "Permanently delete page?": "페이지를 영구적으로 삭제하시겠습니까?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "'{{title}}'을(를) 영구적으로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "Restore '{{title}}' and its sub-pages?": "'{{title}}' 및 하위 페이지를 복구하시겠습니까?", + "Move to trash": "휴지통으로 이동", + "Move this page to trash?": "이 페이지를 휴지통으로 이동하시겠습니까?", + "Restore page": "페이지 복원", + "Permanently delete": "영구 삭제", + "{{name}} moved this page to Trash {{time}}.": "{{name}}님이 {{time}}에 이 페이지를 휴지통으로 이동했습니다.", + "Page moved to trash": "페이지가 휴지통으로 이동되었습니다", + "Page restored successfully": "페이지 복원됨", + "Deleted by": "삭제한 사람", + "Deleted at": "삭제 시간", + "Preview": "미리보기", + "Base preview unavailable": "베이스 미리보기를 사용할 수 없음", + "Restore this base to view its contents.": "이 베이스를 복원하여 내용을 보세요.", + "Subpages": "하위 페이지", + "Failed to load subpages": "하위 페이지를 불러오지 못했습니다", + "No subpages": "하위 페이지가 없습니다", + "Subpages (Child pages)": "하위 페이지 (자식 페이지)", + "List all subpages of the current page": "현재 페이지의 모든 하위 페이지 나열", + "Attachments": "첨부 파일", + "All spaces": "모든 스페이스", + "Unknown": "알 수 없음", + "Find a space": "스페이스 찾기", + "Search in all your spaces": "모든 스페이스에서 검색", + "Type": "유형", + "Enterprise": "엔터프라이즈", + "Download attachment": "첨부 파일 다운로드", + "Allowed email domains": "허용된 이메일 도메인", + "Only users with email addresses from these domains can signup via SSO.": "이 도메인의 이메일 주소를 가진 사용자만 SSO를 통해 가입할 수 있습니다.", + "Enter valid domain names separated by comma or space": "쉼표 또는 공백으로 구분된 유효한 도메인 이름을 입력하세요", + "Enforce two-factor authentication": "2단계 인증 강제", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "시행되면 모든 멤버가 워크스페이스에 액세스하기 위해 2단계 인증을 활성화해야 합니다.", + "Toggle MFA enforcement": "MFA 강제 설정 전환", + "Display name": "표시 이름", + "Allow signup": "가입 허용", + "Enabled": "활성화됨", + "Advanced Settings": "고급 설정", + "Enable TLS/SSL": "TLS/SSL 활성화", + "Use secure connection to LDAP server": "LDAP 서버에 보안 연결 사용", + "Group sync": "그룹 동기화", + "No SSO providers found.": "SSO 제공자를 찾을 수 없습니다.", + "Delete SSO provider": "SSO 제공자 삭제", + "Are you sure you want to delete this SSO provider?": "이 SSO 제공자를 삭제하시겠습니까?", + "Action": "작업", + "{{ssoProviderType}} configuration": "{{ssoProviderType}} 구성", + "Icon": "아이콘", + "Upload image": "이미지 업로드", + "Remove image": "이미지 제거", + "Failed to remove image": "이미지 제거 실패", + "Image exceeds 10MB limit.": "이미지가 10MB 용량 제한을 초과합니다.", + "Image removed successfully": "이미지 삭제됨", + "API key": "API 키", + "API keys": "API 키", + "API management": "API 관리", + "Custom expiration date": "사용자 정의 만료일", + "Enter a descriptive token name": "토큰 이름을 입력하세요", + "Expiration": "만료", + "Expired": "만료됨", + "Expires": "만료일", + "Last use": "최근 사용", + "No API keys found": "API 키를 찾을 수 없습니다", + "No expiration": "유효기간 없음", + "Revoked successfully": "폐기 완료", + "Select expiration date": "만료일 선택", + "This action cannot be undone. Any applications using this API key will stop working.": "이 작업은 되돌릴 수 없습니다. 이 API 키를 사용하는 모든 응용 프로그램이 작동을 멈출 것입니다.", + "Update": "업데이트", + "Update {{credential}}": "{{credential}} 업데이트", + "Manage API keys for all users in the workspace": "워크스페이스 내 모든 사용자의 API 키 관리", + "Restrict API key creation to admins": "API 키 생성 권한을 관리자에게만 제한합니다", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "새로운 API 키는 관리자와 소유자만 생성할 수 있습니다. 기존 멤버 키는 계속 사용할 수 있습니다.", + "Toggle restrict API keys to admins": "API 키 생성 제한(관리자 전용) 설정 전환", + "API key creation is restricted to admins by your workspace administrator.": "API 키 생성이 워크스페이스 관리자로 인해 관리자에게만 제한되었습니다.", + "AI settings": "AI 설정", + "AI search": "AI 검색", + "AI Answer": "AI 답변", + "Ask AI": "AI에게 묻기", + "AI is thinking...": "AI가 생각 중입니다...", + "Thinking": "생각 중", + "Ask a question...": "질문하세요...", + "AI Answers": "AI 답변", + "AI-powered search (AI Answers)": "AI 구동 검색 (AI 답변)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI 검색은 벡터 임베딩을 사용하여 작업공간 콘텐츠에 대한 의미 검색 기능을 제공합니다.", + "Toggle AI search": "AI 검색 전환", + "Generative AI (Ask AI)": "생성 AI (Ask AI)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "편집기에서 AI 구동 콘텐츠 생성을 활성화합니다. 사용자가 텍스트를 생성, 개선, 번역 및 변환할 수 있습니다.", + "Toggle generative AI": "생성 AI 토글", + "Upgrade your plan": "요금제를 업그레이드하세요", + "Available with a paid license": "유료 라이선스에서만 사용 가능합니다", + "Upgrade your license tier.": "라이선스 등급을 업그레이드하세요.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "AI는 Docmost 유료 에디션에서 제공됩니다. sales@docmost.com으로 문의하세요.", + "AI & MCP": "AI 및 MCP", + "AI": "AI", + "MCP": "MCP", + "Model Context Protocol (MCP)": "모델 컨텍스트 프로토콜(MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "AI 어시스턴트와 도구가 워크스페이스 콘텐츠와 상호작용할 수 있도록 MCP 서버를 활성화하세요.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP는 Docmost 엔터프라이즈 에디션에서만 제공됩니다. sales@docmost.com으로 문의하세요.", + "MCP Server URL": "MCP 서버 URL", + "Connect AI assistants with your Docmost account via OAuth.": "OAuth를 통해 AI 도우미를 Docmost 계정에 연결합니다.", + "Enforce OAuth": "OAuth 강제", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI 도우미는 OAuth를 통해 Docmost 계정에 연결해야 합니다. MCP 서버에서는 API 키를 사용할 수 없습니다.", + "Toggle enforce OAuth for MCP": "MCP에 대해 OAuth 강제 전환", + "Supported tools": "지원되는 도구", + "MCP server URL:": "MCP 서버 URL:", + "Learn more": "자세히 알아보기", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "워크스페이스의 모든 사용자를 위한 API 키를 관리하세요. 사용 방법은 API 문서를 참고하세요.", + "View the API documentation for usage details.": "사용 방법은 API 문서를 참고하세요.", + "View the MCP documentation.": "MCP 문서를 확인하세요.", + "Sources": "출처", + "AI Answers not available for attachments": "첨부 파일에 대해 AI 답변을 사용할 수 없습니다", + "No answer available": "답변을 제공할 수 없습니다", + "Background color": "배경 색", + "Highlight color": "강조 색", + "Remove color": "색 제거", + "Notifications": "알림", + "No notifications": "알림 없음", + "No unread notifications": "읽지 않은 알림 없음", + "All notifications": "모든 알림", + "Unread only": "읽지 않음만", + "Mark all as read": "모두 읽음으로 표시", + "Mark as read": "읽음으로 표시", + "More options": "추가 옵션", + "{{name}} mentioned you in a comment": "{{name}}님이 댓글에서 당신을 언급했습니다", + "{{name}} commented on a page": "{{name}}님이 페이지에 댓글을 남겼습니다", + "{{name}} resolved a comment": "{{name}}님이 댓글을 해결했습니다", + "{{name}} mentioned you on a page": "{{name}}님이 페이지에서 나를 멘션했습니다", + "{{name}} gave you edit access to a page": "{{name}}님이 페이지 편집 권한을 부여했습니다", + "{{name}} gave you view access to a page": "{{name}}님이 페이지 보기 권한을 부여했습니다", + "{{name}} updated a page": "{{name}}님이 페이지를 업데이트했습니다", + "Watch page": "페이지 구독", + "Stop watching": "구독 중지", + "Watch space": "스페이스 구독", + "Stop watching space": "스페이스 구독 중지", + "Email notifications": "이메일 알림", + "Page updates": "페이지 업데이트", + "Get notified when pages you watch are updated.": "구독한 페이지가 업데이트될 때 알림을 받으세요.", + "Page mentions": "페이지 언급", + "Get notified when someone mentions you on a page.": "누군가가 페이지에서 당신을 언급하면 알림을 받으세요.", + "Comment mentions": "댓글 언급", + "Get notified when someone mentions you in a comment.": "누군가가 댓글에서 당신을 언급하면 알림을 받으세요.", + "New comments": "새 댓글", + "Get notified about new comments on threads you participate in.": "참여 중인 스레드에 새 댓글이 달리면 알림을 받으세요.", + "Resolved comments": "해결된 댓글", + "Get notified when your comment is resolved.": "내 댓글이 해결되었을 때 알림을 받으세요.", + "You are now watching this page": "이제 이 페이지를 주시합니다.", + "You are no longer watching this page": "더 이상 이 페이지를 주시하지 않습니다.", + "You are now watching this space": "이제 이 스페이스를 구독합니다", + "You are no longer watching this space": "더 이상 이 스페이스를 구독하지 않습니다", + "Direct": "직접", + "Updates": "업데이트", + "Today": "오늘", + "Yesterday": "어제", + "This week": "이번 주", + "Older": "이전", + "Restricted page": "제한된 페이지", + "Restricted pages cannot be shared publicly.": "제한된 페이지는 공개적으로 공유할 수 없습니다.", + "Restricted by parent": "상위 페이지에 의해 제한됨", + "Restricted": "제한됨", + "Open": "공개", + "Inherits restrictions from ancestor page": "상위 페이지로부터 제한을 상속함", + "Only people listed below can access this page": "아래에 나열된 사용자만 이 페이지에 접근할 수 있습니다.", + "Everyone in this space can access": "이 공간의 모든 사용자가 접근할 수 있습니다.", + "No additional restrictions on this page": "이 페이지에는 추가 제한이 없습니다.", + "Only specific people can access": "특정 사용자만 접근할 수 있습니다.", + "Use only inherited restrictions": "상속된 제한만 사용", + "Add restrictions on top of inherited": "상속된 제한 위에 추가 제한 적용", + "Inherited restriction": "상속된 제한", + "Access limited by": "접근 제한:", + "Restrict access to control who can view and edit this page": "이 페이지를 누가 조회하고 편집할 수 있는지 제어하려면 접근을 제한하세요.", + "Add additional restrictions specific to this page": "이 페이지에 대한 추가 제한을 적용하세요.", + "Access": "접근", + "People with access": "접근 권한이 있는 사용자", + "Remove all": "모두 제거", + "Remove access": "접근 권한 제거", + "Remove all access": "모든 접근 권한 제거", + "Are you sure you want to remove this member's access to the page?": "이 멤버의 페이지 접근 권한을 제거하시겠습니까?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "모든 특정 접근 권한을 제거하시겠습니까? 이렇게 하면 페이지가 공간의 모든 사용자에게 공개됩니다.", + "Trash retention": "휴지통 보관 기간", + "Pages in trash will be permanently deleted after this period.": "이 기간이 지나면 휴지통의 페이지는 영구적으로 삭제됩니다.", + "Trash retention updated": "휴지통 보관 기간이 업데이트되었습니다.", + "Failed to update trash retention": "휴지통 보관 기간 업데이트에 실패했습니다.", + "Removed page restriction": "페이지 제한이 제거됨", + "Added page permission": "페이지 권한 추가됨", + "Removed page permission": "페이지 권한 제거됨", + "Changed page permission": "페이지 권한 변경됨", + "Requested password reset": "비밀번호 재설정 요청됨", + "Created template": "템플릿 생성됨", + "Deleted template": "템플릿 삭제됨", + "day": "일", + "days": "일", + "week": "주", + "weeks": "주", + "month": "개월", + "months": "개월", + "year": "년", + "years": "년", + "Period": "기간", + "Fixed date": "고정 날짜", + "Indefinitely": "무기한", + "Days": "일", + "Weeks": "주", + "Months": "개월", + "Years": "년", + "Pick a date": "날짜 선택", + "Maximum is {{max}} {{unit}} for this unit": "이 단위의 최대값은 {{max}} {{unit}}입니다", + "Never expires. Verifiers can re-verify at any time.": "만료되지 않습니다. 검증자는 언제든지 다시 검증할 수 있습니다.", + "Verified": "검증됨", + "Review needed": "검토 필요", + "Verification expired": "검증 만료됨", + "Draft": "초안", + "In Approval": "승인 진행 중", + "In approval": "승인 진행 중", + "Approved": "승인됨", + "Obsolete": "폐기됨", + "Expiring": "만료 예정", + "Set up verification": "검증 설정", + "Verify page": "페이지 검증", + "Page verification": "페이지 검증", + "Add verification": "검증 추가", + "Edit verification": "검증 편집", + "Search by title": "제목으로 검색", + "Choose how this page should stay accurate.": "이 페이지의 정확성을 유지할 방법을 선택하세요.", + "Recurring verification": "반복 검증", + "Verifiers re-confirm this page on a schedule.": "검증자가 일정에 따라 이 페이지를 다시 확인합니다.", + "Re-verify on a schedule (e.g every 30 days )": "일정에 따라 다시 검증(예: 30일마다)", + "Page stays editable at all times": "페이지는 항상 편집 가능합니다", + "Best for runbooks, FAQs, living documentation": "런북, FAQ, 살아 있는 문서에 적합", + "Approval workflow": "승인 워크플로", + "Formal document lifecycle with named approvers.": "지정된 승인자가 있는 공식 문서 수명 주기입니다.", + "Draft → In approval → Approved → Obsolete": "초안 → 승인 진행 중 → 승인됨 → 폐기됨", + "Locked once approved, with full history": "승인되면 잠기며 전체 이력이 유지됩니다", + "Designed for ISO 9001, ISO 13485, and FDA": "ISO 9001, ISO 13485 및 FDA용으로 설계됨", + "Best for SOPs and controlled documents": "SOP 및 관리 문서에 적합", + "Back": "뒤로", + "Quality management": "품질 관리", + "Recurring": "반복", + "Pages move through draft, approval, and approved stages.": "페이지는 초안, 승인, 승인됨 단계를 거칩니다.", + "Verifiers": "검증자", + "Add verifier": "검증자 추가", + "I've reviewed this page for accuracy": "이 페이지의 정확성을 검토했습니다", + "Set up": "설정", + "Remove verification": "검증 제거", + "Are you sure you want to remove verification from this page?": "이 페이지에서 검증을 제거하시겠습니까?", + "Assigned verifiers must periodically re-verify this page.": "지정된 검증자는 이 페이지를 주기적으로 다시 검증해야 합니다.", + "Last verified by {{name}} {{time}} (expired)": "마지막 검증자: {{name}} {{time}} (만료됨)", + "The fixed expiration date has passed.": "고정된 만료일이 지났습니다.", + "Verified by {{name}} {{time}}": "검증자: {{name}} {{time}}", + "Expires {{date}}": "{{date}}에 만료", + "Expired {{date}}": "{{date}}에 만료됨", + "Mark as obsolete": "폐기로 표시", + "Mark obsolete": "폐기 표시", + "Returned by {{name}} {{time}}": "반려자: {{name}} {{time}}", + "No approval has been requested yet.": "아직 승인이 요청되지 않았습니다.", + "Submitted by {{name}} {{time}}": "제출자: {{name}} {{time}}", + "Someone": "누군가", + "Approved by {{name}} {{time}}": "승인자: {{name}} {{time}}", + "This document has been marked as obsolete.": "이 문서는 폐기로 표시되었습니다.", + "Rejection comment": "반려 사유", + "Reason for returning this document...": "이 문서를 반려하는 이유...", + "Confirm rejection": "반려 확인", + "Submit for approval": "승인 요청", + "Reject": "반려", + "Approve": "승인", + "Re-submit for approval": "승인 재요청", + "Verified until": "다음까지 검증됨", + "QMS": "QMS", + "Verified pages": "검증된 페이지", + "Search pages...": "페이지 검색...", + "Filter by space": "스페이스별 필터", + "Filter by type": "유형별 필터", + "{{name}} verified a page": "{{name}}님이 페이지를 검증했습니다", + "{{name}} submitted a page for your approval": "{{name}}님이 승인을 위해 페이지를 제출했습니다", + "{{name}} returned a page for revision": "{{name}}님이 수정을 위해 페이지를 반려했습니다", + "Page verification expires soon": "페이지 검토가 곧 만료됩니다", + "Page verification has expired": "페이지 검토가 만료되었습니다", + "SIEM destination {{name}} is failing": "SIEM 대상 {{name}} 장애 발생 중", + "SIEM destination {{name}} was disabled after 24 hours of failures": "24시간 동안 지속된 장애로 SIEM 대상 {{name}} 비활성화됨", + "SIEM destination {{name}} recovered": "SIEM 대상 {{name}} 복구됨", + "Verifying your email": "이메일 확인 중", + "Please wait...": "잠시만 기다려 주세요...", + "Verification failed. The link may have expired.": "인증에 실패했습니다. 링크가 만료되었을 수 있습니다.", + "Check your email": "이메일을 확인하세요", + "We sent a verification link to {{email}}.": "{{email}} 주소로 인증 링크를 보냈습니다.", + "We sent a verification link to your email.": "이메일로 인증 링크를 보냈습니다.", + "Click the link to verify your email and access your workspace.": "이메일의 링크를 클릭하여 인증하고 워크스페이스에 접속하세요.", + "Resend verification email": "인증 이메일 다시 보내기", + "Verification email sent. Please check your inbox.": "인증 이메일이 전송되었습니다. 받은 편지함을 확인하세요.", + "Failed to resend verification email. Please try again.": "인증 이메일 재전송에 실패했습니다. 다시 시도해 주세요.", + "We've sent you an email with your associated workspaces.": "연결된 워크스페이스 목록이 포함된 이메일을 보내드렸습니다.", + "Load more": "더 보기", + "Log out of all devices": "모든 기기에서 로그아웃", + "Log out of all sessions except this device": "이 기기를 제외한 모든 세션에서 로그아웃", + "This Device": "이 기기", + "Unknown device": "알 수 없는 기기", + "No active sessions": "활성 세션이 없습니다", + "Session revoked": "세션이 해제되었습니다", + "All other sessions revoked": "다른 모든 세션이 해제되었습니다", + "Last used": "마지막 사용", + "Created": "생성됨", + "Rename": "이름 변경", + "Publish": "게시", + "Security": "보안", + "Enforce SSO": "SSO 강제", + "Once enforced, members will not be able to login with email and password.": "강제 적용되면 멤버는 이메일과 비밀번호로 로그인할 수 없습니다.", + "AI-generated content may not be accurate.": "AI가 생성한 콘텐츠는 정확하지 않을 수 있습니다.", + "AI Chat": "AI 채팅", + "Analyze for insights": "인사이트 분석", + "Ask anything...": "무엇이든 물어보세요...", + "Assistant said:": "어시스턴트의 답변:", + "Chat history": "채팅 기록", + "Chat name": "채팅 이름", + "Chat transcript": "채팅 기록", + "Close": "닫기", + "Copy assistant response": "어시스턴트 응답 복사", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "채팅을 불러오지 못했습니다. 오류가 발생했습니다.", + "Failed to render this message.": "이 메시지를 렌더링하지 못했습니다.", + "How can I help you today?": "오늘 무엇을 도와드릴까요?", + "New chat": "새 채팅", + "No chat history": "채팅 기록이 없습니다", + "No chats found": "채팅을 찾을 수 없습니다", + "No conversations yet": "아직 대화가 없습니다", + "Open full page": "전체 페이지 열기", + "Scroll to bottom": "맨 아래로 스크롤", + "You said:": "내가 한 말:", + "Previous 7 days": "지난 7일", + "Previous 30 days": "지난 30일", + "Search chats...": "채팅 검색...", + "Search chats": "채팅 검색", + "Ask anything... Use @ to mention pages": "무엇이든 물어보세요... 페이지를 언급하려면 @를 사용하세요", + "Ask anything or search your workspace": "무엇이든 물어보거나 워크스페이스를 검색하세요", + "Welcome to {{name}}": "{{name}}에 오신 것을 환영합니다", + "Add files": "파일 추가", + "Mention a page": "페이지 멘션", + "Start a new chat to see it here.": "여기에 표시하려면 새 채팅을 시작하세요.", + "Summarize this page": "이 페이지 요약", + "Toggle AI Chat": "AI 채팅 전환", + "Translate this page": "이 페이지 번역", + "Try a different search term.": "다른 검색어를 사용해 보세요.", + "Try again": "다시 시도", + "Untitled chat": "제목 없는 채팅", + "What can I help you with?": "무엇을 도와드릴까요?", + "Are you sure you want to revoke this {{credential}}": "이 {{credential}}을(를) 폐기하시겠습니까?", + "Automatically provision users and groups from your identity provider via SCIM.": "SCIM을 통해 ID 공급자로부터 사용자와 그룹을 자동으로 프로비저닝합니다.", + "Configure your identity provider with this URL to provision users and groups.": "사용자와 그룹을 프로비저닝할 수 있도록 이 URL로 ID 공급자를 구성하세요.", + "Create {{credential}}": "{{credential}} 만들기", + "{{credential}} created": "{{credential}} 생성됨", + "{{credential}} created successfully": "{{credential}} 생성 완료", + "Created by": "생성한 사람", + "Custom": "사용자 지정", + "Enable SCIM": "SCIM 활성화", + "Enter a descriptive name": "설명적인 이름을 입력하세요", + "I've saved my {{credential}}": "내 {{credential}}를 저장했습니다", + "Important": "중요", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "지금 {{credential}}를 복사해 두세요. 다시는 볼 수 없습니다!", + "Never": "안 함", + "Revoke {{credential}}": "{{credential}} 폐기", + "SCIM endpoint URL": "SCIM 엔드포인트 URL", + "SCIM provisioning": "SCIM 프로비저닝", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM이 활성화되어 있는 동안에는 SSO 그룹 동기화보다 SCIM이 우선 적용됩니다.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "SCIM 토큰은 최대 {{max}}개까지 만들 수 있습니다. 새 토큰을 만들려면 기존 토큰을 삭제하세요.", + "SCIM token": "SCIM 토큰", + "SCIM tokens": "SCIM 토큰", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "이 작업은 되돌릴 수 없습니다. ID 공급자가 즉시 동기화를 중지합니다.", + "Toggle SCIM provisioning": "SCIM 프로비저닝 전환", + "Token": "토큰", + "Page menu": "페이지 메뉴", + "Expand": "펼치기", + "Collapse": "접기", + "Comment menu": "댓글 메뉴", + "Group menu": "그룹 메뉴", + "Show hidden breadcrumbs": "숨겨진 이동 경로 표시", + "Breadcrumbs": "이동 경로", + "Page actions": "페이지 작업", + "Pick emoji": "이모지 선택", + "Template menu": "템플릿 메뉴", + "Use": "사용", + "Use template": "템플릿 사용", + "Preview template: {{title}}": "템플릿 미리보기: {{title}}", + "Use a template": "템플릿 사용", + "Search templates...": "템플릿 검색...", + "Search spaces...": "스페이스 검색...", + "No templates found": "템플릿을 찾을 수 없습니다", + "No spaces found": "스페이스를 찾을 수 없습니다", + "Browse all templates": "모든 템플릿 보기", + "This space": "이 스페이스", + "All templates": "모든 템플릿", + "Global": "전역", + "New template": "새 템플릿", + "Edit template": "템플릿 편집", + "Are you sure you want to delete this template?": "이 템플릿을 삭제하시겠습니까?", + "Template scope updated": "템플릿 범위가 업데이트되었습니다", + "Choose which space this template belongs to": "이 템플릿이 속할 스페이스를 선택하세요", + "Only workspace admins can create global templates.": "전역 템플릿은 워크스페이스 관리자만 만들 수 있습니다.", + "You need edit access to this space to create templates.": "템플릿을 만들려면 이 스페이스에 대한 편집 권한이 있어야 합니다.", + "Scope": "범위", + "Select scope": "범위 선택", + "Title": "제목", + "Saving...": "저장 중...", + "Saved": "저장됨", + "Save failed. Retry": "저장에 실패했습니다. 다시 시도하세요", + "By {{name}}": "작성자 {{name}}", + "Updated {{time}}": "{{time}}에 업데이트됨", + "Choose destination": "대상 선택", + "Search pages and spaces...": "페이지와 스페이스 검색...", + "No results found": "결과를 찾을 수 없습니다", + "You don't have permission to create pages here": "여기에서 페이지를 만들 권한이 없습니다", + "Chat menu for {{title}}": "{{title}}의 채팅 메뉴", + "API key menu": "API 키 메뉴", + "Jump to comment selection": "댓글 선택으로 이동", + "Slash commands": "슬래시 명령어", + "Mention suggestions": "멘션 추천", + "Link suggestions": "링크 추천", + "Diagram editor": "다이어그램 편집기", + "Add comment": "댓글 추가", + "Find and replace": "찾기 및 바꾸기", + "Main navigation": "기본 탐색", + "Space navigation": "스페이스 탐색", + "Settings navigation": "설정 탐색", + "AI navigation": "AI 탐색", + "Breadcrumb": "이동 경로", + "Synced block": "동기화된 블록", + "Create a block that stays in sync across pages.": "페이지 간에 동기화된 상태로 유지되는 블록을 만드세요.", + "Editing original": "원본 편집 중", + "Copy synced block": "동기화된 블록 복사", + "Unsync": "동기화 해제", + "Delete synced block": "동기화된 블록 삭제", + "Synced to {{count}} other page_one": "다른 페이지 {{count}}개에 동기화됨", + "Synced to {{count}} other page_other": "다른 페이지 {{count}}개에 동기화됨", + "ORIGINAL": "원본", + "THIS PAGE": "이 페이지", + "No pages": "페이지 없음", + "The original synced block no longer exists": "원본 동기화 블록이 더 이상 존재하지 않습니다", + "You don't have access to this synced block": "이 동기화된 블록에 접근할 수 없습니다", + "Failed to load this synced block": "이 동기화된 블록을 불러오지 못했습니다", + "Fixed editor toolbar": "고정된 편집기 도구 모음", + "Show a formatting toolbar above the editor with quick access to common actions.": "일반적인 작업에 빠르게 접근할 수 있도록 편집기 위에 서식 도구 모음을 표시합니다.", + "Toggle fixed editor toolbar": "고정된 편집기 도구 모음 전환", + "Normal text": "일반 텍스트", + "More inline formatting": "추가 인라인 서식", + "Subscript": "아래 첨자", + "Superscript": "위 첨자", + "Inline code": "인라인 코드", + "Insert media": "미디어 삽입", + "Mention": "멘션", + "Emoji": "이모지", + "Columns": "열", + "More inserts": "더 많은 삽입", + "Embeds": "임베드", + "Diagrams": "다이어그램", + "Advanced": "고급", + "Utility": "유틸리티", + "Decrease indent": "들여쓰기 줄이기", + "Increase indent": "들여쓰기 늘리기", + "Clear formatting": "서식 지우기", + "Code block": "코드 블록", + "Experimental": "실험 기능", + "Strikethrough": "취소선", + "Undo": "실행 취소", + "Redo": "다시 실행", + "Backlinks": "백링크", + "Last updated by": "마지막 업데이트한 사람", + "Last updated": "마지막 업데이트", + "Stats": "통계", + "Word count": "단어 수", + "Characters": "문자 수", + "Incoming links": "들어오는 링크", + "Outgoing links": "나가는 링크", + "Incoming links ({{count}})": "들어오는 링크 ({{count}})", + "Outgoing links ({{count}})": "나가는 링크 ({{count}})", + "No pages link here yet.": "아직 여기에 링크된 페이지가 없습니다.", + "This page doesn't link to other pages yet.": "이 페이지는 아직 다른 페이지에 링크되어 있지 않습니다.", + "Verified until {{date}}": "{{date}}까지 검증됨", + "Labels": "라벨", + "Add label": "라벨 추가", + "No labels yet": "아직 라벨이 없습니다", + "Already added": "이미 추가됨", + "Invalid label name": "유효하지 않은 라벨 이름", + "No matches": "일치하는 항목 없음", + "Search or create…": "검색하거나 만들기…", + "Remove label {{name}}": "라벨 {{name}} 제거", + "Failed to add label": "라벨 추가 실패", + "Failed to remove label": "라벨 제거 실패", + "No pages with this label": "이 라벨이 지정된 페이지가 없습니다", + "Pages tagged with this label will appear here.": "이 라벨이 지정된 페이지가 여기에 표시됩니다.", + "No pages match your search.": "검색과 일치하는 페이지가 없습니다.", + "Updated {{date}}": "{{date}}에 업데이트됨", + "Cell actions": "셀 작업", + "Column actions": "열 작업", + "Row actions": "행 작업", + "Filter": "필터", + "Page title": "페이지 제목", + "Page content": "페이지 내용", + "Member actions for {{name}}": "{{name}}에 대한 멤버 작업", + "Toggle password visibility": "비밀번호 표시 전환", + "Send comment": "댓글 보내기", + "Token actions": "토큰 작업", + "Template settings": "템플릿 설정", + "Edit diagram": "다이어그램 편집", + "Edit embed": "임베드 편집", + "Edit drawing": "드로잉 편집", + "Delete equation": "수식 삭제", + "Invite actions": "초대 작업", + "Get started": "시작하기", + "* indicates required fields": "* 는 필수 입력 항목을 나타냅니다", + "List of spaces in this workspace": "이 워크스페이스의 스페이스 목록", + "Active sessions": "활성 세션", + "Add {{name}} to favorites": "{{name}} 즐겨찾기에 추가", + "Remove {{name}} from favorites": "{{name}} 즐겨찾기에서 제거", + "Added to favorites": "즐겨찾기에 추가됨", + "Removed from favorites": "즐겨찾기에서 제거됨", + "Added {{name}} to favorites": "{{name}} 즐겨찾기에 추가됨", + "Removed {{name}} from favorites": "{{name}} 즐겨찾기에서 제거됨", + "Page menu for {{name}}": "{{name}}의 페이지 메뉴", + "Create subpage of {{name}}": "{{name}}의 하위 페이지 만들기", + "Allow personal spaces": "개인 공간 허용", + "Members can create their own personal space.": "멤버는 자신만의 개인 공간을 만들 수 있습니다.", + "Toggle allow personal spaces": "개인 공간 허용 전환", + "Create personal space": "개인 공간 만들기", + "Personal space": "개인 공간", + "{{name}}'s space": "{{name}}의 스페이스", + "Apply": "적용", + "Cells that aren't already a page reference will be cleared.": "이미 페이지 참조인 셀이 아닌 경우 지워집니다.", + "Cells that aren't a valid URL will be cleared.": "유효한 URL이 아닌 셀은 지워집니다.", + "Cells that aren't a valid email address will be cleared.": "유효한 이메일 주소가 아닌 셀은 지워집니다.", + "Cells that can't be parsed as a date will be cleared.": "날짜로 해석할 수 없는 셀은 지워집니다.", + "Cells that can't be parsed as a number will be cleared.": "숫자로 해석할 수 없는 셀은 지워집니다.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "셀 값은 강제로 변환됩니다(yes/true/1은 선택됨이 되고, 그 외의 모든 값은 선택 해제되거나 지워집니다).", + "Cells will be reinterpreted under the new type.": "셀은 새 유형에 따라 다시 해석됩니다.", + "Cells will be replaced with a comma-separated list of file names.": "셀은 쉼표로 구분된 파일 이름 목록으로 대체됩니다.", + "Cells will be replaced with a comma-separated list of option names.": "셀은 쉼표로 구분된 옵션 이름 목록으로 대체됩니다.", + "Cells will be replaced with the option name.": "셀은 옵션 이름으로 대체됩니다.", + "Cells will be replaced with the page title.": "셀은 페이지 제목으로 대체됩니다.", + "Cells will be replaced with the person's name.": "셀은 사람 이름으로 대체됩니다.", + "Change type": "유형 변경", + "Change type to {{label}}?": "유형을 {{label}}로 변경할까요?", + "Converting…": "변환 중…", + "Existing values become single-item lists. No data is lost.": "기존 값은 단일 항목 목록이 됩니다. 데이터는 손실되지 않습니다.", + "Only the first selected item per row will be kept; the rest will be discarded.": "각 행에서 처음 선택된 항목만 유지되며 나머지는 삭제됩니다.", + "Previous record": "이전 레코드", + "Next record": "다음 레코드", + "Record actions": "레코드 작업", + "Delete record": "레코드 삭제", + "Delete record?": "레코드를 삭제할까요?", + "This action cannot be undone.": "이 작업은 되돌릴 수 없습니다.", + "to navigate": "탐색하려면", + "to close": "닫으려면", + "Expand row {{number}}": "행 {{number}} 펼치기", + "Saving…": "저장 중…", + "Read-only": "읽기 전용", + "Loading…": "불러오는 중…", + "Updated {{when}}": "{{when}}에 업데이트됨", + "Add property": "속성 추가", + "Create property": "속성 만들기", + "Hide properties": "속성 숨기기", + "Find a property type": "속성 유형 찾기", + "Properties": "속성", + "A property with this name already exists": "이 이름의 속성이 이미 있습니다", + "Add card": "카드 추가", + "Add filter": "필터 추가", + "Add option": "옵션 추가", + "Add sort": "정렬 추가", + "Add view": "보기 추가", + "All data in this column will be lost.": "이 열의 모든 데이터가 손실됩니다.", + "Allow multiple people": "여러 사람 허용", + "Alphabetize": "가나다순", + "Are you sure you want to delete": "삭제하시겠습니까", + "Ascending": "오름차순", + "Base deleted": "베이스가 삭제됨", + "Base name": "베이스 이름", + "Base table": "베이스 테이블", + "Card properties": "카드 속성", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "텍스트 제한보다 긴 셀은 잘리며, 초과된 콘텐츠는 영구적으로 손실됩니다.", + "Checkbox": "체크박스", + "Checked by default": "기본적으로 선택됨", + "Choose a property": "속성 선택", + "Clear selection": "선택 지우기", + "Column options": "열 옵션", + "Comma, period": "쉼표, 마침표", + "Complete": "완료", + "Contains": "포함", + "Copy link to view": "보기 링크 복사", + "Create a status property": "상태 속성 만들기", + "Created at": "작성 시간", + "Currency": "통화", + "Decimal places": "소수 자릿수", + "Default value": "기본값", + "Delete property": "속성 삭제", + "Delete view": "보기 삭제", + "Delete {{count}} rows?_one": "1개 행을 삭제하시겠습니까?", + "Delete {{count}} rows?_other": "{{count}}개 행을 삭제하시겠습니까?", + "Descending": "내림차순", + "Discard": "삭제", + "Doesn't contain": "포함하지 않음", + "Done": "완료", + "Edit formula": "수식 편집", + "Edit property": "속성 편집", + "Export CSV": "CSV 내보내기", + "Failed to load base": "베이스를 불러오지 못했습니다", + "False": "거짓", + "File": "파일", + "Filter and sort changes are visible only to you": "필터 및 정렬 변경 사항은 나에게만 표시됩니다", + "Filter by": "필터 기준", + "Formula": "수식", + "Get started with": "시작하기", + "Greater than": "보다 큼", + "Group by": "그룹화 기준", + "Group this board by a select or status property.": "선택 또는 상태 속성으로 이 보드를 그룹화하세요.", + "Hide all": "모두 숨기기", + "Hide group": "그룹 숨기기", + "In Progress": "진행 중", + "In progress": "진행 중", + "Include time": "시간 포함", + "Insert a kanban board on this page": "이 페이지에 칸반 보드 삽입", + "Insert an inline base on this page": "이 페이지에 인라인 베이스 삽입", + "Is": "같음", + "Is after": "이후", + "Is any of": "다음 중 하나와 같음", + "Is before": "이전", + "Is empty": "비어 있음", + "Is none of": "다음 중 어느 것과도 같지 않음", + "Is not": "같지 않음", + "Is not empty": "비어 있지 않음", + "Is on or after": "해당 날짜 또는 이후", + "Is on or before": "해당 날짜 또는 이전", + "Is within": "다음 범위 내", + "Keep editing": "계속 편집", + "Last edited at": "마지막 편집 시간", + "Last edited by": "마지막 편집자", + "Less than": "보다 작음", + "Link copied to clipboard": "링크가 클립보드에 복사됨", + "Local": "로컬", + "Long text": "긴 텍스트", + "Moved card to {{column}}": "카드를 {{column}}(으)로 이동함", + "Moved column to {{column}}": "열을 {{column}}(으)로 이동함", + "Multi-select": "다중 선택", + "New row": "새 행", + "Next month": "다음 달", + "Next week": "다음 주", + "Next year": "내년", + "No filters applied": "적용된 필터 없음", + "No match": "일치하는 항목 없음", + "No options for this property type": "이 속성 유형에는 옵션이 없습니다", + "No sorts applied": "적용된 정렬 없음", + "No value": "값 없음", + "None": "없음", + "Not started": "시작 전", + "Number": "숫자", + "One month ago": "한 달 전", + "One month from now": "한 달 후", + "One week ago": "일주일 전", + "One week from now": "일주일 후", + "Open as page": "페이지로 열기", + "Options": "옵션", + "Past month": "지난달", + "Past week": "지난주", + "Past year": "작년", + "Percent": "백분율", + "Period, comma": "마침표, 쉼표", + "Person": "사람", + "Please enter a valid email": "유효한 이메일을 입력하세요", + "Progress": "진행률", + "Property options": "속성 옵션", + "Relative": "상대값", + "Rename property": "속성 이름 변경", + "Reset": "재설정", + "Save for everyone": "모든 사용자에게 저장", + "Select": "선택", + "Select a property": "속성 선택", + "Select all loaded rows": "불러온 모든 행 선택", + "Show all": "모두 보기", + "Sort": "정렬", + "Sort by": "정렬 기준", + "Space, comma": "공백, 쉼표", + "Space, period": "공백, 마침표", + "This board has no grouping property yet.": "이 보드에는 아직 그룹화 속성이 없습니다.", + "This month": "이번 달", + "This year": "올해", + "Thousands and decimal separators": "천 단위 및 소수 구분 기호", + "Time format": "시간 형식", + "To Do": "할 일", + "Tomorrow": "내일", + "True": "참", + "Unsaved changes": "저장되지 않은 변경 사항", + "Untitled base": "제목 없는 베이스", + "URL": "URL", + "Value": "값", + "View updated for everyone": "보기가 모두에게 업데이트되었습니다", + "You have unsaved changes. Do you want to discard them?": "저장되지 않은 변경 사항이 있습니다. 버리시겠습니까?", + "{{count}} rows deleted_one": "1개 행 삭제 완료", + "{{count}} rows deleted_other": "{{count}}개 행 삭제 완료", + "{{count}} selected_one": "1개 선택됨", + "{{count}} selected_other": "{{count}}개 선택됨", + "Compare": "비교", + "Compare versions": "버전 비교", + "Select version from {{date}}": "{{date}}의 버전 선택", + "Version actions for {{date}}": "{{date}} 버전 작업", + "Comparing {{newer}} and {{older}}": "{{newer}} 및 {{older}} 비교 중", + "Exit compare": "비교 종료", + "Search attachments...": "첨부 파일 검색...", + "Error loading attachments.": "첨부 파일을 불러오는 중 오류가 발생했습니다.", + "No attachments on this page yet.": "이 페이지에는 아직 첨부 파일이 없습니다.", + "Uploaded by {{name}}": "업로드한 사람: {{name}}", + "Download {{name}}": "{{name}} 다운로드", + "Access revoked": "액세스가 취소되었습니다", + "Authorize application": "애플리케이션 승인", + "{{name}} wants to access {{workspace}}": "{{name}}에서 {{workspace}}에 액세스하려고 합니다", + "Not you? Switch account": "본인이 아니신가요? 계정을 전환하세요", + "This application will be able to:": "이 애플리케이션이 수행할 수 있는 작업:", + "Write": "쓰기", + "Invalid authorization request": "잘못된 승인 요청", + "Authorize": "승인", + "Application": "애플리케이션", + "Permissions": "권한", + "Authorized": "승인됨", + "Revoke access": "액세스 취소", + "Revoke access for {{name}}": "{{name}}의 액세스 취소", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "정말로 {{name}}의 액세스를 취소하시겠습니까? 이 애플리케이션은 더 이상 회원님의 계정에 액세스할 수 없습니다.", + "Something went wrong. Please try again.": "문제가 발생했습니다. 다시 시도해 주세요.", + "Remove {{name}}": "{{name}} 제거", + "Make sure you trust this application before authorizing it.": "이 애플리케이션을 승인하기 전에 신뢰할 수 있는지 확인하세요.", + "You will be redirected to": "다음으로 리디렉션됩니다", + "View content without making changes.": "변경하지 않고 콘텐츠를 봅니다.", + "Create and modify content.": "콘텐츠를 생성하고 수정합니다.", + "Applications and AI assistants you have authorized to access your account.": "회원님의 계정에 액세스하도록 승인한 애플리케이션 및 AI 도우미입니다.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "워크스페이스에서 MCP가 활성화되어 있습니다. OAuth를 통해 AI 어시스턴트를 Docmost 계정에 연결하세요.", + "Authorized apps": "승인된 앱", + "No authorized apps yet.": "아직 승인된 앱이 없습니다.", + "Workspace knowledge only": "워크스페이스 지식만 사용", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "AI 채팅이 워크스페이스 페이지와 업로드된 파일의 내용만 바탕으로 답변하도록 제한합니다. 외부 지식은 사용하지 않습니다.", + "Toggle workspace knowledge only": "워크스페이스 지식만 사용 전환", + "Read-only mode": "읽기 전용 모드", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI 채팅은 워크스페이스 콘텐츠를 검색하고 읽을 수 있지만, 페이지를 생성하거나 편집할 수는 없습니다.", + "Toggle AI Chat read-only mode": "AI 채팅 읽기 전용 모드 전환", + "Title only": "제목만", + "you": "회원님", + "Allow public spaces": "공개 스페이스 허용", + "Space admins can publish their spaces to the web.": "스페이스 관리자는 자신의 스페이스를 웹에 게시할 수 있습니다.", + "Toggle allow public spaces": "공개 스페이스 허용 전환", + "Publish space to the web": "스페이스를 웹에 게시", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "제한된 페이지를 제외하고 이 스페이스의 모든 페이지를 인터넷상의 누구나 읽을 수 있게 됩니다. 계속하시겠습니까?", + "Make this space publicly readable by anyone on the internet.": "이 스페이스를 인터넷상의 누구나 읽을 수 있도록 공개합니다.", + "Toggle publish space to the web": "스페이스 웹 게시 전환", + "Allow search engines to index": "검색 엔진 색인 허용", + "Let public pages in this space appear in search engine results.": "이 스페이스의 공개 페이지가 검색 엔진 결과에 표시되도록 합니다.", + "Toggle search engine indexing": "검색 엔진 색인 전환", + "Public space link": "공개 스페이스 링크", + "Copy public space link": "공개 스페이스 링크 복사", + "Renaming the space slug will break public links.": "스페이스 슬러그 이름을 변경하면 공개 링크가 작동하지 않게 됩니다.", + "Failed to update space": "스페이스 업데이트 실패", + "This space is public": "이 스페이스는 공개 상태입니다", + "Anyone on the internet can read the pages in this space, except restricted pages.": "제한된 페이지를 제외하고 이 스페이스의 페이지를 인터넷상의 누구나 읽을 수 있습니다.", + "Open public site": "공개 사이트 열기", + "Public": "공개", + "This space has no public pages yet.": "이 스페이스에는 아직 공개 페이지가 없습니다.", + "On this page": "이 페이지에서", + "Previous": "이전", + "Next": "다음", + "Show hidden pages": "숨겨진 페이지 표시", + "Page navigation": "페이지 탐색", + "Toggle sidebar": "사이드바 전환", + "Toggle table of contents": "목차 전환", + "Appearance": "모양", + "Forest": "포레스트", + "Violet": "바이올렛", + "Light mode color": "라이트 모드 색상", + "Dark mode color": "다크 모드 색상", + "Choose the primary color of the public docs site.": "공개 문서 사이트의 기본 색상을 선택하세요.", + "Show page author": "페이지 작성자 표시", + "Display the page creator's name on public pages.": "공개 페이지에 페이지 작성자의 이름을 표시합니다.", + "Toggle show page author": "페이지 작성자 표시 전환", + "Show last updated": "마지막 업데이트 표시", + "Display when each page was last updated.": "각 페이지가 마지막으로 업데이트된 시점을 표시합니다.", + "Toggle show last updated": "마지막 업데이트 표시 전환", + "Open public page": "공개 페이지 열기", + "Toggle color scheme": "색상 구성표 전환", + "Ember": "엠버", + "Rose": "로즈", + "Documentation": "문서", + "All published spaces.": "게시된 모든 스페이스입니다.", + "No public spaces yet.": "아직 공개 스페이스가 없습니다.", + "Show public directory": "공개 디렉터리 표시", + "List published spaces at /docs for anyone to browse.": "누구나 탐색할 수 있도록 /docs에 게시된 스페이스를 나열합니다.", + "Toggle show public directory": "공개 디렉터리 표시 전환", + "Show in public directory": "공개 디렉터리에 표시", + "List this space in the public directory at /docs.": "이 스페이스를 /docs의 공개 디렉터리에 나열합니다.", + "Toggle show in public directory": "공개 디렉터리에 표시 전환", + "Open public space link": "공개 스페이스 링크 열기", + "Disable public spaces": "공개 스페이스 비활성화", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "스페이스 관리자는 자신의 스페이스를 인터넷상의 누구나 읽을 수 있도록 공개할 수 있게 됩니다. 계속하시겠습니까?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "이 작업을 수행하면 현재 게시된 모든 스페이스의 게시가 즉시 취소됩니다. 나중에 다시 활성화해도 자동으로 다시 게시되지는 않습니다. 계속하시겠습니까?", + "Allow": "허용", + "Shared pages": "공유된 페이지", + "Published spaces": "게시된 스페이스", + "Spaces published to the web will appear here": "웹에 게시된 스페이스가 여기에 표시됩니다", + "No published spaces": "게시된 스페이스 없음", + "Published by": "게시자", + "Published at": "게시일", + "Open space": "스페이스 열기", + "Unpublish": "게시 취소", + "Unpublish space": "스페이스 게시 취소", + "This space will no longer be publicly accessible. Are you sure?": "이 스페이스는 더 이상 공개적으로 접근할 수 없게 됩니다. 계속하시겠습니까?", + "More options for {{name}}": "{{name}}에 대한 추가 옵션", + "Edit page": "페이지 편집", + "Sign in": "로그인", + "Open app": "앱 열기", + "No spaces match your search.": "검색과 일치하는 스페이스가 없습니다.", + "Welcome to our documentation": "문서에 오신 것을 환영합니다", + "Guides, references and answers across all our published spaces.": "게시된 모든 스페이스의 가이드, 참고 자료, 답변을 확인하세요.", + "Guides, references and answers across all our spaces.": "모든 스페이스의 가이드, 참고 자료, 답변을 확인하세요.", + "Search documentation...": "문서 검색...", + "1 published space": "게시된 스페이스 1개", + "{{count}} published spaces": "게시된 스페이스 {{count}}개", + "Actions": "작업", + "Add destination": "대상 추가", + "Are you sure you want to delete the destination": "대상을 삭제하시겠습니까?", + "Audit logs": "감사 로그", + "Audit logs & SIEM": "감사 로그 & SIEM", + "Auth header name": "인증 헤더 이름", + "Auth header prefix": "인증 헤더 접두사", + "Body format": "본문 형식", + "Created SIEM destination": "SIEM 대상 생성됨", + "Datadog site": "Datadog 사이트", + "Defaults to this instance's hostname": "기본값은 인스턴스의 호스트명입니다", + "Delete destination": "대상 삭제", + "Deleted SIEM destination": "SIEM 대상 삭제됨", + "Destination created": "대상 생성됨", + "Destination deleted": "대상 삭제됨", + "Destination updated": "대상 업데이트됨", + "Disabled": "비활성화됨", + "Edit destination": "대상 편집", + "Endpoint URL": "엔드포인트 URL", + "Failing": "장애 발생 중", + "Failing since {{time}}": "{{time}}부터 장애 발생 중", + "HEC token": "HEC 토큰", + "HEC URL": "HEC URL", + "Healthy": "정상", + "Hide advanced options": "고급 옵션 숨기기", + "Host": "호스트", + "Index": "인덱스", + "Insecure: connections can be intercepted.": "안전하지 않음: 연결이 가로채질 수 있습니다.", + "JSON array": "JSON 배열", + "Last delivered": "마지막 전송", + "Last error": "마지막 오류", + "Leave empty to use the token's default index": "토큰의 기본 인덱스를 사용하려면 비워 두세요", + "Maximum of {{limit}} destinations reached": "대상은 최대 {{limit}}개까지 추가할 수 있습니다", + "Could not load SIEM destinations: {{message}}": "SIEM 대상을 불러올 수 없습니다: {{message}}", + "No destinations yet": "등록된 대상이 없습니다", + "Preset": "프리셋", + "Retry now": "지금 재시도", + "Retry scheduled": "재시도 예정", + "Send test event": "테스트 이벤트 전송", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "아래 인증 헤더를 통해 전송하였습니다. 수신 측에서 요구하지 않는 경우 비워 두세요.", + "Service": "서비스", + "Show advanced options": "고급 옵션 표시", + "SIEM": "SIEM", + "SIEM streaming": "SIEM 스트리밍", + "SIEM streaming requires an Enterprise license.": "SIEM 스트리밍은 엔터프라이즈 라이선스가 필요합니다.", + "Source": "소스", + "Sourcetype": "소스 유형", + "Tags": "태그", + "Test connection": "연결 테스트", + "Test event delivered successfully.": "테스트 이벤트가 전송되었습니다.", + "Test the connection before saving.": "저장하기 전에 연결을 테스트하세요.", + "Test event delivered to {{name}}": "테스트 이벤트가 {{name}}에 전송되었습니다", + "Updated SIEM destination": "SIEM 대상 업데이트됨", + "Verify TLS certificate": "TLS 인증서 검증", + "e.g. Splunk prod": "예: Splunk 운영" +} diff --git a/apps/client/public/locales/nl-NL/translation.json b/apps/client/public/locales/nl-NL/translation.json new file mode 100644 index 0000000..ee1900f --- /dev/null +++ b/apps/client/public/locales/nl-NL/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Account", + "Active": "Actief", + "Add": "Toevoegen", + "Add group members": "Groepsleden toevoegen", + "Add groups": "Groepen Toevoegen", + "Add members": "Leden toevoegen", + "Add to groups": "Toevoegen aan groepen", + "Add space members": "Voeg leden toe ruimte", + "Add to favorites": "Toevoegen aan favorieten", + "Admin": "Beheerder", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Weet je zeker dat je deze groep wilt verwijderen? Leden verliezen toegang tot documenten waar deze groep toegang toe heeft.", + "Are you sure you want to delete this page?": "Weet u zeker dat u deze pagina wil verwijderen?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Weet je zeker dat je deze groep wilt verwijderen? Leden verliezen toegang tot documenten waar deze groep toegang toe heeft.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Weet u zeker dat u deze gebruiker van de ruimte wilt verwijderen? De gebruiker zal alle toegang tot deze ruimte verliezen.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Weet u zeker dat u deze versie wilt herstellen? Wijzigingen die geen versie hebben zullen verloren gaan.", + "Can become members of groups and spaces in workspace": "Kunnen lid worden van groepen en ruimtes in de werkruimte", + "Can create and edit pages in space.": "Kan pagina's in de ruimte maken en bewerken.", + "Can edit": "Kan bewerken", + "Can manage workspace": "Kan werkruimte beheren", + "Can manage workspace but cannot delete it": "Kan een werkruimte beheren, maar kan deze niet verwijderen", + "Can view": "Kan bekijken", + "Can view pages in space but not edit.": "Kan pagina's in de ruimte bekijken maar niet bewerken.", + "Cancel": "Annuleren", + "Change email": "Wijzig e-mailadres", + "Change password": "Wijzig wachtwoord", + "Change photo": "Wijzig foto", + "Choose a role": "Kies een rol", + "Choose your preferred color scheme.": "Kies uw gewenste kleurenschema.", + "Choose your preferred interface language.": "Kies uw gewenste interfacetaal.", + "Choose your preferred page width.": "Kies uw gewenste paginabreedte.", + "Confirm": "Bevestig", + "Copy as Markdown": "Kopiëren als Markdown", + "Copy link": "Link kopiëren", + "Create": "Aanmaken", + "Create group": "Groep aanmaken", + "Create page": "Pagina aanmaken", + "Create space": "Ruimte aanmaken", + "Create workspace": "Werkruimte aanmaken", + "Current password": "Huidig wachtwoord", + "Dark": "Donker", + "Date": "Datum", + "Delete": "Verwijderen", + "Remove from page": "Van pagina verwijderen", + "Base options": "Basisopties", + "Delete group": "Groep verwijderen", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Weet u zeker dat u deze pagina wilt verwijderen? Dit zal de subpagina's en paginageschiedenis verwijderen. Deze actie kan niet ongedaan gemaakt worden.", + "Description": "Beschrijving", + "Details": "Details", + "e.g ACME": "bijv. ACME", + "e.g ACME Inc": "bijv. ACME Inc", + "e.g Developers": "bijv. Ontwikkelaars", + "e.g Group for developers": "bijv. Groep voor ontwikkelaars", + "e.g product": "bijv. product", + "e.g Product Team": "bijv. Productteam", + "e.g Sales": "bijv. Verkoop", + "e.g Space for product team": "bijv. Ruimte voor productteam", + "e.g Space for sales team to collaborate": "bijv. Ruimte voor verkoopteam om samen te werken", + "Edit": "Bewerken", + "Read": "Lezen", + "Edit group": "Groep bewerken", + "Email": "E-mailadres", + "Enter a strong password": "Voer een sterk wachtwoord in", + "Enter valid email addresses separated by comma or space max_50": "Voer geldige e-mailadressen in, gescheiden door komma of spatie [max: 50]", + "enter valid emails addresses": "voer geldige e-mailadressen in", + "Enter your current password": "Voer uw huidige wachtwoord in", + "enter your full name": "voer je volledige naam in", + "Enter your new password": "Voer uw nieuwe wachtwoord in", + "Enter your new preferred email": "Voer uw nieuwe e-mailadres in", + "Enter your password": "Voer uw wachtwoord in", + "Error fetching page data.": "Fout bij het ophalen van paginagegevens.", + "Error loading page history.": "Fout bij het laden van de paginageschiedenis.", + "Export": "Exporteer", + "Failed to create page": "Pagina aanmaken mislukt", + "Failed to delete page": "Verwijderen van pagina mislukt", + "Failed to restore page": "Pagina herstellen mislukt", + "Failed to fetch recent pages": "Kan recente pagina's niet ophalen", + "Failed to import pages": "Pagina's importeren mislukt", + "Failed to load page. An error occurred.": "Laden van pagina mislukt. Er is een fout opgetreden.", + "Failed to update data": "Bijwerken van gegevens mislukt", + "Failed to create base": "Kan basis niet aanmaken", + "Failed to update base": "Kan basis niet bijwerken", + "Failed to delete base": "Kan basis niet verwijderen", + "Failed to create property": "Kan eigenschap niet aanmaken", + "Failed to update property": "Kan eigenschap niet bijwerken", + "Failed to delete property": "Kan eigenschap niet verwijderen", + "Failed to reorder property": "Kan eigenschap niet opnieuw ordenen", + "Failed to create view": "Kan weergave niet aanmaken", + "Failed to update view": "Kan weergave niet bijwerken", + "Failed to delete view": "Kan weergave niet verwijderen", + "Failed to create row": "Kan rij niet aanmaken", + "Failed to update row": "Kan rij niet bijwerken", + "Failed to delete row": "Kan rij niet verwijderen", + "Failed to delete rows": "Kan rijen niet verwijderen", + "Failed to reorder row": "Kan rij niet opnieuw ordenen", + "Failed to move card": "Kan kaart niet verplaatsen", + "Failed to add card": "Kan kaart niet toevoegen", + "Failed to export CSV": "Kan CSV niet exporteren", + "Favorite spaces": "Favoriete ruimtes", + "Favorite spaces appear here": "Favoriete ruimtes verschijnen hier", + "Favorites": "Favorieten", + "Full access": "Volledig toegang", + "Full page width": "Volledige pagina breedte", + "Full width": "Volledige breedte", + "General": "Algemeen", + "Group": "Groep", + "Group description": "Groepsomschrijving", + "Group name": "Groepsnaam", + "Groups": "Groepen", + "Has full access to space settings and pages.": "Heeft volledige toegang tot ruimte instellingen en pagina's.", + "Home": "Startpagina", + "Import pages": "Importeer pagina's", + "Import pages & space settings": "Importeer pagina en ruimte instellingen", + "Importing pages": "Importeer pagina's", + "invalid invitation link": "ongeldige uitnodigingslink", + "Invitation signup": "Uitnodiging aanmelding", + "Invite by email": "Uitnodigen via e-mail", + "Invite members": "Leden uitnodigen", + "Invite new members": "Nieuwe leden uitnodigen", + "Invite People": "Mensen uitnodigen", + "Invited members who are yet to accept their invitation will appear here.": "Uitgenodigde leden die hun uitnodiging nog moeten accepteren zullen hier worden getoond.", + "Invited members will be granted access to spaces the groups can access": "Uitgenodigde leden wordt toegang gegeven tot ruimtes de groepen toegang toe heeft", + "Join the workspace": "Word lid van de werkruimte", + "Language": "Taal", + "Light": "Licht", + "Link copied": "Link gekopieerd", + "Login": "Inloggen", + "Logout": "Uitloggen", + "Manage Group": "Groep beheren", + "Manage members": "Leden beheren", + "member": "lid", + "Member": "Lid", + "members": "leden", + "Members": "Leden", + "My preferences": "Mijn voorkeuren", + "My Profile": "Mijn profiel", + "My profile": "Mijn profiel", + "Name": "Naam", + "New email": "Nieuw e-mail", + "New page": "Nieuwe pagina", + "New password": "Nieuw wachtwoord", + "No group found": "Geen groep gevonden", + "No page history saved yet.": "Er is nog geen pagina geschiedenis opgeslagen.", + "No pages yet": "Nog geen pagina's", + "No shared pages": "Geen gedeelde pagina's", + "No results found...": "Geen resultaten gevonden...", + "No user found": "Geen gebruiker gevonden", + "Overview": "Overzicht", + "Owner": "Eigenaar", + "page": "pagina", + "Page deleted successfully": "Pagina succesvol verwijderd", + "Page history": "Pagina geschiedenis", + "Select version": "Selecteer versie", + "Highlight changes": "Wijzigingen markeren", + "Page import is in progress. Please do not close this tab.": "Importeren van pagina's is bezig. Sluit dit tabblad niet.", + "Pages": "Pagina's", + "pages": "pagina's", + "Password": "Wachtwoord", + "Password changed successfully": "Wachtwoord met succes gewijzigd", + "People": "Personen", + "Pending": "Wachtende", + "Please confirm your action": "Bevestig alstublieft uw actie", + "Preferences": "Voorkeuren", + "Print PDF": "PDF afdrukken", + "Profile": "Profiel", + "Recently updated": "Recent bijgewerkt", + "Remove": "Verwijderen", + "Remove from favorites": "Verwijderen uit favorieten", + "Remove group member": "Lid uit groep verwijderd", + "Remove space member": "Lid uit ruimte verwijderd", + "Restore": "Herstellen", + "Role": "Rol", + "Save": "Opslaan", + "Search": "Zoeken", + "Search for groups": "Zoek naar groepen", + "Search for users": "Zoek naar gebruikers", + "Search for users and groups": "Zoek naar gebruikers en groepen", + "Search...": "Zoeken...", + "Select language": "Selecteer taal", + "Select role": "Selecteer rol", + "Select role to assign to all invited members": "Selecteer een rol om toe te wijzen aan alle uitgenodigde leden", + "Select theme": "Selecteer thema", + "Send invitation": "Uitnodiging verzenden", + "Invitation sent": "Uitnodiging verzonden", + "Settings": "Instellingen", + "Setup workspace": "Werkruimte instellen", + "Sign In": "Inloggen", + "Sign Up": "Registreren", + "Slug": "Slug", + "Space": "Ruimte", + "Space description": "Ruimtebeschrijving", + "Space menu": "Ruimtemenu", + "Space name": "Ruimtenaam", + "Space settings": "Ruimte-instellingen", + "Space slug": "Ruimte-slug", + "Spaces": "Ruimtes", + "Spaces you belong to": "Ruimtes waarvan je lid bent", + "No space found": "Geen ruimte gevonden", + "Search for spaces": "Zoek naar ruimtes", + "Start typing to search...": "Begin met typen om te zoeken...", + "Status": "Status", + "Successfully imported": "Succesvol geïmporteerd", + "Successfully restored": "Succesvol hersteld", + "System settings": "Systeeminstellingen", + "Templates": "Sjablonen", + "Theme": "Thema", + "To change your email, you have to enter your password and new email.": "Om uw e-mailadres te wijzigen, moet u uw wachtwoord en nieuwe e-mail invullen.", + "Toggle full page width": "Volledige paginabreedte in-/uitschakelen", + "Unable to import pages. Please try again.": "Pagina's importeren is niet gelukt. Probeer het opnieuw.", + "untitled": "zonder titel", + "Untitled": "Zonder titel", + "Updated successfully": "Succesvol bijgewerkt", + "User": "Gebruiker", + "Workspace": "Werkruimte", + "Workspace Name": "Naam van werkruimte", + "Workspace settings": "Werkruimte-instellingen", + "You can change your password here.": "U kunt hier uw wachtwoord wijzigen.", + "Your Email": "Je e-mailadres", + "Your import is complete.": "Uw import is voltooid.", + "Your name": "Je naam", + "Your Name": "Je naam", + "Your password": "Je wachtwoord", + "Your password must be a minimum of 8 characters.": "Uw wachtwoord moet minimaal 8 tekens bevatten.", + "Sidebar toggle": "Zijbalk in-/uitschakelen", + "Comments": "Opmerkingen", + "404 page not found": "404 pagina niet gevonden", + "Sorry, we can't find the page you are looking for.": "Sorry, we kunnen de pagina die u zoekt niet vinden.", + "Take me back to homepage": "Breng me terug naar de homepage", + "Forgot password": "Wachtwoord vergeten", + "Forgot your password?": "Wachtwoord vergeten?", + "A password reset link has been sent to your email. Please check your inbox.": "Een link om uw wachtwoord te resetten is verstuurd naar uw e-mail. Controleer uw inbox.", + "Send reset link": "Verstuur een link om uw wachtwoord te herstellen", + "Password reset": "Wachtwoord opnieuw instellen", + "Your new password": "Uw nieuwe wachtwoord", + "Set password": "Voer wachtwoord in", + "Write a comment": "Schrijf een reactie", + "Reply...": "Antwoord...", + "Error loading comments.": "Fout bij het laden van reacties.", + "No comments yet.": "Nog geen reacties.", + "No open comments.": "Geen openstaande opmerkingen.", + "No resolved comments.": "Geen opgeloste reacties.", + "Add a comment...": "Voeg een opmerking toe...", + "Edit comment": "Bewerk reactie", + "Delete comment": "Verwijder reactie", + "Are you sure you want to delete this comment?": "Weet je zeker dat je deze reactie wilt verwijderen?", + "Delete chat": "Chat verwijderen", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Weet je zeker dat je '{{title}}' wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "Comment created successfully": "Reactie succesvol aangemaakt", + "Error creating comment": "Fout bij het aanmaken van reactie", + "Comment updated successfully": "Opmerking succesvol bijgewerkt", + "Failed to update comment": "Bijwerken van reactie mislukt", + "Comment deleted successfully": "Reactie met succes verwijderd", + "Failed to delete comment": "Verwijderen van reactie mislukt", + "Comment resolved successfully": "Reactie succesvol opgelost", + "Comment re-opened successfully": "Opmerking succesvol heropend", + "Comment unresolved successfully": "Opmerking succesvol als onopgelost gemarkeerd", + "Failed to resolve comment": "Reactie oplossen mislukt", + "Resolve comment": "Opmerking oplossen", + "Unresolve comment": "Markering opgelost ongedaan maken", + "Resolve Comment Thread": "Opmerkingsthread oplossen", + "Unresolve Comment Thread": "Oplossen van opmerkingsthread ongedaan maken", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Weet u zeker dat u deze reactiedraad wilt oplossen? Dit zal het als voltooid markeren.", + "Are you sure you want to unresolve this comment thread?": "Weet u zeker dat u deze reactiedraad niet wilt oplossen?", + "Resolved": "Opgelost", + "No active comments.": "Geen actieve reacties.", + "Revoke invitation": "Uitnodiging intrekken", + "Revoke": "Intrekken", + "Don't": "Niet doen", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Weet u zeker dat u deze uitnodiging wilt intrekken? De gebruiker kan niet deelnemen aan de werkruimte.", + "Resend invitation": "Uitnodiging opnieuw verzenden", + "Anyone with this link can join this workspace.": "Iedereen met deze link kan zich aansluiten bij deze werkruimte.", + "Invite link": "Uitnodigingslink", + "Copy": "Kopieer", + "Copy to space": "Kopiëren naar ruimte", + "Copied": "Gekopieerd", + "Duplicate": "Dupliceren", + "Select a user": "Selecteer een gebruiker", + "Select a group": "Selecteer een groep", + "Export all pages and attachments in this space.": "Exporteer alle pagina's en bijlagen in deze ruimte.", + "Delete space": "Verwijder ruimte", + "Are you sure you want to delete this space?": "Weet u zeker dat u deze ruimte wil verwijderen?", + "Delete this space with all its pages and data.": "Verwijder deze ruimte met alle pagina's en gegevens.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Alle pagina's, opmerkingen, bijlagen en permissies in deze ruimte zullen onherroepelijk worden verwijderd.", + "Confirm space name": "Bevestig ruimtenaam", + "Type the space name {{spaceName}} to confirm your action.": "Typ de ruimtenaam {{spaceName}} om uw actie te bevestigen.", + "Format": "Formaat", + "Include subpages": "Inclusief onderliggend pagina's", + "Include attachments": "Inclusief bijlages", + "Select export format": "Selecteer export formaat", + "Export failed:": "Exporteren mislukt:", + "export error": "Exporteer fout", + "Export page": "Exporteer pagina", + "Export successful": "Export succesvol", + "Export space": "Exporteer ruimte", + "Export {{type}}": "Exporteer {{type}}", + "File exceeds the {{limit}} attachment limit": "Bestand overschrijdt de bijlagelimiet van {{limit}}", + "Media": "Media", + "Align left": "Links uitlijnen", + "Align right": "Rechts uitlijnen", + "Align center": "Centreren", + "Alt text": "Alternatieve tekst", + "Describe this for accessibility.": "Beschrijf dit voor toegankelijkheid.", + "Add a description": "Een beschrijving toevoegen", + "Justify": "Uitvullen", + "Merge cells": "Cellen samenvoegen", + "Split cell": "Cel splitsen", + "Delete column": "Kolom verwijderen", + "Delete row": "Rij verwijderen", + "Add left column": "Linker kolom toevoegen", + "Add right column": "Rechter kolom toevoegen", + "Add row above": "Rij hierboven toevoegen", + "Add row below": "Rij hieronder toevoegen", + "Delete table": "Verwijder tabel", + "Add column left": "Kolom links toevoegen", + "Add column right": "Kolom rechts toevoegen", + "Clear cell": "Cel wissen", + "Clear cells": "Cellen wissen", + "Toggle header cell": "Kopcel in-/uitschakelen", + "Toggle header column": "Kopkolom in-/uitschakelen", + "Toggle header row": "Koprij in-/uitschakelen", + "Move column left": "Kolom naar links verplaatsen", + "Move column right": "Kolom naar rechts verplaatsen", + "Move row down": "Rij omlaag verplaatsen", + "Move row up": "Rij omhoog verplaatsen", + "Sort A → Z": "Sorteren A → Z", + "Sort Z → A": "Sorteren Z → A", + "Info": "Info", + "Note": "Opmerking", + "Success": "Geslaagd", + "Warning": "Waarschuwing", + "Danger": "Gevaar", + "Mermaid diagram error:": "Mermaid diagram fout:", + "Invalid Mermaid diagram": "Ongeldig Mermaid diagram", + "Double-click to edit Draw.io diagram": "Dubbelklik om Draw.io diagram te bewerken", + "Exit": "Afsluiten", + "Save & Exit": "Opslaan & Afsluiten", + "Double-click to edit Excalidraw diagram": "Dubbelklik om Excalidraw diagram te bewerken", + "Paste link": "Link plakken", + "Paste link or search pages": "Plak link of zoek pagina's", + "Link to web page": "Link naar webpagina", + "Recents": "Recent", + "Page or URL": "Pagina of URL", + "Link title": "Kop van de link", + "Edit link": "Link bewerken", + "Remove link": "Link verwijderen", + "Add link": "Link toevoegen", + "Please enter a valid url": "Voer een geldige URL in", + "Empty equation": "Lege vergelijking", + "Invalid equation": "Ongeldige vergelijking", + "Color": "Kleur", + "Text color": "Tekstkleur", + "Default": "Standaard", + "Blue": "Blauw", + "Green": "Groen", + "Purple": "Paars", + "Red": "Rood", + "Yellow": "Geel", + "Orange": "Oranje", + "Pink": "Roze", + "Gray": "Grijs", + "Embed link": "Link insluiten", + "Invalid {{provider}} embed link": "Ongeldige {{provider}}-insluitlink", + "Embed {{provider}}": "Insluiten {{provider}}", + "Enter {{provider}} link to embed": "Voer {{provider}} link in om in te voegen", + "Bold": "Dikgedrukt", + "Italic": "Schuingedrukt", + "Underline": "Onderstrepen", + "Strike": "Doorhalen", + "Code": "Code", + "Comment": "Reactie", + "Text": "Tekst", + "Heading 1": "Kop 1", + "Heading 2": "Kop 2", + "Heading 3": "Kop 3", + "To-do List": "Takenlijst", + "Bullet List": "Opsommingslijst", + "Numbered List": "Genummerde lijst", + "Blockquote": "Blockquote", + "Just start typing with plain text.": "Begin met typen.", + "Track tasks with a to-do list.": "Houd taken bij met een takenlijst.", + "Big section heading.": "Grote sectie kop.", + "Medium section heading.": "Middelgrote sectie kop.", + "Small section heading.": "Kleine sectie kop.", + "Create a simple bullet list.": "Maak een eenvoudige opsommingslijst aan.", + "Create a list with numbering.": "Maak een lijst met nummering.", + "Create block quote.": "Maak een block quote.", + "Insert code snippet.": "Codefragment invoegen.", + "Insert horizontal rule divider": "Horizontale lijn invoegen", + "Page break": "Pagina-einde", + "Insert a page break for printing.": "Voeg een pagina-einde in voor het afdrukken.", + "Footnote": "Voetnoot", + "Insert a footnote reference.": "Voeg een voetnootverwijzing in.", + "Upload any image from your device.": "Upload een afbeelding vanaf uw apparaat.", + "Upload any video from your device.": "Upload een video vanaf uw apparaat.", + "Upload any audio from your device.": "Upload een audio vanaf uw apparaat.", + "Upload any file from your device.": "Upload een bestand vanaf uw apparaat.", + "Uploading {{name}}": "Uploaden {{name}}", + "Uploading file": "Bestand uploaden", + "Table": "Tabel", + "Insert a table.": "Voeg een tabel in.", + "Insert collapsible block.": "Inklapbaar blok invoegen.", + "Video": "Video", + "Divider": "Scheidingslijn", + "Quote": "Citaat", + "Image": "Afbeelding", + "Audio": "Audio", + "Embed PDF": "PDF insluiten", + "Upload and embed a PDF file.": "Upload en sluit een PDF-bestand in.", + "Embed as PDF": "Insluiten als PDF", + "Failed to load PDF": "Laden van PDF mislukt", + "Convert to attachment": "Converteren naar bijlage", + "File attachment": "Bestandsbijlage", + "Toggle block": "In-/uitklapbaar blok", + "Callout": "Uitgelicht blok", + "Insert callout notice.": "Invoegen opmerking.", + "Math inline": "Inline wiskunde", + "Insert inline math equation.": "Wiskundige inline vergelijking invoegen.", + "Math block": "Wiskundeblok", + "Insert math equation": "Wiskundige vergelijking invoegen", + "Mermaid diagram": "Mermaid-diagram", + "Insert mermaid diagram": "Mermaid-diagram invoegen", + "Insert and design Drawio diagrams": "Drawio-diagrammen invoegen en ontwerpen", + "Insert current date": "Huidige datum invoegen", + "Time": "Tijd", + "Insert current time": "Huidige tijd invoegen", + "Draw and sketch excalidraw diagrams": "Excalidraw-diagrammen tekenen en schetsen", + "Multiple": "Meerdere", + "Turn into": "Omzetten naar", + "Text align": "Tekstuitlijning", + "This page may have been deleted, moved, or you may not have access.": "Deze pagina is mogelijk verwijderd of verplaatst, of u heeft er geen toegang toe.", + "Go to homepage": "Ga naar de startpagina", + "Pages you create will show up here.": "Pagina's die u aanmaakt, verschijnen hier.", + "Heading {{level}}": "Kop {{level}}", + "Toggle title": "Titel in-/uitklappen", + "Write anything. Enter \"/\" for commands": "Schrijf iets. Typ \"/\" voor opdrachten", + "Write...": "Typ...", + "Column count": "Aantal kolommen", + "{{count}} Columns": "{{count}} kolommen", + "{{count}} command available_one": "1 opdracht beschikbaar", + "{{count}} command available_other": "{{count}} opdrachten beschikbaar", + "{{count}} result available_one": "1 resultaat beschikbaar", + "{{count}} result available_other": "{{count}} resultaten beschikbaar", + "Equal columns": "Gelijke kolommen", + "Left sidebar": "Linker zijbalk", + "Right sidebar": "Rechter zijbalk", + "Wide center": "Brede middenkolom", + "Left wide": "Brede linkerkolom", + "Right wide": "Brede rechterkolom", + "Names do not match": "Namen komen niet overeen", + "Today, {{time}}": "Vandaag, {{time}}", + "Yesterday, {{time}}": "Gisteren, {{time}}", + "now": "nu", + "Space created successfully": "Ruimte succesvol aangemaakt", + "Space updated successfully": "Ruimte succesvol bijgewerkt", + "Space deleted successfully": "Ruimte succesvol verwijderd", + "Members added successfully": "Leden succesvol toegevoegd", + "Member removed successfully": "Lid succesvol verwijderd", + "Member role updated successfully": "Rol van lid succesvol bijgewerkt", + "Created by: {{creatorName}}": "Aangemaakt door: {{creatorName}}", + "Created at: {{time}}": "Aangemaakt op: {{time}}", + "Edited by {{name}} {{time}}": "Bewerkt door {{name}} {{time}}", + "Word count: {{wordCount}}": "Aantal woorden: {{wordCount}}", + "Character count: {{characterCount}}": "Aantal tekens: {{characterCount}}", + "New update": "Nieuwe update", + "{{latestVersion}} is available": "{{latestVersion}} is beschikbaar", + "Default page edit mode": "Standaard bewerkingsmodus voor pagina", + "Choose your preferred page edit mode. Avoid accidental edits.": "Kies uw voorkeurs bewerkmodus voor pagina's. Vermijd per ongeluk bewerken.", + "Choose {{format}} file": "Kies {{format}}-bestand", + "Reading": "Lezen", + "Delete member": "Lid verwijderen", + "Member deleted successfully": "Lid succesvol verwijderd", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Weet u zeker dat u dit lid van de werkruimte wilt verwijderen? Deze actie kan niet ongedaan gemaakt worden.", + "Deactivate member": "Lid deactiveren", + "Activate member": "Lid activeren", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Weet u zeker dat u dit lid van de werkruimte wilt deactiveren? Deze persoon heeft daarna geen toegang meer tot deze werkruimte.", + "Are you sure you want to activate this workspace member?": "Weet u zeker dat u dit lid van de werkruimte wilt activeren?", + "Deactivate": "Deactiveren", + "Activate": "Activeren", + "Deactivated": "Gedeactiveerd", + "Move": "Verplaatsen", + "Move page": "Pagina verplaatsen", + "Move page to a different space.": "Verplaats pagina naar een andere ruimte.", + "Real-time editor connection lost. Retrying...": "Realtime editorverbinding verloren. Opnieuw proberen...", + "Table of contents": "Inhoudsopgave", + "Add headings (H1, H2, H3) to generate a table of contents.": "Voeg koppen (H1, H2, H3) toe om een inhoudsopgave te genereren.", + "Share": "Delen", + "Public sharing": "Openbaar delen", + "Shared by": "Gedeeld door", + "Shared at": "Gedeeld op", + "Inherits public sharing from": "Erft openbaar delen van", + "Share to web": "Delen op het web", + "Shared to web": "Gedeeld op het web", + "Anyone with the link can view this page": "Iedereen met de link kan deze pagina bekijken", + "Make this page publicly accessible": "Maak deze pagina openbaar toegankelijk", + "Include sub-pages": "Subpagina's opnemen", + "Make sub-pages public too": "Maak subpagina's ook openbaar", + "Allow search engines to index page": "Sta zoekmachines toe de pagina te indexeren", + "Open page": "Pagina openen", + "Page": "Pagina", + "Delete public share link": "Openbare deellink verwijderen", + "Delete share": "Deel verwijderen", + "Are you sure you want to delete this shared link?": "Weet u zeker dat u deze gedeelde link wilt verwijderen?", + "Publicly shared pages from spaces you are a member of will appear here": "Openbaar gedeelde pagina's uit ruimtes waarvan je lid bent, verschijnen hier", + "Share deleted successfully": "Deel succesvol verwijderd", + "Share not found": "Deel niet gevonden", + "Failed to share page": "Pagina delen mislukt", + "Disable public sharing": "Openbaar delen uitschakelen", + "Prevent members from sharing pages publicly.": "Voorkom dat leden pagina's openbaar delen.", + "Toggle public sharing": "Wissel openbaar delen", + "Toggle space public sharing": "Wissel openbaar delen van ruimte", + "Allow viewers to comment": "Toestaan dat kijkers reageren", + "Allow viewers to add comments on pages in this space.": "Sta kijkers toe om reacties toe te voegen op pagina\u0019s in deze ruimte.", + "Toggle viewer comments": "Reacties van kijkers in- of uitschakelen", + "Public sharing is disabled at the workspace level": "Openbaar delen is uitgeschakeld op werkruimteniveau", + "Prevent pages in this space from being shared publicly.": "Voorkom dat pagina's in deze ruimte openbaar worden gedeeld.", + "Page permissions": "Pagina rechten", + "Control who can view and edit individual pages. Available with an enterprise license.": "Beheer wie individuele pagina's kan bekijken en bewerken. Beschikbaar met een Enterprise-licentie.", + "Enable public sharing": "Openbaar delen inschakelen", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Weet je zeker dat je openbaar delen wilt inschakelen? Leden kunnen pagina's openbaar delen.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Weet je zeker dat je openbaar delen wilt uitschakelen? Alle bestaande gedeelde links in deze werkruimte zullen worden verwijderd.", + "Are you sure you want to enable public sharing for this space?": "Weet je zeker dat je openbaar delen voor deze ruimte wilt inschakelen?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Weet je zeker dat je openbaar delen wilt uitschakelen? Alle bestaande gedeelde links in deze ruimte zullen worden verwijderd.", + "Public sharing is disabled": "Openbaar delen is uitgeschakeld", + "Public sharing has been disabled at the workspace level.": "Openbaar delen is uitgeschakeld op werkruimteniveau.", + "Public sharing has been disabled for this space.": "Openbaar delen is uitgeschakeld voor deze ruimte.", + "Copy page": "Pagina kopiëren", + "Copy page to a different space.": "Kopieer pagina naar een andere ruimte.", + "Page copied successfully": "Pagina succesvol gekopieerd", + "Page duplicated successfully": "Pagina succesvol gedupliceerd", + "Find": "Zoeken", + "Not found": "Niet gevonden", + "Previous Match (Shift+Enter)": "Vorige overeenkomst (Shift+Enter)", + "Next match (Enter)": "Volgende overeenkomst (Enter)", + "Match case (Alt+C)": "Hoofdlettergevoelig (Alt+C)", + "Replace": "Vervangen", + "Close (Escape)": "Sluiten (Escape)", + "Replace (Enter)": "Vervangen (Enter)", + "Replace all (Ctrl+Alt+Enter)": "Alles vervangen (Ctrl+Alt+Enter)", + "Replace all": "Alles vervangen", + "View all": "Alles bekijken", + "View all spaces": "Alle ruimtes bekijken", + "Error": "Fout", + "Failed to disable MFA": "MFA uitschakelen mislukt", + "Disable two-factor authentication": "Tweefactorauthenticatie uitschakelen", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Indien u twee-factor authenticatie uitschakelt, zal uw account minder veilig zijn. U heeft alleen uw wachtwoord nodig om in te loggen.", + "Please enter your password to disable two-factor authentication:": "Voer uw wachtwoord in om twee-factor authenticatie uit te schakelen:", + "Two-factor authentication has been enabled": "Tweefactorauthenticatie is ingeschakeld", + "Two-factor authentication has been disabled": "Tweefactorauthenticatie is uitgeschakeld", + "2-step verification": "Verificatie in 2 stappen", + "Protect your account with an additional verification layer when signing in.": "Bescherm uw account met een extra verificatielaag tijdens het inloggen.", + "Two-factor authentication is active on your account.": "Twee-factor authenticatie is actief op uw account.", + "Add 2FA method": "2FA-methode toevoegen", + "Backup codes": "Back-upcodes", + "Disable": "Uitschakelen", + "Invalid verification code": "Ongeldige verificatiecode", + "New backup codes have been generated": "Nieuwe back-upcodes zijn gegenereerd", + "Failed to regenerate backup codes": "Back-upcodes opnieuw genereren mislukt", + "About backup codes": "Over back-upcodes", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Back-up codes kunnen worden gebruikt om uw account te bereiken als u toegang tot uw authenticator-app verliest. Elke code kan slechts één keer worden gebruikt.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "U kunt te allen tijde nieuwe back-up codes genereren. Dit zal alle bestaande codes ongeldig maken.", + "Confirm password": "Bevestig wachtwoord", + "Generate new backup codes": "Nieuwe back-upcodes genereren", + "Save your new backup codes": "Sla je nieuwe back-upcodes op", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Zorg ervoor dat u deze codes op een veilige plek opslaat. Uw oude back-up codes zijn niet langer geldig.", + "Your new backup codes": "Je nieuwe back-upcodes", + "I've saved my backup codes": "Ik heb mijn back-upcodes opgeslagen", + "Failed to setup MFA": "MFA instellen mislukt", + "Setup & Verify": "Instellen en verifiëren", + "Add to authenticator": "Toevoegen aan authenticator", + "1. Scan this QR code with your authenticator app": "1. Scan deze QR-code met je authenticator-app", + "Can't scan the code?": "Kan de code niet scannen?", + "Enter this code manually in your authenticator app:": "Voer deze code handmatig in uw authenticator-app in:", + "2. Enter the 6-digit code from your authenticator": "2. Voer de 6-cijferige code van je authenticator in", + "Verify and enable": "Verifiëren en inschakelen", + "Failed to generate QR code. Please try again.": "Het genereren van de QR-code is mislukt. Probeer het opnieuw.", + "Backup": "Back-up", + "Save codes": "Codes opslaan", + "Save your backup codes": "Sla je back-upcodes op", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Deze codes kunnen worden gebruikt om toegang te krijgen tot uw account als u de toegang tot uw authenticator-app verliest. Elke code kan slechts één keer worden gebruikt.", + "Print": "Afdrukken", + "Two-factor authentication has been set up. Please log in again.": "Twee-factor authenticatie is ingesteld. Log alstublieft opnieuw in.", + "Two-Factor authentication required": "Tweefactorauthenticatie vereist", + "Your workspace requires two-factor authentication for all users": "Je werkruimte vereist tweefactorauthenticatie voor alle gebruikers", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Om toegang te blijven krijgen tot uw werkruimte, moet u twee-factor authenticatie instellen. Dit voegt een extra beveiligingslaag toe aan uw account.", + "Set up two-factor authentication": "Tweefactorauthenticatie instellen", + "Cancel and logout": "Annuleren en uitloggen", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Uw werkruimte vereist twee-factor authenticatie. Stel het in om door te gaan.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Dit voegt een extra beveiligingslaag toe aan uw account door een verificatiecode van uw authenticator-app te vereisen.", + "Password is required": "Wachtwoord is verplicht", + "Password must be at least 8 characters": "Wachtwoord moet minimaal 8 tekens bevatten", + "Please enter a 6-digit code": "Voer een 6-cijferige code in", + "Code must be exactly 6 digits": "Code moet precies 6 cijfers bevatten", + "Enter the 6-digit code found in your authenticator app": "Voer de 6-cijferige code uit je authenticator-app in", + "Need help authenticating?": "Hulp nodig bij het authenticeren?", + "MFA QR Code": "MFA QR-code", + "Account created successfully. Please log in to set up two-factor authentication.": "Account succesvol aangemaakt. Log alstublieft in om twee-factor authenticatie in te stellen.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Wachtwoord reset succesvol. Log in met uw nieuwe wachtwoord en voltooi twee-factor authenticatie.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Wachtwoord reset succesvol. Log in met uw nieuwe wachtwoord om twee-factor authenticatie in te stellen.", + "Password reset was successful. Please log in with your new password.": "De wachtwoord reset was succesvol. Log in met uw nieuwe wachtwoord.", + "Two-factor authentication": "Tweefactorauthenticatie", + "Use authenticator app instead": "Gebruik in plaats daarvan een authenticator-app", + "Verify backup code": "Back-upcode verifiëren", + "Use backup code": "Back-upcode gebruiken", + "Enter one of your backup codes": "Voer een van je back-upcodes in", + "Backup code": "Back-upcode", + "Enter one of your backup codes. Each backup code can only be used once.": "Voer een van uw back-up codes in. Elke back-up code kan slechts één keer worden gebruikt.", + "Verify": "Verifiëren", + "Trash": "Prullenbak", + "Pages in trash will be permanently deleted after {{count}} days.": "Pagina's in de prullenbak worden na {{count}} dagen permanent verwijderd.", + "Deleted": "Verwijderd", + "No pages in trash": "Geen pagina's in de prullenbak", + "Permanently delete page?": "Pagina permanent verwijderen?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Weet u zeker dat u '{{title}}' permanent wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "Restore '{{title}}' and its sub-pages?": "'{{title}}' en zijn subpagina's herstellen?", + "Move to trash": "Verplaatsen naar prullenbak", + "Move this page to trash?": "Deze pagina naar de prullenbak verplaatsen?", + "Restore page": "Pagina herstellen", + "Permanently delete": "Permanent verwijderen", + "{{name}} moved this page to Trash {{time}}.": "{{name}} heeft deze pagina {{time}} naar de prullenbak verplaatst.", + "Page moved to trash": "Pagina verplaatst naar prullenbak", + "Page restored successfully": "Pagina succesvol hersteld", + "Deleted by": "Verwijderd door", + "Deleted at": "Verwijderd op", + "Preview": "Voorbeeld", + "Base preview unavailable": "Voorbeeld van basis niet beschikbaar", + "Restore this base to view its contents.": "Herstel deze basis om de inhoud te bekijken.", + "Subpages": "Subpagina's", + "Failed to load subpages": "Subpagina's laden mislukt", + "No subpages": "Geen subpagina's", + "Subpages (Child pages)": "Subpagina's (onderliggende pagina's)", + "List all subpages of the current page": "Toon alle subpagina's van de huidige pagina", + "Attachments": "Bijlagen", + "All spaces": "Alle ruimtes", + "Unknown": "Onbekend", + "Find a space": "Zoek een ruimte", + "Search in all your spaces": "Zoek in al je ruimtes", + "Type": "Type", + "Enterprise": "Enterprise", + "Download attachment": "Bijlage downloaden", + "Allowed email domains": "Toegestane e-maildomeinen", + "Only users with email addresses from these domains can signup via SSO.": "Alleen gebruikers met e-mailadressen van deze domeinen kunnen zich via SSO registreren.", + "Enter valid domain names separated by comma or space": "Voer geldige domeinnamen in, gescheiden door komma of spatie", + "Enforce two-factor authentication": "Tweefactorauthenticatie afdwingen", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Na handhaving moeten alle leden tweefactorauthenticatie inschakelen om toegang te krijgen tot de werkomgeving.", + "Toggle MFA enforcement": "MFA-afdwinging in-/uitschakelen", + "Display name": "Weergavenaam", + "Allow signup": "Registratie toestaan", + "Enabled": "Ingeschakeld", + "Advanced Settings": "Geavanceerde instellingen", + "Enable TLS/SSL": "TLS/SSL inschakelen", + "Use secure connection to LDAP server": "Gebruik een beveiligde verbinding met de LDAP-server", + "Group sync": "Groepssynchronisatie", + "No SSO providers found.": "Geen SSO-providers gevonden.", + "Delete SSO provider": "SSO-provider verwijderen", + "Are you sure you want to delete this SSO provider?": "Weet u zeker dat u deze SSO-provider wilt verwijderen?", + "Action": "Actie", + "{{ssoProviderType}} configuration": "{{ssoProviderType}}-configuratie", + "Icon": "Pictogram", + "Upload image": "Afbeelding uploaden", + "Remove image": "Afbeelding verwijderen", + "Failed to remove image": "Afbeelding verwijderen mislukt", + "Image exceeds 10MB limit.": "Afbeelding overschrijdt de limiet van 10MB.", + "Image removed successfully": "Afbeelding succesvol verwijderd", + "API key": "API-sleutel", + "API keys": "API-sleutels", + "API management": "API-beheer", + "Custom expiration date": "Aangepaste vervaldatum", + "Enter a descriptive token name": "Voer een beschrijvende tokennaam in", + "Expiration": "Vervaldatum", + "Expired": "Verlopen", + "Expires": "Verloopt", + "Last use": "Laatst gebruikt", + "No API keys found": "Geen API-sleutels gevonden", + "No expiration": "Geen vervaldatum", + "Revoked successfully": "Succesvol ingetrokken", + "Select expiration date": "Selecteer vervaldatum", + "This action cannot be undone. Any applications using this API key will stop working.": "Deze actie kan niet ongedaan worden gemaakt. Alle toepassingen die deze API-sleutel gebruiken, zullen niet meer werken.", + "Update": "Bijwerken", + "Update {{credential}}": "{{credential}} bijwerken", + "Manage API keys for all users in the workspace": "Beheer API-sleutels voor alle gebruikers in de werkruimte", + "Restrict API key creation to admins": "Beperk het aanmaken van API-sleutels tot beheerders.", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Alleen beheerders en eigenaren kunnen nieuwe API-sleutels aanmaken. Bestaande leden-sleutels blijven werken.", + "Toggle restrict API keys to admins": "Schakel het beperken van API-sleutels tot beheerders in/uit", + "API key creation is restricted to admins by your workspace administrator.": "Het aanmaken van API-sleutels is door je werkruimtebeheerder beperkt tot beheerders.", + "AI settings": "AI-instellingen", + "AI search": "AI-zoekopdracht", + "AI Answer": "AI Antwoord", + "Ask AI": "Vraag AI", + "AI is thinking...": "AI is aan het nadenken...", + "Thinking": "Denken", + "Ask a question...": "Stel een vraag...", + "AI Answers": "AI Antwoorden", + "AI-powered search (AI Answers)": "AI-gestuurde zoekopdracht (AI Antwoorden)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI-zoekopdracht maakt gebruik van vectorembeddings om semantische zoekmogelijkheden te bieden in uw werkruimte-inhoud.", + "Toggle AI search": "Schakel AI-zoekopdracht in/uit", + "Generative AI (Ask AI)": "Generatieve AI (Vraag het AI)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Schakel AI-gestuurde inhoudsgeneratie in de editor in. Hiermee kunnen gebruikers tekst genereren, verbeteren, vertalen en transformeren.", + "Toggle generative AI": "Generatieve AI schakelen", + "Upgrade your plan": "Upgrade je abonnement", + "Available with a paid license": "Beschikbaar met een betaalde licentie", + "Upgrade your license tier.": "Upgrade je licentieniveau.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "AI is beschikbaar in de betaalde edities van Docmost. Neem contact op met sales@docmost.com.", + "AI & MCP": "AI & MCP", + "AI": "AI", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Model Context Protocol (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Schakel de MCP-server in zodat AI-assistenten en tools kunnen interageren met de inhoud van uw werkruimte.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP is alleen beschikbaar in de Docmost Enterprise-editie. Neem contact op met sales@docmost.com.", + "MCP Server URL": "MCP-server-URL", + "Connect AI assistants with your Docmost account via OAuth.": "Verbind AI-assistenten met je Docmost-account via OAuth.", + "Enforce OAuth": "OAuth afdwingen", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI-assistenten moeten verbinding maken met een Docmost-account via OAuth. API-sleutels kunnen niet worden gebruikt met de MCP-server.", + "Toggle enforce OAuth for MCP": "OAuth afdwingen voor MCP in- of uitschakelen", + "Supported tools": "Ondersteunde tools", + "MCP server URL:": "MCP-server-URL:", + "Learn more": "Meer informatie", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Beheer API-sleutels voor alle gebruikers in de werkruimte. Bekijk de API-documentatie voor gebruiksdetails.", + "View the API documentation for usage details.": "Bekijk de API-documentatie voor gebruiksdetails.", + "View the MCP documentation.": "Bekijk de MCP-documentatie.", + "Sources": "Bronnen", + "AI Answers not available for attachments": "AI Antwoorden niet beschikbaar voor bijlagen", + "No answer available": "Geen antwoord beschikbaar", + "Background color": "Achtergrondkleur", + "Highlight color": "Markeerkleur", + "Remove color": "Kleur verwijderen", + "Notifications": "Meldingen", + "No notifications": "Geen meldingen", + "No unread notifications": "Geen ongelezen meldingen", + "All notifications": "Alle meldingen", + "Unread only": "Alleen ongelezen", + "Mark all as read": "Markeer alles als gelezen", + "Mark as read": "Markeer als gelezen", + "More options": "Meer opties", + "{{name}} mentioned you in a comment": "{{name}} noemde je in een reactie", + "{{name}} commented on a page": "{{name}} heeft een reactie geplaatst op een pagina", + "{{name}} resolved a comment": "{{name}} heeft een opmerking opgelost", + "{{name}} mentioned you on a page": "{{name}} heeft je genoemd op een pagina", + "{{name}} gave you edit access to a page": "{{name}} heeft je bewerkingsrechten gegeven voor een pagina", + "{{name}} gave you view access to a page": "{{name}} heeft je kijkrechten gegeven voor een pagina", + "{{name}} updated a page": "{{name}} heeft een pagina bijgewerkt", + "Watch page": "Pagina volgen", + "Stop watching": "Niet meer volgen", + "Watch space": "Ruimte volgen", + "Stop watching space": "Ruimte niet meer volgen", + "Email notifications": "E-mailmeldingen", + "Page updates": "Pagina-updates", + "Get notified when pages you watch are updated.": "Ontvang een melding wanneer pagina's die je volgt worden bijgewerkt.", + "Page mentions": "Pagina-vermeldingen", + "Get notified when someone mentions you on a page.": "Ontvang een melding wanneer iemand je noemt op een pagina.", + "Comment mentions": "Vermeldingen in opmerkingen", + "Get notified when someone mentions you in a comment.": "Ontvang een melding wanneer iemand je noemt in een opmerking.", + "New comments": "Nieuwe opmerkingen", + "Get notified about new comments on threads you participate in.": "Ontvang meldingen over nieuwe reacties in threads waaraan je deelneemt.", + "Resolved comments": "Opgeloste opmerkingen", + "Get notified when your comment is resolved.": "Ontvang een melding wanneer je reactie is opgelost.", + "You are now watching this page": "Je volgt nu deze pagina", + "You are no longer watching this page": "Je volgt deze pagina niet meer", + "You are now watching this space": "Je volgt deze ruimte nu", + "You are no longer watching this space": "Je volgt deze ruimte niet meer", + "Direct": "Direct", + "Updates": "Updates", + "Today": "Vandaag", + "Yesterday": "Gisteren", + "This week": "Deze week", + "Older": "Ouder", + "Restricted page": "Beperkte pagina", + "Restricted pages cannot be shared publicly.": "Beperkte pagina's kunnen niet openbaar worden gedeeld.", + "Restricted by parent": "Beperkt door bovenliggende", + "Restricted": "Beperkt", + "Open": "Open", + "Inherits restrictions from ancestor page": "Erft restricties van de bovenliggende pagina", + "Only people listed below can access this page": "Alleen onderstaande personen hebben toegang tot deze pagina", + "Everyone in this space can access": "Iedereen in deze ruimte heeft toegang", + "No additional restrictions on this page": "Geen aanvullende restricties op deze pagina", + "Only specific people can access": "Alleen specifieke personen hebben toegang", + "Use only inherited restrictions": "Gebruik alleen overgenomen restricties", + "Add restrictions on top of inherited": "Restricties toevoegen bovenop geërfd", + "Inherited restriction": "Overgenomen restrictie", + "Access limited by": "Toegang beperkt door", + "Restrict access to control who can view and edit this page": "Beperk de toegang om te bepalen wie deze pagina kan bekijken en bewerken", + "Add additional restrictions specific to this page": "Voeg extra beperkingen toe voor deze pagina", + "Access": "Toegang", + "People with access": "Personen die toegang", + "Remove all": "Alles verwijderen", + "Remove access": "Toegang verwijderen", + "Remove all access": "Alle toegang verwijderen", + "Are you sure you want to remove this member's access to the page?": "Weet u zeker dat u de toegang van dit lid tot de pagina wilt intrekken?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Weet u zeker dat u alle specifieke toegang wilt verwijderen? Hiermee wordt de pagina voor iedereen in de ruimte beschikbaar.", + "Trash retention": "Bewaartermijn prullenbak", + "Pages in trash will be permanently deleted after this period.": "Pagina's in de prullenbak worden na deze periode permanent verwijderd.", + "Trash retention updated": "Bewaartermijn prullenbak bijgewerkt", + "Failed to update trash retention": "Bijwerken van de bewaartermijn voor de prullenbak is mislukt.", + "Removed page restriction": "Pagina-restrictie verwijderd", + "Added page permission": "Paginatoestemming toegevoegd", + "Removed page permission": "Paginatoestemming verwijderd", + "Changed page permission": "Paginamachtiging gewijzigd", + "Requested password reset": "Wachtwoordreset aangevraagd", + "Created template": "Sjabloon aangemaakt", + "Deleted template": "Sjabloon verwijderd", + "day": "dag", + "days": "dagen", + "week": "week", + "weeks": "weken", + "month": "maand", + "months": "maanden", + "year": "jaar", + "years": "jaren", + "Period": "Periode", + "Fixed date": "Vaste datum", + "Indefinitely": "Voor onbepaalde tijd", + "Days": "Dagen", + "Weeks": "Weken", + "Months": "Maanden", + "Years": "Jaren", + "Pick a date": "Kies een datum", + "Maximum is {{max}} {{unit}} for this unit": "Maximum is {{max}} {{unit}} voor deze eenheid", + "Never expires. Verifiers can re-verify at any time.": "Verloopt nooit. Verificateurs kunnen op elk moment opnieuw verifiëren.", + "Verified": "Geverifieerd", + "Review needed": "Beoordeling nodig", + "Verification expired": "Verificatie verlopen", + "Draft": "Concept", + "In Approval": "In goedkeuring", + "In approval": "In goedkeuring", + "Approved": "Goedgekeurd", + "Obsolete": "Verouderd", + "Expiring": "Verloopt binnenkort", + "Set up verification": "Verificatie instellen", + "Verify page": "Pagina verifiëren", + "Page verification": "Paginaverificatie", + "Add verification": "Verificatie toevoegen", + "Edit verification": "Verificatie bewerken", + "Search by title": "Zoeken op titel", + "Choose how this page should stay accurate.": "Kies hoe deze pagina accuraat moet blijven.", + "Recurring verification": "Terugkerende verificatie", + "Verifiers re-confirm this page on a schedule.": "Verificateurs bevestigen deze pagina opnieuw volgens een schema.", + "Re-verify on a schedule (e.g every 30 days )": "Opnieuw verifiëren volgens een schema (bijv. elke 30 dagen)", + "Page stays editable at all times": "Pagina blijft altijd bewerkbaar", + "Best for runbooks, FAQs, living documentation": "Het beste voor runbooks, veelgestelde vragen en levende documentatie", + "Approval workflow": "Goedkeuringsworkflow", + "Formal document lifecycle with named approvers.": "Formele documentlevenscyclus met benoemde goedkeurders.", + "Draft → In approval → Approved → Obsolete": "Concept → In goedkeuring → Goedgekeurd → Verouderd", + "Locked once approved, with full history": "Vergrendeld zodra goedgekeurd, met volledige geschiedenis", + "Designed for ISO 9001, ISO 13485, and FDA": "Ontworpen voor ISO 9001, ISO 13485 en FDA", + "Best for SOPs and controlled documents": "Het beste voor SOP's en beheerde documenten", + "Back": "Terug", + "Quality management": "Kwaliteitsmanagement", + "Recurring": "Terugkerend", + "Pages move through draft, approval, and approved stages.": "Pagina's doorlopen de fasen concept, goedkeuring en goedgekeurd.", + "Verifiers": "Verificateurs", + "Add verifier": "Verificateur toevoegen", + "I've reviewed this page for accuracy": "Ik heb deze pagina op nauwkeurigheid beoordeeld", + "Set up": "Instellen", + "Remove verification": "Verificatie verwijderen", + "Are you sure you want to remove verification from this page?": "Weet je zeker dat je verificatie van deze pagina wilt verwijderen?", + "Assigned verifiers must periodically re-verify this page.": "Toegewezen verificateurs moeten deze pagina periodiek opnieuw verifiëren.", + "Last verified by {{name}} {{time}} (expired)": "Laatst geverifieerd door {{name}} {{time}} (verlopen)", + "The fixed expiration date has passed.": "De vaste vervaldatum is verstreken.", + "Verified by {{name}} {{time}}": "Geverifieerd door {{name}} {{time}}", + "Expires {{date}}": "Verloopt op {{date}}", + "Expired {{date}}": "Verlopen op {{date}}", + "Mark as obsolete": "Markeren als verouderd", + "Mark obsolete": "Markeer als verouderd", + "Returned by {{name}} {{time}}": "Teruggestuurd door {{name}} {{time}}", + "No approval has been requested yet.": "Er is nog geen goedkeuring aangevraagd.", + "Submitted by {{name}} {{time}}": "Ingediend door {{name}} {{time}}", + "Someone": "Iemand", + "Approved by {{name}} {{time}}": "Goedgekeurd door {{name}} {{time}}", + "This document has been marked as obsolete.": "Dit document is als verouderd gemarkeerd.", + "Rejection comment": "Afwijzingsopmerking", + "Reason for returning this document...": "Reden om dit document terug te sturen...", + "Confirm rejection": "Afwijzing bevestigen", + "Submit for approval": "Indienen voor goedkeuring", + "Reject": "Afwijzen", + "Approve": "Goedkeuren", + "Re-submit for approval": "Opnieuw indienen voor goedkeuring", + "Verified until": "Geverifieerd tot", + "QMS": "QMS", + "Verified pages": "Geverifieerde pagina's", + "Search pages...": "Pagina's zoeken...", + "Filter by space": "Filteren op ruimte", + "Filter by type": "Filteren op type", + "{{name}} verified a page": "{{name}} heeft een pagina geverifieerd", + "{{name}} submitted a page for your approval": "{{name}} heeft een pagina voor jouw goedkeuring ingediend", + "{{name}} returned a page for revision": "{{name}} heeft een pagina teruggestuurd voor revisie", + "Page verification expires soon": "Paginaverificatie verloopt binnenkort", + "Page verification has expired": "Paginaverificatie is verlopen", + "SIEM destination {{name}} is failing": "SIEM-bestemming {{name}} faalt", + "SIEM destination {{name}} was disabled after 24 hours of failures": "SIEM-bestemming {{name}} is uitgeschakeld na 24 uur met fouten", + "SIEM destination {{name}} recovered": "SIEM-bestemming {{name}} hersteld", + "Verifying your email": "Je e-mailadres wordt geverifieerd", + "Please wait...": "Even geduld...", + "Verification failed. The link may have expired.": "Verificatie mislukt. De link is mogelijk verlopen.", + "Check your email": "Controleer je e-mail", + "We sent a verification link to {{email}}.": "We hebben een verificatielink naar {{email}} gestuurd.", + "We sent a verification link to your email.": "We hebben een verificatielink naar je e-mailadres gestuurd.", + "Click the link to verify your email and access your workspace.": "Klik op de link om je e-mailadres te verifiëren en toegang te krijgen tot je werkruimte.", + "Resend verification email": "Verificatie-e-mail opnieuw verzenden", + "Verification email sent. Please check your inbox.": "Verificatie-e-mail verzonden. Controleer je inbox.", + "Failed to resend verification email. Please try again.": "Het verzenden van de verificatie-e-mail is mislukt. Probeer het opnieuw.", + "We've sent you an email with your associated workspaces.": "We hebben je een e-mail gestuurd met je gekoppelde werkruimtes.", + "Load more": "Meer laden", + "Log out of all devices": "Uitloggen op alle apparaten", + "Log out of all sessions except this device": "Uitloggen uit alle sessies behalve op dit apparaat", + "This Device": "Dit apparaat", + "Unknown device": "Onbekend apparaat", + "No active sessions": "Geen actieve sessies", + "Session revoked": "Sessie ingetrokken", + "All other sessions revoked": "Alle andere sessies ingetrokken", + "Last used": "Laatst gebruikt", + "Created": "Aangemaakt", + "Rename": "Hernoemen", + "Publish": "Publiceren", + "Security": "Beveiliging", + "Enforce SSO": "SSO afdwingen", + "Once enforced, members will not be able to login with email and password.": "Zodra dit is afgedwongen, kunnen leden niet meer inloggen met e-mail en wachtwoord.", + "AI-generated content may not be accurate.": "Door AI gegenereerde inhoud is mogelijk niet nauwkeurig.", + "AI Chat": "AI-chat", + "Analyze for insights": "Analyseren voor inzichten", + "Ask anything...": "Vraag iets...", + "Assistant said:": "Assistent zei:", + "Chat history": "Chatgeschiedenis", + "Chat name": "Chatnaam", + "Chat transcript": "Chattranscript", + "Close": "Sluiten", + "Copy assistant response": "Reactie van assistent kopiëren", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "Chat laden mislukt. Er is een fout opgetreden.", + "Failed to render this message.": "Dit bericht kon niet worden weergegeven.", + "How can I help you today?": "Hoe kan ik je vandaag helpen?", + "New chat": "Nieuwe chat", + "No chat history": "Geen chatgeschiedenis", + "No chats found": "Geen chats gevonden", + "No conversations yet": "Nog geen gesprekken", + "Open full page": "Volledige pagina openen", + "Scroll to bottom": "Naar beneden scrollen", + "You said:": "Jij zei:", + "Previous 7 days": "Afgelopen 7 dagen", + "Previous 30 days": "Afgelopen 30 dagen", + "Search chats...": "Chats zoeken...", + "Search chats": "Chats zoeken", + "Ask anything... Use @ to mention pages": "Vraag iets... Gebruik @ om pagina's te vermelden", + "Ask anything or search your workspace": "Vraag iets of doorzoek je werkruimte", + "Welcome to {{name}}": "Welkom bij {{name}}", + "Add files": "Bestanden toevoegen", + "Mention a page": "Een pagina vermelden", + "Start a new chat to see it here.": "Start een nieuwe chat om die hier te zien.", + "Summarize this page": "Vat deze pagina samen", + "Toggle AI Chat": "AI-chat in-/uitschakelen", + "Translate this page": "Vertaal deze pagina", + "Try a different search term.": "Probeer een andere zoekterm.", + "Try again": "Probeer opnieuw", + "Untitled chat": "Chat zonder titel", + "What can I help you with?": "Waar kan ik je mee helpen?", + "Are you sure you want to revoke this {{credential}}": "Weet u zeker dat u deze {{credential}} wilt intrekken", + "Automatically provision users and groups from your identity provider via SCIM.": "Voorzie gebruikers en groepen automatisch vanuit uw identiteitsprovider via SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Configureer uw identiteitsprovider met deze URL om gebruikers en groepen te provisioneren.", + "Create {{credential}}": "{{credential}} maken", + "{{credential}} created": "{{credential}} aangemaakt", + "{{credential}} created successfully": "{{credential}} succesvol aangemaakt", + "Created by": "Aangemaakt door", + "Custom": "Aangepast", + "Enable SCIM": "SCIM inschakelen", + "Enter a descriptive name": "Voer een beschrijvende naam in", + "I've saved my {{credential}}": "Ik heb mijn {{credential}} opgeslagen", + "Important": "Belangrijk", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Zorg ervoor dat u uw {{credential}} nu kopieert. U kunt deze niet meer bekijken!", + "Never": "Nooit", + "Revoke {{credential}}": "{{credential}} intrekken", + "SCIM endpoint URL": "SCIM-eindpunt-URL", + "SCIM provisioning": "SCIM-provisioning", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM heeft voorrang op SSO-groepssynchronisatie zolang het is ingeschakeld.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "U heeft het maximum van {{max}} SCIM-tokens bereikt. Verwijder een bestaand token om een nieuw token aan te maken.", + "SCIM token": "SCIM-token", + "SCIM tokens": "SCIM-tokens", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Deze actie kan niet ongedaan worden gemaakt. Uw identiteitsprovider stopt onmiddellijk met synchroniseren.", + "Toggle SCIM provisioning": "SCIM-provisioning in-/uitschakelen", + "Token": "Token", + "Page menu": "Paginamenu", + "Expand": "Uitvouwen", + "Collapse": "Samenvouwen", + "Comment menu": "Reactiemenu", + "Group menu": "Groepsmenu", + "Show hidden breadcrumbs": "Verborgen broodkruimels weergeven", + "Breadcrumbs": "Broodkruimels", + "Page actions": "Pagina-acties", + "Pick emoji": "Emoji kiezen", + "Template menu": "Sjabloonmenu", + "Use": "Gebruiken", + "Use template": "Sjabloon gebruiken", + "Preview template: {{title}}": "Voorbeeld van sjabloon: {{title}}", + "Use a template": "Een sjabloon gebruiken", + "Search templates...": "Sjablonen zoeken...", + "Search spaces...": "Werkruimtes zoeken...", + "No templates found": "Geen sjablonen gevonden", + "No spaces found": "Geen werkruimtes gevonden", + "Browse all templates": "Alle sjablonen bekijken", + "This space": "Deze werkruimte", + "All templates": "Alle sjablonen", + "Global": "Globaal", + "New template": "Nieuw sjabloon", + "Edit template": "Sjabloon bewerken", + "Are you sure you want to delete this template?": "Weet je zeker dat je dit sjabloon wilt verwijderen?", + "Template scope updated": "Bereik van sjabloon bijgewerkt", + "Choose which space this template belongs to": "Kies bij welke werkruimte dit sjabloon hoort", + "Only workspace admins can create global templates.": "Alleen workspace-beheerders kunnen globale sjablonen maken.", + "You need edit access to this space to create templates.": "Je hebt bewerkingstoegang tot deze ruimte nodig om sjablonen te maken.", + "Scope": "Bereik", + "Select scope": "Bereik selecteren", + "Title": "Titel", + "Saving...": "Opslaan...", + "Saved": "Opgeslagen", + "Save failed. Retry": "Opslaan mislukt. Opnieuw proberen", + "By {{name}}": "Door {{name}}", + "Updated {{time}}": "Bijgewerkt {{time}}", + "Choose destination": "Bestemming kiezen", + "Search pages and spaces...": "Pagina's en werkruimtes zoeken...", + "No results found": "Geen resultaten gevonden", + "You don't have permission to create pages here": "Je hebt geen toestemming om hier pagina's te maken", + "Chat menu for {{title}}": "Chatmenu voor {{title}}", + "API key menu": "API-sleutelmenu", + "Jump to comment selection": "Naar reactieselectie springen", + "Slash commands": "Slash-opdrachten", + "Mention suggestions": "Vermeldingssuggesties", + "Link suggestions": "Linksuggesties", + "Diagram editor": "Diagrameditor", + "Add comment": "Reactie toevoegen", + "Find and replace": "Zoeken en vervangen", + "Main navigation": "Hoofdnavigatie", + "Space navigation": "Ruimtenavigatie", + "Settings navigation": "Instellingennavigatie", + "AI navigation": "AI-navigatie", + "Breadcrumb": "Broodkruimel", + "Synced block": "Gesynchroniseerd blok", + "Create a block that stays in sync across pages.": "Maak een blok dat gesynchroniseerd blijft op meerdere pagina's.", + "Editing original": "Origineel bewerken", + "Copy synced block": "Gesynchroniseerd blok kopiëren", + "Unsync": "Synchronisatie opheffen", + "Delete synced block": "Gesynchroniseerd blok verwijderen", + "Synced to {{count}} other page_one": "Gesynchroniseerd met {{count}} andere pagina", + "Synced to {{count}} other page_other": "Gesynchroniseerd met {{count}} andere pagina's", + "ORIGINAL": "ORIGINEEL", + "THIS PAGE": "DEZE PAGINA", + "No pages": "Geen pagina's", + "The original synced block no longer exists": "Het oorspronkelijke gesynchroniseerde blok bestaat niet meer", + "You don't have access to this synced block": "Je hebt geen toegang tot dit gesynchroniseerde blok", + "Failed to load this synced block": "Dit gesynchroniseerde blok kon niet worden geladen", + "Fixed editor toolbar": "Vaste editorwerkbalk", + "Show a formatting toolbar above the editor with quick access to common actions.": "Toon een opmaakwerkbalk boven de editor met snelle toegang tot veelgebruikte acties.", + "Toggle fixed editor toolbar": "Vaste editorwerkbalk in-/uitschakelen", + "Normal text": "Normale tekst", + "More inline formatting": "Meer inline-opmaak", + "Subscript": "Subscript", + "Superscript": "Superscript", + "Inline code": "Inline-code", + "Insert media": "Media invoegen", + "Mention": "Vermelding", + "Emoji": "Emoji", + "Columns": "Kolommen", + "More inserts": "Meer invoegingen", + "Embeds": "Insluitingen", + "Diagrams": "Diagrammen", + "Advanced": "Geavanceerd", + "Utility": "Hulpprogramma's", + "Decrease indent": "Inspringing verkleinen", + "Increase indent": "Inspringing vergroten", + "Clear formatting": "Opmaak wissen", + "Code block": "Codeblok", + "Experimental": "Experimenteel", + "Strikethrough": "Doorhalen", + "Undo": "Ongedaan maken", + "Redo": "Opnieuw", + "Backlinks": "Terugkoppelingen", + "Last updated by": "Laatst bijgewerkt door", + "Last updated": "Laatst bijgewerkt", + "Stats": "Statistieken", + "Word count": "Aantal woorden", + "Characters": "Tekens", + "Incoming links": "Inkomende links", + "Outgoing links": "Uitgaande links", + "Incoming links ({{count}})": "Inkomende links ({{count}})", + "Outgoing links ({{count}})": "Uitgaande links ({{count}})", + "No pages link here yet.": "Er linken nog geen pagina's hiernaartoe.", + "This page doesn't link to other pages yet.": "Deze pagina linkt nog niet naar andere pagina's.", + "Verified until {{date}}": "Geverifieerd tot {{date}}", + "Labels": "Labels", + "Add label": "Label toevoegen", + "No labels yet": "Nog geen labels", + "Already added": "Al toegevoegd", + "Invalid label name": "Ongeldige labelnaam", + "No matches": "Geen overeenkomsten", + "Search or create…": "Zoeken of maken…", + "Remove label {{name}}": "Label {{name}} verwijderen", + "Failed to add label": "Label toevoegen mislukt", + "Failed to remove label": "Label verwijderen mislukt", + "No pages with this label": "Geen pagina's met dit label", + "Pages tagged with this label will appear here.": "Pagina's met dit label worden hier weergegeven.", + "No pages match your search.": "Geen pagina's komen overeen met je zoekopdracht.", + "Updated {{date}}": "Bijgewerkt op {{date}}", + "Cell actions": "Celacties", + "Column actions": "Kolomacties", + "Row actions": "Rijacties", + "Filter": "Filter", + "Page title": "Paginatitel", + "Page content": "Pagina-inhoud", + "Member actions for {{name}}": "Lidacties voor {{name}}", + "Toggle password visibility": "Wachtwoordzichtbaarheid in-/uitschakelen", + "Send comment": "Reactie verzenden", + "Token actions": "Tokenacties", + "Template settings": "Sjablooninstellingen", + "Edit diagram": "Diagram bewerken", + "Edit embed": "Insluiting bewerken", + "Edit drawing": "Tekening bewerken", + "Delete equation": "Vergelijking verwijderen", + "Invite actions": "Uitnodigingsacties", + "Get started": "Aan de slag", + "* indicates required fields": "* geeft verplichte velden aan", + "List of spaces in this workspace": "Lijst met werkruimtes in deze workspace", + "Active sessions": "Actieve sessies", + "Add {{name}} to favorites": "{{name}} aan favorieten toevoegen", + "Remove {{name}} from favorites": "{{name}} uit favorieten verwijderen", + "Added to favorites": "Toegevoegd aan favorieten", + "Removed from favorites": "Verwijderd uit favorieten", + "Added {{name}} to favorites": "{{name}} toegevoegd aan favorieten", + "Removed {{name}} from favorites": "{{name}} verwijderd uit favorieten", + "Page menu for {{name}}": "Paginamenu voor {{name}}", + "Create subpage of {{name}}": "Subpagina van {{name}} maken", + "Allow personal spaces": "Persoonlijke ruimtes toestaan", + "Members can create their own personal space.": "Leden kunnen hun eigen persoonlijke ruimte aanmaken.", + "Toggle allow personal spaces": "Persoonlijke ruimtes toestaan in- of uitschakelen", + "Create personal space": "Persoonlijke ruimte aanmaken", + "Personal space": "Persoonlijke ruimte", + "{{name}}'s space": "ruimte van {{name}}", + "Apply": "Toepassen", + "Cells that aren't already a page reference will be cleared.": "Cellen die nog geen paginaverwijzing zijn, worden leeggemaakt.", + "Cells that aren't a valid URL will be cleared.": "Cellen die geen geldige URL zijn, worden leeggemaakt.", + "Cells that aren't a valid email address will be cleared.": "Cellen die geen geldig e-mailadres zijn, worden leeggemaakt.", + "Cells that can't be parsed as a date will be cleared.": "Cellen die niet als een datum kunnen worden geïnterpreteerd, worden leeggemaakt.", + "Cells that can't be parsed as a number will be cleared.": "Cellen die niet als een getal kunnen worden geïnterpreteerd, worden leeggemaakt.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Cellen worden geconverteerd (yes/true/1 worden aangevinkt; al het andere wordt uitgevinkt of leeggemaakt).", + "Cells will be reinterpreted under the new type.": "Cellen worden opnieuw geïnterpreteerd volgens het nieuwe type.", + "Cells will be replaced with a comma-separated list of file names.": "Cellen worden vervangen door een door komma's gescheiden lijst met bestandsnamen.", + "Cells will be replaced with a comma-separated list of option names.": "Cellen worden vervangen door een door komma's gescheiden lijst met optienamen.", + "Cells will be replaced with the option name.": "Cellen worden vervangen door de optienaam.", + "Cells will be replaced with the page title.": "Cellen worden vervangen door de paginatitel.", + "Cells will be replaced with the person's name.": "Cellen worden vervangen door de naam van de persoon.", + "Change type": "Type wijzigen", + "Change type to {{label}}?": "Type wijzigen naar {{label}}?", + "Converting…": "Converteren…", + "Existing values become single-item lists. No data is lost.": "Bestaande waarden worden lijsten met één item. Er gaan geen gegevens verloren.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Alleen het eerste geselecteerde item per rij blijft behouden; de rest wordt verwijderd.", + "Previous record": "Vorige record", + "Next record": "Volgende record", + "Record actions": "Recordacties", + "Delete record": "Record verwijderen", + "Delete record?": "Record verwijderen?", + "This action cannot be undone.": "Deze actie kan niet ongedaan worden gemaakt.", + "to navigate": "om te navigeren", + "to close": "om te sluiten", + "Expand row {{number}}": "Rij {{number}} uitvouwen", + "Saving…": "Opslaan…", + "Read-only": "Alleen-lezen", + "Loading…": "Laden…", + "Updated {{when}}": "Bijgewerkt {{when}}", + "Add property": "Eigenschap toevoegen", + "Create property": "Eigenschap aanmaken", + "Hide properties": "Eigenschappen verbergen", + "Find a property type": "Een eigenschapstype zoeken", + "Properties": "Eigenschappen", + "A property with this name already exists": "Er bestaat al een eigenschap met deze naam", + "Add card": "Kaart toevoegen", + "Add filter": "Filter toevoegen", + "Add option": "Optie toevoegen", + "Add sort": "Sortering toevoegen", + "Add view": "Weergave toevoegen", + "All data in this column will be lost.": "Alle gegevens in deze kolom gaan verloren.", + "Allow multiple people": "Meerdere personen toestaan", + "Alphabetize": "Alfabetisch sorteren", + "Are you sure you want to delete": "Weet je zeker dat je wilt verwijderen", + "Ascending": "Oplopend", + "Base deleted": "Base verwijderd", + "Base name": "Basenaam", + "Base table": "Basistabel", + "Card properties": "Kaarteigenschappen", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Cellen die langer zijn dan de tekstlimiet worden afgekapt en de extra inhoud gaat permanent verloren.", + "Checkbox": "Selectievakje", + "Checked by default": "Standaard aangevinkt", + "Choose a property": "Kies een eigenschap", + "Clear selection": "Selectie wissen", + "Column options": "Kolomopties", + "Comma, period": "Komma, punt", + "Complete": "Voltooid", + "Contains": "Bevat", + "Copy link to view": "Link naar weergave kopiëren", + "Create a status property": "Een statuseigenschap maken", + "Created at": "Aangemaakt op", + "Currency": "Valuta", + "Decimal places": "Decimalen", + "Default value": "Standaardwaarde", + "Delete property": "Eigenschap verwijderen", + "Delete view": "Weergave verwijderen", + "Delete {{count}} rows?_one": "1 rij verwijderen?", + "Delete {{count}} rows?_other": "{{count}} rijen verwijderen?", + "Descending": "Aflopend", + "Discard": "Negeren", + "Doesn't contain": "Bevat niet", + "Done": "Klaar", + "Edit formula": "Formule bewerken", + "Edit property": "Eigenschap bewerken", + "Export CSV": "CSV exporteren", + "Failed to load base": "Base laden mislukt", + "False": "Onwaar", + "File": "Bestand", + "Filter and sort changes are visible only to you": "Wijzigingen in filters en sortering zijn alleen zichtbaar voor jou", + "Filter by": "Filteren op", + "Formula": "Formule", + "Get started with": "Aan de slag met", + "Greater than": "Groter dan", + "Group by": "Groeperen op", + "Group this board by a select or status property.": "Groepeer dit bord op een selectie- of statuseigenschap.", + "Hide all": "Alles verbergen", + "Hide group": "Groep verbergen", + "In Progress": "In uitvoering", + "In progress": "In uitvoering", + "Include time": "Tijd opnemen", + "Insert a kanban board on this page": "Voeg een kanbanbord in op deze pagina", + "Insert an inline base on this page": "Voeg een inline base in op deze pagina", + "Is": "Is", + "Is after": "Is na", + "Is any of": "Is een van", + "Is before": "Is vóór", + "Is empty": "Is leeg", + "Is none of": "Is geen van", + "Is not": "Is niet", + "Is not empty": "Is niet leeg", + "Is on or after": "Is op of na", + "Is on or before": "Is op of vóór", + "Is within": "Is binnen", + "Keep editing": "Doorgaan met bewerken", + "Last edited at": "Laatst bewerkt op", + "Last edited by": "Laatst bewerkt door", + "Less than": "Kleiner dan", + "Link copied to clipboard": "Link gekopieerd naar klembord", + "Local": "Lokaal", + "Long text": "Lange tekst", + "Moved card to {{column}}": "Kaart verplaatst naar {{column}}", + "Moved column to {{column}}": "Kolom verplaatst naar {{column}}", + "Multi-select": "Meervoudige selectie", + "New row": "Nieuwe rij", + "Next month": "Volgende maand", + "Next week": "Volgende week", + "Next year": "Volgend jaar", + "No filters applied": "Geen filters toegepast", + "No match": "Geen overeenkomst", + "No options for this property type": "Geen opties voor dit eigenschapstype", + "No sorts applied": "Geen sorteringen toegepast", + "No value": "Geen waarde", + "None": "Geen", + "Not started": "Niet gestart", + "Number": "Getal", + "One month ago": "Een maand geleden", + "One month from now": "Over een maand", + "One week ago": "Een week geleden", + "One week from now": "Over een week", + "Open as page": "Openen als pagina", + "Options": "Opties", + "Past month": "Afgelopen maand", + "Past week": "Afgelopen week", + "Past year": "Afgelopen jaar", + "Percent": "Procent", + "Period, comma": "Punt, komma", + "Person": "Persoon", + "Please enter a valid email": "Voer een geldig e-mailadres in", + "Progress": "Voortgang", + "Property options": "Eigenschapopties", + "Relative": "Relatief", + "Rename property": "Eigenschap hernoemen", + "Reset": "Opnieuw instellen", + "Save for everyone": "Opslaan voor iedereen", + "Select": "Selecteren", + "Select a property": "Selecteer een eigenschap", + "Select all loaded rows": "Alle geladen rijen selecteren", + "Show all": "Alles tonen", + "Sort": "Sorteren", + "Sort by": "Sorteren op", + "Space, comma": "Spatie, komma", + "Space, period": "Spatie, punt", + "This board has no grouping property yet.": "Dit bord heeft nog geen groeperingseigenschap.", + "This month": "Deze maand", + "This year": "Dit jaar", + "Thousands and decimal separators": "Scheidingstekens voor duizendtallen en decimalen", + "Time format": "Tijdnotatie", + "To Do": "Te doen", + "Tomorrow": "Morgen", + "True": "Waar", + "Unsaved changes": "Niet-opgeslagen wijzigingen", + "Untitled base": "Base zonder titel", + "URL": "URL", + "Value": "Waarde", + "View updated for everyone": "Weergave bijgewerkt voor iedereen", + "You have unsaved changes. Do you want to discard them?": "Je hebt niet-opgeslagen wijzigingen. Wil je deze negeren?", + "{{count}} rows deleted_one": "1 rij verwijderd", + "{{count}} rows deleted_other": "{{count}} rijen verwijderd", + "{{count}} selected_one": "1 geselecteerd", + "{{count}} selected_other": "{{count}} geselecteerd", + "Compare": "Vergelijken", + "Compare versions": "Versies vergelijken", + "Select version from {{date}}": "Selecteer versie van {{date}}", + "Version actions for {{date}}": "Versieacties voor {{date}}", + "Comparing {{newer}} and {{older}}": "{{newer}} en {{older}} vergelijken", + "Exit compare": "Vergelijken afsluiten", + "Search attachments...": "Bijlagen zoeken...", + "Error loading attachments.": "Fout bij het laden van bijlagen.", + "No attachments on this page yet.": "Er zijn nog geen bijlagen op deze pagina.", + "Uploaded by {{name}}": "Geüpload door {{name}}", + "Download {{name}}": "{{name}} downloaden", + "Access revoked": "Toegang ingetrokken", + "Authorize application": "Applicatie autoriseren", + "{{name}} wants to access {{workspace}}": "{{name}} wil toegang tot {{workspace}}", + "Not you? Switch account": "Ben jij dit niet? Wissel van account", + "This application will be able to:": "Deze applicatie kan het volgende doen:", + "Write": "Schrijven", + "Invalid authorization request": "Ongeldig autorisatieverzoek", + "Authorize": "Autoriseren", + "Application": "Applicatie", + "Permissions": "Machtigingen", + "Authorized": "Geautoriseerd", + "Revoke access": "Toegang intrekken", + "Revoke access for {{name}}": "Toegang voor {{name}} intrekken", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Weet je zeker dat je de toegang voor {{name}} wilt intrekken? De applicatie heeft dan geen toegang meer tot je account.", + "Something went wrong. Please try again.": "Er is iets misgegaan. Probeer het opnieuw.", + "Remove {{name}}": "{{name}} verwijderen", + "Make sure you trust this application before authorizing it.": "Zorg ervoor dat je deze applicatie vertrouwt voordat je haar autoriseert.", + "You will be redirected to": "Je wordt doorgestuurd naar", + "View content without making changes.": "Inhoud bekijken zonder wijzigingen aan te brengen.", + "Create and modify content.": "Inhoud maken en wijzigen.", + "Applications and AI assistants you have authorized to access your account.": "Applicaties en AI-assistenten die je hebt geautoriseerd om toegang te krijgen tot je account.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "MCP is ingeschakeld voor je werkruimte. Verbind AI-assistenten met je Docmost-account via OAuth.", + "Authorized apps": "Geautoriseerde apps", + "No authorized apps yet.": "Nog geen geautoriseerde apps.", + "Workspace knowledge only": "Alleen werkruimtek kennis", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Beperk AI Chat tot het beantwoorden op basis van alleen je werkruimtepagina's en geüploade bestanden. Er wordt geen externe kennis gebruikt.", + "Toggle workspace knowledge only": "Alleen werkruimtekennis in-/uitschakelen", + "Read-only mode": "Alleen-lezenmodus", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI Chat kan werkruimte-inhoud doorzoeken en lezen, maar kan geen pagina's maken of bewerken.", + "Toggle AI Chat read-only mode": "Alleen-lezenmodus voor AI Chat in-/uitschakelen", + "Title only": "Alleen titel", + "you": "jij", + "Allow public spaces": "Openbare ruimtes toestaan", + "Space admins can publish their spaces to the web.": "Ruimtebeheerders kunnen hun ruimtes op het web publiceren.", + "Toggle allow public spaces": "Openbare ruimtes toestaan in-/uitschakelen", + "Publish space to the web": "Ruimte op het web publiceren", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Iedereen op internet kan elke pagina in deze ruimte lezen, behalve beperkte pagina's. Weet u het zeker?", + "Make this space publicly readable by anyone on the internet.": "Maak deze ruimte openbaar leesbaar voor iedereen op internet.", + "Toggle publish space to the web": "Publiceren van ruimte op het web in-/uitschakelen", + "Allow search engines to index": "Zoekmachines toestaan te indexeren", + "Let public pages in this space appear in search engine results.": "Laat openbare pagina's in deze ruimte verschijnen in zoekresultaten.", + "Toggle search engine indexing": "Indexering door zoekmachines in-/uitschakelen", + "Public space link": "Openbare ruimtelink", + "Copy public space link": "Openbare ruimtelink kopiëren", + "Renaming the space slug will break public links.": "Als u de slug van de ruimte wijzigt, werken openbare links niet meer.", + "Failed to update space": "Bijwerken van ruimte mislukt", + "This space is public": "Deze ruimte is openbaar", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Iedereen op internet kan de pagina's in deze ruimte lezen, behalve beperkte pagina's.", + "Open public site": "Open openbare site", + "Public": "Openbaar", + "This space has no public pages yet.": "Deze ruimte heeft nog geen openbare pagina's.", + "On this page": "Op deze pagina", + "Previous": "Vorige", + "Next": "Volgende", + "Show hidden pages": "Verborgen pagina's weergeven", + "Page navigation": "Paginanavigatie", + "Toggle sidebar": "Zijbalk in-/uitschakelen", + "Toggle table of contents": "Inhoudsopgave in-/uitschakelen", + "Appearance": "Weergave", + "Forest": "Bos", + "Violet": "Violet", + "Light mode color": "Kleur voor lichte modus", + "Dark mode color": "Kleur voor donkere modus", + "Choose the primary color of the public docs site.": "Kies de primaire kleur van de openbare documentatiesite.", + "Show page author": "Paginamaker weergeven", + "Display the page creator's name on public pages.": "Geef de naam van de maker van de pagina weer op openbare pagina's.", + "Toggle show page author": "Weergave van paginamaker in-/uitschakelen", + "Show last updated": "Laatste update weergeven", + "Display when each page was last updated.": "Geef weer wanneer elke pagina voor het laatst is bijgewerkt.", + "Toggle show last updated": "Weergave van laatste update in-/uitschakelen", + "Open public page": "Open openbare pagina", + "Toggle color scheme": "Kleurenschema in-/uitschakelen", + "Ember": "Gloeiend", + "Rose": "Roos", + "Documentation": "Documentatie", + "All published spaces.": "Alle gepubliceerde ruimtes.", + "No public spaces yet.": "Nog geen openbare ruimtes.", + "Show public directory": "Openbare directory weergeven", + "List published spaces at /docs for anyone to browse.": "Toon gepubliceerde ruimtes op /docs zodat iedereen erdoor kan bladeren.", + "Toggle show public directory": "Weergave van openbare directory in-/uitschakelen", + "Show in public directory": "Weergeven in openbare directory", + "List this space in the public directory at /docs.": "Toon deze ruimte in de openbare directory op /docs.", + "Toggle show in public directory": "Weergave in openbare directory in-/uitschakelen", + "Open public space link": "Open openbare ruimtelink", + "Disable public spaces": "Openbare ruimtes uitschakelen", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Ruimtebeheerders kunnen hun ruimtes openbaar leesbaar maken voor iedereen op internet. Weet u het zeker?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Hierdoor wordt de publicatie van elke gepubliceerde ruimte onmiddellijk ongedaan gemaakt. Als u dit later opnieuw inschakelt, worden ze niet opnieuw gepubliceerd. Weet u het zeker?", + "Allow": "Toestaan", + "Shared pages": "Gedeelde pagina's", + "Published spaces": "Gepubliceerde ruimtes", + "Spaces published to the web will appear here": "Hier verschijnen ruimtes die op het web zijn gepubliceerd", + "No published spaces": "Geen gepubliceerde ruimtes", + "Published by": "Gepubliceerd door", + "Published at": "Gepubliceerd op", + "Open space": "Ruimte openen", + "Unpublish": "Publicatie ongedaan maken", + "Unpublish space": "Publicatie van ruimte ongedaan maken", + "This space will no longer be publicly accessible. Are you sure?": "Deze ruimte zal niet langer openbaar toegankelijk zijn. Weet u het zeker?", + "More options for {{name}}": "Meer opties voor {{name}}", + "Edit page": "Pagina bewerken", + "Sign in": "Inloggen", + "Open app": "App openen", + "No spaces match your search.": "Geen ruimtes komen overeen met uw zoekopdracht.", + "Welcome to our documentation": "Welkom bij onze documentatie", + "Guides, references and answers across all our published spaces.": "Handleidingen, referenties en antwoorden in al onze gepubliceerde ruimtes.", + "Guides, references and answers across all our spaces.": "Handleidingen, referenties en antwoorden in al onze ruimtes.", + "Search documentation...": "Documentatie doorzoeken...", + "1 published space": "1 gepubliceerde ruimte", + "{{count}} published spaces": "{{count}} gepubliceerde ruimtes", + "Actions": "Acties", + "Add destination": "Bestemming toevoegen", + "Are you sure you want to delete the destination": "Weet u zeker dat u de bestemming wilt verwijderen", + "Audit logs": "Auditlogboeken", + "Audit logs & SIEM": "Auditlogboeken en SIEM", + "Auth header name": "Naam van auth-header", + "Auth header prefix": "Prefix van auth-header", + "Body format": "Body-indeling", + "Created SIEM destination": "SIEM-bestemming aangemaakt", + "Datadog site": "Datadog-site", + "Defaults to this instance's hostname": "Standaard ingesteld op de hostnaam van deze instantie", + "Delete destination": "Bestemming verwijderen", + "Deleted SIEM destination": "SIEM-bestemming verwijderd", + "Destination created": "Bestemming aangemaakt", + "Destination deleted": "Bestemming verwijderd", + "Destination updated": "Bestemming bijgewerkt", + "Disabled": "Uitgeschakeld", + "Edit destination": "Bestemming bewerken", + "Endpoint URL": "Endpoint-URL", + "Failing": "Foutstatus", + "Failing since {{time}}": "In foutstatus sinds {{time}}", + "HEC token": "HEC-token", + "HEC URL": "HEC-URL", + "Healthy": "Gezond", + "Hide advanced options": "Geavanceerde opties verbergen", + "Host": "Host", + "Index": "Index", + "Insecure: connections can be intercepted.": "Onveilig: verbindingen kunnen worden onderschept.", + "JSON array": "JSON-array", + "Last delivered": "Laatst afgeleverd", + "Last error": "Laatste fout", + "Leave empty to use the token's default index": "Laat leeg om de standaardindex van het token te gebruiken", + "Maximum of {{limit}} destinations reached": "Maximum van {{limit}} bestemmingen bereikt", + "Could not load SIEM destinations: {{message}}": "Kan SIEM-bestemmingen niet laden: {{message}}", + "No destinations yet": "Nog geen bestemmingen", + "Preset": "Voorinstelling", + "Retry now": "Nu opnieuw proberen", + "Retry scheduled": "Nieuwe poging gepland", + "Send test event": "Testgebeurtenis verzenden", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Wordt verzonden in de auth-header hieronder. Laat leeg als uw ontvanger er geen nodig heeft.", + "Service": "Service", + "Show advanced options": "Geavanceerde opties weergeven", + "SIEM": "SIEM", + "SIEM streaming": "SIEM-streaming", + "SIEM streaming requires an Enterprise license.": "SIEM-streaming vereist een Enterprise-licentie.", + "Source": "Bron", + "Sourcetype": "Brontype", + "Tags": "Tags", + "Test connection": "Verbinding testen", + "Test event delivered successfully.": "Testgebeurtenis succesvol afgeleverd.", + "Test the connection before saving.": "Test de verbinding voordat u opslaat.", + "Test event delivered to {{name}}": "Testgebeurtenis afgeleverd aan {{name}}", + "Updated SIEM destination": "SIEM-bestemming bijgewerkt", + "Verify TLS certificate": "TLS-certificaat verifiëren", + "e.g. Splunk prod": "bijv. Splunk prod" +} diff --git a/apps/client/public/locales/pt-BR/translation.json b/apps/client/public/locales/pt-BR/translation.json new file mode 100644 index 0000000..68920e7 --- /dev/null +++ b/apps/client/public/locales/pt-BR/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Conta", + "Active": "Ativo", + "Add": "Adicionar", + "Add group members": "Adicionar membros ao grupo", + "Add groups": "Adicionar grupos", + "Add members": "Adicionar membros", + "Add to groups": "Adicionar aos grupos", + "Add space members": "Adicionar membros do espaço", + "Add to favorites": "Adicionar aos favoritos", + "Admin": "Administrador", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Tem certeza de que deseja excluir este grupo? Os membros perderão acesso aos recursos que este grupo possui.", + "Are you sure you want to delete this page?": "Tem certeza de que deseja excluir esta página?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Tem certeza de que deseja remover este usuário do grupo? O usuário perderá acesso aos recursos que este grupo possui.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Tem certeza de que deseja remover este usuário do espaço? O usuário perderá todo acesso a este espaço.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Tem certeza de que deseja restaurar esta versão? Quaisquer alterações não versionadas serão perdidas.", + "Can become members of groups and spaces in workspace": "Pode se tornar membro de grupos e espaços no workspace", + "Can create and edit pages in space.": "Pode criar e editar páginas no espaço.", + "Can edit": "Pode editar", + "Can manage workspace": "Pode gerenciar o workspace", + "Can manage workspace but cannot delete it": "Pode gerenciar o workspace, mas não pode excluí-lo", + "Can view": "Pode visualizar", + "Can view pages in space but not edit.": "Pode visualizar páginas no espaço, mas não editar.", + "Cancel": "Cancelar", + "Change email": "Alterar email", + "Change password": "Alterar senha", + "Change photo": "Alterar foto", + "Choose a role": "Escolha um papel", + "Choose your preferred color scheme.": "Escolha seu esquema de cores preferido.", + "Choose your preferred interface language.": "Escolha o idioma da interface.", + "Choose your preferred page width.": "Escolha a largura preferida da página.", + "Confirm": "Confirmar", + "Copy as Markdown": "Copiar como Markdown", + "Copy link": "Copiar link", + "Create": "Criar", + "Create group": "Criar grupo", + "Create page": "Criar página", + "Create space": "Criar espaço", + "Create workspace": "Criar workspace", + "Current password": "Senha atual", + "Dark": "Escuro", + "Date": "Data", + "Delete": "Excluir", + "Remove from page": "Remover da página", + "Base options": "Opções da base", + "Delete group": "Excluir grupo", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Você tem certeza que quer deletar essa página? Isso irá deletar todas as páginas filhas e to o histórico. Esta ação é irreversível.", + "Description": "Descrição", + "Details": "Detalhes", + "e.g ACME": "ex.: ACME", + "e.g ACME Inc": "ex.: ACME Inc", + "e.g Developers": "ex.: Desenvolvedores", + "e.g Group for developers": "ex.: Grupo para desenvolvedores", + "e.g product": "ex.: produto", + "e.g Product Team": "ex.: Equipe de Produto", + "e.g Sales": "ex.: Vendas", + "e.g Space for product team": "ex.: Espaço para a equipe de produto", + "e.g Space for sales team to collaborate": "ex.: Espaço para a equipe de vendas colaborar", + "Edit": "Editar", + "Read": "Ler", + "Edit group": "Editar grupo", + "Email": "Email", + "Enter a strong password": "Insira uma senha forte", + "Enter valid email addresses separated by comma or space max_50": "Insira endereços de email válidos separados por vírgula ou espaço [máx: 50]", + "enter valid emails addresses": "insira endereços de e-mail válidos", + "Enter your current password": "Insira sua senha atual", + "enter your full name": "insira seu nome completo", + "Enter your new password": "Insira sua nova senha", + "Enter your new preferred email": "Insira seu novo email preferido", + "Enter your password": "Insira sua senha", + "Error fetching page data.": "Erro ao buscar dados da página.", + "Error loading page history.": "Erro ao carregar o histórico da página.", + "Export": "Exportar", + "Failed to create page": "Falha ao criar página", + "Failed to delete page": "Falha ao excluir página", + "Failed to restore page": "Falha ao restaurar página", + "Failed to fetch recent pages": "Falha ao buscar páginas recentes", + "Failed to import pages": "Falha ao importar páginas", + "Failed to load page. An error occurred.": "Falha ao carregar página. Ocorreu um erro.", + "Failed to update data": "Falha ao atualizar dados", + "Failed to create base": "Falha ao criar base", + "Failed to update base": "Falha ao atualizar base", + "Failed to delete base": "Falha ao excluir base", + "Failed to create property": "Falha ao criar propriedade", + "Failed to update property": "Falha ao atualizar propriedade", + "Failed to delete property": "Falha ao excluir propriedade", + "Failed to reorder property": "Falha ao reordenar propriedade", + "Failed to create view": "Falha ao criar visualização", + "Failed to update view": "Falha ao atualizar visualização", + "Failed to delete view": "Falha ao excluir visualização", + "Failed to create row": "Falha ao criar linha", + "Failed to update row": "Falha ao atualizar linha", + "Failed to delete row": "Falha ao excluir linha", + "Failed to delete rows": "Falha ao excluir linhas", + "Failed to reorder row": "Falha ao reordenar linha", + "Failed to move card": "Falha ao mover cartão", + "Failed to add card": "Falha ao adicionar cartão", + "Failed to export CSV": "Falha ao exportar CSV", + "Favorite spaces": "Espaços favoritos", + "Favorite spaces appear here": "Os espaços favoritos aparecem aqui", + "Favorites": "Favoritos", + "Full access": "Acesso total", + "Full page width": "Usar largura total da página", + "Full width": "Largura total", + "General": "Geral", + "Group": "Grupo", + "Group description": "Descrição do grupo", + "Group name": "Nome do grupo", + "Groups": "Grupos", + "Has full access to space settings and pages.": "Tem acesso total às configurações do espaço e às páginas.", + "Home": "Início", + "Import pages": "Importar páginas", + "Import pages & space settings": "Importar páginas e configurações de espaço", + "Importing pages": "Importando páginas", + "invalid invitation link": "link de convite inválido", + "Invitation signup": "Cadastro por convite", + "Invite by email": "Convidar por email", + "Invite members": "Convidar membros", + "Invite new members": "Convidar novos membros", + "Invite People": "Convidar pessoas", + "Invited members who are yet to accept their invitation will appear here.": "Membros convidados que ainda não aceitaram o convite aparecerão aqui.", + "Invited members will be granted access to spaces the groups can access": "Os membros convidados terão acesso aos espaços que os grupos podem acessar", + "Join the workspace": "Entrar no workspace", + "Language": "Idioma", + "Light": "Claro", + "Link copied": "Link copiado", + "Login": "Entrar", + "Logout": "Sair", + "Manage Group": "Gerenciar Grupo", + "Manage members": "Gerenciar membros", + "member": "membro", + "Member": "Membro", + "members": "membros", + "Members": "Membros", + "My preferences": "Minhas preferências", + "My Profile": "Meu Perfil", + "My profile": "Meu perfil", + "Name": "Nome", + "New email": "Novo email", + "New page": "Nova página", + "New password": "Nova senha", + "No group found": "Nenhum grupo encontrado", + "No page history saved yet.": "Nenhum histórico de página salvo ainda.", + "No pages yet": "Nenhuma página ainda", + "No shared pages": "Sem páginas compartilhadas", + "No results found...": "Nenhum resultado encontrado...", + "No user found": "Nenhum usuário encontrado", + "Overview": "Visão geral", + "Owner": "Proprietário", + "page": "página", + "Page deleted successfully": "Página excluída com sucesso", + "Page history": "Histórico da página", + "Select version": "Selecionar versão", + "Highlight changes": "Destacar alterações", + "Page import is in progress. Please do not close this tab.": "A importação da página está em andamento. Por favor, não feche esta aba.", + "Pages": "Páginas", + "pages": "páginas", + "Password": "Senha", + "Password changed successfully": "Senha alterada com sucesso", + "People": "Pessoas", + "Pending": "Pendente", + "Please confirm your action": "Por favor, confirme sua ação", + "Preferences": "Preferências", + "Print PDF": "Imprimir PDF", + "Profile": "Perfil", + "Recently updated": "Atualizado recentemente", + "Remove": "Remover", + "Remove from favorites": "Remover dos favoritos", + "Remove group member": "Remover membro do grupo", + "Remove space member": "Remover membro do espaço", + "Restore": "Restaurar", + "Role": "Função", + "Save": "Salvar", + "Search": "Buscar", + "Search for groups": "Buscar grupos", + "Search for users": "Buscar usuários", + "Search for users and groups": "Buscar usuários e grupos", + "Search...": "Buscar...", + "Select language": "Selecione o idioma", + "Select role": "Selecione a função", + "Select role to assign to all invited members": "Selecione a função a ser atribuída a todos os membros convidados", + "Select theme": "Selecione o tema", + "Send invitation": "Enviar convite", + "Invitation sent": "Convite enviado", + "Settings": "Configurações", + "Setup workspace": "Configurar workspace", + "Sign In": "Entrar", + "Sign Up": "Cadastrar-se", + "Slug": "Slug", + "Space": "Espaço", + "Space description": "Descrição do espaço", + "Space menu": "Menu do espaço", + "Space name": "Nome do espaço", + "Space settings": "Configurações do espaço", + "Space slug": "Slug do espaço", + "Spaces": "Espaços", + "Spaces you belong to": "Espaços aos quais você pertence", + "No space found": "Nenhum espaço encontrado", + "Search for spaces": "Pesquisar espaços", + "Start typing to search...": "Comece a digitar para buscar...", + "Status": "Status", + "Successfully imported": "Importado com sucesso", + "Successfully restored": "Restaurado com sucesso", + "System settings": "Configurações do sistema", + "Templates": "Modelos", + "Theme": "Tema", + "To change your email, you have to enter your password and new email.": "Para alterar seu email, você precisa inserir sua senha e o novo email.", + "Toggle full page width": "Alternar largura total da página", + "Unable to import pages. Please try again.": "Não foi possível importar as páginas. Por favor, tente novamente.", + "untitled": "sem título", + "Untitled": "Sem título", + "Updated successfully": "Atualizado com sucesso", + "User": "Usuário", + "Workspace": "Workspace", + "Workspace Name": "Nome do workspace", + "Workspace settings": "Configurações do workspace", + "You can change your password here.": "Você pode alterar sua senha aqui.", + "Your Email": "Seu e-mail", + "Your import is complete.": "Sua importação está concluída.", + "Your name": "Seu nome", + "Your Name": "Seu Nome", + "Your password": "Sua senha", + "Your password must be a minimum of 8 characters.": "Sua senha deve ter no mínimo 8 caracteres.", + "Sidebar toggle": "Alternar barra lateral", + "Comments": "Comentários", + "404 page not found": "404 página não encontrada", + "Sorry, we can't find the page you are looking for.": "Desculpe, não conseguimos encontrar a página que você está procurando.", + "Take me back to homepage": "Voltar para a página inicial", + "Forgot password": "Esqueceu a senha", + "Forgot your password?": "Esqueceu sua senha?", + "A password reset link has been sent to your email. Please check your inbox.": "Um link de redefinição de senha foi enviado para o seu email. Por favor, verifique sua caixa de entrada.", + "Send reset link": "Enviar link de recuperação", + "Password reset": "Resetar a senha", + "Your new password": "Sua nova senha", + "Set password": "Definir a senha", + "Write a comment": "Escreva um comentário", + "Reply...": "Responder...", + "Error loading comments.": "Erro ao carregar comentários.", + "No comments yet.": "Ainda sem comentários.", + "No open comments.": "Sem comentários em aberto.", + "No resolved comments.": "Sem comentários resolvidos.", + "Add a comment...": "Adicione um comentário...", + "Edit comment": "Editar comentário", + "Delete comment": "Excluir comentário", + "Are you sure you want to delete this comment?": "Você tem certeza de que deseja excluir este comentário?", + "Delete chat": "Excluir chat", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Tem certeza de que deseja excluir '{{title}}'? Esta ação não pode ser desfeita.", + "Comment created successfully": "Comentário criado com sucesso", + "Error creating comment": "Erro ao criar comentário", + "Comment updated successfully": "Comentário atualizado com sucesso", + "Failed to update comment": "Falha ao atualizar comentário", + "Comment deleted successfully": "Comentário excluído com sucesso", + "Failed to delete comment": "Falha ao excluir comentário", + "Comment resolved successfully": "Comentário resolvido com sucesso", + "Comment re-opened successfully": "Comentário reaberto com sucesso", + "Comment unresolved successfully": "Comentário marcado como não resolvido com sucesso", + "Failed to resolve comment": "Falha ao resolver comentário", + "Resolve comment": "Resolver comentário", + "Unresolve comment": "Marcar comentário como não resolvido", + "Resolve Comment Thread": "Resolver tópico de comentários", + "Unresolve Comment Thread": "Marcar tópico de comentários como não resolvido", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Tem certeza de que deseja resolver este fio de comentários? Isso o marcará como concluído.", + "Are you sure you want to unresolve this comment thread?": "Tem certeza de que deseja não resolver este fio de comentários?", + "Resolved": "Resolvido", + "No active comments.": "Sem comentários ativos.", + "Revoke invitation": "Cancelar o convite", + "Revoke": "Anular", + "Don't": "Não", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Tem certeza de que deseja revogar este convite? O usuário não poderá participar do espaço de trabalho.", + "Resend invitation": "Reenviar convite", + "Anyone with this link can join this workspace.": "Qualquer um com este link pode participar deste espaço de trabalho.", + "Invite link": "Link do convite", + "Copy": "Copiar", + "Copy to space": "Copiar para o espaço", + "Copied": "Copiado", + "Duplicate": "Duplicar", + "Select a user": "Selecione um usuário", + "Select a group": "Selecione um grupo", + "Export all pages and attachments in this space.": "Exportar todas as páginas e anexos deste espaço.", + "Delete space": "Excluir Espaço", + "Are you sure you want to delete this space?": "Tem certeza de que deseja excluir este espaço?", + "Delete this space with all its pages and data.": "Excluir este espaço com todas as suas páginas e dados.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Todas as páginas, comentários, anexos e permissões neste espaço serão excluídos de forma irreversível.", + "Confirm space name": "Confirmar nome do espaço", + "Type the space name {{spaceName}} to confirm your action.": "Digite o nome do espaço {{spaceName}} para confirmar sua ação.", + "Format": "Formato", + "Include subpages": "Incluir subpáginas", + "Include attachments": "Incluir anexos", + "Select export format": "Selecionado o formato para exportação", + "Export failed:": "Falha ao exportar:", + "export error": "erro de exportação", + "Export page": "Exportar página", + "Export successful": "Exportação bem-sucedida", + "Export space": "Exportar espaço", + "Export {{type}}": "Exportar para {{type}}", + "File exceeds the {{limit}} attachment limit": "O arquivo excede o limite de anexos {{limit}}", + "Media": "Mídia", + "Align left": "Alinhar à esquerda", + "Align right": "Alinhar à direita", + "Align center": "Alinhar ao centro", + "Alt text": "Texto alternativo", + "Describe this for accessibility.": "Descreva isto para acessibilidade.", + "Add a description": "Adicionar uma descrição", + "Justify": "Justificar", + "Merge cells": "Mesclar células", + "Split cell": "Dividir célula", + "Delete column": "Excluir coluna", + "Delete row": "Excluir linha", + "Add left column": "Adicionar coluna à esquerda", + "Add right column": "Adicionar coluna à direita", + "Add row above": "Adicionar linha acima", + "Add row below": "Adicionar linha abaixo", + "Delete table": "Excluir tabela", + "Add column left": "Adicionar coluna à esquerda", + "Add column right": "Adicionar coluna à direita", + "Clear cell": "Limpar célula", + "Clear cells": "Limpar células", + "Toggle header cell": "Alternar célula de cabeçalho", + "Toggle header column": "Alternar coluna de cabeçalho", + "Toggle header row": "Alternar linha de cabeçalho", + "Move column left": "Mover coluna para a esquerda", + "Move column right": "Mover coluna para a direita", + "Move row down": "Mover linha para baixo", + "Move row up": "Mover linha para cima", + "Sort A → Z": "Ordenar A → Z", + "Sort Z → A": "Ordenar Z → A", + "Info": "Informação", + "Note": "Observação", + "Success": "Sucesso", + "Warning": "Aviso", + "Danger": "Perigo", + "Mermaid diagram error:": "Erro no diagrama Mermaid:", + "Invalid Mermaid diagram": "Diagrama Mermaid inválido", + "Double-click to edit Draw.io diagram": "Clique duas vezes para editar o diagrama Draw.io", + "Exit": "Sair", + "Save & Exit": "Salvar e Sair", + "Double-click to edit Excalidraw diagram": "Clique duas vezes para editar o diagrama Excalidraw", + "Paste link": "Colar link", + "Paste link or search pages": "Cole o link ou pesquise páginas", + "Link to web page": "Link para página da web", + "Recents": "Recentes", + "Page or URL": "Página ou URL", + "Link title": "Título do link", + "Edit link": "Editar link", + "Remove link": "Remover link", + "Add link": "Adicionar link", + "Please enter a valid url": "Por favor, insira uma URL válida", + "Empty equation": "Equação vazia", + "Invalid equation": "Equação inválida", + "Color": "Cor", + "Text color": "Cor do texto", + "Default": "Padrão", + "Blue": "Azul", + "Green": "Verde", + "Purple": "Violeta", + "Red": "Vermelho", + "Yellow": "Amarelo", + "Orange": "Laranja", + "Pink": "Rosa", + "Gray": "Cinza", + "Embed link": "Link embutido", + "Invalid {{provider}} embed link": "Link de incorporação do {{provider}} inválido", + "Embed {{provider}}": "Incorporar {{provider}}", + "Enter {{provider}} link to embed": "Digite o link do {{provider}} para incorporar", + "Bold": "Negrito", + "Italic": "Itálico", + "Underline": "Sublinhado", + "Strike": "Tracejado", + "Code": "Código", + "Comment": "Comentário", + "Text": "Texto", + "Heading 1": "Título 1", + "Heading 2": "Título 2", + "Heading 3": "Título 3", + "To-do List": "Lista de Tarefas", + "Bullet List": "Lista de Pontos", + "Numbered List": "Lista Numerada", + "Blockquote": "Bloco de Citação", + "Just start typing with plain text.": "Basta começar a digita.", + "Track tasks with a to-do list.": "Acompanhe tarefas com uma lista de tarefas.", + "Big section heading.": "Título de seção grande.", + "Medium section heading.": "Título de seção média.", + "Small section heading.": "Título de seção pequena.", + "Create a simple bullet list.": "Crie uma lista simples com marcadores.", + "Create a list with numbering.": "Crie uma lista com numeração.", + "Create block quote.": "Crie uma citação em bloco.", + "Insert code snippet.": "Insira um trecho de código.", + "Insert horizontal rule divider": "Insira um divisor horizontal", + "Page break": "Quebra de página", + "Insert a page break for printing.": "Insira uma quebra de página para impressão.", + "Footnote": "Nota de rodapé", + "Insert a footnote reference.": "Inserir uma referência de nota de rodapé.", + "Upload any image from your device.": "Envie qualquer imagem do seu dispositivo.", + "Upload any video from your device.": "Envie qualquer vídeo do seu dispositivo.", + "Upload any audio from your device.": "Envie qualquer áudio do seu dispositivo.", + "Upload any file from your device.": "Envie qualquer arquivo do seu dispositivo.", + "Uploading {{name}}": "Enviando {{name}}", + "Uploading file": "Enviando arquivo", + "Table": "Tabela", + "Insert a table.": "Insira uma tabela.", + "Insert collapsible block.": "Insira um bloco colapsável.", + "Video": "Vídeo", + "Divider": "Divisor", + "Quote": "Citação", + "Image": "Imagem", + "Audio": "Áudio", + "Embed PDF": "Incorporar PDF", + "Upload and embed a PDF file.": "Envie e incorpore um arquivo PDF.", + "Embed as PDF": "Incorporar como PDF", + "Failed to load PDF": "Falha ao carregar PDF", + "Convert to attachment": "Converter em anexo", + "File attachment": "Anexo de arquivo", + "Toggle block": "Bloco recolhível", + "Callout": "Chamada", + "Insert callout notice.": "Insira um aviso.", + "Math inline": "Matemática em linha", + "Insert inline math equation.": "Insira uma equação matemática inline.", + "Math block": "Bloco matemático", + "Insert math equation": "Inserir equação matemática", + "Mermaid diagram": "Diagrama Mermaid", + "Insert mermaid diagram": "Inserir diagrama Mermaid", + "Insert and design Drawio diagrams": "Inserir e criar diagramas Drawio", + "Insert current date": "Inserir data atual", + "Time": "Horário", + "Insert current time": "Inserir horário atual", + "Draw and sketch excalidraw diagrams": "Desenhar e esboçar diagramas Excalidraw", + "Multiple": "Múltiplo", + "Turn into": "Transformar em", + "Text align": "Alinhar texto", + "This page may have been deleted, moved, or you may not have access.": "Esta página pode ter sido excluída, movida ou você pode não ter acesso a ela.", + "Go to homepage": "Ir para a página inicial", + "Pages you create will show up here.": "As páginas que você criar aparecerão aqui.", + "Heading {{level}}": "Título {{level}}", + "Toggle title": "Título do bloco recolhível", + "Write anything. Enter \"/\" for commands": "Escreva qualquer coisa. Digite \"/\" para ver os comandos", + "Write...": "Escreva...", + "Column count": "Número de colunas", + "{{count}} Columns": "{{count}} colunas", + "{{count}} command available_one": "1 comando disponível", + "{{count}} command available_other": "{{count}} comandos disponíveis", + "{{count}} result available_one": "1 resultado disponível", + "{{count}} result available_other": "{{count}} resultados disponíveis", + "Equal columns": "Colunas iguais", + "Left sidebar": "Barra lateral esquerda", + "Right sidebar": "Barra lateral direita", + "Wide center": "Centro largo", + "Left wide": "Largo à esquerda", + "Right wide": "Largo à direita", + "Names do not match": "Os nomes não correspondem", + "Today, {{time}}": "Hoje, {{time}}", + "Yesterday, {{time}}": "Ontem, {{time}}", + "now": "agora", + "Space created successfully": "Espaço criado com sucesso", + "Space updated successfully": "Espaço atualizado com sucesso", + "Space deleted successfully": "Espaço excluído com sucesso", + "Members added successfully": "Membros adicionados com sucesso", + "Member removed successfully": "Membro removido com sucesso", + "Member role updated successfully": "Função do membro atualizada com sucesso", + "Created by: {{creatorName}}": "Criado por: {{creatorName}}", + "Created at: {{time}}": "Criado em: {{time}}", + "Edited by {{name}} {{time}}": "Editado por {{name}} {{time}}", + "Word count: {{wordCount}}": "Contagem de palavras: {{wordCount}}", + "Character count: {{characterCount}}": "Contagem de caracteres: {{characterCount}}", + "New update": "Nova atualização", + "{{latestVersion}} is available": "{{latestVersion}} está disponível", + "Default page edit mode": "Modo padrão de edição da página", + "Choose your preferred page edit mode. Avoid accidental edits.": "Escolha o modo de edição de página preferido. Evite edições acidentais.", + "Choose {{format}} file": "Escolher arquivo {{format}}", + "Reading": "Leitura", + "Delete member": "Excluir membro", + "Member deleted successfully": "Membro excluído com sucesso", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Você tem certeza que deseja deletar este membro do workspace? Esta ação é irreversível.", + "Deactivate member": "Desativar membro", + "Activate member": "Ativar membro", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Tem certeza de que deseja desativar este membro do espaço de trabalho? Ele não poderá mais acessar este espaço de trabalho.", + "Are you sure you want to activate this workspace member?": "Tem certeza de que deseja ativar este membro do espaço de trabalho?", + "Deactivate": "Desativar", + "Activate": "Ativar", + "Deactivated": "Desativado", + "Move": "Mover", + "Move page": "Mover página", + "Move page to a different space.": "Mover página para um espaço diferente.", + "Real-time editor connection lost. Retrying...": "Conexão do editor em tempo real perdida. Tentando novamente...", + "Table of contents": "Sumário", + "Add headings (H1, H2, H3) to generate a table of contents.": "Adicionar títulos (H1, H2, H3) para gerar uma tabela de conteúdo.", + "Share": "Compartilhar", + "Public sharing": "Compartilhamento público", + "Shared by": "Compartilhado por", + "Shared at": "Compartilhado em", + "Inherits public sharing from": "Herda o compartilhamento público de", + "Share to web": "Compartilhar na web", + "Shared to web": "Compartilhado na web", + "Anyone with the link can view this page": "Qualquer pessoa com o link pode visualizar esta página", + "Make this page publicly accessible": "Tornar esta página acessível publicamente", + "Include sub-pages": "Incluir subpáginas", + "Make sub-pages public too": "Tornar as subpáginas públicas também", + "Allow search engines to index page": "Permitir que mecanismos de busca indexem a página", + "Open page": "Abrir página", + "Page": "Página", + "Delete public share link": "Excluir link de compartilhamento público", + "Delete share": "Excluir compartilhamento", + "Are you sure you want to delete this shared link?": "Tem certeza de que deseja excluir este link compartilhado?", + "Publicly shared pages from spaces you are a member of will appear here": "Páginas compartilhadas publicamente dos espaços dos quais você é membro aparecerão aqui", + "Share deleted successfully": "Compartilhamento excluído com sucesso", + "Share not found": "Compartilhamento não encontrado", + "Failed to share page": "Falha ao compartilhar a página", + "Disable public sharing": "Desativar compartilhamento público", + "Prevent members from sharing pages publicly.": "Impedir que os membros compartilhem páginas publicamente.", + "Toggle public sharing": "Alternar compartilhamento público", + "Toggle space public sharing": "Alternar compartilhamento público do espaço", + "Allow viewers to comment": "Permitir que os visualizadores comentem", + "Allow viewers to add comments on pages in this space.": "Permitir que os visualizadores adicionem comentários em páginas deste espaço.", + "Toggle viewer comments": "Ativar/desativar comentários de visualizadores", + "Public sharing is disabled at the workspace level": "O compartilhamento público está desativado no nível do espaço de trabalho", + "Prevent pages in this space from being shared publicly.": "Impedir que as páginas neste espaço sejam compartilhadas publicamente.", + "Page permissions": "Permissões da página},{", + "Control who can view and edit individual pages. Available with an enterprise license.": "Controle quem pode visualizar e editar páginas individuais. Disponível com licença empresarial.", + "Enable public sharing": "Ativar compartilhamento público", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Tem certeza de que deseja ativar o compartilhamento público? Os membros poderão compartilhar páginas publicamente.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Tem certeza de que deseja desativar o compartilhamento público? Todos os links compartilhados existentes neste espaço de trabalho serão excluídos.", + "Are you sure you want to enable public sharing for this space?": "Tem certeza de que deseja ativar o compartilhamento público para este espaço?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Tem certeza de que deseja desativar o compartilhamento público? Todos os links compartilhados existentes neste espaço serão excluídos.", + "Public sharing is disabled": "Compartilhamento público está desativado", + "Public sharing has been disabled at the workspace level.": "O compartilhamento público foi desativado no nível do espaço de trabalho.", + "Public sharing has been disabled for this space.": "O compartilhamento público foi desativado para este espaço.", + "Copy page": "Copiar página", + "Copy page to a different space.": "Copiar página para um espaço diferente.", + "Page copied successfully": "Página copiada com sucesso", + "Page duplicated successfully": "Página duplicada com sucesso", + "Find": "Localizar", + "Not found": "Não encontrado", + "Previous Match (Shift+Enter)": "Correspondência anterior (Shift+Enter)", + "Next match (Enter)": "Próxima correspondência (Enter)", + "Match case (Alt+C)": "Diferenciar maiúsculas de minúsculas (Alt+C)", + "Replace": "Substituir", + "Close (Escape)": "Fechar (Escape)", + "Replace (Enter)": "Substituir (Enter)", + "Replace all (Ctrl+Alt+Enter)": "Substituir tudo (Ctrl+Alt+Enter)", + "Replace all": "Substituir tudo", + "View all": "Ver tudo", + "View all spaces": "Ver todos os espaços", + "Error": "Erro", + "Failed to disable MFA": "Falha ao desativar a MFA", + "Disable two-factor authentication": "Desativar autenticação de dois fatores", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Desativar a autenticação de dois fatores tornará sua conta menos segura. Você só precisará de sua senha para entrar.", + "Please enter your password to disable two-factor authentication:": "Por favor, insira sua senha para desativar a autenticação de dois fatores:", + "Two-factor authentication has been enabled": "A autenticação de dois fatores foi ativada", + "Two-factor authentication has been disabled": "A autenticação de dois fatores foi desativada", + "2-step verification": "Verificação em 2 etapas", + "Protect your account with an additional verification layer when signing in.": "Proteja sua conta com uma camada adicional de verificação ao entrar.", + "Two-factor authentication is active on your account.": "Autenticação de dois fatores está ativa na sua conta.", + "Add 2FA method": "Adicionar método de 2FA", + "Backup codes": "Códigos de backup", + "Disable": "Desativar", + "Invalid verification code": "Código de verificação inválido", + "New backup codes have been generated": "Novos códigos de backup foram gerados", + "Failed to regenerate backup codes": "Falha ao regenerar os códigos de backup", + "About backup codes": "Sobre os códigos de backup", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Códigos de backup podem ser usados para acessar sua conta se perder acesso ao aplicativo autenticador. Cada código só pode ser usado uma vez.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "Você pode regenerar novos códigos de backup a qualquer momento. Isso invalidará todos os códigos existentes.", + "Confirm password": "Confirmar senha", + "Generate new backup codes": "Gerar novos códigos de backup", + "Save your new backup codes": "Salve seus novos códigos de backup", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Certifique-se de salvar esses códigos em um local seguro. Seus códigos de backup antigos não são mais válidos.", + "Your new backup codes": "Seus novos códigos de backup", + "I've saved my backup codes": "Salvei meus códigos de backup", + "Failed to setup MFA": "Falha ao configurar a MFA", + "Setup & Verify": "Configurar e verificar", + "Add to authenticator": "Adicionar ao autenticador", + "1. Scan this QR code with your authenticator app": "1. Escaneie este código QR com seu aplicativo autenticador", + "Can't scan the code?": "Não consegue escanear o código?", + "Enter this code manually in your authenticator app:": "Digite este código manualmente em seu aplicativo autenticador:", + "2. Enter the 6-digit code from your authenticator": "2. Insira o código de 6 dígitos do seu autenticador", + "Verify and enable": "Verificar e ativar", + "Failed to generate QR code. Please try again.": "Falha ao gerar código QR. Por favor, tente novamente.", + "Backup": "Backup", + "Save codes": "Salvar códigos", + "Save your backup codes": "Salve seus códigos de backup", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Esses códigos podem ser usados para acessar sua conta se você perder o acesso ao aplicativo autenticador. Cada código só pode ser usado uma vez.", + "Print": "Imprimir", + "Two-factor authentication has been set up. Please log in again.": "A autenticação de dois fatores foi configurada. Por favor, faça login novamente.", + "Two-Factor authentication required": "Autenticação de dois fatores obrigatória", + "Your workspace requires two-factor authentication for all users": "Seu workspace exige autenticação de dois fatores para todos os usuários", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Para continuar acessando seu espaço de trabalho, você deve configurar a autenticação de dois fatores. Isso adiciona uma camada extra de segurança à sua conta.", + "Set up two-factor authentication": "Configurar autenticação de dois fatores", + "Cancel and logout": "Cancelar e sair", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Seu espaço de trabalho requer autenticação de dois fatores. Por favor, configure para continuar.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Isso adiciona uma camada extra de segurança à sua conta, exigindo um código de verificação de seu aplicativo autenticador.", + "Password is required": "A senha é obrigatória", + "Password must be at least 8 characters": "A senha deve ter pelo menos 8 caracteres", + "Please enter a 6-digit code": "Insira um código de 6 dígitos", + "Code must be exactly 6 digits": "O código deve ter exatamente 6 dígitos", + "Enter the 6-digit code found in your authenticator app": "Insira o código de 6 dígitos encontrado no seu aplicativo autenticador", + "Need help authenticating?": "Precisa de ajuda para autenticar?", + "MFA QR Code": "Código QR de MFA", + "Account created successfully. Please log in to set up two-factor authentication.": "Conta criada com sucesso. Por favor, faça login para configurar a autenticação de dois fatores.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Redefinição de senha bem-sucedida. Por favor, faça login com sua nova senha e complete a autenticação de dois fatores.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Redefinição de senha bem-sucedida. Por favor, faça login com sua nova senha para configurar a autenticação de dois fatores.", + "Password reset was successful. Please log in with your new password.": "Redefinição de senha foi bem-sucedida. Por favor, faça login com sua nova senha.", + "Two-factor authentication": "Autenticação de dois fatores", + "Use authenticator app instead": "Usar aplicativo autenticador em vez disso", + "Verify backup code": "Verificar código de backup", + "Use backup code": "Usar código de backup", + "Enter one of your backup codes": "Insira um dos seus códigos de backup", + "Backup code": "Código de backup", + "Enter one of your backup codes. Each backup code can only be used once.": "Digite um de seus códigos de backup. Cada código de backup só pode ser usado uma vez.", + "Verify": "Verificar", + "Trash": "Lixeira", + "Pages in trash will be permanently deleted after {{count}} days.": "{count, plural, one {A página na lixeira será excluída permanentemente após # dia.} other {As páginas na lixeira serão excluídas permanentemente após # dias.}}", + "Deleted": "Excluído", + "No pages in trash": "Nenhuma página na lixeira", + "Permanently delete page?": "Excluir página permanentemente?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Tem certeza de que deseja excluir permanentemente '{{title}}'? Esta ação não pode ser desfeita.", + "Restore '{{title}}' and its sub-pages?": "Restaurar '{{title}}' e suas subpáginas?", + "Move to trash": "Mover para a lixeira", + "Move this page to trash?": "Mover esta página para a lixeira?", + "Restore page": "Restaurar página", + "Permanently delete": "Excluir permanentemente", + "{{name}} moved this page to Trash {{time}}.": "{{name}} moveu esta página para a Lixeira {{time}}.", + "Page moved to trash": "Página movida para a lixeira", + "Page restored successfully": "Página restaurada com sucesso", + "Deleted by": "Excluído por", + "Deleted at": "Excluído em", + "Preview": "Visualização", + "Base preview unavailable": "Pré-visualização da base indisponível", + "Restore this base to view its contents.": "Restaure esta base para visualizar seu conteúdo.", + "Subpages": "Subpáginas", + "Failed to load subpages": "Falha ao carregar as subpáginas", + "No subpages": "Nenhuma subpágina", + "Subpages (Child pages)": "Subpáginas (páginas filhas)", + "List all subpages of the current page": "Listar todas as subpáginas da página atual", + "Attachments": "Anexos", + "All spaces": "Todos os espaços", + "Unknown": "Desconhecido", + "Find a space": "Encontrar um espaço", + "Search in all your spaces": "Pesquisar em todos os seus espaços", + "Type": "Tipo", + "Enterprise": "Enterprise", + "Download attachment": "Baixar anexo", + "Allowed email domains": "Domínios de e-mail permitidos", + "Only users with email addresses from these domains can signup via SSO.": "Somente usuários com endereços de e-mail desses domínios podem se cadastrar via SSO.", + "Enter valid domain names separated by comma or space": "Insira nomes de domínio válidos separados por vírgula ou espaço", + "Enforce two-factor authentication": "Exigir autenticação de dois fatores", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Uma vez imposto, todos os membros devem habilitar a autenticação de dois fatores para acessar o espaço de trabalho.", + "Toggle MFA enforcement": "Alternar exigência de MFA", + "Display name": "Nome de exibição", + "Allow signup": "Permitir cadastro", + "Enabled": "Ativado", + "Advanced Settings": "Configurações avançadas", + "Enable TLS/SSL": "Ativar TLS/SSL", + "Use secure connection to LDAP server": "Usar conexão segura com o servidor LDAP", + "Group sync": "Sincronização de grupos", + "No SSO providers found.": "Nenhum provedor de SSO encontrado.", + "Delete SSO provider": "Excluir provedor de SSO", + "Are you sure you want to delete this SSO provider?": "Tem certeza de que deseja excluir este provedor de SSO?", + "Action": "Ação", + "{{ssoProviderType}} configuration": "Configuração de {{ssoProviderType}}", + "Icon": "Ícone", + "Upload image": "Enviar imagem", + "Remove image": "Remover imagem", + "Failed to remove image": "Falha ao remover imagem", + "Image exceeds 10MB limit.": "A imagem excede o limite de 10MB.", + "Image removed successfully": "Imagem removida com sucesso", + "API key": "Chave API", + "API keys": "Chaves API", + "API management": "Gestão de API", + "Custom expiration date": "Data de expiração personalizada", + "Enter a descriptive token name": "Insira um nome descritivo para o token", + "Expiration": "Expiração", + "Expired": "Expirado", + "Expires": "Expira", + "Last use": "Último uso", + "No API keys found": "Nenhuma chave API encontrada", + "No expiration": "Sem expiração", + "Revoked successfully": "Revogada com sucesso", + "Select expiration date": "Selecionar data de expiração", + "This action cannot be undone. Any applications using this API key will stop working.": "Esta ação não pode ser desfeita. Qualquer aplicação usando esta chave API deixará de funcionar.", + "Update": "Atualizar", + "Update {{credential}}": "Atualizar {{credential}}", + "Manage API keys for all users in the workspace": "Gerenciar chaves API para todos os usuários no espaço de trabalho", + "Restrict API key creation to admins": "Restringir a criação de chave de API aos administradores", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Somente administradores e proprietários podem criar novas chaves de API. As chaves de membros já existentes continuarão funcionando.", + "Toggle restrict API keys to admins": "Alternar restrição de chaves de API para administradores", + "API key creation is restricted to admins by your workspace administrator.": "A criação de chaves de API foi restringida aos administradores pelo administrador do seu workspace.", + "AI settings": "Configurações de IA", + "AI search": "Pesquisa IA", + "AI Answer": "Resposta de IA", + "Ask AI": "Pergunte à IA", + "AI is thinking...": "IA está pensando...", + "Thinking": "Pensando", + "Ask a question...": "Faça uma pergunta...", + "AI Answers": "Respostas de IA", + "AI-powered search (AI Answers)": "Pesquisa com IA (Respostas de IA)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "A pesquisa IA usa vetores de incorporação para fornecer capacidades de pesquisa semântica em todo o conteúdo do seu espaço de trabalho.", + "Toggle AI search": "Alternar pesquisa de IA", + "Generative AI (Ask AI)": "IA generativa (Perguntar à IA)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Habilitar geração de conteúdo com IA no editor. Permite aos usuários gerar, melhorar, traduzir e transformar texto.", + "Toggle generative AI": "Alternar IA generativa", + "Upgrade your plan": "Faça upgrade do seu plano", + "Available with a paid license": "Disponível com uma licença paga", + "Upgrade your license tier.": "Faça upgrade do seu nível de licença.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "A IA está disponível nas edições pagas do Docmost. Contate sales@docmost.com.", + "AI & MCP": "IA e MCP", + "AI": "IA", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Protocolo de Contexto de Modelo (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Ative o servidor MCP para permitir que assistentes de IA e ferramentas interajam com o conteúdo do seu espaço de trabalho.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "O MCP está disponível apenas na edição empresarial do Docmost. Contate sales@docmost.com.", + "MCP Server URL": "URL do servidor MCP", + "Connect AI assistants with your Docmost account via OAuth.": "Conecte assistentes de IA à sua conta do Docmost via OAuth.", + "Enforce OAuth": "Exigir OAuth", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "Os assistentes de IA devem se conectar com uma conta do Docmost via OAuth. Chaves de API não podem ser usadas com o servidor MCP.", + "Toggle enforce OAuth for MCP": "Ativar/desativar exigência de OAuth para MCP", + "Supported tools": "Ferramentas compatíveis", + "MCP server URL:": "URL do servidor MCP:", + "Learn more": "Saiba mais", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Gerencie as chaves de API de todos os usuários do workspace. Veja a documentação da API para detalhes de uso.", + "View the API documentation for usage details.": "Veja a documentação da API para detalhes de uso.", + "View the MCP documentation.": "Veja a documentação MCP.", + "Sources": "Fontes", + "AI Answers not available for attachments": "Respostas de IA não disponíveis para anexos", + "No answer available": "Nenhuma resposta disponível", + "Background color": "Cor de fundo", + "Highlight color": "Cor de destaque", + "Remove color": "Remover cor", + "Notifications": "Notificações", + "No notifications": "Sem notificações", + "No unread notifications": "Sem notificações não lidas", + "All notifications": "Todas as notificações", + "Unread only": "Somente não lidas", + "Mark all as read": "Marcar todas como lidas", + "Mark as read": "Marcar como lida", + "More options": "Mais opções", + "{{name}} mentioned you in a comment": "{{name}} mencionou você em um comentário", + "{{name}} commented on a page": "{{name}} comentou em uma página", + "{{name}} resolved a comment": "{{name}} resolveu um comentário", + "{{name}} mentioned you on a page": "{{name}} mencionou você em uma página", + "{{name}} gave you edit access to a page": "{{name}} concedeu a você acesso de edição a uma página", + "{{name}} gave you view access to a page": "{{name}} concedeu a você acesso de visualização a uma página", + "{{name}} updated a page": "{{name}} atualizou uma página", + "Watch page": "Acompanhar página", + "Stop watching": "Parar de acompanhar", + "Watch space": "Acompanhar espaço", + "Stop watching space": "Parar de acompanhar espaço", + "Email notifications": "Notificações por e-mail", + "Page updates": "Atualizações da página", + "Get notified when pages you watch are updated.": "Receba notificações quando as páginas que você observa forem atualizadas.", + "Page mentions": "Menções na página", + "Get notified when someone mentions you on a page.": "Receba notificações quando alguém mencionar você em uma página.", + "Comment mentions": "Menções em comentários", + "Get notified when someone mentions you in a comment.": "Receba notificações quando alguém mencionar você em um comentário.", + "New comments": "Novos comentários", + "Get notified about new comments on threads you participate in.": "Receba notificações sobre novos comentários nas discussões em que você participa.", + "Resolved comments": "Comentários resolvidos", + "Get notified when your comment is resolved.": "Receba notificações quando seu comentário for resolvido.", + "You are now watching this page": "Agora você está observando esta página", + "You are no longer watching this page": "Você não está mais observando esta página", + "You are now watching this space": "Agora você está acompanhando este espaço", + "You are no longer watching this space": "Você não está mais acompanhando este espaço", + "Direct": "Direto", + "Updates": "Atualizações", + "Today": "Hoje", + "Yesterday": "Ontem", + "This week": "Esta semana", + "Older": "Mais antigo", + "Restricted page": "Página restrita", + "Restricted pages cannot be shared publicly.": "Páginas restritas não podem ser compartilhadas publicamente.", + "Restricted by parent": "Restrita pela página pai", + "Restricted": "Restrito", + "Open": "Aberto", + "Inherits restrictions from ancestor page": "Herda restrições da página ancestral", + "Only people listed below can access this page": "Apenas as pessoas listadas abaixo podem acessar esta página", + "Everyone in this space can access": "Todos neste espaço podem acessar", + "No additional restrictions on this page": "Sem restrições adicionais nesta página", + "Only specific people can access": "Apenas pessoas específicas podem acessar", + "Use only inherited restrictions": "Usar apenas restrições herdadas", + "Add restrictions on top of inherited": "Adicionar restrições além das herdadas", + "Inherited restriction": "Restrição herdada", + "Access limited by": "Acesso limitado por", + "Restrict access to control who can view and edit this page": "Restringir o acesso para controlar quem pode visualizar e editar esta página", + "Add additional restrictions specific to this page": "Adicionar restrições adicionais específicas para esta página", + "Access": "Acesso", + "People with access": "Pessoas com acesso", + "Remove all": "Remover tudo", + "Remove access": "Remover acesso", + "Remove all access": "Remover todo o acesso", + "Are you sure you want to remove this member's access to the page?": "Tem certeza de que deseja remover o acesso deste membro à página?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Tem certeza de que deseja remover todo o acesso específico? Isso fará com que a página fique aberta para todos no espaço.", + "Trash retention": "Retenção da lixeira", + "Pages in trash will be permanently deleted after this period.": "As páginas na lixeira serão excluídas permanentemente após este período.", + "Trash retention updated": "Retenção da lixeira atualizada", + "Failed to update trash retention": "Falha ao atualizar a retenção da lixeira", + "Removed page restriction": "Restrição de página removida", + "Added page permission": "Permissão de página adicionada", + "Removed page permission": "Permissão de página removida", + "Changed page permission": "Permissão da página alterada", + "Requested password reset": "Redefinição de senha solicitada", + "Created template": "Modelo criado", + "Deleted template": "Modelo excluído", + "day": "dia", + "days": "dias", + "week": "semana", + "weeks": "semanas", + "month": "mês", + "months": "meses", + "year": "ano", + "years": "anos", + "Period": "Período", + "Fixed date": "Data fixa", + "Indefinitely": "Indefinidamente", + "Days": "Dias", + "Weeks": "Semanas", + "Months": "Meses", + "Years": "Anos", + "Pick a date": "Escolha uma data", + "Maximum is {{max}} {{unit}} for this unit": "O máximo é {{max}} {{unit}} para esta unidade", + "Never expires. Verifiers can re-verify at any time.": "Nunca expira. Os verificadores podem verificar novamente a qualquer momento.", + "Verified": "Verificado", + "Review needed": "Revisão necessária", + "Verification expired": "A verificação expirou", + "Draft": "Rascunho", + "In Approval": "Em aprovação", + "In approval": "Em aprovação", + "Approved": "Aprovado", + "Obsolete": "Obsoleto", + "Expiring": "Expirando", + "Set up verification": "Configurar verificação", + "Verify page": "Verificar página", + "Page verification": "Verificação da página", + "Add verification": "Adicionar verificação", + "Edit verification": "Editar verificação", + "Search by title": "Pesquisar por título", + "Choose how this page should stay accurate.": "Escolha como esta página deve permanecer precisa.", + "Recurring verification": "Verificação recorrente", + "Verifiers re-confirm this page on a schedule.": "Os verificadores confirmam novamente esta página em uma programação definida.", + "Re-verify on a schedule (e.g every 30 days )": "Verificar novamente em uma programação definida (ex.: a cada 30 dias)", + "Page stays editable at all times": "A página permanece editável o tempo todo", + "Best for runbooks, FAQs, living documentation": "Ideal para runbooks, FAQs e documentação viva", + "Approval workflow": "Fluxo de aprovação", + "Formal document lifecycle with named approvers.": "Ciclo de vida formal do documento com aprovadores nomeados.", + "Draft → In approval → Approved → Obsolete": "Rascunho → Em aprovação → Aprovado → Obsoleto", + "Locked once approved, with full history": "Bloqueado após a aprovação, com histórico completo", + "Designed for ISO 9001, ISO 13485, and FDA": "Desenvolvido para ISO 9001, ISO 13485 e FDA", + "Best for SOPs and controlled documents": "Ideal para POPs e documentos controlados", + "Back": "Voltar", + "Quality management": "Gestão da qualidade", + "Recurring": "Recorrente", + "Pages move through draft, approval, and approved stages.": "As páginas passam pelos estágios de rascunho, aprovação e aprovado.", + "Verifiers": "Verificadores", + "Add verifier": "Adicionar verificador", + "I've reviewed this page for accuracy": "Revisei esta página quanto à precisão", + "Set up": "Configurar", + "Remove verification": "Remover verificação", + "Are you sure you want to remove verification from this page?": "Tem certeza de que deseja remover a verificação desta página?", + "Assigned verifiers must periodically re-verify this page.": "Os verificadores atribuídos devem verificar novamente esta página periodicamente.", + "Last verified by {{name}} {{time}} (expired)": "Verificado pela última vez por {{name}} {{time}} (expirado)", + "The fixed expiration date has passed.": "A data fixa de expiração já passou.", + "Verified by {{name}} {{time}}": "Verificado por {{name}} {{time}}", + "Expires {{date}}": "Expira em {{date}}", + "Expired {{date}}": "Expirou em {{date}}", + "Mark as obsolete": "Marcar como obsoleto", + "Mark obsolete": "Marcar como obsoleto", + "Returned by {{name}} {{time}}": "Devolvido por {{name}} {{time}}", + "No approval has been requested yet.": "Nenhuma aprovação foi solicitada ainda.", + "Submitted by {{name}} {{time}}": "Enviado por {{name}} {{time}}", + "Someone": "Alguém", + "Approved by {{name}} {{time}}": "Aprovado por {{name}} {{time}}", + "This document has been marked as obsolete.": "Este documento foi marcado como obsoleto.", + "Rejection comment": "Comentário de rejeição", + "Reason for returning this document...": "Motivo para devolver este documento...", + "Confirm rejection": "Confirmar rejeição", + "Submit for approval": "Enviar para aprovação", + "Reject": "Rejeitar", + "Approve": "Aprovar", + "Re-submit for approval": "Reenviar para aprovação", + "Verified until": "Verificado até", + "QMS": "SGQ", + "Verified pages": "Páginas verificadas", + "Search pages...": "Pesquisar páginas...", + "Filter by space": "Filtrar por espaço", + "Filter by type": "Filtrar por tipo", + "{{name}} verified a page": "{{name}} verificou uma página", + "{{name}} submitted a page for your approval": "{{name}} enviou uma página para sua aprovação", + "{{name}} returned a page for revision": "{{name}} devolveu uma página para revisão", + "Page verification expires soon": "A verificação da página expirará em breve", + "Page verification has expired": "A verificação da página expirou", + "SIEM destination {{name}} is failing": "O destino SIEM {{name}} está com falha", + "SIEM destination {{name}} was disabled after 24 hours of failures": "O destino SIEM {{name}} foi desativado após 24 horas de falhas", + "SIEM destination {{name}} recovered": "O destino SIEM {{name}} foi recuperado", + "Verifying your email": "Verificando seu e-mail", + "Please wait...": "Por favor, aguarde...", + "Verification failed. The link may have expired.": "Falha na verificação. O link pode ter expirado.", + "Check your email": "Verifique seu e-mail", + "We sent a verification link to {{email}}.": "Enviamos um link de verificação para {{email}}.", + "We sent a verification link to your email.": "Enviamos um link de verificação para seu e-mail.", + "Click the link to verify your email and access your workspace.": "Clique no link para verificar seu e-mail e acessar seu workspace.", + "Resend verification email": "Reenviar e-mail de verificação", + "Verification email sent. Please check your inbox.": "E-mail de verificação enviado. Por favor, verifique sua caixa de entrada.", + "Failed to resend verification email. Please try again.": "Falha ao reenviar o e-mail de verificação. Por favor, tente novamente.", + "We've sent you an email with your associated workspaces.": "Enviamos um e-mail para você com seus workspaces associados.", + "Load more": "Carregar mais", + "Log out of all devices": "Sair de todos os dispositivos", + "Log out of all sessions except this device": "Sair de todas as sessões, exceto deste dispositivo", + "This Device": "Este dispositivo", + "Unknown device": "Dispositivo desconhecido", + "No active sessions": "Nenhuma sessão ativa", + "Session revoked": "Sessão revogada", + "All other sessions revoked": "Todas as outras sessões foram revogadas", + "Last used": "Último uso", + "Created": "Criado", + "Rename": "Renomear", + "Publish": "Publicar", + "Security": "Segurança", + "Enforce SSO": "Exigir SSO", + "Once enforced, members will not be able to login with email and password.": "Depois de exigido, os membros não poderão fazer login com e-mail e senha.", + "AI-generated content may not be accurate.": "O conteúdo gerado por IA pode não ser preciso.", + "AI Chat": "Chat com IA", + "Analyze for insights": "Analisar para obter insights", + "Ask anything...": "Pergunte qualquer coisa...", + "Assistant said:": "O assistente disse:", + "Chat history": "Histórico de chats", + "Chat name": "Nome do chat", + "Chat transcript": "Transcrição do chat", + "Close": "Fechar", + "Copy assistant response": "Copiar resposta do assistente", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "Falha ao carregar o chat. Ocorreu um erro.", + "Failed to render this message.": "Falha ao renderizar esta mensagem.", + "How can I help you today?": "Como posso ajudar você hoje?", + "New chat": "Novo chat", + "No chat history": "Nenhum histórico de chat", + "No chats found": "Nenhum chat encontrado", + "No conversations yet": "Ainda não há conversas", + "Open full page": "Abrir página inteira", + "Scroll to bottom": "Rolar até o fim", + "You said:": "Você disse:", + "Previous 7 days": "Últimos 7 dias", + "Previous 30 days": "Últimos 30 dias", + "Search chats...": "Pesquisar chats...", + "Search chats": "Pesquisar chats", + "Ask anything... Use @ to mention pages": "Pergunte qualquer coisa... Use @ para mencionar páginas", + "Ask anything or search your workspace": "Pergunte qualquer coisa ou pesquise no seu workspace", + "Welcome to {{name}}": "Boas-vindas a {{name}}", + "Add files": "Adicionar arquivos", + "Mention a page": "Mencionar uma página", + "Start a new chat to see it here.": "Inicie um novo chat para vê-lo aqui.", + "Summarize this page": "Resumir esta página", + "Toggle AI Chat": "Alternar chat com IA", + "Translate this page": "Traduzir esta página", + "Try a different search term.": "Tente um termo de pesquisa diferente.", + "Try again": "Tentar novamente", + "Untitled chat": "Chat sem título", + "What can I help you with?": "Com o que posso ajudar você?", + "Are you sure you want to revoke this {{credential}}": "Tem certeza de que deseja revogar esta {{credential}}", + "Automatically provision users and groups from your identity provider via SCIM.": "Provisione automaticamente usuários e grupos do seu provedor de identidade via SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Configure seu provedor de identidade com esta URL para provisionar usuários e grupos.", + "Create {{credential}}": "Criar {{credential}}", + "{{credential}} created": "{{credential}} criada", + "{{credential}} created successfully": "{{credential}} criada com sucesso", + "Created by": "Criado por", + "Custom": "Personalizado", + "Enable SCIM": "Ativar SCIM", + "Enter a descriptive name": "Insira um nome descritivo", + "I've saved my {{credential}}": "Salvei minha {{credential}}", + "Important": "Importante", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Copie sua {{credential}} agora. Você não poderá vê-la novamente!", + "Never": "Nunca", + "Revoke {{credential}}": "Revogar {{credential}}", + "SCIM endpoint URL": "URL do endpoint SCIM", + "SCIM provisioning": "Provisionamento SCIM", + "SCIM takes precedence over SSO group sync while enabled.": "O SCIM tem precedência sobre a sincronização de grupos por SSO enquanto estiver ativado.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "Você atingiu o máximo de {{max}} tokens SCIM. Exclua um token existente para criar um novo.", + "SCIM token": "Token SCIM", + "SCIM tokens": "Tokens SCIM", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Esta ação não pode ser desfeita. Seu provedor de identidade deixará de sincronizar imediatamente.", + "Toggle SCIM provisioning": "Alternar provisionamento SCIM", + "Token": "Token", + "Page menu": "Menu da página", + "Expand": "Expandir", + "Collapse": "Recolher", + "Comment menu": "Menu de comentários", + "Group menu": "Menu do grupo", + "Show hidden breadcrumbs": "Mostrar breadcrumbs ocultos", + "Breadcrumbs": "Trilhas de navegação", + "Page actions": "Ações da página", + "Pick emoji": "Escolher emoji", + "Template menu": "Menu do modelo", + "Use": "Usar", + "Use template": "Usar modelo", + "Preview template: {{title}}": "Visualizar modelo: {{title}}", + "Use a template": "Usar um modelo", + "Search templates...": "Pesquisar modelos...", + "Search spaces...": "Pesquisar espaços...", + "No templates found": "Nenhum modelo encontrado", + "No spaces found": "Nenhum espaço encontrado", + "Browse all templates": "Ver todos os modelos", + "This space": "Este espaço", + "All templates": "Todos os modelos", + "Global": "Global", + "New template": "Novo modelo", + "Edit template": "Editar modelo", + "Are you sure you want to delete this template?": "Tem certeza de que deseja excluir este modelo?", + "Template scope updated": "Escopo do modelo atualizado", + "Choose which space this template belongs to": "Escolha a qual espaço este modelo pertence", + "Only workspace admins can create global templates.": "Somente administradores do espaço de trabalho podem criar modelos globais.", + "You need edit access to this space to create templates.": "Você precisa de acesso de edição a este espaço para criar modelos.", + "Scope": "Escopo", + "Select scope": "Selecionar escopo", + "Title": "Título", + "Saving...": "Salvando...", + "Saved": "Salvo", + "Save failed. Retry": "Falha ao salvar. Tentar novamente", + "By {{name}}": "Por {{name}}", + "Updated {{time}}": "Atualizado {{time}}", + "Choose destination": "Escolher destino", + "Search pages and spaces...": "Pesquisar páginas e espaços...", + "No results found": "Nenhum resultado encontrado", + "You don't have permission to create pages here": "Você não tem permissão para criar páginas aqui", + "Chat menu for {{title}}": "Menu do chat para {{title}}", + "API key menu": "Menu da chave de API", + "Jump to comment selection": "Ir para a seleção de comentários", + "Slash commands": "Comandos de barra", + "Mention suggestions": "Sugestões de menção", + "Link suggestions": "Sugestões de links", + "Diagram editor": "Editor de diagramas", + "Add comment": "Adicionar comentário", + "Find and replace": "Localizar e substituir", + "Main navigation": "Navegação principal", + "Space navigation": "Navegação do espaço", + "Settings navigation": "Navegação de configurações", + "AI navigation": "Navegação de IA", + "Breadcrumb": "Trilha de navegação", + "Synced block": "Bloco sincronizado", + "Create a block that stays in sync across pages.": "Crie um bloco que permaneça sincronizado entre páginas.", + "Editing original": "Editando original", + "Copy synced block": "Copiar bloco sincronizado", + "Unsync": "Desfazer sincronização", + "Delete synced block": "Excluir bloco sincronizado", + "Synced to {{count}} other page_one": "Sincronizado com {{count}} outra página", + "Synced to {{count}} other page_other": "Sincronizado com {{count}} outras páginas", + "ORIGINAL": "ORIGINAL", + "THIS PAGE": "ESTA PÁGINA", + "No pages": "Nenhuma página", + "The original synced block no longer exists": "O bloco sincronizado original não existe mais", + "You don't have access to this synced block": "Você não tem acesso a este bloco sincronizado", + "Failed to load this synced block": "Falha ao carregar este bloco sincronizado", + "Fixed editor toolbar": "Barra de ferramentas fixa do editor", + "Show a formatting toolbar above the editor with quick access to common actions.": "Mostre uma barra de ferramentas de formatação acima do editor com acesso rápido a ações comuns.", + "Toggle fixed editor toolbar": "Alternar barra de ferramentas fixa do editor", + "Normal text": "Texto normal", + "More inline formatting": "Mais formatação em linha", + "Subscript": "Subscrito", + "Superscript": "Sobrescrito", + "Inline code": "Código em linha", + "Insert media": "Inserir mídia", + "Mention": "Menção", + "Emoji": "Emoji", + "Columns": "Colunas", + "More inserts": "Mais inserções", + "Embeds": "Incorporações", + "Diagrams": "Diagramas", + "Advanced": "Avançado", + "Utility": "Utilitário", + "Decrease indent": "Diminuir recuo", + "Increase indent": "Aumentar recuo", + "Clear formatting": "Limpar formatação", + "Code block": "Bloco de código", + "Experimental": "Experimental", + "Strikethrough": "Tachado", + "Undo": "Desfazer", + "Redo": "Refazer", + "Backlinks": "Links de retorno", + "Last updated by": "Última atualização por", + "Last updated": "Última atualização", + "Stats": "Estatísticas", + "Word count": "Contagem de palavras", + "Characters": "Caracteres", + "Incoming links": "Links recebidos", + "Outgoing links": "Links de saída", + "Incoming links ({{count}})": "Links recebidos ({{count}})", + "Outgoing links ({{count}})": "Links de saída ({{count}})", + "No pages link here yet.": "Nenhuma página tem link para cá ainda.", + "This page doesn't link to other pages yet.": "Esta página ainda não tem links para outras páginas.", + "Verified until {{date}}": "Verificado até {{date}}", + "Labels": "Rótulos", + "Add label": "Adicionar rótulo", + "No labels yet": "Ainda não há rótulos", + "Already added": "Já adicionado", + "Invalid label name": "Nome de rótulo inválido", + "No matches": "Sem correspondências", + "Search or create…": "Pesquisar ou criar…", + "Remove label {{name}}": "Remover rótulo {{name}}", + "Failed to add label": "Falha ao adicionar rótulo", + "Failed to remove label": "Falha ao remover rótulo", + "No pages with this label": "Nenhuma página com este rótulo", + "Pages tagged with this label will appear here.": "As páginas marcadas com este rótulo aparecerão aqui.", + "No pages match your search.": "Nenhuma página corresponde à sua pesquisa.", + "Updated {{date}}": "Atualizado em {{date}}", + "Cell actions": "Ações da célula", + "Column actions": "Ações da coluna", + "Row actions": "Ações da linha", + "Filter": "Filtrar", + "Page title": "Título da página", + "Page content": "Conteúdo da página", + "Member actions for {{name}}": "Ações do membro para {{name}}", + "Toggle password visibility": "Alternar visibilidade da senha", + "Send comment": "Enviar comentário", + "Token actions": "Ações do token", + "Template settings": "Configurações do modelo", + "Edit diagram": "Editar diagrama", + "Edit embed": "Editar incorporação", + "Edit drawing": "Editar desenho", + "Delete equation": "Excluir equação", + "Invite actions": "Ações do convite", + "Get started": "Começar", + "* indicates required fields": "* indica campos obrigatórios", + "List of spaces in this workspace": "Lista de espaços neste workspace", + "Active sessions": "Sessões ativas", + "Add {{name}} to favorites": "Adicionar {{name}} aos favoritos", + "Remove {{name}} from favorites": "Remover {{name}} dos favoritos", + "Added to favorites": "Adicionado aos favoritos", + "Removed from favorites": "Removido dos favoritos", + "Added {{name}} to favorites": "{{name}} adicionado aos favoritos", + "Removed {{name}} from favorites": "{{name}} removido dos favoritos", + "Page menu for {{name}}": "Menu da página de {{name}}", + "Create subpage of {{name}}": "Criar subpágina de {{name}}", + "Allow personal spaces": "Permitir espaços pessoais", + "Members can create their own personal space.": "Os membros podem criar seu próprio espaço pessoal.", + "Toggle allow personal spaces": "Ativar/desativar permissão para espaços pessoais", + "Create personal space": "Criar espaço pessoal", + "Personal space": "Espaço pessoal", + "{{name}}'s space": "Espaço de {{name}}", + "Apply": "Aplicar", + "Cells that aren't already a page reference will be cleared.": "As células que ainda não forem uma referência de página serão limpas.", + "Cells that aren't a valid URL will be cleared.": "As células que não forem uma URL válida serão limpas.", + "Cells that aren't a valid email address will be cleared.": "As células que não forem um endereço de e-mail válido serão limpas.", + "Cells that can't be parsed as a date will be cleared.": "As células que não puderem ser interpretadas como uma data serão limpas.", + "Cells that can't be parsed as a number will be cleared.": "As células que não puderem ser interpretadas como um número serão limpas.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "As células serão convertidas (yes/true/1 se tornam marcadas; todo o resto se torna desmarcado ou limpo).", + "Cells will be reinterpreted under the new type.": "As células serão reinterpretadas com o novo tipo.", + "Cells will be replaced with a comma-separated list of file names.": "As células serão substituídas por uma lista de nomes de arquivos separados por vírgula.", + "Cells will be replaced with a comma-separated list of option names.": "As células serão substituídas por uma lista de nomes de opções separados por vírgula.", + "Cells will be replaced with the option name.": "As células serão substituídas pelo nome da opção.", + "Cells will be replaced with the page title.": "As células serão substituídas pelo título da página.", + "Cells will be replaced with the person's name.": "As células serão substituídas pelo nome da pessoa.", + "Change type": "Alterar tipo", + "Change type to {{label}}?": "Alterar tipo para {{label}}?", + "Converting…": "Convertendo…", + "Existing values become single-item lists. No data is lost.": "Os valores existentes se tornam listas de item único. Nenhum dado é perdido.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Apenas o primeiro item selecionado por linha será mantido; o restante será descartado.", + "Previous record": "Registro anterior", + "Next record": "Próximo registro", + "Record actions": "Ações do registro", + "Delete record": "Excluir registro", + "Delete record?": "Excluir registro?", + "This action cannot be undone.": "Esta ação não pode ser desfeita.", + "to navigate": "para navegar", + "to close": "para fechar", + "Expand row {{number}}": "Expandir linha {{number}}", + "Saving…": "Salvando…", + "Read-only": "Somente leitura", + "Loading…": "Carregando…", + "Updated {{when}}": "Atualizado {{when}}", + "Add property": "Adicionar propriedade", + "Create property": "Criar propriedade", + "Hide properties": "Ocultar propriedades", + "Find a property type": "Encontrar um tipo de propriedade", + "Properties": "Propriedades", + "A property with this name already exists": "Já existe uma propriedade com este nome", + "Add card": "Adicionar cartão", + "Add filter": "Adicionar filtro", + "Add option": "Adicionar opção", + "Add sort": "Adicionar ordenação", + "Add view": "Adicionar visualização", + "All data in this column will be lost.": "Todos os dados nesta coluna serão perdidos.", + "Allow multiple people": "Permitir várias pessoas", + "Alphabetize": "Ordenar alfabeticamente", + "Are you sure you want to delete": "Tem certeza de que deseja excluir", + "Ascending": "Crescente", + "Base deleted": "Base excluída", + "Base name": "Nome da base", + "Base table": "Tabela da base", + "Card properties": "Propriedades do cartão", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Células maiores do que o limite de Texto serão truncadas e o conteúdo extra será perdido permanentemente.", + "Checkbox": "Caixa de seleção", + "Checked by default": "Marcado por padrão", + "Choose a property": "Escolha uma propriedade", + "Clear selection": "Limpar seleção", + "Column options": "Opções da coluna", + "Comma, period": "Vírgula, ponto", + "Complete": "Concluído", + "Contains": "Contém", + "Copy link to view": "Copiar link da visualização", + "Create a status property": "Criar uma propriedade de status", + "Created at": "Criado em", + "Currency": "Moeda", + "Decimal places": "Casas decimais", + "Default value": "Valor padrão", + "Delete property": "Excluir propriedade", + "Delete view": "Excluir visualização", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Decrescente", + "Discard": "Descartar", + "Doesn't contain": "Não contém", + "Done": "Concluído", + "Edit formula": "Editar fórmula", + "Edit property": "Editar propriedade", + "Export CSV": "Exportar CSV", + "Failed to load base": "Falha ao carregar a base", + "False": "Falso", + "File": "Arquivo", + "Filter and sort changes are visible only to you": "As alterações de filtro e ordenação são visíveis somente para você", + "Filter by": "Filtrar por", + "Formula": "Fórmula", + "Get started with": "Começar com", + "Greater than": "Maior que", + "Group by": "Agrupar por", + "Group this board by a select or status property.": "Agrupe este quadro por uma propriedade de seleção ou status.", + "Hide all": "Ocultar tudo", + "Hide group": "Ocultar grupo", + "In Progress": "Em andamento", + "In progress": "Em andamento", + "Include time": "Incluir hora", + "Insert a kanban board on this page": "Inserir um quadro kanban nesta página", + "Insert an inline base on this page": "Inserir uma base inline nesta página", + "Is": "É", + "Is after": "É depois de", + "Is any of": "É qualquer um de", + "Is before": "É antes de", + "Is empty": "Está vazio", + "Is none of": "Não é nenhum de", + "Is not": "Não é", + "Is not empty": "Não está vazio", + "Is on or after": "É em ou depois de", + "Is on or before": "É em ou antes de", + "Is within": "Está dentro de", + "Keep editing": "Continuar editando", + "Last edited at": "Última edição em", + "Last edited by": "Última edição por", + "Less than": "Menor que", + "Link copied to clipboard": "Link copiado para a área de transferência", + "Local": "Local", + "Long text": "Texto longo", + "Moved card to {{column}}": "Cartão movido para {{column}}", + "Moved column to {{column}}": "Coluna movida para {{column}}", + "Multi-select": "Seleção múltipla", + "New row": "Nova linha", + "Next month": "Próximo mês", + "Next week": "Próxima semana", + "Next year": "Próximo ano", + "No filters applied": "Nenhum filtro aplicado", + "No match": "Sem correspondência", + "No options for this property type": "Sem opções para este tipo de propriedade", + "No sorts applied": "Nenhuma ordenação aplicada", + "No value": "Sem valor", + "None": "Nenhum", + "Not started": "Não iniciado", + "Number": "Número", + "One month ago": "Há um mês", + "One month from now": "Daqui a um mês", + "One week ago": "Há uma semana", + "One week from now": "Daqui a uma semana", + "Open as page": "Abrir como página", + "Options": "Opções", + "Past month": "Mês passado", + "Past week": "Semana passada", + "Past year": "Ano passado", + "Percent": "Porcentagem", + "Period, comma": "Ponto, vírgula", + "Person": "Pessoa", + "Please enter a valid email": "Por favor, insira um e-mail válido", + "Progress": "Progresso", + "Property options": "Opções da propriedade", + "Relative": "Relativo", + "Rename property": "Renomear propriedade", + "Reset": "Redefinir", + "Save for everyone": "Salvar para todos", + "Select": "Seleção", + "Select a property": "Selecione uma propriedade", + "Select all loaded rows": "Selecionar todas as linhas carregadas", + "Show all": "Mostrar tudo", + "Sort": "Ordenar", + "Sort by": "Ordenar por", + "Space, comma": "Espaço, vírgula", + "Space, period": "Espaço, ponto", + "This board has no grouping property yet.": "Este quadro ainda não tem uma propriedade de agrupamento.", + "This month": "Este mês", + "This year": "Este ano", + "Thousands and decimal separators": "Separadores de milhares e decimais", + "Time format": "Formato de hora", + "To Do": "A fazer", + "Tomorrow": "Amanhã", + "True": "Verdadeiro", + "Unsaved changes": "Alterações não salvas", + "Untitled base": "Base sem título", + "URL": "URL", + "Value": "Valor", + "View updated for everyone": "Visualização atualizada para todos", + "You have unsaved changes. Do you want to discard them?": "Você tem alterações não salvas. Deseja descartá-las?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected", + "Compare": "Comparar", + "Compare versions": "Comparar versões", + "Select version from {{date}}": "Selecionar versão de {{date}}", + "Version actions for {{date}}": "Ações da versão de {{date}}", + "Comparing {{newer}} and {{older}}": "Comparando {{newer}} e {{older}}", + "Exit compare": "Sair da comparação", + "Search attachments...": "Pesquisar anexos...", + "Error loading attachments.": "Erro ao carregar anexos.", + "No attachments on this page yet.": "Ainda não há anexos nesta página.", + "Uploaded by {{name}}": "Enviado por {{name}}", + "Download {{name}}": "Baixar {{name}}", + "Access revoked": "Acesso revogado", + "Authorize application": "Autorizar aplicativo", + "{{name}} wants to access {{workspace}}": "{{name}} quer acessar {{workspace}}", + "Not you? Switch account": "Não é você? Trocar conta", + "This application will be able to:": "Este aplicativo poderá:", + "Write": "Escrever", + "Invalid authorization request": "Solicitação de autorização inválida", + "Authorize": "Autorizar", + "Application": "Aplicativo", + "Permissions": "Permissões", + "Authorized": "Autorizado", + "Revoke access": "Revogar acesso", + "Revoke access for {{name}}": "Revogar acesso de {{name}}", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Tem certeza de que deseja revogar o acesso de {{name}}? O aplicativo não poderá mais acessar sua conta.", + "Something went wrong. Please try again.": "Algo deu errado. Tente novamente.", + "Remove {{name}}": "Remover {{name}}", + "Make sure you trust this application before authorizing it.": "Certifique-se de confiar neste aplicativo antes de autorizá-lo.", + "You will be redirected to": "Você será redirecionado para", + "View content without making changes.": "Visualizar conteúdo sem fazer alterações.", + "Create and modify content.": "Criar e modificar conteúdo.", + "Applications and AI assistants you have authorized to access your account.": "Aplicativos e assistentes de IA que você autorizou a acessar sua conta.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "Seu workspace tem o MCP ativado. Conecte assistentes de IA à sua conta do Docmost via OAuth.", + "Authorized apps": "Aplicativos autorizados", + "No authorized apps yet.": "Ainda não há aplicativos autorizados.", + "Workspace knowledge only": "Somente conhecimento do workspace", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Restrinja o AI Chat para responder apenas com base nas páginas do seu workspace e nos arquivos enviados. Ele não usará conhecimento externo.", + "Toggle workspace knowledge only": "Alternar somente conhecimento do workspace", + "Read-only mode": "Modo somente leitura", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "O AI Chat pode pesquisar e ler o conteúdo do workspace, mas não pode criar nem editar páginas.", + "Toggle AI Chat read-only mode": "Alternar modo somente leitura do AI Chat", + "Title only": "Somente título", + "you": "você", + "Allow public spaces": "Permitir espaços públicos", + "Space admins can publish their spaces to the web.": "Os administradores de espaços podem publicar seus espaços na web.", + "Toggle allow public spaces": "Alternar permissão de espaços públicos", + "Publish space to the web": "Publicar espaço na web", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Qualquer pessoa na internet poderá ler todas as páginas deste espaço, exceto as páginas restritas. Tem certeza?", + "Make this space publicly readable by anyone on the internet.": "Torne este espaço publicamente legível para qualquer pessoa na internet.", + "Toggle publish space to the web": "Alternar publicação do espaço na web", + "Allow search engines to index": "Permitir que mecanismos de busca indexem", + "Let public pages in this space appear in search engine results.": "Permita que as páginas públicas deste espaço apareçam nos resultados dos mecanismos de busca.", + "Toggle search engine indexing": "Alternar indexação por mecanismos de busca", + "Public space link": "Link público do espaço", + "Copy public space link": "Copiar link público do espaço", + "Renaming the space slug will break public links.": "Renomear o slug do espaço quebrará os links públicos.", + "Failed to update space": "Falha ao atualizar o espaço", + "This space is public": "Este espaço é público", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Qualquer pessoa na internet pode ler as páginas deste espaço, exceto as páginas restritas.", + "Open public site": "Abrir site público", + "Public": "Público", + "This space has no public pages yet.": "Este espaço ainda não tem páginas públicas.", + "On this page": "Nesta página", + "Previous": "Anterior", + "Next": "Próximo", + "Show hidden pages": "Mostrar páginas ocultas", + "Page navigation": "Navegação da página", + "Toggle sidebar": "Alternar barra lateral", + "Toggle table of contents": "Alternar sumário", + "Appearance": "Aparência", + "Forest": "Floresta", + "Violet": "Violeta", + "Light mode color": "Cor do modo claro", + "Dark mode color": "Cor do modo escuro", + "Choose the primary color of the public docs site.": "Escolha a cor primária do site de documentação pública.", + "Show page author": "Mostrar autor da página", + "Display the page creator's name on public pages.": "Exiba o nome do criador da página nas páginas públicas.", + "Toggle show page author": "Alternar exibição do autor da página", + "Show last updated": "Mostrar última atualização", + "Display when each page was last updated.": "Exiba quando cada página foi atualizada pela última vez.", + "Toggle show last updated": "Alternar exibição da última atualização", + "Open public page": "Abrir página pública", + "Toggle color scheme": "Alternar esquema de cores", + "Ember": "Brasa", + "Rose": "Rosa", + "Documentation": "Documentação", + "All published spaces.": "Todos os espaços publicados.", + "No public spaces yet.": "Ainda não há espaços públicos.", + "Show public directory": "Mostrar diretório público", + "List published spaces at /docs for anyone to browse.": "Liste os espaços publicados em /docs para que qualquer pessoa possa navegar.", + "Toggle show public directory": "Alternar exibição do diretório público", + "Show in public directory": "Mostrar no diretório público", + "List this space in the public directory at /docs.": "Liste este espaço no diretório público em /docs.", + "Toggle show in public directory": "Alternar exibição no diretório público", + "Open public space link": "Abrir link público do espaço", + "Disable public spaces": "Desativar espaços públicos", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Os administradores de espaços poderão tornar seus espaços publicamente legíveis para qualquer pessoa na internet. Tem certeza?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Isso removerá imediatamente a publicação de todos os espaços publicados. Reativar mais tarde não os publicará novamente. Tem certeza?", + "Allow": "Permitir", + "Shared pages": "Páginas compartilhadas", + "Published spaces": "Espaços publicados", + "Spaces published to the web will appear here": "Os espaços publicados na web aparecerão aqui", + "No published spaces": "Nenhum espaço publicado", + "Published by": "Publicado por", + "Published at": "Publicado em", + "Open space": "Abrir espaço", + "Unpublish": "Despublicar", + "Unpublish space": "Despublicar espaço", + "This space will no longer be publicly accessible. Are you sure?": "Este espaço não ficará mais acessível publicamente. Tem certeza?", + "More options for {{name}}": "Mais opções para {{name}}", + "Edit page": "Editar página", + "Sign in": "Entrar", + "Open app": "Abrir aplicativo", + "No spaces match your search.": "Nenhum espaço corresponde à sua busca.", + "Welcome to our documentation": "Boas-vindas à nossa documentação", + "Guides, references and answers across all our published spaces.": "Guias, referências e respostas em todos os nossos espaços publicados.", + "Guides, references and answers across all our spaces.": "Guias, referências e respostas em todos os nossos espaços.", + "Search documentation...": "Pesquisar na documentação...", + "1 published space": "1 espaço publicado", + "{{count}} published spaces": "{{count}} espaços publicados", + "Actions": "Ações", + "Add destination": "Adicionar destino", + "Are you sure you want to delete the destination": "Tem certeza de que deseja excluir o destino", + "Audit logs": "Logs de auditoria", + "Audit logs & SIEM": "Logs de auditoria e SIEM", + "Auth header name": "Nome do cabeçalho de autenticação", + "Auth header prefix": "Prefixo do cabeçalho de autenticação", + "Body format": "Formato do corpo", + "Created SIEM destination": "Destino SIEM criado", + "Datadog site": "Site do Datadog", + "Defaults to this instance's hostname": "O padrão é o nome do host desta instância", + "Delete destination": "Excluir destino", + "Deleted SIEM destination": "Destino SIEM excluído", + "Destination created": "Destino criado", + "Destination deleted": "Destino excluído", + "Destination updated": "Destino atualizado", + "Disabled": "Desativado", + "Edit destination": "Editar destino", + "Endpoint URL": "URL do endpoint", + "Failing": "Com falha", + "Failing since {{time}}": "Com falha desde {{time}}", + "HEC token": "Token HEC", + "HEC URL": "URL do HEC", + "Healthy": "Saudável", + "Hide advanced options": "Ocultar opções avançadas", + "Host": "Host", + "Index": "Índice", + "Insecure: connections can be intercepted.": "Inseguro: as conexões podem ser interceptadas.", + "JSON array": "Matriz JSON", + "Last delivered": "Última entrega", + "Last error": "Último erro", + "Leave empty to use the token's default index": "Deixe em branco para usar o índice padrão do token", + "Maximum of {{limit}} destinations reached": "Número máximo de {{limit}} destinos atingido", + "Could not load SIEM destinations: {{message}}": "Não foi possível carregar os destinos SIEM: {{message}}", + "No destinations yet": "Ainda não há destinos", + "Preset": "Predefinição", + "Retry now": "Tentar novamente agora", + "Retry scheduled": "Nova tentativa agendada", + "Send test event": "Enviar evento de teste", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Enviado no cabeçalho de autenticação abaixo. Deixe em branco se o seu receptor não precisar de um.", + "Service": "Serviço", + "Show advanced options": "Mostrar opções avançadas", + "SIEM": "SIEM", + "SIEM streaming": "Streaming de SIEM", + "SIEM streaming requires an Enterprise license.": "O streaming de SIEM requer uma licença Enterprise.", + "Source": "Fonte", + "Sourcetype": "Tipo de fonte", + "Tags": "Tags", + "Test connection": "Testar conexão", + "Test event delivered successfully.": "Evento de teste entregue com sucesso.", + "Test the connection before saving.": "Teste a conexão antes de salvar.", + "Test event delivered to {{name}}": "Evento de teste entregue para {{name}}", + "Updated SIEM destination": "Destino SIEM atualizado", + "Verify TLS certificate": "Verificar certificado TLS", + "e.g. Splunk prod": "ex.: Splunk produção" +} diff --git a/apps/client/public/locales/ru-RU/translation.json b/apps/client/public/locales/ru-RU/translation.json new file mode 100644 index 0000000..4d3996d --- /dev/null +++ b/apps/client/public/locales/ru-RU/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Аккаунт", + "Active": "Активный", + "Add": "Добавить", + "Add group members": "Добавить участников группы", + "Add groups": "Добавить группы", + "Add members": "Добавить участников", + "Add to groups": "Добавить в группы", + "Add space members": "Добавить участников пространства", + "Add to favorites": "Добавить в избранное", + "Admin": "Администратор", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Вы уверены, что хотите удалить эту группу? Участники потеряют доступ к материалам, к которым у этой группы есть доступ.", + "Are you sure you want to delete this page?": "Вы уверены, что хотите удалить эту страницу?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Вы уверены, что хотите удалить этого пользователя из группы? Пользователь потеряет доступ к материалам, к которым есть доступ у этой группы.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Вы уверены, что хотите удалить этого пользователя из пространства? Пользователь потеряет весь доступ к этому пространству.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Вы уверены, что хотите восстановить эту версию? Все не зафиксированные изменения будут потеряны.", + "Can become members of groups and spaces in workspace": "Могут становиться участниками групп и пространств в рабочей области", + "Can create and edit pages in space.": "Может создавать и редактировать страницы в пространстве.", + "Can edit": "Может изменять", + "Can manage workspace": "Может управлять рабочей областью", + "Can manage workspace but cannot delete it": "Может управлять рабочей областью, но не может ее удалить", + "Can view": "Может просматривать", + "Can view pages in space but not edit.": "Может просматривать страницы в пространстве, но не может их редактировать.", + "Cancel": "Отменить", + "Change email": "Изменить электронную почту", + "Change password": "Изменить пароль", + "Change photo": "Изменить фото", + "Choose a role": "Выберите роль", + "Choose your preferred color scheme.": "Выберите предпочитаемую цветовую схему.", + "Choose your preferred interface language.": "Выберите предпочитаемый язык интерфейса.", + "Choose your preferred page width.": "Выберите предпочитаемую ширину страницы.", + "Confirm": "Подтвердить", + "Copy as Markdown": "Копировать как Markdown", + "Copy link": "Копировать ссылку", + "Create": "Создать", + "Create group": "Создать группу", + "Create page": "Создать страницу", + "Create space": "Создать пространство", + "Create workspace": "Создать рабочую область", + "Current password": "Текущий пароль", + "Dark": "Темная", + "Date": "Дата", + "Delete": "Удалить", + "Remove from page": "Удалить со страницы", + "Base options": "Параметры базы", + "Delete group": "Удалить группу", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Вы уверены, что хотите удалить эту страницу? Это удалит её дочерние страницы, а также историю страницы. Это действие необратимо.", + "Description": "Описание", + "Details": "Подробности", + "e.g ACME": "например, ACME", + "e.g ACME Inc": "например, ACME Inc", + "e.g Developers": "например, Developers", + "e.g Group for developers": "например, Группа для разработчиков", + "e.g product": "например, product", + "e.g Product Team": "например, Команда продукта", + "e.g Sales": "например, Sales", + "e.g Space for product team": "например, Пространство для команды продукта", + "e.g Space for sales team to collaborate": "например, Пространство для совместной работы команды продаж", + "Edit": "Редактировать", + "Read": "Чтение", + "Edit group": "Редактировать группу", + "Email": "Электронная почта", + "Enter a strong password": "Введите надёжный пароль", + "Enter valid email addresses separated by comma or space max_50": "Введите действительные адреса электронной почты, разделенные запятой или пробелом [макс: 50]", + "enter valid emails addresses": "введите корректные адреса электронной почты", + "Enter your current password": "Введите ваш текущий пароль", + "enter your full name": "введите ваше полное имя", + "Enter your new password": "Введите ваш новый пароль", + "Enter your new preferred email": "Введите ваш новый предпочтительный адрес электронной почты", + "Enter your password": "Введите ваш пароль", + "Error fetching page data.": "Ошибка при загрузке данных страницы.", + "Error loading page history.": "Ошибка при загрузке истории страницы.", + "Export": "Экспорт", + "Failed to create page": "Не удалось создать страницу", + "Failed to delete page": "Не удалось удалить страницу", + "Failed to restore page": "Не удалось восстановить страницу", + "Failed to fetch recent pages": "Не удалось получить недавние страницы", + "Failed to import pages": "Не удалось импортировать страницы", + "Failed to load page. An error occurred.": "Не удалось загрузить страницу. Произошла ошибка.", + "Failed to update data": "Не удалось обновить данные", + "Failed to create base": "Не удалось создать базу", + "Failed to update base": "Не удалось обновить базу", + "Failed to delete base": "Не удалось удалить базу", + "Failed to create property": "Не удалось создать свойство", + "Failed to update property": "Не удалось обновить свойство", + "Failed to delete property": "Не удалось удалить свойство", + "Failed to reorder property": "Не удалось изменить порядок свойств", + "Failed to create view": "Не удалось создать представление", + "Failed to update view": "Не удалось обновить представление", + "Failed to delete view": "Не удалось удалить представление", + "Failed to create row": "Не удалось создать строку", + "Failed to update row": "Не удалось обновить строку", + "Failed to delete row": "Не удалось удалить строку", + "Failed to delete rows": "Не удалось удалить строки", + "Failed to reorder row": "Не удалось изменить порядок строки", + "Failed to move card": "Не удалось переместить карточку", + "Failed to add card": "Не удалось добавить карточку", + "Failed to export CSV": "Не удалось экспортировать CSV", + "Favorite spaces": "Избранные пространства", + "Favorite spaces appear here": "Здесь отображаются избранные пространства", + "Favorites": "Избранное", + "Full access": "Полный доступ", + "Full page width": "Ширина на всю страницу", + "Full width": "Во всю ширину", + "General": "Основные", + "Group": "Группа", + "Group description": "Описание группы", + "Group name": "Название группы", + "Groups": "Группы", + "Has full access to space settings and pages.": "Имеет полный доступ к настройкам пространства и страницам.", + "Home": "Главная", + "Import pages": "Импорт страниц", + "Import pages & space settings": "Импорт страниц и настройки пространства", + "Importing pages": "Импортирование страниц", + "invalid invitation link": "недействительная ссылка-приглашение", + "Invitation signup": "Регистрация по приглашению", + "Invite by email": "Пригласить по электронной почте", + "Invite members": "Пригласить участников", + "Invite new members": "Пригласить новых участников", + "Invite People": "Пригласить людей", + "Invited members who are yet to accept their invitation will appear here.": "Приглашённые участники, которые ещё не приняли приглашение, появятся здесь.", + "Invited members will be granted access to spaces the groups can access": "Приглашённые участники получат доступ к пространствам, доступ к которым есть у группы", + "Join the workspace": "Присоединиться к рабочей области", + "Language": "Язык", + "Light": "Светлая", + "Link copied": "Ссылка скопирована", + "Login": "Войти", + "Logout": "Выйти", + "Manage Group": "Управление группой", + "Manage members": "Управление участниками", + "member": "участник", + "Member": "Участник", + "members": "участники", + "Members": "Участники", + "My preferences": "Мои настройки", + "My Profile": "Мой Профиль", + "My profile": "Мой профиль", + "Name": "Имя", + "New email": "Новый электронный адрес", + "New page": "Новая страница", + "New password": "Новый пароль", + "No group found": "Группа не найдена", + "No page history saved yet.": "История страниц ещё не сохранена.", + "No pages yet": "Страниц пока нет", + "No shared pages": "Нет общих страниц", + "No results found...": "Результаты не найдены...", + "No user found": "Пользователь не найден", + "Overview": "Обзор", + "Owner": "Владелец", + "page": "страница", + "Page deleted successfully": "Страница успешно удалена", + "Page history": "История страницы", + "Select version": "Выбрать версию", + "Highlight changes": "Выделить изменения", + "Page import is in progress. Please do not close this tab.": "Импорт страницы в процессе. Пожалуйста, не закрывайте эту вкладку.", + "Pages": "Страницы", + "pages": "страницы", + "Password": "Пароль", + "Password changed successfully": "Пароль успешно изменён", + "People": "Люди", + "Pending": "В ожидании", + "Please confirm your action": "Пожалуйста, подтвердите ваше действие", + "Preferences": "Настройки", + "Print PDF": "Печать PDF", + "Profile": "Профиль", + "Recently updated": "Обновлено недавно", + "Remove": "Удалить", + "Remove from favorites": "Удалить из избранного", + "Remove group member": "Удалить участника группы", + "Remove space member": "Удалить участника пространства", + "Restore": "Восстановить", + "Role": "Роль", + "Save": "Сохранить", + "Search": "Поиск", + "Search for groups": "Поиск групп", + "Search for users": "Поиск пользователей", + "Search for users and groups": "Поиск пользователей и групп", + "Search...": "Поиск...", + "Select language": "Выберите язык", + "Select role": "Выберите роль", + "Select role to assign to all invited members": "Выберите роль, которую нужно назначить всем приглашённым участникам", + "Select theme": "Выберите тему", + "Send invitation": "Отправить приглашение", + "Invitation sent": "Приглашение отправлено", + "Settings": "Настройки", + "Setup workspace": "Настроить рабочее пространство", + "Sign In": "Войти", + "Sign Up": "Зарегистрироваться", + "Slug": "Слаг", + "Space": "Пространство", + "Space description": "Описание пространства", + "Space menu": "Меню пространства", + "Space name": "Название пространства", + "Space settings": "Настройки пространства", + "Space slug": "Слаг пространства", + "Spaces": "Пространства", + "Spaces you belong to": "Пространства, в которых вы состоите", + "No space found": "Пространство не найдено", + "Search for spaces": "Поиск пространств", + "Start typing to search...": "Начните вводить для поиска...", + "Status": "Статус", + "Successfully imported": "Успешно импортировано", + "Successfully restored": "Успешно восстановлено", + "System settings": "Системные настройки", + "Templates": "Шаблоны", + "Theme": "Тема", + "To change your email, you have to enter your password and new email.": "Чтобы изменить электронную почту, вам нужно ввести пароль и новый адрес.", + "Toggle full page width": "Переключить полную ширину страницы", + "Unable to import pages. Please try again.": "Не удалось импортировать страницы. Пожалуйста, попробуйте ещё раз.", + "untitled": "без названия", + "Untitled": "Без названия", + "Updated successfully": "Успешно обновлено", + "User": "Пользователь", + "Workspace": "Рабочее пространство", + "Workspace Name": "Название рабочего пространства", + "Workspace settings": "Настройки рабочего пространства", + "You can change your password here.": "Вы можете изменить свой пароль здесь.", + "Your Email": "Ваш адрес электронной почты", + "Your import is complete.": "Ваш импорт завершен.", + "Your name": "Ваше имя", + "Your Name": "Ваше имя", + "Your password": "Ваш пароль", + "Your password must be a minimum of 8 characters.": "Ваш пароль должен содержать минимум 8 символов.", + "Sidebar toggle": "Переключатель боковой панели", + "Comments": "Комментарии", + "404 page not found": "404 страница не найдена", + "Sorry, we can't find the page you are looking for.": "К сожалению, мы не можем найти страницу, которую вы ищете.", + "Take me back to homepage": "Вернуться на главную страницу", + "Forgot password": "Забыли пароль", + "Forgot your password?": "Забыли пароль?", + "A password reset link has been sent to your email. Please check your inbox.": "Ссылка для сброса пароля была отправлена на ваш электронный адрес. Пожалуйста, проверьте входящие сообщения.", + "Send reset link": "Отправить ссылку для сброса", + "Password reset": "Сброс пароля", + "Your new password": "Ваш новый пароль", + "Set password": "Установить пароль", + "Write a comment": "Написать комментарий", + "Reply...": "Ответить...", + "Error loading comments.": "Ошибка при загрузке комментариев.", + "No comments yet.": "Комментариев пока нет.", + "No open comments.": "Нет открытых комментариев.", + "No resolved comments.": "Нет решённых комментариев.", + "Add a comment...": "Добавить комментарий...", + "Edit comment": "Редактировать комментарий", + "Delete comment": "Удалить комментарий", + "Are you sure you want to delete this comment?": "Вы уверены, что хотите удалить этот комментарий?", + "Delete chat": "Удалить чат", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Вы уверены, что хотите удалить '{{title}}'? Это действие нельзя отменить.", + "Comment created successfully": "Комментарий успешно создан", + "Error creating comment": "Ошибка при создании комментария", + "Comment updated successfully": "Комментарий успешно обновлён", + "Failed to update comment": "Не удалось обновить комментарий", + "Comment deleted successfully": "Комментарий успешно удалён", + "Failed to delete comment": "Не удалось удалить комментарий", + "Comment resolved successfully": "Комментарий успешно разрешён", + "Comment re-opened successfully": "Комментарий успешно открыт повторно", + "Comment unresolved successfully": "Комментарий успешно переведён в нерешённые", + "Failed to resolve comment": "Не удалось разрешить комментарий", + "Resolve comment": "Решить комментарий", + "Unresolve comment": "Снять статус решённого с комментария", + "Resolve Comment Thread": "Решить ветку комментариев", + "Unresolve Comment Thread": "Снять статус решённой с ветки комментариев", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Вы уверены, что хотите закрыть эту цепочку комментариев? Это пометит её как завершённую.", + "Are you sure you want to unresolve this comment thread?": "Вы уверены, что хотите отметить эту цепочку комментариев как нерешённую?", + "Resolved": "Решено", + "No active comments.": "Нет активных комментариев.", + "Revoke invitation": "Отозвать приглашение", + "Revoke": "Отозвать", + "Don't": "Нет", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Вы уверены, что хотите отозвать это приглашение? Пользователь не сможет присоединиться к рабочей области.", + "Resend invitation": "Отправить приглашение повторно", + "Anyone with this link can join this workspace.": "Любой, у кого есть данная ссылка, может присоединиться к этой рабочей области.", + "Invite link": "Ссылка для приглашения", + "Copy": "Копировать", + "Copy to space": "Копировать в пространство", + "Copied": "Скопировано", + "Duplicate": "Дублировать", + "Select a user": "Выберите пользователя", + "Select a group": "Выберите группу", + "Export all pages and attachments in this space.": "Экспортировать все страницы и вложения в этом пространстве.", + "Delete space": "Удалить пространство", + "Are you sure you want to delete this space?": "Вы уверены, что хотите удалить это пространство?", + "Delete this space with all its pages and data.": "Удалить это пространство со всеми его страницами и данными.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Все страницы, комментарии, вложения и разрешения в этом пространстве будут удалены безвозвратно.", + "Confirm space name": "Подтвердите название пространства", + "Type the space name {{spaceName}} to confirm your action.": "Введите название пространства {{spaceName}}, чтобы подтвердить ваше действие.", + "Format": "Формат", + "Include subpages": "Включить вложенные страницы", + "Include attachments": "Включить вложения", + "Select export format": "Выберите формат экспорта", + "Export failed:": "Экспортирование не удалось:", + "export error": "ошибка экспорта", + "Export page": "Экспорт страницы", + "Export successful": "Экспорт выполнен успешно", + "Export space": "Экспорт пространства", + "Export {{type}}": "Экспорт {{type}}", + "File exceeds the {{limit}} attachment limit": "Файл превышает лимит вложений {{limit}}", + "Media": "Медиа", + "Align left": "По левому краю", + "Align right": "По правому краю", + "Align center": "По центру", + "Alt text": "Альтернативный текст", + "Describe this for accessibility.": "Опишите это для специальных возможностей.", + "Add a description": "Добавить описание", + "Justify": "По ширине", + "Merge cells": "Объединить ячейки", + "Split cell": "Разделить ячейку", + "Delete column": "Удалить столбец", + "Delete row": "Удалить строку", + "Add left column": "Добавить столбец слева", + "Add right column": "Добавить столбец справа", + "Add row above": "Добавить строку выше", + "Add row below": "Добавить строку ниже", + "Delete table": "Удалить таблицу", + "Add column left": "Добавить столбец слева", + "Add column right": "Добавить столбец справа", + "Clear cell": "Очистить ячейку", + "Clear cells": "Очистить ячейки", + "Toggle header cell": "Переключить ячейку заголовка", + "Toggle header column": "Переключить столбец заголовка", + "Toggle header row": "Переключить строку заголовка", + "Move column left": "Переместить столбец влево", + "Move column right": "Переместить столбец вправо", + "Move row down": "Переместить строку вниз", + "Move row up": "Переместить строку вверх", + "Sort A → Z": "Сортировать A → Я", + "Sort Z → A": "Сортировать Я → A", + "Info": "Информация", + "Note": "Примечание", + "Success": "Успешно", + "Warning": "Предупреждение", + "Danger": "Важно", + "Mermaid diagram error:": "Ошибка диаграммы Mermaid:", + "Invalid Mermaid diagram": "Недопустимая диаграмма Mermaid", + "Double-click to edit Draw.io diagram": "Кликните дважды для редактирования диаграммы Draw.io", + "Exit": "Выйти", + "Save & Exit": "Сохранить и выйти", + "Double-click to edit Excalidraw diagram": "Кликните дважды для редактирования диаграммы Excalidraw", + "Paste link": "Вставить ссылку", + "Paste link or search pages": "Вставьте ссылку или найдите страницы", + "Link to web page": "Ссылка на веб-страницу", + "Recents": "Недавние", + "Page or URL": "Страница или URL", + "Link title": "Заголовок ссылки", + "Edit link": "Редактировать ссылку", + "Remove link": "Удалить ссылку", + "Add link": "Добавить ссылку", + "Please enter a valid url": "Пожалуйста, введите корректный url", + "Empty equation": "Пустое выражение", + "Invalid equation": "Недопустимое уравнение", + "Color": "Цвет", + "Text color": "Цвет текста", + "Default": "По умолчанию", + "Blue": "Синий", + "Green": "Зелёный", + "Purple": "Фиолетовый", + "Red": "Красный", + "Yellow": "Жёлтый", + "Orange": "Оранжевый", + "Pink": "Розовый", + "Gray": "Серый", + "Embed link": "Встроенная ссылка", + "Invalid {{provider}} embed link": "Недействительная ссылка для встраивания {{provider}}", + "Embed {{provider}}": "Встроить {{provider}}", + "Enter {{provider}} link to embed": "Введите ссылку для встраивания {{provider}}", + "Bold": "Жирный", + "Italic": "Курсив", + "Underline": "Подчёркнутый", + "Strike": "Перечёркнутый", + "Code": "Код", + "Comment": "Комментарий", + "Text": "Текст", + "Heading 1": "Заголовок 1", + "Heading 2": "Заголовок 2", + "Heading 3": "Заголовок 3", + "To-do List": "Список дел", + "Bullet List": "Маркированный список", + "Numbered List": "Нумерованный список", + "Blockquote": "Блок цитирования", + "Just start typing with plain text.": "Просто начните печатать обычный текст.", + "Track tasks with a to-do list.": "Отследить задачи с помощью списка дел.", + "Big section heading.": "Большой заголовок раздела.", + "Medium section heading.": "Средний заголовок раздела.", + "Small section heading.": "Маленький заголовок раздела.", + "Create a simple bullet list.": "Создать простой маркированный список.", + "Create a list with numbering.": "Создать нумерованный список.", + "Create block quote.": "Создать блок цитирования.", + "Insert code snippet.": "Вставить фрагмент кода.", + "Insert horizontal rule divider": "Вставить горизонтальный разделитель", + "Page break": "Разрыв страницы", + "Insert a page break for printing.": "Вставить разрыв страницы для печати.", + "Footnote": "Сноска", + "Insert a footnote reference.": "Вставить ссылку на сноску.", + "Upload any image from your device.": "Загрузить любое изображение с вашего устройства.", + "Upload any video from your device.": "Загрузить любое видео с вашего устройства.", + "Upload any audio from your device.": "Загрузите любой аудиофайл с вашего устройства.", + "Upload any file from your device.": "Загрузить любой файл с вашего устройства.", + "Uploading {{name}}": "Загрузка {{name}}", + "Uploading file": "Загрузка файла", + "Table": "Таблица", + "Insert a table.": "Вставить таблицу.", + "Insert collapsible block.": "Вставить сворачиваемый блок.", + "Video": "Видео", + "Divider": "Разделитель", + "Quote": "Цитата", + "Image": "Изображение", + "Audio": "Аудио", + "Embed PDF": "Встроить PDF", + "Upload and embed a PDF file.": "Загрузите и встроите PDF-файл.", + "Embed as PDF": "Встроить как PDF", + "Failed to load PDF": "Не удалось загрузить PDF", + "Convert to attachment": "Преобразовать в вложение", + "File attachment": "Вложение файла", + "Toggle block": "Сворачиваемый блок", + "Callout": "Выноска", + "Insert callout notice.": "Вставить выноску с сообщением.", + "Math inline": "Строчная формула", + "Insert inline math equation.": "Вставить математическое выражение в строку.", + "Math block": "Блок формулы", + "Insert math equation": "Вставить математическую формулу", + "Mermaid diagram": "Диаграмма Mermaid", + "Insert mermaid diagram": "Вставить диаграмму Mermaid", + "Insert and design Drawio diagrams": "Вставляйте и редактируйте диаграммы Drawio", + "Insert current date": "Вставить текущую дату", + "Time": "Время", + "Insert current time": "Вставить текущее время", + "Draw and sketch excalidraw diagrams": "Рисуйте и создавайте диаграммы Excalidraw", + "Multiple": "Несколько", + "Turn into": "Преобразовать в", + "Text align": "Выравнивание текста", + "This page may have been deleted, moved, or you may not have access.": "Эта страница могла быть удалена, перемещена, или у вас может отсутствовать доступ к ней.", + "Go to homepage": "Вернуться на главную", + "Pages you create will show up here.": "Созданные вами страницы появятся здесь.", + "Heading {{level}}": "Заголовок {{level}}", + "Toggle title": "Заголовок сворачиваемого блока", + "Write anything. Enter \"/\" for commands": "Пишите что угодно. Введите \"/\" для команд", + "Write...": "Напишите...", + "Column count": "Количество столбцов", + "{{count}} Columns": "{count, plural, one{# столбец} few{# столбца} many{# столбцов} other{# столбца}}", + "{{count}} command available_one": "Доступна 1 команда", + "{{count}} command available_other": "Доступно {{count}} команд", + "{{count}} result available_one": "Доступен 1 результат", + "{{count}} result available_other": "Доступно {{count}} результатов", + "Equal columns": "Равные столбцы", + "Left sidebar": "Левая боковая панель", + "Right sidebar": "Правая боковая панель", + "Wide center": "Широкий по центру", + "Left wide": "Широкий слева", + "Right wide": "Широкий справа", + "Names do not match": "Названия не совпадают", + "Today, {{time}}": "Сегодня, {{time}}", + "Yesterday, {{time}}": "Вчера, {{time}}", + "now": "сейчас", + "Space created successfully": "Пространство успешно создано", + "Space updated successfully": "Пространство успешно обновлено", + "Space deleted successfully": "Пространство успешно удалено", + "Members added successfully": "Участники успешно добавлены", + "Member removed successfully": "Участник успешно удалён", + "Member role updated successfully": "Роль участника успешно обновлена", + "Created by: {{creatorName}}": "Создано: {{creatorName}}", + "Created at: {{time}}": "Создано: {{time}}", + "Edited by {{name}} {{time}}": "Изменено: {{name}} {{time}}", + "Word count: {{wordCount}}": "Количество слов: {{wordCount}}", + "Character count: {{characterCount}}": "Количество символов: {{characterCount}}", + "New update": "Новое обновление", + "{{latestVersion}} is available": "Доступна версия {{latestVersion}}", + "Default page edit mode": "Режим редактирования страницы по умолчанию", + "Choose your preferred page edit mode. Avoid accidental edits.": "Выберите предпочитаемый режим редактирования страницы. Избегайте случайных изменений.", + "Choose {{format}} file": "Выберите файл {{format}}", + "Reading": "Чтение", + "Delete member": "Удалить участника", + "Member deleted successfully": "Участник успешно удалён", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Вы уверены, что хотите удалить этого участника рабочей области? Это действие необратимо.", + "Deactivate member": "Деактивировать участника", + "Activate member": "Активировать участника", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Вы уверены, что хотите деактивировать этого участника рабочего пространства? Они больше не смогут получить доступ к этому рабочему пространству.", + "Are you sure you want to activate this workspace member?": "Вы уверены, что хотите активировать этого участника рабочего пространства?", + "Deactivate": "Деактивировать", + "Activate": "Активировать", + "Deactivated": "Деактивирован", + "Move": "Переместить", + "Move page": "Переместить страницу", + "Move page to a different space.": "Переместите страницу в другое пространство.", + "Real-time editor connection lost. Retrying...": "Соединение с редактором в реальном времени потеряно. Повторная попытка...", + "Table of contents": "Оглавление", + "Add headings (H1, H2, H3) to generate a table of contents.": "Добавьте заголовки (H1, H2, H3), чтобы создать оглавление.", + "Share": "Поделиться", + "Public sharing": "Публичный доступ", + "Shared by": "Поделился", + "Shared at": "Дата публикации", + "Inherits public sharing from": "Наследует публичный доступ от", + "Share to web": "Опубликовать в интернете", + "Shared to web": "Опубликовано в интернете", + "Anyone with the link can view this page": "Любой, у кого есть ссылка, может просматривать эту страницу", + "Make this page publicly accessible": "Сделать эту страницу общедоступной", + "Include sub-pages": "Включить подстраницы", + "Make sub-pages public too": "Сделать подстраницы тоже общедоступными", + "Allow search engines to index page": "Разрешить поисковым системам индексировать страницу", + "Open page": "Открыть страницу", + "Page": "Страница", + "Delete public share link": "Удалить публичную ссылку", + "Delete share": "Удалить общий доступ", + "Are you sure you want to delete this shared link?": "Вы уверены, что хотите удалить эту ссылку общего доступа?", + "Publicly shared pages from spaces you are a member of will appear here": "Здесь будут отображаться публично опубликованные страницы из пространств, участником которых вы являетесь", + "Share deleted successfully": "Общий доступ успешно удалён", + "Share not found": "Общий доступ не найден", + "Failed to share page": "Не удалось предоставить доступ к странице", + "Disable public sharing": "Отключить общий доступ", + "Prevent members from sharing pages publicly.": "Запретить участникам делиться страницами публично.", + "Toggle public sharing": "Переключить общий доступ", + "Toggle space public sharing": "Переключить общий доступ для пространства", + "Allow viewers to comment": "Разрешить зрителям комментировать", + "Allow viewers to add comments on pages in this space.": "Разрешить зрителям добавлять комментарии на страницах в этом пространстве.", + "Toggle viewer comments": "Переключить комментарии зрителей", + "Public sharing is disabled at the workspace level": "Общий доступ отключен на уровне рабочего пространства", + "Prevent pages in this space from being shared publicly.": "Запретить делиться страницами в этом пространстве публично.", + "Page permissions": "Права доступа к странице},{", + "Control who can view and edit individual pages. Available with an enterprise license.": "Контролируйте, кто может просматривать и редактировать отдельные страницы. Доступно при наличии лицензии Enterprise.", + "Enable public sharing": "Включить общий доступ", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Вы уверены, что хотите включить общий доступ? Участники смогут делиться страницами публично.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Вы уверены, что хотите отключить общий доступ? Все существующие ссылки в этом рабочем пространстве будут удалены.", + "Are you sure you want to enable public sharing for this space?": "Вы уверены, что хотите включить общий доступ для этого пространства?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Вы уверены, что хотите отключить общий доступ? Все существующие ссылки в этом пространстве будут удалены.", + "Public sharing is disabled": "Общий доступ отключен", + "Public sharing has been disabled at the workspace level.": "Общий доступ был отключен на уровне рабочего пространства.", + "Public sharing has been disabled for this space.": "Общий доступ был отключен для этого пространства.", + "Copy page": "Копировать страницу", + "Copy page to a different space.": "Копировать страницу в другое пространство.", + "Page copied successfully": "Страница успешно скопирована", + "Page duplicated successfully": "Страница успешно дублирована", + "Find": "Найти", + "Not found": "Не найдено", + "Previous Match (Shift+Enter)": "Предыдущее совпадение (Shift+Enter)", + "Next match (Enter)": "Следующее совпадение (Enter)", + "Match case (Alt+C)": "Учитывать регистр (Alt+C)", + "Replace": "Заменить", + "Close (Escape)": "Закрыть (Escape)", + "Replace (Enter)": "Заменить (Enter)", + "Replace all (Ctrl+Alt+Enter)": "Заменить все (Ctrl+Alt+Enter)", + "Replace all": "Заменить все", + "View all": "Просмотреть все", + "View all spaces": "Просмотреть все пространства", + "Error": "Ошибка", + "Failed to disable MFA": "Не удалось отключить MFA", + "Disable two-factor authentication": "Отключить двухфакторную аутентификацию", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Отключение двухфакторной аутентификации сделает вашу учетную запись менее безопасной. Для входа потребуется только пароль.", + "Please enter your password to disable two-factor authentication:": "Пожалуйста, введите ваш пароль, чтобы отключить двухфакторную аутентификацию:", + "Two-factor authentication has been enabled": "Двухфакторная аутентификация включена", + "Two-factor authentication has been disabled": "Двухфакторная аутентификация отключена", + "2-step verification": "Двухэтапная проверка", + "Protect your account with an additional verification layer when signing in.": "Защитите свою учетную запись дополнительным уровнем проверки при входе.", + "Two-factor authentication is active on your account.": "Двухфакторная аутентификация активна на вашей учетной записи.", + "Add 2FA method": "Добавить метод 2FA", + "Backup codes": "Резервные коды", + "Disable": "Отключить", + "Invalid verification code": "Недействительный код подтверждения", + "New backup codes have been generated": "Новые резервные коды сгенерированы", + "Failed to regenerate backup codes": "Не удалось заново сгенерировать резервные коды", + "About backup codes": "О резервных кодах", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Резервные коды можно использовать для доступа к вашей учетной записи, если вы потеряли доступ к приложению-аутентификатору. Каждый код можно использовать только один раз.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "Вы можете создать новые резервные коды в любое время. Это аннулирует все существующие коды.", + "Confirm password": "Подтвердите пароль", + "Generate new backup codes": "Сгенерировать новые резервные коды", + "Save your new backup codes": "Сохраните ваши новые резервные коды", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Убедитесь, что сохранили эти коды в безопасном месте. Ваши старые резервные коды больше недействительны.", + "Your new backup codes": "Ваши новые резервные коды", + "I've saved my backup codes": "Я сохранил резервные коды", + "Failed to setup MFA": "Не удалось настроить MFA", + "Setup & Verify": "Настроить и подтвердить", + "Add to authenticator": "Добавить в приложение-аутентификатор", + "1. Scan this QR code with your authenticator app": "1. Отсканируйте этот QR-код с помощью приложения-аутентификатора", + "Can't scan the code?": "Не удается сканировать код?", + "Enter this code manually in your authenticator app:": "Введите этот код вручную в приложении-аутентификаторе:", + "2. Enter the 6-digit code from your authenticator": "2. Введите 6-значный код из приложения-аутентификатора", + "Verify and enable": "Подтвердить и включить", + "Failed to generate QR code. Please try again.": "Не удалось создать QR-код. Пожалуйста, попробуйте снова.", + "Backup": "Резервный", + "Save codes": "Сохранить коды", + "Save your backup codes": "Сохраните резервные коды", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Эти коды можно использовать для доступа к вашей учетной записи, если вы потеряли доступ к приложению-аутентификатору. Каждый код можно использовать только один раз.", + "Print": "Печать", + "Two-factor authentication has been set up. Please log in again.": "Двухфакторная аутентификация настроена. Пожалуйста, войдите снова.", + "Two-Factor authentication required": "Требуется двухфакторная аутентификация", + "Your workspace requires two-factor authentication for all users": "Ваше рабочее пространство требует двухфакторную аутентификацию для всех пользователей", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Чтобы продолжать доступ к вашему рабочему пространству, вы должны настроить двухфакторную аутентификацию. Это добавляет дополнительный уровень безопасности к вашей учетной записи.", + "Set up two-factor authentication": "Настроить двухфакторную аутентификацию", + "Cancel and logout": "Отменить и выйти", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Ваше рабочее пространство требует двухфакторной аутентификации. Пожалуйста, настройте её, чтобы продолжить.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Это добавляет дополнительный уровень безопасности к вашей учетной записи, требуя код проверки из вашего приложения-аутентификатора.", + "Password is required": "Требуется пароль", + "Password must be at least 8 characters": "Пароль должен содержать не менее 8 символов", + "Please enter a 6-digit code": "Пожалуйста, введите 6-значный код", + "Code must be exactly 6 digits": "Код должен состоять ровно из 6 цифр", + "Enter the 6-digit code found in your authenticator app": "Введите 6-значный код из вашего приложения-аутентификатора", + "Need help authenticating?": "Нужна помощь с аутентификацией?", + "MFA QR Code": "QR-код MFA", + "Account created successfully. Please log in to set up two-factor authentication.": "Учетная запись успешно создана. Пожалуйста, войдите, чтобы настроить двухфакторную аутентификацию.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Сброс пароля выполнен успешно. Пожалуйста, войдите с вашим новым паролем и завершите настройку двухфакторной аутентификации.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Сброс пароля выполнен успешно. Пожалуйста, войдите с вашим новым паролем, чтобы настроить двухфакторную аутентификацию.", + "Password reset was successful. Please log in with your new password.": "Сброс пароля выполнен успешно. Пожалуйста, войдите с вашим новым паролем.", + "Two-factor authentication": "Двухфакторная аутентификация", + "Use authenticator app instead": "Использовать приложение-аутентификатор вместо этого", + "Verify backup code": "Подтвердить резервный код", + "Use backup code": "Использовать резервный код", + "Enter one of your backup codes": "Введите один из ваших резервных кодов", + "Backup code": "Резервный код", + "Enter one of your backup codes. Each backup code can only be used once.": "Введите один из ваших резервных кодов. Каждый резервный код можно использовать только один раз.", + "Verify": "Подтвердить", + "Trash": "Корзина", + "Pages in trash will be permanently deleted after {{count}} days.": "{count, plural, one {Страница в корзине будет окончательно удалена через # день.} few {Страницы в корзине будут окончательно удалены через # дня.} many {Страницы в корзине будут окончательно удалены через # дней.} other {Страницы в корзине будут окончательно удалены через # дней.}}", + "Deleted": "Удалено", + "No pages in trash": "В корзине нет страниц", + "Permanently delete page?": "Удалить страницу окончательно?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Вы уверены, что хотите окончательно удалить '{{title}}'? Это действие невозможно отменить.", + "Restore '{{title}}' and its sub-pages?": "Восстановить '{{title}}' и её подстраницы?", + "Move to trash": "Переместить в корзину", + "Move this page to trash?": "Переместить эту страницу в корзину?", + "Restore page": "Восстановить страницу", + "Permanently delete": "Удалить навсегда", + "{{name}} moved this page to Trash {{time}}.": "{{name}} переместил(а) эту страницу в корзину {{time}}.", + "Page moved to trash": "Страница перемещена в корзину", + "Page restored successfully": "Страница успешно восстановлена", + "Deleted by": "Удалено пользователем", + "Deleted at": "Удалено", + "Preview": "Предпросмотр", + "Base preview unavailable": "Предпросмотр базы недоступен", + "Restore this base to view its contents.": "Восстановите эту базу, чтобы просмотреть её содержимое.", + "Subpages": "Подстраницы", + "Failed to load subpages": "Не удалось загрузить подстраницы", + "No subpages": "Нет подстраниц", + "Subpages (Child pages)": "Подстраницы (дочерние страницы)", + "List all subpages of the current page": "Показать все подстраницы текущей страницы", + "Attachments": "Вложения", + "All spaces": "Все пространства", + "Unknown": "Неизвестно", + "Find a space": "Найти пространство", + "Search in all your spaces": "Искать во всех ваших пространствах", + "Type": "Тип", + "Enterprise": "Корпоративный", + "Download attachment": "Скачать вложение", + "Allowed email domains": "Разрешённые домены электронной почты", + "Only users with email addresses from these domains can signup via SSO.": "Только пользователи с адресами электронной почты из этих доменов могут зарегистрироваться через SSO.", + "Enter valid domain names separated by comma or space": "Введите корректные доменные имена, разделённые запятой или пробелом", + "Enforce two-factor authentication": "Обязательная двухфакторная аутентификация", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "После введения обязательности все участники должны будут включить двухфакторную аутентификацию для доступа к рабочему пространству.", + "Toggle MFA enforcement": "Переключить обязательность MFA", + "Display name": "Отображаемое имя", + "Allow signup": "Разрешить регистрацию", + "Enabled": "Включено", + "Advanced Settings": "Расширенные настройки", + "Enable TLS/SSL": "Включить TLS/SSL", + "Use secure connection to LDAP server": "Использовать защищённое подключение к серверу LDAP", + "Group sync": "Синхронизация групп", + "No SSO providers found.": "Поставщики SSO не найдены.", + "Delete SSO provider": "Удалить провайдера SSO", + "Are you sure you want to delete this SSO provider?": "Вы уверены, что хотите удалить этого поставщика SSO?", + "Action": "Действие", + "{{ssoProviderType}} configuration": "Конфигурация {{ssoProviderType}}", + "Icon": "Иконка", + "Upload image": "Загрузить изображение", + "Remove image": "Удалить изображение", + "Failed to remove image": "Не удалось удалить изображение", + "Image exceeds 10MB limit.": "Изображение превышает предел 10MB.", + "Image removed successfully": "Изображение успешно удалено", + "API key": "API ключ", + "API keys": "API ключи", + "API management": "Управление API", + "Custom expiration date": "Пользовательская дата срока действия", + "Enter a descriptive token name": "Введите понятное имя токена", + "Expiration": "Срок действия", + "Expired": "Истек", + "Expires": "Истекает", + "Last use": "Последнее использование", + "No API keys found": "API ключи не найдены", + "No expiration": "Не истекает", + "Revoked successfully": "Отозван успешно", + "Select expiration date": "Выберете срок действия", + "This action cannot be undone. Any applications using this API key will stop working.": "Это действие необратимо. Любые приложения, использующие этот API ключ, перестанут работать.", + "Update": "Обновить", + "Update {{credential}}": "Обновить {{credential}}", + "Manage API keys for all users in the workspace": "Управлять API ключами для всех пользователей в рабочей области", + "Restrict API key creation to admins": "Ограничить создание API-ключей только администраторами.", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Только администраторы и владельцы могут создавать новые API-ключи. Существующие ключи участников продолжат работать.", + "Toggle restrict API keys to admins": "Переключить ограничение создания API-ключей только для администраторов", + "API key creation is restricted to admins by your workspace administrator.": "Создание API-ключей ограничено администраторами вашего рабочего пространства.", + "AI settings": "Настройки ИИ", + "AI search": "Поиск ИИ", + "AI Answer": "Ответ ИИ", + "Ask AI": "Спросить ИИ", + "AI is thinking...": "ИИ обрабатывает запрос...", + "Thinking": "Думаю", + "Ask a question...": "Задайте вопрос...", + "AI Answers": "Ответы ИИ", + "AI-powered search (AI Answers)": "Поиск на базе ИИ (Ответы ИИ)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "Поиск ИИ использует векторные встраивания для обеспечения семантического поиска по содержимому вашего рабочего пространства.", + "Toggle AI search": "Переключить поиск ИИ", + "Generative AI (Ask AI)": "Генеративный ИИ (Спросить ИИ)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Включите создание контента на базе ИИ в редакторе. Позволяет пользователям генерировать, улучшать, переводить и преобразовывать текст.", + "Toggle generative AI": "Переключить генеративный ИИ", + "Upgrade your plan": "Обновите свой тарифный план", + "Available with a paid license": "Доступно с платной лицензией", + "Upgrade your license tier.": "Обновите уровень вашей лицензии.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "ИИ доступен в платных версиях Docmost. Свяжитесь по адресу sales@docmost.com.", + "AI & MCP": "ИИ и MCP", + "AI": "ИИ", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Протокол контекста модели (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Включите сервер MCP, чтобы ИИ-ассистенты и инструменты могли взаимодействовать с содержимым вашего рабочего пространства.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP доступен только в корпоративной версии Docmost. Свяжитесь по адресу sales@docmost.com.", + "MCP Server URL": "URL сервера MCP", + "Connect AI assistants with your Docmost account via OAuth.": "Подключайте AI-помощников к вашей учетной записи Docmost через OAuth.", + "Enforce OAuth": "Сделать OAuth обязательным", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI-помощники должны подключаться к учетной записи Docmost через OAuth. Ключи API нельзя использовать с MCP-сервером.", + "Toggle enforce OAuth for MCP": "Переключить обязательное использование OAuth для MCP", + "Supported tools": "Поддерживаемые инструменты", + "MCP server URL:": "URL сервера MCP:", + "Learn more": "Подробнее", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Управляйте API-ключами для всех пользователей в рабочем пространстве. Смотрите документацию по API для получения информации об использовании.", + "View the API documentation for usage details.": "Смотрите документацию по API для получения информации об использовании.", + "View the MCP documentation.": "Смотрите документацию по MCP.", + "Sources": "Источники", + "AI Answers not available for attachments": "Ответы ИИ недоступны для вложений", + "No answer available": "Ответ недоступен", + "Background color": "Цвет фона", + "Highlight color": "Цвет выделения", + "Remove color": "Удалить цвет", + "Notifications": "Уведомления", + "No notifications": "Нет уведомлений", + "No unread notifications": "Нет непрочитанных уведомлений", + "All notifications": "Все уведомления", + "Unread only": "Только непрочитанные", + "Mark all as read": "Отметить все как прочитанные", + "Mark as read": "Отметить как прочитанное", + "More options": "Больше возможностей", + "{{name}} mentioned you in a comment": "{{name}} упомянул вас в комментарии", + "{{name}} commented on a page": "{{name}} оставил комментарий на странице", + "{{name}} resolved a comment": "{{name}} отметил(а) комментарий как решённый", + "{{name}} mentioned you on a page": "{{name}} упомянул(а) вас на странице", + "{{name}} gave you edit access to a page": "{{name}} предоставил(а) вам доступ на редактирование страницы", + "{{name}} gave you view access to a page": "{{name}} предоставил(а) вам доступ на просмотр страницы", + "{{name}} updated a page": "{{name}} обновил(а) страницу", + "Watch page": "Следить за страницей", + "Stop watching": "Перестать следить", + "Watch space": "Следить за пространством", + "Stop watching space": "Перестать следить за пространством", + "Email notifications": "Уведомления на email", + "Page updates": "Обновления страницы", + "Get notified when pages you watch are updated.": "Получайте уведомления, когда отслеживаемые вами страницы обновляются.", + "Page mentions": "Упоминания на странице", + "Get notified when someone mentions you on a page.": "Получайте уведомления, когда кто-то упоминает вас на странице.", + "Comment mentions": "Упоминания в комментариях", + "Get notified when someone mentions you in a comment.": "Получайте уведомления, когда кто-то упоминает вас в комментарии.", + "New comments": "Новые комментарии", + "Get notified about new comments on threads you participate in.": "Получайте уведомления о новых комментариях в цепочках, в которых вы участвуете.", + "Resolved comments": "Разрешённые комментарии", + "Get notified when your comment is resolved.": "Получайте уведомление, когда ваш комментарий разрешён.", + "You are now watching this page": "Вы теперь следите за этой страницей", + "You are no longer watching this page": "Вы больше не следите за этой страницей", + "You are now watching this space": "Теперь вы следите за этим пространством", + "You are no longer watching this space": "Вы больше не следите за этим пространством", + "Direct": "Прямые", + "Updates": "Обновления", + "Today": "Сегодня", + "Yesterday": "Вчера", + "This week": "На этой неделе", + "Older": "Старше", + "Restricted page": "Страница с ограниченным доступом", + "Restricted pages cannot be shared publicly.": "Страницы с ограниченным доступом нельзя сделать общедоступными.", + "Restricted by parent": "Ограничено родительской страницей", + "Restricted": "Ограничено", + "Open": "Открыто", + "Inherits restrictions from ancestor page": "Наследует ограничения от родительской страницы", + "Only people listed below can access this page": "Доступ к этой странице имеют только перечисленные ниже пользователи", + "Everyone in this space can access": "Доступ имеют все участники этого пространства", + "No additional restrictions on this page": "На этой странице нет дополнительных ограничений", + "Only specific people can access": "Доступ имеют только определённые пользователи", + "Use only inherited restrictions": "Использовать только унаследованные ограничения", + "Add restrictions on top of inherited": "Добавить ограничения поверх унаследованных", + "Inherited restriction": "Унаследованное ограничение", + "Access limited by": "Доступ ограничен", + "Restrict access to control who can view and edit this page": "Ограничьте доступ, чтобы контролировать, кто может просматривать и редактировать эту страницу", + "Add additional restrictions specific to this page": "Добавить дополнительные ограничения, применимые только к этой странице", + "Access": "Доступ", + "People with access": "Пользователи с доступом", + "Remove all": "Удалить всё", + "Remove access": "Удалить доступ", + "Remove all access": "Удалить весь доступ", + "Are you sure you want to remove this member's access to the page?": "Вы уверены, что хотите удалить доступ этого участника к странице?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Вы уверены, что хотите удалить все специальные права доступа? Это сделает страницу доступной всем участникам пространства.", + "Trash retention": "Срок хранения корзины", + "Pages in trash will be permanently deleted after this period.": "Страницы в корзине будут окончательно удалены по истечении этого срока.", + "Trash retention updated": "Срок хранения корзины обновлён", + "Failed to update trash retention": "Не удалось обновить срок хранения корзины", + "Removed page restriction": "Ограничение доступа к странице удалено", + "Added page permission": "Добавлено разрешение доступа к странице", + "Removed page permission": "Удалено разрешение доступа к странице", + "Changed page permission": "Изменено разрешение доступа к странице", + "Requested password reset": "Запрошен сброс пароля", + "Created template": "Создан шаблон", + "Deleted template": "Удалён шаблон", + "day": "день", + "days": "дни", + "week": "неделя", + "weeks": "недели", + "month": "месяц", + "months": "месяцы", + "year": "год", + "years": "годы", + "Period": "Период", + "Fixed date": "Фиксированная дата", + "Indefinitely": "Бессрочно", + "Days": "Дни", + "Weeks": "Недели", + "Months": "Месяцы", + "Years": "Годы", + "Pick a date": "Выберите дату", + "Maximum is {{max}} {{unit}} for this unit": "Максимум для этой единицы измерения — {{max}} {{unit}}", + "Never expires. Verifiers can re-verify at any time.": "Срок действия не истекает. Проверяющие могут повторно подтверждать в любое время.", + "Verified": "Проверено", + "Review needed": "Требуется проверка", + "Verification expired": "Срок проверки истёк", + "Draft": "Черновик", + "In Approval": "На утверждении", + "In approval": "На утверждении", + "Approved": "Утверждено", + "Obsolete": "Устарело", + "Expiring": "Истекает", + "Set up verification": "Настроить проверку", + "Verify page": "Проверить страницу", + "Page verification": "Проверка страницы", + "Add verification": "Добавить проверку", + "Edit verification": "Изменить проверку", + "Search by title": "Поиск по заголовку", + "Choose how this page should stay accurate.": "Выберите, как поддерживать актуальность этой страницы.", + "Recurring verification": "Регулярная проверка", + "Verifiers re-confirm this page on a schedule.": "Проверяющие повторно подтверждают эту страницу по расписанию.", + "Re-verify on a schedule (e.g every 30 days )": "Повторно проверять по расписанию (например, каждые 30 дней)", + "Page stays editable at all times": "Страница остаётся редактируемой в любое время", + "Best for runbooks, FAQs, living documentation": "Лучше всего подходит для инструкций, FAQ и живой документации", + "Approval workflow": "Процесс утверждения", + "Formal document lifecycle with named approvers.": "Формальный жизненный цикл документа с назначенными утверждающими.", + "Draft → In approval → Approved → Obsolete": "Черновик → На утверждении → Утверждено → Устарело", + "Locked once approved, with full history": "После утверждения блокируется, с полной историей", + "Designed for ISO 9001, ISO 13485, and FDA": "Разработано для ISO 9001, ISO 13485 и FDA", + "Best for SOPs and controlled documents": "Лучше всего подходит для СОП и контролируемых документов", + "Back": "Назад", + "Quality management": "Управление качеством", + "Recurring": "Регулярно", + "Pages move through draft, approval, and approved stages.": "Страницы проходят стадии черновика, утверждения и утверждённого состояния.", + "Verifiers": "Проверяющие", + "Add verifier": "Добавить проверяющего", + "I've reviewed this page for accuracy": "Я проверил(а) эту страницу на точность", + "Set up": "Настроить", + "Remove verification": "Удалить проверку", + "Are you sure you want to remove verification from this page?": "Вы уверены, что хотите удалить проверку с этой страницы?", + "Assigned verifiers must periodically re-verify this page.": "Назначенные проверяющие должны периодически повторно проверять эту страницу.", + "Last verified by {{name}} {{time}} (expired)": "Последняя проверка: {{name}}, {{time}} (срок истёк)", + "The fixed expiration date has passed.": "Фиксированная дата истечения срока уже прошла.", + "Verified by {{name}} {{time}}": "Проверено: {{name}}, {{time}}", + "Expires {{date}}": "Истекает {{date}}", + "Expired {{date}}": "Срок истёк {{date}}", + "Mark as obsolete": "Отметить как устаревшее", + "Mark obsolete": "Отметить как устаревшее", + "Returned by {{name}} {{time}}": "Возвращено: {{name}}, {{time}}", + "No approval has been requested yet.": "Запрос на утверждение ещё не отправлен.", + "Submitted by {{name}} {{time}}": "Отправлено: {{name}}, {{time}}", + "Someone": "Кто-то", + "Approved by {{name}} {{time}}": "Утверждено: {{name}}, {{time}}", + "This document has been marked as obsolete.": "Этот документ был отмечен как устаревший.", + "Rejection comment": "Комментарий к отклонению", + "Reason for returning this document...": "Причина возврата этого документа...", + "Confirm rejection": "Подтвердить отклонение", + "Submit for approval": "Отправить на утверждение", + "Reject": "Отклонить", + "Approve": "Утвердить", + "Re-submit for approval": "Повторно отправить на утверждение", + "Verified until": "Проверено до", + "QMS": "QMS", + "Verified pages": "Проверенные страницы", + "Search pages...": "Поиск страниц...", + "Filter by space": "Фильтр по пространству", + "Filter by type": "Фильтр по типу", + "{{name}} verified a page": "{{name}} проверил(а) страницу", + "{{name}} submitted a page for your approval": "{{name}} отправил(а) страницу вам на утверждение", + "{{name}} returned a page for revision": "{{name}} вернул(а) страницу на доработку", + "Page verification expires soon": "Срок проверки страницы скоро истекает", + "Page verification has expired": "Срок проверки страницы истёк", + "SIEM destination {{name}} is failing": "Сбой в месте назначения SIEM {{name}}", + "SIEM destination {{name}} was disabled after 24 hours of failures": "Место назначения SIEM {{name}} было отключено после 24 часов сбоев", + "SIEM destination {{name}} recovered": "Место назначения SIEM {{name}} восстановлено", + "Verifying your email": "Подтверждение вашего адреса электронной почты", + "Please wait...": "Пожалуйста, подождите...", + "Verification failed. The link may have expired.": "Ошибка проверки. Ссылка могла устареть.", + "Check your email": "Проверьте вашу электронную почту", + "We sent a verification link to {{email}}.": "Мы отправили ссылку для подтверждения на {{email}}.", + "We sent a verification link to your email.": "Мы отправили ссылку для подтверждения на вашу электронную почту.", + "Click the link to verify your email and access your workspace.": "Перейдите по ссылке, чтобы подтвердить электронную почту и получить доступ к рабочему пространству.", + "Resend verification email": "Отправить письмо для подтверждения повторно", + "Verification email sent. Please check your inbox.": "Письмо для подтверждения отправлено. Пожалуйста, проверьте ваш почтовый ящик.", + "Failed to resend verification email. Please try again.": "Не удалось отправить письмо для подтверждения. Пожалуйста, попробуйте снова.", + "We've sent you an email with your associated workspaces.": "Мы отправили вам электронное письмо с привязанными рабочими пространствами.", + "Load more": "Загрузить ещё", + "Log out of all devices": "Выйти на всех устройствах", + "Log out of all sessions except this device": "Выйти из всех сеансов, кроме этого устройства", + "This Device": "Это устройство", + "Unknown device": "Неизвестное устройство", + "No active sessions": "Нет активных сеансов", + "Session revoked": "Сеанс отозван", + "All other sessions revoked": "Все остальные сеансы отозваны", + "Last used": "Последнее использование", + "Created": "Создано", + "Rename": "Переименовать", + "Publish": "Опубликовать", + "Security": "Безопасность", + "Enforce SSO": "Сделать SSO обязательным", + "Once enforced, members will not be able to login with email and password.": "После включения участники не смогут входить с помощью электронной почты и пароля.", + "AI-generated content may not be accurate.": "Контент, созданный ИИ, может быть неточным.", + "AI Chat": "Чат с ИИ", + "Analyze for insights": "Проанализировать и получить выводы", + "Ask anything...": "Спросите что угодно...", + "Assistant said:": "Ассистент ответил:", + "Chat history": "История чатов", + "Chat name": "Название чата", + "Chat transcript": "Расшифровка чата", + "Close": "Закрыть", + "Copy assistant response": "Скопировать ответ ассистента", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "Не удалось загрузить чат. Произошла ошибка.", + "Failed to render this message.": "Не удалось отобразить это сообщение.", + "How can I help you today?": "Чем я могу помочь вам сегодня?", + "New chat": "Новый чат", + "No chat history": "Нет истории чатов", + "No chats found": "Чаты не найдены", + "No conversations yet": "Пока нет разговоров", + "Open full page": "Открыть полную страницу", + "Scroll to bottom": "Прокрутить вниз", + "You said:": "Вы сказали:", + "Previous 7 days": "Предыдущие 7 дней", + "Previous 30 days": "Предыдущие 30 дней", + "Search chats...": "Поиск чатов...", + "Search chats": "Поиск чатов", + "Ask anything... Use @ to mention pages": "Спросите что угодно... Используйте @, чтобы упомянуть страницы", + "Ask anything or search your workspace": "Спросите что угодно или выполните поиск по рабочему пространству", + "Welcome to {{name}}": "Добро пожаловать в {{name}}", + "Add files": "Добавить файлы", + "Mention a page": "Упомянуть страницу", + "Start a new chat to see it here.": "Начните новый чат, чтобы увидеть его здесь.", + "Summarize this page": "Суммировать эту страницу", + "Toggle AI Chat": "Переключить чат с ИИ", + "Translate this page": "Перевести эту страницу", + "Try a different search term.": "Попробуйте другой поисковый запрос.", + "Try again": "Попробовать снова", + "Untitled chat": "Чат без названия", + "What can I help you with?": "Чем я могу вам помочь?", + "Are you sure you want to revoke this {{credential}}": "Вы уверены, что хотите отозвать этот {{credential}}", + "Automatically provision users and groups from your identity provider via SCIM.": "Автоматически предоставляйте доступ пользователям и группам из вашего провайдера удостоверений через SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Настройте ваш провайдер удостоверений с этим URL для предоставления доступа пользователям и группам.", + "Create {{credential}}": "Создать {{credential}}", + "{{credential}} created": "{{credential}} создан", + "{{credential}} created successfully": "{{credential}} успешно создан", + "Created by": "Создан", + "Custom": "Пользовательский", + "Enable SCIM": "Включить SCIM", + "Enter a descriptive name": "Введите понятное имя", + "I've saved my {{credential}}": "Я сохранил свой {{credential}}", + "Important": "Важно", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Обязательно скопируйте ваш {{credential}} сейчас. Позже вы не сможете увидеть его снова!", + "Never": "Никогда", + "Revoke {{credential}}": "Отозвать {{credential}}", + "SCIM endpoint URL": "URL конечной точки SCIM", + "SCIM provisioning": "SCIM-подготовка учетных записей", + "SCIM takes precedence over SSO group sync while enabled.": "Пока SCIM включен, он имеет приоритет над синхронизацией групп через SSO.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "Вы достигли максимального количества токенов SCIM: {{max}}. Удалите существующий токен, чтобы создать новый.", + "SCIM token": "Токен SCIM", + "SCIM tokens": "Токены SCIM", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Это действие нельзя отменить. Ваш провайдер удостоверений немедленно прекратит синхронизацию.", + "Toggle SCIM provisioning": "Переключить подготовку учетных записей SCIM", + "Token": "Токен", + "Page menu": "Меню страницы", + "Expand": "Развернуть", + "Collapse": "Свернуть", + "Comment menu": "Меню комментария", + "Group menu": "Меню группы", + "Show hidden breadcrumbs": "Показать скрытые хлебные крошки", + "Breadcrumbs": "Хлебные крошки", + "Page actions": "Действия со страницей", + "Pick emoji": "Выбрать эмодзи", + "Template menu": "Меню шаблона", + "Use": "Использовать", + "Use template": "Использовать шаблон", + "Preview template: {{title}}": "Предпросмотр шаблона: {{title}}", + "Use a template": "Использовать шаблон", + "Search templates...": "Поиск шаблонов...", + "Search spaces...": "Поиск пространств...", + "No templates found": "Шаблоны не найдены", + "No spaces found": "Пространства не найдены", + "Browse all templates": "Просмотреть все шаблоны", + "This space": "Это пространство", + "All templates": "Все шаблоны", + "Global": "Глобально", + "New template": "Новый шаблон", + "Edit template": "Редактировать шаблон", + "Are you sure you want to delete this template?": "Вы уверены, что хотите удалить этот шаблон?", + "Template scope updated": "Область действия шаблона обновлена", + "Choose which space this template belongs to": "Выберите, к какому пространству относится этот шаблон", + "Only workspace admins can create global templates.": "Только администраторы рабочего пространства могут создавать глобальные шаблоны.", + "You need edit access to this space to create templates.": "Чтобы создавать шаблоны, вам нужен доступ на редактирование этого пространства.", + "Scope": "Область действия", + "Select scope": "Выберите область действия", + "Title": "Заголовок", + "Saving...": "Сохранение...", + "Saved": "Сохранено", + "Save failed. Retry": "Не удалось сохранить. Повторите попытку", + "By {{name}}": "От {{name}}", + "Updated {{time}}": "Обновлено {{time}}", + "Choose destination": "Выберите место назначения", + "Search pages and spaces...": "Поиск страниц и пространств...", + "No results found": "Результаты не найдены", + "You don't have permission to create pages here": "У вас нет прав на создание страниц здесь", + "Chat menu for {{title}}": "Меню чата для {{title}}", + "API key menu": "Меню API-ключа", + "Jump to comment selection": "Перейти к выбору комментария", + "Slash commands": "Команды со слешем", + "Mention suggestions": "Подсказки упоминаний", + "Link suggestions": "Подсказки ссылок", + "Diagram editor": "Редактор диаграмм", + "Add comment": "Добавить комментарий", + "Find and replace": "Найти и заменить", + "Main navigation": "Основная навигация", + "Space navigation": "Навигация по пространству", + "Settings navigation": "Навигация по настройкам", + "AI navigation": "Навигация ИИ", + "Breadcrumb": "Хлебная крошка", + "Synced block": "Синхронизированный блок", + "Create a block that stays in sync across pages.": "Создайте блок, который будет синхронизироваться между страницами.", + "Editing original": "Редактирование оригинала", + "Copy synced block": "Скопировать синхронизированный блок", + "Unsync": "Не синхронизировать", + "Delete synced block": "Удалить синхронизированный блок", + "Synced to {{count}} other page_one": "Синхронизировано с {{count}} с другой страницей", + "Synced to {{count}} other page_other": "Синхронизировано с {{count}} с другими страницами", + "ORIGINAL": "ОРИГИНАЛ", + "THIS PAGE": "ЭТА СТРАНИЦА", + "No pages": "Нет страниц", + "The original synced block no longer exists": "Исходный синхронизированный блок больше не существует", + "You don't have access to this synced block": "У вас нет доступа к этому синхронизированному блоку", + "Failed to load this synced block": "Не удалось загрузить этот синхронизированный блок", + "Fixed editor toolbar": "Закреплённая панель инструментов редактора", + "Show a formatting toolbar above the editor with quick access to common actions.": "Показывать панель форматирования над редактором для быстрого доступа к часто используемым действиям.", + "Toggle fixed editor toolbar": "Переключить закреплённую панель инструментов редактора", + "Normal text": "Обычный текст", + "More inline formatting": "Больше вариантов встроенного форматирования", + "Subscript": "Подстрочный", + "Superscript": "Надстрочный", + "Inline code": "Встроенный код", + "Insert media": "Вставить медиа", + "Mention": "Упоминание", + "Emoji": "Эмодзи", + "Columns": "Столбцы", + "More inserts": "Больше вариантов вставки", + "Embeds": "Встраивания", + "Diagrams": "Диаграммы", + "Advanced": "Дополнительно", + "Utility": "Служебное", + "Decrease indent": "Уменьшить отступ", + "Increase indent": "Увеличить отступ", + "Clear formatting": "Очистить форматирование", + "Code block": "Блок кода", + "Experimental": "Экспериментальное", + "Strikethrough": "Зачеркивание", + "Undo": "Отменить", + "Redo": "Повторить", + "Backlinks": "Обратные ссылки", + "Last updated by": "Последний изменивший", + "Last updated": "Последнее обновление", + "Stats": "Статистика", + "Word count": "Количество слов", + "Characters": "Символы", + "Incoming links": "Входящие ссылки", + "Outgoing links": "Исходящие ссылки", + "Incoming links ({{count}})": "Входящие ссылки ({{count}})", + "Outgoing links ({{count}})": "Исходящие ссылки ({{count}})", + "No pages link here yet.": "На эту страницу пока что нет ссылок.", + "This page doesn't link to other pages yet.": "Эта страница пока не содержит ссылок на другие страницы.", + "Verified until {{date}}": "Подтверждено до: {{date}}", + "Labels": "Метки", + "Add label": "Добавить метку", + "No labels yet": "Меток пока нет", + "Already added": "Уже добавлено", + "Invalid label name": "Недопустимое имя метки", + "No matches": "Совпадений нет", + "Search or create…": "Найти или создать…", + "Remove label {{name}}": "Удалить метку {{name}}", + "Failed to add label": "Не удалось добавить метку", + "Failed to remove label": "Не удалось удалить метку", + "No pages with this label": "Нет страниц с этой меткой", + "Pages tagged with this label will appear here.": "Здесь будут отображаться страницы с этой меткой.", + "No pages match your search.": "Нет страниц, соответствующих вашему запросу.", + "Updated {{date}}": "Обновлено {{date}}", + "Cell actions": "Действия с ячейкой", + "Column actions": "Действия со столбцом", + "Row actions": "Действия со строкой", + "Filter": "Фильтр", + "Page title": "Заголовок страницы", + "Page content": "Содержимое страницы", + "Member actions for {{name}}": "Действия с участниками для {{name}}", + "Toggle password visibility": "Переключить видимость пароля", + "Send comment": "Отправить комментарий", + "Token actions": "Действия с токеном", + "Template settings": "Настройки шаблона", + "Edit diagram": "Редактировать диаграмму", + "Edit embed": "Редактировать встраивание", + "Edit drawing": "Редактировать рисунок", + "Delete equation": "Удалить уравнение", + "Invite actions": "Действия с приглашением", + "Get started": "Начать", + "* indicates required fields": "* обозначает обязательные поля", + "List of spaces in this workspace": "Список пространств в этом рабочем пространстве", + "Active sessions": "Активные сеансы", + "Add {{name}} to favorites": "Добавить {{name}} в избранное", + "Remove {{name}} from favorites": "Удалить {{name}} из избранного", + "Added to favorites": "Добавлено в избранное", + "Removed from favorites": "Удалено из избранного", + "Added {{name}} to favorites": "{{name}} добавлено в избранное", + "Removed {{name}} from favorites": "{{name}} удалено из избранного", + "Page menu for {{name}}": "Меню страницы для {{name}}", + "Create subpage of {{name}}": "Создать подстраницу для {{name}}", + "Allow personal spaces": "Разрешить личные пространства", + "Members can create their own personal space.": "Участники могут создавать свои собственные личные пространства.", + "Toggle allow personal spaces": "Переключить разрешение личных пространств", + "Create personal space": "Создать личное пространство", + "Personal space": "Личное пространство", + "{{name}}'s space": "Пространство {{name}}", + "Apply": "Применить", + "Cells that aren't already a page reference will be cleared.": "Ячейки, которые ещё не являются ссылкой на страницу, будут очищены.", + "Cells that aren't a valid URL will be cleared.": "Ячейки, которые не содержат допустимый URL, будут очищены.", + "Cells that aren't a valid email address will be cleared.": "Ячейки, которые не содержат допустимый адрес электронной почты, будут очищены.", + "Cells that can't be parsed as a date will be cleared.": "Ячейки, которые нельзя распознать как дату, будут очищены.", + "Cells that can't be parsed as a number will be cleared.": "Ячейки, которые нельзя распознать как число, будут очищены.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Значения в ячейках будут приведены к типу (yes/true/1 станут отмеченными; всё остальное станет неотмеченным или будет очищено).", + "Cells will be reinterpreted under the new type.": "Значения в ячейках будут заново интерпретированы в соответствии с новым типом.", + "Cells will be replaced with a comma-separated list of file names.": "Ячейки будут заменены списком имён файлов, разделённых запятыми.", + "Cells will be replaced with a comma-separated list of option names.": "Ячейки будут заменены списком названий параметров, разделённых запятыми.", + "Cells will be replaced with the option name.": "Ячейки будут заменены названием параметра.", + "Cells will be replaced with the page title.": "Ячейки будут заменены заголовком страницы.", + "Cells will be replaced with the person's name.": "Ячейки будут заменены именем человека.", + "Change type": "Изменить тип", + "Change type to {{label}}?": "Изменить тип на {{label}}?", + "Converting…": "Преобразование…", + "Existing values become single-item lists. No data is lost.": "Существующие значения станут одноэлементными списками. Данные не будут потеряны.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Для каждой строки будет сохранён только первый выбранный элемент; остальные будут отброшены.", + "Previous record": "Предыдущая запись", + "Next record": "Следующая запись", + "Record actions": "Действия с записью", + "Delete record": "Удалить запись", + "Delete record?": "Удалить запись?", + "This action cannot be undone.": "Это действие нельзя отменить.", + "to navigate": "для навигации", + "to close": "для закрытия", + "Expand row {{number}}": "Развернуть строку {{number}}", + "Saving…": "Сохранение…", + "Read-only": "Только для чтения", + "Loading…": "Загрузка…", + "Updated {{when}}": "Обновлено {{when}}", + "Add property": "Добавить свойство", + "Create property": "Создать свойство", + "Hide properties": "Скрыть свойства", + "Find a property type": "Найти тип свойства", + "Properties": "Свойства", + "A property with this name already exists": "Свойство с таким именем уже существует", + "Add card": "Добавить карточку", + "Add filter": "Добавить фильтр", + "Add option": "Добавить вариант", + "Add sort": "Добавить сортировку", + "Add view": "Добавить представление", + "All data in this column will be lost.": "Все данные в этом столбце будут потеряны.", + "Allow multiple people": "Разрешить нескольких пользователей", + "Alphabetize": "По алфавиту", + "Are you sure you want to delete": "Вы уверены, что хотите удалить", + "Ascending": "По возрастанию", + "Base deleted": "База удалена", + "Base name": "Название базы", + "Base table": "Таблица базы", + "Card properties": "Свойства карточки", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Ячейки, длина которых превышает ограничение для текста, будут обрезаны, а лишнее содержимое будет безвозвратно потеряно.", + "Checkbox": "Флажок", + "Checked by default": "Отмечено по умолчанию", + "Choose a property": "Выберите свойство", + "Clear selection": "Очистить выбор", + "Column options": "Параметры столбца", + "Comma, period": "Запятая, точка", + "Complete": "Завершено", + "Contains": "Содержит", + "Copy link to view": "Скопировать ссылку на представление", + "Create a status property": "Создать свойство статуса", + "Created at": "Создано", + "Currency": "Валюта", + "Decimal places": "Десятичные знаки", + "Default value": "Значение по умолчанию", + "Delete property": "Удалить свойство", + "Delete view": "Удалить представление", + "Delete {{count}} rows?_one": "Удалить 1 строку?", + "Delete {{count}} rows?_other": "Удалить {{count}} строк?", + "Descending": "По убыванию", + "Discard": "Отменить", + "Doesn't contain": "Не содержит", + "Done": "Готово", + "Edit formula": "Редактировать формулу", + "Edit property": "Редактировать свойство", + "Export CSV": "Экспорт CSV", + "Failed to load base": "Не удалось загрузить базу", + "False": "Ложь", + "File": "Файл", + "Filter and sort changes are visible only to you": "Изменения фильтра и сортировки видны только вам", + "Filter by": "Фильтр по", + "Formula": "Формула", + "Get started with": "Начать работу с", + "Greater than": "Больше чем", + "Group by": "Группировать по", + "Group this board by a select or status property.": "Сгруппируйте эту доску по свойству выбора или статуса.", + "Hide all": "Скрыть все", + "Hide group": "Скрыть группу", + "In Progress": "В процессе", + "In progress": "В процессе", + "Include time": "Включить время", + "Insert a kanban board on this page": "Вставить канбан-доску на эту страницу", + "Insert an inline base on this page": "Вставить встроенную базу на эту страницу", + "Is": "Равно", + "Is after": "После", + "Is any of": "Совпадает с любым из", + "Is before": "До", + "Is empty": "Пусто", + "Is none of": "Не совпадает ни с одним из", + "Is not": "Не равно", + "Is not empty": "Не пусто", + "Is on or after": "В этот день или позже", + "Is on or before": "В этот день или раньше", + "Is within": "Находится в пределах", + "Keep editing": "Продолжить редактирование", + "Last edited at": "Последнее изменение", + "Last edited by": "Последний изменивший", + "Less than": "Меньше чем", + "Link copied to clipboard": "Ссылка скопирована в буфер обмена", + "Local": "Локальный", + "Long text": "Длинный текст", + "Moved card to {{column}}": "Карточка перемещена в {{column}}", + "Moved column to {{column}}": "Столбец перемещён в {{column}}", + "Multi-select": "Множественный выбор", + "New row": "Новая строка", + "Next month": "Следующий месяц", + "Next week": "Следующая неделя", + "Next year": "Следующий год", + "No filters applied": "Фильтры не применены", + "No match": "Нет совпадений", + "No options for this property type": "Для этого типа свойства нет параметров", + "No sorts applied": "Сортировка не применена", + "No value": "Нет значения", + "None": "Нет", + "Not started": "Не начато", + "Number": "Число", + "One month ago": "Месяц назад", + "One month from now": "Через месяц", + "One week ago": "Неделю назад", + "One week from now": "Через неделю", + "Open as page": "Открыть как страницу", + "Options": "Параметры", + "Past month": "Прошлый месяц", + "Past week": "Прошлая неделя", + "Past year": "Прошлый год", + "Percent": "Процент", + "Period, comma": "Точка, запятая", + "Person": "Пользователь", + "Please enter a valid email": "Пожалуйста, введите корректный адрес электронной почты", + "Progress": "Прогресс", + "Property options": "Параметры свойства", + "Relative": "Относительный", + "Rename property": "Переименовать свойство", + "Reset": "Сбросить", + "Save for everyone": "Сохранить для всех", + "Select": "Выбор", + "Select a property": "Выберите свойство", + "Select all loaded rows": "Выбрать все загруженные строки", + "Show all": "Показать все", + "Sort": "Сортировка", + "Sort by": "Сортировать по", + "Space, comma": "Пробел, запятая", + "Space, period": "Пробел, точка", + "This board has no grouping property yet.": "У этой доски пока нет свойства для группировки.", + "This month": "Этот месяц", + "This year": "Этот год", + "Thousands and decimal separators": "Разделители тысяч и десятичных знаков", + "Time format": "Формат времени", + "To Do": "К выполнению", + "Tomorrow": "Завтра", + "True": "Истина", + "Unsaved changes": "Несохранённые изменения", + "Untitled base": "База без названия", + "URL": "URL", + "Value": "Значение", + "View updated for everyone": "Представление обновлено для всех", + "You have unsaved changes. Do you want to discard them?": "У вас есть несохранённые изменения. Хотите их отменить?", + "{{count}} rows deleted_one": "1 строка удалена", + "{{count}} rows deleted_other": "{{count}} строк удалено", + "{{count}} selected_one": "1 выбрано", + "{{count}} selected_other": "{{count}} выбрано", + "Compare": "Сравнить", + "Compare versions": "Сравнить версии", + "Select version from {{date}}": "Выбрать версию от {{date}}", + "Version actions for {{date}}": "Действия с версией от {{date}}", + "Comparing {{newer}} and {{older}}": "Сравнение {{newer}} и {{older}}", + "Exit compare": "Выйти из режима сравнения", + "Search attachments...": "Поиск вложений...", + "Error loading attachments.": "Ошибка при загрузке вложений.", + "No attachments on this page yet.": "На этой странице пока нет вложений.", + "Uploaded by {{name}}": "Загружено пользователем {{name}}", + "Download {{name}}": "Скачать {{name}}", + "Access revoked": "Доступ отозван", + "Authorize application": "Авторизовать приложение", + "{{name}} wants to access {{workspace}}": "{{name}} запрашивает доступ к {{workspace}}", + "Not you? Switch account": "Не вы? Сменить аккаунт", + "This application will be able to:": "Это приложение сможет:", + "Write": "Запись", + "Invalid authorization request": "Недопустимый запрос на авторизацию", + "Authorize": "Авторизовать", + "Application": "Приложение", + "Permissions": "Разрешения", + "Authorized": "Авторизовано", + "Revoke access": "Отозвать доступ", + "Revoke access for {{name}}": "Отозвать доступ для {{name}}", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Вы уверены, что хотите отозвать доступ для {{name}}? Приложение больше не сможет получить доступ к вашей учетной записи.", + "Something went wrong. Please try again.": "Что-то пошло не так. Пожалуйста, попробуйте еще раз.", + "Remove {{name}}": "Удалить {{name}}", + "Make sure you trust this application before authorizing it.": "Прежде чем авторизовать это приложение, убедитесь, что вы ему доверяете.", + "You will be redirected to": "Вы будете перенаправлены на", + "View content without making changes.": "Просматривать содержимое без внесения изменений.", + "Create and modify content.": "Создавать и изменять содержимое.", + "Applications and AI assistants you have authorized to access your account.": "Приложения и AI-помощники, которым вы разрешили доступ к своей учетной записи.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "В вашем рабочем пространстве включен MCP. Подключайте AI-помощников к вашей учетной записи Docmost через OAuth.", + "Authorized apps": "Авторизованные приложения", + "No authorized apps yet.": "Пока нет авторизованных приложений.", + "Workspace knowledge only": "Только знания рабочего пространства", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Ограничить AI Chat ответами только на основе страниц вашего рабочего пространства и загруженных файлов. Внешние знания использоваться не будут.", + "Toggle workspace knowledge only": "Переключить режим \"Только знания рабочего пространства\"", + "Read-only mode": "Режим только для чтения", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI Chat может искать и читать содержимое рабочего пространства, но не может создавать или редактировать страницы.", + "Toggle AI Chat read-only mode": "Переключить режим только для чтения для AI Chat", + "Title only": "Только заголовок", + "you": "вы", + "Allow public spaces": "Разрешить публичные пространства", + "Space admins can publish their spaces to the web.": "Администраторы пространств смогут публиковать свои пространства в интернете.", + "Toggle allow public spaces": "Переключить разрешение публичных пространств", + "Publish space to the web": "Опубликовать пространство в интернете", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Любой пользователь в интернете сможет читать каждую страницу в этом пространстве, кроме страниц с ограниченным доступом. Вы уверены?", + "Make this space publicly readable by anyone on the internet.": "Сделать это пространство общедоступным для чтения любым пользователем в интернете.", + "Toggle publish space to the web": "Переключить публикацию пространства в интернете", + "Allow search engines to index": "Разрешить поисковым системам индексировать", + "Let public pages in this space appear in search engine results.": "Разрешить публичным страницам в этом пространстве появляться в результатах поиска.", + "Toggle search engine indexing": "Переключить индексацию поисковыми системами", + "Public space link": "Ссылка на публичное пространство", + "Copy public space link": "Скопировать ссылку на публичное пространство", + "Renaming the space slug will break public links.": "Переименование slug пространства приведёт к поломке публичных ссылок.", + "Failed to update space": "Не удалось обновить пространство", + "This space is public": "Это пространство является публичным", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Любой пользователь в интернете может читать страницы в этом пространстве, кроме страниц с ограниченным доступом.", + "Open public site": "Открыть публичный сайт", + "Public": "Публичное", + "This space has no public pages yet.": "В этом пространстве пока нет публичных страниц.", + "On this page": "На этой странице", + "Previous": "Назад", + "Next": "Далее", + "Show hidden pages": "Показать скрытые страницы", + "Page navigation": "Навигация по странице", + "Toggle sidebar": "Переключить боковую панель", + "Toggle table of contents": "Переключить оглавление", + "Appearance": "Внешний вид", + "Forest": "Лесной", + "Violet": "Фиолетовый", + "Light mode color": "Цвет светлой темы", + "Dark mode color": "Цвет тёмной темы", + "Choose the primary color of the public docs site.": "Выберите основной цвет публичного сайта документации.", + "Show page author": "Показывать автора страницы", + "Display the page creator's name on public pages.": "Отображать имя создателя страницы на публичных страницах.", + "Toggle show page author": "Переключить показ автора страницы", + "Show last updated": "Показывать последнее обновление", + "Display when each page was last updated.": "Отображать время последнего обновления каждой страницы.", + "Toggle show last updated": "Переключить показ последнего обновления", + "Open public page": "Открыть публичную страницу", + "Toggle color scheme": "Переключить цветовую схему", + "Ember": "Янтарный", + "Rose": "Розовый", + "Documentation": "Документация", + "All published spaces.": "Все опубликованные пространства.", + "No public spaces yet.": "Пока нет публичных пространств.", + "Show public directory": "Показывать публичный каталог", + "List published spaces at /docs for anyone to browse.": "Показывать опубликованные пространства по адресу /docs, чтобы их мог просматривать любой пользователь.", + "Toggle show public directory": "Переключить показ публичного каталога", + "Show in public directory": "Показывать в публичном каталоге", + "List this space in the public directory at /docs.": "Показывать это пространство в публичном каталоге по адресу /docs.", + "Toggle show in public directory": "Переключить показ в публичном каталоге", + "Open public space link": "Открыть ссылку на публичное пространство", + "Disable public spaces": "Отключить публичные пространства", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Администраторы пространств смогут делать свои пространства общедоступными для чтения любым пользователем в интернете. Вы уверены?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Это приведёт к немедленной отмене публикации всех опубликованных пространств. Повторное включение позже не опубликует их заново. Вы уверены?", + "Allow": "Разрешить", + "Shared pages": "Общие страницы", + "Published spaces": "Опубликованные пространства", + "Spaces published to the web will appear here": "Здесь будут отображаться пространства, опубликованные в интернете", + "No published spaces": "Нет опубликованных пространств", + "Published by": "Опубликовано пользователем", + "Published at": "Опубликовано", + "Open space": "Открыть пространство", + "Unpublish": "Снять с публикации", + "Unpublish space": "Снять пространство с публикации", + "This space will no longer be publicly accessible. Are you sure?": "Это пространство больше не будет общедоступным. Вы уверены?", + "More options for {{name}}": "Дополнительные параметры для {{name}}", + "Edit page": "Редактировать страницу", + "Sign in": "Войти", + "Open app": "Открыть приложение", + "No spaces match your search.": "Нет пространств, соответствующих вашему запросу.", + "Welcome to our documentation": "Добро пожаловать в нашу документацию", + "Guides, references and answers across all our published spaces.": "Руководства, справочные материалы и ответы во всех наших опубликованных пространствах.", + "Guides, references and answers across all our spaces.": "Руководства, справочные материалы и ответы во всех наших пространствах.", + "Search documentation...": "Поиск по документации...", + "1 published space": "1 опубликованное пространство", + "{{count}} published spaces": "{count, plural, one {# опубликованное пространство} few {# опубликованных пространства} many {# опубликованных пространств} other {# опубликованного пространства}}", + "Actions": "Действия", + "Add destination": "Добавить место назначения", + "Are you sure you want to delete the destination": "Вы уверены, что хотите удалить место назначения", + "Audit logs": "Журналы аудита", + "Audit logs & SIEM": "Журналы аудита и SIEM", + "Auth header name": "Имя заголовка авторизации", + "Auth header prefix": "Префикс заголовка авторизации", + "Body format": "Формат тела", + "Created SIEM destination": "Создано место назначения SIEM", + "Datadog site": "Сайт Datadog", + "Defaults to this instance's hostname": "По умолчанию используется имя хоста этого экземпляра", + "Delete destination": "Удалить место назначения", + "Deleted SIEM destination": "Удалено место назначения SIEM", + "Destination created": "Место назначения создано", + "Destination deleted": "Место назначения удалено", + "Destination updated": "Место назначения обновлено", + "Disabled": "Отключено", + "Edit destination": "Изменить место назначения", + "Endpoint URL": "URL конечной точки", + "Failing": "Сбой", + "Failing since {{time}}": "Сбой с {{time}}", + "HEC token": "Токен HEC", + "HEC URL": "URL HEC", + "Healthy": "Исправно", + "Hide advanced options": "Скрыть дополнительные параметры", + "Host": "Хост", + "Index": "Индекс", + "Insecure: connections can be intercepted.": "Небезопасно: соединения могут быть перехвачены.", + "JSON array": "Массив JSON", + "Last delivered": "Последняя доставка", + "Last error": "Последняя ошибка", + "Leave empty to use the token's default index": "Оставьте пустым, чтобы использовать индекс токена по умолчанию", + "Maximum of {{limit}} destinations reached": "Достигнуто максимальное количество мест назначения: {{limit}}", + "Could not load SIEM destinations: {{message}}": "Не удалось загрузить места назначения SIEM: {{message}}", + "No destinations yet": "Пока нет мест назначения", + "Preset": "Предустановка", + "Retry now": "Повторить сейчас", + "Retry scheduled": "Повторная попытка запланирована", + "Send test event": "Отправить тестовое событие", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Отправляется в указанном ниже заголовке авторизации. Оставьте пустым, если вашему получателю он не нужен.", + "Service": "Сервис", + "Show advanced options": "Показать дополнительные параметры", + "SIEM": "SIEM", + "SIEM streaming": "Потоковая передача в SIEM", + "SIEM streaming requires an Enterprise license.": "Для потоковой передачи в SIEM требуется лицензия Enterprise.", + "Source": "Источник", + "Sourcetype": "Тип источника", + "Tags": "Теги", + "Test connection": "Проверить соединение", + "Test event delivered successfully.": "Тестовое событие успешно доставлено.", + "Test the connection before saving.": "Проверьте соединение перед сохранением.", + "Test event delivered to {{name}}": "Тестовое событие доставлено в {{name}}", + "Updated SIEM destination": "Обновлено место назначения SIEM", + "Verify TLS certificate": "Проверять сертификат TLS", + "e.g. Splunk prod": "например, Splunk prod" +} diff --git a/apps/client/public/locales/uk-UA/translation.json b/apps/client/public/locales/uk-UA/translation.json new file mode 100644 index 0000000..9c94a29 --- /dev/null +++ b/apps/client/public/locales/uk-UA/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "Обліковий запис", + "Active": "Активний", + "Add": "Додати", + "Add group members": "Додати учасників групи", + "Add groups": "Додати групи", + "Add members": "Додати учасників", + "Add to groups": "Додати до груп", + "Add space members": "Додати учасників простору", + "Add to favorites": "Додати до обраного", + "Admin": "Адміністратор", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "Ви впевнені, що хочете видалити цю групу? Учасники втратять доступ до матеріалів, до яких ця група має доступ.", + "Are you sure you want to delete this page?": "Ви впевнені, що хочете видалити цю сторінку?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "Ви впевнені, що хочете видалити цього користувача з групи? Користувач втратить доступ до матеріалів, до яких ця група має доступ.", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "Ви впевнені, що хочете видалити цього користувача з простору? Користувач втратить весь доступ до цього простору.", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "Ви впевнені, що хочете відновити цю версію? Усі не збережені зміни будуть втрачені.", + "Can become members of groups and spaces in workspace": "Можуть ставати учасниками груп та просторів у робочій області", + "Can create and edit pages in space.": "Може створювати та редагувати сторінки в просторі.", + "Can edit": "Може редагувати", + "Can manage workspace": "Може керувати робочою областю", + "Can manage workspace but cannot delete it": "Може керувати робочою областю, але не може її видалити", + "Can view": "Може переглядати", + "Can view pages in space but not edit.": "Може переглядати сторінки в просторі, але не може їх редагувати.", + "Cancel": "Скасувати", + "Change email": "Змінити електронну пошту", + "Change password": "Змінити пароль", + "Change photo": "Змінити фото", + "Choose a role": "Оберіть роль", + "Choose your preferred color scheme.": "Оберіть бажану кольорову схему.", + "Choose your preferred interface language.": "Оберіть бажану мову інтерфейсу.", + "Choose your preferred page width.": "Оберіть бажану ширину сторінки.", + "Confirm": "Підтвердити", + "Copy as Markdown": "Скопіювати як Markdown", + "Copy link": "Копіювати посилання", + "Create": "Створити", + "Create group": "Створити групу", + "Create page": "Створити сторінку", + "Create space": "Створити простір", + "Create workspace": "Створити робочу область", + "Current password": "Поточний пароль", + "Dark": "Темна", + "Date": "Дата", + "Delete": "Видалити", + "Remove from page": "Видалити зі сторінки", + "Base options": "Параметри бази", + "Delete group": "Видалити групу", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "Ви впевнені, що хочете видалити цю сторінку? Це видалить її дочірні сторінки, а також історію сторінки. Ця дія необоротна.", + "Description": "Опис", + "Details": "Деталі", + "e.g ACME": "напр., ACME", + "e.g ACME Inc": "напр., ACME Inc", + "e.g Developers": "напр., Розробники", + "e.g Group for developers": "напр., Група для розробників", + "e.g product": "напр., продукт", + "e.g Product Team": "напр., Команда продукту", + "e.g Sales": "напр., Продажі", + "e.g Space for product team": "напр., Простір для команди продукту", + "e.g Space for sales team to collaborate": "напр., Простір для співпраці команди продажів", + "Edit": "Редагувати", + "Read": "Читати", + "Edit group": "Редагувати групу", + "Email": "Електронна пошта", + "Enter a strong password": "Введіть надійний пароль", + "Enter valid email addresses separated by comma or space max_50": "Введіть дійсні адреси електронної пошти, розділені комою або пробілом [макс: 50]", + "enter valid emails addresses": "введіть дійсні адреси електронної пошти", + "Enter your current password": "Введіть ваш поточний пароль", + "enter your full name": "введіть своє повне ім’я", + "Enter your new password": "Введіть ваш новий пароль", + "Enter your new preferred email": "Введіть вашу нову бажану електронну пошту", + "Enter your password": "Введіть ваш пароль", + "Error fetching page data.": "Помилка при завантаженні даних сторінки.", + "Error loading page history.": "Помилка при завантаженні історії сторінки.", + "Export": "Експорт", + "Failed to create page": "Не вдалося створити сторінку", + "Failed to delete page": "Не вдалося видалити сторінку", + "Failed to restore page": "Не вдалося відновити сторінку", + "Failed to fetch recent pages": "Не вдалося отримати нещодавні сторінки", + "Failed to import pages": "Не вдалося імпортувати сторінки", + "Failed to load page. An error occurred.": "Не вдалося завантажити сторінку. Сталася помилка.", + "Failed to update data": "Не вдалося оновити дані", + "Failed to create base": "Не вдалося створити базу", + "Failed to update base": "Не вдалося оновити базу", + "Failed to delete base": "Не вдалося видалити базу", + "Failed to create property": "Не вдалося створити властивість", + "Failed to update property": "Не вдалося оновити властивість", + "Failed to delete property": "Не вдалося видалити властивість", + "Failed to reorder property": "Не вдалося змінити порядок властивості", + "Failed to create view": "Не вдалося створити подання", + "Failed to update view": "Не вдалося оновити подання", + "Failed to delete view": "Не вдалося видалити подання", + "Failed to create row": "Не вдалося створити рядок", + "Failed to update row": "Не вдалося оновити рядок", + "Failed to delete row": "Не вдалося видалити рядок", + "Failed to delete rows": "Не вдалося видалити рядки", + "Failed to reorder row": "Не вдалося змінити порядок рядка", + "Failed to move card": "Не вдалося перемістити картку", + "Failed to add card": "Не вдалося додати картку", + "Failed to export CSV": "Не вдалося експортувати CSV", + "Favorite spaces": "Обрані простори", + "Favorite spaces appear here": "Тут відображаються обрані простори", + "Favorites": "Обране", + "Full access": "Повний доступ", + "Full page width": "Ширина на всю сторінку", + "Full width": "На всю ширину", + "General": "Загальні", + "Group": "Група", + "Group description": "Опис групи", + "Group name": "Назва групи", + "Groups": "Групи", + "Has full access to space settings and pages.": "Має повний доступ до налаштувань простору та сторінок.", + "Home": "Головна", + "Import pages": "Імпорт сторінок", + "Import pages & space settings": "Імпорт сторінок і налаштування простору", + "Importing pages": "Імпортування сторінок", + "invalid invitation link": "недійсне посилання запрошення", + "Invitation signup": "Реєстрація за запрошенням", + "Invite by email": "Запросити електронною поштою", + "Invite members": "Запросити учасників", + "Invite new members": "Запросити нових учасників", + "Invite People": "Запросити людей", + "Invited members who are yet to accept their invitation will appear here.": "Запрошені учасники, які ще не прийняли запрошення, з'являться тут.", + "Invited members will be granted access to spaces the groups can access": "Запрошені учасники отримають доступ до просторів, доступ до яких має група", + "Join the workspace": "Приєднатися до робочої області", + "Language": "Мова", + "Light": "Світла", + "Link copied": "Посилання скопійовано", + "Login": "Увійти", + "Logout": "Вийти", + "Manage Group": "Керування групою", + "Manage members": "Керування учасниками", + "member": "учасник", + "Member": "Учасник", + "members": "учасники", + "Members": "Учасники", + "My preferences": "Мої налаштування", + "My Profile": "Мій профіль", + "My profile": "Мій профіль", + "Name": "Ім'я", + "New email": "Нова електронна адреса", + "New page": "Нова сторінка", + "New password": "Новий пароль", + "No group found": "Групу не знайдено", + "No page history saved yet.": "Історія сторінок ще не збережена.", + "No pages yet": "Сторінок поки немає", + "No shared pages": "Немає спільних сторінок", + "No results found...": "Результати не знайдено...", + "No user found": "Користувача не знайдено", + "Overview": "Огляд", + "Owner": "Власник", + "page": "сторінка", + "Page deleted successfully": "Сторінку успішно видалено", + "Page history": "Історія сторінки", + "Select version": "Вибрати версію", + "Highlight changes": "Підсвітити зміни", + "Page import is in progress. Please do not close this tab.": "Імпорт сторінки в процесі. Будь ласка, не закривайте цю вкладку.", + "Pages": "Сторінки", + "pages": "сторінки", + "Password": "Пароль", + "Password changed successfully": "Пароль успішно змінено", + "People": "Користувачі", + "Pending": "В очікуванні", + "Please confirm your action": "Будь ласка, підтвердіть вашу дію", + "Preferences": "Налаштування", + "Print PDF": "Друк PDF", + "Profile": "Профіль", + "Recently updated": "Нещодавно оновлено", + "Remove": "Видалити", + "Remove from favorites": "Видалити з обраного", + "Remove group member": "Видалити учасника групи", + "Remove space member": "Видалити учасника простору", + "Restore": "Відновити", + "Role": "Роль", + "Save": "Зберегти", + "Search": "Пошук", + "Search for groups": "Пошук груп", + "Search for users": "Пошук користувачів", + "Search for users and groups": "Пошук користувачів та груп", + "Search...": "Пошук...", + "Select language": "Виберіть мову", + "Select role": "Виберіть роль", + "Select role to assign to all invited members": "Виберіть роль, яку буде призначено всім запрошеним учасникам", + "Select theme": "Виберіть тему", + "Send invitation": "Надіслати запрошення", + "Invitation sent": "Запрошення надіслано", + "Settings": "Налаштування", + "Setup workspace": "Налаштувати робочий простір", + "Sign In": "Увійти", + "Sign Up": "Зареєструватися", + "Slug": "Slug", + "Space": "Простір", + "Space description": "Опис простору", + "Space menu": "Меню простору", + "Space name": "Назва простору", + "Space settings": "Налаштування простору", + "Space slug": "Slug простору", + "Spaces": "Простори", + "Spaces you belong to": "Простори, до яких ви належите", + "No space found": "Простір не знайдено", + "Search for spaces": "Пошук просторів", + "Start typing to search...": "Почніть вводити для пошуку...", + "Status": "Статус", + "Successfully imported": "Успішно імпортовано", + "Successfully restored": "Успішно відновлено", + "System settings": "Системні налаштування", + "Templates": "Шаблони", + "Theme": "Тема", + "To change your email, you have to enter your password and new email.": "Щоб змінити електронну пошту, вам потрібно ввести пароль і нову адресу.", + "Toggle full page width": "Перемкнути повну ширину сторінки", + "Unable to import pages. Please try again.": "Не вдалося імпортувати сторінки. Будь ласка, спробуйте ще раз.", + "untitled": "без назви", + "Untitled": "Без назви", + "Updated successfully": "Успішно оновлено", + "User": "Користувач", + "Workspace": "Робочий простір", + "Workspace Name": "Назва робочого простору", + "Workspace settings": "Налаштування робочого простору", + "You can change your password here.": "Ви можете змінити свій пароль тут.", + "Your Email": "Ваша електронна пошта", + "Your import is complete.": "Ваш імпорт завершено.", + "Your name": "Ваше ім’я", + "Your Name": "Ваше ім’я", + "Your password": "Ваш пароль", + "Your password must be a minimum of 8 characters.": "Ваш пароль повинен містити мінімум 8 символів.", + "Sidebar toggle": "Перемикач бічної панелі", + "Comments": "Коментарі", + "404 page not found": "404 сторінку не знайдено", + "Sorry, we can't find the page you are looking for.": "На жаль, ми не можемо знайти сторінку, яку ви шукаєте.", + "Take me back to homepage": "Повернути мене на головну сторінку", + "Forgot password": "Забули пароль", + "Forgot your password?": "Забули пароль?", + "A password reset link has been sent to your email. Please check your inbox.": "Посилання для скидання пароля було надіслано на вашу електронну адресу. Будь ласка, перевірте вхідні повідомлення.", + "Send reset link": "Надіслати посилання для скидання", + "Password reset": "Скидання пароля", + "Your new password": "Ваш новий пароль", + "Set password": "Встановити пароль", + "Write a comment": "Написати коментар", + "Reply...": "Відповісти...", + "Error loading comments.": "Помилка при завантаженні коментарів.", + "No comments yet.": "Коментарів поки немає.", + "No open comments.": "Немає відкритих коментарів.", + "No resolved comments.": "Немає вирішених коментарів.", + "Add a comment...": "Додати коментар...", + "Edit comment": "Редагувати коментар", + "Delete comment": "Видалити коментар", + "Are you sure you want to delete this comment?": "Ви впевнені, що хочете видалити цей коментар?", + "Delete chat": "Видалити чат", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "Ви впевнені, що хочете видалити '{{title}}'? Цю дію неможливо скасувати.", + "Comment created successfully": "Коментар успішно створено", + "Error creating comment": "Помилка при створенні коментаря", + "Comment updated successfully": "Коментар успішно оновлено", + "Failed to update comment": "Не вдалося оновити коментар", + "Comment deleted successfully": "Коментар успішно видалено", + "Failed to delete comment": "Не вдалося видалити коментар", + "Comment resolved successfully": "Коментар успішно вирішено", + "Comment re-opened successfully": "Коментар успішно знову відкрито", + "Comment unresolved successfully": "Позначку вирішення коментаря успішно знято", + "Failed to resolve comment": "Не вдалося вирішити коментар", + "Resolve comment": "Позначити коментар як вирішений", + "Unresolve comment": "Зняти позначку вирішення з коментаря", + "Resolve Comment Thread": "Позначити гілку коментарів як вирішену", + "Unresolve Comment Thread": "Зняти позначку вирішення з гілки коментарів", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "Ви впевнені, що хочете вирішити цей ланцюжок коментарів? Це позначить його як завершений.", + "Are you sure you want to unresolve this comment thread?": "Ви впевнені, що хочете розв'язати цей ланцюжок коментарів?", + "Resolved": "Вирішено", + "No active comments.": "Немає активних коментарів.", + "Revoke invitation": "Відкликати запрошення", + "Revoke": "Відкликати", + "Don't": "Ні", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "Ви впевнені, що хочете відкликати це запрошення? Користувач не зможе приєднатися до робочої області.", + "Resend invitation": "Надіслати запрошення повторно", + "Anyone with this link can join this workspace.": "Будь-хто, хто має це посилання, може приєднатися до цієї робочої області.", + "Invite link": "Посилання для запрошення", + "Copy": "Копіювати", + "Copy to space": "Копіювати до простору", + "Copied": "Скопійовано", + "Duplicate": "Дублювати", + "Select a user": "Оберіть користувача", + "Select a group": "Оберіть групу", + "Export all pages and attachments in this space.": "Експортувати всі сторінки та вкладення в цьому просторі.", + "Delete space": "Видалити простір", + "Are you sure you want to delete this space?": "Ви впевнені, що хочете видалити цей простір?", + "Delete this space with all its pages and data.": "Видалити цей простір з усіма його сторінками та даними.", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "Усі сторінки, коментарі, вкладення та дозволи в цьому просторі будуть видалені безповоротно.", + "Confirm space name": "Підтвердьте назву простору", + "Type the space name {{spaceName}} to confirm your action.": "Введіть назву простору {{spaceName}}, щоб підтвердити вашу дію.", + "Format": "Формат", + "Include subpages": "Включити вкладені сторінки", + "Include attachments": "Включити вкладення", + "Select export format": "Виберіть формат експорту", + "Export failed:": "Експортування не вдалося:", + "export error": "помилка експорту", + "Export page": "Експорт сторінки", + "Export successful": "Експорт виконано успішно", + "Export space": "Експорт простору", + "Export {{type}}": "Експорт {{type}}", + "File exceeds the {{limit}} attachment limit": "Файл перевищує ліміт вкладень {{limit}}", + "Media": "Медіа", + "Align left": "По лівому краю", + "Align right": "По правому краю", + "Align center": "По центру", + "Alt text": "Альтернативний текст", + "Describe this for accessibility.": "Опишіть це для доступності.", + "Add a description": "Додати опис", + "Justify": "По ширині", + "Merge cells": "Об'єднати комірки", + "Split cell": "Розділити комірку", + "Delete column": "Видалити стовпець", + "Delete row": "Видалити рядок", + "Add left column": "Додати стовпець ліворуч", + "Add right column": "Додати стовпець праворуч", + "Add row above": "Додати рядок вище", + "Add row below": "Додати рядок нижче", + "Delete table": "Видалити таблицю", + "Add column left": "Додати стовпець ліворуч", + "Add column right": "Додати стовпець праворуч", + "Clear cell": "Очистити комірку", + "Clear cells": "Очистити комірки", + "Toggle header cell": "Перемкнути комірку заголовка", + "Toggle header column": "Перемкнути стовпець заголовка", + "Toggle header row": "Перемкнути рядок заголовка", + "Move column left": "Перемістити стовпець ліворуч", + "Move column right": "Перемістити стовпець праворуч", + "Move row down": "Перемістити рядок вниз", + "Move row up": "Перемістити рядок вгору", + "Sort A → Z": "Сортувати A → Z", + "Sort Z → A": "Сортувати Z → A", + "Info": "Інформація", + "Note": "Примітка", + "Success": "Успішно", + "Warning": "Попередження", + "Danger": "Важливо", + "Mermaid diagram error:": "Помилка діаграми Mermaid:", + "Invalid Mermaid diagram": "Неприпустима діаграма Mermaid", + "Double-click to edit Draw.io diagram": "Клацніть двічі для редагування діаграми Draw.io", + "Exit": "Вийти", + "Save & Exit": "Зберегти та вийти", + "Double-click to edit Excalidraw diagram": "Клацніть двічі для редагування діаграми Excalidraw", + "Paste link": "Вставити посилання", + "Paste link or search pages": "Вставте посилання або знайдіть сторінки", + "Link to web page": "Посилання на веб-сторінку", + "Recents": "Нещодавні", + "Page or URL": "Сторінка або URL", + "Link title": "Назва посилання", + "Edit link": "Редагувати посилання", + "Remove link": "Видалити посилання", + "Add link": "Додати посилання", + "Please enter a valid url": "Будь ласка, введіть коректний url", + "Empty equation": "Порожнє рівняння", + "Invalid equation": "Неприпустиме рівняння", + "Color": "Колір", + "Text color": "Колір тексту", + "Default": "За замовчуванням", + "Blue": "Синій", + "Green": "Зелений", + "Purple": "Фіолетовий", + "Red": "Червоний", + "Yellow": "Жовтий", + "Orange": "Помаранчевий", + "Pink": "Рожевий", + "Gray": "Сірий", + "Embed link": "Вбудоване посилання", + "Invalid {{provider}} embed link": "Недійсне посилання для вбудовування {{provider}}", + "Embed {{provider}}": "Вбудувати {{provider}}", + "Enter {{provider}} link to embed": "Введіть посилання для вбудовування {{provider}}", + "Bold": "Жирний", + "Italic": "Курсив", + "Underline": "Підкреслений", + "Strike": "Закреслений", + "Code": "Код", + "Comment": "Коментар", + "Text": "Текст", + "Heading 1": "Заголовок 1", + "Heading 2": "Заголовок 2", + "Heading 3": "Заголовок 3", + "To-do List": "Список справ", + "Bullet List": "Маркований список", + "Numbered List": "Нумерований список", + "Blockquote": "Блок цитування", + "Just start typing with plain text.": "Просто почніть друкувати звичайний текст.", + "Track tasks with a to-do list.": "Відстежуйте завдання за допомогою списку справ.", + "Big section heading.": "Великий заголовок розділу.", + "Medium section heading.": "Середній заголовок розділу.", + "Small section heading.": "Малий заголовок розділу.", + "Create a simple bullet list.": "Створити простий маркований список.", + "Create a list with numbering.": "Створити нумерований список.", + "Create block quote.": "Створити блок цитування.", + "Insert code snippet.": "Вставити фрагмент коду.", + "Insert horizontal rule divider": "Вставити горизонтальний роздільник", + "Page break": "Розрив сторінки", + "Insert a page break for printing.": "Вставте розрив сторінки для друку.", + "Footnote": "Виноска", + "Insert a footnote reference.": "Вставити посилання на виноску.", + "Upload any image from your device.": "Завантажити будь-яке зображення з вашого пристрою.", + "Upload any video from your device.": "Завантажити будь-яке відео з вашого пристрою.", + "Upload any audio from your device.": "Завантажте будь-який аудіофайл зі свого пристрою.", + "Upload any file from your device.": "Завантажити будь-який файл з вашого пристрою.", + "Uploading {{name}}": "Завантаження {{name}}", + "Uploading file": "Завантаження файлу", + "Table": "Таблиця", + "Insert a table.": "Вставити таблицю.", + "Insert collapsible block.": "Вставити блок, що згортається.", + "Video": "Відео", + "Divider": "Роздільник", + "Quote": "Цитата", + "Image": "Зображення", + "Audio": "Аудіо", + "Embed PDF": "Вбудувати PDF", + "Upload and embed a PDF file.": "Завантажте та вбудуйте файл PDF.", + "Embed as PDF": "Вбудувати як PDF", + "Failed to load PDF": "Не вдалося завантажити PDF", + "Convert to attachment": "Перетворити на вкладення", + "File attachment": "Вкладення файлу", + "Toggle block": "Розкривний блок", + "Callout": "Виноска", + "Insert callout notice.": "Вставити виноску з повідомленням.", + "Math inline": "Вбудована формула", + "Insert inline math equation.": "Вставити математичне рівняння в рядок.", + "Math block": "Блок формули", + "Insert math equation": "Вставити математичну формулу", + "Mermaid diagram": "Діаграма Mermaid", + "Insert mermaid diagram": "Вставити діаграму Mermaid", + "Insert and design Drawio diagrams": "Вставляйте та створюйте діаграми Drawio", + "Insert current date": "Вставити поточну дату", + "Time": "Час", + "Insert current time": "Вставити поточний час", + "Draw and sketch excalidraw diagrams": "Створюйте та кресліть діаграми Excalidraw", + "Multiple": "Кілька", + "Turn into": "Перетворити", + "Text align": "Вирівнювання тексту", + "This page may have been deleted, moved, or you may not have access.": "Цю сторінку могли видалити, перемістити або у вас може не бути до неї доступу.", + "Go to homepage": "Перейти на головну", + "Pages you create will show up here.": "Сторінки, які ви створите, з'являться тут.", + "Heading {{level}}": "Заголовок {{level}}", + "Toggle title": "Назва розкривного блоку", + "Write anything. Enter \"/\" for commands": "Пишіть що завгодно. Введіть \"/\" для команд", + "Write...": "Напишіть...", + "Column count": "Кількість колонок", + "{{count}} Columns": "{count, plural, one{# колонка} few{# колонки} many{# колонок} other{# колонки}}", + "{{count}} command available_one": "Доступна 1 команда", + "{{count}} command available_other": "Доступно {{count}} команд", + "{{count}} result available_one": "Доступний 1 результат", + "{{count}} result available_other": "Доступно {{count}} результатів", + "Equal columns": "Рівні колонки", + "Left sidebar": "Ліва бічна панель", + "Right sidebar": "Права бічна панель", + "Wide center": "Широка центральна колонка", + "Left wide": "Широка ліва колонка", + "Right wide": "Широка права колонка", + "Names do not match": "Назви не збігаються", + "Today, {{time}}": "Сьогодні, {{time}}", + "Yesterday, {{time}}": "Вчора, {{time}}", + "now": "зараз", + "Space created successfully": "Простір успішно створено", + "Space updated successfully": "Простір успішно оновлено", + "Space deleted successfully": "Простір успішно видалено", + "Members added successfully": "Учасників успішно додано", + "Member removed successfully": "Учасника успішно видалено", + "Member role updated successfully": "Роль учасника успішно оновлено", + "Created by: {{creatorName}}": "Створено: {{creatorName}}", + "Created at: {{time}}": "Створено: {{time}}", + "Edited by {{name}} {{time}}": "Змінено {{name}} {{time}}", + "Word count: {{wordCount}}": "Кількість слів: {{wordCount}}", + "Character count: {{characterCount}}": "Кількість символів: {{characterCount}}", + "New update": "Нове оновлення", + "{{latestVersion}} is available": "Доступна версія {{latestVersion}}", + "Default page edit mode": "Режим редагування сторінки за замовчуванням", + "Choose your preferred page edit mode. Avoid accidental edits.": "Виберіть бажаний режим редагування сторінки. Уникайте випадкових редагувань.", + "Choose {{format}} file": "Виберіть файл {{format}}", + "Reading": "Читання", + "Delete member": "Видалити учасника", + "Member deleted successfully": "Учасника успішно видалено", + "Are you sure you want to delete this workspace member? This action is irreversible.": "Ви впевнені, що хочете видалити цього учасника робочої області? Ця дія незворотна.", + "Deactivate member": "Деактивувати учасника", + "Activate member": "Активувати учасника", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "Ви впевнені, що хочете деактивувати цього учасника робочого простору? Вони більше не зможуть отримати доступ до цього робочого простору.", + "Are you sure you want to activate this workspace member?": "Ви впевнені, що хочете активувати цього учасника робочого простору?", + "Deactivate": "Деактивувати", + "Activate": "Активувати", + "Deactivated": "Деактивовано", + "Move": "Перемістити", + "Move page": "Перемістити сторінку", + "Move page to a different space.": "Перемістити сторінку в інший простір.", + "Real-time editor connection lost. Retrying...": "З'єднання з редактором у реальному часі втрачено. Повторна спроба...", + "Table of contents": "Зміст", + "Add headings (H1, H2, H3) to generate a table of contents.": "Додайте заголовки (H1, H2, H3), щоб створити зміст.", + "Share": "Поділитися", + "Public sharing": "Публічний доступ", + "Shared by": "Поділився", + "Shared at": "Поділено", + "Inherits public sharing from": "Успадковує публічний доступ від", + "Share to web": "Опублікувати в інтернеті", + "Shared to web": "Опубліковано в інтернеті", + "Anyone with the link can view this page": "Будь-хто, хто має посилання, може переглядати цю сторінку", + "Make this page publicly accessible": "Зробити цю сторінку публічно доступною", + "Include sub-pages": "Включити підсторінки", + "Make sub-pages public too": "Зробити підсторінки також публічними", + "Allow search engines to index page": "Дозволити пошуковим системам індексувати сторінку", + "Open page": "Відкрити сторінку", + "Page": "Сторінка", + "Delete public share link": "Видалити публічне посилання", + "Delete share": "Видалити спільний доступ", + "Are you sure you want to delete this shared link?": "Ви впевнені, що хочете видалити це посилання спільного доступу?", + "Publicly shared pages from spaces you are a member of will appear here": "Тут з’являться публічно поширені сторінки з просторів, учасником яких ви є", + "Share deleted successfully": "Спільний доступ успішно видалено", + "Share not found": "Спільний доступ не знайдено", + "Failed to share page": "Не вдалося надати спільний доступ до сторінки", + "Disable public sharing": "Вимкнути публічний доступ", + "Prevent members from sharing pages publicly.": "Перешкодити учасникам публічно ділитися сторінками.", + "Toggle public sharing": "Перемикання публічного доступу", + "Toggle space public sharing": "Перемикання публічного доступу до просторів", + "Allow viewers to comment": "Дозволити глядачам коментувати", + "Allow viewers to add comments on pages in this space.": "Дозволити глядачам додавати коментарі на сторінках у цьому просторі.", + "Toggle viewer comments": "Увімкнути або вимкнути коментарі глядачів", + "Public sharing is disabled at the workspace level": "Публічний доступ вимкнуто на рівні робочого простору", + "Prevent pages in this space from being shared publicly.": "Перешкодити публічному поширенню сторінок у цьому просторі.", + "Page permissions": "Права доступу до сторінки.", + "Control who can view and edit individual pages. Available with an enterprise license.": "Керуйте тим, хто може переглядати та редагувати окремі сторінки. Доступно з корпоративною ліцензією.", + "Enable public sharing": "Увімкнути публічний доступ", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "Ви впевнені, що хочете увімкнути публічний доступ? Учасники зможуть публічно ділитися сторінками.", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "Ви впевнені, що хочете вимкнути публічний доступ? Усі існуючі посилання для спільного доступу в цьому робочому просторі будуть видалені.", + "Are you sure you want to enable public sharing for this space?": "Ви впевнені, що хочете увімкнути публічний доступ для цього простору?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "Ви впевнені, що хочете вимкнути публічний доступ? Усі існуючі посилання для спільного доступу в цьому просторі будуть видалені.", + "Public sharing is disabled": "Публічний доступ вимкнуто", + "Public sharing has been disabled at the workspace level.": "Публічний доступ було вимкнено на рівні робочого простору.", + "Public sharing has been disabled for this space.": "Публічний доступ було вимкнено для цього простору.", + "Copy page": "Копіювати сторінку", + "Copy page to a different space.": "Скопіювати сторінку в інший простір.", + "Page copied successfully": "Сторінку успішно скопійовано", + "Page duplicated successfully": "Сторінку успішно дубльовано", + "Find": "Знайти", + "Not found": "Не знайдено", + "Previous Match (Shift+Enter)": "Попередній збіг (Shift+Enter)", + "Next match (Enter)": "Наступний збіг (Enter)", + "Match case (Alt+C)": "Враховувати регістр (Alt+C)", + "Replace": "Замінити", + "Close (Escape)": "Закрити (Escape)", + "Replace (Enter)": "Замінити (Enter)", + "Replace all (Ctrl+Alt+Enter)": "Замінити все (Ctrl+Alt+Enter)", + "Replace all": "Замінити все", + "View all": "Переглянути все", + "View all spaces": "Переглянути всі простори", + "Error": "Помилка", + "Failed to disable MFA": "Не вдалося вимкнути MFA", + "Disable two-factor authentication": "Вимкнути двофакторну автентифікацію", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "Вимкнення двоетапної аутентифікації зробить ваш обліковий запис менш захищеним. Для входу потрібен лише пароль.", + "Please enter your password to disable two-factor authentication:": "Будь ласка, введіть свій пароль, щоб вимкнути двоетапну аутентифікацію:", + "Two-factor authentication has been enabled": "Двофакторну автентифікацію ввімкнено", + "Two-factor authentication has been disabled": "Двофакторну автентифікацію вимкнено", + "2-step verification": "Двоетапна перевірка", + "Protect your account with an additional verification layer when signing in.": "Захистіть свій обліковий запис за допомогою додаткового шару перевірки при вході.", + "Two-factor authentication is active on your account.": "Двоетапну аутентифікацію активовано у вашому обліковому записі.", + "Add 2FA method": "Додати метод 2FA", + "Backup codes": "Резервні коди", + "Disable": "Вимкнути", + "Invalid verification code": "Недійсний код перевірки", + "New backup codes have been generated": "Нові резервні коди згенеровано", + "Failed to regenerate backup codes": "Не вдалося повторно згенерувати резервні коди", + "About backup codes": "Про резервні коди", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Резервні коди можуть бути використані для доступу до вашого облікового запису, якщо ви втратите доступ до додатку аутентифікатора. Кожен код можна використовувати лише один раз.", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "Ви можете повторно створити нові резервні коди в будь-який час. Це зробить усі існуючі коди недійсними.", + "Confirm password": "Підтвердьте пароль", + "Generate new backup codes": "Згенерувати нові резервні коди", + "Save your new backup codes": "Збережіть нові резервні коди", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "Обов'язково збережіть ці коди у безпечному місці. Ваші старі резервні коди більше не дійсні.", + "Your new backup codes": "Ваші нові резервні коди", + "I've saved my backup codes": "Я зберіг(-ла) свої резервні коди", + "Failed to setup MFA": "Не вдалося налаштувати MFA", + "Setup & Verify": "Налаштувати й підтвердити", + "Add to authenticator": "Додати до застосунку автентифікації", + "1. Scan this QR code with your authenticator app": "1. Відскануйте цей QR-код за допомогою застосунку автентифікації", + "Can't scan the code?": "Не можете відсканувати код?", + "Enter this code manually in your authenticator app:": "Введіть цей код вручну у додатку аутентифікатора:", + "2. Enter the 6-digit code from your authenticator": "2. Введіть 6-значний код із застосунку автентифікації", + "Verify and enable": "Підтвердити й увімкнути", + "Failed to generate QR code. Please try again.": "Не вдалося створити QR-код. Будь ласка, спробуйте ще раз.", + "Backup": "Резервний", + "Save codes": "Зберегти коди", + "Save your backup codes": "Збережіть свої резервні коди", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "Ці коди можуть бути використані для доступу до вашого облікового запису, якщо ви втратите доступ до додатку аутентифікатора. Кожен код можна використовувати лише один раз.", + "Print": "Друк", + "Two-factor authentication has been set up. Please log in again.": "Двоетапну аутентифікацію налаштовано. Будь ласка, увійдіть знову.", + "Two-Factor authentication required": "Потрібна двофакторна автентифікація", + "Your workspace requires two-factor authentication for all users": "Ваш робочий простір вимагає двофакторну автентифікацію для всіх користувачів", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "Щоб продовжити доступ до робочого простору, вам потрібно налаштувати двоетапну аутентифікацію. Це додає додатковий шар захисту до вашого облікового запису.", + "Set up two-factor authentication": "Налаштувати двофакторну автентифікацію", + "Cancel and logout": "Скасувати й вийти", + "Your workspace requires two-factor authentication. Please set it up to continue.": "Ваш робочий простір вимагає двоетапної аутентифікації. Будь ласка, налаштуйте це щоб продовжити.", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "Це додає додатковий шар захисту до вашого облікового запису, вимагаючи код підтвердження з вашого додатку аутентифікатора.", + "Password is required": "Пароль обов’язковий", + "Password must be at least 8 characters": "Пароль має містити щонайменше 8 символів", + "Please enter a 6-digit code": "Будь ласка, введіть 6-значний код", + "Code must be exactly 6 digits": "Код має містити рівно 6 цифр", + "Enter the 6-digit code found in your authenticator app": "Введіть 6-значний код із застосунку автентифікації", + "Need help authenticating?": "Потрібна допомога з аутентифікацією?", + "MFA QR Code": "QR-код MFA", + "Account created successfully. Please log in to set up two-factor authentication.": "Обліковий запис успішно створено. Будь ласка, увійдіть, щоб налаштувати двоетапну аутентифікацію.", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "Скидання паролю успішне. Будь ласка, увійдіть за допомогою нового паролю та завершіть двоетапну аутентифікацію.", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "Скидання паролю успішне. Будь ласка, увійдіть за допомогою нового паролю, щоб налаштувати двоетапну аутентифікацію.", + "Password reset was successful. Please log in with your new password.": "Скидання паролю успішне. Будь ласка, увійдіть за допомогою нового паролю.", + "Two-factor authentication": "Двофакторна автентифікація", + "Use authenticator app instead": "Натомість використати застосунок автентифікації", + "Verify backup code": "Підтвердити резервний код", + "Use backup code": "Використати резервний код", + "Enter one of your backup codes": "Введіть один зі своїх резервних кодів", + "Backup code": "Резервний код", + "Enter one of your backup codes. Each backup code can only be used once.": "Введіть один з ваших резервних кодів. Кожен резервний код можна використовувати лише один раз.", + "Verify": "Підтвердити", + "Trash": "Кошик", + "Pages in trash will be permanently deleted after {{count}} days.": "Сторінки в кошику будуть остаточно видалені через {count, plural, one{# день} few{# дні} many{# днів} other{# дня}}.", + "Deleted": "Видалено", + "No pages in trash": "У кошику немає сторінок", + "Permanently delete page?": "Остаточно видалити сторінку?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "Ви впевнені, що хочете остаточно видалити '{{title}}'? Цю дію не можна скасувати.", + "Restore '{{title}}' and its sub-pages?": "Відновити '{{title}}' та її підсторінки?", + "Move to trash": "Перемістити в кошик", + "Move this page to trash?": "Перемістити цю сторінку до кошика?", + "Restore page": "Відновити сторінку", + "Permanently delete": "Видалити назавжди", + "{{name}} moved this page to Trash {{time}}.": "{{name}} перемістив цю сторінку до кошика {{time}}.", + "Page moved to trash": "Сторінку переміщено в кошик", + "Page restored successfully": "Сторінку успішно відновлено", + "Deleted by": "Видалив", + "Deleted at": "Видалено", + "Preview": "Попередній перегляд", + "Base preview unavailable": "Попередній перегляд бази недоступний", + "Restore this base to view its contents.": "Відновіть цю базу, щоб переглянути її вміст.", + "Subpages": "Підсторінки", + "Failed to load subpages": "Не вдалося завантажити підсторінки", + "No subpages": "Немає підсторінок", + "Subpages (Child pages)": "Підсторінки (дочірні сторінки)", + "List all subpages of the current page": "Показати всі підсторінки поточної сторінки", + "Attachments": "Вкладення", + "All spaces": "Усі простори", + "Unknown": "Невідомо", + "Find a space": "Знайти простір", + "Search in all your spaces": "Шукати в усіх ваших просторах", + "Type": "Тип", + "Enterprise": "Enterprise", + "Download attachment": "Завантажити вкладення", + "Allowed email domains": "Дозволені домени електронної пошти", + "Only users with email addresses from these domains can signup via SSO.": "Лише користувачі з адресами електронної пошти з цих доменів можуть зареєструватися через SSO.", + "Enter valid domain names separated by comma or space": "Введіть дійсні доменні імена, розділені комою або пробілом", + "Enforce two-factor authentication": "Зробити двофакторну автентифікацію обов’язковою", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "Після увімкнення всі учасники повинні ввімкнути двофакторну автентифікацію для доступу до робочого простору.", + "Toggle MFA enforcement": "Перемкнути обов’язковість MFA", + "Display name": "Ім’я для відображення", + "Allow signup": "Дозволити реєстрацію", + "Enabled": "Увімкнено", + "Advanced Settings": "Розширені налаштування", + "Enable TLS/SSL": "Увімкнути TLS/SSL", + "Use secure connection to LDAP server": "Використовувати захищене з’єднання з сервером LDAP", + "Group sync": "Синхронізація груп", + "No SSO providers found.": "Постачальників SSO не знайдено.", + "Delete SSO provider": "Видалити постачальника SSO", + "Are you sure you want to delete this SSO provider?": "Ви впевнені, що хочете видалити цього постачальника SSO?", + "Action": "Дія", + "{{ssoProviderType}} configuration": "Конфігурація {{ssoProviderType}}", + "Icon": "Значок", + "Upload image": "Завантажити зображення", + "Remove image": "Видалити зображення", + "Failed to remove image": "Не вдалося видалити зображення", + "Image exceeds 10MB limit.": "Зображення має займати менше, ніж 10 МБ.", + "Image removed successfully": "Зображення видалено", + "API key": "Ключ API", + "API keys": "Ключі API", + "API management": "Управління API", + "Custom expiration date": "Користувацька дата закінчення", + "Enter a descriptive token name": "Введіть описову назву токена", + "Expiration": "Термін дії", + "Expired": "Закінчився", + "Expires": "Закінчується", + "Last use": "Останнє використання", + "No API keys found": "Ключі API не знайдено", + "No expiration": "Без терміну дії", + "Revoked successfully": "Успішно відкликано", + "Select expiration date": "Виберіть дату закінчення", + "This action cannot be undone. Any applications using this API key will stop working.": "Цю дію не можна скасувати. Будь-які додатки, що використовують цей ключ API, перестануть працювати.", + "Update": "Оновити", + "Update {{credential}}": "Оновити {{credential}}", + "Manage API keys for all users in the workspace": "Керувати ключами API для всіх користувачів у робочій області", + "Restrict API key creation to admins": "Обмежити створення API-ключів лише для адміністраторів", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "Тільки адміністратори та власники можуть створювати нові API-ключі. Існуючі ключі учасників і надалі працюватимуть.", + "Toggle restrict API keys to admins": "Увімкнути або вимкнути обмеження створення API-ключів лише для адміністраторів", + "API key creation is restricted to admins by your workspace administrator.": "Створення API-ключів дозволено лише адміністраторам за налаштуванням адміністратора робочого простору.", + "AI settings": "Налаштування ШІ", + "AI search": "Пошук з ШІ", + "AI Answer": "Відповідь ШІ", + "Ask AI": "Запитати ШІ", + "AI is thinking...": "ШІ думає...", + "Thinking": "Думаю", + "Ask a question...": "Задайте питання...", + "AI Answers": "Відповіді ШІ", + "AI-powered search (AI Answers)": "Пошук на базі ШІ (Відповіді ШІ)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "Пошук з ШІ використовує векторні вбудовування для надання можливостей семантичного пошуку у вашому робочому вмісті.", + "Toggle AI search": "Переключити пошук з ШІ", + "Generative AI (Ask AI)": "Генеративний ШІ (Запитати ШІ)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "Увімкнути генерацію контенту за допомогою ШІ в редакторі. Дозволяє користувачам генерувати, покращувати, перекладати та трансформувати текст.", + "Toggle generative AI": "Переключити генеративний ШІ", + "Upgrade your plan": "Оновіть свій тарифний план", + "Available with a paid license": "Доступно за платною ліцензією", + "Upgrade your license tier.": "Оновіть рівень своєї ліцензії.", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "ШІ доступний у платних редакціях Docmost. Зверніться до sales@docmost.com.", + "AI & MCP": "ШІ та MCP", + "AI": "ШІ", + "MCP": "MCP", + "Model Context Protocol (MCP)": "Протокол контексту моделі (MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "Увімкніть MCP‑сервер, щоб дозволити ШІ‑помічникам та інструментам взаємодіяти з вмістом вашого робочого простору.", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP доступний лише в корпоративній редакції Docmost. Зверніться до sales@docmost.com.", + "MCP Server URL": "URL сервера MCP", + "Connect AI assistants with your Docmost account via OAuth.": "Підключайте AI-асистентів до свого облікового запису Docmost через OAuth.", + "Enforce OAuth": "Зробити OAuth обов’язковим", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI-асистенти повинні підключатися до облікового запису Docmost через OAuth. Ключі API не можна використовувати з MCP-сервером.", + "Toggle enforce OAuth for MCP": "Увімкнути обов’язковий OAuth для MCP", + "Supported tools": "Підтримувані інструменти", + "MCP server URL:": "URL сервера MCP:", + "Learn more": "Дізнатися більше", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "Керуйте ключами API для всіх користувачів у робочому просторі. Перегляньте документацію API для деталей використання.", + "View the API documentation for usage details.": "Перегляньте документацію API для деталей використання.", + "View the MCP documentation.": "Перегляньте документацію MCP.", + "Sources": "Джерела", + "AI Answers not available for attachments": "Відповіді ШІ недоступні для вкладень", + "No answer available": "Відповідь недоступна", + "Background color": "Колір фону", + "Highlight color": "Колір підсвічування", + "Remove color": "Видалити колір", + "Notifications": "Сповіщення", + "No notifications": "Немає сповіщень", + "No unread notifications": "Немає непрочитаних сповіщень", + "All notifications": "Усі сповіщення", + "Unread only": "Тільки непрочитані", + "Mark all as read": "Позначити все як прочитане", + "Mark as read": "Позначити як прочитане", + "More options": "Більше опцій", + "{{name}} mentioned you in a comment": "{{name}} згадав вас у коментарі", + "{{name}} commented on a page": "{{name}} залишив коментар на сторінці", + "{{name}} resolved a comment": "{{name}} позначив(-ла) коментар як вирішений", + "{{name}} mentioned you on a page": "{{name}} згадав(-ла) вас на сторінці", + "{{name}} gave you edit access to a page": "{{name}} надав(-ла) вам доступ до редагування сторінки", + "{{name}} gave you view access to a page": "{{name}} надав(-ла) вам доступ до перегляду сторінки", + "{{name}} updated a page": "{{name}} оновив(-ла) сторінку", + "Watch page": "Стежити за сторінкою", + "Stop watching": "Припинити стежити", + "Watch space": "Стежити за простором", + "Stop watching space": "Припинити стежити за простором", + "Email notifications": "Сповіщення електронною поштою", + "Page updates": "Оновлення сторінки", + "Get notified when pages you watch are updated.": "Отримуйте сповіщення, коли сторінки, за якими ви стежите, оновлюються.", + "Page mentions": "Згадки на сторінці", + "Get notified when someone mentions you on a page.": "Отримуйте сповіщення, коли хтось згадує вас на сторінці.", + "Comment mentions": "Згадки у коментарях", + "Get notified when someone mentions you in a comment.": "Отримуйте сповіщення, коли хтось згадує вас у коментарі.", + "New comments": "Нові коментарі", + "Get notified about new comments on threads you participate in.": "Отримуйте сповіщення про нові коментарі у темах, у яких ви берете участь.", + "Resolved comments": "Вирішені коментарі", + "Get notified when your comment is resolved.": "Отримайте сповіщення, коли ваш коментар вирішено.", + "You are now watching this page": "Ви зараз стежите за цією сторінкою", + "You are no longer watching this page": "Ви більше не стежите за цією сторінкою", + "You are now watching this space": "Тепер ви стежите за цим простором", + "You are no longer watching this space": "Ви більше не стежите за цим простором", + "Direct": "Прямі", + "Updates": "Оновлення", + "Today": "Сьогодні", + "Yesterday": "Вчора", + "This week": "Цього тижня", + "Older": "Старіші", + "Restricted page": "Сторінка з обмеженим доступом", + "Restricted pages cannot be shared publicly.": "Сторінки з обмеженим доступом не можна робити загальнодоступними.", + "Restricted by parent": "Обмежено батьківською сторінкою", + "Restricted": "Обмежено", + "Open": "Відкрита", + "Inherits restrictions from ancestor page": "Наслідує обмеження від батьківської сторінки", + "Only people listed below can access this page": "Доступ до цієї сторінки мають лише люди, вказані нижче.", + "Everyone in this space can access": "Усі в цьому просторі мають доступ", + "No additional restrictions on this page": "Додаткових обмежень на цій сторінці немає.", + "Only specific people can access": "Доступ мають лише конкретні особи.", + "Use only inherited restrictions": "Використовувати лише успадковані обмеження", + "Add restrictions on top of inherited": "Додати обмеження поверх успадкованих", + "Inherited restriction": "Успадковане обмеження", + "Access limited by": "Доступ обмежено через", + "Restrict access to control who can view and edit this page": "Обмежте доступ, щоб контролювати, хто може переглядати та редагувати цю сторінку.", + "Add additional restrictions specific to this page": "Додати додаткові обмеження для цієї сторінки.", + "Access": "Доступ", + "People with access": "Особи з доступом", + "Remove all": "Видалити все", + "Remove access": "Видалити доступ", + "Remove all access": "Видалити весь доступ", + "Are you sure you want to remove this member's access to the page?": "Ви впевнені, що хочете видалити доступ цього учасника до сторінки?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "Ви впевнені, що хочете видалити всі індивідуальні дозволи доступу? Це зробить сторінку доступною для всіх у просторі.", + "Trash retention": "Термін зберігання у кошику", + "Pages in trash will be permanently deleted after this period.": "Сторінки в кошику будуть остаточно видалені після цього періоду.", + "Trash retention updated": "Термін зберігання у кошику оновлено", + "Failed to update trash retention": "Не вдалося оновити термін зберігання у кошику", + "Removed page restriction": "Обмеження сторінки видалено", + "Added page permission": "Додано дозвіл на сторінку", + "Removed page permission": "Дозвіл на сторінку видалено", + "Changed page permission": "Змінено дозволи сторінки", + "Requested password reset": "Запитано скидання пароля", + "Created template": "Створено шаблон", + "Deleted template": "Видалено шаблон", + "day": "день", + "days": "дні", + "week": "тиждень", + "weeks": "тижні", + "month": "місяць", + "months": "місяці", + "year": "рік", + "years": "роки", + "Period": "Період", + "Fixed date": "Фіксована дата", + "Indefinitely": "Безстроково", + "Days": "Дні", + "Weeks": "Тижні", + "Months": "Місяці", + "Years": "Роки", + "Pick a date": "Виберіть дату", + "Maximum is {{max}} {{unit}} for this unit": "Максимум для цієї одиниці — {{max}} {{unit}}", + "Never expires. Verifiers can re-verify at any time.": "Термін дії не спливає. Верифікатори можуть повторно перевірити будь-коли.", + "Verified": "Перевірено", + "Review needed": "Потрібен перегляд", + "Verification expired": "Термін перевірки сплив", + "Draft": "Чернетка", + "In Approval": "На погодженні", + "In approval": "На погодженні", + "Approved": "Погоджено", + "Obsolete": "Застаріло", + "Expiring": "Термін дії спливає", + "Set up verification": "Налаштувати перевірку", + "Verify page": "Перевірити сторінку", + "Page verification": "Перевірка сторінки", + "Add verification": "Додати перевірку", + "Edit verification": "Редагувати перевірку", + "Search by title": "Пошук за назвою", + "Choose how this page should stay accurate.": "Виберіть, як підтримувати актуальність цієї сторінки.", + "Recurring verification": "Регулярна перевірка", + "Verifiers re-confirm this page on a schedule.": "Верифікатори повторно підтверджують цю сторінку за розкладом.", + "Re-verify on a schedule (e.g every 30 days )": "Повторно перевіряти за розкладом (наприклад, кожні 30 днів)", + "Page stays editable at all times": "Сторінка залишається доступною для редагування в будь-який час", + "Best for runbooks, FAQs, living documentation": "Найкраще підходить для runbook-ів, FAQ і живої документації", + "Approval workflow": "Процес погодження", + "Formal document lifecycle with named approvers.": "Формальний життєвий цикл документа з призначеними погоджувачами.", + "Draft → In approval → Approved → Obsolete": "Чернетка → На погодженні → Погоджено → Застаріло", + "Locked once approved, with full history": "Після погодження блокується, із повною історією", + "Designed for ISO 9001, ISO 13485, and FDA": "Призначено для ISO 9001, ISO 13485 та FDA", + "Best for SOPs and controlled documents": "Найкраще підходить для SOP і контрольованих документів", + "Back": "Назад", + "Quality management": "Управління якістю", + "Recurring": "Регулярна", + "Pages move through draft, approval, and approved stages.": "Сторінки проходять стадії чернетки, погодження та погодженого документа.", + "Verifiers": "Верифікатори", + "Add verifier": "Додати верифікатора", + "I've reviewed this page for accuracy": "Я перевірив(ла) цю сторінку на точність", + "Set up": "Налаштувати", + "Remove verification": "Видалити перевірку", + "Are you sure you want to remove verification from this page?": "Ви впевнені, що хочете видалити перевірку з цієї сторінки?", + "Assigned verifiers must periodically re-verify this page.": "Призначені верифікатори мають періодично повторно перевіряти цю сторінку.", + "Last verified by {{name}} {{time}} (expired)": "Востаннє перевірив(-ла) {{name}} {{time}} (термін дії сплив)", + "The fixed expiration date has passed.": "Фіксована дата завершення вже минула.", + "Verified by {{name}} {{time}}": "Перевірено: {{name}} {{time}}", + "Expires {{date}}": "Термін дії спливає {{date}}", + "Expired {{date}}": "Термін дії сплив {{date}}", + "Mark as obsolete": "Позначити як застаріле", + "Mark obsolete": "Позначити як застаріле", + "Returned by {{name}} {{time}}": "Повернуто: {{name}} {{time}}", + "No approval has been requested yet.": "Запит на погодження ще не було надіслано.", + "Submitted by {{name}} {{time}}": "Надіслано: {{name}} {{time}}", + "Someone": "Хтось", + "Approved by {{name}} {{time}}": "Погоджено: {{name}} {{time}}", + "This document has been marked as obsolete.": "Цей документ позначено як застарілий.", + "Rejection comment": "Коментар щодо відхилення", + "Reason for returning this document...": "Причина повернення цього документа...", + "Confirm rejection": "Підтвердити відхилення", + "Submit for approval": "Надіслати на погодження", + "Reject": "Відхилити", + "Approve": "Погодити", + "Re-submit for approval": "Повторно надіслати на погодження", + "Verified until": "Перевірено до", + "QMS": "QMS", + "Verified pages": "Перевірені сторінки", + "Search pages...": "Шукати сторінки...", + "Filter by space": "Фільтрувати за простором", + "Filter by type": "Фільтрувати за типом", + "{{name}} verified a page": "{{name}} перевірив(-ла) сторінку", + "{{name}} submitted a page for your approval": "{{name}} надіслав(-ла) сторінку вам на погодження", + "{{name}} returned a page for revision": "{{name}} повернув(-ла) сторінку на доопрацювання", + "Page verification expires soon": "Термін перевірки сторінки скоро спливає", + "Page verification has expired": "Термін перевірки сторінки сплив", + "SIEM destination {{name}} is failing": "Збій у призначенні SIEM {{name}}", + "SIEM destination {{name}} was disabled after 24 hours of failures": "Призначення SIEM {{name}} було вимкнено після 24 годин збоїв", + "SIEM destination {{name}} recovered": "Роботу призначення SIEM {{name}} відновлено", + "Verifying your email": "Перевірка вашої електронної пошти", + "Please wait...": "Будь ласка, зачекайте...", + "Verification failed. The link may have expired.": "Підтвердження не вдалося. Посилання могло втратити чинність.", + "Check your email": "Перевірте свою електронну пошту", + "We sent a verification link to {{email}}.": "Ми надіслали посилання для підтвердження на {{email}}.", + "We sent a verification link to your email.": "Ми надіслали посилання для підтвердження на вашу електронну пошту.", + "Click the link to verify your email and access your workspace.": "Клікніть на посилання, щоб підтвердити електронну пошту та отримати доступ до робочого простору.", + "Resend verification email": "Повторно надіслати лист для підтвердження", + "Verification email sent. Please check your inbox.": "Лист для підтвердження надіслано. Будь ласка, перевірте свою скриньку.", + "Failed to resend verification email. Please try again.": "Не вдалося повторно надіслати лист для підтвердження. Будь ласка, спробуйте ще раз.", + "We've sent you an email with your associated workspaces.": "Ми надіслали вам лист із переліком пов’язаних робочих просторів.", + "Load more": "Завантажити більше", + "Log out of all devices": "Вийти на всіх пристроях", + "Log out of all sessions except this device": "Вийти з усіх сеансів, крім цього пристрою", + "This Device": "Цей пристрій", + "Unknown device": "Невідомий пристрій", + "No active sessions": "Немає активних сеансів", + "Session revoked": "Сеанс відкликано", + "All other sessions revoked": "Усі інші сеанси відкликано", + "Last used": "Останнє використання", + "Created": "Створено", + "Rename": "Перейменувати", + "Publish": "Опублікувати", + "Security": "Безпека", + "Enforce SSO": "Зробити SSO обов’язковим", + "Once enforced, members will not be able to login with email and password.": "Після ввімкнення учасники не зможуть входити за допомогою електронної пошти та пароля.", + "AI-generated content may not be accurate.": "Вміст, згенерований ШІ, може бути неточним.", + "AI Chat": "AI-чат", + "Analyze for insights": "Проаналізувати для отримання висновків", + "Ask anything...": "Запитайте що завгодно...", + "Assistant said:": "Помічник сказав:", + "Chat history": "Історія чатів", + "Chat name": "Назва чату", + "Chat transcript": "Стенограма чату", + "Close": "Закрити", + "Copy assistant response": "Копіювати відповідь помічника", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "Не вдалося завантажити чат. Сталася помилка.", + "Failed to render this message.": "Не вдалося відобразити це повідомлення.", + "How can I help you today?": "Чим я можу допомогти вам сьогодні?", + "New chat": "Новий чат", + "No chat history": "Немає історії чатів", + "No chats found": "Чатів не знайдено", + "No conversations yet": "Розмов поки немає", + "Open full page": "Відкрити повну сторінку", + "Scroll to bottom": "Прокрутити вниз", + "You said:": "Ви сказали:", + "Previous 7 days": "Попередні 7 днів", + "Previous 30 days": "Попередні 30 днів", + "Search chats...": "Шукати чати...", + "Search chats": "Шукати чати", + "Ask anything... Use @ to mention pages": "Запитайте будь-що... Використовуйте @, щоб згадувати сторінки", + "Ask anything or search your workspace": "Запитайте будь-що або шукайте у своєму робочому просторі", + "Welcome to {{name}}": "Ласкаво просимо до {{name}}", + "Add files": "Додати файли", + "Mention a page": "Згадати сторінку", + "Start a new chat to see it here.": "Почніть новий чат, щоб побачити його тут.", + "Summarize this page": "Підсумувати цю сторінку", + "Toggle AI Chat": "Перемкнути AI-чат", + "Translate this page": "Перекласти цю сторінку", + "Try a different search term.": "Спробуйте інший пошуковий запит.", + "Try again": "Спробувати ще раз", + "Untitled chat": "Чат без назви", + "What can I help you with?": "Чим я можу вам допомогти?", + "Are you sure you want to revoke this {{credential}}": "Ви впевнені, що хочете відкликати цей {{credential}}", + "Automatically provision users and groups from your identity provider via SCIM.": "Автоматично надавайте користувачів і групи від вашого постачальника ідентифікації через SCIM.", + "Configure your identity provider with this URL to provision users and groups.": "Налаштуйте свого постачальника ідентифікації за допомогою цієї URL-адреси для надання користувачів і груп.", + "Create {{credential}}": "Створити {{credential}}", + "{{credential}} created": "{{credential}} створено", + "{{credential}} created successfully": "{{credential}} успішно створено", + "Created by": "Створено", + "Custom": "Користувацький", + "Enable SCIM": "Увімкнути SCIM", + "Enter a descriptive name": "Введіть описову назву", + "I've saved my {{credential}}": "Я зберіг(ла) свій {{credential}}", + "Important": "Важливо", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "Обов’язково скопіюйте свій {{credential}} зараз. Ви більше не зможете побачити його знову!", + "Never": "Ніколи", + "Revoke {{credential}}": "Відкликати {{credential}}", + "SCIM endpoint URL": "URL-адреса кінцевої точки SCIM", + "SCIM provisioning": "Надання SCIM", + "SCIM takes precedence over SSO group sync while enabled.": "SCIM має пріоритет над синхронізацією груп SSO, коли його ввімкнено.", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "Ви досягли максимальної кількості токенів SCIM: {{max}}. Видаліть наявний токен, щоб створити новий.", + "SCIM token": "Токен SCIM", + "SCIM tokens": "Токени SCIM", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "Цю дію не можна скасувати. Ваш постачальник ідентифікації негайно припинить синхронізацію.", + "Toggle SCIM provisioning": "Перемкнути надання SCIM", + "Token": "Токен", + "Page menu": "Меню сторінки", + "Expand": "Розгорнути", + "Collapse": "Згорнути", + "Comment menu": "Меню коментаря", + "Group menu": "Меню групи", + "Show hidden breadcrumbs": "Показати приховані \"хлібні крихти\"", + "Breadcrumbs": "\"Хлібні крихти\"", + "Page actions": "Дії сторінки", + "Pick emoji": "Вибрати емодзі", + "Template menu": "Меню шаблону", + "Use": "Використати", + "Use template": "Використати шаблон", + "Preview template: {{title}}": "Попередній перегляд шаблону: {{title}}", + "Use a template": "Використати шаблон", + "Search templates...": "Шукати шаблони...", + "Search spaces...": "Шукати простори...", + "No templates found": "Шаблони не знайдено", + "No spaces found": "Простори не знайдено", + "Browse all templates": "Переглянути всі шаблони", + "This space": "Цей простір", + "All templates": "Усі шаблони", + "Global": "Глобальний", + "New template": "Новий шаблон", + "Edit template": "Редагувати шаблон", + "Are you sure you want to delete this template?": "Ви впевнені, що хочете видалити цей шаблон?", + "Template scope updated": "Область дії шаблону оновлено", + "Choose which space this template belongs to": "Виберіть, до якого простору належить цей шаблон", + "Only workspace admins can create global templates.": "Лише адміністратори робочого простору можуть створювати глобальні шаблони.", + "You need edit access to this space to create templates.": "Щоб створювати шаблони, вам потрібен доступ до редагування цього простору.", + "Scope": "Область дії", + "Select scope": "Вибрати область дії", + "Title": "Назва", + "Saving...": "Збереження...", + "Saved": "Збережено", + "Save failed. Retry": "Не вдалося зберегти. Повторіть спробу", + "By {{name}}": "Від {{name}}", + "Updated {{time}}": "Оновлено {{time}}", + "Choose destination": "Вибрати місце призначення", + "Search pages and spaces...": "Шукати сторінки та простори...", + "No results found": "Результати не знайдено", + "You don't have permission to create pages here": "У вас немає дозволу на створення сторінок тут", + "Chat menu for {{title}}": "Меню чату для {{title}}", + "API key menu": "Меню ключа API", + "Jump to comment selection": "Перейти до вибору коментаря", + "Slash commands": "Слеш-команди", + "Mention suggestions": "Підказки згадок", + "Link suggestions": "Підказки посилань", + "Diagram editor": "Редактор діаграм", + "Add comment": "Додати коментар", + "Find and replace": "Знайти й замінити", + "Main navigation": "Основна навігація", + "Space navigation": "Навігація простору", + "Settings navigation": "Навігація налаштувань", + "AI navigation": "Навігація AI", + "Breadcrumb": "Хлібна крихта", + "Synced block": "Синхронізований блок", + "Create a block that stays in sync across pages.": "Створіть блок, який синхронізується між сторінками.", + "Editing original": "Редагування оригіналу", + "Copy synced block": "Скопіювати синхронізований блок", + "Unsync": "Скасувати синхронізацію", + "Delete synced block": "Видалити синхронізований блок", + "Synced to {{count}} other page_one": "Синхронізовано з {{count}} іншою сторінкою", + "Synced to {{count}} other page_other": "Синхронізовано з {{count}} іншими сторінками", + "ORIGINAL": "ОРИГІНАЛ", + "THIS PAGE": "ЦЯ СТОРІНКА", + "No pages": "Немає сторінок", + "The original synced block no longer exists": "Оригінальний синхронізований блок більше не існує", + "You don't have access to this synced block": "У вас немає доступу до цього синхронізованого блоку", + "Failed to load this synced block": "Не вдалося завантажити цей синхронізований блок", + "Fixed editor toolbar": "Закріплена панель інструментів редактора", + "Show a formatting toolbar above the editor with quick access to common actions.": "Показувати панель форматування над редактором для швидкого доступу до поширених дій.", + "Toggle fixed editor toolbar": "Перемкнути закріплену панель інструментів редактора", + "Normal text": "Звичайний текст", + "More inline formatting": "Більше вбудованого форматування", + "Subscript": "Нижній індекс", + "Superscript": "Верхній індекс", + "Inline code": "Вбудований код", + "Insert media": "Вставити медіа", + "Mention": "Згадка", + "Emoji": "Емодзі", + "Columns": "Стовпці", + "More inserts": "Більше вставок", + "Embeds": "Вбудовування", + "Diagrams": "Діаграми", + "Advanced": "Додатково", + "Utility": "Службові", + "Decrease indent": "Зменшити відступ", + "Increase indent": "Збільшити відступ", + "Clear formatting": "Очистити форматування", + "Code block": "Блок коду", + "Experimental": "Експериментальне", + "Strikethrough": "Закреслення", + "Undo": "Скасувати", + "Redo": "Повторити", + "Backlinks": "Зворотні посилання", + "Last updated by": "Востаннє оновив", + "Last updated": "Останнє оновлення", + "Stats": "Статистика", + "Word count": "Кількість слів", + "Characters": "Символи", + "Incoming links": "Вхідні посилання", + "Outgoing links": "Вихідні посилання", + "Incoming links ({{count}})": "Вхідні посилання ({{count}})", + "Outgoing links ({{count}})": "Вихідні посилання ({{count}})", + "No pages link here yet.": "Поки що жодна сторінка не посилається сюди.", + "This page doesn't link to other pages yet.": "Ця сторінка ще не містить посилань на інші сторінки.", + "Verified until {{date}}": "Перевірено до {{date}}", + "Labels": "Мітки", + "Add label": "Додати мітку", + "No labels yet": "Міток поки немає", + "Already added": "Уже додано", + "Invalid label name": "Некоректна назва мітки", + "No matches": "Немає збігів", + "Search or create…": "Шукати або створити…", + "Remove label {{name}}": "Видалити мітку {{name}}", + "Failed to add label": "Не вдалося додати мітку", + "Failed to remove label": "Не вдалося видалити мітку", + "No pages with this label": "Немає сторінок із цією міткою", + "Pages tagged with this label will appear here.": "Тут з’являться сторінки, позначені цією міткою.", + "No pages match your search.": "Немає сторінок, що відповідають вашому запиту.", + "Updated {{date}}": "Оновлено {{date}}", + "Cell actions": "Дії з коміркою", + "Column actions": "Дії зі стовпцем", + "Row actions": "Дії з рядком", + "Filter": "Фільтр", + "Page title": "Назва сторінки", + "Page content": "Вміст сторінки", + "Member actions for {{name}}": "Дії учасника для {{name}}", + "Toggle password visibility": "Перемкнути видимість пароля", + "Send comment": "Надіслати коментар", + "Token actions": "Дії з токеном", + "Template settings": "Налаштування шаблону", + "Edit diagram": "Редагувати діаграму", + "Edit embed": "Редагувати вбудований елемент", + "Edit drawing": "Редагувати рисунок", + "Delete equation": "Видалити рівняння", + "Invite actions": "Дії із запрошенням", + "Get started": "Почати", + "* indicates required fields": "* позначає обов’язкові поля", + "List of spaces in this workspace": "Список просторів у цьому робочому просторі", + "Active sessions": "Активні сеанси", + "Add {{name}} to favorites": "Додати {{name}} до обраного", + "Remove {{name}} from favorites": "Видалити {{name}} з обраного", + "Added to favorites": "Додано до обраного", + "Removed from favorites": "Видалено з обраного", + "Added {{name}} to favorites": "{{name}} додано до обраного", + "Removed {{name}} from favorites": "{{name}} видалено з обраного", + "Page menu for {{name}}": "Меню сторінки для {{name}}", + "Create subpage of {{name}}": "Створити підсторінку для {{name}}", + "Allow personal spaces": "Дозволити особисті простори", + "Members can create their own personal space.": "Учасники можуть створювати власний особистий простір.", + "Toggle allow personal spaces": "Перемкнути дозвіл на особисті простори", + "Create personal space": "Створити особистий простір", + "Personal space": "Особистий простір", + "{{name}}'s space": "Простір {{name}}", + "Apply": "Застосувати", + "Cells that aren't already a page reference will be cleared.": "Клітинки, які ще не є посиланням на сторінку, буде очищено.", + "Cells that aren't a valid URL will be cleared.": "Клітинки, які не є дійсною URL-адресою, буде очищено.", + "Cells that aren't a valid email address will be cleared.": "Клітинки, які не є дійсною електронною адресою, буде очищено.", + "Cells that can't be parsed as a date will be cleared.": "Клітинки, які не вдається розпізнати як дату, буде очищено.", + "Cells that can't be parsed as a number will be cleared.": "Клітинки, які не вдається розпізнати як число, буде очищено.", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "Клітинки буде приведено до потрібного формату (yes/true/1 стануть позначеними; усе інше стане непозначеним або буде очищено).", + "Cells will be reinterpreted under the new type.": "Клітинки буде повторно інтерпретовано відповідно до нового типу.", + "Cells will be replaced with a comma-separated list of file names.": "Клітинки буде замінено списком імен файлів, розділених комами.", + "Cells will be replaced with a comma-separated list of option names.": "Клітинки буде замінено списком назв параметрів, розділених комами.", + "Cells will be replaced with the option name.": "Клітинки буде замінено назвою параметра.", + "Cells will be replaced with the page title.": "Клітинки буде замінено заголовком сторінки.", + "Cells will be replaced with the person's name.": "Клітинки буде замінено іменем особи.", + "Change type": "Змінити тип", + "Change type to {{label}}?": "Змінити тип на {{label}}?", + "Converting…": "Перетворення…", + "Existing values become single-item lists. No data is lost.": "Наявні значення стануть одноелементними списками. Дані не буде втрачено.", + "Only the first selected item per row will be kept; the rest will be discarded.": "Для кожного рядка буде збережено лише перший вибраний елемент; решту буде відкинуто.", + "Previous record": "Попередній запис", + "Next record": "Наступний запис", + "Record actions": "Дії із записом", + "Delete record": "Видалити запис", + "Delete record?": "Видалити запис?", + "This action cannot be undone.": "Цю дію неможливо скасувати.", + "to navigate": "для навігації", + "to close": "для закриття", + "Expand row {{number}}": "Розгорнути рядок {{number}}", + "Saving…": "Збереження…", + "Read-only": "Лише читання", + "Loading…": "Завантаження…", + "Updated {{when}}": "Оновлено {{when}}", + "Add property": "Додати властивість", + "Create property": "Створити властивість", + "Hide properties": "Приховати властивості", + "Find a property type": "Знайти тип властивості", + "Properties": "Властивості", + "A property with this name already exists": "Властивість із такою назвою вже існує", + "Add card": "Додати картку", + "Add filter": "Додати фільтр", + "Add option": "Додати опцію", + "Add sort": "Додати сортування", + "Add view": "Додати подання", + "All data in this column will be lost.": "Усі дані в цьому стовпці буде втрачено.", + "Allow multiple people": "Дозволити кількох людей", + "Alphabetize": "За алфавітом", + "Are you sure you want to delete": "Ви впевнені, що хочете видалити", + "Ascending": "За зростанням", + "Base deleted": "Базу видалено", + "Base name": "Назва бази", + "Base table": "Таблиця бази", + "Card properties": "Властивості картки", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Клітинки, довші за обмеження для тексту, буде обрізано, а зайвий вміст буде безповоротно втрачено.", + "Checkbox": "Прапорець", + "Checked by default": "Позначено за замовчуванням", + "Choose a property": "Оберіть властивість", + "Clear selection": "Очистити вибір", + "Column options": "Параметри стовпця", + "Comma, period": "Кома, крапка", + "Complete": "Завершено", + "Contains": "Містить", + "Copy link to view": "Скопіювати посилання на подання", + "Create a status property": "Створити властивість статусу", + "Created at": "Створено", + "Currency": "Валюта", + "Decimal places": "Десяткові знаки", + "Default value": "Значення за замовчуванням", + "Delete property": "Видалити властивість", + "Delete view": "Видалити подання", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "За спаданням", + "Discard": "Скасувати", + "Doesn't contain": "Не містить", + "Done": "Готово", + "Edit formula": "Редагувати формулу", + "Edit property": "Редагувати властивість", + "Export CSV": "Експорт CSV", + "Failed to load base": "Не вдалося завантажити базу", + "False": "Хибність", + "File": "Файл", + "Filter and sort changes are visible only to you": "Зміни фільтрів і сортування видимі лише вам", + "Filter by": "Фільтрувати за", + "Formula": "Формула", + "Get started with": "Почніть із", + "Greater than": "Більше ніж", + "Group by": "Групувати за", + "Group this board by a select or status property.": "Згрупуйте цю дошку за властивістю вибору або статусу.", + "Hide all": "Приховати все", + "Hide group": "Приховати групу", + "In Progress": "У процесі", + "In progress": "У процесі", + "Include time": "Включити час", + "Insert a kanban board on this page": "Вставити канбан-дошку на цю сторінку", + "Insert an inline base on this page": "Вставити вбудовану базу на цю сторінку", + "Is": "Є", + "Is after": "Після", + "Is any of": "Є одним із", + "Is before": "До", + "Is empty": "Порожнє", + "Is none of": "Не є жодним із", + "Is not": "Не є", + "Is not empty": "Не порожнє", + "Is on or after": "У цей день або пізніше", + "Is on or before": "У цей день або раніше", + "Is within": "У межах", + "Keep editing": "Продовжити редагування", + "Last edited at": "Востаннє відредаговано", + "Last edited by": "Востаннє відредагував", + "Less than": "Менше ніж", + "Link copied to clipboard": "Посилання скопійовано в буфер обміну", + "Local": "Локальний", + "Long text": "Довгий текст", + "Moved card to {{column}}": "Картку переміщено до {{column}}", + "Moved column to {{column}}": "Стовпець переміщено до {{column}}", + "Multi-select": "Мультивибір", + "New row": "Новий рядок", + "Next month": "Наступного місяця", + "Next week": "Наступного тижня", + "Next year": "Наступного року", + "No filters applied": "Фільтри не застосовано", + "No match": "Немає збігів", + "No options for this property type": "Немає опцій для цього типу властивості", + "No sorts applied": "Сортування не застосовано", + "No value": "Немає значення", + "None": "Немає", + "Not started": "Не розпочато", + "Number": "Число", + "One month ago": "Місяць тому", + "One month from now": "Через місяць", + "One week ago": "Тиждень тому", + "One week from now": "Через тиждень", + "Open as page": "Відкрити як сторінку", + "Options": "Опції", + "Past month": "За минулий місяць", + "Past week": "За минулий тиждень", + "Past year": "За минулий рік", + "Percent": "Відсоток", + "Period, comma": "Крапка, кома", + "Person": "Особа", + "Please enter a valid email": "Будь ласка, введіть коректну електронну адресу", + "Progress": "Прогрес", + "Property options": "Параметри властивості", + "Relative": "Відносний", + "Rename property": "Перейменувати властивість", + "Reset": "Скинути", + "Save for everyone": "Зберегти для всіх", + "Select": "Вибір", + "Select a property": "Виберіть властивість", + "Select all loaded rows": "Вибрати всі завантажені рядки", + "Show all": "Показати все", + "Sort": "Сортування", + "Sort by": "Сортувати за", + "Space, comma": "Пробіл, кома", + "Space, period": "Пробіл, крапка", + "This board has no grouping property yet.": "Ця дошка ще не має властивості групування.", + "This month": "Цього місяця", + "This year": "Цього року", + "Thousands and decimal separators": "Роздільники тисяч і десяткових знаків", + "Time format": "Формат часу", + "To Do": "До виконання", + "Tomorrow": "Завтра", + "True": "Істина", + "Unsaved changes": "Незбережені зміни", + "Untitled base": "База без назви", + "URL": "URL", + "Value": "Значення", + "View updated for everyone": "Подання оновлено для всіх", + "You have unsaved changes. Do you want to discard them?": "У вас є незбережені зміни. Хочете їх скасувати?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected", + "Compare": "Порівняти", + "Compare versions": "Порівняти версії", + "Select version from {{date}}": "Виберіть версію від {{date}}", + "Version actions for {{date}}": "Дії з версією від {{date}}", + "Comparing {{newer}} and {{older}}": "Порівняння {{newer}} і {{older}}", + "Exit compare": "Вийти з режиму порівняння", + "Search attachments...": "Пошук вкладень...", + "Error loading attachments.": "Помилка завантаження вкладень.", + "No attachments on this page yet.": "На цій сторінці ще немає вкладень.", + "Uploaded by {{name}}": "Завантажено користувачем {{name}}", + "Download {{name}}": "Завантажити {{name}}", + "Access revoked": "Доступ відкликано", + "Authorize application": "Авторизувати застосунок", + "{{name}} wants to access {{workspace}}": "{{name}} хоче отримати доступ до {{workspace}}", + "Not you? Switch account": "Не ви? Змінити обліковий запис", + "This application will be able to:": "Цей застосунок зможе:", + "Write": "Запис", + "Invalid authorization request": "Недійсний запит на авторизацію", + "Authorize": "Авторизувати", + "Application": "Застосунок", + "Permissions": "Дозволи", + "Authorized": "Авторизовано", + "Revoke access": "Відкликати доступ", + "Revoke access for {{name}}": "Відкликати доступ для {{name}}", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "Ви впевнені, що хочете відкликати доступ для {{name}}? Застосунок більше не зможе отримувати доступ до вашого облікового запису.", + "Something went wrong. Please try again.": "Щось пішло не так. Спробуйте ще раз.", + "Remove {{name}}": "Видалити {{name}}", + "Make sure you trust this application before authorizing it.": "Перш ніж авторизувати цей застосунок, переконайтеся, що ви йому довіряєте.", + "You will be redirected to": "Вас буде перенаправлено на", + "View content without making changes.": "Переглядати вміст без внесення змін.", + "Create and modify content.": "Створювати та змінювати вміст.", + "Applications and AI assistants you have authorized to access your account.": "Застосунки та AI-асистенти, яким ви надали дозвіл на доступ до свого облікового запису.", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "У вашому робочому просторі ввімкнено MCP. Підключайте AI-асистентів до свого облікового запису Docmost через OAuth.", + "Authorized apps": "Авторизовані застосунки", + "No authorized apps yet.": "Авторизованих застосунків ще немає.", + "Workspace knowledge only": "Лише знання робочого простору", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "Обмежити AI Chat відповідями лише на основі сторінок вашого робочого простору та завантажених файлів. Зовнішні знання не використовуватимуться.", + "Toggle workspace knowledge only": "Перемкнути режим лише знань робочого простору", + "Read-only mode": "Режим лише читання", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI Chat може шукати та читати вміст робочого простору, але не може створювати або редагувати сторінки.", + "Toggle AI Chat read-only mode": "Перемкнути режим лише читання для AI Chat", + "Title only": "Лише заголовок", + "you": "ви", + "Allow public spaces": "Дозволити публічні простори", + "Space admins can publish their spaces to the web.": "Адміністратори просторів можуть публікувати свої простори в інтернеті.", + "Toggle allow public spaces": "Перемкнути дозвіл на публічні простори", + "Publish space to the web": "Опублікувати простір в інтернеті", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "Будь-хто в інтернеті зможе читати кожну сторінку в цьому просторі, крім обмежених сторінок. Ви впевнені?", + "Make this space publicly readable by anyone on the internet.": "Зробити цей простір публічно доступним для читання будь-ким в інтернеті.", + "Toggle publish space to the web": "Перемкнути публікацію простору в інтернеті", + "Allow search engines to index": "Дозволити пошуковим системам індексувати", + "Let public pages in this space appear in search engine results.": "Дозволити публічним сторінкам у цьому просторі з’являтися в результатах пошуку.", + "Toggle search engine indexing": "Перемкнути індексацію пошуковими системами", + "Public space link": "Публічне посилання на простір", + "Copy public space link": "Скопіювати публічне посилання на простір", + "Renaming the space slug will break public links.": "Перейменування slug простору зламає публічні посилання.", + "Failed to update space": "Не вдалося оновити простір", + "This space is public": "Цей простір є публічним", + "Anyone on the internet can read the pages in this space, except restricted pages.": "Будь-хто в інтернеті може читати сторінки в цьому просторі, крім обмежених сторінок.", + "Open public site": "Відкрити публічний сайт", + "Public": "Публічний", + "This space has no public pages yet.": "У цьому просторі ще немає публічних сторінок.", + "On this page": "На цій сторінці", + "Previous": "Попередня", + "Next": "Далі", + "Show hidden pages": "Показати приховані сторінки", + "Page navigation": "Навігація сторінками", + "Toggle sidebar": "Перемкнути бічну панель", + "Toggle table of contents": "Перемкнути зміст", + "Appearance": "Зовнішній вигляд", + "Forest": "Лісовий", + "Violet": "Фіолетовий", + "Light mode color": "Колір світлого режиму", + "Dark mode color": "Колір темного режиму", + "Choose the primary color of the public docs site.": "Виберіть основний колір публічного сайту документації.", + "Show page author": "Показувати автора сторінки", + "Display the page creator's name on public pages.": "Показувати ім’я автора сторінки на публічних сторінках.", + "Toggle show page author": "Перемкнути показ автора сторінки", + "Show last updated": "Показувати останнє оновлення", + "Display when each page was last updated.": "Показувати, коли кожну сторінку було востаннє оновлено.", + "Toggle show last updated": "Перемкнути показ останнього оновлення", + "Open public page": "Відкрити публічну сторінку", + "Toggle color scheme": "Перемкнути колірну схему", + "Ember": "Жар", + "Rose": "Трояндовий", + "Documentation": "Документація", + "All published spaces.": "Усі опубліковані простори.", + "No public spaces yet.": "Публічних просторів ще немає.", + "Show public directory": "Показувати публічний каталог", + "List published spaces at /docs for anyone to browse.": "Показувати список опублікованих просторів за адресою /docs, щоб кожен міг їх переглядати.", + "Toggle show public directory": "Перемкнути показ публічного каталогу", + "Show in public directory": "Показувати в публічному каталозі", + "List this space in the public directory at /docs.": "Показувати цей простір у публічному каталозі за адресою /docs.", + "Toggle show in public directory": "Перемкнути показ у публічному каталозі", + "Open public space link": "Відкрити публічне посилання на простір", + "Disable public spaces": "Вимкнути публічні простори", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "Адміністратори просторів зможуть зробити свої простори публічно доступними для читання будь-ким в інтернеті. Ви впевнені?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "Це негайно скасує публікацію всіх опублікованих просторів. Повторне ввімкнення пізніше не опублікує їх знову. Ви впевнені?", + "Allow": "Дозволити", + "Shared pages": "Спільні сторінки", + "Published spaces": "Опубліковані простори", + "Spaces published to the web will appear here": "Тут з’являться простори, опубліковані в інтернеті", + "No published spaces": "Немає опублікованих просторів", + "Published by": "Опубліковано", + "Published at": "Опубліковано", + "Open space": "Відкрити простір", + "Unpublish": "Скасувати публікацію", + "Unpublish space": "Скасувати публікацію простору", + "This space will no longer be publicly accessible. Are you sure?": "Цей простір більше не буде публічно доступним. Ви впевнені?", + "More options for {{name}}": "Додаткові параметри для {{name}}", + "Edit page": "Редагувати сторінку", + "Sign in": "Увійти", + "Open app": "Відкрити застосунок", + "No spaces match your search.": "Жоден простір не відповідає вашому запиту.", + "Welcome to our documentation": "Ласкаво просимо до нашої документації", + "Guides, references and answers across all our published spaces.": "Посібники, довідкові матеріали та відповіді в усіх наших опублікованих просторах.", + "Guides, references and answers across all our spaces.": "Посібники, довідкові матеріали та відповіді в усіх наших просторах.", + "Search documentation...": "Шукати в документації...", + "1 published space": "1 опублікований простір", + "{{count}} published spaces": "{{count}} опублікованих просторів", + "Actions": "Дії", + "Add destination": "Додати призначення", + "Are you sure you want to delete the destination": "Ви впевнені, що хочете видалити призначення", + "Audit logs": "Журнали аудиту", + "Audit logs & SIEM": "Журнали аудиту й SIEM", + "Auth header name": "Назва заголовка авторизації", + "Auth header prefix": "Префікс заголовка авторизації", + "Body format": "Формат тіла", + "Created SIEM destination": "Створено призначення SIEM", + "Datadog site": "Сайт Datadog", + "Defaults to this instance's hostname": "За замовчуванням використовується ім’я хоста цього екземпляра", + "Delete destination": "Видалити призначення", + "Deleted SIEM destination": "Видалено призначення SIEM", + "Destination created": "Призначення створено", + "Destination deleted": "Призначення видалено", + "Destination updated": "Призначення оновлено", + "Disabled": "Вимкнено", + "Edit destination": "Редагувати призначення", + "Endpoint URL": "URL кінцевої точки", + "Failing": "Збій", + "Failing since {{time}}": "Збій із {{time}}", + "HEC token": "Токен HEC", + "HEC URL": "URL HEC", + "Healthy": "Справний", + "Hide advanced options": "Приховати додаткові параметри", + "Host": "Хост", + "Index": "Індекс", + "Insecure: connections can be intercepted.": "Небезпечно: з’єднання можуть бути перехоплені.", + "JSON array": "Масив JSON", + "Last delivered": "Остання доставка", + "Last error": "Остання помилка", + "Leave empty to use the token's default index": "Залиште порожнім, щоб використовувати індекс токена за замовчуванням", + "Maximum of {{limit}} destinations reached": "Досягнуто максимальної кількості призначень: {{limit}}", + "Could not load SIEM destinations: {{message}}": "Не вдалося завантажити призначення SIEM: {{message}}", + "No destinations yet": "Призначень ще немає", + "Preset": "Попереднє налаштування", + "Retry now": "Повторити зараз", + "Retry scheduled": "Повторну спробу заплановано", + "Send test event": "Надіслати тестову подію", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "Надсилається в наведеному нижче заголовку авторизації. Залиште порожнім, якщо вашому отримувачу він не потрібен.", + "Service": "Сервіс", + "Show advanced options": "Показати додаткові параметри", + "SIEM": "SIEM", + "SIEM streaming": "Потокова передача SIEM", + "SIEM streaming requires an Enterprise license.": "Для потокової передачі SIEM потрібна ліцензія Enterprise.", + "Source": "Джерело", + "Sourcetype": "Тип джерела", + "Tags": "Теги", + "Test connection": "Перевірити з’єднання", + "Test event delivered successfully.": "Тестову подію успішно доставлено.", + "Test the connection before saving.": "Перевірте з’єднання перед збереженням.", + "Test event delivered to {{name}}": "Тестову подію доставлено до {{name}}", + "Updated SIEM destination": "Оновлено призначення SIEM", + "Verify TLS certificate": "Перевіряти сертифікат TLS", + "e.g. Splunk prod": "напр., Splunk prod" +} diff --git a/apps/client/public/locales/zh-CN/translation.json b/apps/client/public/locales/zh-CN/translation.json new file mode 100644 index 0000000..0924e34 --- /dev/null +++ b/apps/client/public/locales/zh-CN/translation.json @@ -0,0 +1,1480 @@ +{ + "Account": "账户", + "Active": "活跃", + "Add": "添加", + "Add group members": "添加群组成员", + "Add groups": "添加群组", + "Add members": "添加成员", + "Add to groups": "添加到群组", + "Add space members": "添加空间成员", + "Add to favorites": "添加到收藏", + "Admin": "管理员", + "Are you sure you want to delete this group? Members will lose access to resources this group has access to.": "您确定要删除这个群组吗?成员将失去对该群组可访问资源的访问权限。", + "Are you sure you want to delete this page?": "您确定要删除这个页面吗?", + "Are you sure you want to remove this user from the group? The user will lose access to resources this group has access to.": "您确定要从群组中移除这个用户吗?该用户将失去对该群组可访问资源的访问权限。", + "Are you sure you want to remove this user from the space? The user will lose all access to this space.": "您确定要从空间中移除这个用户吗?该用户将失去对这个空间的所有访问权限。", + "Are you sure you want to restore this version? Any changes not versioned will be lost.": "您确定要恢复此版本吗?任何未版本化的更改将会丢失。", + "Can become members of groups and spaces in workspace": "可以成为工作区中群组和空间的成员", + "Can create and edit pages in space.": "能够在空间中创建和编辑页面", + "Can edit": "可以编辑", + "Can manage workspace": "可以管理工作区", + "Can manage workspace but cannot delete it": "可以管理工作区但不能删除它", + "Can view": "可以查看", + "Can view pages in space but not edit.": "能够在空间中读取页面,但不允许编辑", + "Cancel": "取消", + "Change email": "更改电子邮箱", + "Change password": "更改密码", + "Change photo": "更改照片", + "Choose a role": "选择一个角色", + "Choose your preferred color scheme.": "选择您喜欢的配色方案。", + "Choose your preferred interface language.": "选择您喜欢的界面语言。", + "Choose your preferred page width.": "选择您喜欢的页面宽度。", + "Confirm": "确认", + "Copy as Markdown": "复制为Markdown", + "Copy link": "复制链接", + "Create": "创建", + "Create group": "创建群组", + "Create page": "创建页面", + "Create space": "创建空间", + "Create workspace": "创建工作空间", + "Current password": "当前密码", + "Dark": "深色", + "Date": "日期", + "Delete": "删除", + "Remove from page": "从页面中移除", + "Base options": "数据库选项", + "Delete group": "删除群组", + "Are you sure you want to delete this page? This will delete its children and page history. This action is irreversible.": "您确定要删除这个页面吗?这将删除其子页面和页面历史记录。此操作不可逆。", + "Description": "描述", + "Details": "详情", + "e.g ACME": "例如 ACME", + "e.g ACME Inc": "例如 ACME Inc", + "e.g Developers": "例如 Developers", + "e.g Group for developers": "例如 开发者小组", + "e.g product": "例如 product", + "e.g Product Team": "例如 产品团队", + "e.g Sales": "例如 销售", + "e.g Space for product team": "例如 产品团队空间", + "e.g Space for sales team to collaborate": "例如 供销售团队协作的空间", + "Edit": "编辑", + "Read": "读取", + "Edit group": "编辑群组", + "Email": "电子邮箱", + "Enter a strong password": "输入一个强密码", + "Enter valid email addresses separated by comma or space max_50": "输入有效的电子邮箱地址,用逗号或空格分隔 [最多:50个]", + "enter valid emails addresses": "请输入有效的电子邮箱地址", + "Enter your current password": "输入您的当前密码", + "enter your full name": "请输入您的全名", + "Enter your new password": "输入您的新密码", + "Enter your new preferred email": "输入您新的首选电子邮箱", + "Enter your password": "输入您的密码", + "Error fetching page data.": "获取页面数据时出错。", + "Error loading page history.": "加载页面历史时出错。", + "Export": "导出", + "Failed to create page": "创建页面失败", + "Failed to delete page": "删除页面失败", + "Failed to restore page": "恢复页面失败", + "Failed to fetch recent pages": "获取最近页面失败", + "Failed to import pages": "导入页面失败", + "Failed to load page. An error occurred.": "页面加载失败。发生了一个错误。", + "Failed to update data": "数据更新失败", + "Failed to create base": "创建数据库失败", + "Failed to update base": "更新数据库失败", + "Failed to delete base": "删除数据库失败", + "Failed to create property": "创建属性失败", + "Failed to update property": "更新属性失败", + "Failed to delete property": "删除属性失败", + "Failed to reorder property": "重新排序属性失败", + "Failed to create view": "创建视图失败", + "Failed to update view": "更新视图失败", + "Failed to delete view": "删除视图失败", + "Failed to create row": "创建记录失败", + "Failed to update row": "更新记录失败", + "Failed to delete row": "删除记录失败", + "Failed to delete rows": "删除记录失败", + "Failed to reorder row": "重新排序记录失败", + "Failed to move card": "移动卡片失败", + "Failed to add card": "添加卡片失败", + "Failed to export CSV": "导出 CSV 失败", + "Favorite spaces": "收藏的空间", + "Favorite spaces appear here": "收藏的空间会显示在这里", + "Favorites": "收藏", + "Full access": "完全访问", + "Full page width": "全页宽度", + "Full width": "全宽", + "General": "常规", + "Group": "群组", + "Group description": "群组描述", + "Group name": "群组名称", + "Groups": "群组", + "Has full access to space settings and pages.": "能够更改全部空间设置和页面", + "Home": "首页", + "Import pages": "导入页面", + "Import pages & space settings": "导入页面和空间设置", + "Importing pages": "正在导入页面", + "invalid invitation link": "无效的邀请链接", + "Invitation signup": "邀请注册", + "Invite by email": "通过电子邮箱邀请", + "Invite members": "邀请成员", + "Invite new members": "邀请新成员", + "Invite People": "邀请成员", + "Invited members who are yet to accept their invitation will appear here.": "尚未接受邀请的成员将显示在这里。", + "Invited members will be granted access to spaces the groups can access": "被邀请的成员将被授予访问群组可以访问的空间的权限", + "Join the workspace": "加入工作空间", + "Language": "语言", + "Light": "浅色", + "Link copied": "链接已复制", + "Login": "登录", + "Logout": "退出登录", + "Manage Group": "管理群组", + "Manage members": "管理成员", + "member": "成员", + "Member": "成员", + "members": "成员", + "Members": "成员", + "My preferences": "我的偏好设置", + "My Profile": "我的个人资料", + "My profile": "我的个人资料", + "Name": "名称", + "New email": "新电子邮箱", + "New page": "新建页面", + "New password": "新密码", + "No group found": "未找到群组", + "No page history saved yet.": "尚未保存页面历史。", + "No pages yet": "暂无页面", + "No shared pages": "没有共享页面", + "No results found...": "未找到结果...", + "No user found": "未找到用户", + "Overview": "概览", + "Owner": "所有者", + "page": "个页面", + "Page deleted successfully": "页面已成功删除", + "Page history": "页面历史", + "Select version": "选择版本", + "Highlight changes": "突出显示更改", + "Page import is in progress. Please do not close this tab.": "页面导入正在进行中。请不要关闭此标签页。", + "Pages": "页面", + "pages": "个页面", + "Password": "密码", + "Password changed successfully": "密码更改成功", + "People": "人员", + "Pending": "待定", + "Please confirm your action": "请确认您的操作", + "Preferences": "偏好设置", + "Print PDF": "打印 PDF", + "Profile": "个人资料", + "Recently updated": "最近更新", + "Remove": "移除", + "Remove from favorites": "从收藏中移除", + "Remove group member": "移除群组成员", + "Remove space member": "移除空间成员", + "Restore": "恢复", + "Role": "角色", + "Save": "保存", + "Search": "搜索", + "Search for groups": "搜索群组", + "Search for users": "搜索用户", + "Search for users and groups": "搜索用户和群组", + "Search...": "搜索...", + "Select language": "选择语言", + "Select role": "选择角色", + "Select role to assign to all invited members": "选择要分配给所有受邀成员的角色", + "Select theme": "选择主题", + "Send invitation": "发送邀请", + "Invitation sent": "邀请已发送", + "Settings": "设置", + "Setup workspace": "设置工作区", + "Sign In": "登录", + "Sign Up": "注册", + "Slug": "标识符", + "Space": "空间", + "Space description": "空间描述", + "Space menu": "空间菜单", + "Space name": "空间名称", + "Space settings": "空间设置", + "Space slug": "空间标识符", + "Spaces": "空间", + "Spaces you belong to": "您所属的空间", + "No space found": "未找到空间", + "Search for spaces": "搜索空间", + "Start typing to search...": "开始输入以搜索...", + "Status": "状态", + "Successfully imported": "导入成功", + "Successfully restored": "恢复成功", + "System settings": "系统设置", + "Templates": "模板", + "Theme": "主题", + "To change your email, you have to enter your password and new email.": "要更改您的电子邮箱,您需要输入密码和新的电子邮箱地址。", + "Toggle full page width": "切换整页宽度", + "Unable to import pages. Please try again.": "无法导入页面。请重试。", + "untitled": "未命名", + "Untitled": "未命名", + "Updated successfully": "更新成功", + "User": "用户", + "Workspace": "工作区", + "Workspace Name": "工作区名称", + "Workspace settings": "工作区设置", + "You can change your password here.": "您可以在这里更改密码。", + "Your Email": "您的邮箱", + "Your import is complete.": "导入已完成。", + "Your name": "您的姓名", + "Your Name": "您的姓名", + "Your password": "您的密码", + "Your password must be a minimum of 8 characters.": "您的密码必须至少包含8个字符。", + "Sidebar toggle": "侧边栏切换", + "Comments": "评论", + "404 page not found": "404 页面未找到", + "Sorry, we can't find the page you are looking for.": "抱歉,我们无法找到你所需要的页面", + "Take me back to homepage": "返回首页", + "Forgot password": "忘记密码", + "Forgot your password?": "忘记密码了吗?", + "A password reset link has been sent to your email. Please check your inbox.": "密码重置链接已经发送到您的邮箱,请检查收件箱", + "Send reset link": "发送重置链接", + "Password reset": "重置密码", + "Your new password": "您的新密码", + "Set password": "设置密码", + "Write a comment": "编写评论", + "Reply...": "回复...", + "Error loading comments.": "加载评论时出错", + "No comments yet.": "目前还没有评论", + "No open comments.": "没有未解决的评论。", + "No resolved comments.": "没有已解决的评论。", + "Add a comment...": "添加评论...", + "Edit comment": "编辑评论", + "Delete comment": "删除评论", + "Are you sure you want to delete this comment?": "你确定要删除这条评论吗?", + "Delete chat": "删除聊天", + "Are you sure you want to delete '{{title}}'? This action cannot be undone.": "您确定要删除「{{title}}」吗?此操作无法撤销。", + "Comment created successfully": "成功创建评论", + "Error creating comment": "创建评论时出错", + "Comment updated successfully": "评论更新成功", + "Failed to update comment": "更新评论失败", + "Comment deleted successfully": "成功删除评论", + "Failed to delete comment": "删除评论失败", + "Comment resolved successfully": "成功标记评论为解决", + "Comment re-opened successfully": "评论重新打开成功", + "Comment unresolved successfully": "评论已成功取消解决", + "Failed to resolve comment": "标记评论为解决失败", + "Resolve comment": "解决评论", + "Unresolve comment": "取消解决评论", + "Resolve Comment Thread": "解决评论线程", + "Unresolve Comment Thread": "取消解决评论线程", + "Are you sure you want to resolve this comment thread? This will mark it as completed.": "确定要解决此评论线程吗?这将标记为已完成。", + "Are you sure you want to unresolve this comment thread?": "确定要取消解决此评论线程吗?", + "Resolved": "已解决", + "No active comments.": "没有活跃的评论。", + "Revoke invitation": "撤回邀请", + "Revoke": "撤销", + "Don't": "不要", + "Are you sure you want to revoke this invitation? The user will not be able to join the workspace.": "你确定要撤回这个邀请吗?此用户将不能再加入此工作空间。", + "Resend invitation": "重新发送邀请", + "Anyone with this link can join this workspace.": "任何拥有此连接的人都可以加入此工作区", + "Invite link": "邀请链接", + "Copy": "复制", + "Copy to space": "复制到空间", + "Copied": "已复制", + "Duplicate": "复制", + "Select a user": "选择一个用户", + "Select a group": "选择一个组", + "Export all pages and attachments in this space.": "导出当前空间的所有页面和附件", + "Delete space": "删除空间", + "Are you sure you want to delete this space?": "您确定要删除这个空间吗?", + "Delete this space with all its pages and data.": "删除空间及其所有页面和数据", + "All pages, comments, attachments and permissions in this space will be deleted irreversibly.": "此空间中的所有页面、评论、附件和权限将被不可逆转地删除。", + "Confirm space name": "确认空间名称", + "Type the space name {{spaceName}} to confirm your action.": "输入空间名称{{spaceName}}以确认您的操作。", + "Format": "格式", + "Include subpages": "包括子页面", + "Include attachments": "包括附件", + "Select export format": "选择导出格式", + "Export failed:": "导出失败:", + "export error": "导出出错", + "Export page": "导出页面", + "Export successful": "导出成功", + "Export space": "导出空间", + "Export {{type}}": "导出为 {{type}}", + "File exceeds the {{limit}} attachment limit": "文件超出了 {{limit}} 类型附件限制", + "Media": "媒体", + "Align left": "靠左对齐", + "Align right": "靠右对齐", + "Align center": "居中对齐", + "Alt text": "替代文本", + "Describe this for accessibility.": "为无障碍访问添加描述。", + "Add a description": "添加描述", + "Justify": "两端对齐", + "Merge cells": "合并单元格", + "Split cell": "分割单元格", + "Delete column": "删除整列", + "Delete row": "删除整行", + "Add left column": "在左侧添加列", + "Add right column": "在右侧添加列", + "Add row above": "在上方添加行", + "Add row below": "在下方插入行", + "Delete table": "删除表格", + "Add column left": "在左侧添加列", + "Add column right": "在右侧添加列", + "Clear cell": "清空单元格", + "Clear cells": "清空单元格", + "Toggle header cell": "切换标题单元格", + "Toggle header column": "切换标题列", + "Toggle header row": "切换标题行", + "Move column left": "左移列", + "Move column right": "右移列", + "Move row down": "下移行", + "Move row up": "上移行", + "Sort A → Z": "按 A → Z 排序", + "Sort Z → A": "按 Z → A 排序", + "Info": "信息", + "Note": "注意", + "Success": "成功", + "Warning": "警告", + "Danger": "危险", + "Mermaid diagram error:": "Mermaid 图表错误:", + "Invalid Mermaid diagram": "无效的 Mermaid 图表", + "Double-click to edit Draw.io diagram": "双击以编辑 Draw.io 图表", + "Exit": "退出", + "Save & Exit": "保存并退出", + "Double-click to edit Excalidraw diagram": "双击以编辑 Excalidraw 图表", + "Paste link": "粘贴链接", + "Paste link or search pages": "粘贴链接或搜索页面", + "Link to web page": "链接到网页", + "Recents": "最近使用", + "Page or URL": "页面或网址", + "Link title": "链接标题", + "Edit link": "编辑链接", + "Remove link": "移除链接", + "Add link": "添加链接", + "Please enter a valid url": "请输入一个合法的 URL", + "Empty equation": "空白公式", + "Invalid equation": "无效的公式", + "Color": "颜色", + "Text color": "文字颜色", + "Default": "默认", + "Blue": "蓝色", + "Green": "绿色", + "Purple": "紫色", + "Red": "红色", + "Yellow": "黄色", + "Orange": "橙色", + "Pink": "粉色", + "Gray": "灰色", + "Embed link": "嵌入链接", + "Invalid {{provider}} embed link": "无效的 {{provider}} 嵌入链接", + "Embed {{provider}}": "嵌入 {{provider}}", + "Enter {{provider}} link to embed": "输入 {{provider}} 链接来嵌入", + "Bold": "粗体", + "Italic": "斜体", + "Underline": "下划线", + "Strike": "删除线", + "Code": "代码", + "Comment": "评论", + "Text": "文字", + "Heading 1": "1 级标题", + "Heading 2": "2 级标题", + "Heading 3": "3 级标题", + "To-do List": "代办列表", + "Bullet List": "无序列表", + "Numbered List": "有序列表", + "Blockquote": "引用块", + "Just start typing with plain text.": "只需开始键入纯文本", + "Track tasks with a to-do list.": "使用代办列表跟踪任务", + "Big section heading.": "大标题", + "Medium section heading.": "中标题", + "Small section heading.": "小标题", + "Create a simple bullet list.": "创建一个简单的无序列表", + "Create a list with numbering.": "创建一个有序列表", + "Create block quote.": "创建引用块", + "Insert code snippet.": "插入代码片段", + "Insert horizontal rule divider": "插入水平分割线", + "Page break": "分页符", + "Insert a page break for printing.": "插入一个用于打印的分页符。", + "Footnote": "脚注", + "Insert a footnote reference.": "插入脚注引用。", + "Upload any image from your device.": "从设备上传任何图像", + "Upload any video from your device.": "从设备上传任何视频", + "Upload any audio from your device.": "从您的设备上传任意音频文件。", + "Upload any file from your device.": "从设备上传任何文件", + "Uploading {{name}}": "正在上传{{name}}", + "Uploading file": "正在上传文件", + "Table": "表格", + "Insert a table.": "插入一个表格", + "Insert collapsible block.": "插入一个折叠块", + "Video": "视频", + "Divider": "分割线", + "Quote": "引用", + "Image": "图片", + "Audio": "音频", + "Embed PDF": "嵌入 PDF", + "Upload and embed a PDF file.": "上传并嵌入 PDF 文件。", + "Embed as PDF": "作为 PDF 嵌入", + "Failed to load PDF": "加载 PDF 失败", + "Convert to attachment": "转换为附件", + "File attachment": "文件附件", + "Toggle block": "折叠块", + "Callout": "提示块", + "Insert callout notice.": "插入标注提示块", + "Math inline": "行内公式", + "Insert inline math equation.": "插入行内公式", + "Math block": "公式块", + "Insert math equation": "插入数学公式", + "Mermaid diagram": "Mermaid 图表", + "Insert mermaid diagram": "插入 Mermaid 图表", + "Insert and design Drawio diagrams": "插入并设计 Drawio 图表", + "Insert current date": "插入当前日期", + "Time": "时间", + "Insert current time": "插入当前时间", + "Draw and sketch excalidraw diagrams": "绘制和草绘 Excalidraw 图表", + "Multiple": "多个", + "Turn into": "变成", + "Text align": "文本对齐", + "This page may have been deleted, moved, or you may not have access.": "此页面可能已被删除、移动,或者您可能无权访问。{", + "Go to homepage": "前往首页", + "Pages you create will show up here.": "您创建的页面将显示在此处。", + "Heading {{level}}": "标题 {{level}}", + "Toggle title": "折叠标题", + "Write anything. Enter \"/\" for commands": "输入任意内容。输入“/”查看命令", + "Write...": "写点内容...", + "Column count": "列数", + "{{count}} Columns": "{{count}} 列", + "{{count}} command available_one": "有 1 个可用命令", + "{{count}} command available_other": "有 {{count}} 个可用命令", + "{{count}} result available_one": "有 1 个可用结果", + "{{count}} result available_other": "有 {{count}} 个可用结果", + "Equal columns": "等宽列", + "Left sidebar": "左侧边栏", + "Right sidebar": "右侧边栏", + "Wide center": "中间加宽", + "Left wide": "左侧加宽", + "Right wide": "右侧加宽", + "Names do not match": "名称不匹配", + "Today, {{time}}": "今天,{{time}}", + "Yesterday, {{time}}": "昨天,{{time}}", + "now": "现在", + "Space created successfully": "空间创建成功", + "Space updated successfully": "空间更新成功", + "Space deleted successfully": "空间删除成功", + "Members added successfully": "成员添加成功", + "Member removed successfully": "成员移除成功", + "Member role updated successfully": "成员角色更新成功", + "Created by: {{creatorName}}": "创建者:{{creatorName}}", + "Created at: {{time}}": "创建于:{{time}}", + "Edited by {{name}} {{time}}": "由 {{name}} 编辑于 {{time}}", + "Word count: {{wordCount}}": "字数:{{wordCount}}", + "Character count: {{characterCount}}": "字符数:{{characterCount}}", + "New update": "新更新", + "{{latestVersion}} is available": "{{latestVersion}} 可用", + "Default page edit mode": "默认页面编辑模式", + "Choose your preferred page edit mode. Avoid accidental edits.": "选择您偏好的页面编辑模式。避免意外编辑。", + "Choose {{format}} file": "选择 {{format}} 文件", + "Reading": "阅读", + "Delete member": "删除成员", + "Member deleted successfully": "成员删除成功", + "Are you sure you want to delete this workspace member? This action is irreversible.": "您确定要删除此工作区成员吗?此操作不可逆。", + "Deactivate member": "停用成员", + "Activate member": "激活成员", + "Are you sure you want to deactivate this workspace member? They will no longer be able to access this workspace.": "您确定要停用此工作区成员吗?该成员将无法再访问此工作区。", + "Are you sure you want to activate this workspace member?": "您确定要激活此工作区成员吗?", + "Deactivate": "停用", + "Activate": "激活", + "Deactivated": "已停用", + "Move": "移动", + "Move page": "移动页面", + "Move page to a different space.": "将页面移动到不同的空间。", + "Real-time editor connection lost. Retrying...": "实时编辑器连接丢失。重试中……", + "Table of contents": "目录", + "Add headings (H1, H2, H3) to generate a table of contents.": "添加标题(H1,H2,H3)以生成目录。", + "Share": "分享", + "Public sharing": "公开分享", + "Shared by": "分享者", + "Shared at": "分享于", + "Inherits public sharing from": "继承公开分享自", + "Share to web": "分享到网页", + "Shared to web": "已分享到网页", + "Anyone with the link can view this page": "任何拥有链接的人都可以查看此页面", + "Make this page publicly accessible": "将此页面设为公开可访问", + "Include sub-pages": "包含子页面", + "Make sub-pages public too": "同时将子页面设为公开", + "Allow search engines to index page": "允许搜索引擎索引页面", + "Open page": "打开页面", + "Page": "页面", + "Delete public share link": "删除公开分享链接", + "Delete share": "删除分享", + "Are you sure you want to delete this shared link?": "您确定要删除此分享链接吗?", + "Publicly shared pages from spaces you are a member of will appear here": "您所属空间中公开分享的页面将显示在这里", + "Share deleted successfully": "分享删除成功", + "Share not found": "未找到分享", + "Failed to share page": "页面分享失败", + "Disable public sharing": "禁用公开分享", + "Prevent members from sharing pages publicly.": "阻止成员公开分享页面。", + "Toggle public sharing": "切换公开分享", + "Toggle space public sharing": "切换空间公开分享", + "Allow viewers to comment": "允许观众评论", + "Allow viewers to add comments on pages in this space.": "允许观众在此空间的页面上添加评论。", + "Toggle viewer comments": "切换观众评论", + "Public sharing is disabled at the workspace level": "公开分享在工作区级别被禁用", + "Prevent pages in this space from being shared publicly.": "阻止此空间中的页面被公开分享。", + "Page permissions": "页面权限},{", + "Control who can view and edit individual pages. Available with an enterprise license.": "控制谁可以查看和编辑单个页面。此功能在企业版许可下可用。", + "Enable public sharing": "启用公开分享", + "Are you sure you want to enable public sharing? Members will be able to share pages publicly.": "您确定要启用公开分享吗?成员将能够公开分享页面。", + "Are you sure you want to disable public sharing? All existing shared links in this workspace will be deleted.": "您确定要禁用公开分享吗?此工作区中的所有现有共享链接都将被删除。", + "Are you sure you want to enable public sharing for this space?": "您确定要为此空间启用公开分享吗?", + "Are you sure you want to disable public sharing? All existing shared links in this space will be deleted.": "您确定要禁用公开分享吗?此空间中的所有现有共享链接都将被删除。", + "Public sharing is disabled": "公开分享已被禁用", + "Public sharing has been disabled at the workspace level.": "公开分享已在工作区级别被禁用。", + "Public sharing has been disabled for this space.": "此空间的公开分享已被禁用。", + "Copy page": "复制页面", + "Copy page to a different space.": "将页面复制到不同的空间。", + "Page copied successfully": "页面复制成功", + "Page duplicated successfully": "页面副本创建成功", + "Find": "查找", + "Not found": "未找到", + "Previous Match (Shift+Enter)": "上一个匹配项(Shift+Enter)", + "Next match (Enter)": "下一个匹配项(Enter)", + "Match case (Alt+C)": "区分大小写(Alt+C)", + "Replace": "替换", + "Close (Escape)": "关闭(Escape)", + "Replace (Enter)": "替换(Enter)", + "Replace all (Ctrl+Alt+Enter)": "全部替换(Ctrl+Alt+Enter)", + "Replace all": "全部替换", + "View all": "查看全部", + "View all spaces": "查看所有空间", + "Error": "错误", + "Failed to disable MFA": "禁用 MFA 失败", + "Disable two-factor authentication": "禁用双重身份验证", + "Disabling two-factor authentication will make your account less secure. You'll only need your password to sign in.": "停用双因素认证会降低账户安全性。您只需密码即可登录。", + "Please enter your password to disable two-factor authentication:": "请输入您的密码以停用双因素认证:", + "Two-factor authentication has been enabled": "双重身份验证已启用", + "Two-factor authentication has been disabled": "双重身份验证已禁用", + "2-step verification": "两步验证", + "Protect your account with an additional verification layer when signing in.": "通过额外的验证层保护您的账户安全。", + "Two-factor authentication is active on your account.": "您的账户已激活双因素认证。", + "Add 2FA method": "添加 2FA 方式", + "Backup codes": "备用代码", + "Disable": "禁用", + "Invalid verification code": "无效的验证码", + "New backup codes have been generated": "新的备用代码已生成", + "Failed to regenerate backup codes": "重新生成备用代码失败", + "About backup codes": "关于备用代码", + "Backup codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "如果您无法访问身份验证器应用,可使用备份代码访问账户。每个代码仅可使用一次。", + "You can regenerate new backup codes at any time. This will invalidate all existing codes.": "您可以随时重新生成新的备份代码。这将使所有现有代码失效。", + "Confirm password": "确认密码", + "Generate new backup codes": "生成新的备用代码", + "Save your new backup codes": "保存您的新备用代码", + "Make sure to save these codes in a secure place. Your old backup codes are no longer valid.": "请确保将这些代码保存在安全的地方。您的旧备份代码不再有效。", + "Your new backup codes": "您的新备用代码", + "I've saved my backup codes": "我已保存备用代码", + "Failed to setup MFA": "设置 MFA 失败", + "Setup & Verify": "设置并验证", + "Add to authenticator": "添加到身份验证器", + "1. Scan this QR code with your authenticator app": "1. 使用您的身份验证器应用扫描此二维码", + "Can't scan the code?": "无法扫描代码?", + "Enter this code manually in your authenticator app:": "在您的身份验证器应用中手动输入此代码:", + "2. Enter the 6-digit code from your authenticator": "2. 输入您的身份验证器中的 6 位代码", + "Verify and enable": "验证并启用", + "Failed to generate QR code. Please try again.": "生成二维码失败。请重试。", + "Backup": "备用", + "Save codes": "保存代码", + "Save your backup codes": "保存您的备用代码", + "These codes can be used to access your account if you lose access to your authenticator app. Each code can only be used once.": "如果无法访问身份验证器应用,可以使用这些代码访问账户。每个代码仅可使用一次。", + "Print": "打印", + "Two-factor authentication has been set up. Please log in again.": "双因素认证已设置。请重新登录。", + "Two-Factor authentication required": "需要双重身份验证", + "Your workspace requires two-factor authentication for all users": "您的工作区要求所有用户启用双重身份验证", + "To continue accessing your workspace, you must set up two-factor authentication. This adds an extra layer of security to your account.": "要继续访问工作区,必须设置双因素认证。此操作为您的账户添加一层额外的安全保障。", + "Set up two-factor authentication": "设置双重身份验证", + "Cancel and logout": "取消并退出登录", + "Your workspace requires two-factor authentication. Please set it up to continue.": "您的工作区需要双因素认证。请设置以继续。", + "This adds an extra layer of security to your account by requiring a verification code from your authenticator app.": "通过要求您的身份验证器应用提供验证码,此操作为您的账户增加了一层额外的安全保障。", + "Password is required": "密码为必填项", + "Password must be at least 8 characters": "密码长度至少为 8 个字符", + "Please enter a 6-digit code": "请输入 6 位代码", + "Code must be exactly 6 digits": "代码必须正好为 6 位", + "Enter the 6-digit code found in your authenticator app": "输入您身份验证器应用中的 6 位代码", + "Need help authenticating?": "需要帮助进行身份验证吗?", + "MFA QR Code": "MFA 二维码", + "Account created successfully. Please log in to set up two-factor authentication.": "账户创建成功。请登录以设置双因素认证。", + "Password reset successful. Please log in with your new password and complete two-factor authentication.": "密码重置成功。请使用新密码登录并完成双因素认证。", + "Password reset successful. Please log in with your new password to set up two-factor authentication.": "密码重置成功。请使用新密码登录以设置双因素认证。", + "Password reset was successful. Please log in with your new password.": "密码重置成功。请使用新密码登录。", + "Two-factor authentication": "双重身份验证", + "Use authenticator app instead": "改用身份验证器应用", + "Verify backup code": "验证备用代码", + "Use backup code": "使用备用代码", + "Enter one of your backup codes": "输入您的一个备用代码", + "Backup code": "备用代码", + "Enter one of your backup codes. Each backup code can only be used once.": "输入您的一个备份代码。每个备份代码只能使用一次。", + "Verify": "验证", + "Trash": "回收站", + "Pages in trash will be permanently deleted after {{count}} days.": "垃圾箱中的页面将在{{count}}天后被永久删除。", + "Deleted": "已删除", + "No pages in trash": "回收站中没有页面", + "Permanently delete page?": "永久删除页面?", + "Are you sure you want to permanently delete '{{title}}'? This action cannot be undone.": "确定要永久删除“{{title}}”吗?此操作无法撤销。", + "Restore '{{title}}' and its sub-pages?": "恢复“{{title}}”及其子页面?", + "Move to trash": "移至回收站", + "Move this page to trash?": "将此页面移至垃圾箱?", + "Restore page": "恢复页面", + "Permanently delete": "永久删除", + "{{name}} moved this page to Trash {{time}}.": "{{name}} 于 {{time}} 将此页面移至回收站。", + "Page moved to trash": "页面已移至回收站", + "Page restored successfully": "页面恢复成功", + "Deleted by": "删除者", + "Deleted at": "删除于", + "Preview": "预览", + "Base preview unavailable": "无法预览数据库", + "Restore this base to view its contents.": "恢复此数据库以查看其内容。", + "Subpages": "子页面", + "Failed to load subpages": "加载子页面失败", + "No subpages": "没有子页面", + "Subpages (Child pages)": "子页面(下级页面)", + "List all subpages of the current page": "列出当前页面的所有子页面", + "Attachments": "附件", + "All spaces": "所有空间", + "Unknown": "未知", + "Find a space": "查找空间", + "Search in all your spaces": "在您的所有空间中搜索", + "Type": "类型", + "Enterprise": "企业版", + "Download attachment": "下载附件", + "Allowed email domains": "允许的邮箱域名", + "Only users with email addresses from these domains can signup via SSO.": "只有使用这些域名邮箱地址的用户才能通过 SSO 注册。", + "Enter valid domain names separated by comma or space": "请输入有效的域名,并用逗号或空格分隔", + "Enforce two-factor authentication": "强制启用双重身份验证", + "Once enforced, all members must enable two-factor authentication to access the workspace.": "一旦实施,所有成员必须启用双因素认证才能访问工作区。", + "Toggle MFA enforcement": "切换 MFA 强制执行", + "Display name": "显示名称", + "Allow signup": "允许注册", + "Enabled": "已启用", + "Advanced Settings": "高级设置", + "Enable TLS/SSL": "启用 TLS/SSL", + "Use secure connection to LDAP server": "使用安全连接访问 LDAP 服务器", + "Group sync": "群组同步", + "No SSO providers found.": "未找到SSO提供商。", + "Delete SSO provider": "删除 SSO 提供商", + "Are you sure you want to delete this SSO provider?": "您确定要删除此SSO提供商吗?", + "Action": "操作", + "{{ssoProviderType}} configuration": "{{ssoProviderType}} 配置", + "Icon": "图标", + "Upload image": "上传图片", + "Remove image": "删除图片", + "Failed to remove image": "无法删除图片", + "Image exceeds 10MB limit.": "图片超过10MB限制。", + "Image removed successfully": "图片删除成功", + "API key": "API密钥", + "API keys": "API密钥", + "API management": "API管理", + "Custom expiration date": "自定义到期日期", + "Enter a descriptive token name": "输入描述性令牌名称", + "Expiration": "到期", + "Expired": "已过期", + "Expires": "到期", + "Last use": "上次使用", + "No API keys found": "找不到API密钥", + "No expiration": "无到期", + "Revoked successfully": "撤销成功", + "Select expiration date": "选择到期日期", + "This action cannot be undone. Any applications using this API key will stop working.": "此操作无法撤销。使用此API密钥的任何应用程序将停止工作。", + "Update": "更新", + "Update {{credential}}": "更新{{credential}}", + "Manage API keys for all users in the workspace": "管理工作空间中所有用户的API密钥", + "Restrict API key creation to admins": "仅限管理员创建 API 密钥。", + "Only admins and owners can create new API keys. Existing member keys will continue to work.": "只有管理员和所有者可以创建新的 API 密钥。现有成员密钥将继续有效。", + "Toggle restrict API keys to admins": "切换仅限管理员创建 API 密钥", + "API key creation is restricted to admins by your workspace administrator.": "API 密钥的创建已被您的工作区管理员限制为仅管理员可用。", + "AI settings": "AI设置", + "AI search": "AI搜索", + "AI Answer": "AI回答", + "Ask AI": "询问AI", + "AI is thinking...": "AI正在思考...", + "Thinking": "思考中", + "Ask a question...": "提问...", + "AI Answers": "AI答案", + "AI-powered search (AI Answers)": "AI驱动的搜索 (AI答案)", + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.": "AI搜索使用向量嵌入提供跨工作空间内容的语义搜索功能。", + "Toggle AI search": "切换AI搜索", + "Generative AI (Ask AI)": "生成型AI (询问AI)", + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.": "在编辑器中启用AI驱动的内容生成。允许用户生成、改进、翻译和转换文本。", + "Toggle generative AI": "切换生成型AI", + "Upgrade your plan": "升级您的方案", + "Available with a paid license": "需付费许可才可用", + "Upgrade your license tier.": "升级您的许可等级。", + "AI is available in the Docmost paid editions. Contact sales@docmost.com.": "AI 在 Docmost 付费版中提供。请联系 sales@docmost.com。", + "AI & MCP": "AI 与 MCP", + "AI": "AI", + "MCP": "MCP", + "Model Context Protocol (MCP)": "模型上下文协议(MCP)", + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.": "启用 MCP 服务器以允许 AI 助手和工具与您的工作区内容交互。", + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.": "MCP 仅在 Docmost 企业版中提供。请联系 sales@docmost.com。", + "MCP Server URL": "MCP 服务器 URL", + "Connect AI assistants with your Docmost account via OAuth.": "通过 OAuth 将 AI 助手连接到你的 Docmost 账户。", + "Enforce OAuth": "强制使用 OAuth", + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.": "AI 助手必须通过 OAuth 使用 Docmost 账户连接。MCP 服务器不能使用 API 密钥。", + "Toggle enforce OAuth for MCP": "切换 MCP 的强制使用 OAuth 设置", + "Supported tools": "支持的工具", + "MCP server URL:": "MCP 服务器 URL:", + "Learn more": "了解更多", + "Manage API keys for all users in the workspace. View the API documentation for usage details.": "为工作区内所有用户管理 API 密钥。有关使用详情,请查阅API 文档。", + "View the API documentation for usage details.": "有关使用详情,请查阅API 文档。", + "View the MCP documentation.": "查看MCP 文档。", + "Sources": "来源", + "AI Answers not available for attachments": "AI答案不适用于附件", + "No answer available": "无可用答案", + "Background color": "背景颜色", + "Highlight color": "突出显示颜色", + "Remove color": "移除颜色", + "Notifications": "通知", + "No notifications": "没有通知", + "No unread notifications": "没有未读通知", + "All notifications": "所有通知", + "Unread only": "仅未读", + "Mark all as read": "标记所有为已读", + "Mark as read": "标记为已读", + "More options": "更多选项", + "{{name}} mentioned you in a comment": "{{name}}在评论中提到你", + "{{name}} commented on a page": "{{name}}在页面上评论了", + "{{name}} resolved a comment": "{{name}} 解决了一条评论", + "{{name}} mentioned you on a page": "{{name}} 在某个页面中提到了您", + "{{name}} gave you edit access to a page": "{{name}} 授予您某个页面的编辑权限", + "{{name}} gave you view access to a page": "{{name}} 授予您某个页面的查看权限", + "{{name}} updated a page": "{{name}} 更新了某个页面", + "Watch page": "关注页面", + "Stop watching": "取消关注", + "Watch space": "关注空间", + "Stop watching space": "取消关注空间", + "Email notifications": "邮件通知", + "Page updates": "页面更新", + "Get notified when pages you watch are updated.": "当你关注的页面有更新时收到通知。", + "Page mentions": "页面提及", + "Get notified when someone mentions you on a page.": "当有人在页面上提到你时收到通知。", + "Comment mentions": "评论提及", + "Get notified when someone mentions you in a comment.": "当有人在评论中提到你时收到通知。", + "New comments": "新评论", + "Get notified about new comments on threads you participate in.": "当你参与的讨论有新评论时收到通知。", + "Resolved comments": "已解决的评论", + "Get notified when your comment is resolved.": "当你的评论被解决时收到通知。", + "You are now watching this page": "你现在正在关注此页面", + "You are no longer watching this page": "你已取消关注此页面", + "You are now watching this space": "您现在正在关注此空间", + "You are no longer watching this space": "您已不再关注此空间", + "Direct": "直接", + "Updates": "更新", + "Today": "今天", + "Yesterday": "昨天", + "This week": "本周", + "Older": "较早", + "Restricted page": "受限页面", + "Restricted pages cannot be shared publicly.": "受限页面不能公开共享。", + "Restricted by parent": "受父页面限制", + "Restricted": "受限", + "Open": "公开", + "Inherits restrictions from ancestor page": "继承自上级页面的限制", + "Only people listed below can access this page": "只有下面列出的人可以访问此页面", + "Everyone in this space can access": "此空间中的所有人均可访问", + "No additional restrictions on this page": "此页面无额外限制", + "Only specific people can access": "仅特定人员可访问", + "Use only inherited restrictions": "仅使用继承的限制", + "Add restrictions on top of inherited": "在继承的限制之上添加限制", + "Inherited restriction": "继承的限制", + "Access limited by": "访问受限于", + "Restrict access to control who can view and edit this page": "限制访问以控制谁可以查看和编辑此页面", + "Add additional restrictions specific to this page": "为此页面添加额外的特定限制", + "Access": "访问", + "People with access": "有访问权限的人员", + "Remove all": "全部移除", + "Remove access": "移除访问权限", + "Remove all access": "移除所有访问权限", + "Are you sure you want to remove this member's access to the page?": "您确定要移除此成员对该页面的访问权限吗?", + "Are you sure you want to remove all specific access? This will make the page open to everyone in the space.": "您确定要删除所有特定访问权限吗?这将使该页面对该空间中的所有人开放。", + "Trash retention": "垃圾箱保留期", + "Pages in trash will be permanently deleted after this period.": "该期限结束后,垃圾箱中的页面将被永久删除。", + "Trash retention updated": "垃圾箱保留期已更新", + "Failed to update trash retention": "更新垃圾箱保留期失败", + "Removed page restriction": "已移除页面限制", + "Added page permission": "已添加页面权限", + "Removed page permission": "已移除页面权限", + "Changed page permission": "已更改页面权限", + "Requested password reset": "已请求重置密码", + "Created template": "已创建模板", + "Deleted template": "已删除模板", + "day": "天", + "days": "天", + "week": "周", + "weeks": "周", + "month": "个月", + "months": "个月", + "year": "年", + "years": "年", + "Period": "周期", + "Fixed date": "固定日期", + "Indefinitely": "无限期", + "Days": "天", + "Weeks": "周", + "Months": "个月", + "Years": "年", + "Pick a date": "选择日期", + "Maximum is {{max}} {{unit}} for this unit": "此单位的最大值为 {{max}} {{unit}}", + "Never expires. Verifiers can re-verify at any time.": "永不过期。验证者可随时重新验证。", + "Verified": "已验证", + "Review needed": "需要审核", + "Verification expired": "验证已过期", + "Draft": "草稿", + "In Approval": "审批中", + "In approval": "审批中", + "Approved": "已批准", + "Obsolete": "已作废", + "Expiring": "即将过期", + "Set up verification": "设置验证", + "Verify page": "验证页面", + "Page verification": "页面验证", + "Add verification": "添加验证", + "Edit verification": "编辑验证", + "Search by title": "按标题搜索", + "Choose how this page should stay accurate.": "选择此页面保持准确的方式。", + "Recurring verification": "定期验证", + "Verifiers re-confirm this page on a schedule.": "验证者按计划重新确认此页面。", + "Re-verify on a schedule (e.g every 30 days )": "按计划重新验证(例如每 30 天一次)", + "Page stays editable at all times": "页面始终可编辑", + "Best for runbooks, FAQs, living documentation": "最适合运行手册、常见问题和动态文档", + "Approval workflow": "审批工作流", + "Formal document lifecycle with named approvers.": "具有指定审批人的正式文档生命周期。", + "Draft → In approval → Approved → Obsolete": "草稿 → 审批中 → 已批准 → 已作废", + "Locked once approved, with full history": "批准后锁定,并保留完整历史记录", + "Designed for ISO 9001, ISO 13485, and FDA": "专为 ISO 9001、ISO 13485 和 FDA 设计", + "Best for SOPs and controlled documents": "最适合 SOP 和受控文档", + "Back": "返回", + "Quality management": "质量管理", + "Recurring": "定期", + "Pages move through draft, approval, and approved stages.": "页面会经历草稿、审批中和已批准阶段。", + "Verifiers": "验证者", + "Add verifier": "添加验证者", + "I've reviewed this page for accuracy": "我已审核此页面的准确性", + "Set up": "设置", + "Remove verification": "移除验证", + "Are you sure you want to remove verification from this page?": "确定要移除此页面的验证吗?", + "Assigned verifiers must periodically re-verify this page.": "指定的验证者必须定期重新验证此页面。", + "Last verified by {{name}} {{time}} (expired)": "最后由 {{name}} 于 {{time}} 验证(已过期)", + "The fixed expiration date has passed.": "固定到期日已过。", + "Verified by {{name}} {{time}}": "由 {{name}} 于 {{time}} 验证", + "Expires {{date}}": "于 {{date}} 到期", + "Expired {{date}}": "已于 {{date}} 过期", + "Mark as obsolete": "标记为作废", + "Mark obsolete": "标记作废", + "Returned by {{name}} {{time}}": "由 {{name}} 于 {{time}} 退回", + "No approval has been requested yet.": "尚未请求审批。", + "Submitted by {{name}} {{time}}": "由 {{name}} 于 {{time}} 提交", + "Someone": "某人", + "Approved by {{name}} {{time}}": "由 {{name}} 于 {{time}} 批准", + "This document has been marked as obsolete.": "此文档已被标记为作废。", + "Rejection comment": "退回意见", + "Reason for returning this document...": "退回此文档的原因...", + "Confirm rejection": "确认退回", + "Submit for approval": "提交审批", + "Reject": "退回", + "Approve": "批准", + "Re-submit for approval": "重新提交审批", + "Verified until": "验证有效期至", + "QMS": "QMS", + "Verified pages": "已验证页面", + "Search pages...": "搜索页面...", + "Filter by space": "按空间筛选", + "Filter by type": "按类型筛选", + "{{name}} verified a page": "{{name}} 验证了一个页面", + "{{name}} submitted a page for your approval": "{{name}} 提交了一个页面供您审批", + "{{name}} returned a page for revision": "{{name}} 退回了一个页面以供修改", + "Page verification expires soon": "页面验证即将过期", + "Page verification has expired": "页面验证已过期", + "SIEM destination {{name}} is failing": "SIEM 目标 {{name}} 发生故障", + "SIEM destination {{name}} was disabled after 24 hours of failures": "SIEM 目标 {{name}} 在连续 24 小时故障后已被禁用", + "SIEM destination {{name}} recovered": "SIEM 目标 {{name}} 已恢复", + "Verifying your email": "正在验证您的邮箱", + "Please wait...": "请稍候……", + "Verification failed. The link may have expired.": "验证失败。该链接可能已过期。", + "Check your email": "检查您的邮箱", + "We sent a verification link to {{email}}.": "我们已向{{email}}发送了一封验证邮件。", + "We sent a verification link to your email.": "我们已向您的邮箱发送了一封验证邮件。", + "Click the link to verify your email and access your workspace.": "请点击链接以验证邮箱并访问您的工作区。", + "Resend verification email": "重新发送验证邮件", + "Verification email sent. Please check your inbox.": "验证邮件已发送。请检查您的收件箱。", + "Failed to resend verification email. Please try again.": "重新发送验证邮件失败。请重试。", + "We've sent you an email with your associated workspaces.": "我们已向您发送包含关联工作区的邮件。", + "Load more": "加载更多", + "Log out of all devices": "退出所有设备登录", + "Log out of all sessions except this device": "退出除当前设备外的所有会话", + "This Device": "此设备", + "Unknown device": "未知设备", + "No active sessions": "没有活动会话", + "Session revoked": "会话已撤销", + "All other sessions revoked": "所有其他会话已撤销", + "Last used": "上次使用", + "Created": "创建时间", + "Rename": "重命名", + "Publish": "发布", + "Security": "安全", + "Enforce SSO": "强制使用 SSO", + "Once enforced, members will not be able to login with email and password.": "启用后,成员将无法使用邮箱和密码登录。", + "AI-generated content may not be accurate.": "AI 生成的内容可能并不准确。", + "AI Chat": "AI 聊天", + "Analyze for insights": "分析并获取洞察", + "Ask anything...": "随便问点什么...", + "Assistant said:": "助手说:", + "Chat history": "聊天记录", + "Chat name": "聊天名称", + "Chat transcript": "聊天记录", + "Close": "关闭", + "Copy assistant response": "复制助手回复", + "Docmost AI": "Docmost AI", + "Failed to load chat. An error occurred.": "加载聊天失败。发生错误。", + "Failed to render this message.": "渲染此消息失败。", + "How can I help you today?": "今天我可以如何帮助您?", + "New chat": "新聊天", + "No chat history": "没有聊天记录", + "No chats found": "未找到聊天", + "No conversations yet": "暂无对话", + "Open full page": "打开完整页面", + "Scroll to bottom": "滚动到底部", + "You said:": "你说:", + "Previous 7 days": "前 7 天", + "Previous 30 days": "前 30 天", + "Search chats...": "搜索聊天...", + "Search chats": "搜索聊天", + "Ask anything... Use @ to mention pages": "询问任何内容……使用 @ 提及页面", + "Ask anything or search your workspace": "询问任何问题或搜索你的工作区", + "Welcome to {{name}}": "欢迎使用 {{name}}", + "Add files": "添加文件", + "Mention a page": "提及页面", + "Start a new chat to see it here.": "开始新的聊天后会显示在这里。", + "Summarize this page": "总结此页面", + "Toggle AI Chat": "切换 AI 聊天", + "Translate this page": "翻译此页面", + "Try a different search term.": "请尝试其他搜索词。", + "Try again": "重试", + "Untitled chat": "未命名聊天", + "What can I help you with?": "我能帮您做什么?", + "Are you sure you want to revoke this {{credential}}": "确定要撤销此{{credential}}吗", + "Automatically provision users and groups from your identity provider via SCIM.": "通过 SCIM 从您的身份提供商自动预配用户和群组。", + "Configure your identity provider with this URL to provision users and groups.": "使用此 URL 配置您的身份提供商以预配用户和群组。", + "Create {{credential}}": "创建{{credential}}", + "{{credential}} created": "已创建{{credential}}", + "{{credential}} created successfully": "已成功创建{{credential}}", + "Created by": "创建者", + "Custom": "自定义", + "Enable SCIM": "启用 SCIM", + "Enter a descriptive name": "输入描述性名称", + "I've saved my {{credential}}": "我已保存我的{{credential}}", + "Important": "重要", + "Make sure to copy your {{credential}} now. You won't be able to see it again!": "请务必立即复制您的{{credential}}。之后您将无法再次查看!", + "Never": "从不", + "Revoke {{credential}}": "撤销{{credential}}", + "SCIM endpoint URL": "SCIM 端点 URL", + "SCIM provisioning": "SCIM 预配", + "SCIM takes precedence over SSO group sync while enabled.": "启用后,SCIM 的优先级高于 SSO 群组同步。", + "You have reached the maximum of {{max}} SCIM tokens. Delete an existing token to create a new one.": "您已达到 {{max}} 个 SCIM 令牌的上限。请删除一个现有令牌以创建新令牌。", + "SCIM token": "SCIM 令牌", + "SCIM tokens": "SCIM 令牌", + "This action cannot be undone. Your identity provider will stop syncing immediately.": "此操作无法撤销。您的身份提供商将立即停止同步。", + "Toggle SCIM provisioning": "切换 SCIM 预配", + "Token": "令牌", + "Page menu": "页面菜单", + "Expand": "展开", + "Collapse": "折叠", + "Comment menu": "评论菜单", + "Group menu": "群组菜单", + "Show hidden breadcrumbs": "显示隐藏的面包屑", + "Breadcrumbs": "面包屑", + "Page actions": "页面操作", + "Pick emoji": "选择表情符号", + "Template menu": "模板菜单", + "Use": "使用", + "Use template": "使用模板", + "Preview template: {{title}}": "预览模板:{{title}}", + "Use a template": "使用模板", + "Search templates...": "搜索模板……", + "Search spaces...": "搜索空间……", + "No templates found": "未找到模板", + "No spaces found": "未找到空间", + "Browse all templates": "浏览所有模板", + "This space": "此空间", + "All templates": "所有模板", + "Global": "全局", + "New template": "新建模板", + "Edit template": "编辑模板", + "Are you sure you want to delete this template?": "你确定要删除此模板吗?", + "Template scope updated": "模板范围已更新", + "Choose which space this template belongs to": "选择此模板所属的空间", + "Only workspace admins can create global templates.": "只有工作区管理员才能创建全局模板。", + "You need edit access to this space to create templates.": "您需要拥有此空间的编辑权限才能创建模板。", + "Scope": "范围", + "Select scope": "选择范围", + "Title": "标题", + "Saving...": "正在保存……", + "Saved": "已保存", + "Save failed. Retry": "保存失败。重试", + "By {{name}}": "作者:{{name}}", + "Updated {{time}}": "更新于 {{time}}", + "Choose destination": "选择目标位置", + "Search pages and spaces...": "搜索页面和空间……", + "No results found": "未找到结果", + "You don't have permission to create pages here": "你无权在此处创建页面", + "Chat menu for {{title}}": "{{title}} 的聊天菜单", + "API key menu": "API 密钥菜单", + "Jump to comment selection": "跳转到评论选择", + "Slash commands": "斜杠命令", + "Mention suggestions": "提及建议", + "Link suggestions": "链接建议", + "Diagram editor": "图表编辑器", + "Add comment": "添加评论", + "Find and replace": "查找和替换", + "Main navigation": "主导航", + "Space navigation": "空间导航", + "Settings navigation": "设置导航", + "AI navigation": "AI 导航", + "Breadcrumb": "面包屑", + "Synced block": "同步块", + "Create a block that stays in sync across pages.": "创建一个可在多个页面间保持同步的块。", + "Editing original": "正在编辑原始内容", + "Copy synced block": "复制同步块", + "Unsync": "取消同步", + "Delete synced block": "删除同步块", + "Synced to {{count}} other page_one": "已与另外 {{count}} 个页面同步", + "Synced to {{count}} other page_other": "已与另外 {{count}} 个页面同步", + "ORIGINAL": "原始内容", + "THIS PAGE": "此页面", + "No pages": "没有页面", + "The original synced block no longer exists": "原始同步块已不存在", + "You don't have access to this synced block": "你无权访问此同步块", + "Failed to load this synced block": "加载此同步块失败", + "Fixed editor toolbar": "固定编辑器工具栏", + "Show a formatting toolbar above the editor with quick access to common actions.": "在编辑器上方显示格式工具栏,便于快速访问常用操作。", + "Toggle fixed editor toolbar": "切换固定编辑器工具栏", + "Normal text": "普通文本", + "More inline formatting": "更多内联格式", + "Subscript": "下标", + "Superscript": "上标", + "Inline code": "行内代码", + "Insert media": "插入媒体", + "Mention": "提及", + "Emoji": "表情符号", + "Columns": "分栏", + "More inserts": "更多插入项", + "Embeds": "嵌入内容", + "Diagrams": "图表", + "Advanced": "高级", + "Utility": "实用工具", + "Decrease indent": "减少缩进", + "Increase indent": "增加缩进", + "Clear formatting": "清除格式", + "Code block": "代码块", + "Experimental": "实验性", + "Strikethrough": "删除线", + "Undo": "撤销", + "Redo": "重做", + "Backlinks": "反向链接", + "Last updated by": "最后更新者", + "Last updated": "最后更新", + "Stats": "统计", + "Word count": "字数", + "Characters": "字符数", + "Incoming links": "传入链接", + "Outgoing links": "传出链接", + "Incoming links ({{count}})": "传入链接({{count}})", + "Outgoing links ({{count}})": "传出链接({{count}})", + "No pages link here yet.": "还没有页面链接到这里。", + "This page doesn't link to other pages yet.": "此页面尚未链接到其他页面。", + "Verified until {{date}}": "验证有效期至 {{date}}", + "Labels": "标签", + "Add label": "添加标签", + "No labels yet": "还没有标签", + "Already added": "已添加", + "Invalid label name": "标签名称无效", + "No matches": "无匹配结果", + "Search or create…": "搜索或创建…", + "Remove label {{name}}": "移除标签 {{name}}", + "Failed to add label": "添加标签失败", + "Failed to remove label": "移除标签失败", + "No pages with this label": "没有带有此标签的页面", + "Pages tagged with this label will appear here.": "带有此标签的页面将显示在这里。", + "No pages match your search.": "没有页面匹配你的搜索。", + "Updated {{date}}": "更新于 {{date}}", + "Cell actions": "单元格操作", + "Column actions": "列操作", + "Row actions": "行操作", + "Filter": "筛选", + "Page title": "页面标题", + "Page content": "页面内容", + "Member actions for {{name}}": "{{name}} 的成员操作", + "Toggle password visibility": "切换密码可见性", + "Send comment": "发送评论", + "Token actions": "令牌操作", + "Template settings": "模板设置", + "Edit diagram": "编辑图表", + "Edit embed": "编辑嵌入内容", + "Edit drawing": "编辑绘图", + "Delete equation": "删除公式", + "Invite actions": "邀请操作", + "Get started": "开始使用", + "* indicates required fields": "* 表示必填字段", + "List of spaces in this workspace": "此工作区中的空间列表", + "Active sessions": "活动会话", + "Add {{name}} to favorites": "将 {{name}} 添加到收藏", + "Remove {{name}} from favorites": "将 {{name}} 从收藏中移除", + "Added to favorites": "已添加到收藏", + "Removed from favorites": "已从收藏中移除", + "Added {{name}} to favorites": "已将 {{name}} 添加到收藏", + "Removed {{name}} from favorites": "已将 {{name}} 从收藏中移除", + "Page menu for {{name}}": "{{name}} 的页面菜单", + "Create subpage of {{name}}": "创建 {{name}} 的子页面", + "Allow personal spaces": "允许个人空间", + "Members can create their own personal space.": "成员可以创建自己的个人空间。", + "Toggle allow personal spaces": "切换是否允许个人空间", + "Create personal space": "创建个人空间", + "Personal space": "个人空间", + "{{name}}'s space": "{{name}} 的空间", + "Apply": "应用", + "Cells that aren't already a page reference will be cleared.": "尚未是页面引用的单元格将被清空。", + "Cells that aren't a valid URL will be cleared.": "不是有效 URL 的单元格将被清空。", + "Cells that aren't a valid email address will be cleared.": "不是有效电子邮件地址的单元格将被清空。", + "Cells that can't be parsed as a date will be cleared.": "无法解析为日期的单元格将被清空。", + "Cells that can't be parsed as a number will be cleared.": "无法解析为数字的单元格将被清空。", + "Cells will be coerced (yes/true/1 become checked; everything else becomes unchecked or cleared).": "单元格将被强制转换(yes/true/1 将变为选中;其他所有值将变为未选中或被清空)。", + "Cells will be reinterpreted under the new type.": "单元格将在新类型下重新解释。", + "Cells will be replaced with a comma-separated list of file names.": "单元格将被替换为以逗号分隔的文件名列表。", + "Cells will be replaced with a comma-separated list of option names.": "单元格将被替换为以逗号分隔的选项名称列表。", + "Cells will be replaced with the option name.": "单元格将被替换为选项名称。", + "Cells will be replaced with the page title.": "单元格将被替换为页面标题。", + "Cells will be replaced with the person's name.": "单元格将被替换为此人的姓名。", + "Change type": "更改类型", + "Change type to {{label}}?": "将类型更改为 {{label}}?", + "Converting…": "正在转换…", + "Existing values become single-item lists. No data is lost.": "现有值将变为只包含一项的列表。不会丢失数据。", + "Only the first selected item per row will be kept; the rest will be discarded.": "每行仅保留第一个已选项目;其余项目将被丢弃。", + "Previous record": "上一条记录", + "Next record": "下一条记录", + "Record actions": "记录操作", + "Delete record": "删除记录", + "Delete record?": "删除记录?", + "This action cannot be undone.": "此操作无法撤销。", + "to navigate": "用于导航", + "to close": "用于关闭", + "Expand row {{number}}": "展开第 {{number}} 行", + "Saving…": "正在保存…", + "Read-only": "只读", + "Loading…": "正在加载…", + "Updated {{when}}": "更新于 {{when}}", + "Add property": "添加属性", + "Create property": "创建属性", + "Hide properties": "隐藏属性", + "Find a property type": "查找属性类型", + "Properties": "属性", + "A property with this name already exists": "已存在同名属性", + "Add card": "添加卡片", + "Add filter": "添加筛选", + "Add option": "添加选项", + "Add sort": "添加排序", + "Add view": "添加视图", + "All data in this column will be lost.": "此列中的所有数据都将丢失。", + "Allow multiple people": "允许多人", + "Alphabetize": "按字母顺序", + "Are you sure you want to delete": "您确定要删除", + "Ascending": "升序", + "Base deleted": "资料库已删除", + "Base name": "资料库名称", + "Base table": "资料库表", + "Card properties": "卡片属性", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "超出文本长度限制的单元格内容将被截断,额外内容将永久丢失。", + "Checkbox": "复选框", + "Checked by default": "默认选中", + "Choose a property": "选择一个属性", + "Clear selection": "清除选择", + "Column options": "列选项", + "Comma, period": "逗号、句点", + "Complete": "完成", + "Contains": "包含", + "Copy link to view": "复制视图链接", + "Create a status property": "创建状态属性", + "Created at": "创建于", + "Currency": "货币", + "Decimal places": "小数位数", + "Default value": "默认值", + "Delete property": "删除属性", + "Delete view": "删除视图", + "Delete {{count}} rows?_one": "删除 1 行?", + "Delete {{count}} rows?_other": "删除 {{count}} 行?", + "Descending": "降序", + "Discard": "放弃", + "Doesn't contain": "不包含", + "Done": "完成", + "Edit formula": "编辑公式", + "Edit property": "编辑属性", + "Export CSV": "导出 CSV", + "Failed to load base": "加载资料库失败", + "False": "假", + "File": "文件", + "Filter and sort changes are visible only to you": "筛选和排序更改仅对您可见", + "Filter by": "筛选条件", + "Formula": "公式", + "Get started with": "开始使用", + "Greater than": "大于", + "Group by": "分组依据", + "Group this board by a select or status property.": "按选择或状态属性对此看板进行分组。", + "Hide all": "全部隐藏", + "Hide group": "隐藏分组", + "In Progress": "进行中", + "In progress": "进行中", + "Include time": "包含时间", + "Insert a kanban board on this page": "在此页面插入一个看板", + "Insert an inline base on this page": "在此页面插入一个内联资料库", + "Is": "是", + "Is after": "在此之后", + "Is any of": "是其中之一", + "Is before": "在此之前", + "Is empty": "为空", + "Is none of": "都不是", + "Is not": "不是", + "Is not empty": "不为空", + "Is on or after": "在此日期或之后", + "Is on or before": "在此日期或之前", + "Is within": "在范围内", + "Keep editing": "继续编辑", + "Last edited at": "最后编辑于", + "Last edited by": "最后编辑者", + "Less than": "小于", + "Link copied to clipboard": "链接已复制到剪贴板", + "Local": "本地", + "Long text": "长文本", + "Moved card to {{column}}": "已将卡片移动到 {{column}}", + "Moved column to {{column}}": "已将列移动到 {{column}}", + "Multi-select": "多选", + "New row": "新行", + "Next month": "下个月", + "Next week": "下周", + "Next year": "明年", + "No filters applied": "未应用筛选", + "No match": "无匹配项", + "No options for this property type": "此属性类型没有可用选项", + "No sorts applied": "未应用排序", + "No value": "无值", + "None": "无", + "Not started": "未开始", + "Number": "数字", + "One month ago": "一个月前", + "One month from now": "从现在起一个月后", + "One week ago": "一周前", + "One week from now": "从现在起一周后", + "Open as page": "作为页面打开", + "Options": "选项", + "Past month": "过去一个月", + "Past week": "过去一周", + "Past year": "过去一年", + "Percent": "百分比", + "Period, comma": "句点、逗号", + "Person": "人员", + "Please enter a valid email": "请输入有效的电子邮件地址", + "Progress": "进度", + "Property options": "属性选项", + "Relative": "相对", + "Rename property": "重命名属性", + "Reset": "重置", + "Save for everyone": "保存给所有人", + "Select": "选择", + "Select a property": "选择一个属性", + "Select all loaded rows": "选择所有已加载的行", + "Show all": "显示全部", + "Sort": "排序", + "Sort by": "排序依据", + "Space, comma": "空格、逗号", + "Space, period": "空格、句点", + "This board has no grouping property yet.": "此看板尚无分组属性。", + "This month": "本月", + "This year": "今年", + "Thousands and decimal separators": "千位分隔符和小数分隔符", + "Time format": "时间格式", + "To Do": "待办", + "Tomorrow": "明天", + "True": "真", + "Unsaved changes": "未保存的更改", + "Untitled base": "未命名资料库", + "URL": "网址", + "Value": "值", + "View updated for everyone": "已为所有人更新视图", + "You have unsaved changes. Do you want to discard them?": "您有未保存的更改。要放弃这些更改吗?", + "{{count}} rows deleted_one": "已删除 1 行", + "{{count}} rows deleted_other": "已删除 {{count}} 行", + "{{count}} selected_one": "已选择 1 项", + "{{count}} selected_other": "已选择 {{count}} 项", + "Compare": "比较", + "Compare versions": "比较版本", + "Select version from {{date}}": "选择 {{date}} 的版本", + "Version actions for {{date}}": "{{date}} 的版本操作", + "Comparing {{newer}} and {{older}}": "正在比较 {{newer}} 和 {{older}}", + "Exit compare": "退出比较", + "Search attachments...": "搜索附件……", + "Error loading attachments.": "加载附件时出错。", + "No attachments on this page yet.": "此页面上还没有附件。", + "Uploaded by {{name}}": "由 {{name}} 上传", + "Download {{name}}": "下载 {{name}}", + "Access revoked": "访问权限已撤销", + "Authorize application": "授权应用程序", + "{{name}} wants to access {{workspace}}": "{{name}} 想要访问 {{workspace}}", + "Not you? Switch account": "不是你?切换账户", + "This application will be able to:": "此应用程序将能够:", + "Write": "写入", + "Invalid authorization request": "无效的授权请求", + "Authorize": "授权", + "Application": "应用程序", + "Permissions": "权限", + "Authorized": "已授权", + "Revoke access": "撤销访问权限", + "Revoke access for {{name}}": "撤销 {{name}} 的访问权限", + "Are you sure you want to revoke access for {{name}}? The application will no longer be able to access your account.": "你确定要撤销 {{name}} 的访问权限吗?该应用程序将无法再访问你的账户。", + "Something went wrong. Please try again.": "出了点问题。请重试。", + "Remove {{name}}": "移除 {{name}}", + "Make sure you trust this application before authorizing it.": "在授权之前,请确保你信任此应用程序。", + "You will be redirected to": "你将被重定向到", + "View content without making changes.": "查看内容而不进行更改。", + "Create and modify content.": "创建和修改内容。", + "Applications and AI assistants you have authorized to access your account.": "你已授权访问你账户的应用程序和 AI 助手。", + "Your workspace has MCP enabled. Connect AI assistants with your Docmost account via OAuth.": "你的工作区已启用 MCP。通过 OAuth 将 AI 助手连接到你的 Docmost 账户。", + "Authorized apps": "已授权的应用", + "No authorized apps yet.": "尚无已授权的应用。", + "Workspace knowledge only": "仅限工作区知识", + "Restrict AI Chat to answering from your workspace pages and uploaded files only. It will not use outside knowledge.": "将 AI 聊天限制为仅根据你的工作区页面和已上传文件进行回答。它不会使用外部知识。", + "Toggle workspace knowledge only": "切换“仅限工作区知识”", + "Read-only mode": "只读模式", + "AI Chat can search and read workspace content, but cannot create or edit pages.": "AI 聊天可以搜索和读取工作区内容,但不能创建或编辑页面。", + "Toggle AI Chat read-only mode": "切换 AI 聊天只读模式", + "Title only": "仅标题", + "you": "你", + "Allow public spaces": "允许公开空间", + "Space admins can publish their spaces to the web.": "空间管理员可以将其空间发布到 Web。", + "Toggle allow public spaces": "切换是否允许公开空间", + "Publish space to the web": "将空间发布到 Web", + "Anyone on the internet will be able to read every page in this space, except restricted pages. Are you sure?": "互联网上的任何人都将能够阅读此空间中的每个页面,但受限页面除外。您确定吗?", + "Make this space publicly readable by anyone on the internet.": "使此空间对互联网上的任何人公开可读。", + "Toggle publish space to the web": "切换将空间发布到 Web", + "Allow search engines to index": "允许搜索引擎编入索引", + "Let public pages in this space appear in search engine results.": "让此空间中的公开页面显示在搜索引擎结果中。", + "Toggle search engine indexing": "切换搜索引擎索引", + "Public space link": "公开空间链接", + "Copy public space link": "复制公开空间链接", + "Renaming the space slug will break public links.": "重命名空间 slug 会导致公开链接失效。", + "Failed to update space": "更新空间失败", + "This space is public": "此空间是公开的", + "Anyone on the internet can read the pages in this space, except restricted pages.": "互联网上的任何人都可以阅读此空间中的页面,但受限页面除外。", + "Open public site": "打开公开站点", + "Public": "公开", + "This space has no public pages yet.": "此空间中尚无公开页面。", + "On this page": "本页内容", + "Previous": "上一页", + "Next": "下一页", + "Show hidden pages": "显示隐藏页面", + "Page navigation": "页面导航", + "Toggle sidebar": "切换侧边栏", + "Toggle table of contents": "切换目录", + "Appearance": "外观", + "Forest": "森林绿", + "Violet": "紫罗兰", + "Light mode color": "浅色模式颜色", + "Dark mode color": "深色模式颜色", + "Choose the primary color of the public docs site.": "选择公开文档站点的主色。", + "Show page author": "显示页面作者", + "Display the page creator's name on public pages.": "在公开页面上显示页面创建者的姓名。", + "Toggle show page author": "切换显示页面作者", + "Show last updated": "显示最后更新时间", + "Display when each page was last updated.": "显示每个页面上次更新的时间。", + "Toggle show last updated": "切换显示最后更新时间", + "Open public page": "打开公开页面", + "Toggle color scheme": "切换配色方案", + "Ember": "余烬橙", + "Rose": "玫瑰红", + "Documentation": "文档", + "All published spaces.": "所有已发布的空间。", + "No public spaces yet.": "尚无公开空间。", + "Show public directory": "显示公开目录", + "List published spaces at /docs for anyone to browse.": "在 /docs 列出已发布的空间,供任何人浏览。", + "Toggle show public directory": "切换显示公开目录", + "Show in public directory": "在公开目录中显示", + "List this space in the public directory at /docs.": "在 /docs 的公开目录中列出此空间。", + "Toggle show in public directory": "切换在公开目录中显示", + "Open public space link": "打开公开空间链接", + "Disable public spaces": "禁用公开空间", + "Space admins will be able to make their spaces publicly readable by anyone on the internet. Are you sure?": "空间管理员将能够使其空间对互联网上的任何人公开可读。您确定吗?", + "This will immediately unpublish every published space. Re-enabling later will not republish them. Are you sure?": "这将立即取消发布所有已发布的空间。稍后重新启用也不会重新发布它们。您确定吗?", + "Allow": "允许", + "Shared pages": "共享页面", + "Published spaces": "已发布的空间", + "Spaces published to the web will appear here": "发布到 Web 的空间将显示在这里", + "No published spaces": "没有已发布的空间", + "Published by": "发布者", + "Published at": "发布时间", + "Open space": "打开空间", + "Unpublish": "取消发布", + "Unpublish space": "取消发布空间", + "This space will no longer be publicly accessible. Are you sure?": "此空间将不再可被公开访问。您确定吗?", + "More options for {{name}}": "{{name}} 的更多选项", + "Edit page": "编辑页面", + "Sign in": "登录", + "Open app": "打开应用", + "No spaces match your search.": "没有符合您搜索条件的空间。", + "Welcome to our documentation": "欢迎来到我们的文档", + "Guides, references and answers across all our published spaces.": "涵盖我们所有已发布空间的指南、参考资料和解答。", + "Guides, references and answers across all our spaces.": "涵盖我们所有空间的指南、参考资料和解答。", + "Search documentation...": "搜索文档……", + "1 published space": "1 个已发布空间", + "{{count}} published spaces": "{{count}} 个已发布空间", + "Actions": "操作", + "Add destination": "添加目标", + "Are you sure you want to delete the destination": "您确定要删除该目标吗", + "Audit logs": "审计日志", + "Audit logs & SIEM": "审计日志和 SIEM", + "Auth header name": "身份验证标头名称", + "Auth header prefix": "身份验证标头前缀", + "Body format": "正文格式", + "Created SIEM destination": "已创建 SIEM 目标", + "Datadog site": "Datadog 站点", + "Defaults to this instance's hostname": "默认为此实例的主机名", + "Delete destination": "删除目标", + "Deleted SIEM destination": "已删除 SIEM 目标", + "Destination created": "目标已创建", + "Destination deleted": "目标已删除", + "Destination updated": "目标已更新", + "Disabled": "已禁用", + "Edit destination": "编辑目标", + "Endpoint URL": "端点 URL", + "Failing": "故障中", + "Failing since {{time}}": "自 {{time}} 起发生故障", + "HEC token": "HEC 令牌", + "HEC URL": "HEC URL", + "Healthy": "正常", + "Hide advanced options": "隐藏高级选项", + "Host": "主机", + "Index": "索引", + "Insecure: connections can be intercepted.": "不安全:连接可能被拦截。", + "JSON array": "JSON 数组", + "Last delivered": "上次传送", + "Last error": "上次错误", + "Leave empty to use the token's default index": "留空以使用令牌的默认索引", + "Maximum of {{limit}} destinations reached": "最多只能添加 {{limit}} 个目标", + "Could not load SIEM destinations: {{message}}": "无法加载 SIEM 目标:{{message}}", + "No destinations yet": "暂无目标", + "Preset": "预设", + "Retry now": "立即重试", + "Retry scheduled": "已计划重试", + "Send test event": "发送测试事件", + "Sent in the auth header below. Leave empty if your receiver does not need one.": "将在下方的身份验证标头中发送。如果您的接收端不需要,请留空。", + "Service": "服务", + "Show advanced options": "显示高级选项", + "SIEM": "SIEM", + "SIEM streaming": "SIEM 流式传输", + "SIEM streaming requires an Enterprise license.": "SIEM 流式传输需要企业版许可证。", + "Source": "来源", + "Sourcetype": "源类型", + "Tags": "标签", + "Test connection": "测试连接", + "Test event delivered successfully.": "测试事件发送成功。", + "Test the connection before saving.": "请在保存前测试连接。", + "Test event delivered to {{name}}": "测试事件已发送到 {{name}}", + "Updated SIEM destination": "已更新 SIEM 目标", + "Verify TLS certificate": "验证 TLS 证书", + "e.g. Splunk prod": "例如:Splunk 生产环境" +} diff --git a/apps/client/public/manifest.json b/apps/client/public/manifest.json new file mode 100644 index 0000000..3e4b35d --- /dev/null +++ b/apps/client/public/manifest.json @@ -0,0 +1,30 @@ +{ + "name": "Docmost", + "short_name": "Docmost", + "start_url": "/", + "display": "standalone", + "background_color": "#222", + "theme_color": "#222", + "icons": [ + { + "src": "icons/favicon-16x16.png", + "type": "image/png", + "sizes": "16x16" + }, + { + "src": "icons/favicon-32x32.png", + "type": "image/png", + "sizes": "32x32" + }, + { + "src": "icons/app-icon-192x192.png", + "type": "image/png", + "sizes": "180x180 192x192" + }, + { + "src": "icons/app-icon-512x512.png", + "type": "image/png", + "sizes": "512x512" + } + ] +} diff --git a/apps/client/public/vite.svg b/apps/client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/client/src/App.tsx b/apps/client/src/App.tsx new file mode 100644 index 0000000..e4238a0 --- /dev/null +++ b/apps/client/src/App.tsx @@ -0,0 +1,202 @@ +import { lazy, Suspense, useEffect } from "react"; +import { Navigate, Route, Routes } from "react-router-dom"; +import Layout from "@/components/layouts/global/layout.tsx"; +import { Error404 } from "@/components/ui/error-404.tsx"; +import { isCloud } from "@/lib/config.ts"; +import { useTranslation } from "react-i18next"; +import { useRedirectToCloudSelect } from "@/ee/hooks/use-redirect-to-cloud-select.tsx"; +import { useTrackOrigin } from "@/hooks/use-track-origin"; + + +const SetupWorkspace = lazy(() => import("@/pages/auth/setup-workspace.tsx")); +const LoginPage = lazy(() => import("@/pages/auth/login")); +const Home = lazy(() => import("@/pages/dashboard/home")); +const Page = lazy(() => import("@/pages/page/page")); +const AccountSettings = lazy( + () => import("@/pages/settings/account/account-settings"), +); +const WorkspaceMembers = lazy( + () => import("@/pages/settings/workspace/workspace-members"), +); +const WorkspaceSettings = lazy( + () => import("@/pages/settings/workspace/workspace-settings"), +); +const Groups = lazy(() => import("@/pages/settings/group/groups")); +const GroupInfo = lazy(() => import("./pages/settings/group/group-info")); +const Spaces = lazy(() => import("@/pages/settings/space/spaces.tsx")); +const AccountPreferences = lazy( + () => import("@/pages/settings/account/account-preferences.tsx"), +); +const SpaceHome = lazy(() => import("@/pages/space/space-home.tsx")); +const PageRedirect = lazy(() => import("@/pages/page/page-redirect.tsx")); +const InviteSignup = lazy(() => import("@/pages/auth/invite-signup.tsx")); +const ForgotPassword = lazy(() => import("@/pages/auth/forgot-password.tsx")); +const PasswordReset = lazy(() => import("./pages/auth/password-reset")); +const Billing = lazy(() => import("@/ee/billing/pages/billing.tsx")); +const CloudLogin = lazy(() => import("@/ee/pages/cloud-login.tsx")); +const CreateWorkspace = lazy(() => import("@/ee/pages/create-workspace.tsx")); +const Security = lazy(() => import("@/ee/security/pages/security.tsx")); +const License = lazy(() => import("@/ee/licence/pages/license.tsx")); +const SharedPage = lazy(() => import("@/pages/share/shared-page.tsx")); +const PdfRenderPage = lazy(() => import("@/ee/pdf-export/pdf-render-page.tsx")); +const Shares = lazy(() => import("@/pages/settings/shares/shares.tsx")); +const ShareLayout = lazy( + () => import("@/features/share/components/share-layout.tsx"), +); +const ShareRedirect = lazy(() => import("@/pages/share/share-redirect.tsx")); +const PublicSpacePage = lazy( + () => import("@/pages/public-space/public-space-page.tsx"), +); +const PublicSpaceLayout = lazy( + () => import("@/features/public-space/components/public-space-layout.tsx"), +); +const PublicSpaceDirectoryPage = lazy( + () => import("@/pages/public-space/public-space-directory-page.tsx"), +); +const SpacesPage = lazy(() => import("@/pages/spaces/spaces.tsx")); +const MfaChallengePage = lazy(() => + import("@/ee/mfa/pages/mfa-challenge-page").then((m) => ({ + default: m.MfaChallengePage, + })), +); +const MfaSetupRequiredPage = lazy(() => + import("@/ee/mfa/pages/mfa-setup-required-page").then((m) => ({ + default: m.MfaSetupRequiredPage, + })), +); +const SpaceTrash = lazy(() => import("@/pages/space/space-trash.tsx")); +const UserApiKeys = lazy(() => import("@/ee/api-key/pages/user-api-keys")); +const WorkspaceApiKeys = lazy( + () => import("@/ee/api-key/pages/workspace-api-keys"), +); +const AiSettings = lazy(() => import("@/ee/ai/pages/ai-settings.tsx")); +const BasePage = lazy(() => import("@/ee/base/pages/base-page.tsx")); +const AuditLogs = lazy(() => import("@/ee/audit/pages/audit-logs.tsx")); +const VerifiedPages = lazy( + () => import("@/ee/page-verification/pages/verified-pages.tsx"), +); +const TemplateList = lazy(() => import("@/ee/template/pages/template-list")); +const TemplateEditor = lazy( + () => import("@/ee/template/pages/template-editor"), +); +const FavoritesPage = lazy(() => import("@/pages/favorites/favorites-page")); +const AiChat = lazy(() => import("@/ee/ai-chat/pages/ai-chat.tsx")); +const VerifyEmail = lazy(() => import("@/ee/pages/verify-email.tsx")); +const LabelPage = lazy(() => import("@/pages/label/label-page")); +const OAuthConsent = lazy(() => import("@/ee/oauth/pages/oauth-consent.tsx")); + +export default function App() { + const { t } = useTranslation(); + useRedirectToCloudSelect(); + useTrackOrigin(); + + useEffect(() => { + // warm the editor chunk so opening a page doesn't wait on the network + const timer = setTimeout(() => import("@/pages/page/page"), 3000); + return () => clearTimeout(timer); + }, []); + + return ( + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + {!isCloud() && ( + } /> + )} + + {isCloud() && ( + <> + } /> + } /> + } /> + + )} + + }> + } + /> + } /> + + + } /> + }> + } /> + } + /> + + + } /> + } /> + } /> + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } + /> + } /> + } /> + } + /> + + } /> + + + } /> + } + /> + } /> + } + /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } + /> + } /> + {!isCloud() && } />} + {isCloud() && } />} + + + + } /> + + + ); +} diff --git a/apps/client/src/assets/react.svg b/apps/client/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/apps/client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/client/src/components/common/avatar-uploader.tsx b/apps/client/src/components/common/avatar-uploader.tsx new file mode 100644 index 0000000..d7ac5f4 --- /dev/null +++ b/apps/client/src/components/common/avatar-uploader.tsx @@ -0,0 +1,183 @@ +import React, { useRef } from "react"; +import { Menu, Box, Loader } from "@mantine/core"; +import { useTranslation } from "react-i18next"; +import { IconTrash, IconUpload } from "@tabler/icons-react"; +import { CustomAvatar } from "@/components/ui/custom-avatar.tsx"; +import { AvatarIconType } from "@/features/attachments/types/attachment.types.ts"; +import { notifications } from "@mantine/notifications"; + +interface AvatarUploaderProps { + currentImageUrl?: string | null; + fallbackName?: string; + radius?: string | number; + size?: string | number; + variant?: string; + type: AvatarIconType; + onUpload: (file: File) => Promise; + onRemove: () => Promise; + isLoading?: boolean; + disabled?: boolean; +} + +export default function AvatarUploader({ + currentImageUrl, + fallbackName, + radius, + variant, + size, + type, + onUpload, + onRemove, + isLoading = false, + disabled = false, +}: AvatarUploaderProps) { + const { t } = useTranslation(); + const fileInputRef = useRef(null); + + const handleFileInputChange = async ( + event: React.ChangeEvent, + ) => { + const file = event.target.files?.[0]; + if (!file || disabled) { + return; + } + + // Validate file size (max 10MB) + const maxSizeInBytes = 10 * 1024 * 1024; + if (file.size > maxSizeInBytes) { + notifications.show({ + message: t("Image exceeds 10MB limit."), + color: "red", + }); + // Reset the input + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + return; + } + + try { + await onUpload(file); + } catch (error) { + console.error(error); + notifications.show({ + message: t("Failed to upload image"), + color: "red", + }); + } + + // Reset the input so the same file can be selected again + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + }; + + const handleUploadClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); + } else { + console.error("File input ref is null!"); + } + }; + + const actionLabel = { + [AvatarIconType.AVATAR]: t("Change avatar"), + [AvatarIconType.SPACE_ICON]: t("Change space icon"), + [AvatarIconType.WORKSPACE_ICON]: t("Change workspace icon"), + }[type]; + + // Per WCAG 2.5.3 (Label in Name), the accessible name must include the + // visible text. When no image is set, the avatar renders the name's + // initials, so prepend the name to the action label. + const ariaLabel = + !currentImageUrl && fallbackName + ? `${fallbackName} – ${actionLabel}` + : actionLabel; + + const handleRemove = async () => { + if (disabled) return; + + try { + await onRemove(); + notifications.show({ + message: t("Image removed successfully"), + }); + } catch (error) { + console.error(error); + notifications.show({ + message: t("Failed to remove image"), + color: "red", + }); + } + }; + + return ( + + + + + + + + {isLoading && ( + + + + )} + + + + + } + disabled={isLoading || disabled} + onClick={handleUploadClick} + > + {t("Upload image")} + + + {currentImageUrl && ( + } + color="red" + onClick={handleRemove} + disabled={isLoading || disabled} + > + {t("Remove image")} + + )} + + + + ); +} diff --git a/apps/client/src/components/common/copy-button.tsx b/apps/client/src/components/common/copy-button.tsx new file mode 100644 index 0000000..eb0721d --- /dev/null +++ b/apps/client/src/components/common/copy-button.tsx @@ -0,0 +1,33 @@ +// Source: https://github.com/mantinedev/mantine/blob/master/packages/@mantine/core/src/components/CopyButton/CopyButton.tsx - MIT +// modified to use the polyfilled clipboard api +import React from "react"; +import { useClipboard } from "@/hooks/use-clipboard"; +import { useProps } from "@mantine/core"; + +interface CopyButtonProps { + /** Children callback, provides current status and copy function as an argument */ + children: (payload: { copied: boolean; copy: () => void }) => React.ReactNode; + + /** Value that is copied to the clipboard when the button is clicked */ + value: string; + + /** Copied status timeout in ms @default `1000` */ + timeout?: number; +} + +const defaultProps = { + timeout: 1000, +} satisfies Partial; + +export function CopyButton(props: CopyButtonProps) { + const { children, timeout, value, ...others } = useProps( + "CopyButton", + defaultProps, + props, + ); + const clipboard = useClipboard({ timeout }); + const copy = () => clipboard.copy(value); + return <>{children({ copy, copied: clipboard.copied, ...others })}; +} + +CopyButton.displayName = "@mantine/core/CopyButton"; diff --git a/apps/client/src/components/common/copy.tsx b/apps/client/src/components/common/copy.tsx new file mode 100644 index 0000000..8bf4ec9 --- /dev/null +++ b/apps/client/src/components/common/copy.tsx @@ -0,0 +1,40 @@ +import { ActionIcon, MantineColor, MantineSize, Tooltip } from "@mantine/core"; +import { CopyButton } from "@/components/common/copy-button"; +import { IconCheck, IconCopy } from "@tabler/icons-react"; +import React from "react"; +import { useTranslation } from "react-i18next"; + +interface CopyProps { + text: string; + size?: MantineSize; + color?: MantineColor; + /** Override the accessible name (and tooltip) when not yet copied. Lets callers disambiguate adjacent copy buttons for screen readers. */ + label?: string; +} +export default function CopyTextButton({ text, size, label }: CopyProps) { + const { t } = useTranslation(); + + const copyLabel = label ?? t("Copy"); + + return ( + + {({ copied, copy }) => ( + + + {copied ? : } + + + )} + + ); +} diff --git a/apps/client/src/components/common/export-modal.tsx b/apps/client/src/components/common/export-modal.tsx new file mode 100644 index 0000000..bbd58b6 --- /dev/null +++ b/apps/client/src/components/common/export-modal.tsx @@ -0,0 +1,232 @@ +import { + Modal, + Button, + Group, + Text, + Select, + Switch, + Divider, + Tooltip, + Badge, +} from "@mantine/core"; +import { + exportPage, + exportPageToDocx, +} from "@/features/page/services/page-service.ts"; +import { useState } from "react"; +import { ExportFormat } from "@/features/page/types/page.types.ts"; +import { notifications } from "@mantine/notifications"; +import { exportSpace } from "@/features/space/services/space-service"; +import { useTranslation } from "react-i18next"; +import { Feature } from "@/ee/features"; +import { useHasFeature } from "@/ee/hooks/use-feature"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; + +interface ExportModalProps { + id: string; + type: "space" | "page"; + open: boolean; + onClose: () => void; +} + +export default function ExportModal({ + id, + type, + open, + onClose, +}: ExportModalProps) { + const [format, setFormat] = useState(ExportFormat.Markdown); + const [includeChildren, setIncludeChildren] = useState(false); + const [includeAttachments, setIncludeAttachments] = useState(false); + const [isExporting, setIsExporting] = useState(false); + const { t } = useTranslation(); + const upgradeLabel = useUpgradeLabel(); + const isDocx = format === ExportFormat.Docx; + const docxEntitled = useHasFeature(Feature.DOCX_EXPORT); + const blockedByLicense = isDocx && !docxEntitled; + + const handleExport = async () => { + setIsExporting(true); + try { + if (type === "page") { + if (format === ExportFormat.Docx) { + await exportPageToDocx({ pageId: id }); + } else { + await exportPage({ + pageId: id, + format, + includeChildren, + includeAttachments, + }); + } + } + if (type === "space") { + await exportSpace({ spaceId: id, format, includeAttachments }); + } + notifications.show({ + message: t("Export successful"), + }); + onClose(); + } catch (err) { + notifications.show({ + message: "Export failed:" + err.response?.data.message, + color: "red", + }); + console.error("export error", err); + } finally { + setIsExporting(false); + } + }; + + const handleChange = (format: ExportFormat) => { + setFormat(format); + }; + + return ( + e.stopPropagation()} + > + + + + {t(`Export ${type}`)} + + + + +
+ {t("Format")} +
+ +
+ + {type === "page" && !isDocx && ( + <> + + + +
+ {t("Include subpages")} +
+ + setIncludeChildren(event.currentTarget.checked) + } + checked={includeChildren} + /> +
+ + +
+ {t("Include attachments")} +
+ + setIncludeAttachments(event.currentTarget.checked) + } + checked={includeAttachments} + /> +
+ + )} + + {type === "space" && ( + <> + + + +
+ {t("Include attachments")} +
+ + setIncludeAttachments(event.currentTarget.checked) + } + checked={includeAttachments} + /> +
+ + )} + + + + + + + +
+
+
+ ); +} + +interface ExportFormatSelection { + format: ExportFormat; + onChange: (value: string) => void; + includeDocx?: boolean; + docxEntitled?: boolean; +} +function ExportFormatSelection({ + format, + onChange, + includeDocx, + docxEntitled, +}: ExportFormatSelection) { + const { t } = useTranslation(); + + const data = [ + { value: "markdown", label: "Markdown" }, + { value: "html", label: "HTML" }, + ...(includeDocx + ? [{ value: "docx", label: "Word (.docx)", disabled: !docxEntitled }] + : []), + ]; + + return ( + handleFileSelect(e.target.files)} + /> + + {((contextPages?.length ?? 0) > 0 || pendingAttachments.length > 0) && ( +
+ {contextPages?.map((page) => ( +
+ + + {page.title || "Untitled"} + + {onRemoveContextPage && ( + + )} +
+ ))} + {pendingAttachments.map((attachment) => ( +
+ {IMAGE_EXTENSIONS.includes(attachment.fileExt) ? ( + + ) : ( + + )} + + {attachment.fileName} + + {!attachment.uploading && ( + + )} +
+ ))} +
+ )} + + +
+ + + + + + + + + + +
+ + {isStreaming ? ( + + ) : ( + + )} +
+
+ {showDisclaimer && ( +
+ {t("AI-generated content may not be accurate.")} +
+ )} + + ); +}); + +export default ChatInput; diff --git a/apps/client/src/ee/ai-chat/components/chat-message-list.tsx b/apps/client/src/ee/ai-chat/components/chat-message-list.tsx new file mode 100644 index 0000000..4af9e41 --- /dev/null +++ b/apps/client/src/ee/ai-chat/components/chat-message-list.tsx @@ -0,0 +1,219 @@ +import { useEffect, useRef, useCallback, useState } from "react"; +import { ErrorBoundary } from "react-error-boundary"; +import { IconArrowDown, IconAlertTriangle } from "@tabler/icons-react"; +import { useTranslation } from "react-i18next"; +import { VisuallyHidden } from "@mantine/core"; +import type { AiChatMessage, AiChatToolCall } from "../types/ai-chat.types"; +import ChatMessage from "./chat-message"; +import classes from "../styles/ai-chat.module.css"; + +function ChatMessageErrorFallback() { + const { t } = useTranslation(); + return ( +
+ + {t("Failed to render this message.")} +
+ ); +} + +type Props = { + messages: AiChatMessage[]; + isStreaming: boolean; + streamingContent: string; + streamingToolCalls: AiChatToolCall[]; +}; + +const BOTTOM_THRESHOLD_PX = 32; +const SCROLL_UP_THRESHOLD_PX = 5; +const SMOOTH_SCROLL_SETTLE_MS = 600; + +export default function ChatMessageList({ + messages, + isStreaming, + streamingContent, + streamingToolCalls, +}: Props) { + const { t } = useTranslation(); + const containerRef = useRef(null); + const bottomRef = useRef(null); + const isAtBottomRef = useRef(true); + const isAutoScrollingRef = useRef(false); + const prevScrollTopRef = useRef(0); + const [showScrollButton, setShowScrollButton] = useState(false); + + // Dedicated status-region announcement for screen readers. Rather than + // putting aria-live on the whole transcript (which re-fires for every + // streamed token), announce "AI is thinking…" when streaming starts and + // the full assistant reply once streaming completes — a single, clean read. + const [statusAnnouncement, setStatusAnnouncement] = useState(""); + const wasStreamingRef = useRef(false); + + useEffect(() => { + const justStartedStreaming = isStreaming && !wasStreamingRef.current; + const justFinishedStreaming = !isStreaming && wasStreamingRef.current; + + if (justStartedStreaming) { + setStatusAnnouncement(t("AI is thinking...")); + } else if (justFinishedStreaming) { + const lastMessage = messages[messages.length - 1]; + if (lastMessage?.role === "assistant" && lastMessage.content) { + // Strip markdown punctuation so screen readers don't read symbols + // like # * _ ` ~ aloud. A plain-text version is fine — the styled + // version stays in the DOM for visual users. + const plainText = lastMessage.content + .replace(/[#*_`~]/g, "") + .replace(/\s+/g, " ") + .trim(); + setStatusAnnouncement(plainText); + } else { + setStatusAnnouncement(""); + } + } + + wasStreamingRef.current = isStreaming; + }, [isStreaming, messages, t]); + + const scrollToBottom = useCallback((behavior: ScrollBehavior = "smooth") => { + const container = containerRef.current; + if (!container) return; + + isAutoScrollingRef.current = true; + const target = container.scrollHeight - container.clientHeight; + container.scrollTo({ top: target, behavior }); + prevScrollTopRef.current = target; + isAtBottomRef.current = true; + setShowScrollButton(false); + + if (behavior === "smooth") { + setTimeout(() => { + isAutoScrollingRef.current = false; + if (containerRef.current) { + prevScrollTopRef.current = containerRef.current.scrollTop; + } + }, SMOOTH_SCROLL_SETTLE_MS); + } else { + isAutoScrollingRef.current = false; + } + }, []); + + const handleScroll = useCallback(() => { + if (isAutoScrollingRef.current) return; + + const container = containerRef.current; + if (!container) return; + + const currentScrollTop = container.scrollTop; + const scrolledUp = + currentScrollTop < prevScrollTopRef.current - SCROLL_UP_THRESHOLD_PX; + prevScrollTopRef.current = currentScrollTop; + + const distanceFromBottom = + container.scrollHeight - currentScrollTop - container.clientHeight; + const atBottom = distanceFromBottom <= BOTTOM_THRESHOLD_PX; + + if (scrolledUp) { + isAtBottomRef.current = atBottom; + } else if (atBottom) { + isAtBottomRef.current = true; + } + + setShowScrollButton(!atBottom); + }, []); + + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + container.addEventListener("scroll", handleScroll, { passive: true }); + return () => container.removeEventListener("scroll", handleScroll); + }, [handleScroll]); + + // Instant scroll during streaming to keep up with rapid updates + useEffect(() => { + if (isAtBottomRef.current) { + scrollToBottom("instant"); + } + }, [streamingContent, streamingToolCalls.length, scrollToBottom]); + + // Smooth scroll for new messages. Always force-scroll when the latest + // message is from the user (they just sent it), even if they were reading + // scrollback. + useEffect(() => { + const lastMessage = messages[messages.length - 1]; + const lastIsUser = lastMessage?.role === "user"; + if (lastIsUser || isAtBottomRef.current) { + scrollToBottom("smooth"); + return; + } + + // No auto-scroll: recompute from actual layout so that chat switches to + // content that doesn't overflow correctly hide the button even when no + // scroll event fires. + const container = containerRef.current; + if (!container) return; + const distanceFromBottom = + container.scrollHeight - container.scrollTop - container.clientHeight; + const atBottom = distanceFromBottom <= BOTTOM_THRESHOLD_PX; + isAtBottomRef.current = atBottom; + setShowScrollButton(!atBottom); + }, [messages, scrollToBottom]); + + return ( +
+ {/* Single status region for chat announcements. Kept outside the + scrolling transcript so changes here trigger one polite read per + state change instead of re-announcing every streamed token. */} + + {statusAnnouncement} + + +
+ {messages.map((msg) => ( + } + > + + + ))} + {isStreaming && ( + } + > + + + )} +
+
+ {showScrollButton && ( + + )} +
+ ); +} diff --git a/apps/client/src/ee/ai-chat/components/chat-message.tsx b/apps/client/src/ee/ai-chat/components/chat-message.tsx new file mode 100644 index 0000000..3eae42e --- /dev/null +++ b/apps/client/src/ee/ai-chat/components/chat-message.tsx @@ -0,0 +1,168 @@ +import { useCallback } from "react"; +import { useNavigate } from "react-router"; +import { useTranslation } from "react-i18next"; +import DOMPurify from "dompurify"; +import { ActionIcon, Tooltip } from "@mantine/core"; +import { + IconCheck, + IconCopy, + IconFile, + IconLoader2, + IconPhoto, +} from "@tabler/icons-react"; +import { markdownToHtml } from "@docmost/editor-ext"; +import { CopyButton } from "@/components/common/copy-button"; +import type { AiChatMessage, AiChatToolCall } from "../types/ai-chat.types"; +import ChatToolGroup from "./chat-tool-group"; +import classes from "../styles/chat-message.module.css"; +import CopyTextButton from "@/components/common/copy.tsx"; + +const PAGE_PATH_RE = /\/s\/[^/?#]+\/p\/[^/?#]+/; + +const chatSanitizer = DOMPurify(); +chatSanitizer.addHook("afterSanitizeAttributes", (node) => { + if (node.tagName !== "A") return; + const href = node.getAttribute("href") || ""; + + // Recover the canonical /s/{slug}/p/{slugId} path if the model wrapped it + // in a fabricated host (https://s/..., https://yoursite.com/s/..., //s/...). + const m = href.match(PAGE_PATH_RE); + if (m) { + node.setAttribute("href", m[0]); + node.removeAttribute("target"); + node.removeAttribute("rel"); + return; + } + + if (href.startsWith("http://") || href.startsWith("https://")) { + node.setAttribute("target", "_blank"); + node.setAttribute("rel", "noopener noreferrer"); + } +}); + +const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "webp", "gif"]; + +type Props = { + message: AiChatMessage; + isStreaming?: boolean; + streamingContent?: string; + streamingToolCalls?: AiChatToolCall[]; +}; + +export default function ChatMessage({ + message, + isStreaming, + streamingContent, + streamingToolCalls, +}: Props) { + const navigate = useNavigate(); + const { t } = useTranslation(); + + const handleContentClick = useCallback( + (e: React.MouseEvent) => { + const target = e.target as HTMLElement; + const anchor = target.closest("a"); + if (!anchor) return; + + const href = anchor.getAttribute("href"); + if (href && (href.startsWith("/s/") || href.startsWith("/p/"))) { + e.preventDefault(); + navigate(href); + } + }, + [navigate], + ); + + if (message.role === "tool") return null; + + const isUser = message.role === "user"; + const content = isStreaming ? streamingContent : message.content; + const toolCalls = isStreaming ? streamingToolCalls : message.toolCalls; + + if (isUser) { + const displayContent = (content || "").replace( + /\n\n[\s\S]*<\/referenced_pages>$/, + "", + ); + const attachments = + (message.metadata?.attachments as { + id: string; + fileName: string; + fileExt: string; + }[]) || []; + + return ( +
+
+ {attachments.length > 0 && ( +
+ {attachments.map((a) => ( + + {IMAGE_EXTENSIONS.includes(a.fileExt) ? ( + + ) : ( + + )} + {a.fileName} + + ))} +
+ )} + {displayContent} +
+
+ ); + } + + // Only label the article when there's something meaningful to announce. + // Tool-only assistant turns (no text) shouldn't announce "Assistant said:" with empty content. + const hasAnnouncableContent = Boolean(content); + + return ( +
+
+ {toolCalls && toolCalls.length > 0 && ( + + )} + {content && ( +
+ )} + {isStreaming && ( + <> + {!content && ( + + + Thinking + + )} + + + )} +
+ {!isStreaming && message.content && ( +
+ +
+ )} +
+ ); +} diff --git a/apps/client/src/ee/ai-chat/components/chat-tool-group.tsx b/apps/client/src/ee/ai-chat/components/chat-tool-group.tsx new file mode 100644 index 0000000..8e9b70d --- /dev/null +++ b/apps/client/src/ee/ai-chat/components/chat-tool-group.tsx @@ -0,0 +1,65 @@ +import { useState } from "react"; +import { + IconChevronRight, + IconChevronDown, + IconLoader2, +} from "@tabler/icons-react"; +import type { AiChatToolCall } from "../types/ai-chat.types"; +import ChatToolResult, { TOOL_LABELS } from "./chat-tool-result"; +import classes from "../styles/chat-message.module.css"; + +type Props = { + toolCalls: AiChatToolCall[]; + isStreaming?: boolean; +}; + +export default function ChatToolGroup({ toolCalls, isStreaming }: Props) { + const [expanded, setExpanded] = useState(false); + + if (!toolCalls || toolCalls.length === 0) return null; + + const activeCall = + isStreaming && toolCalls.length > 0 + ? [...toolCalls].reverse().find((tc) => tc.result === undefined) + : undefined; + + const activeLabel = activeCall + ? TOOL_LABELS[activeCall.name] || activeCall.name + : null; + + return ( +
+
setExpanded((prev) => !prev)} + onKeyDown={(event) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + setExpanded((prev) => !prev); + } + }} + > + {activeLabel ? ( + + ) : expanded ? ( + + ) : ( + + )} + + {activeLabel ? `${activeLabel}…` : `Steps ${toolCalls.length}`} + +
+ {expanded && ( +
+ {toolCalls.map((tc) => ( + + ))} +
+ )} +
+ ); +} diff --git a/apps/client/src/ee/ai-chat/components/chat-tool-result.tsx b/apps/client/src/ee/ai-chat/components/chat-tool-result.tsx new file mode 100644 index 0000000..55f20f9 --- /dev/null +++ b/apps/client/src/ee/ai-chat/components/chat-tool-result.tsx @@ -0,0 +1,49 @@ +import { useState } from "react"; +import { IconChevronRight, IconChevronDown } from "@tabler/icons-react"; +import type { AiChatToolCall } from "../types/ai-chat.types"; +import classes from "../styles/chat-message.module.css"; + +export const TOOL_LABELS: Record = { + list_spaces: "Listed spaces", + search_pages: "Searched pages", + get_page: "Read page", + create_page: "Created page", + update_page: "Updated page", +}; + +type Props = { + toolCall: AiChatToolCall; +}; + +export default function ChatToolResult({ toolCall }: Props) { + const [expanded, setExpanded] = useState(false); + const label = TOOL_LABELS[toolCall.name] || toolCall.name; + + return ( +
+
setExpanded((prev) => !prev)} + > + · + {expanded ? ( + + ) : ( + + )} + {label} +
+ {expanded && ( +
+
+            {JSON.stringify(
+              { args: toolCall.args, result: toolCall.result },
+              null,
+              2,
+            )}
+          
+
+ )} +
+ ); +} diff --git a/apps/client/src/ee/ai-chat/components/enable-ai-chat.tsx b/apps/client/src/ee/ai-chat/components/enable-ai-chat.tsx new file mode 100644 index 0000000..f4200e5 --- /dev/null +++ b/apps/client/src/ee/ai-chat/components/enable-ai-chat.tsx @@ -0,0 +1,67 @@ +import { Badge, Group, Text, Switch, Tooltip } from "@mantine/core"; +import { useAtom } from "jotai"; +import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { updateWorkspace } from "@/features/workspace/services/workspace-service.ts"; +import { notifications } from "@mantine/notifications"; +import { useHasFeature } from "@/ee/hooks/use-feature"; +import { Feature } from "@/ee/features"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; + +export default function EnableAiChat() { + const { t } = useTranslation(); + + return ( + +
+ + {t("AI Chat")} + + {t("Beta")} + + + + {t( + "Enable AI Chat to allow users to have multi-turn conversations with AI about your workspace content.", + )} + +
+ + +
+ ); +} + +function AiChatToggle() { + const { t } = useTranslation(); + const [workspace, setWorkspace] = useAtom(workspaceAtom); + const [checked, setChecked] = useState(workspace?.settings?.ai?.chat); + const hasAccess = useHasFeature(Feature.AI); + const upgradeLabel = useUpgradeLabel(); + + const handleChange = async (event: React.ChangeEvent) => { + const value = event.currentTarget.checked; + try { + const updatedWorkspace = await updateWorkspace({ aiChat: value } as any); + setChecked(value); + setWorkspace(updatedWorkspace); + } catch (err: any) { + notifications.show({ + message: err?.response?.data?.message, + color: "red", + }); + } + }; + + return ( + + + + ); +} diff --git a/apps/client/src/ee/ai-chat/hooks/use-chat-stream.ts b/apps/client/src/ee/ai-chat/hooks/use-chat-stream.ts new file mode 100644 index 0000000..65a93a9 --- /dev/null +++ b/apps/client/src/ee/ai-chat/hooks/use-chat-stream.ts @@ -0,0 +1,227 @@ +import { useState, useCallback, useEffect, useRef } from "react"; +import { useQueryClient } from "@tanstack/react-query"; +import { useNavigate } from "react-router-dom"; +import { sendChatMessage } from "../services/ai-chat-service"; +import type { + AiChatMessage, + AiChatStreamEvent, + AiChatToolCall, + ChatAttachment, + PageMention, +} from "../types/ai-chat.types"; + +type ChatStreamOptions = { + onChatCreated?: (chatId: string) => void; +}; + +export function useChatStream( + chatId: string | undefined, + options?: ChatStreamOptions, +) { + const [messages, setMessages] = useState([]); + const [streamingContent, setStreamingContent] = useState(""); + const [streamingToolCalls, setStreamingToolCalls] = useState( + [], + ); + const [isStreaming, setIsStreaming] = useState(false); + const [error, setError] = useState(null); + const [errorCode, setErrorCode] = useState(null); + const [isRetryable, setIsRetryable] = useState(false); + const abortRef = useRef(null); + const queryClient = useQueryClient(); + const navigate = useNavigate(); + const currentChatIdRef = useRef(chatId); + currentChatIdRef.current = chatId; + // Tracks which chatId the local `messages` state currently represents. + // Set when we seed from a server fetch AND when we optimistically own a + // freshly-created chat after `chat_created`. This is the single authority + // marker that keeps server-state effects from clobbering in-flight streams. + const hydratedChatIdRef = useRef(undefined); + + // Reset local state when the consumer switches to a different chat. + // Skip the reset if the new chatId is one the hook itself already claimed + // during a new-chat flow — in that case our optimistic state is the truth. + useEffect(() => { + if (chatId && chatId === hydratedChatIdRef.current) return; + hydratedChatIdRef.current = undefined; + setMessages([]); + setError(null); + setErrorCode(null); + setIsRetryable(false); + }, [chatId]); + + const hydrateFromServer = useCallback((msgs: AiChatMessage[]) => { + const forId = currentChatIdRef.current; + if (!forId) return; + if (hydratedChatIdRef.current === forId) return; + hydratedChatIdRef.current = forId; + setMessages(msgs); + }, []); + + const sendMessage = useCallback( + (content: string, mentions: PageMention[] = [], attachments: ChatAttachment[] = [], contextPageId?: string) => { + if (isStreaming || (!content.trim() && attachments.length === 0)) return; + + setError(null); + setErrorCode(null); + setIsRetryable(false); + setIsStreaming(true); + setStreamingContent(""); + setStreamingToolCalls([]); + + const metadata: Record = {}; + if (mentions.length) { + metadata.mentionedPageIds = mentions.map((m) => m.id); + } + if (attachments.length) { + metadata.attachments = attachments.map((a) => ({ + id: a.id, + fileName: a.fileName, + fileExt: a.fileExt, + })); + } + + const userMessage: AiChatMessage = { + id: `temp-${Date.now()}`, + chatId: currentChatIdRef.current || "", + role: "user", + content, + toolCalls: null, + metadata: Object.keys(metadata).length ? metadata : null, + createdAt: new Date().toISOString(), + }; + + setMessages((prev) => [...prev, userMessage]); + + const attachmentIds = attachments.map((a) => a.id); + + const abortController = sendChatMessage( + { + chatId: currentChatIdRef.current, + content, + mentionedPageIds: mentions.map((m) => m.id), + ...(contextPageId && { contextPageId }), + ...(attachmentIds.length && { attachmentIds }), + }, + (event: AiChatStreamEvent) => { + switch (event.type) { + case "chat_created": + currentChatIdRef.current = event.chatId; + // Claim authority over this new chatId so when the consumer's + // prop catches up via navigation/onChatCreated, the reset effect + // sees a match and preserves our optimistic messages. + hydratedChatIdRef.current = event.chatId; + if (options?.onChatCreated) { + options.onChatCreated(event.chatId); + } else { + navigate(`/ai/chat/${event.chatId}`, { replace: true }); + } + queryClient.invalidateQueries({ queryKey: ["ai-chats"] }); + break; + case "content": + setStreamingContent((prev) => prev + event.text); + break; + case "tool_call": + setStreamingToolCalls((prev) => [ + ...prev, + { + id: event.id, + name: event.name, + args: event.args, + }, + ]); + break; + case "tool_result": + setStreamingToolCalls((prev) => + prev.map((tc) => + tc.id === event.id ? { ...tc, result: event.result } : tc, + ), + ); + break; + case "done": { + setStreamingContent((currentContent) => { + setStreamingToolCalls((currentToolCalls) => { + const assistantMessage: AiChatMessage = { + id: event.messageId, + chatId: currentChatIdRef.current || "", + role: "assistant", + content: currentContent || null, + toolCalls: currentToolCalls.length + ? currentToolCalls + : null, + metadata: event.usage ? { tokenUsage: event.usage } : null, + createdAt: new Date().toISOString(), + }; + + setMessages((prev) => [...prev, assistantMessage]); + return []; + }); + return ""; + }); + setIsStreaming(false); + queryClient.invalidateQueries({ + queryKey: ["ai-chat", currentChatIdRef.current], + }); + break; + } + case "error": + setError(event.message); + setErrorCode(event.code || null); + setIsRetryable(event.retryable || false); + setIsStreaming(false); + break; + } + }, + (errorMsg) => { + setError(errorMsg); + setIsStreaming(false); + }, + () => { + setIsStreaming(false); + }, + ); + + abortRef.current = abortController; + }, + [isStreaming, navigate, queryClient], + ); + + const stopGeneration = useCallback(() => { + abortRef.current?.abort(); + abortRef.current = null; + + setStreamingContent((currentContent) => { + setStreamingToolCalls((currentToolCalls) => { + if (currentContent || currentToolCalls.length > 0) { + const partialMessage: AiChatMessage = { + id: `stopped-${Date.now()}`, + chatId: currentChatIdRef.current || "", + role: "assistant", + content: currentContent || null, + toolCalls: currentToolCalls.length ? currentToolCalls : null, + metadata: null, + createdAt: new Date().toISOString(), + }; + setMessages((prev) => [...prev, partialMessage]); + } + return []; + }); + return ""; + }); + + setIsStreaming(false); + }, []); + + return { + messages, + streamingContent, + streamingToolCalls, + isStreaming, + error, + errorCode, + isRetryable, + sendMessage, + stopGeneration, + hydrateFromServer, + }; +} diff --git a/apps/client/src/ee/ai-chat/pages/ai-chat.tsx b/apps/client/src/ee/ai-chat/pages/ai-chat.tsx new file mode 100644 index 0000000..bb264b7 --- /dev/null +++ b/apps/client/src/ee/ai-chat/pages/ai-chat.tsx @@ -0,0 +1,39 @@ +import { useParams } from "react-router-dom"; +import { ErrorBoundary } from "react-error-boundary"; +import { Button } from "@mantine/core"; +import { IconAlertTriangle } from "@tabler/icons-react"; +import { useTranslation } from "react-i18next"; +import AiChatLayout from "../components/ai-chat-layout"; +import { EmptyState } from "@/components/ui/empty-state.tsx"; +import classes from "../styles/ai-chat.module.css"; + +export default function AiChat() { + const { t } = useTranslation(); + const { chatId } = useParams<{ chatId: string }>(); + + return ( +
+ ( + + {t("Try again")} + + } + /> + )} + > + + +
+ ); +} diff --git a/apps/client/src/ee/ai-chat/queries/ai-chat-query.ts b/apps/client/src/ee/ai-chat/queries/ai-chat-query.ts new file mode 100644 index 0000000..8992a11 --- /dev/null +++ b/apps/client/src/ee/ai-chat/queries/ai-chat-query.ts @@ -0,0 +1,61 @@ +import { + useQuery, + useMutation, + useQueryClient, + useInfiniteQuery, +} from "@tanstack/react-query"; +import { + listChats, + getChatInfo, + deleteChat, + updateChatTitle, + searchChats, +} from "../services/ai-chat-service"; + +export function useChatsQuery() { + return useInfiniteQuery({ + queryKey: ["ai-chats"], + queryFn: ({ pageParam }) => + listChats({ cursor: pageParam, limit: 30 }), + initialPageParam: undefined as string | undefined, + getNextPageParam: (lastPage) => + lastPage.meta.hasNextPage ? lastPage.meta.nextCursor : undefined, + }); +} + +export function useChatInfoQuery(chatId: string | undefined) { + return useQuery({ + queryKey: ["ai-chat", chatId], + queryFn: () => getChatInfo(chatId!), + enabled: !!chatId, + }); +} + +export function useDeleteChatMutation() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (chatId: string) => deleteChat(chatId), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["ai-chats"] }); + }, + }); +} + +export function useUpdateChatTitleMutation() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ chatId, title }: { chatId: string; title: string }) => + updateChatTitle(chatId, title), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["ai-chats"] }); + }, + }); +} + +export function useSearchChatsQuery(query: string) { + return useQuery({ + queryKey: ["ai-chats-search", query], + queryFn: () => searchChats(query), + enabled: query.length > 0, + }); +} diff --git a/apps/client/src/ee/ai-chat/services/ai-chat-service.ts b/apps/client/src/ee/ai-chat/services/ai-chat-service.ts new file mode 100644 index 0000000..2932372 --- /dev/null +++ b/apps/client/src/ee/ai-chat/services/ai-chat-service.ts @@ -0,0 +1,144 @@ +import api from "@/lib/api-client.ts"; +import type { + AiChat, + AiChatMessage, + AiChatStreamEvent, + ChatAttachment, +} from "../types/ai-chat.types"; +import { IPagination } from "@/lib/types.ts"; + +export async function createChat(): Promise { + const req = await api.post("/ai/chats/create"); + return req.data; +} + +export async function listChats(params?: { + limit?: number; + cursor?: string; +}): Promise> { + const req = await api.post("/ai/chats", params); + return req.data; +} + +export async function getChatInfo( + chatId: string, +): Promise<{ chat: AiChat; messages: AiChatMessage[] }> { + const req = await api.post("/ai/chats/info", { chatId }); + return req.data; +} + +export async function deleteChat(chatId: string): Promise { + await api.post("/ai/chats/delete", { chatId }); +} + +export async function updateChatTitle( + chatId: string, + title: string, +): Promise { + await api.post("/ai/chats/update", { chatId, title }); +} + +export async function searchChats(query: string): Promise { + const req = await api.post("/ai/chats/search", { query }); + return req.data; +} + +export async function uploadChatFile( + file: File, + chatId?: string, +): Promise { + const formData = new FormData(); + formData.append("file", file); + if (chatId) { + formData.append("chatId", chatId); + } + return await api.post("/ai/chats/upload", formData, { + headers: { "Content-Type": "multipart/form-data" }, + }); +} + +export function sendChatMessage( + params: { + chatId?: string; + content: string; + mentionedPageIds?: string[]; + contextPageId?: string; + attachmentIds?: string[]; + }, + onEvent: (event: AiChatStreamEvent) => void, + onError?: (error: string) => void, + onComplete?: () => void, +): AbortController { + const abortController = new AbortController(); + + (async () => { + try { + const response = await fetch("/api/ai/chats/send", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(params), + signal: abortController.signal, + credentials: "include", + }); + + if (!response.ok) { + const errorBody = await response.text(); + let errorMessage = `HTTP error ${response.status}`; + try { + const parsed = JSON.parse(errorBody); + errorMessage = parsed.message || errorMessage; + } catch { + // use default + } + onError?.(errorMessage); + return; + } + + const reader = response.body?.getReader(); + const decoder = new TextDecoder(); + + if (!reader) { + onError?.("Response body is not readable"); + return; + } + + let buffer = ""; + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + buffer += decoder.decode(value, { stream: true }); + const lines = buffer.split("\n"); + buffer = lines.pop() || ""; + + for (const line of lines) { + if (line.startsWith("data: ")) { + const data = line.slice(6); + if (data === "[DONE]") { + onComplete?.(); + return; + } + try { + const parsed = JSON.parse(data) as AiChatStreamEvent; + onEvent(parsed); + } catch { + // Skip invalid JSON + } + } + } + } + } finally { + reader.releaseLock(); + } + + onComplete?.(); + } catch (error: any) { + if (error.name !== "AbortError") { + onError?.(error.message); + } + } + })(); + + return abortController; +} diff --git a/apps/client/src/ee/ai-chat/styles/ai-chat.module.css b/apps/client/src/ee/ai-chat/styles/ai-chat.module.css new file mode 100644 index 0000000..2daa0a2 --- /dev/null +++ b/apps/client/src/ee/ai-chat/styles/ai-chat.module.css @@ -0,0 +1,170 @@ +.layout { + display: flex; + height: 100%; + width: 100%; +} + +.main { + flex: 1; + display: flex; + flex-direction: column; + height: calc(100vh - 45px - 2 * var(--mantine-spacing-md)); + max-width: 900px; + margin: 0 auto; + width: 100%; +} + +.messageListWrapper { + flex: 1; + position: relative; + display: flex; + flex-direction: column; + min-height: 0; + height: 100%; + width: 100%; +} + +.messageList { + flex: 1; + overflow-y: auto; + padding: var(--mantine-spacing-md) var(--mantine-spacing-lg); +} + +.messageErrorFallback { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 12px; + margin-bottom: var(--mantine-spacing-lg); + border-radius: var(--mantine-radius-sm); + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2)); + font-size: var(--mantine-font-size-xs); +} + +.scrollToBottomButton { + position: absolute; + bottom: 12px; + left: 50%; + transform: translateX(-50%); + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + border: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + background: light-dark(var(--mantine-color-white), var(--mantine-color-dark-6)); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + cursor: pointer; + padding: 0; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + transition: background-color 120ms ease, border-color 120ms ease, transform 120ms ease; + z-index: 2; +} + +.scrollToBottomButton:hover { + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-5)); + border-color: light-dark(var(--mantine-color-gray-4), var(--mantine-color-dark-3)); +} + +.scrollToBottomButton:active { + transform: translateX(-50%) scale(0.95); +} + +.inputArea { + padding: var(--mantine-spacing-xs) var(--mantine-spacing-lg) var(--mantine-spacing-lg); +} + +.emptyState { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--mantine-spacing-xl) var(--mantine-spacing-lg); +} + +.emptyStateIcon { + width: 48px; + height: 48px; + margin-bottom: var(--mantine-spacing-sm); + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2)); +} + +.emptyStateBrand { + font-size: var(--mantine-font-size-xs); + font-weight: 600; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--mantine-color-dimmed); + margin-bottom: var(--mantine-spacing-xs); +} + +.emptyStateTitle { + font-size: 1.5rem; + font-weight: 600; + color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0)); + margin-top: 0; + margin-bottom: var(--mantine-spacing-xl); + text-align: center; +} + +.emptyStateInput { + width: 100%; + max-width: 600px; + margin-bottom: var(--mantine-spacing-xl); + padding: 6px 0; +} + +.suggestionsSection { + width: 100%; + max-width: 600px; +} + +.suggestionsLabel { + font-size: var(--mantine-font-size-xs); + font-weight: 500; + color: var(--mantine-color-dimmed); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-top: 0; + margin-bottom: var(--mantine-spacing-sm); +} + +.suggestionsGrid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: var(--mantine-spacing-sm); +} + +.suggestionCard { + display: flex; + align-items: flex-start; + gap: var(--mantine-spacing-sm); + padding: var(--mantine-spacing-sm) var(--mantine-spacing-md); + border: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); + border-radius: var(--mantine-radius-md); + cursor: pointer; + background: transparent; + transition: background-color 150ms, border-color 150ms; + text-align: left; + width: 100%; + + @mixin hover { + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); + border-color: light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + } +} + +.suggestionIcon { + flex-shrink: 0; + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2)); + margin-top: 1px; +} + +.suggestionText { + font-size: var(--mantine-font-size-sm); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + line-height: 1.4; +} diff --git a/apps/client/src/ee/ai-chat/styles/aside-chat-panel.module.css b/apps/client/src/ee/ai-chat/styles/aside-chat-panel.module.css new file mode 100644 index 0000000..f895861 --- /dev/null +++ b/apps/client/src/ee/ai-chat/styles/aside-chat-panel.module.css @@ -0,0 +1,139 @@ +.panel { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; +} + +.toolbar { + display: flex; + align-items: center; + gap: 4px; + padding: 0 0 var(--mantine-spacing-sm) 0; + border-bottom: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); +} + +.toolbarSpacer { + flex: 1; +} + +.titleButton { + display: flex; + align-items: center; + gap: 4px; + padding: 4px 8px; + border-radius: var(--mantine-radius-sm); + font-size: var(--mantine-font-size-sm); + font-weight: 500; + color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0)); + max-width: 60%; + min-width: 0; +} + +.titleButton:hover { + background-color: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6)); +} + +.titleText { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 0; +} + +.messages { + flex: 1; + overflow-y: auto; + padding: var(--mantine-spacing-sm) 0; + scroll-behavior: smooth; +} + +.inputArea { + padding-top: var(--mantine-spacing-sm); +} + +.emptyState { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: var(--mantine-spacing-md); + padding: var(--mantine-spacing-xl) var(--mantine-spacing-sm); +} + +.emptyStateIcon { + color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3)); +} + +.emptyStateTitle { + font-size: var(--mantine-font-size-lg); + font-weight: 600; + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + text-align: center; +} + +.quickActions { + display: flex; + flex-direction: column; + gap: 6px; + width: 100%; +} + +.quickAction { + display: flex; + align-items: center; + gap: var(--mantine-spacing-sm); + padding: var(--mantine-spacing-xs) var(--mantine-spacing-sm); + border: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); + border-radius: var(--mantine-radius-md); + cursor: pointer; + background: transparent; + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + font-size: var(--mantine-font-size-sm); + text-align: left; + width: 100%; + transition: background-color 150ms, border-color 150ms; + + @mixin hover { + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); + border-color: light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + } +} + +.quickActionIcon { + flex-shrink: 0; + color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3)); +} + +.historyList { + max-height: 300px; + overflow-y: auto; +} + +.historyItem { + display: flex; + align-items: center; + padding: var(--mantine-spacing-xs) var(--mantine-spacing-sm); + cursor: pointer; + border-radius: var(--mantine-radius-sm); + font-size: var(--mantine-font-size-sm); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + transition: background-color 150ms; + + @mixin hover { + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); + } + + &[data-active] { + background: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5)); + } +} + +.historyItemTitle { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/apps/client/src/ee/ai-chat/styles/chat-input.module.css b/apps/client/src/ee/ai-chat/styles/chat-input.module.css new file mode 100644 index 0000000..1401c2c --- /dev/null +++ b/apps/client/src/ee/ai-chat/styles/chat-input.module.css @@ -0,0 +1,242 @@ +.inputWrapper { + position: relative; + overflow: hidden; + border: 1px solid + light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); + border-radius: 16px; + background: light-dark(var(--mantine-color-white), var(--mantine-color-dark-7)); + box-shadow: light-dark( + 0 2px 40px 4px rgba(0, 0, 0, 0.07), + 0 2px 40px 4px rgba(0, 0, 0, 0.5) + ); + transition: + border-color 150ms, + box-shadow 150ms; + + &:focus-within { + border-color: light-dark( + var(--mantine-color-gray-3), + var(--mantine-color-dark-4) + ); + box-shadow: light-dark( + 0 4px 48px 6px rgba(0, 0, 0, 0.09), + 0 4px 48px 6px rgba(0, 0, 0, 0.6) + ); + } +} + +.inputWrapperFlat { + position: relative; + overflow: hidden; + border: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); + border-radius: 12px; + background: light-dark(var(--mantine-color-white), var(--mantine-color-dark-7)); + box-shadow: none; + transition: border-color 150ms; + + &:focus-within { + border-color: light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + } +} + +.disclaimer { + margin-top: 6px; + text-align: center; + font-size: var(--mantine-font-size-xs); + color: var(--mantine-color-dimmed); +} + +.attachmentChips { + display: flex; + flex-wrap: wrap; + gap: 6px; + padding: 10px 14px 0; +} + +.attachmentChip { + display: inline-flex; + align-items: center; + gap: 5px; + padding: 4px 8px; + border-radius: 8px; + background: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6)); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + font-size: var(--mantine-font-size-xs); + max-width: 200px; +} + +.attachmentChipUploading { + opacity: 0.55; +} + +.attachmentChipName { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.attachmentChipRemove { + display: flex; + align-items: center; + justify-content: center; + border: none; + background: none; + cursor: pointer; + padding: 0; + margin-left: 2px; + color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3)); + border-radius: 50%; + + @mixin hover { + color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0)); + } +} + +.editorContent { + overflow: hidden; + + :global(.ProseMirror) { + outline: none; + border: none; + background-color: transparent; + padding: 14px 18px 8px; + font-size: 15px; + line-height: 1.6; + max-height: 200px; + overflow-y: auto; + min-height: 24px; + color: light-dark(var(--mantine-color-gray-9), var(--mantine-color-dark-0)); + } + + :global(.ProseMirror p) { + margin-block-start: 0; + margin-block-end: 0; + } + + :global(.ProseMirror p.is-editor-empty:first-child::before) { + color: var(--mantine-color-placeholder); + content: attr(data-placeholder); + float: left; + height: 0; + pointer-events: none; + } +} + +.actions { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 4px 12px 10px; + gap: var(--mantine-spacing-xs); +} + +.sendButton { + width: 28px; + height: 28px; + min-width: 28px; + min-height: 28px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + border: none; + cursor: pointer; + transition: background-color 150ms, opacity 150ms; + background: light-dark(var(--mantine-color-dark-9), var(--mantine-color-gray-0)); + color: light-dark(var(--mantine-color-white), var(--mantine-color-dark-9)); + + &:disabled { + opacity: 0.25; + cursor: default; + } + + @mixin hover { + &:not(:disabled) { + opacity: 0.85; + } + } +} + +.attachButton { + display: flex; + align-items: center; + justify-content: center; + border: none; + background: none; + cursor: pointer; + padding: 2px; + color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3)); + transition: color 150ms; + + @mixin hover { + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + } +} + +.plusButton { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 50%; + border: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + background: none; + cursor: pointer; + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-3)); + transition: color 150ms, background-color 150ms; + + @mixin hover { + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); + } +} + +.plusMenuItem { + display: flex; + align-items: center; + gap: var(--mantine-spacing-sm); + padding: var(--mantine-spacing-xs) var(--mantine-spacing-sm); + border: none; + background: none; + cursor: pointer; + width: 100%; + font-size: var(--mantine-font-size-sm); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + border-radius: var(--mantine-radius-sm); + transition: background-color 150ms; + + @mixin hover { + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6)); + } + + &:disabled { + opacity: 0.45; + cursor: not-allowed; + background: none; + } +} + +.plusMenuIcon { + color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3)); +} + +.stopButton { + width: 28px; + height: 28px; + min-width: 28px; + min-height: 28px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + cursor: pointer; + transition: background-color 150ms; + background: light-dark(var(--mantine-color-white), var(--mantine-color-dark-6)); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + + @mixin hover { + background: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5)); + } +} diff --git a/apps/client/src/ee/ai-chat/styles/chat-message.module.css b/apps/client/src/ee/ai-chat/styles/chat-message.module.css new file mode 100644 index 0000000..33e39dd --- /dev/null +++ b/apps/client/src/ee/ai-chat/styles/chat-message.module.css @@ -0,0 +1,286 @@ +.message { + margin-bottom: var(--mantine-spacing-lg); +} + +.userMessage { + composes: message; + display: flex; + justify-content: flex-end; +} + +.userBubble { + max-width: 75%; + padding: 10px 16px; + border-radius: 18px; + background: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6)); + color: light-dark(var(--mantine-color-gray-9), var(--mantine-color-dark-0)); + font-size: 15px; + line-height: 1.6; + word-wrap: break-word; + overflow-wrap: break-word; +} + +[data-aside-chat] .userBubble { + background: light-dark(var(--mantine-color-white), var(--mantine-color-dark-7)); + border: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); +} + +.userBubble p { + margin: 0; +} + +.messageAttachments { + display: flex; + flex-wrap: wrap; + gap: 4px; + margin-bottom: 6px; +} + +.messageAttachmentChip { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 6px; + background: light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-2)); + font-size: var(--mantine-font-size-xs); + max-width: 180px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.assistantMessage { + composes: message; +} + +.messageContent { + font-size: 15px; + line-height: 1.7; + color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-1)); + word-wrap: break-word; + overflow-wrap: break-word; +} + +.messageContent p { + margin: 0 0 0.75em 0; +} + +.messageContent p:last-child { + margin-bottom: 0; +} + +.messageContent ul, +.messageContent ol { + margin: 0.5em 0 0.75em 0; + padding-left: 1.5em; +} + +.messageContent li { + margin-bottom: 0.3em; +} + +.messageContent h1, +.messageContent h2, +.messageContent h3 { + margin: 1em 0 0.5em 0; + font-weight: 600; + color: light-dark(var(--mantine-color-gray-9), var(--mantine-color-dark-0)); +} + +.messageContent h1 { + font-size: 1.4em; +} + +.messageContent h2 { + font-size: 1.2em; +} + +.messageContent h3 { + font-size: 1.05em; +} + +.messageContent pre { + background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-7)); + padding: var(--mantine-spacing-sm) var(--mantine-spacing-md); + border-radius: var(--mantine-radius-md); + overflow-x: auto; + font-size: var(--mantine-font-size-sm); + margin: 0.75em 0; +} + +.messageContent code { + background-color: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6)); + padding: 2px 6px; + border-radius: 4px; + font-size: 0.88em; +} + +.messageContent pre code { + background: none; + padding: 0; +} + +.messageContent blockquote { + border-left: 3px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + padding-left: var(--mantine-spacing-md); + margin: 0.75em 0; + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-2)); +} + +.messageContent a { + color: light-dark(var(--mantine-color-blue-7), var(--mantine-color-blue-4)); + text-decoration: none; + + @mixin hover { + text-decoration: underline; + } +} + +.messageContent a[href^="/s/"], +.messageContent a[href^="/p/"] { + color: light-dark(var(--mantine-color-dark-4), var(--mantine-color-dark-1)); + font-weight: 500; + text-decoration: none; + cursor: pointer; + + @mixin light { + border-bottom: 0.05em solid var(--mantine-color-dark-0); + } + + @mixin dark { + border-bottom: 0.05em solid var(--mantine-color-dark-2); + } + + @mixin hover { + text-decoration: none; + @mixin light { + border-bottom-color: var(--mantine-color-dark-2); + } + @mixin dark { + border-bottom-color: var(--mantine-color-dark-0); + } + } +} + +.messageContent hr { + border: none; + border-top: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5)); + margin: 1em 0; +} + +.toolGroup { + margin: 6px 0; + font-size: var(--mantine-font-size-xs); +} + +.toolGroupHeader { + display: inline-flex; + align-items: center; + gap: 6px; + cursor: pointer; + user-select: none; + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2)); + line-height: 1.4; + transition: color 120ms ease; +} + +.toolGroupHeader:hover { + color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0)); +} + +.toolGroupLabel { + font-weight: 500; +} + +.toolGroupSteps { + margin-top: 4px; + padding-left: 14px; + display: flex; + flex-direction: column; + gap: 2px; +} + +.toolStep { + font-size: var(--mantine-font-size-xs); +} + +.toolStepRow { + display: inline-flex; + align-items: center; + gap: 4px; + cursor: pointer; + user-select: none; + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2)); + line-height: 1.5; + transition: color 120ms ease; +} + +.toolStepRow:hover { + color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0)); +} + +.toolStepBullet { + display: inline-block; + width: 8px; + text-align: center; + opacity: 0.6; +} + +.toolStepDetails { + margin-top: 4px; + margin-left: 18px; + padding: 6px 10px; + border-radius: var(--mantine-radius-sm); + background: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-7)); + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + font-size: 11px; + line-height: 1.5; + overflow-x: auto; +} + +.messageActions { + display: flex; + align-items: center; + gap: 4px; + margin-top: 4px; + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2)); +} + +.processingIndicator { + display: inline-flex; + align-items: center; + gap: 6px; + color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3)); + font-size: var(--mantine-font-size-sm); +} + +.processingSpinner { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.streamingCursor { + display: inline-block; + width: 2px; + height: 1em; + background: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-0)); + animation: blink 1s step-end infinite; + vertical-align: text-bottom; + margin-left: 1px; +} + +@keyframes blink { + 50% { + opacity: 0; + } +} diff --git a/apps/client/src/ee/ai-chat/styles/chat-sidebar.module.css b/apps/client/src/ee/ai-chat/styles/chat-sidebar.module.css new file mode 100644 index 0000000..f344b6c --- /dev/null +++ b/apps/client/src/ee/ai-chat/styles/chat-sidebar.module.css @@ -0,0 +1,147 @@ +.sidebar { + height: 100%; + width: 100%; + padding: var(--mantine-spacing-md); + display: flex; + flex-direction: column; + gap: var(--mantine-spacing-xs); +} + +.header { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: var(--mantine-spacing-xs); +} + +.title { + margin: 0; + font-weight: 600; + font-size: var(--mantine-font-size-sm); +} + +.searchInput { + margin-bottom: var(--mantine-spacing-xs); +} + +.chatList { + flex: 1; + overflow-y: auto; +} + +.chatGroup + .chatGroup { + margin-top: var(--mantine-spacing-sm); +} + +.chatGroupLabel { + margin: 0; + padding: 4px var(--mantine-spacing-xs); + font-size: var(--mantine-font-size-xs); + font-weight: 600; + color: var(--mantine-color-dimmed); + user-select: none; +} + +.chatListEmpty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--mantine-spacing-xl) var(--mantine-spacing-md); + text-align: center; + gap: 4px; + user-select: none; +} + +.chatListEmptyIcon { + color: light-dark(var(--mantine-color-gray-5), var(--mantine-color-dark-3)); + margin-bottom: var(--mantine-spacing-xs); +} + +.chatListEmptyTitle { + font-size: var(--mantine-font-size-sm); + font-weight: 600; + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); +} + +.chatListEmptyHint { + font-size: var(--mantine-font-size-xs); + color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-3)); + line-height: 1.4; +} + +.chatItem { + display: flex; + align-items: center; + padding: 8px var(--mantine-spacing-xs); + border-radius: var(--mantine-radius-sm); + cursor: pointer; + text-decoration: none; + color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1)); + font-size: var(--mantine-font-size-sm); + user-select: none; + gap: var(--mantine-spacing-xs); + + @mixin hover { + background-color: light-dark( + var(--mantine-color-gray-1), + var(--mantine-color-dark-6) + ); + } + + &[data-active] { + background-color: light-dark( + var(--mantine-color-gray-2), + var(--mantine-color-dark-6) + ); + } +} + +.chatItemTitle { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.chatItemDate { + font-size: var(--mantine-font-size-xs); + color: var(--mantine-color-dimmed); + white-space: nowrap; + transition: opacity 150ms; +} + +.chatItemRenameInput { + font-size: var(--mantine-font-size-sm); + padding: 0; + height: auto; + min-height: 0; + background: transparent; + color: inherit; +} + +.chatItem:hover .chatItemDate, +.chatItem:focus-within .chatItemDate { + opacity: 0; +} + +.chatItemActions { + position: absolute; + right: var(--mantine-spacing-xs); + opacity: 0; + transition: opacity 150ms; +} + +.chatItem { + position: relative; +} + +.chatItem:hover .chatItemActions, +.chatItem:focus-within .chatItemActions { + opacity: 1; +} + +.chatItemActions :global(.mantine-ActionIcon-root):focus-visible { + outline: 2px solid var(--mantine-primary-color-filled); + outline-offset: 2px; +} diff --git a/apps/client/src/ee/ai-chat/types/ai-chat.types.ts b/apps/client/src/ee/ai-chat/types/ai-chat.types.ts new file mode 100644 index 0000000..89754d2 --- /dev/null +++ b/apps/client/src/ee/ai-chat/types/ai-chat.types.ts @@ -0,0 +1,49 @@ +export type AiChat = { + id: string; + workspaceId: string; + creatorId: string; + title: string | null; + createdAt: string; + updatedAt: string; +}; + +export type AiChatToolCall = { + id: string; + name: string; + args: Record; + result?: unknown; +}; + +export type AiChatMessage = { + id: string; + chatId: string; + role: 'user' | 'assistant' | 'tool'; + content: string | null; + toolCalls: AiChatToolCall[] | null; + metadata: Record | null; + createdAt: string; +}; + +export type AiChatStreamEvent = + | { type: 'chat_created'; chatId: string } + | { type: 'content'; text: string } + | { type: 'tool_call'; id: string; name: string; args: Record } + | { type: 'tool_result'; id: string; result: unknown } + | { type: 'done'; messageId: string; usage?: Record } + | { type: 'error'; message: string; code?: string; retryable?: boolean }; + +export type PageMention = { + id: string; + title: string; + slugId: string; + spaceSlug?: string; + icon?: string; +}; + +export type ChatAttachment = { + id: string; + fileName: string; + fileExt: string; + fileSize: number; + mimeType: string; +}; diff --git a/apps/client/src/ee/ai-chat/utils/group-chats-by-age.ts b/apps/client/src/ee/ai-chat/utils/group-chats-by-age.ts new file mode 100644 index 0000000..d2b1904 --- /dev/null +++ b/apps/client/src/ee/ai-chat/utils/group-chats-by-age.ts @@ -0,0 +1,45 @@ +import type { AiChat } from "../types/ai-chat.types"; + +export type ChatGroup = { key: string; label: string; chats: AiChat[] }; + +export function groupChatsByAge( + chats: AiChat[], + t: (key: string) => string, +): ChatGroup[] { + if (chats.length === 0) return []; + + const now = new Date(); + const startOfToday = new Date( + now.getFullYear(), + now.getMonth(), + now.getDate(), + ).getTime(); + const startOfYesterday = startOfToday - 24 * 60 * 60 * 1000; + const startOfLast7 = startOfToday - 7 * 24 * 60 * 60 * 1000; + const startOfLast30 = startOfToday - 30 * 24 * 60 * 60 * 1000; + + const buckets: Record = { + today: { key: "today", label: t("Today"), chats: [] }, + yesterday: { key: "yesterday", label: t("Yesterday"), chats: [] }, + last7: { key: "last7", label: t("Previous 7 days"), chats: [] }, + last30: { key: "last30", label: t("Previous 30 days"), chats: [] }, + older: { key: "older", label: t("Older"), chats: [] }, + }; + + for (const chat of chats) { + const ts = new Date(chat.updatedAt).getTime(); + if (ts >= startOfToday) buckets.today.chats.push(chat); + else if (ts >= startOfYesterday) buckets.yesterday.chats.push(chat); + else if (ts >= startOfLast7) buckets.last7.chats.push(chat); + else if (ts >= startOfLast30) buckets.last30.chats.push(chat); + else buckets.older.chats.push(chat); + } + + return [ + buckets.today, + buckets.yesterday, + buckets.last7, + buckets.last30, + buckets.older, + ].filter((b) => b.chats.length > 0); +} diff --git a/apps/client/src/ee/ai/components/ai-search-result.tsx b/apps/client/src/ee/ai/components/ai-search-result.tsx new file mode 100644 index 0000000..f082f25 --- /dev/null +++ b/apps/client/src/ee/ai/components/ai-search-result.tsx @@ -0,0 +1,113 @@ +import React, { useMemo } from "react"; +import { Paper, Text, Group, Stack, Loader, Box } from "@mantine/core"; +import { IconSparkles, IconFileText } from "@tabler/icons-react"; +import { Link } from "react-router-dom"; +import { IAiSearchResponse } from "../services/ai-search-service.ts"; +import { buildPageUrl } from "@/features/page/page.utils.ts"; +import { markdownToHtml } from "@docmost/editor-ext"; +import DOMPurify from "dompurify"; +import { useTranslation } from "react-i18next"; + +interface AiSearchResultProps { + result?: IAiSearchResponse; + isLoading?: boolean; + streamingAnswer?: string; + streamingSources?: any[]; +} + +export function AiSearchResult({ + result, + isLoading, + streamingAnswer = "", + streamingSources = [], +}: AiSearchResultProps) { + const { t } = useTranslation(); + + // Use streaming data if available, otherwise fall back to result + const answer = streamingAnswer || result?.answer || ""; + const sources = + streamingSources.length > 0 ? streamingSources : result?.sources || []; + + // Deduplicate sources by pageId, keeping the one with highest similarity + const deduplicatedSources = useMemo(() => { + if (!sources || sources.length === 0) return []; + + const pageMap = new Map(); + sources.forEach((source) => { + const existing = pageMap.get(source.pageId); + if (!existing || source.similarity > existing.similarity) { + pageMap.set(source.pageId, source); + } + }); + + return Array.from(pageMap.values()); + }, [sources]); + + if (isLoading && !answer) { + return ( + + + + {t("AI is thinking...")} + + + ); + } + + if (!answer && !isLoading) { + return null; + } + + return ( + + + + + + {t("AI Answer")} + + {isLoading && } + +
+ + + {deduplicatedSources.length > 0 && ( + + + {t("Sources")} + + {deduplicatedSources.map((source) => ( + + + + + + {source.title} + + + + + ))} + + )} + + ); +} diff --git a/apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.module.css b/apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.module.css new file mode 100644 index 0000000..a0293f9 --- /dev/null +++ b/apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.module.css @@ -0,0 +1,61 @@ +.aiMenu { + display: flex; + flex-direction: column; + width: 100%; + max-width: 600px; + min-height: 2.25rem; +} + +.aiInput { + width: 100%; + + & input { + height: 44px; + border-radius: 22px; + padding-left: 20px; + padding-right: 40px; + border: 1px solid + light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + font-size: var(--mantine-font-size-sm); + + &:focus { + border-color: light-dark( + var(--mantine-color-gray-4), + var(--mantine-color-dark-3) + ); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); + } + } +} +.menuItemSelected { + background-color: var(--mantine-color-gray-1); + + @mixin dark { + background-color: var(--mantine-color-dark-5); + } +} + +.resultPreview { + background-color: light-dark( + var(--mantine-color-white), + var(--mantine-color-dark-6) + ); + border: 1px solid + light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-4)); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.resultPreviewWrapper { + font-size: var(--mantine-font-size-md); + line-height: 1.6; + padding: var(--mantine-spacing-md); + + *:first-child { + margin-top: 0; + } + *:last-child { + margin-bottom: 0; + } +} diff --git a/apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.tsx b/apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.tsx new file mode 100644 index 0000000..f9fa2df --- /dev/null +++ b/apps/client/src/ee/ai/components/editor/ai-menu/ai-menu.tsx @@ -0,0 +1,358 @@ +import { Editor } from "@tiptap/react"; +import { ActionIcon, TextInput } from "@mantine/core"; +import { useDebouncedCallback, useMediaQuery } from "@mantine/hooks"; +import { + useCallback, + useEffect, + useMemo, + useRef, + useState, + type JSX, +} from "react"; +import { createPortal } from "react-dom"; +import { useAtom } from "jotai"; +import { IconArrowUp } from "@tabler/icons-react"; +import { showAiMenuAtom } from "@/features/editor/atoms/editor-atoms.ts"; +import { useAiGenerateStreamMutation } from "@/ee/ai/queries/ai-query.ts"; +import { AiAction } from "@/ee/ai/types/ai.types.ts"; +import { CommandItem, commandItems, CommandSet } from "./command-items.ts"; +import { CommandSelector } from "./command-selector.tsx"; +import { ResultPreview } from "./result-preview.tsx"; +import classes from "./ai-menu.module.css"; +import { marked } from "marked"; +import { DOMSerializer } from "@tiptap/pm/model"; +import { copyToClipboard, htmlToMarkdown, isEditorReady } from "@docmost/editor-ext"; +import { useLocation } from "react-router-dom"; + +interface EditorAiMenuProps { + editor: Editor | null; +} + +const EditorAiMenu = ({ editor }: EditorAiMenuProps): JSX.Element | null => { + const aiGenerateStreamMutation = useAiGenerateStreamMutation(); + const location = useLocation(); + const isSmBreakpoint = useMediaQuery("(max-width: 48em)"); + const [showAiMenu, setShowAiMenu] = useAtom(showAiMenuAtom); + const containerRef = useRef(null); + const inputRef = useRef(null); + const [prompt, setPrompt] = useState(""); + const [output, setOutput] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const [selectedIndex, setSelectedIndex] = useState(-1); + const [activeCommandSet, setActiveCommandSet] = useState("main"); + const [lastAction, setLastAction] = useState(null); + const [menuPlacement, setMenuPlacement] = useState<{ + top: number; + left: number; + width: number; + }>({ + top: 0, + left: 0, + width: 0, + }); + const currentItems = useMemo(() => { + return commandItems[activeCommandSet].filter((item) => { + return item.name.toLowerCase().includes(prompt.toLowerCase()); + }); + }, [prompt, output, activeCommandSet]); + const updateMenuPlacement = useCallback(() => { + if (!isEditorReady(editor) || !showAiMenu) return; + + const { view } = editor; + const { from, to } = editor.state.selection; + const editorRect = view.dom.getBoundingClientRect(); + const fromCoords = view.coordsAtPos(from); + const toCoords = view.coordsAtPos(to); + const topOffset = 8; + const editorPadding = isSmBreakpoint ? 16 : 48; + + const anchorBottom = + toCoords.bottom > 0 && toCoords.bottom < window.innerHeight + ? toCoords.bottom + : fromCoords.bottom; + + const menuMaxWidth = 600; + const editorLeft = editorRect.left + editorPadding; + const editorRight = editorRect.right - editorPadding; + const availableWidth = editorRight - editorLeft; + const menuWidth = Math.min(menuMaxWidth, availableWidth); + + let menuLeft = Math.max(editorLeft, fromCoords.left); + if (menuLeft + menuWidth > editorRight) { + menuLeft = editorRight - menuWidth; + } + menuLeft = Math.max(editorLeft, menuLeft); + + setMenuPlacement({ + top: anchorBottom + topOffset + window.scrollY, + left: menuLeft + window.scrollX, + width: menuWidth, + }); + }, [editor, showAiMenu, isSmBreakpoint]); + const resetMenu = useCallback(() => { + setPrompt(""); + setOutput(""); + setActiveCommandSet("main"); + setLastAction(null); + aiGenerateStreamMutation.reset(); + }, [aiGenerateStreamMutation.reset]); + const debouncedUpdateMenuPlacement = useDebouncedCallback( + updateMenuPlacement, + 60, + ); + const handleGenerate = useCallback( + (item?: CommandItem) => { + if (!isEditorReady(editor) || isLoading) return; + + let command: CommandItem | null = item || null; + + if (!command) { + if (!prompt) return; + + command = { + id: "custom", + name: "Custom", + action: AiAction.CUSTOM, + prompt, + }; + } + + const { from, to } = editor.state.selection; + const slice = editor.state.doc.slice(from, to); + const serializer = DOMSerializer.fromSchema(editor.schema); + const fragment = serializer.serializeFragment(slice.content); + const wrapper = document.createElement("div"); + wrapper.appendChild(fragment); + const content = htmlToMarkdown(wrapper.innerHTML); + + setOutput(""); + setIsLoading(true); + aiGenerateStreamMutation.mutate({ + action: command.action, + prompt: command.prompt, + content, + onChunk: (chunk) => { + setOutput((output) => output + chunk.content); + }, + onComplete: () => { + setPrompt(""); + setIsLoading(false); + setActiveCommandSet("result"); + }, + onError: () => { + setIsLoading(false); + resetMenu(); + }, + }); + setLastAction(command); + }, + [ + editor, + prompt, + isLoading, + aiGenerateStreamMutation.mutateAsync, + resetMenu, + ], + ); + const handleCommand = useCallback( + (item?: CommandItem) => { + setPrompt(""); + + if (!item) { + return handleGenerate(); + } + if (item.id === "back") { + return setActiveCommandSet("main"); + } + if (item.id === "result-replace") { + if (!isEditorReady(editor)) return setShowAiMenu(false); + const chain = editor.chain().focus(); + + if (lastAction.action === AiAction.CONTINUE_WRITING) { + chain.setTextSelection(editor.state.selection.to); + } + + const html = (marked.parse(output) as string).trim(); + const isSingleParagraph = + html.startsWith("

") && + html.endsWith("

") && + html.lastIndexOf("

") === 0; + + // Strip

wrapper for single-paragraph output to preserve inline context, + // then decode HTML entities via DOMParser since TipTap would otherwise + // treat the tagless string as plain text and insert entities literally. + const content = isSingleParagraph + ? new DOMParser().parseFromString(html.slice(3, -4), "text/html") + .body.innerHTML + : html; + + chain.insertContent(content).run(); + + return setShowAiMenu(false); + } + if (item.id === "result-insert-below") { + if (!isEditorReady(editor)) return setShowAiMenu(false); + editor + .chain() + .focus() + .setTextSelection(editor.state.selection.to) + .insertContent(marked.parse(output)) + .run(); + + return setShowAiMenu(false); + } + if (item.id === "result-copy") { + copyToClipboard(output); + + return setShowAiMenu(false); + } + if (item.id === "result-discard") { + setOutput(""); + + return resetMenu(); + } + if (item.id === "result-try-again" && lastAction) { + return handleGenerate(lastAction); + } + if (item.subCommandSet) { + return setActiveCommandSet(item.subCommandSet); + } + + return handleGenerate(item); + }, + [editor, output, lastAction, handleGenerate, resetMenu], + ); + const handleKeyDown = useCallback( + (event: React.KeyboardEvent) => { + const totalItems = currentItems.length; + const cycleSize = totalItems + 1; + + if (event.key === "Escape") { + return setShowAiMenu(false); + } + + if (event.key === "ArrowDown" || event.key === "ArrowUp") { + event.preventDefault(); + + return setSelectedIndex((selectedIndex) => { + const direction = event.key === "ArrowDown" ? 1 : -1; + const newIndex = selectedIndex + direction; + + if (newIndex < -1) return cycleSize - 1; + if (newIndex >= cycleSize) return 0; + + return newIndex; + }); + } + + if (event.key === "Enter") { + event.preventDefault(); + + return handleCommand(currentItems[selectedIndex]); + } + }, + [currentItems, selectedIndex], + ); + + useEffect(() => { + if (!isEditorReady(editor)) return; + + const handleClose = () => setShowAiMenu(false); + const observer = new ResizeObserver(() => { + debouncedUpdateMenuPlacement(); + }); + + updateMenuPlacement(); + editor.on("focus", handleClose); + editor.on("blur", handleClose); + window.addEventListener("resize", debouncedUpdateMenuPlacement); + window.addEventListener("scroll", debouncedUpdateMenuPlacement, true); + observer.observe(editor.view.dom); + + return () => { + editor.off("focus", handleClose); + editor.off("blur", handleClose); + window.removeEventListener("resize", debouncedUpdateMenuPlacement); + window.removeEventListener("scroll", debouncedUpdateMenuPlacement, true); + observer.disconnect(); + }; + }, [editor, updateMenuPlacement, debouncedUpdateMenuPlacement]); + + useEffect(() => { + setShowAiMenu(false); + }, [location]); + useEffect(() => { + if (showAiMenu) { + resetMenu(); + } + }, [showAiMenu, resetMenu]); + useEffect(() => { + // Focus input when menu opens or command set changes + requestAnimationFrame(() => { + inputRef.current?.focus({ preventScroll: true }); + }); + }, [showAiMenu, isLoading, currentItems]); + useEffect(() => { + if (!currentItems.length) { + setSelectedIndex(-1); + } + setSelectedIndex(prompt || activeCommandSet !== "main" ? 0 : -1); + }, [prompt, activeCommandSet, currentItems]); + + if (!showAiMenu) return null; + + return createPortal( +

+
+ + + setPrompt(e.currentTarget.value)} + rightSection={ + handleGenerate()} + > + + + } + onKeyDown={handleKeyDown} + /> + +
+
, + document.body, + ); +}; + +export { EditorAiMenu }; diff --git a/apps/client/src/ee/ai/components/editor/ai-menu/command-items.ts b/apps/client/src/ee/ai/components/editor/ai-menu/command-items.ts new file mode 100644 index 0000000..71eaa9c --- /dev/null +++ b/apps/client/src/ee/ai/components/editor/ai-menu/command-items.ts @@ -0,0 +1,219 @@ +import { AiAction } from "@/ee/ai/types/ai.types.ts"; +import { + IconSparkles, + IconArrowsMaximize, + IconArrowsMinimize, + IconWriting, + IconHelp, + IconList, + IconMoodSmile, + IconLanguage, + IconTrash, + IconRefresh, + IconChevronLeft, + IconCheck, + IconArrowDownLeft, + IconCopy, + IconTextPlus, + IconAlignJustified, +} from "@tabler/icons-react"; + +interface CommandItem { + name: string; + id: string; + icon?: typeof IconSparkles; + action?: AiAction; + prompt?: string; + subCommandSet?: CommandSet; +} + +type CommandSet = "main" | "tone" | "translate" | "result"; + +const mainItems: CommandItem[] = [ + { + id: "improve-writing", + name: "Improve writing", + icon: IconSparkles, + action: AiAction.IMPROVE_WRITING, + }, + { + id: "fix-spelling-grammar", + name: "Fix spelling & grammar", + icon: IconCheck, + action: AiAction.FIX_SPELLING_GRAMMAR, + }, + { + id: "make-longer", + name: "Make longer", + icon: IconTextPlus, + action: AiAction.MAKE_LONGER, + }, + { + id: "make-shorter", + name: "Make shorter", + icon: IconAlignJustified, + action: AiAction.MAKE_SHORTER, + }, + { + id: "continue-writing", + name: "Continue writing", + icon: IconWriting, + action: AiAction.CONTINUE_WRITING, + }, + { + id: "explain", + name: "Explain", + icon: IconHelp, + action: AiAction.EXPLAIN, + }, + { + id: "summarize", + name: "Summarize", + icon: IconList, + action: AiAction.SUMMARIZE, + }, + { + id: "change-tone", + name: "Change tone", + icon: IconMoodSmile, + subCommandSet: "tone", + }, + { + id: "translate", + name: "Translate", + icon: IconLanguage, + subCommandSet: "translate", + }, +]; +const toneItems: CommandItem[] = [ + { + id: "back", + name: "Back", + icon: IconChevronLeft, + }, + { + id: "tone-professional", + name: "Professional", + icon: IconMoodSmile, + action: AiAction.CHANGE_TONE, + prompt: "Professional", + }, + { + id: "tone-casual", + name: "Casual", + icon: IconMoodSmile, + action: AiAction.CHANGE_TONE, + prompt: "Casual", + }, + { + id: "tone-friendly", + name: "Friendly", + icon: IconMoodSmile, + action: AiAction.CHANGE_TONE, + prompt: "Friendly", + }, +]; +const translateItems: CommandItem[] = [ + { + id: "back", + name: "Back", + icon: IconChevronLeft, + }, + { + id: "translate-english", + name: "English", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "English", + }, + { + id: "translate-spanish", + name: "Spanish", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Spanish", + }, + { + id: "translate-german", + name: "German", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "German", + }, + { + id: "translate-french", + name: "French", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "French", + }, + { + id: "translate-dutch", + name: "Dutch", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Dutch", + }, + { + id: "translate-portuguese", + name: "Portuguese", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Portuguese", + }, + { + id: "translate-italian", + name: "Italian", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Italian", + }, + { + id: "translate-japanese", + name: "Japanese", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Japanese", + }, + { + id: "translate-korean", + name: "Korean", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Korean", + }, + { + id: "translate-swedish", + name: "Swedish", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Swedish", + }, + { + id: "translate-chinese", + name: "Chinese (Simplified)", + icon: IconLanguage, + action: AiAction.TRANSLATE, + prompt: "Simplified Chinese", + }, +]; +const resultItems: CommandItem[] = [ + { id: "result-replace", name: "Replace", icon: IconCheck }, + { id: "result-insert-below", name: "Insert below", icon: IconArrowDownLeft }, + { id: "result-copy", name: "Copy", icon: IconCopy }, + { id: "result-discard", name: "Discard", icon: IconTrash }, + { + id: "result-try-again", + name: "Try again", + icon: IconRefresh, + }, +]; +const commandItems: Record = { + main: mainItems, + tone: toneItems, + translate: translateItems, + result: resultItems, +}; + +export type { CommandItem, CommandSet }; +export { commandItems }; diff --git a/apps/client/src/ee/ai/components/editor/ai-menu/command-selector.tsx b/apps/client/src/ee/ai/components/editor/ai-menu/command-selector.tsx new file mode 100644 index 0000000..8e66bee --- /dev/null +++ b/apps/client/src/ee/ai/components/editor/ai-menu/command-selector.tsx @@ -0,0 +1,72 @@ +import { Loader, Menu, ScrollArea } from "@mantine/core"; +import { IconChevronRight } from "@tabler/icons-react"; +import { ReactNode } from "react"; +import { CommandItem } from "./command-items.ts"; +import classes from "./ai-menu.module.css"; + +interface CommandSelectorProps { + selectedIndex: number; + + isLoading: boolean; + output: string; + currentItems: CommandItem[]; + children: ReactNode; + handleCommand(item: CommandItem): void; +} + +const CommandSelector = ({ + selectedIndex, + children, + isLoading, + output, + currentItems, + handleCommand, +}: CommandSelectorProps) => { + return ( + 0} + middlewares={{ flip: false }} + position="bottom-start" + offset={4} + width={250} + trapFocus={false} + shadow="lg" + > + {children} + + + {currentItems.map((item, index) => { + const isSelected = selectedIndex === index; + const showLoader = + isLoading && output === "" && !item.subCommandSet; + + return ( + + ) : item.icon ? ( + + ) : undefined + } + rightSection={ + item.subCommandSet ? ( + + ) : undefined + } + onClick={() => handleCommand(item)} + disabled={isLoading} + > + {item.name} + + ); + })} + + + + ); +}; + +export { CommandSelector }; diff --git a/apps/client/src/ee/ai/components/editor/ai-menu/result-preview.tsx b/apps/client/src/ee/ai/components/editor/ai-menu/result-preview.tsx new file mode 100644 index 0000000..d34682e --- /dev/null +++ b/apps/client/src/ee/ai/components/editor/ai-menu/result-preview.tsx @@ -0,0 +1,32 @@ +import { Loader, Paper, ScrollArea } from "@mantine/core"; +import DOMPurify from "dompurify"; +import { marked } from "marked"; +import { memo } from "react"; +import classes from "./ai-menu.module.css"; + +interface ResultPreviewProps { + output: string; + isLoading: boolean; +} +const ResultPreview = memo(({ output, isLoading }: ResultPreviewProps) => { + if (!output && !isLoading) return; + + const parsedOutput = `${marked.parse(output)}`; + + return ( + + +
+ {parsedOutput && ( +
+ )} + {isLoading && } +
+ + + ); +}); + +export { ResultPreview }; diff --git a/apps/client/src/ee/ai/components/enable-ai-search.tsx b/apps/client/src/ee/ai/components/enable-ai-search.tsx new file mode 100644 index 0000000..3a2abd2 --- /dev/null +++ b/apps/client/src/ee/ai/components/enable-ai-search.tsx @@ -0,0 +1,71 @@ +import { Group, Text, Switch, MantineSize, Tooltip } from "@mantine/core"; +import { useAtom } from "jotai"; +import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { updateWorkspace } from "@/features/workspace/services/workspace-service.ts"; +import { notifications } from "@mantine/notifications"; +import { useHasFeature } from "@/ee/hooks/use-feature"; +import { Feature } from "@/ee/features"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; + +export default function EnableAiSearch() { + const { t } = useTranslation(); + + return ( + <> + +
+ {t("AI-powered search (AI Answers)")} + + {t( + "AI search uses vector embeddings to provide semantic search capabilities across your workspace content.", + )} + +
+ + +
+ + ); +} + +interface AiSearchToggleProps { + size?: MantineSize; + label?: string; +} +export function AiSearchToggle({ size, label }: AiSearchToggleProps) { + const { t } = useTranslation(); + const [workspace, setWorkspace] = useAtom(workspaceAtom); + const [checked, setChecked] = useState(workspace?.settings?.ai?.search); + const hasAccess = useHasFeature(Feature.AI); + const upgradeLabel = useUpgradeLabel(); + + const handleChange = async (event: React.ChangeEvent) => { + const value = event.currentTarget.checked; + try { + const updatedWorkspace = await updateWorkspace({ aiSearch: value }); + setChecked(value); + setWorkspace(updatedWorkspace); + } catch (err) { + notifications.show({ + message: err?.response?.data?.message, + color: "red", + }); + } + }; + + return ( + + + + ); +} diff --git a/apps/client/src/ee/ai/components/enable-generative-ai.tsx b/apps/client/src/ee/ai/components/enable-generative-ai.tsx new file mode 100644 index 0000000..1db611c --- /dev/null +++ b/apps/client/src/ee/ai/components/enable-generative-ai.tsx @@ -0,0 +1,53 @@ +import { Group, Text, Switch, Tooltip } from "@mantine/core"; +import { useAtom } from "jotai"; +import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { updateWorkspace } from "@/features/workspace/services/workspace-service.ts"; +import { notifications } from "@mantine/notifications"; +import { useHasFeature } from "@/ee/hooks/use-feature"; +import { Feature } from "@/ee/features"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; + +export default function EnableGenerativeAi() { + const { t } = useTranslation(); + const [workspace, setWorkspace] = useAtom(workspaceAtom); + const [checked, setChecked] = useState(workspace?.settings?.ai?.generative); + const hasAccess = useHasFeature(Feature.AI); + const upgradeLabel = useUpgradeLabel(); + + const handleChange = async (event: React.ChangeEvent) => { + const value = event.currentTarget.checked; + try { + const updatedWorkspace = await updateWorkspace({ generativeAi: value }); + setChecked(value); + setWorkspace(updatedWorkspace); + } catch (err) { + notifications.show({ + message: err?.response?.data?.message, + color: "red", + }); + } + }; + + return ( + +
+ {t("Generative AI (Ask AI)")} + + {t( + "Enable AI-powered content generation in the editor. Allows users to generate, improve, translate and transform text.", + )} + +
+ + + + +
+ ); +} diff --git a/apps/client/src/ee/ai/components/mcp-settings.tsx b/apps/client/src/ee/ai/components/mcp-settings.tsx new file mode 100644 index 0000000..20952ad --- /dev/null +++ b/apps/client/src/ee/ai/components/mcp-settings.tsx @@ -0,0 +1,210 @@ +import { + Anchor, + Badge, + Group, + List, + Text, + Switch, + TextInput, + ActionIcon, + Tooltip, + Stack, + Alert, +} from "@mantine/core"; +import { useAtom } from "jotai"; +import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts"; +import React, { useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import { updateWorkspace } from "@/features/workspace/services/workspace-service.ts"; +import { notifications } from "@mantine/notifications"; +import { useHasFeature } from "@/ee/hooks/use-feature"; +import { Feature } from "@/ee/features"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; +import { getAppUrl } from "@/lib/config.ts"; +import { IconCheck, IconCopy, IconInfoCircle } from "@tabler/icons-react"; +import { CopyButton } from "@/components/common/copy-button.tsx"; + +export default function McpSettings() { + const { t } = useTranslation(); + const [workspace, setWorkspace] = useAtom(workspaceAtom); + const [checked, setChecked] = useState(workspace?.settings?.ai?.mcp); + const hasAccess = useHasFeature(Feature.MCP); + const upgradeLabel = useUpgradeLabel(); + + const mcpUrl = `${getAppUrl()}/mcp`; + + const handleChange = async (event: React.ChangeEvent) => { + const value = event.currentTarget.checked; + try { + const updatedWorkspace = await updateWorkspace({ mcpEnabled: value }); + setChecked(value); + setWorkspace(updatedWorkspace); + } catch (err) { + notifications.show({ + message: err?.response?.data?.message, + color: "red", + }); + } + }; + + return ( + + {!hasAccess && ( + } title={upgradeLabel} color="blue"> + {t( + "MCP is only available in the Docmost enterprise edition. Contact sales@docmost.com.", + )} + + )} + + +
+ {t("Model Context Protocol (MCP)")} + + {t( + "Enable the MCP server to allow AI assistants and tools to interact with your workspace content.", + )}{" "} + , + }} + /> + +
+ + + + +
+ + {checked && ( +
+ + {t("MCP Server URL")} + + + + + {({ copied, copy }) => ( + + + {copied ? : } + + + )} + + + + {t("Connect AI assistants with your Docmost account via OAuth.")} + + + + +
+ + {t("Supported tools")} + + + + + search_pages, get_page, create_page, update_page + + + + + list_pages, list_child_pages, duplicate_page + + + + + copy_page_to_space, move_page, move_page_to_space + + + + + get_space, list_spaces, create_space, update_space + + + + + get_comments, create_comment, update_comment + + + + + search_attachments, list_workspace_members, get_current_user + + + +
+
+ )} +
+ ); +} + +function McpEnforceOauthSetting() { + const { t } = useTranslation(); + const [workspace, setWorkspace] = useAtom(workspaceAtom); + const [checked, setChecked] = useState(workspace?.settings?.ai?.enforceMcpOauth); + const hasAccess = useHasFeature(Feature.MCP_CONTROLS); + const upgradeLabel = useUpgradeLabel(); + + const handleChange = async (event: React.ChangeEvent) => { + const value = event.currentTarget.checked; + try { + const updatedWorkspace = await updateWorkspace({ enforceMcpOauth: value }); + setChecked(value); + setWorkspace(updatedWorkspace); + } catch (err) { + notifications.show({ + message: err?.response?.data?.message, + color: "red", + }); + } + }; + + return ( + +
+ + + {t("Enforce OAuth")} + + {!hasAccess && ( + + {t("Enterprise")} + + )} + + + {t( + "AI assistants must connect with a Docmost account via OAuth. API keys cannot be used with the MCP server.", + )} + +
+ + + + +
+ ); +} diff --git a/apps/client/src/ee/ai/hooks/use-ai-search.ts b/apps/client/src/ee/ai/hooks/use-ai-search.ts new file mode 100644 index 0000000..03b2442 --- /dev/null +++ b/apps/client/src/ee/ai/hooks/use-ai-search.ts @@ -0,0 +1,46 @@ +import { useMutation, UseMutationResult } from "@tanstack/react-query"; +import { useState, useCallback } from "react"; +import { aiAnswers, IAiSearchResponse } from "@/ee/ai/services/ai-search-service.ts"; +import { IPageSearchParams } from "@/features/search/types/search.types.ts"; + +// @ts-ignore +interface UseAiSearchResult extends UseMutationResult { + streamingAnswer: string; + streamingSources: any[]; + clearStreaming: () => void; +} + +export function useAiSearch(): UseAiSearchResult { + const [streamingAnswer, setStreamingAnswer] = useState(""); + const [streamingSources, setStreamingSources] = useState([]); + + const clearStreaming = useCallback(() => { + setStreamingAnswer(""); + setStreamingSources([]); + }, []); + + const mutation = useMutation({ + mutationFn: async (params: IPageSearchParams & { contentType?: string }) => { + setStreamingAnswer(""); + setStreamingSources([]); + + const { contentType, ...apiParams } = params; + + return await aiAnswers(apiParams, (chunk) => { + if (chunk.content) { + setStreamingAnswer((prev) => prev + chunk.content); + } + if (chunk.sources) { + setStreamingSources(chunk.sources); + } + }); + }, + }); + + return { + ...mutation, + streamingAnswer, + streamingSources, + clearStreaming, + }; +} diff --git a/apps/client/src/ee/ai/hooks/use-ai.ts b/apps/client/src/ee/ai/hooks/use-ai.ts new file mode 100644 index 0000000..40c1ca1 --- /dev/null +++ b/apps/client/src/ee/ai/hooks/use-ai.ts @@ -0,0 +1,61 @@ +import { useState, useCallback, useRef } from "react"; +import { useAiGenerateStreamMutation } from "@/ee/ai/queries/ai-query.ts"; +import { AiGenerateDto } from "@/ee/ai/types/ai.types.ts"; + +export function useAiStream() { + const [content, setContent] = useState(""); + const [isStreaming, setIsStreaming] = useState(false); + const abortControllerRef = useRef(null); + const mutation = useAiGenerateStreamMutation(); + + const startStream = useCallback( + async (data: AiGenerateDto) => { + setContent(""); + setIsStreaming(true); + + try { + const controller = await mutation.mutateAsync({ + ...data, + onChunk: (chunk) => { + setContent((prev) => prev + chunk.content); + }, + onError: (error) => { + console.error("AI stream error:", error); + setIsStreaming(false); + }, + onComplete: () => { + setIsStreaming(false); + }, + }); + + abortControllerRef.current = controller; + } catch (error) { + console.error("Failed to start stream:", error); + setIsStreaming(false); + } + }, + [mutation] + ); + + const stopStream = useCallback(() => { + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + abortControllerRef.current = null; + setIsStreaming(false); + } + }, []); + + const resetContent = useCallback(() => { + setContent(""); + }, []); + + return { + content, + isStreaming, + startStream, + stopStream, + resetContent, + isLoading: mutation.isPending, + error: mutation.error, + }; +} \ No newline at end of file diff --git a/apps/client/src/ee/ai/pages/ai-settings.tsx b/apps/client/src/ee/ai/pages/ai-settings.tsx new file mode 100644 index 0000000..27a5628 --- /dev/null +++ b/apps/client/src/ee/ai/pages/ai-settings.tsx @@ -0,0 +1,102 @@ +import SettingsTitle from "@/components/settings/settings-title.tsx"; +import React from "react"; +import useUserRole from "@/hooks/use-user-role.tsx"; +import { useTranslation } from "react-i18next"; +import EnableAiSearch from "@/ee/ai/components/enable-ai-search.tsx"; +import EnableGenerativeAi from "@/ee/ai/components/enable-generative-ai.tsx"; +import EnableAiChat from "@/ee/ai-chat/components/enable-ai-chat.tsx"; +import AiChatReadOnly from "@/ee/ai-chat/components/ai-chat-read-only.tsx"; +import AiChatWorkspaceKnowledgeOnly from "@/ee/ai-chat/components/ai-chat-workspace-knowledge-only.tsx"; +import McpSettings from "@/ee/ai/components/mcp-settings.tsx"; +import { Alert, Collapse, Stack, Tabs } from "@mantine/core"; +import { IconInfoCircle } from "@tabler/icons-react"; +import { useHasFeature } from "@/ee/hooks/use-feature"; +import { Feature } from "@/ee/features"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; +import { isCloud } from "@/lib/config.ts"; +import { useLocation, useNavigate } from "react-router-dom"; +import { DocumentTitle } from "@/components/ui/document-title.tsx"; +import { useAtomValue } from "jotai"; +import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts"; + +export default function AiSettings() { + const { t } = useTranslation(); + const { isAdmin } = useUserRole(); + const hasAccess = useHasFeature(Feature.AI); + const upgradeLabel = useUpgradeLabel(); + const workspace = useAtomValue(workspaceAtom); + const aiChatEnabled = workspace?.settings?.ai?.chat === true; + const location = useLocation(); + const navigate = useNavigate(); + + const activeTab = location.pathname.endsWith("/mcp") ? "mcp" : "ai"; + + if (!isAdmin) { + return null; + } + + const handleTabChange = (value: string | null) => { + if (value === "mcp") { + navigate("/settings/ai/mcp"); + } else { + navigate("/settings/ai"); + } + }; + + return ( + <> + + + + + + + {t("AI")} + + + {t("MCP")} + + + + + {!hasAccess && ( + } + title={upgradeLabel} + color="blue" + mb="lg" + > + {t( + "AI is available in the Docmost paid editions. Contact sales@docmost.com.", + )} + + )} + + + {!isCloud() && } + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/client/src/ee/ai/queries/ai-query.ts b/apps/client/src/ee/ai/queries/ai-query.ts new file mode 100644 index 0000000..076de9c --- /dev/null +++ b/apps/client/src/ee/ai/queries/ai-query.ts @@ -0,0 +1,44 @@ +import { + useMutation, + UseMutationResult, + useQuery, + UseQueryResult, +} from "@tanstack/react-query"; +import { + generateAiContent, + generateAiContentStream, +} from "@/ee/ai/services/ai-service.ts"; +import { + AiConfigResponse, + AiContentResponse, + AiGenerateDto, + AiStreamChunk, + AiStreamError, +} from "@/ee/ai/types/ai.types.ts"; + +export function useAiGenerateMutation(): UseMutationResult< + AiContentResponse, + Error, + AiGenerateDto +> { + return useMutation({ + mutationFn: (data: AiGenerateDto) => generateAiContent(data), + }); +} + +interface StreamCallbacks { + onChunk: (chunk: AiStreamChunk) => void; + onError?: (error: AiStreamError) => void; + onComplete?: () => void; +} + +export function useAiGenerateStreamMutation(): UseMutationResult< + AbortController, + Error, + AiGenerateDto & StreamCallbacks +> { + return useMutation({ + mutationFn: ({ onChunk, onError, onComplete, ...data }) => + generateAiContentStream(data, onChunk, onError, onComplete), + }); +} diff --git a/apps/client/src/ee/ai/services/ai-search-service.ts b/apps/client/src/ee/ai/services/ai-search-service.ts new file mode 100644 index 0000000..d580a20 --- /dev/null +++ b/apps/client/src/ee/ai/services/ai-search-service.ts @@ -0,0 +1,91 @@ +import api from "@/lib/api-client.ts"; +import { IPageSearchParams } from "@/features/search/types/search.types.ts"; + +export interface IAiSearchResponse { + answer: string; + sources?: Array<{ + pageId: string; + title: string; + slugId: string; + spaceSlug: string; + similarity: number; + distance: number; + chunkIndex: number; + excerpt: string; + }>; +} + +export async function hintVectorCache(): Promise { + try { + await api.post("/ai/vector-cache-hint"); + } catch { + // best-effort cache hint + } +} + +export async function aiAnswers( + params: IPageSearchParams, + onChunk?: (chunk: { content?: string; sources?: any[] }) => void, +): Promise { + const response = await fetch("/api/ai/answers", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + credentials: "include", + body: JSON.stringify(params), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const reader = response.body?.getReader(); + const decoder = new TextDecoder(); + + let answer = ""; + let sources: any[] = []; + let buffer = ""; + + if (reader) { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + buffer += decoder.decode(value, { stream: true }); + const lines = buffer.split("\n"); + + // Keep the last incomplete line in the buffer + buffer = lines.pop() || ""; + + for (const line of lines) { + if (line.startsWith("data: ")) { + const data = line.slice(6); + if (data === "[DONE]") break; + + try { + const parsed = JSON.parse(data); + if (parsed.error) { + throw new Error(parsed.error); + } + if (parsed.content) { + answer += parsed.content; + onChunk?.({ content: parsed.content }); + } + if (parsed.sources) { + sources = parsed.sources; + onChunk?.({ sources: parsed.sources }); + } + } catch (e) { + if (e instanceof Error) { + throw e; + } + // Skip invalid JSON + } + } + } + } + } + + return { answer, sources }; +} diff --git a/apps/client/src/ee/ai/services/ai-service.ts b/apps/client/src/ee/ai/services/ai-service.ts new file mode 100644 index 0000000..88557ff --- /dev/null +++ b/apps/client/src/ee/ai/services/ai-service.ts @@ -0,0 +1,92 @@ +import api from "@/lib/api-client.ts"; +import { + AiGenerateDto, + AiContentResponse, + AiStreamChunk, + AiStreamError, +} from "@/ee/ai/types/ai.types.ts"; + +export async function generateAiContent( + data: AiGenerateDto, +): Promise { + const req = await api.post("/ai/generate", data); + return req.data; +} + +export async function generateAiContentStream( + data: AiGenerateDto, + onChunk: (chunk: AiStreamChunk) => void, + onError?: (error: AiStreamError) => void, + onComplete?: () => void, +): Promise { + const abortController = new AbortController(); + try { + const response = await fetch("/api/ai/generate/stream", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + signal: abortController.signal, + credentials: "include", // This ensures cookies are sent, matching axios withCredentials + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const reader = response.body?.getReader(); + const decoder = new TextDecoder(); + + if (!reader) { + throw new Error("Response body is not readable"); + } + + const processStream = async () => { + let buffer = ""; + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + buffer += decoder.decode(value, { stream: true }); + const lines = buffer.split("\n"); + + buffer = lines.pop() || ""; + + for (const line of lines) { + if (line.startsWith("data: ")) { + const data = line.slice(6); + if (data === "[DONE]") { + onComplete?.(); + return; + } + try { + const parsed = JSON.parse(data); + if (parsed.error) { + onError?.(parsed); + } else { + onChunk(parsed); + } + } catch (e) { + // Skip invalid JSON + } + } + } + } + } catch (error) { + if (error.name !== "AbortError") { + onError?.({ error: error.message }); + } + } finally { + reader.releaseLock(); + } + }; + + processStream(); + } catch (error) { + onError?.({ error: error.message }); + } + + return abortController; +} diff --git a/apps/client/src/ee/ai/types/ai.types.ts b/apps/client/src/ee/ai/types/ai.types.ts new file mode 100644 index 0000000..5477856 --- /dev/null +++ b/apps/client/src/ee/ai/types/ai.types.ts @@ -0,0 +1,41 @@ +export enum AiAction { + IMPROVE_WRITING = "improve_writing", + FIX_SPELLING_GRAMMAR = "fix_spelling_grammar", + MAKE_SHORTER = "make_shorter", + MAKE_LONGER = "make_longer", + SIMPLIFY = "simplify", + CHANGE_TONE = "change_tone", + SUMMARIZE = "summarize", + EXPLAIN = "explain", + CONTINUE_WRITING = "continue_writing", + TRANSLATE = "translate", + CUSTOM = "custom", +} + +export interface AiGenerateDto { + action?: AiAction; + content: string; + prompt?: string; +} + +export interface AiContentResponse { + content: string; + usage?: { + promptTokens: number; + completionTokens: number; + totalTokens: number; + }; +} + +export interface AiConfigResponse { + configured: boolean; + availableActions: AiAction[]; +} + +export interface AiStreamChunk { + content: string; +} + +export interface AiStreamError { + error: string; +} diff --git a/apps/client/src/ee/api-key/components/api-key-created-modal.tsx b/apps/client/src/ee/api-key/components/api-key-created-modal.tsx new file mode 100644 index 0000000..e787c0d --- /dev/null +++ b/apps/client/src/ee/api-key/components/api-key-created-modal.tsx @@ -0,0 +1,74 @@ +import { + Modal, + Text, + Stack, + Alert, + Group, + Button, + TextInput, +} from "@mantine/core"; +import { IconAlertTriangle } from "@tabler/icons-react"; +import { useTranslation } from "react-i18next"; +import { IApiKey } from "@/ee/api-key"; +import CopyTextButton from "@/components/common/copy.tsx"; + +interface ApiKeyCreatedModalProps { + opened: boolean; + onClose: () => void; + apiKey: IApiKey; +} + +export function ApiKeyCreatedModal({ + opened, + onClose, + apiKey, +}: ApiKeyCreatedModalProps) { + const { t } = useTranslation(); + + if (!apiKey) return null; + + return ( + + + } + title={t("Important")} + color="red" + > + {t( + "Make sure to copy your {{credential}} now. You won't be able to see it again!", + { credential: t("API key") }, + )} + + +
+ + {t("API key")} + + + + + + +
+ + +
+
+ ); +} diff --git a/apps/client/src/ee/api-key/components/api-key-table.tsx b/apps/client/src/ee/api-key/components/api-key-table.tsx new file mode 100644 index 0000000..efb7744 --- /dev/null +++ b/apps/client/src/ee/api-key/components/api-key-table.tsx @@ -0,0 +1,148 @@ +import { ActionIcon, Group, Menu, Table, Text } from "@mantine/core"; +import { IconDots, IconEdit, IconTrash } from "@tabler/icons-react"; +import { useTranslation } from "react-i18next"; +import { IApiKey } from "@/ee/api-key"; +import { CustomAvatar } from "@/components/ui/custom-avatar.tsx"; +import React from "react"; +import NoTableResults from "@/components/common/no-table-results"; +import { formatLocalized, useDateFnsLocale } from "@/lib/date-locale.ts"; + +interface ApiKeyTableProps { + apiKeys: IApiKey[]; + isLoading?: boolean; + showUserColumn?: boolean; + onUpdate?: (apiKey: IApiKey) => void; + onRevoke?: (apiKey: IApiKey) => void; +} + +export function ApiKeyTable({ + apiKeys, + isLoading, + showUserColumn = false, + onUpdate, + onRevoke, +}: ApiKeyTableProps) { + const { t } = useTranslation(); + const locale = useDateFnsLocale(); + + const formatDate = (date: Date | string | null) => { + if (!date) return t("Never"); + return formatLocalized(date, "MMM dd, yyyy", "PP", locale); + }; + + const isExpired = (expiresAt: string | null) => { + if (!expiresAt) return false; + return new Date(expiresAt) < new Date(); + }; + + return ( + + + + + {t("Name")} + {showUserColumn && {t("User")}} + {t("Last used")} + {t("Expires")} + {t("Created")} + + + + + + {apiKeys && apiKeys.length > 0 ? ( + apiKeys.map((apiKey: IApiKey, index: number) => ( + + + + {apiKey.name} + + + + {showUserColumn && apiKey.creator && ( + + + + + {apiKey.creator.name} + + + + )} + + + + {formatDate(apiKey.lastUsedAt)} + + + + + {apiKey.expiresAt ? ( + isExpired(apiKey.expiresAt) ? ( + + {t("Expired")} + + ) : ( + + {formatDate(apiKey.expiresAt)} + + ) + ) : ( + + {t("Never")} + + )} + + + + + {formatDate(apiKey.createdAt)} + + + + + + + + + + + + {onUpdate && ( + } + onClick={() => onUpdate(apiKey)} + > + {t("Rename")} + + )} + {onRevoke && ( + } + color="red" + onClick={() => onRevoke(apiKey)} + > + {t("Revoke")} + + )} + + + + + )) + ) : ( + + )} + +
+
+ ); +} diff --git a/apps/client/src/ee/api-key/components/create-api-key-modal.tsx b/apps/client/src/ee/api-key/components/create-api-key-modal.tsx new file mode 100644 index 0000000..53341a6 --- /dev/null +++ b/apps/client/src/ee/api-key/components/create-api-key-modal.tsx @@ -0,0 +1,154 @@ +import { lazy, Suspense, useState } from "react"; +import { Modal, TextInput, Button, Group, Stack, Select } from "@mantine/core"; +import { useForm } from "@mantine/form"; +import { zod4Resolver } from "mantine-form-zod-resolver"; +import { z } from "zod/v4"; +import { useTranslation } from "react-i18next"; +import { useCreateApiKeyMutation } from "@/ee/api-key/queries/api-key-query"; +import { IconCalendar } from "@tabler/icons-react"; +import { IApiKey } from "@/ee/api-key"; + +const DateInput = lazy(() => + import("@mantine/dates").then((module) => ({ + default: module.DateInput, + })), +); + +interface CreateApiKeyModalProps { + opened: boolean; + onClose: () => void; + onSuccess: (response: IApiKey) => void; +} + +const formSchema = z.object({ + name: z.string().min(1, "Name is required"), + expiresAt: z.string().optional(), +}); +type FormValues = z.infer; + +export function CreateApiKeyModal({ + opened, + onClose, + onSuccess, +}: CreateApiKeyModalProps) { + const { t, i18n } = useTranslation(); + const [expirationOption, setExpirationOption] = useState("30"); + const createApiKeyMutation = useCreateApiKeyMutation(); + + const form = useForm({ + validate: zod4Resolver(formSchema), + initialValues: { + name: "", + expiresAt: "", + }, + }); + + const getExpirationDate = (): string | undefined => { + if (expirationOption === "never") { + return undefined; + } + if (expirationOption === "custom") { + return form.values.expiresAt; + } + const days = parseInt(expirationOption); + const date = new Date(); + date.setDate(date.getDate() + days); + return date.toISOString(); + }; + + const getExpirationLabel = (days: number) => { + const date = new Date(); + date.setDate(date.getDate() + days); + const formatted = date.toLocaleDateString(i18n.language, { + month: "short", + day: "2-digit", + year: "numeric", + }); + return `${days} days (${formatted})`; + }; + + const expirationOptions = [ + { value: "30", label: getExpirationLabel(30) }, + { value: "60", label: getExpirationLabel(60) }, + { value: "90", label: getExpirationLabel(90) }, + { value: "365", label: getExpirationLabel(365) }, + { value: "custom", label: t("Custom") }, + { value: "never", label: t("No expiration") }, + ]; + + const handleSubmit = async (data: { + name?: string; + expiresAt?: string | Date; + }) => { + const groupData = { + name: data.name, + expiresAt: getExpirationDate(), + }; + + try { + const createdKey = await createApiKeyMutation.mutateAsync(groupData); + onSuccess(createdKey); + form.reset(); + onClose(); + } catch (err) { + // + } + }; + + const handleClose = () => { + form.reset(); + setExpirationOption("30"); + onClose(); + }; + + return ( + +
handleSubmit(values))}> + + + + ({ + group: t(group.group), + items: group.items.map((item) => ({ + value: item.value, + label: t(item.label), + })), + }))} + value={eventFilter} + onChange={handleEventChange} + clearable + searchable + w={220} + size="sm" + /> + + { + if (!opened) resetRetentionForm(); + setSettingsOpen(opened); + }} + > + + + setSettingsOpen((o) => !o)}> + + + + + + + {t("Retention")} + + + {t("Logs older than this period are automatically deleted.")} + + + setRetentionAmount(val)} + min={1} + hideControls + size="sm" + w={60} + /> + { + setValue(e.currentTarget.value); + debouncedCommit(); + }} + onFocus={() => { + focusedRef.current = true; + }} + onBlur={() => { + focusedRef.current = false; + commit(); + }} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + e.currentTarget.blur(); + } + if (e.key === "Escape") { + setValue(page?.title ?? ""); + e.currentTarget.blur(); + } + }} + /> + ); +} diff --git a/apps/client/src/ee/base/components/base-table-skeleton.tsx b/apps/client/src/ee/base/components/base-table-skeleton.tsx new file mode 100644 index 0000000..cd7dfc6 --- /dev/null +++ b/apps/client/src/ee/base/components/base-table-skeleton.tsx @@ -0,0 +1,92 @@ +import { Skeleton } from "@mantine/core"; +import gridClasses from "@/ee/base/styles/grid.module.css"; +import classes from "@/ee/base/styles/base-table-skeleton.module.css"; + +const ROW_NUMBER_WIDTH = 64; +const COLUMN_WIDTH = 180; +const DEFAULT_COLUMN_COUNT = 6; +const DEFAULT_ROW_COUNT = 10; + +// Deterministic widths prevent flicker between renders. +const CELL_WIDTH_RATIOS = [0.78, 0.62, 0.84, 0.55, 0.71, 0.66]; +const HEADER_WIDTH_RATIOS = [0.42, 0.58, 0.5, 0.64, 0.46, 0.54]; + +type BaseTableSkeletonProps = { + // Match the eventual content shape to avoid a jarring size jump on swap. + rows?: number; + columns?: number; +}; + +export function BaseTableSkeleton({ + rows = DEFAULT_ROW_COUNT, + columns = DEFAULT_COLUMN_COUNT, +}: BaseTableSkeletonProps = {}) { + const gridTemplateColumns = [ + `${ROW_NUMBER_WIDTH}px`, + ...Array.from({ length: columns }, () => `${COLUMN_WIDTH}px`), + ].join(" "); + + return ( +
+
+
+ + + +
+
+ + + + +
+
+ +
+
+
+
+ +
+
+ {Array.from({ length: columns }).map((_, colIndex) => ( +
+
+ + +
+
+ ))} + + {Array.from({ length: rows }).map((_, rowIndex) => ( +
+
+
+ +
+
+ {Array.from({ length: columns }).map((_, colIndex) => ( +
+
+ +
+
+ ))} +
+ ))} +
+
+
+ ); +} diff --git a/apps/client/src/ee/base/components/base-table.tsx b/apps/client/src/ee/base/components/base-table.tsx new file mode 100644 index 0000000..be449c3 --- /dev/null +++ b/apps/client/src/ee/base/components/base-table.tsx @@ -0,0 +1,70 @@ +import { GridContainer } from "@/ee/base/components/grid/grid-container"; +import { Table } from "@tanstack/react-table"; +import { + IBase, + IBaseRow, + IBaseView, +} from "@/ee/base/types/base.types"; + +type BaseTableProps = { + base: IBase; + rows: IBaseRow[]; + effectiveView: IBaseView | undefined; + table: Table; + pageId: string; + embedded?: boolean; + isFiltered: boolean; + hasNextPage: boolean; + isFetchingNextPage: boolean; + onFetchNextPage: () => void; + onCellUpdate: (rowId: string, propertyId: string, value: unknown) => void; + onAddRow: (afterRowId?: string, focusPropertyId?: string) => void; + onColumnReorder: (columnId: string, finishIndex: number) => void; + onResizeEnd: () => void; + onRowReorder: ( + rowId: string, + targetRowId: string, + dropPosition: "above" | "below", + ) => void; + persistViewConfig: () => void; + scrollportRef: React.RefObject; + aboveBand?: React.ReactNode; +}; + +export function BaseTable({ + base, + rows: _rows, + table, + pageId, + embedded, + isFiltered, + hasNextPage, + isFetchingNextPage, + onFetchNextPage, + onCellUpdate, + onAddRow, + onColumnReorder, + onResizeEnd, + onRowReorder, + scrollportRef, + aboveBand, +}: BaseTableProps) { + return ( + + ); +} diff --git a/apps/client/src/ee/base/components/base-toolbar.tsx b/apps/client/src/ee/base/components/base-toolbar.tsx new file mode 100644 index 0000000..213ce58 --- /dev/null +++ b/apps/client/src/ee/base/components/base-toolbar.tsx @@ -0,0 +1,295 @@ +import { useState, useCallback, useMemo } from "react"; +import { ActionIcon, Tooltip, Badge } from "@mantine/core"; +import { Table } from "@tanstack/react-table"; +import { + IconSortAscending, + IconFilter, + IconEye, + IconDownload, + IconArrowsDiagonal, + IconLayoutColumns, + IconAdjustments, +} from "@tabler/icons-react"; +import { notifications } from "@mantine/notifications"; +import { + IBase, + IBaseRow, + IBaseView, + ViewSortConfig, + FilterCondition, + FilterGroup, +} from "@/ee/base/types/base.types"; +import { exportBaseToCsv } from "@/ee/base/services/base-service"; +import { getApiErrorMessage } from "@/lib/api-error"; +import { ViewTabs } from "@/ee/base/components/views/view-tabs"; +import { ViewSortConfigPopover } from "@/ee/base/components/views/view-sort-config"; +import { ViewFilterConfigPopover } from "@/ee/base/components/views/view-filter-config"; +import { ViewPropertyVisibility } from "@/ee/base/components/views/view-property-visibility"; +import { KanbanGroupByPicker } from "@/ee/base/components/kanban/kanban-group-by-picker"; +import { KanbanCardProperties } from "@/ee/base/components/kanban/kanban-card-properties"; +import { useTranslation } from "react-i18next"; +import classes from "@/ee/base/styles/grid.module.css"; +import toolbarClasses from "@/ee/base/styles/base-toolbar.module.css"; + +type BaseToolbarProps = { + base: IBase; + activeView: IBaseView | undefined; + views: IBaseView[]; + table?: Table; + onViewChange: (viewId: string) => void; + onAddView?: () => void; + canAddView?: boolean; + onPersistViewConfig: () => void; + onDraftSortsChange: (sorts: ViewSortConfig[] | undefined) => void; + onDraftFiltersChange: (filter: FilterGroup | undefined) => void; + onExpand?: () => void; + getViewShareUrl?: (viewId: string) => string | null; +}; + +export function BaseToolbar({ + base, + activeView, + views, + table, + onViewChange, + onAddView, + canAddView, + onPersistViewConfig, + onDraftSortsChange, + onDraftFiltersChange, + onExpand, + getViewShareUrl, +}: BaseToolbarProps) { + const { t } = useTranslation(); + const [sortOpened, setSortOpened] = useState(false); + const [filterOpened, setFilterOpened] = useState(false); + const [propertiesOpened, setPropertiesOpened] = useState(false); + const [cardPropertiesOpened, setCardPropertiesOpened] = useState(false); + const [exporting, setExporting] = useState(false); + + const isKanban = activeView?.type === "kanban"; + + const handleExport = useCallback(async () => { + if (exporting) return; + setExporting(true); + try { + await exportBaseToCsv(base.id); + } catch (err) { + notifications.show({ + color: "red", + message: getApiErrorMessage(err, t("Failed to export CSV")), + }); + } finally { + setExporting(false); + } + }, [base.id, exporting, t]); + + const openToolbar = useCallback((panel: "sort" | "filter" | "properties") => { + setSortOpened(panel === "sort" ? (v) => !v : false); + setFilterOpened(panel === "filter" ? (v) => !v : false); + setPropertiesOpened(panel === "properties" ? (v) => !v : false); + }, []); + + const sorts = activeView?.config?.sorts ?? []; + const conditions = useMemo(() => { + const filter = activeView?.config?.filter; + if (!filter || filter.op !== "and") return []; + return filter.children.filter( + (c): c is FilterCondition => !("children" in c), + ); + }, [activeView?.config?.filter]); + + const hiddenPropertyCount = useMemo(() => { + if (!table) return 0; + const cols = table.getAllLeafColumns().filter((col) => col.id !== "__row_number"); + return cols.filter((col) => col.getCanHide() && !col.getIsVisible()).length; + }, [table, table?.getState().columnVisibility]); + + const handleSortsChange = useCallback( + (newSorts: ViewSortConfig[]) => { + onDraftSortsChange(newSorts.length > 0 ? newSorts : undefined); + }, + [onDraftSortsChange], + ); + + const handleFiltersChange = useCallback( + (newConditions: FilterCondition[]) => { + const filter: FilterGroup | undefined = + newConditions.length > 0 + ? { op: "and", children: newConditions } + : undefined; + onDraftFiltersChange(filter); + }, + [onDraftFiltersChange], + ); + + return ( +
+ + +
+ + + + + + + setFilterOpened(false)} + conditions={conditions} + properties={base.properties} + onChange={handleFiltersChange} + > + + 0 ? "blue" : "gray"} + onClick={() => openToolbar("filter")} + > + + {conditions.length > 0 && ( + + {conditions.length} + + )} + + + + + {isKanban && activeView && ( + <> + + + + + + + + + setCardPropertiesOpened(false)} + base={base} + view={activeView} + pageId={base.id} + > + + setCardPropertiesOpened((v) => !v)} + > + + + + + + )} + + {!isKanban && ( + <> + setSortOpened(false)} + sorts={sorts} + properties={base.properties} + onChange={handleSortsChange} + > + + 0 ? "blue" : "gray"} + onClick={() => openToolbar("sort")} + > + + {sorts.length > 0 && ( + + {sorts.length} + + )} + + + + + {table && ( + setPropertiesOpened(false)} + table={table} + properties={base.properties} + onPersist={onPersistViewConfig} + > + + 0 ? "blue" : "gray"} + onClick={() => openToolbar("properties")} + > + + {hiddenPropertyCount > 0 && ( + + {hiddenPropertyCount} + + )} + + + + )} + + )} + + {onExpand && ( + + + + + + )} +
+
+ ); +} diff --git a/apps/client/src/ee/base/components/base-view-draft-banner.tsx b/apps/client/src/ee/base/components/base-view-draft-banner.tsx new file mode 100644 index 0000000..cda3c9f --- /dev/null +++ b/apps/client/src/ee/base/components/base-view-draft-banner.tsx @@ -0,0 +1,45 @@ +import { Group, Button, Tooltip } from "@mantine/core"; +import { useTranslation } from "react-i18next"; + +type BaseViewDraftBannerProps = { + isDirty: boolean; + canSave: boolean; + onReset: () => void; + onSave: () => void; + saving: boolean; +}; + +export function BaseViewDraftBanner({ + isDirty, + canSave, + onReset, + onSave, + saving, +}: BaseViewDraftBannerProps) { + const { t } = useTranslation(); + if (!isDirty) return null; + return ( + + + {canSave && ( + + + + )} + + ); +} diff --git a/apps/client/src/ee/base/components/base-view.tsx b/apps/client/src/ee/base/components/base-view.tsx new file mode 100644 index 0000000..22612f2 --- /dev/null +++ b/apps/client/src/ee/base/components/base-view.tsx @@ -0,0 +1,541 @@ +import { useCallback, useEffect, useMemo, useRef } from "react"; +import { Text, Stack } from "@mantine/core"; +import { useAtom } from "jotai"; +import { IconTable } from "@tabler/icons-react"; +import { useTranslation } from "react-i18next"; +import { notifications } from "@mantine/notifications"; +import { reorder } from "@atlaskit/pragmatic-drag-and-drop/reorder"; +import { generateJitteredKeyBetween } from "fractional-indexing-jittered"; +import { useBaseQuery } from "@/ee/base/queries/base-query"; +import { useBaseSocket } from "@/ee/base/hooks/use-base-socket"; +import { + FilterGroup, + ViewSortConfig, + EditingCell, + FocusedCell, + IBaseProperty, +} from "@/ee/base/types/base.types"; +import { + useBaseRowsQuery, + flattenRows, + useCreateRowMutation, + useUpdateRowMutation, + useReorderRowMutation, +} from "@/ee/base/queries/base-row-query"; +import { useUpdateViewMutation } from "@/ee/base/queries/base-view-query"; +import { + activeViewIdAtomFamily, + editingCellAtomFamily, + focusedCellAtomFamily, +} from "@/ee/base/atoms/base-atoms"; +import { useBaseTable } from "@/ee/base/hooks/use-base-table"; +import { isSystemPropertyType } from "@/ee/base/property-types/property-type.registry"; +import { useRowSelection } from "@/ee/base/hooks/use-row-selection"; +import useCurrentUser from "@/features/user/hooks/use-current-user"; +import { useHydrateCurrentUser } from "@/ee/base/reference/reference-store"; +import { useViewDraft } from "@/ee/base/hooks/use-view-draft"; +import { BaseToolbar } from "@/ee/base/components/base-toolbar"; +import { BaseViewDraftBanner } from "@/ee/base/components/base-view-draft-banner"; +import { BaseEmbedTitle } from "@/ee/base/components/base-embed-title"; +import { BaseTableSkeleton } from "@/ee/base/components/base-table-skeleton"; +import { ViewRenderer } from "@/ee/base/components/views/view-renderer"; +import { RowDetailModal } from "@/ee/base/components/row-detail-modal/row-detail-modal"; +import { useRowDetailModal } from "@/ee/base/hooks/use-row-detail-modal"; +import { BaseEditableProvider } from "@/ee/base/context/base-editable"; +import { RowExpandProvider } from "@/ee/base/context/row-expand"; +import { usePageQuery } from "@/features/page/queries/page-query"; +import { buildPageUrl } from "@/features/page/page.utils"; +import { getAppUrl } from "@/lib/config.ts"; +import { useNavigate } from "react-router-dom"; +import classes from "@/ee/base/styles/grid.module.css"; +import viewClasses from "@/ee/base/styles/base-view.module.css"; +import kanbanClasses from "@/ee/base/styles/kanban.module.css"; + +type BaseViewProps = { + pageId: string; + embedded?: boolean; + /** False makes the view read-only. Standalone passes page.permissions.canEdit; + * embedded ANDs that with the host editor's editability. */ + editable?: boolean; + titleSlot?: React.ReactNode; +}; + +export function BaseView({ pageId, embedded, editable = true, titleSlot }: BaseViewProps) { + const { t } = useTranslation(); + // Subscribe so other clients' edits, schema changes, and async-job completions reconcile into cache. + useBaseSocket(pageId); + const { data: base, isLoading: baseLoading, error: baseError } = + useBaseQuery(pageId); + + const navigate = useNavigate(); + const { data: page } = usePageQuery({ pageId }); + const handleExpand = useCallback(() => { + if (!page) return; + navigate(buildPageUrl(page.space?.slug, page.slugId, page.title)); + }, [navigate, page]); + + // Share URL for a specific view; always points at the standalone page where ?view= is honored. + const getViewShareUrl = useCallback( + (viewId: string) => + page + ? `${getAppUrl()}${buildPageUrl(page.space?.slug, page.slugId, page.title)}?view=${encodeURIComponent(viewId)}` + : null, + [page], + ); + + const [activeViewId, setActiveViewId] = useAtom( + activeViewIdAtomFamily(pageId), + ) as unknown as [string | null, (val: string | null) => void]; + + const [, setEditingCell] = useAtom( + editingCellAtomFamily(pageId), + ) as unknown as [EditingCell, (val: EditingCell) => void]; + + const [, setFocusedCell] = useAtom( + focusedCellAtomFamily(pageId), + ) as unknown as [FocusedCell, (val: FocusedCell) => void]; + + const views = useMemo( + () => + [...(base?.views ?? [])].sort((a, b) => + a.position < b.position ? -1 : a.position > b.position ? 1 : 0, + ), + [base?.views], + ); + const activeView = useMemo(() => { + if (!views.length) return undefined; + return views.find((v) => v.id === activeViewId) ?? views[0]; + }, [views, activeViewId]); + + const { data: currentUser } = useCurrentUser(); + useHydrateCurrentUser(pageId); + const { + effectiveFilter, + effectiveSorts, + isDirty, + setFilter: setDraftFilter, + setSorts: setDraftSorts, + reset: resetDraft, + buildPromotedConfig, + } = useViewDraft({ + userId: currentUser?.user.id, + pageId, + viewId: activeView?.id, + baselineFilter: activeView?.config?.filter, + baselineSorts: activeView?.config?.sorts, + }); + + // Baseline merged with local draft. Used for table state and toolbar badge counts. + // The real activeView remains the auto-persist baseline so drafts can't leak into layout writes. + const effectiveView = useMemo( + () => + activeView + ? { + ...activeView, + config: { + ...activeView.config, + filter: effectiveFilter, + sorts: effectiveSorts, + }, + } + : undefined, + [activeView, effectiveFilter, effectiveSorts], + ); + + const activeFilter = effectiveFilter; + const activeSorts = effectiveSorts; + + const canSave = editable; + + // Gate on base to avoid a "bland" list request before the active view's + // config resolves, which would double network traffic for sorted/filtered views. + const isKanban = activeView?.type === "kanban"; + + const { + data: rowsData, + isLoading: rowsLoading, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + } = useBaseRowsQuery(base && !isKanban ? pageId : undefined, activeFilter, activeSorts); + + const updateRowMutation = useUpdateRowMutation(); + const createRowMutation = useCreateRowMutation(); + const reorderRowMutation = useReorderRowMutation(); + const updateViewMutation = useUpdateViewMutation(); + + useEffect(() => { + if (activeView && activeViewId !== activeView.id) { + setActiveViewId(activeView.id); + } + }, [activeView, activeViewId, setActiveViewId]); + + // Deep link: apply ?view= once after views load; skip if the id is + // unrecognised so we fall back to the default without fighting a later tab switch. + const appliedViewParamRef = useRef(false); + useEffect(() => { + if (appliedViewParamRef.current || views.length === 0) return; + const viewParam = new URLSearchParams(window.location.search).get("view"); + if (viewParam && views.some((v) => v.id === viewParam)) { + setActiveViewId(viewParam); + } + appliedViewParamRef.current = true; + }, [views, setActiveViewId]); + + const { clear: clearSelection } = useRowSelection(pageId); + useEffect(() => { + clearSelection(); + }, [pageId, activeView?.id, clearSelection]); + + const scrollportRef = useRef(null); + + const rows = useMemo(() => { + const flat = flattenRows(rowsData); + // With an active sort the server returns rows in sort order via keyset + // pagination; re-sorting by position on the client would break it as more + // pages load. Position sort only applies when no view sort is active. + if (activeSorts && activeSorts.length > 0) { + return flat; + } + return flat.sort((a, b) => + a.position < b.position ? -1 : a.position > b.position ? 1 : 0, + ); + }, [rowsData, activeSorts]); + const rowsRef = useRef(rows); + rowsRef.current = rows; + + const { table, persistViewConfig } = useBaseTable(base, rows, effectiveView); + + const guardedPersistViewConfig = useCallback(() => { + if (!editable) return; + persistViewConfig(); + }, [editable, persistViewConfig]); + + // Mutation result objects change identity every render; only .mutate is + // stable. Rows are memoized on these callbacks' identities, so they must + // not churn with unrelated re-renders. + const updateRow = updateRowMutation.mutate; + const handleCellUpdate = useCallback( + (rowId: string, propertyId: string, value: unknown) => { + if (!editable) return; + updateRow({ + rowId, + pageId, + cells: { [propertyId]: value }, + }); + }, + [editable, pageId, updateRow], + ); + + const handleAddRow = useCallback( + (afterRowId?: string, focusPropertyId?: string) => { + if (!editable) return; + createRowMutation.mutate( + { pageId, ...(afterRowId ? { afterRowId } : {}) }, + { + onSuccess: (newRow) => { + let propertyId = focusPropertyId; + if (!propertyId) { + const firstEditable = table.getVisibleLeafColumns().find((col) => { + if (col.id === "__row_number") return false; + const prop = col.columnDef.meta?.property as + | IBaseProperty + | undefined; + return ( + !!prop && + prop.type !== "checkbox" && + !isSystemPropertyType(prop.type) + ); + }); + propertyId = ( + firstEditable?.columnDef.meta?.property as + | IBaseProperty + | undefined + )?.id; + } + if (propertyId) { + setEditingCell({ rowId: newRow.id, propertyId }); + setFocusedCell({ rowId: newRow.id, propertyId }); + } + }, + }, + ); + }, + [editable, pageId, createRowMutation, table, setEditingCell, setFocusedCell], + ); + + const handleViewChange = useCallback( + (viewId: string) => { + setActiveViewId(viewId); + }, + [setActiveViewId], + ); + + const handleColumnReorder = useCallback( + (columnId: string, finishIndex: number) => { + const order = table.getState().columnOrder; + const startIndex = order.indexOf(columnId); + if (startIndex === -1 || startIndex === finishIndex) return; + table.setColumnOrder(reorder({ list: order, startIndex, finishIndex })); + guardedPersistViewConfig(); + }, + [table, guardedPersistViewConfig], + ); + + const handleResizeEnd = useCallback(() => { + guardedPersistViewConfig(); + }, [guardedPersistViewConfig]); + + const handleDraftSortsChange = useCallback( + (sorts: ViewSortConfig[] | undefined) => { + setDraftSorts(sorts && sorts.length > 0 ? sorts : undefined); + }, + [setDraftSorts], + ); + + const handleDraftFiltersChange = useCallback( + (filter: FilterGroup | undefined) => { + setDraftFilter(filter); + }, + [setDraftFilter], + ); + + const handleSaveDraft = useCallback(async () => { + if (!activeView || !base) return; + // Preserves non-draft baseline fields (widths/order/visibility), overwrites only filter/sorts. + const config = buildPromotedConfig(activeView.config); + try { + await updateViewMutation.mutateAsync({ + viewId: activeView.id, + pageId: base.id, + config, + }); + resetDraft(); + notifications.show({ message: t("View updated for everyone") }); + } catch { + // useUpdateViewMutation shows a toast and rolls back; keep the draft so the user can retry. + } + }, [ + activeView, + base, + buildPromotedConfig, + resetDraft, + t, + updateViewMutation, + ]); + + const { openRowId, openRow, closeRow } = useRowDetailModal(pageId); + // openRow's identity tracks searchParams; rows subscribe to the expand + // context, so hand them a stable wrapper instead. + const openRowRef = useRef(openRow); + openRowRef.current = openRow; + const handleExpandRow = useCallback((rowId: string) => { + openRowRef.current(rowId); + }, []); + const handleRowNavigate = useCallback((rowId: string) => { + openRowRef.current(rowId, { replace: true }); + }, []); + + const reorderRow = reorderRowMutation.mutate; + const handleRowReorder = useCallback( + (rowId: string, targetRowId: string, dropPosition: "above" | "below") => { + if (!editable) return; + const remainingRows = rowsRef.current.filter((r) => r.id !== rowId); + const targetIndex = remainingRows.findIndex((r) => r.id === targetRowId); + if (targetIndex === -1) return; + + let lowerPos: string | null = null; + let upperPos: string | null = null; + if (dropPosition === "above") { + lowerPos = + targetIndex > 0 ? remainingRows[targetIndex - 1]?.position : null; + upperPos = remainingRows[targetIndex]?.position ?? null; + } else { + lowerPos = remainingRows[targetIndex]?.position ?? null; + upperPos = + targetIndex < remainingRows.length - 1 + ? remainingRows[targetIndex + 1]?.position + : null; + } + + try { + let newPosition: string; + if (lowerPos && upperPos && lowerPos === upperPos) { + newPosition = generateJitteredKeyBetween(lowerPos, null); + } else { + newPosition = generateJitteredKeyBetween(lowerPos, upperPos); + } + reorderRow({ rowId, pageId, position: newPosition }); + } catch { + // Position computation failed; skip silently. + } + }, + [editable, pageId, reorderRow], + ); + + if (baseLoading || (!isKanban && rowsLoading)) { + return ; + } + if (baseError) { + return ( + + + {t("Failed to load base")} + + ); + } + if (!base) return null; + + // Ghost rows are an "empty base" affordance, not a "filter matched nothing" state. + const isFiltered = (activeFilter?.children?.length ?? 0) > 0; + + const banner = ( + + ); + + const toolbar = ( + + ); + + const kanbanBand = ( +
+ {embedded ? null : titleSlot} + {banner} + {toolbar} + {embedded ? : null} +
+ ); + + const viewRenderer = (folded: React.ReactNode) => ( + + ); + + if (embedded) { + if (isKanban) { + return ( + + + {kanbanBand} + {viewRenderer(null)} + + + + ); + } + + // Banner and toolbar go into aboveBand so they scroll with the host document; + // only the column-header row stays pinned (via --sticky-band-top). + return ( + + + {viewRenderer( + <> + {banner} + {toolbar} + + , + )} + + + + ); + } + + if (isKanban) { + return ( + +
+ + {kanbanBand} + {viewRenderer(null)} + +
+ +
+ ); + } + + // Standalone: title, banner, and toolbar go in aboveBand inside the scroll + // container so they scroll away; only the column-header row stays pinned. + return ( + +
+
+ + {viewRenderer( + <> + {titleSlot} + {banner} + {toolbar} + , + )} + +
+
+ +
+ ); +} diff --git a/apps/client/src/ee/base/components/cells/badge-overflow.tsx b/apps/client/src/ee/base/components/cells/badge-overflow.tsx new file mode 100644 index 0000000..278b844 --- /dev/null +++ b/apps/client/src/ee/base/components/cells/badge-overflow.tsx @@ -0,0 +1,100 @@ +import { ReactElement, useLayoutEffect, useRef, useState } from "react"; +import { Tooltip } from "@mantine/core"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +export function computeVisibleBadgeCount( + itemWidths: number[], + gap: number, + available: number, + badgeWidth: number, +): number { + const count = itemWidths.length; + if (count === 0) return 0; + if (available <= 0) return count; + + let lineWidth = 0; + for (let i = 0; i < count; i++) { + lineWidth += itemWidths[i] + (i > 0 ? gap : 0); + } + if (lineWidth <= available) return count; + + let used = 0; + let fit = 0; + for (let i = 0; i < count; i++) { + const advance = itemWidths[i] + (i > 0 ? gap : 0); + if (used + advance + gap + badgeWidth <= available) { + used += advance; + fit = i + 1; + } else { + break; + } + } + return Math.max(fit, 1); +} + +const BADGE_GAP = 4; + +type BadgeOverflowListProps = { + chips: ReactElement[]; + measureKey: string; + tooltipLabel?: string; +}; + +export function BadgeOverflowList({ + chips, + measureKey, + tooltipLabel, +}: BadgeOverflowListProps) { + const containerRef = useRef(null); + const measureRef = useRef(null); + const [visibleCount, setVisibleCount] = useState(chips.length); + + useLayoutEffect(() => { + const container = containerRef.current; + const measure = measureRef.current; + if (!container || !measure) return; + + const recompute = () => { + const nodes = Array.from(measure.children) as HTMLElement[]; + const chipWidths = nodes.slice(0, -1).map((n) => n.offsetWidth); + const badgeWidth = nodes[nodes.length - 1]?.offsetWidth ?? 0; + setVisibleCount( + computeVisibleBadgeCount( + chipWidths, + BADGE_GAP, + container.clientWidth, + badgeWidth, + ), + ); + }; + + recompute(); + const observer = new ResizeObserver(recompute); + observer.observe(container); + return () => observer.disconnect(); + }, [measureKey]); + + const visible = chips.slice(0, visibleCount); + const overflow = chips.length - visibleCount; + + return ( + +
+
+ {chips} + +{chips.length} +
+ {visible} + {overflow > 0 && ( + +{overflow} + )} +
+
+ ); +} diff --git a/apps/client/src/ee/base/components/cells/cell-checkbox.tsx b/apps/client/src/ee/base/components/cells/cell-checkbox.tsx new file mode 100644 index 0000000..163359d --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-checkbox.tsx @@ -0,0 +1,44 @@ +import { useCallback } from "react"; +import { Checkbox } from "@mantine/core"; +import { IBaseProperty } from "@/ee/base/types/base.types"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +type CellCheckboxProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + readOnly?: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +export function CellCheckbox({ value, readOnly, onCommit }: CellCheckboxProps) { + const checked = value === true; + + const handleChange = useCallback(() => { + if (readOnly) return; + onCommit(!checked); + }, [readOnly, checked, onCommit]); + + return ( +
+ {}} + size="xs" + tabIndex={-1} + styles={{ + input: { + cursor: readOnly ? "default" : "pointer", + pointerEvents: "none", + }, + }} + /> +
+ ); +} diff --git a/apps/client/src/ee/base/components/cells/cell-created-at.tsx b/apps/client/src/ee/base/components/cells/cell-created-at.tsx new file mode 100644 index 0000000..2128684 --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-created-at.tsx @@ -0,0 +1,22 @@ +import { IBaseProperty } from "@/ee/base/types/base.types"; +import { formatTimestamp } from "@/ee/base/formatters/cell-formatters"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +type CellCreatedAtProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +export function CellCreatedAt({ value }: CellCreatedAtProps) { + const formatted = formatTimestamp(typeof value === "string" ? value : null); + + if (!formatted) { + return ; + } + + return {formatted}; +} diff --git a/apps/client/src/ee/base/components/cells/cell-date.tsx b/apps/client/src/ee/base/components/cells/cell-date.tsx new file mode 100644 index 0000000..a4af25a --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-date.tsx @@ -0,0 +1,146 @@ +import { useCallback } from "react"; +import { Popover } from "@mantine/core"; +import { DatePicker } from "@mantine/dates"; +import { + IBaseProperty, + DateTypeOptions, +} from "@/ee/base/types/base.types"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +type CellDateProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +export function formatDateDisplay( + dateStr: string | null | undefined, + options: DateTypeOptions | undefined, +): string { + if (!dateStr) return ""; + try { + const date = new Date(dateStr); + if (isNaN(date.getTime())) return ""; + + const months = [ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + ]; + const month = months[date.getMonth()]; + const day = date.getDate(); + const year = date.getFullYear(); + + let result = `${month} ${day}, ${year}`; + + if (options?.includeTime) { + if (options.timeFormat === "24h") { + const hours = String(date.getHours()).padStart(2, "0"); + const minutes = String(date.getMinutes()).padStart(2, "0"); + result += ` ${hours}:${minutes}`; + } else { + let hours = date.getHours(); + const ampm = hours >= 12 ? "PM" : "AM"; + hours = hours % 12 || 12; + const minutes = String(date.getMinutes()).padStart(2, "0"); + result += ` ${hours}:${minutes} ${ampm}`; + } + } + + return result; + } catch { + return ""; + } +} + +function toISODateString(dateStr: string | null): string | null { + if (!dateStr) return null; + try { + const date = new Date(dateStr); + if (isNaN(date.getTime())) return null; + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, "0"); + const day = String(date.getDate()).padStart(2, "0"); + return `${year}-${month}-${day}`; + } catch { + return null; + } +} + +export function CellDate({ + value, + property, + isEditing, + onCommit, + onCancel, +}: CellDateProps) { + const typeOptions = property.typeOptions as DateTypeOptions | undefined; + const dateStr = typeof value === "string" ? value : null; + const pickerValue = toISODateString(dateStr); + + const handleChange = useCallback( + (selected: string | null) => { + if (selected) { + const date = new Date(selected); + onCommit(date.toISOString()); + } else { + onCommit(null); + } + }, + [onCommit], + ); + + const handleKeyDown = useCallback( + (e: React.KeyboardEvent) => { + if (e.key === "Escape") { + e.preventDefault(); + onCancel(); + } + }, + [onCancel], + ); + + if (isEditing) { + return ( + { + if (!o) onCancel(); + }} + onClose={onCancel} + position="bottom-start" + width="auto" + trapFocus + closeOnClickOutside + closeOnEscape + > + +
+ + {formatDateDisplay(dateStr, typeOptions)} + +
+
+ + + +
+ ); + } + + if (!dateStr) { + return ; + } + + return ( + + {formatDateDisplay(dateStr, typeOptions)} + + ); +} diff --git a/apps/client/src/ee/base/components/cells/cell-email.tsx b/apps/client/src/ee/base/components/cells/cell-email.tsx new file mode 100644 index 0000000..0d93f69 --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-email.tsx @@ -0,0 +1,61 @@ +import { IBaseProperty } from "@/ee/base/types/base.types"; +import { Tooltip } from "@mantine/core"; +import { useEditableTextCell } from "@/ee/base/hooks/use-editable-text-cell"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +type CellEmailProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +const toDraft = (value: unknown) => (typeof value === "string" ? value : ""); +const parse = (draft: string) => draft || null; + +export function CellEmail({ value, property, rowId, isEditing, onCommit, onCancel }: CellEmailProps) { + const { draft, setDraft, inputRef, handleKeyDown, handleBlur } = + useEditableTextCell({ + value, + isEditing, + onCommit, + onCancel, + toDraft, + parse, + rowId, + propertyId: property.id, + }); + + if (isEditing) { + return ( + setDraft(e.target.value)} + onKeyDown={handleKeyDown} + onBlur={handleBlur} + /> + ); + } + + const displayValue = toDraft(value); + if (!displayValue) { + return ; + } + return ( + + e.stopPropagation()} + > + {displayValue} + + + ); +} diff --git a/apps/client/src/ee/base/components/cells/cell-file.tsx b/apps/client/src/ee/base/components/cells/cell-file.tsx new file mode 100644 index 0000000..3d3bcd2 --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-file.tsx @@ -0,0 +1,236 @@ +import { useState, useRef, useCallback } from "react"; +import { Popover, ActionIcon, Text, UnstyledButton } from "@mantine/core"; +import { + IconPaperclip, + IconUpload, + IconFile, + IconX, +} from "@tabler/icons-react"; +import { IBaseProperty } from "@/ee/base/types/base.types"; +import cellClasses from "@/ee/base/styles/cells.module.css"; +import { uploadFile } from "@/features/page/services/page-service"; +import { getFileUrl } from "@/lib/config"; + +export type FileValue = { + id: string; + fileName: string; + mimeType?: string; + fileSize?: number; + url?: string; +}; + +function buildFileUrl(file: Pick): string { + return file.url ?? `/api/files/${file.id}/${encodeURIComponent(file.fileName)}`; +} + +type CellFileProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + readOnly?: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +function formatFileSize(bytes?: number): string { + if (!bytes) return ""; + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; +} + +function parseFiles(value: unknown): FileValue[] { + if (!Array.isArray(value)) return []; + return value.filter( + (f): f is FileValue => + f && typeof f === "object" && "id" in f && "fileName" in f, + ); +} + +export function CellFile({ + value, + property, + isEditing, + readOnly, + onCommit, + onCancel, +}: CellFileProps) { + const files = parseFiles(value); + const fileInputRef = useRef(null); + const [uploading, setUploading] = useState(false); + + const handleRemove = useCallback( + (fileId: string) => { + if (readOnly) return; + const updated = files.filter((f) => f.id !== fileId); + onCommit(updated.length > 0 ? updated : null); + }, + [readOnly, files, onCommit], + ); + + const handleUpload = useCallback( + async (fileList: FileList | null) => { + if (!fileList || fileList.length === 0) return; + setUploading(true); + + const newFiles: FileValue[] = [...files]; + + // Reuse the page-attachment upload pipeline: the base's pageId is passed + // to the standard /files/upload endpoint, which enforces the same edit + // access check as any other page attachment. + for (const file of Array.from(fileList)) { + try { + const attachment = await uploadFile(file, property.pageId); + newFiles.push({ + id: attachment.id, + fileName: attachment.fileName, + mimeType: attachment.mimeType, + fileSize: attachment.fileSize, + url: `/api/files/${attachment.id}/${encodeURIComponent(attachment.fileName)}`, + }); + } catch (err) { + console.error("File upload failed:", err); + } + } + + setUploading(false); + onCommit(newFiles.length > 0 ? newFiles : null); + }, + [files, property.pageId, onCommit], + ); + + const handleKeyDown = useCallback( + (e: React.KeyboardEvent) => { + if (e.key === "Escape") { + e.preventDefault(); + onCancel(); + } + }, + [onCancel], + ); + + const MAX_VISIBLE = 2; + + if (isEditing) { + return ( + { + if (!o) onCancel(); + }} + onClose={onCancel} + position="bottom-start" + width={280} + trapFocus + closeOnClickOutside + closeOnEscape + hideDetached={false} + > + +
+ +
+
+ + {!readOnly && files.length === 0 && !uploading && ( + + No files attached + + )} + + {files.map((file) => ( + + ))} + + {!readOnly && ( + <> + { + handleUpload(e.target.files); + e.target.value = ""; + }} + /> + + fileInputRef.current?.click()} + disabled={uploading} + className={cellClasses.fileUploadBtn} + style={{ + color: uploading + ? "var(--mantine-color-gray-5)" + : "var(--mantine-color-blue-6)", + }} + > + + {uploading ? "Uploading..." : "Add file"} + + + )} + +
+ ); + } + + if (files.length === 0) { + return ; + } + + return ; +} + +function FileList({ + files, + maxVisible, +}: { + files: FileValue[]; + maxVisible: number; +}) { + const visible = files.slice(0, maxVisible); + const overflow = files.length - maxVisible; + + return ( +
+ {visible.map((file) => ( + + + {file.fileName} + + ))} + {overflow > 0 && ( + +{overflow} + )} +
+ ); +} diff --git a/apps/client/src/ee/base/components/cells/cell-formula.tsx b/apps/client/src/ee/base/components/cells/cell-formula.tsx new file mode 100644 index 0000000..bdaaf11 --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-formula.tsx @@ -0,0 +1,38 @@ +import { Badge, Tooltip } from "@mantine/core"; +import { + IBaseProperty, + isFormulaErrorCell, +} from "@/ee/base/types/base.types"; +import { CellText } from "./cell-text"; +import { CellNumber } from "./cell-number"; +import { CellCheckbox } from "./cell-checkbox"; +import { CellDate } from "./cell-date"; + +type Props = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +export function CellFormula(props: Props) { + const { value, property } = props; + if (isFormulaErrorCell(value)) { + return ( + + + #ERROR + + + ); + } + const opts = (property.typeOptions ?? {}) as { resultType?: string }; + const resultType = opts.resultType ?? "null"; + const readOnlyProps = { ...props, isEditing: false }; + if (resultType === "number") return ; + if (resultType === "boolean") return ; + if (resultType === "date") return ; + return ; +} diff --git a/apps/client/src/ee/base/components/cells/cell-last-edited-at.tsx b/apps/client/src/ee/base/components/cells/cell-last-edited-at.tsx new file mode 100644 index 0000000..efad990 --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-last-edited-at.tsx @@ -0,0 +1,22 @@ +import { IBaseProperty } from "@/ee/base/types/base.types"; +import { formatTimestamp } from "@/ee/base/formatters/cell-formatters"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +type CellLastEditedAtProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +export function CellLastEditedAt({ value }: CellLastEditedAtProps) { + const formatted = formatTimestamp(typeof value === "string" ? value : null); + + if (!formatted) { + return ; + } + + return {formatted}; +} diff --git a/apps/client/src/ee/base/components/cells/cell-last-edited-by.tsx b/apps/client/src/ee/base/components/cells/cell-last-edited-by.tsx new file mode 100644 index 0000000..b6dc90c --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-last-edited-by.tsx @@ -0,0 +1,41 @@ +import { Group, Tooltip } from "@mantine/core"; +import { IBaseProperty } from "@/ee/base/types/base.types"; +import { useReferenceStore } from "@/ee/base/reference/reference-store"; +import { CustomAvatar } from "@/components/ui/custom-avatar"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +type CellLastEditedByProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + onCommit: (value: unknown) => void; + onCancel: () => void; +}; + +export function CellLastEditedBy({ value, property }: CellLastEditedByProps) { + const userId = typeof value === "string" ? value : null; + + const store = useReferenceStore(property.pageId); + const user = userId ? store.users[userId] ?? null : null; + + if (!userId) { + return ; + } + + const name = user?.name ?? userId.substring(0, 8); + + return ( + + + + {name} + + + ); +} diff --git a/apps/client/src/ee/base/components/cells/cell-long-text.tsx b/apps/client/src/ee/base/components/cells/cell-long-text.tsx new file mode 100644 index 0000000..2c39005 --- /dev/null +++ b/apps/client/src/ee/base/components/cells/cell-long-text.tsx @@ -0,0 +1,151 @@ +import { useEffect, useRef, useState } from "react"; +import { Popover, Textarea, Group, CloseButton, Tooltip } from "@mantine/core"; +import { useDebouncedCallback } from "@mantine/hooks"; +import { IBaseProperty } from "@/ee/base/types/base.types"; +import { formatLongTextPreview } from "@/ee/base/formatters/cell-formatters"; +import cellClasses from "@/ee/base/styles/cells.module.css"; + +type CellLongTextProps = { + value: unknown; + property: IBaseProperty; + rowId: string; + isEditing: boolean; + onCommit: (value: unknown) => void; + onValueChange: (value: unknown) => void; + onCancel: () => void; + onTabNavigate?: (shiftKey: boolean) => void; +}; + +const toText = (value: unknown) => (typeof value === "string" ? value : ""); +const normalize = (s: string) => { + const trimmed = s.trim(); + return trimmed.length ? trimmed : null; +}; + +export function CellLongText({ + value, + isEditing, + onCommit, + onValueChange, + onCancel, + onTabNavigate, +}: CellLongTextProps) { + const [draft, setDraft] = useState(() => toText(value)); + const cancelledRef = useRef(false); + const committedRef = useRef(false); + const wasEditingRef = useRef(false); + const textareaRef = useRef(null); + + // Seed draft and focus on the false->true editing transition only; ignore + // value changes mid-edit so the user's typing is not clobbered. + useEffect(() => { + if (isEditing && !wasEditingRef.current) { + cancelledRef.current = false; + committedRef.current = false; + setDraft(toText(value)); + requestAnimationFrame(() => { + const el = textareaRef.current; + if (!el) return; + el.focus(); + el.setSelectionRange(el.value.length, el.value.length); + }); + } + wasEditingRef.current = isEditing; + }, [isEditing, value]); + + // Autosave after a typing pause; commit/cancel clear the pending fire so + // a closed editor can never write a stale or discarded draft. + const debouncedAutosave = useDebouncedCallback(() => { + onValueChange(normalize(draft)); + }, 10_000); + + const commit = () => { + if (committedRef.current) return; + committedRef.current = true; + debouncedAutosave.cancel(); + onCommit(normalize(draft)); + }; + const cancel = () => { + cancelledRef.current = true; + debouncedAutosave.cancel(); + onCancel(); + }; + + const preview = formatLongTextPreview(toText(value)); + + return ( + { + if (opened) return; + // Programmatic close after cancel must not re-commit. + if (cancelledRef.current) { + cancelledRef.current = false; + return; + } + commit(); + }} + position="bottom-start" + width={320} + shadow="md" + withinPortal + closeOnClickOutside + closeOnEscape={false} + trapFocus + > + +
+ {preview ? ( + + {preview} + + ) : ( + + )} +
+
+ e.stopPropagation()} + className={cellClasses.longTextDropdown} + > + {isEditing && ( + <> + + + + + + + props.deleteNode()} + > + + + +
+ + + ); +} diff --git a/apps/client/src/features/editor/components/math/math-inline.tsx b/apps/client/src/features/editor/components/math/math-inline.tsx new file mode 100644 index 0000000..c19a8e1 --- /dev/null +++ b/apps/client/src/features/editor/components/math/math-inline.tsx @@ -0,0 +1,140 @@ +import "katex/dist/katex.min.css"; +import katex from "katex"; +//import "katex/dist/contrib/mhchem.min.js"; +import { useEffect, useRef, useState } from "react"; +import { NodeViewProps, NodeViewWrapper } from "@tiptap/react"; +import { Popover, Textarea } from "@mantine/core"; +import classes from "./math.module.css"; +import { v4 } from "uuid"; +import { useTranslation } from "react-i18next"; + +export default function MathInlineView(props: NodeViewProps) { + const { t } = useTranslation(); + const { node, updateAttributes, editor, getPos } = props; + const mathResultContainer = useRef(null); + const mathPreviewContainer = useRef(null); + const [error, setError] = useState(null); + const [preview, setPreview] = useState(null); + const textAreaRef = useRef(null); + const [isEditing, setIsEditing] = useState(false); + + const renderMath = ( + katexString: string, + container: HTMLDivElement | null, + ) => { + try { + katex.render(katexString, container); + setError(null); + } catch (e) { + //console.error(e); + setError(e.message); + } + }; + + useEffect(() => { + renderMath(node.attrs.text, mathResultContainer.current); + }, [node.attrs.text]); + + useEffect(() => { + if (isEditing) { + renderMath(preview || "", mathPreviewContainer.current); + } else if (preview !== null) { + queueMicrotask(() => { + updateAttributes({ text: preview.trim() }); + }); + } + }, [preview, isEditing]); + + useEffect(() => { + const pos = getPos(); + const { from, to } = editor.state.selection; + const nodeSelected = props.selected && from === pos && to === pos + node.nodeSize; + setIsEditing(nodeSelected); + if (nodeSelected) setPreview(node.attrs.text); + }, [props.selected]); + + return ( + <> + + + +
+
+ {((isEditing && !preview?.trim().length) || + (!isEditing && !node.attrs.text.trim().length)) && ( +
{t("Empty equation")}
+ )} + {error &&
{t("Invalid equation")}
} +
+
+ +