diff --git a/.github/actions/build-server/action.yml b/.github/actions/build-server/action.yml index cc7eb0e87..faa3c0752 100644 --- a/.github/actions/build-server/action.yml +++ b/.github/actions/build-server/action.yml @@ -10,7 +10,7 @@ runs: steps: - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 cache: "pnpm" diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 201814f9d..5084d2011 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Check if PRs have conflicts uses: eps1lon/actions-label-merge-conflict@v3 - if: github.repository == ${{ vars.REPO_MAIN }} && ${{secrets.MERGE_CONFLICT_LABEL_PAT}} + if: github.repository == ${{ vars.REPO_MAIN }} with: dirtyLabel: "merge-conflicts" repoToken: "${{ secrets.MERGE_CONFLICT_LABEL_PAT }}" diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 6a1376a61..62e04d48d 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -72,7 +72,7 @@ jobs: # Setup Node.js with pnpm - name: Setup Node.js - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: '22' cache: 'pnpm' @@ -118,7 +118,7 @@ jobs: - name: Deploy uses: ./.github/actions/deploy-to-cloudflare-pages - if: github.repository == ${{ vars.REPO_MAIN }} && ${{secrets.CLOUDFLARE_API_TOKEN}} + if: github.repository == ${{ vars.REPO_MAIN }} with: project_name: "trilium-docs" comment_body: "📚 Documentation preview is ready" diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index ceed464c8..ec4aeda0e 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -28,7 +28,7 @@ jobs: - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 cache: "pnpm" diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml index 5b3eb0c1b..407272a99 100644 --- a/.github/workflows/main-docker.yml +++ b/.github/workflows/main-docker.yml @@ -44,7 +44,7 @@ jobs: - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 cache: "pnpm" @@ -144,7 +144,7 @@ jobs: uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 50c97417c..0d0205f32 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -50,7 +50,7 @@ jobs: - uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' @@ -77,7 +77,7 @@ jobs: GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }} - name: Publish release - uses: softprops/action-gh-release@v2.4.0 + uses: softprops/action-gh-release@v2.4.1 if: ${{ github.event_name != 'pull_request' }} with: make_latest: false @@ -118,7 +118,7 @@ jobs: arch: ${{ matrix.arch }} - name: Publish release - uses: softprops/action-gh-release@v2.4.0 + uses: softprops/action-gh-release@v2.4.1 if: ${{ github.event_name != 'pull_request' }} with: make_latest: false diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index d9da7c329..886b46d61 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -22,7 +22,7 @@ jobs: fetch-depth: 0 - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v5 + - uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f8e77159a..3ee30040d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,7 +48,7 @@ jobs: - uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' @@ -127,7 +127,7 @@ jobs: path: upload - name: Publish stable release - uses: softprops/action-gh-release@v2.4.0 + uses: softprops/action-gh-release@v2.4.1 with: draft: false body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index bfb2c4721..fe94c987a 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 cache: "pnpm" diff --git a/.nvmrc b/.nvmrc index ed27c90a8..f5b3ef39f 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.20.0 \ No newline at end of file +22.21.0 \ No newline at end of file diff --git a/.vscode/i18n-ally-custom-framework.yml b/.vscode/i18n-ally-custom-framework.yml index 43c0ddff5..eed692a43 100644 --- a/.vscode/i18n-ally-custom-framework.yml +++ b/.vscode/i18n-ally-custom-framework.yml @@ -14,6 +14,7 @@ usageMatchRegex: # the `{key}` will be placed by a proper keypath matching regex, # you can ignore it and use your own matching rules as well - "[^\\w\\d]t\\(['\"`]({key})['\"`]" + - ]*> # A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys # and works like how the i18next framework identifies the namespace scope from the diff --git a/.vscode/settings.json b/.vscode/settings.json index 9ee96f4c1..0c6d55c65 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,8 @@ "i18n-ally.keystyle": "nested", "i18n-ally.localesPaths": [ "apps/server/src/assets/translations", - "apps/client/src/translations" + "apps/client/src/translations", + "apps/website/public/translations" ], "npm.exclude": [ "**/dist", diff --git a/README.md b/README.md index 1fb4e0b95..be62b5370 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +
+ Special thanks to:
+ + Warp sponsorship
+ Warp, built for coding with multiple AI agents
+
+ Available for macOS, Linux and Windows +
+ +
+ # Trilium Notes ![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) ![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran) @@ -13,6 +24,10 @@ See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for q Trilium Screenshot +## ⏬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – unstable development version, updated daily with the latest features and fixes. + ## 📚 Documentation **Visit our comprehensive documentation at [docs.triliumnotes.org](https://docs.triliumnotes.org/)** diff --git a/_regroup/package.json b/_regroup/package.json index 35aa4e35e..4cec178aa 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -35,13 +35,13 @@ "chore:generate-openapi": "tsx bin/generate-openapi.js" }, "devDependencies": { - "@playwright/test": "1.56.0", - "@stylistic/eslint-plugin": "5.4.0", + "@playwright/test": "1.56.1", + "@stylistic/eslint-plugin": "5.5.0", "@types/express": "5.0.3", - "@types/node": "22.18.9", + "@types/node": "22.18.12", "@types/yargs": "17.0.33", "@vitest/coverage-v8": "3.2.4", - "eslint": "9.37.0", + "eslint": "9.38.0", "eslint-plugin-simple-import-sort": "12.1.1", "esm": "3.2.25", "jsdoc": "4.0.5", @@ -49,8 +49,8 @@ "rcedit": "4.0.1", "rimraf": "6.0.1", "tslib": "2.8.1", - "typedoc": "0.28.13", - "typedoc-plugin-missing-exports": "4.1.0" + "typedoc": "0.28.14", + "typedoc-plugin-missing-exports": "4.1.2" }, "optionalDependencies": { "appdmg": "0.6.6" diff --git a/_regroup/spec/support/etapi.ts b/_regroup/spec/support/etapi.ts index 307868d7d..b32ba38e7 100644 --- a/_regroup/spec/support/etapi.ts +++ b/_regroup/spec/support/etapi.ts @@ -1,4 +1,3 @@ -import type child_process from "child_process"; import { describe, beforeAll, afterAll } from "vitest"; let etapiAuthToken: string | undefined; @@ -12,8 +11,6 @@ type SpecDefinitionsFunc = () => void; function describeEtapi(description: string, specDefinitions: SpecDefinitionsFunc): void { describe(description, () => { - let appProcess: ReturnType; - beforeAll(async () => {}); afterAll(() => {}); diff --git a/apps/client/package.json b/apps/client/package.json index cfb4afcc4..c2490ebfd 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -1,6 +1,6 @@ { "name": "@triliumnext/client", - "version": "0.99.1", + "version": "0.99.2", "description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)", "private": true, "license": "AGPL-3.0-only", @@ -15,7 +15,7 @@ "circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular" }, "dependencies": { - "@eslint/js": "9.37.0", + "@eslint/js": "9.38.0", "@excalidraw/excalidraw": "0.18.0", "@fullcalendar/core": "6.1.19", "@fullcalendar/daygrid": "6.1.19", @@ -32,33 +32,35 @@ "@triliumnext/commons": "workspace:*", "@triliumnext/highlightjs": "workspace:*", "@triliumnext/share-theme": "workspace:*", + "@triliumnext/split.js": "workspace:*", "autocomplete.js": "0.38.1", "bootstrap": "5.3.8", "boxicons": "2.1.4", + "color": "5.0.2", "dayjs": "1.11.18", "dayjs-plugin-utc": "0.1.2", "debounce": "2.2.0", "draggabilly": "3.0.0", "force-graph": "1.51.0", "globals": "16.4.0", - "i18next": "25.5.3", + "i18next": "25.6.0", "i18next-http-backend": "3.0.2", "jquery": "3.7.1", "jquery.fancytree": "2.38.5", "jsplumb": "2.15.6", - "katex": "0.16.23", + "katex": "0.16.25", "knockout": "3.5.1", "leaflet": "1.9.4", "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", - "marked": "16.4.0", + "marked": "16.4.1", "mermaid": "11.12.0", - "mind-elixir": "5.3.2", + "mind-elixir": "5.3.3", "normalize.css": "8.0.1", "panzoom": "9.4.3", "preact": "10.27.2", - "react-i18next": "16.0.0", - "split.js": "1.6.5", + "react-i18next": "16.1.2", + "reveal.js": "5.2.1", "svg-pan-zoom": "3.6.2", "tabulator-tables": "6.3.1", "vanilla-js-wheel-zoom": "9.0.4" @@ -68,13 +70,14 @@ "@preact/preset-vite": "2.10.2", "@types/bootstrap": "5.2.10", "@types/jquery": "3.5.33", - "@types/leaflet": "1.9.20", + "@types/leaflet": "1.9.21", "@types/leaflet-gpx": "1.3.8", "@types/mark.js": "8.11.12", + "@types/reveal.js": "5.2.1", "@types/tabulator-tables": "6.2.11", "copy-webpack-plugin": "13.0.1", - "happy-dom": "20.0.0", + "happy-dom": "20.0.7", "script-loader": "0.7.2", - "vite-plugin-static-copy": "3.1.3" + "vite-plugin-static-copy": "3.1.4" } } \ No newline at end of file diff --git a/apps/client/src/components/note_context.ts b/apps/client/src/components/note_context.ts index 1bc4e5498..d4bcb1fa6 100644 --- a/apps/client/src/components/note_context.ts +++ b/apps/client/src/components/note_context.ts @@ -326,9 +326,11 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> } // Collections must always display a note list, even if no children. - const viewType = note.getLabelValue("viewType") ?? "grid"; - if (!["list", "grid"].includes(viewType)) { - return true; + if (note.type === "book") { + const viewType = note.getLabelValue("viewType") ?? "grid"; + if (!["list", "grid"].includes(viewType)) { + return true; + } } if (!note.hasChildren()) { @@ -438,4 +440,22 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> } } +export function openInCurrentNoteContext(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent | React.PointerEvent | null, notePath: string, viewScope?: ViewScope) { + const ntxId = $(evt?.target as Element) + .closest("[data-ntx-id]") + .attr("data-ntx-id"); + + const noteContext = ntxId ? appContext.tabManager.getNoteContextById(ntxId) : appContext.tabManager.getActiveContext(); + + if (noteContext) { + noteContext.setNote(notePath, { viewScope }).then(() => { + if (noteContext !== appContext.tabManager.getActiveContext()) { + appContext.tabManager.activateNoteContext(noteContext.ntxId); + } + }); + } else { + appContext.tabManager.openContextWithNote(notePath, { viewScope, activate: true }); + } +} + export default NoteContext; diff --git a/apps/client/src/entities/fnote.ts b/apps/client/src/entities/fnote.ts index dcb768dd7..bcb6c408e 100644 --- a/apps/client/src/entities/fnote.ts +++ b/apps/client/src/entities/fnote.ts @@ -1,6 +1,5 @@ import server from "../services/server.js"; import noteAttributeCache from "../services/note_attribute_cache.js"; -import ws from "../services/ws.js"; import protectedSessionHolder from "../services/protected_session_holder.js"; import cssClassManager from "../services/css_class_manager.js"; import type { Froca } from "../services/froca-interface.js"; @@ -586,7 +585,7 @@ export default class FNote { let childBranches = this.getChildBranches(); if (!childBranches) { - ws.logError(`No children for '${this.noteId}'. This shouldn't happen.`); + console.error(`No children for '${this.noteId}'. This shouldn't happen.`); return []; } diff --git a/apps/client/src/layouts/desktop_layout.tsx b/apps/client/src/layouts/desktop_layout.tsx index 9dc4b76ee..3f9416584 100644 --- a/apps/client/src/layouts/desktop_layout.tsx +++ b/apps/client/src/layouts/desktop_layout.tsx @@ -138,7 +138,7 @@ export default class DesktopLayout { .child(new PromotedAttributesWidget()) .child() .child(new NoteDetailWidget()) - .child() + .child() .child() .child() .child() diff --git a/apps/client/src/layouts/layout_commons.tsx b/apps/client/src/layouts/layout_commons.tsx index 292006011..610f31dda 100644 --- a/apps/client/src/layouts/layout_commons.tsx +++ b/apps/client/src/layouts/layout_commons.tsx @@ -66,6 +66,6 @@ export function applyModals(rootContainer: RootContainer) { .child() .child(new PromotedAttributesWidget()) .child(new NoteDetailWidget()) - .child()) + .child()) .child(); } diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 3d21b9405..b952c2d0b 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -154,7 +154,7 @@ export default class MobileLayout { .filling() .contentSized() .child(new NoteDetailWidget()) - .child() + .child() .child() ) .child() diff --git a/apps/client/src/print.css b/apps/client/src/print.css new file mode 100644 index 000000000..9ccf54362 --- /dev/null +++ b/apps/client/src/print.css @@ -0,0 +1,155 @@ +:root { + --print-font-size: 11pt; + --ck-content-color-image-caption-background: transparent !important; +} + +html, +body { + width: 100%; + height: 100%; + color: black; +} + +@page { + margin: 2cm; +} + +.note-list-widget.full-height, +.note-list-widget.full-height .note-list-widget-content { + height: unset !important; +} + +.component { + contain: none !important; +} + +body[data-note-type="text"] .ck-content { + font-size: var(--print-font-size); + text-align: justify; +} + +.ck-content figcaption { + font-style: italic; +} + +.ck-content a { + text-decoration: none; +} + +.ck-content a:not([href^="#root/"]) { + text-decoration: underline; + color: #374a75; +} + +.ck-content .todo-list__label * { + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +@supports selector(.todo-list__label__description:has(*)) and (height: 1lh) { + .ck-content .todo-list__label__description { + /* The percentage of the line height that the check box occupies */ + --box-ratio: 0.75; + /* The size of the gap between the check box and the caption */ + --box-text-gap: 0.25em; + + --box-size: calc(1lh * var(--box-ratio)); + --box-vert-offset: calc((1lh - var(--box-size)) / 2); + + display: inline-block; + padding-inline-start: calc(var(--box-size) + var(--box-text-gap)); + /* Source: https://pictogrammers.com/library/mdi/icon/checkbox-blank-outline/ */ + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3e%3cpath d='M19%2c3H5C3.89%2c3 3%2c3.89 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5C21%2c3.89 20.1%2c3 19%2c3M19%2c5V19H5V5H19Z' /%3e%3c/svg%3e"); + background-position: 0 var(--box-vert-offset); + background-size: var(--box-size); + background-repeat: no-repeat; + } + + .ck-content .todo-list__label:has(input[type="checkbox"]:checked) .todo-list__label__description { + /* Source: https://pictogrammers.com/library/mdi/icon/checkbox-outline/ */ + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3e%3cpath d='M19%2c3H5A2%2c2 0 0%2c0 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5A2%2c2 0 0%2c0 19%2c3M19%2c5V19H5V5H19M10%2c17L6%2c13L7.41%2c11.58L10%2c14.17L16.59%2c7.58L18%2c9' /%3e%3c/svg%3e"); + } + + .ck-content .todo-list__label input[type="checkbox"] { + display: none !important; + } +} + +/* #region Footnotes */ +.footnote-reference a, +.footnote-back-link a { + text-decoration: none !important; +} + +li.footnote-item { + position: relative; + width: fit-content; +} + +.ck-content .footnote-back-link { + margin-right: 0.25em; +} + +.ck-content .footnote-content { + display: inline-block; + width: unset; +} +/* #endregion */ + +/* #region Widows and orphans */ +p, +blockquote { + widows: 4; + orphans: 4; +} + +pre > code { + widows: 6; + orphans: 6; + overflow: auto; + white-space: pre-wrap !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + page-break-after: avoid; + break-after: avoid; +} +/* #endregion */ + +/* #region Tables */ +.table thead th, +.table td, +.table th { + /* Fix center vertical alignment of table cells */ + vertical-align: middle; +} + +pre { + box-shadow: unset !important; + border: 0.75pt solid gray !important; + border-radius: 2pt !important; +} + +th, +span[style] { + print-color-adjust: exact; + -webkit-print-color-adjust: exact; +} +/* #endregion */ + +/* #region Page breaks */ +.page-break { + page-break-after: always; + break-after: always; +} + +.page-break > *, +.page-break::after { + display: none !important; +} +/* #endregion */ \ No newline at end of file diff --git a/apps/client/src/print.tsx b/apps/client/src/print.tsx new file mode 100644 index 000000000..de11d581a --- /dev/null +++ b/apps/client/src/print.tsx @@ -0,0 +1,92 @@ +import FNote from "./entities/fnote"; +import { render } from "preact"; +import { CustomNoteList } from "./widgets/collections/NoteList"; +import { useCallback, useLayoutEffect, useRef } from "preact/hooks"; +import content_renderer from "./services/content_renderer"; + +interface RendererProps { + note: FNote; + onReady: () => void; +} + +async function main() { + const notePath = window.location.hash.substring(1); + const noteId = notePath.split("/").at(-1); + if (!noteId) return; + + await import("./print.css"); + const froca = (await import("./services/froca")).default; + const note = await froca.getNote(noteId); + + render(, document.body); +} + +function App({ note, noteId }: { note: FNote | null | undefined, noteId: string }) { + const sentReadyEvent = useRef(false); + const onReady = useCallback(() => { + if (sentReadyEvent.current) return; + window.dispatchEvent(new Event("note-ready")); + window._noteReady = true; + sentReadyEvent.current = true; + }, []); + const props: RendererProps | undefined | null = note && { note, onReady }; + + if (!note || !props) return + + useLayoutEffect(() => { + document.body.dataset.noteType = note.type; + }, [ note ]); + + return ( + <> + {note.type === "book" + ? + : + } + + ); +} + +function SingleNoteRenderer({ note, onReady }: RendererProps) { + const containerRef = useRef(null); + + useLayoutEffect(() => { + async function load() { + if (note.type === "text") { + await import("@triliumnext/ckeditor5/src/theme/ck-content.css"); + } + const { $renderedContent } = await content_renderer.getRenderedContent(note, { noChildrenList: true }); + containerRef.current?.replaceChildren(...$renderedContent); + } + + load().then(() => requestAnimationFrame(onReady)) + }, [ note ]); + + return <> +

{note.title}

+
+ ; +} + +function CollectionRenderer({ note, onReady }: RendererProps) { + return ; +} + +function Error404({ noteId }: { noteId: string }) { + return ( +
+

The note you are trying to print could not be found.

+ {noteId} +
+ ) +} + +main(); diff --git a/apps/client/src/services/content_renderer.ts b/apps/client/src/services/content_renderer.ts index c5d93fd51..e891b96d7 100644 --- a/apps/client/src/services/content_renderer.ts +++ b/apps/client/src/services/content_renderer.ts @@ -23,11 +23,13 @@ interface Options { tooltip?: boolean; trim?: boolean; imageHasZoom?: boolean; + /** If enabled, it will prevent the default behavior in which an empty note would display a list of children. */ + noChildrenList?: boolean; } const CODE_MIME_TYPES = new Set(["application/json"]); -async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FAttachment, options: Options = {}) { +export async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FAttachment, options: Options = {}) { options = Object.assign( { @@ -42,7 +44,7 @@ async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FA const $renderedContent = $('
'); if (type === "text" || type === "book") { - await renderText(entity, $renderedContent); + await renderText(entity, $renderedContent, options); } else if (type === "code") { await renderCode(entity, $renderedContent); } else if (["image", "canvas", "mindMap"].includes(type)) { @@ -114,7 +116,7 @@ async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FA }; } -async function renderText(note: FNote | FAttachment, $renderedContent: JQuery) { +async function renderText(note: FNote | FAttachment, $renderedContent: JQuery, options: Options = {}) { // entity must be FNote const blob = await note.getBlob(); @@ -135,7 +137,7 @@ async function renderText(note: FNote | FAttachment, $renderedContent: JQuery(); -function createClassForColor(color: string | null) { - if (!color?.trim()) { - return ""; - } +// Read the color lightness limits defined in the theme as CSS variables - const normalizedColorName = color.replace(/[^a-z0-9]/gi, ""); +const lightThemeColorMaxLightness = readCssVar( + document.documentElement, + "tree-item-light-theme-max-color-lightness" + ).asNumber(70); - if (!normalizedColorName.trim()) { - return ""; - } +const darkThemeColorMinLightness = readCssVar( + document.documentElement, + "tree-item-dark-theme-min-color-lightness" + ).asNumber(50); - const className = `color-${normalizedColorName}`; +function createClassForColor(colorString: string | null) { + if (!colorString?.trim()) return ""; + + const color = parseColor(colorString); + if (!color) return ""; + + const className = `color-${color.hex().substring(1)}`; if (!registeredClasses.has(className)) { - // make the active fancytree selector more specific than the normal color setting - $("head").append(``); + const adjustedColor = adjustColorLightness(color, lightThemeColorMaxLightness!, + darkThemeColorMinLightness!); + + $("head").append(``); registeredClasses.add(className); } @@ -23,6 +41,41 @@ function createClassForColor(color: string | null) { return className; } +function parseColor(color: string) { + try { + return Color(color); + } catch (ex) { + console.error(ex); + } +} + +/** + * Returns a pair of colors — one optimized for light themes and the other for dark themes, derived + * from the specified color to maintain sufficient contrast with each theme. + * The adjustment is performed by limiting the color’s lightness in the CIELAB color space, + * according to the lightThemeMaxLightness and darkThemeMinLightness parameters. + */ +function adjustColorLightness(color: ColorInstance, lightThemeMaxLightness: number, darkThemeMinLightness: number) { + const labColor = color.lab(); + const lightness = labColor.l(); + + // For the light theme, limit the maximum lightness + const lightThemeColor = labColor.l(Math.min(lightness, lightThemeMaxLightness)).hex(); + + // For the dark theme, limit the minimum lightness + const darkThemeColor = labColor.l(Math.max(lightness, darkThemeMinLightness)).hex(); + + return {lightThemeColor, darkThemeColor}; +} + +/** Returns the hue of the specified color, or undefined if the color is grayscale. */ +function getHue(color: ColorInstance) { + const hslColor = color.hsl(); + if (hslColor.saturationl() > 0) { + return hslColor.hue(); + } +} + export default { createClassForColor }; diff --git a/apps/client/src/services/froca.ts b/apps/client/src/services/froca.ts index 6bbc3a50d..a1529db72 100644 --- a/apps/client/src/services/froca.ts +++ b/apps/client/src/services/froca.ts @@ -40,20 +40,23 @@ class FrocaImpl implements Froca { constructor() { this.initializedPromise = this.loadInitialTree(); + this.#clear(); } async loadInitialTree() { const resp = await server.get("tree"); // clear the cache only directly before adding new content which is important for e.g., switching to protected session + this.#clear(); + this.addResp(resp); + } + #clear() { this.notes = {}; this.branches = {}; this.attributes = {}; this.attachments = {}; this.blobPromises = {}; - - this.addResp(resp); } async loadSubTree(subTreeNoteId: string) { diff --git a/apps/client/src/services/in_app_help.ts b/apps/client/src/services/in_app_help.ts index 9e00f7e37..a0b118e5c 100644 --- a/apps/client/src/services/in_app_help.ts +++ b/apps/client/src/services/in_app_help.ts @@ -27,7 +27,8 @@ export const byBookType: Record = { calendar: "xWbu3jpNWapp", table: "2FvYrpmOXm29", geoMap: "81SGnPGMk7Xc", - board: "CtBQqbwXDx1w" + board: "CtBQqbwXDx1w", + presentation: null }; export function getHelpUrlForNote(note: FNote | null | undefined) { diff --git a/apps/client/src/services/link.ts b/apps/client/src/services/link.ts index 16ca48bd7..b0ab04d07 100644 --- a/apps/client/src/services/link.ts +++ b/apps/client/src/services/link.ts @@ -4,6 +4,7 @@ import appContext, { type NoteCommandData } from "../components/app_context.js"; import froca from "./froca.js"; import utils from "./utils.js"; import { ALLOWED_PROTOCOLS } from "@triliumnext/commons"; +import { openInCurrentNoteContext } from "../components/note_context.js"; function getNotePathFromUrl(url: string) { const notePathMatch = /#(root[A-Za-z0-9_/]*)$/.exec(url); @@ -316,21 +317,7 @@ function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent viewScope }); } else if (isLeftClick) { - const ntxId = $(evt?.target as any) - .closest("[data-ntx-id]") - .attr("data-ntx-id"); - - const noteContext = ntxId ? appContext.tabManager.getNoteContextById(ntxId) : appContext.tabManager.getActiveContext(); - - if (noteContext) { - noteContext.setNote(notePath, { viewScope }).then(() => { - if (noteContext !== appContext.tabManager.getActiveContext()) { - appContext.tabManager.activateNoteContext(noteContext.ntxId); - } - }); - } else { - appContext.tabManager.openContextWithNote(notePath, { viewScope, activate: true }); - } + openInCurrentNoteContext(evt, notePath, viewScope); } } else if (hrefLink) { const withinEditLink = $link?.hasClass("ck-link-actions__preview"); diff --git a/apps/client/src/services/note_types.ts b/apps/client/src/services/note_types.ts index a42631f9f..74b6f5665 100644 --- a/apps/client/src/services/note_types.ts +++ b/apps/client/src/services/note_types.ts @@ -168,7 +168,8 @@ async function getBuiltInTemplates(title: string | null, command: TreeCommandNam } for (const templateNote of childNotes) { - if (templateNote.hasLabel("collection") !== filterCollections) { + if (templateNote.hasLabel("collection") !== filterCollections || + !templateNote.hasLabel("template")) { continue; } diff --git a/apps/client/src/services/resizer.ts b/apps/client/src/services/resizer.ts index 54a11e801..93cb5c1b0 100644 --- a/apps/client/src/services/resizer.ts +++ b/apps/client/src/services/resizer.ts @@ -1,5 +1,5 @@ import options from "./options.js"; -import Split from "split.js" +import Split from "@triliumnext/split.js"; export const DEFAULT_GUTTER_SIZE = 5; @@ -46,6 +46,7 @@ function setupLeftPaneResizer(leftPaneVisible: boolean) { sizes: [leftPaneWidth, restPaneWidth], gutterSize: DEFAULT_GUTTER_SIZE, minSize: [150, 300], + rtl: glob.isRtl, onDragEnd: (sizes) => { leftPaneWidth = Math.round(sizes[0]); options.save("leftPaneWidth", Math.round(sizes[0])); @@ -79,6 +80,7 @@ function setupRightPaneResizer() { sizes: [100 - rightPaneWidth, rightPaneWidth], gutterSize: DEFAULT_GUTTER_SIZE, minSize: [300, 180], + rtl: glob.isRtl, onDragEnd: (sizes) => { rightPaneWidth = Math.round(sizes[1]); options.save("rightPaneWidth", Math.round(sizes[1])); @@ -99,7 +101,7 @@ function setupNoteSplitResizer(ntxIds: string[]) { let targetNtxIds: string[] | undefined; for (const ntxId of ntxIds) { targetNtxIds = findKeyByNtxId(ntxId); - if (targetNtxIds) break; + if (targetNtxIds) break; } if (targetNtxIds) { @@ -154,6 +156,7 @@ function createSplitInstance(targetNtxIds: string[]) { const splitPanels = [...splitNoteContainer.querySelectorAll(':scope > .note-split')] .filter(el => targetNtxIds.includes(el.getAttribute('data-ntx-id') ?? "")); const splitInstance = Split(splitPanels, { + rtl: glob.isRtl, gutterSize: DEFAULT_GUTTER_SIZE, minSize: 150, }); diff --git a/apps/client/src/services/syntax_highlight.ts b/apps/client/src/services/syntax_highlight.ts index 9b5592a6b..89dc7c94e 100644 --- a/apps/client/src/services/syntax_highlight.ts +++ b/apps/client/src/services/syntax_highlight.ts @@ -61,7 +61,11 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery { + if (glob.device === "print") return; + ws = connectWebSocket(); lastPingTs = Date.now(); diff --git a/apps/client/src/stylesheets/print.css b/apps/client/src/stylesheets/print.css deleted file mode 100644 index 842570bde..000000000 --- a/apps/client/src/stylesheets/print.css +++ /dev/null @@ -1,322 +0,0 @@ -:root { - --main-background-color: white; - --root-background: var(--main-background-color); - --launcher-pane-background-color: var(--main-background-color); - --main-text-color: black; - --input-text-color: var(--main-text-color); - - --print-font-size: 11pt; -} - -@page { - margin: 2cm; -} - -.ck-content { - font-size: var(--print-font-size); - text-align: justify; -} - -.note-detail-readonly-text { - padding: 0 !important; -} - -.no-print, -.no-print *, -.tab-row-container, -.tab-row-widget, -.title-bar-buttons, -#launcher-pane, -#left-pane, -#center-pane > *:not(.split-note-container-widget), -#right-pane, -.title-row .note-icon-widget, -.title-row .icon-action, -.ribbon-container, -.promoted-attributes-widget, -.scroll-padding-widget, -.note-list-widget, -.spacer { - display: none !important; -} - -body.mobile #mobile-sidebar-wrapper, -body.mobile .classic-toolbar-widget, -body.mobile .action-button { - display: none !important; -} - -body.mobile #detail-container { - max-height: unset; -} - -body.mobile .note-title-widget { - padding: 0 !important; -} - -body, -#root-widget, -#rest-pane > div.component:first-child, -.note-detail-printable, -.note-detail-editable-text-editor { - height: unset !important; - overflow: auto; -} - -.ck.ck-editor__editable_inline { - overflow: hidden !important; -} - -.note-title-widget input, -.note-detail-editable-text, -.note-detail-editable-text-editor { - padding: 0 !important; -} - -html, -body { - width: unset !important; - height: unset !important; - overflow: visible; - position: unset; - /* https://github.com/zadam/trilium/issues/3202 */ - color: black; -} - -#root-widget, -#horizontal-main-container, -#rest-pane, -#vertical-main-container, -#center-pane, -.split-note-container-widget, -.note-split:not(.hidden-ext), -body.mobile #mobile-rest-container { - display: block !important; - overflow: auto; - border-radius: 0 !important; -} - -#center-pane, -#rest-pane, -.note-split, -body.mobile #detail-container { - width: unset !important; - max-width: unset !important; -} - -.component { - contain: none !important; -} - -/* Respect page breaks */ -.page-break { - page-break-after: always; - break-after: always; -} - -.page-break > * { - display: none !important; -} - -.relation-map-wrapper { - height: 100vh !important; -} - -.table thead th, -.table td, -.table th { - /* Fix center vertical alignment of table cells */ - vertical-align: middle; -} - -pre { - box-shadow: unset !important; - border: 0.75pt solid gray !important; - border-radius: 2pt !important; -} - -th, -span[style] { - print-color-adjust: exact; - -webkit-print-color-adjust: exact; -} - -/* - * Text note specific fixes - */ -.ck-widget { - outline: none !important; -} - -.ck-placeholder, -.ck-widget__type-around, -.ck-widget__selection-handle { - display: none !important; -} - -.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused, -.ck-widget.table td.ck-editor__nested-editable:focus, -.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused, -.ck-widget.table th.ck-editor__nested-editable:focus { - background: unset !important; - outline: unset !important; -} - -.include-note .include-note-content { - max-height: unset !important; - overflow: unset !important; -} - -/* TODO: This will break once we translate the language */ -.ck-content pre[data-language="Auto-detected"]:after { - display: none !important; -} - -/* - * Code note specific fixes. - */ -.note-detail-code pre { - border: unset !important; - border-radius: unset !important; -} - -/* - * Links - */ - -.note-detail-printable a { - text-decoration: none; -} - -.note-detail-printable a:not([href^="#root/"]) { - text-decoration: underline; - color: #374a75; -} - -.note-detail-printable a::after { - /* Hide the external link trailing arrow */ - display: none !important; -} - -/* - * TODO list check boxes - */ - -.note-detail-printable .todo-list__label * { - -webkit-print-color-adjust: exact; - print-color-adjust: exact; -} - -@supports selector(.todo-list__label__description:has(*)) and (height: 1lh) { - .note-detail-printable .todo-list__label__description { - /* The percentage of the line height that the check box occupies */ - --box-ratio: 0.75; - /* The size of the gap between the check box and the caption */ - --box-text-gap: 0.25em; - - --box-size: calc(1lh * var(--box-ratio)); - --box-vert-offset: calc((1lh - var(--box-size)) / 2); - - display: inline-block; - padding-inline-start: calc(var(--box-size) + var(--box-text-gap)); - /* Source: https://pictogrammers.com/library/mdi/icon/checkbox-blank-outline/ */ - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3e%3cpath d='M19%2c3H5C3.89%2c3 3%2c3.89 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5C21%2c3.89 20.1%2c3 19%2c3M19%2c5V19H5V5H19Z' /%3e%3c/svg%3e"); - background-position: 0 var(--box-vert-offset); - background-size: var(--box-size); - background-repeat: no-repeat; - } - - .note-detail-printable .todo-list__label:has(input[type="checkbox"]:checked) .todo-list__label__description { - /* Source: https://pictogrammers.com/library/mdi/icon/checkbox-outline/ */ - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3e%3cpath d='M19%2c3H5A2%2c2 0 0%2c0 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5A2%2c2 0 0%2c0 19%2c3M19%2c5V19H5V5H19M10%2c17L6%2c13L7.41%2c11.58L10%2c14.17L16.59%2c7.58L18%2c9' /%3e%3c/svg%3e"); - } - - .note-detail-printable .todo-list__label input[type="checkbox"] { - display: none !important; - } -} - -/* - * Blockquotes - */ - -.note-detail-printable blockquote { - box-shadow: unset; -} - -/* - * Figures - */ - -.note-detail-printable figcaption { - --accented-background-color: transparent; - - font-style: italic; -} - -/* - * Footnotes - */ - -.note-detail-printable .footnote-reference a, -.footnote-back-link a { - text-decoration: none; -} - -/* Make the "^" link cover the whole area of the footnote item */ - -.footnote-section { - clear: both; -} - -.note-detail-printable li.footnote-item { - position: relative; - width: fit-content; -} - -.note-detail-printable .footnote-back-link, -.note-detail-printable .footnote-back-link *, -.note-detail-printable .footnote-back-link a { - display: block; - position: absolute; - - top: 0; - inset-inline-start: 0; - width: 100%; - height: 100%; -} - -.note-detail-printable .footnote-back-link a { - color: transparent; -} - -.note-detail-printable .footnote-content { - display: inline-block; - width: unset; -} - -/* - * Widows and orphans - */ -p, -blockquote { - widows: 4; - orphans: 4; -} - -pre > code { - widows: 6; - orphans: 6; - overflow: auto; - white-space: pre-wrap !important; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - page-break-after: avoid; - break-after: avoid; -} diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index ff9c30850..fd8383130 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -360,7 +360,8 @@ button kbd { } .dropdown-menu, -.tabulator-popup-container { +.tabulator-popup-container, +:root .excalidraw .popover { color: var(--menu-text-color) !important; font-size: inherit; background: var(--menu-background-color) !important; @@ -371,7 +372,9 @@ button kbd { } body.desktop .dropdown-menu, -body.desktop .tabulator-popup-container { +body.desktop .tabulator-popup-container, +:root .excalidraw .dropdown-menu .dropdown-menu-container, +:root .excalidraw .popover { border: 1px solid var(--dropdown-border-color); column-rule: 1px solid var(--dropdown-border-color); box-shadow: 0px 10px 20px rgba(0, 0, 0, var(--dropdown-shadow-opacity)); @@ -416,7 +419,8 @@ body.desktop .tabulator-popup-container { .dropdown-menu a:hover:not(.disabled), .dropdown-item:hover:not(.disabled, .dropdown-container-item), -.tabulator-menu-item:hover { +.tabulator-menu-item:hover, +:root .excalidraw .context-menu .context-menu-item:hover { color: var(--hover-item-text-color) !important; background-color: var(--hover-item-background-color) !important; border-color: var(--hover-item-border-color) !important; @@ -457,7 +461,8 @@ body #context-menu-container .dropdown-item > span { } .dropdown-item, -.dropdown-header { +.dropdown-header, +:root .excalidraw .context-menu .context-menu-item:hover { color: var(--menu-text-color) !important; border: 1px solid transparent !important; } @@ -1008,7 +1013,7 @@ svg.ck-icon .note-icon { --ck-content-line-height: var(--bs-body-line-height); } -.ck-content .table table th { +:root .ck-content .table table:not(.layout-table) th { background-color: var(--accented-background-color); } @@ -1978,6 +1983,10 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container { -webkit-app-region: drag; } +body.electron.platform-darwin:not(.native-titlebar) #tab-row-left-spacer { + width: 80px; +} + .tab-row-widget { padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw)); } @@ -2277,9 +2286,8 @@ footer.webview-footer button { .admonition { --accent-color: var(--card-border-color); + background: color-mix(in srgb, var(--accent-color) 15%, transparent); border: 1px solid var(--accent-color); - box-shadow: var(--card-box-shadow); - background: var(--card-background-color); border-radius: 0.5em; padding: 1em; margin: 1.25em 0; @@ -2414,4 +2422,14 @@ footer.webview-footer button { .revision-diff-removed { background: rgba(255, 100, 100, 0.5); text-decoration: line-through; +} + +iframe.print-iframe { + position: absolute; + top: 0; + left: -600px; + right: -600px; + bottom: 0; + width: 0; + height: 0; } \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-dark.css b/apps/client/src/stylesheets/theme-dark.css index f56e73232..0a622d97d 100644 --- a/apps/client/src/stylesheets/theme-dark.css +++ b/apps/client/src/stylesheets/theme-dark.css @@ -82,6 +82,10 @@ body ::-webkit-calendar-picker-indicator { filter: invert(1); } +#left-pane .fancytree-node.tinted { + --custom-color: var(--dark-theme-custom-color); +} + .excalidraw.theme--dark { --theme-filter: invert(80%) hue-rotate(180deg) !important; } diff --git a/apps/client/src/stylesheets/theme-light.css b/apps/client/src/stylesheets/theme-light.css index 7aca1b3f9..a07b9799f 100644 --- a/apps/client/src/stylesheets/theme-light.css +++ b/apps/client/src/stylesheets/theme-light.css @@ -81,3 +81,7 @@ html { --mermaid-theme: default; --native-titlebar-background: #ffffff00; } + +#left-pane .fancytree-node.tinted { + --custom-color: var(--light-theme-custom-color); +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next-dark.css b/apps/client/src/stylesheets/theme-next-dark.css index 0516712e0..8b15e7676 100644 --- a/apps/client/src/stylesheets/theme-next-dark.css +++ b/apps/client/src/stylesheets/theme-next-dark.css @@ -160,6 +160,9 @@ --launcher-pane-horiz-background-color-bgfx: #ffffff17; /* When background effects enabled */ --launcher-pane-horiz-border-color-bgfx: #00000080; /* When background effects enabled */ + --global-menu-update-available-badge-background-color: #7dbe61; + --global-menu-update-available-badge-color: black; + --protected-session-active-icon-color: #8edd8e; --sync-status-error-pulse-color: #f47871; @@ -265,6 +268,15 @@ * Dark color scheme tweaks */ +#left-pane .fancytree-node.tinted { + --custom-color: var(--dark-theme-custom-color); + + /* The background color of the active item in the note tree. + * The --custom-color-hue variable contains the hue of the user-selected note color. + * This value is unset for gray tones. */ + --custom-bg-color: hsl(var(--custom-color-hue), 20%, 33%, 0.4); +} + body ::-webkit-calendar-picker-indicator { filter: invert(1); } @@ -275,4 +287,4 @@ body ::-webkit-calendar-picker-indicator { body .todo-list input[type="checkbox"]:not(:checked):before { border-color: var(--muted-text-color) !important; -} +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next-light.css b/apps/client/src/stylesheets/theme-next-light.css index 90745a437..30f4e1c3a 100644 --- a/apps/client/src/stylesheets/theme-next-light.css +++ b/apps/client/src/stylesheets/theme-next-light.css @@ -127,7 +127,7 @@ --left-pane-item-selected-color: black; --left-pane-item-selected-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2); --left-pane-item-action-button-background: rgba(0, 0, 0, 0.11); - --left-pane-item-action-button-color: inherit; + --left-pane-item-action-button-color: var(--left-pane-text-color); --left-pane-item-action-button-hover-background: white; --left-pane-item-action-button-hover-shadow: 2px 2px 3px rgba(0, 0, 0, 0.15); --left-pane-item-selected-action-button-hover-shadow: 2px 2px 10px rgba(0, 0, 0, 0.25); @@ -153,6 +153,9 @@ --launcher-pane-horiz-background-color-bgfx: #ffffffb3; /* When background effects enabled */ --launcher-pane-horiz-border-color-bgfx: #00000026; /* When background effects enabled */ + --global-menu-update-available-badge-background-color: #4fa450; + --global-menu-update-available-badge-color: white; + --protected-session-active-icon-color: #16b516; --sync-status-error-pulse-color: #ff5528; @@ -258,5 +261,13 @@ --ck-editor-toolbar-button-on-color: black; --ck-editor-toolbar-button-on-shadow: none; --ck-editor-toolbar-dropdown-button-open-background: #0000000f; - } + +#left-pane .fancytree-node.tinted { + --custom-color: var(--light-theme-custom-color); + + /* The background color of the active item in the note tree. + * The --custom-color-hue variable contains the hue of the user-selected note color. + * This value is unset for gray tones. */ + --custom-bg-color: hsl(var(--custom-color-hue), 37%, 89%, 1); +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next/base.css b/apps/client/src/stylesheets/theme-next/base.css index a167c08b5..a33da2bc5 100644 --- a/apps/client/src/stylesheets/theme-next/base.css +++ b/apps/client/src/stylesheets/theme-next/base.css @@ -4,6 +4,7 @@ @import url(./pages.css); @import url(./ribbon.css); @import url(./notes/text.css); +@import url(./notes/canvas.css); @import url(./notes/collections/table.css); @font-face { @@ -81,6 +82,20 @@ /* Theme capabilities */ --tab-note-icons: true; + + /* To ensure that a tree item's custom color remains sufficiently contrasted and readable, + * the color is adjusted based on the current color scheme (light or dark). The lightness + * component of the color represented in the CIELAB color space, will be + * constrained to a certain percentage defined below. + * + * Note: the tree background may vary when background effects are enabled, so it is recommended + * to maintain a higher contrast margin than on the usual note tree solid background. */ + + /* The maximum perceptual lightness for the custom color in the light theme (%): */ + --tree-item-light-theme-max-color-lightness: 60; + + /* The minimum perceptual lightness for the custom color in the dark theme (%): */ + --tree-item-dark-theme-min-color-lightness: 65; } body.backdrop-effects-disabled { @@ -96,9 +111,10 @@ body.backdrop-effects-disabled { * supported when this class is used. */ - .dropdown-menu:not(.static) { + .dropdown-menu:not(.static), + :root .excalidraw .popover { border-radius: var(--dropdown-border-radius); - padding: var(--menu-padding-size) !important; + padding: var(--padding, var(--menu-padding-size)) !important; font-size: 0.9rem !important; } @@ -114,7 +130,8 @@ body.mobile .dropdown-menu .dropdown-menu { } body.desktop .dropdown-menu::before, -:root .ck.ck-dropdown__panel::before { +:root .ck.ck-dropdown__panel::before, +:root .excalidraw .popover::before { content: ""; backdrop-filter: var(--dropdown-backdrop-filter); border-radius: var(--dropdown-border-radius); @@ -148,9 +165,17 @@ body.desktop .dropdown-submenu .dropdown-menu { } .dropdown-item, -body.mobile .dropdown-submenu .dropdown-toggle { - padding: 2px 2px 2px 8px !important; - padding-inline-end: 22px !important; +body.mobile .dropdown-submenu .dropdown-toggle, +.excalidraw .context-menu .context-menu-item { + --menu-item-start-padding: 8px; + --menu-item-end-padding: 22px; + --menu-item-vertical-padding: 2px; + + padding-top: var(--menu-item-vertical-padding) !important; + padding-bottom: var(--menu-item-vertical-padding) !important; + padding-inline-start: var(--menu-item-start-padding) !important; + padding-inline-end: var(--menu-item-end-padding) !important; + /* Note: the right padding should also accommodate the submenu arrow. */ border-radius: 6px; cursor: default !important; @@ -202,7 +227,8 @@ html body .dropdown-item[disabled] { } /* Menu item keyboard shortcut */ -.dropdown-item kbd { +.dropdown-item kbd, +.excalidraw .context-menu-item__shortcut { font-family: unset !important; font-size: unset !important; color: var(--menu-item-keyboard-shortcut-color) !important; @@ -214,13 +240,15 @@ html body .dropdown-item[disabled] { margin-inline-start: 16px; } -.dropdown-divider { +.dropdown-divider, +.excalidraw .context-menu hr { position: relative; border-color: transparent !important; overflow: visible; } -.dropdown-divider::after { +.dropdown-divider::after, +.excalidraw .context-menu hr::before { position: absolute; content: ""; top: -1px; @@ -253,7 +281,9 @@ body[dir=rtl] .dropdown-menu:not([data-popper-placement="bottom-start"]) .dropdo /* Menu item group heading */ /* The heading body */ -.dropdown-menu h6 { +.dropdown-menu h6, +.excalidraw .dropdown-menu-container .dropdown-menu-group-title, +.excalidraw .dropdown-menu-container div[data-testid="canvas-background-label"] { position: relative; background: transparent; padding: 1em 8px 14px 8px; @@ -264,7 +294,9 @@ body[dir=rtl] .dropdown-menu:not([data-popper-placement="bottom-start"]) .dropdo } /* The delimiter line */ -.dropdown-menu h6::before { +.dropdown-menu h6::before, +.excalidraw .dropdown-menu-container .dropdown-menu-group-title::before, +.excalidraw .dropdown-menu-container div[data-testid="canvas-background-label"]::before { content: ""; position: absolute; bottom: 8px; diff --git a/apps/client/src/stylesheets/theme-next/notes/canvas.css b/apps/client/src/stylesheets/theme-next/notes/canvas.css new file mode 100644 index 000000000..28603d7db --- /dev/null +++ b/apps/client/src/stylesheets/theme-next/notes/canvas.css @@ -0,0 +1,261 @@ +:root .excalidraw { + --ui-font: var(--main-font-family); + + + /* Button hover background color */ + --button-hover-bg: var(--hover-item-background-color); + --color-surface-high: var(--hover-item-background-color); + + + --button-active-border: transparent; + --color-brand-active: transparent; + + --color-surface-mid: transparent; + --color-surface-low: transparent; + + /* Slider colors */ + --color-slider-track: var(--menu-item-delimiter-color); + --color-slider-thumb: var(--muted-text-color); + + /* Selected button icon fill color */ + --color-on-primary-container: var(--ck-editor-toolbar-button-on-color); + --color-primary: var(--ck-editor-toolbar-button-on-color); + + /* Selected button icon background color */ + --color-surface-primary-container: var(--ck-editor-toolbar-button-on-background); + --color-primary-light: var(--ck-editor-toolbar-button-on-background); + + --island-bg-color: var(--floating-button-background-color); + +} + +/* Dark theme tweaks */ + +:root body .excalidraw.theme--dark { + --color-surface-high: transparent; + --color-brand-hover: transparent; +} + +:root .excalidraw.theme--dark.excalidraw .App-mobile-menu, +:root .excalidraw.theme--dark.excalidraw .App-menu__left { + --button-hover-bg: var(--hover-item-background-color); +} + +:root .excalidraw.theme--dark.excalidraw .dropdown-menu-button:hover { + --background: var(--hover-item-background-color); +} + +/* Backdrop blur pseudo-element */ +.Island:not(.App-menu__left)::before, +.excalidraw .picker::before, +:root .App-menu__left > .panelColumn > fieldset::before, +:root .App-menu__left > .panelColumn > label::before, +:root .App-menu__left > .panelColumn > div:has(> *)::before { + display: block; + position: absolute; + content: ""; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: inherit; + backdrop-filter: blur(10px) saturate(6); + z-index: -1; +} + +/* Note's root */ + +:root .type-canvas { + --floating-buttons-vert-offset: 20px; +} + + +/* Context menus */ + +/* Context menu - outer wrapper */ +:root .excalidraw .popover { + --padding: 0; + + max-width: unset; + overflow: hidden; + font-family: var(--main-font-family); +} + +/* Context menu - inner wrapper */ +:root .excalidraw .popover > .context-menu { + margin: 0; + padding: 8px !important; + overflow-y: auto; + overflow-x: hidden; + height: 100%; + border: none; + padding: 0; + box-shadow: none; + background: transparent; +} + +/* Context menu item */ +:root .excalidraw .context-menu .context-menu-item { + --menu-item-start-padding: 22px; + + border: 1px solid transparent; +} + +/* Context menu item icon */ +:root .excalidraw .dropdown-menu-item__icon { + color: var(--menu-item-icon-color); +} + +/* Context menu item label */ +:root .excalidraw .context-menu-item__label, +:root .excalidraw .context-menu-item.dangerous .context-menu-item__label { + color: var(--menu-text-color); +} + +:root .excalidraw .context-menu-item:hover .context-menu-item__label { + color: var(--hover-item-text-color); +} + +/* Context menu item keyboard shortcut */ +:root .excalidraw .context-menu-item__shortcut { + padding: 0; + opacity: 1; +} + +/* Context menu separator */ +.excalidraw .context-menu .context-menu-item-separator { + margin: 8px 0; + opacity: 1; +} + +/* Main menu */ + +/* Hide separators - no longer needed as the menu group headers feature a delimiter line */ +.excalidraw .Island.dropdown-menu-container>div:not(:has(>*)) { + display: none; +} + +/* Menu group header */ +.excalidraw .dropdown-menu-container .dropdown-menu-group-title, +.excalidraw .Island.dropdown-menu-container div[data-testid="canvas-background-label"] { + margin: 0 !important; +} + +/* Header */ + +.excalidraw .App-menu.App-menu_top { + align-items: center; +} + +.excalidraw .App-menu.App-menu_top .App-menu_top__left { + /* Fixes a layout glitch with the header when the options panel is visbile */ + --gap: 0 !important; +} + +/* The parent element of the "Library" button */ +.excalidraw .App-menu.App-menu_top > div:nth-child(3) { + flex-direction: row-reverse; +} + +/* Panels */ + +.excalidraw .zoom-actions, +.undo-redo-buttons { + box-shadow: 1px 1px 1px var(--floating-button-shadow-color); + backdrop-filter: blur(10px) saturate(6); +} + +:root .excalidraw .main-menu-trigger, +:root .excalidraw .sidebar-trigger, +:root .excalidraw .help-icon { + box-shadow: none; +} + +/* Selected color outline */ +:root .excalidraw .color-picker__button.active .color-picker__button-outline { + box-shadow: 0 0 0 2px var(--input-focus-outline-color); +} + +:root .excalidraw .buttonList label.active { + border-color: transparent; +} + +/* Options panel */ + +.excalidraw .Island.App-menu__left { + box-shadow: none; + background: transparent; + backdrop-filter: none; + width: 13.2em; +} + +body[dir=ltr] .excalidraw .Island.App-menu__left { + right: 0; +} + +body[dir=rtl] .excalidraw .Island.App-menu__left { + left: 0; +} + +:root .App-menu__left > .panelColumn { + row-gap: 5px; +} + +/* Options panel card */ +:root .App-menu__left > .panelColumn > fieldset, +:root .App-menu__left > .panelColumn > label, +:root .App-menu__left > .panelColumn > div:has(> *) { + position: relative; + margin: 0; + border-radius: 4px; + box-shadow: 1px 1px 1px var(--floating-button-shadow-color); + background: var(--floating-button-background-color); + padding: 8px 12px; + + /* backdrop: blur() creates a new stacking context that prevents some popovers like the + * arrowheads picker from being positioned correctly. To workaround this, the backdrop blur + * effect is applyed using a pseudo-element instead. */ +} + +/* Options panel card title */ +:root .App-menu__left fieldset > legend, +:root .App-menu__left div > h3, +:root .App-menu__left > .panelColumn > label { + text-transform: uppercase; + font-size: .65rem; + letter-spacing: 1pt; + color: var(--muted-text-color); +} + +/* Options panel button bar */ +:root .excalidraw .App-menu__left .buttonList { + padding: 0; +} + +/* Picker */ +body[dir=ltr] .excalidraw .App-menu__left .buttonList .picker { + translate: -80% 0; +} + +/* Properties panel */ + +body[dir=ltr] .excalidraw .exc-stats { + left: 0; +} + +body[dir=rtl] .excalidraw .exc-stats { + right: 0; +} + +/* Sidebar */ + +.split-note-container-widget > .component.type-canvas:has(.excalidraw-container > .Island.default-sidebar) > .floating-buttons { + /* Hide the floating buttons when the sidebar is open */ + display: none; +} + +/* Pickers */ + +.excalidraw .picker { + position: relative; +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index a16afb8aa..0cbf00098 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -354,6 +354,7 @@ align-items: center; width: 100%; margin: 4px; + background: color-mix(in srgb, var(--accent) 15%, var(--main-background-color)); padding-inline-end: 2em; border: 1px solid var(--accent); border-radius: 6px; diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index bbae31685..b6bd38789 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -18,7 +18,7 @@ body { --native-titlebar-darwin-x-offset: 10; - --native-titlebar-darwin-y-offset: 17 !important; + --native-titlebar-darwin-y-offset: 12 !important; } body.layout-horizontal { @@ -100,7 +100,7 @@ body.layout-horizontal > .horizontal { align-items: center; } -#launcher-container { +body[dir=ltr] #launcher-container { scrollbar-gutter: stable both-edges; } @@ -279,14 +279,11 @@ body.layout-horizontal > .horizontal { animation: sync-status-pulse 1s ease-in-out alternate-reverse infinite; } -#launcher-pane .global-menu-button { - --hover-item-background-color: transparent; -} +#launcher-pane button.global-menu-button { + --update-badge-x-offset: 3%; + --update-badge-y-offset: -12%; -#launcher-pane.horizontal .global-menu-button .global-menu-button-update-available { - inset-inline-end: -23px; - bottom: -22px; - transform: scale(0.85); + --hover-item-background-color: transparent; } .tooltip .tooltip-arrow { @@ -642,7 +639,7 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu { #left-pane span.fancytree-node.fancytree-active { position: relative; background: transparent !important; - color: var(--left-pane-item-selected-color) !important; + color: var(--custom-color, var(--left-pane-item-selected-color)); } @keyframes left-pane-item-select { @@ -661,7 +658,7 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu { inset-inline-start: var(--left-pane-item-selected-shadow-size); bottom: var(--left-pane-item-selected-shadow-size); inset-inline-end: var(--left-pane-item-selected-shadow-size); - background: var(--left-pane-item-selected-background) !important; + background: var(--custom-bg-color, var(--left-pane-item-selected-background)) !important; box-shadow: var(--left-pane-item-selected-shadow); border-radius: 6px; animation: left-pane-item-select 200ms ease-out; @@ -721,9 +718,6 @@ body.mobile .fancytree-node > span { margin-top: 0; /* Use this to align the icon with the tree view item's caption */ } -#left-pane span .fancytree-title { - margin-top: -5px; -} #left-pane span.fancytree-active .fancytree-title { font-weight: normal; @@ -1790,10 +1784,6 @@ div.find-replace-widget div.find-widget-found-wrapper > span { --border-radius-lg: 6px; } -.excalidraw .Island { - backdrop-filter: var(--dropdown-backdrop-filter); -} - .excalidraw .Island.App-toolbar { --island-bg-color: var(--floating-button-background-color); --shadow-island: 1px 1px 1px var(--floating-button-shadow-color); diff --git a/apps/client/src/stylesheets/tree.css b/apps/client/src/stylesheets/tree.css index 976b434e2..9a718310e 100644 --- a/apps/client/src/stylesheets/tree.css +++ b/apps/client/src/stylesheets/tree.css @@ -17,8 +17,6 @@ span.fancytree-node.fancytree-hide { overflow: hidden; margin-inline-start: 7px; outline: none; - position: relative; - top: 2px; } .fancytree-expander { @@ -42,6 +40,7 @@ span.fancytree-node.fancytree-hide { text-overflow: ellipsis; user-select: none !important; -webkit-user-select: none !important; + color: var(--custom-color, inherit); } .fancytree-node:not(.fancytree-loading) .fancytree-expander { @@ -181,7 +180,7 @@ span.fancytree-node.fancytree-active-clone:not(.fancytree-active) .fancytree-tit } span.fancytree-active { - color: var(--active-item-text-color) !important; + color: var(--active-item-text-color); background-color: var(--active-item-background-color) !important; border-color: transparent; /* invisible border */ border-radius: 5px; diff --git a/apps/client/src/test/easy-froca.ts b/apps/client/src/test/easy-froca.ts index 045819ab5..e6a9aeaff 100644 --- a/apps/client/src/test/easy-froca.ts +++ b/apps/client/src/test/easy-froca.ts @@ -3,6 +3,8 @@ import FNote from "../entities/fnote.js"; import froca from "../services/froca.js"; import FAttribute from "../entities/fattribute.js"; import noteAttributeCache from "../services/note_attribute_cache.js"; +import FBranch from "../entities/fbranch.js"; +import FBlob from "../entities/fblob.js"; type AttributeDefinitions = { [key in `#${string}`]: string; }; type RelationDefinitions = { [key in `~${string}`]: string; }; @@ -10,6 +12,8 @@ type RelationDefinitions = { [key in `~${string}`]: string; }; interface NoteDefinition extends AttributeDefinitions, RelationDefinitions { id?: string | undefined; title: string; + children?: NoteDefinition[]; + content?: string; } /** @@ -47,6 +51,38 @@ export function buildNote(noteDef: NoteDefinition) { blobId: "" }); froca.notes[note.noteId] = note; + let childNotePosition = 0; + + // Manage content. + const content = noteDef.content ?? ""; + note.getContent = async () => content; + + const blob = new FBlob({ + blobId: utils.randomString(10), + content, + contentLength: content.length, + dateModified: new Date().toISOString(), + utcDateModified: new Date().toISOString() + }); + note.getBlob = async () => blob; + + // Manage children. + if (noteDef.children) { + for (const childDef of noteDef.children) { + const childNote = buildNote(childDef); + const branchId = `${note.noteId}_${childNote.noteId}`; + const branch = new FBranch(froca, { + branchId, + noteId: childNote.noteId, + parentNoteId: note.noteId, + notePosition: childNotePosition, + fromSearchNote: false + }); + froca.branches[branchId] = branch; + note.addChild(childNote.noteId, branchId, false); + childNotePosition += 10; + } + } let position = 0; for (const [ key, value ] of Object.entries(noteDef)) { diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json index 6cd47c556..8e9140ca7 100644 --- a/apps/client/src/translations/ar/translation.json +++ b/apps/client/src/translations/ar/translation.json @@ -19,12 +19,14 @@ "note": "ملاحظة", "search_note": "البحث عن الملاحظة بالاسم", "link_title": "عنوان الرابط", - "button_add_link": "اضافة رابط" + "button_add_link": "اضافة رابط", + "help_on_links": "مساعدة حول الارتباطات التشعبية" }, "branch_prefix": { "edit_branch_prefix": "تعديل بادئة الفرع", "prefix": "البادئة: ", - "save": "حفظ" + "save": "حفظ", + "help_on_tree_prefix": "مساعدة حول بادئة الشجرة" }, "bulk_actions": { "bulk_actions": "اجراءات جماعية", @@ -43,7 +45,8 @@ "options": "خيارات", "upload": "تحميل", "choose_files": "اختر الملفات", - "shrink_images": "تصغير الصور" + "shrink_images": "تصغير الصور", + "upload_attachments_to_note": "تحميل المرفقات الى الملاحظة" }, "attribute_detail": { "name": "الاسم", @@ -69,16 +72,31 @@ "inverse_relation": "العلاقة العكسية", "more_notes": "مزيد من الملاحظات", "label": "تفاصيل التسمية", - "relation": "تفاصيل العلاقة" + "relation": "تفاصيل العلاقة", + "date_time": "التاريخ والوقت", + "label_definition": "تفاصيل تعريف التصنيف", + "relation_definition": "تفاصيل تعريف العلاقة", + "attr_detail_title": "عنوان تفاصيل السمة", + "close_button_title": "الغاء التغييرات و اغلاق", + "attr_is_owned_by": "السمة مملوكة ل", + "save_and_close": "حفظ ونسخ Ctrl+Enter", + "workspace_calendar_root": "‎تحديد جذر التقويم لكل مساحة عمل", + "hide_highlight_widget": "اخفاء عنصر واجهة قائمة التمييزات", + "is_owned_by_note": "تخص الملاحظة", + "and_more": "... و {{count}}مرات اكثر." }, "rename_label": { "to": "الى", "old_name_placeholder": "الاسم القديم", - "new_name_placeholder": "الاسم الجديد" + "new_name_placeholder": "الاسم الجديد", + "rename_label": "اعادة تسمية التسمية", + "rename_label_from": "اعادة تسمية التسمية من" }, "move_note": { "to": "الى", - "move_note": "نقل الملاحظة" + "move_note": "نقل الملاحظة", + "target_parent_note": "ملاحظة الاصل الهدف", + "on_all_matched_notes": "على كل الملاحظات المطابقة" }, "add_relation": { "to": "الى", @@ -90,20 +108,26 @@ "to": "الى", "rename_relation": "اعادة تسمية العلاقة", "old_name": "الاسم القديم", - "new_name": "الاسم الجديد" + "new_name": "الاسم الجديد", + "rename_relation_from": "اعادة تسمية العلاقة من" }, "update_relation_target": { "to": "الى", "update_relation": "تحديث العلاقة", "relation_name": "اسم العلاقة", - "target_note": "الملاحظة الهدف" + "target_note": "الملاحظة الهدف", + "update_relation_target": "تحدث علاقة الهدف", + "on_all_matched_notes": "على كل الملاحظات المطابقة" }, "attachments_actions": { "download": "تنزيل", "open_externally": "فتح خارجي", "open_custom": "فتح مخصص", "rename_attachment": "اعادة تسمية المرفق", - "delete_attachment": "حذف المرفق" + "delete_attachment": "حذف المرفق", + "upload_new_revision": "رفع مراجعة جديدة", + "copy_link_to_clipboard": "نسخ الرابط الى الحافظة", + "convert_attachment_into_note": "تحويل المرفق الى ملاحظة" }, "calendar": { "week": "أسبوع", @@ -135,7 +159,9 @@ "month_previous": "الشهر السابق", "month_next": "الشهر التالي", "year_previous": "السنة السابقة", - "year_next": "السنة التالية" + "year_next": "السنة التالية", + "cannot_find_day_note": "لا يمكن ايجاد ملاحظة اليوم", + "cannot_find_week_note": "لايمكن ايجاد ملاحظة الاسبوع" }, "global_menu": { "menu": "القائمة", @@ -150,20 +176,39 @@ "reload_frontend": "اعادة تحميل الواجهة", "show_help": "عرض المساعدة", "show-cheatsheet": "عرض دليل الاختصارات", - "toggle-zen-mode": "وضع التركيز" + "toggle-zen-mode": "وضع التركيز", + "open_new_window": "فتح نافذة جديدة", + "reset_zoom_level": "اعادة ضبط مستوى التكبير", + "open_sql_console": "فتح لوحة تحكم SQL", + "open_search_history": "فتح سجل البحث", + "show_hidden_subtree": "اظهار الشجرة الفرعية المخفية", + "about": "حول تريليوم للملاحظات", + "open_dev_tools": "فتح ادوات المطور", + "show_backend_log": "اظهار سجل الخلفية", + "new-version-available": "متوفر تحديث جديد", + "download-update": "احصل على الاصدار{{latestVersion}}", + "switch_to_mobile_version": "التبديل الى اصدار الهاتف المحمول", + "switch_to_desktop_version": "التبديل الى اصدار سطح المكتب", + "show_shared_notes_subtree": "عرض شجرة الملاحظات المشتركة", + "open_sql_console_history": "فتح سجل لوحة تحكم SQL" }, "zpetne_odkazy": { - "relation": "العلاقة" + "relation": "العلاقة", + "backlink": "{{count}} رابط راجع", + "backlinks": "{{count}} روابط راجعة" }, "note_icon": { "category": "الفئة:", - "search": "بحث:" + "search": "بحث:", + "change_note_icon": "تغيير ايقونة الملاحظة", + "reset-default": "اعادة تعيين الى الايقونة الافتراضية" }, "basic_properties": { "language": "اللغة", "editable": "قابل للتعديل", "note_type": "نوع الملاحظة", - "basic_properties": "الخصائص الاساسية" + "basic_properties": "الخصائص الاساسية", + "configure_code_notes": "اعداد ملاحظات الكود..." }, "book_properties": { "list": "قائمة", @@ -175,7 +220,12 @@ "collapse": "طي", "view_type": "نوع العرض", "book_properties": "خصائص المجموعة", - "geo-map": "الخريطة الجغرافية" + "geo-map": "الخريطة الجغرافية", + "collapse_all_notes": "طي كل الملاحظات", + "include_archived_notes": "عرض الملاحظات المؤرشفة", + "expand_all_children": "توسيع جميع العناصر الفرعية", + "presentation": "عرض تقديمي", + "invalid_view_type": "نوع العرض {{type}} غير صالح" }, "file_properties": { "download": "تنزيل", @@ -183,14 +233,19 @@ "title": "ملف", "note_id": "معرف الملاحظة", "file_type": "نوع الملف", - "file_size": "حجم الملف" + "file_size": "حجم الملف", + "original_file_name": "اسم الملف الاصلي", + "upload_new_revision": "رفع مراجعة جديدة" }, "image_properties": { "download": "تنزيل", "open": "فتح", "title": "صورة", "file_type": "نوع الملف", - "file_size": "حجم الملف" + "file_size": "حجم الملف", + "original_file_name": "اسم الملف الاصلي", + "upload_new_revision": "رفع مراجعة جديدة", + "copy_reference_to_clipboard": "نسخ المرجع الى الحافظة" }, "note_info_widget": { "created": "انشاء", @@ -223,13 +278,22 @@ "fast_search": "بحث سريع", "include_archived": "تضمين العناصر المؤرشفة", "order_by": "ترتيب حسب", - "search_parameters": "معايير البحث" + "search_parameters": "معايير البحث", + "add_search_option": "اضافة خيار البحث:", + "save_to_note": "حفظ في تلملاحظة", + "limit_description": "تحديد عدد النتائج", + "search_execute": "البحث وتنفيذ الأجراءات", + "unknown_search_option": "خيار بحث غير معروف {{searchOptionName}}", + "actions_executed": "اجراءات تم تنفيذها." }, "ancestor": { "label": "السلف", "depth_label": "العمق", "depth_doesnt_matter": "لايهم", - "direct_children": "العقد الفرعية المباشرة" + "direct_children": "العقد الفرعية المباشرة", + "depth_eq": "يساوي تماما {{count}}", + "depth_gt": "هو اكبر من {{count}}", + "depth_lt": "هو اصغر من {{count}}" }, "limit": { "limit": "الحد الاقصى" @@ -244,16 +308,31 @@ "relevancy": "الاهمية (افتراضيا)", "date_created": "تاريخ الانشاء", "random": "ترتيب عشوائي", - "asc": "تصاعدي (افتراضيا)" + "asc": "تصاعدي (افتراضيا)", + "content_size": "حجم محتوى الملاحظة", + "revision_count": "عدد المراجعات", + "parent_count": "عدد النسخ", + "owned_label_count": "عدد التسميات", + "owned_relation_count": "عدد العلاقات", + "date_modified": "تاريخ اخر تعديل", + "children_count": "عدد الملاحظات الفرعية" }, "search_string": { "search_prefix": "بحث:", "title_column": "سلسلة البحث:", "search_syntax": "صياغة البحث", - "also_see": "انظر ايضا" + "also_see": "انظر ايضا", + "error": "خطأ في البحث: {{error}}" }, "sync": { - "title": "مزامنة" + "title": "مزامنة", + "force_full_sync_button": "فرض مزامنة كاملة", + "finished-successfully": "تم انتهاء المزامنة بنجاح.", + "full_sync_triggered": "تم تشغيل المزامنة الكاملة", + "failed": "فشل في المزامنة: {{message}}", + "fill_entity_changes_button": "ملء سجلات تغييرات الكيانات", + "filling_entity_changes": "جار ملء صفوف تغييرات الكيانات", + "sync_rows_filled_successfully": "تمة تعبئة بيانات المزامنة بنجاح" }, "fonts": { "fonts": "خطوط", @@ -266,23 +345,34 @@ "reload_frontend": "اعادة تحميل الواجهة", "generic-fonts": "الخطوط العامة", "sans-serif": "خطوط بدون زوائد", - "system-default": "الاعداد الافتراضي للنظام" + "system-default": "الاعداد الافتراضي للنظام", + "note_detail_font": "خط تفاصيل الملاحظة", + "note_tree_font": "خط شجرة الملاحظات", + "monospace_font": "خط احادي المسافة (للكود)", + "serif-system-fonts": "خطوط النظام المزخرفة", + "sans-serif-system-fonts": "خطوط النظام بدون زخرفة", + "monospace-system-fonts": "خطوط النظام احادية المسافة", + "handwriting-system-fonts": "خطوط النظام باسلوب الكتابة اليدوية" }, "confirm": { "confirmation": "تأكيد", "cancel": "الغاء", - "ok": "نعم" + "ok": "نعم", + "also_delete_note": "كذلك احذف الملاحظة" }, "delete_notes": { "close": "غلق", "cancel": "الغاء", - "ok": "نعم" + "ok": "نعم", + "delete_notes_preview": "حذف معاينة الملاحظات" }, "export": { "close": "غلق", "export": "تصدير", "export_note_title": "تصدير الملاحظة", - "export_status": "حالة التصدير" + "export_status": "حالة التصدير", + "export_finished_successfully": "اكتمل التصدير بنجاح.", + "export_in_progress": "جار التصدير: {{progressCount}}" }, "help": { "troubleshooting": "أستكشاف الاخطاء واصلاحها", @@ -297,19 +387,45 @@ "selectNote": "تحديد الملاحظة", "editingNotes": "تحرير الملاحظات", "inPageSearch": "البحث داخل الصفحة", - "markdownAutoformat": "التنسيق التلقائي باسلوب Markdown" + "markdownAutoformat": "التنسيق التلقائي باسلوب Markdown", + "openEmptyTab": "فتح علامة تبويب فارغة", + "closeActiveTab": "اغلاق علامة تبويب نشطة", + "activateNextTab": "تنشيط التبويب التالي", + "activatePreviousTab": "تنشيط التبويب السابق", + "multiSelectNote": "تحديد متعدد للملاحظة اعلاه/اسفل", + "createInternalLink": "انشاء رابط داخلي", + "reloadFrontend": "اعادة تحميل الواجهة اللمامية لتريليوم", + "showDevTools": "عرض ادوات المطور", + "showSQLConsole": "عرض وحده تحكم SQL", + "scrollToActiveNote": "مدتمرير الى الملاحظة النشطة", + "jumpToParentNote": "الانتقال الى الملاحظة الاصل", + "movingCloningNotes": "نقل/ استنساخ الملاحظات", + "deleteNotes": "حذف الملاحظة/ الشجرة الفرعية", + "collapseWholeTree": "طي شجرة الملاحظة باكملها", + "followLink": "اتبع تلرابط تحت المؤشر" }, "import": { "options": "خيارات", "import": "استيراد", "safeImport": "أستيراد آمن", "shrinkImages": "تقليل حجم الصور", - "import-status": "حالة الاستبراد" + "import-status": "حالة الاستبراد", + "importIntoNote": "استيراد الى الملاحظة", + "chooseImportFile": "اختر ملف الاستيراد", + "failed": "فشل الاستيراد: {{messege}}.", + "html_import_tags": { + "title": "علامات استيراد HTML", + "reset_button": "اعادة التعيين الى القائمة الافتراضية" + }, + "successful": "اكتمل الاستيراد بنجاح.", + "in-progress": "جار الاستيراد: {{progress}}" }, "include_note": { "label_note": "ملاحظة", "dialog_title": "تضمين ملاحظة", - "button_include": "تضمين ملاحظة" + "button_include": "تضمين ملاحظة", + "box_size_small": "صغير (10 سطور تقريبا)", + "box_size_medium": "متوسط ( 30 سطر تقريبا)" }, "info": { "closeButton": "أغلاق", @@ -322,7 +438,8 @@ }, "note_type_chooser": { "templates": "قوالب", - "builtin_templates": "القوالب المدمجة" + "builtin_templates": "القوالب المدمجة", + "modal_title": "اختر نوع الملاحظة" }, "prompt": { "title": "ترقية", @@ -331,7 +448,9 @@ }, "protected_session_password": { "close_label": "أغلاق", - "modal_title": "جلسة محمية" + "modal_title": "جلسة محمية", + "start_button": "بدء جلسة محمية", + "help_title": "مساعدة حول الملاحظات المحمية" }, "revisions": { "delete_button": "حذف", @@ -341,7 +460,12 @@ "note_revisions": "مراجعات الملاحظة", "diff_on": "عرض الفروقات", "diff_off": "عرض المحتوى", - "file_size": "حجم الملف:" + "file_size": "حجم الملف:", + "mime": "MIME: ", + "delete_all_button": "حذف كل المراجعات", + "settings": "اعدادات مراجعة الملاحظة", + "diff_not_available": "المقارنة غير متوفرة.", + "help_title": "مساعدة حول مراجعات الملاحظة" }, "sort_child_notes": { "title": "عنوان", @@ -353,11 +477,15 @@ "date_created": "تاريخ الانشاء", "date_modified": "تاريخ التعديل", "sorting_direction": "اتجاه الترتيب", - "natural_sort": "الترتيب الطبيعي" + "natural_sort": "الترتيب الطبيعي", + "natural_sort_language": "لغات الترتيب الطبيعي", + "sort_children_by": "ترتيب العناصر الفرعية حسب..." }, "recent_changes": { "undelete_link": "الغاء الحذف", - "title": "التغيرات الاخيرة" + "title": "التغيرات الاخيرة", + "no_changes_message": "لايوجد تغيير لحد الان...", + "erase_notes_button": "مسح الملاحظات المحذوفة الان" }, "edited_notes": { "deleted": "(حذف)", @@ -372,7 +500,9 @@ "max_content_width": { "max_width_unit": "بكسل", "title": "عرض المحتوى", - "reload_button": "اعادة تحميل الواجهة" + "reload_button": "اعادة تحميل الواجهة", + "max_width_label": "اقصى عرض للمحتوى", + "reload_description": "تغييرات من خيارات المظهر" }, "native_title_bar": { "enabled": "مفعل", @@ -387,11 +517,14 @@ "light_theme": "النسق القديم (فاتح)", "dark_theme": "النسق القديم (داكن)", "triliumnext-light": "تريليوم (فاتح)", - "triliumnext-dark": "تريليوم ( داكن)" + "triliumnext-dark": "تريليوم ( داكن)", + "override_theme_fonts_label": "تجاوز خطوط النسق" }, "ui-performance": { "title": "أداء", - "enable-shadows": "تفعيل الضلال" + "enable-shadows": "تفعيل الضلال", + "enable-smooth-scroll": "تمكين التمرير السلس", + "enable-motion": "تمكين الانتقالات والرسوم المتحركة" }, "ai_llm": { "progress": "تقدم", @@ -439,80 +572,190 @@ "anthropic_configuration": "تهيئة انتروبيك", "voyage_url_description": "افتراضيا: https://api.voyageai.com/v1", "ollama_configuration": "تهيئة Ollama", - "enable_ollama": "تمكين Ollama" + "enable_ollama": "تمكين Ollama", + "last_attempt": "اخر محاولة", + "active_providers": "المزودون النشطون", + "disabled_providers": "المزودون المعطلون", + "similarity_threshold": "عتبة التشابه", + "complete": "اكتمل (100%)", + "ai_settings": "اعدادات AI", + "show_thinking": "عرض التفكير", + "index_status": "حالة الفهرس", + "indexed_notes": "الملاحظات المفهرسة", + "indexing_stopped": "تم ايقاف الفهرسة", + "last_indexed": "اخر فهرسة", + "note_chat": "دردشة الملاحظة", + "start_indexing": "بدء الفهرسة", + "chat": { + "root_note_title": "دردشات AI", + "new_chat_title": "دردشة جديدة", + "create_new_ai_chat": "انشاء دردشة AI جديدة" + }, + "selected_provider": "المزود المحدد", + "select_model": "اختر النموذج...", + "select_provider": "اختر المزود...", + "ollama_model": "نموذج Ollama", + "refresh_models": "تحديث النماذج", + "rebuild_index": "اعادة بناء الفهرس", + "note_title": "عنوان الملاحظة", + "processing": "جاري المعالجة ({{percentage}}%)", + "incomplete": "غير مكتمل ({{percentage}}%)", + "ollama_url": "عنوان URL الخاص ب Ollama", + "provider_configuration": "تكوين موفر AI", + "voyage_settings": "استكشاف اعدادات AI", + "enable_automatic_indexing": "تمكين الفهرسة التلقائية", + "index_rebuild_progress": "تقدم اعادة انشاء الفهرس", + "index_rebuild_complete": "اكتملت عملية تحسين الفهرس", + "use_enhanced_context": "استخدام السياق المحسن", + "enter_message": "ادخل رسالتك...", + "index_all_notes": "فهرسة جميع الملاحظات", + "indexing_in_progress": "جار فهرسة الملاحظات...", + "use_advanced_context": "استخدم السياق المتقدم", + "ai_enabled": "تمكين مميزات AI", + "ai_disabled": "الغاء تمكين مميزات AI", + "enable_ai_features": "تمكين خصائص AI/LLM", + "enable_ai": "تمكين خصائص AI/LLM", + "reprocess_index": "اعادة بناء فهرس البحث", + "index_rebuilding": "جار تحسين الفهرس {{percentage}}", + "voyage_configuration": "اعدادت Voyage AI", + "openai_model_description": "الامثلة: gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "partial": "{{ percentage }} % مكتمل", + "retry_queued": "تم جدولة الملاحظة لاعادة المحاولة", + "max_notes_per_llm_query": "اكبر عدد للملاحظات لكل استعلام", + "remove_provider": "احذف المزود من البحث", + "restore_provider": "استعادة المزود الى البحث", + "reprocess_index_error": "حدث خطأ اثناء اعادة بناء فهرس البحث", + "auto_refresh_notice": "تحديث تلقائي كل {{seconds}} ثانية", + "note_queued_for_retry": "الملاحظة جاهزة لاعادة المحاولة لاحقا", + "failed_to_retry_note": "‎فشل في اعادة محاولة معالجة المحاولة", + "failed_to_retry_all": "فشل في اعادة محاولة معالجة الملاحظة", + "error_generating_response": "‌فشل في توليد استجابة من ال AI", + "create_new_ai_chat": "انشاء دردشة AI جديدة", + "error_fetching": "فشل في استرجاع النماذج: {{error}}" }, "code_auto_read_only_size": { - "unit": "حروف" + "unit": "حروف", + "title": "الحجم التلقائي للقراءه فقط" }, "code-editor-options": { "title": "محرر" }, "images": { "images_section_title": "صور", - "max_image_dimensions_unit": "بكسل" + "max_image_dimensions_unit": "بكسل", + "enable_image_compression": "تمكين ضغط الصورة" }, "revisions_snapshot_limit": { - "snapshot_number_limit_unit": "لقطات" + "snapshot_number_limit_unit": "لقطات", + "note_revisions_snapshot_limit_title": "الحد الاقصى لنسخ الملاحظات الاحتياطية" }, "search_engine": { "bing": "Bing", "duckduckgo": "DuckDuckGo", "google": "جوجل", "save_button": "حفظ", - "baidu": "Baidu" + "baidu": "Baidu", + "title": "محرك البحث" }, "heading_style": { "plain": "بسيط", "underline": "تسطير", - "markdown": "نمط-Markdown" + "markdown": "نمط-Markdown", + "title": "نمط العنوان" }, "text_auto_read_only_size": { - "unit": "حروف" + "unit": "حروف", + "title": "الحجم التلقائي للقراءة فقط" }, "i18n": { "language": "لغة", "sunday": "الاحد", "monday": "الاثنين", - "title": "تعريب" + "title": "تعريب", + "tuesday": "الثلاثاء", + "wednesday": "الاربعاء", + "thursday": "الخميس", + "friday": "الجمعة", + "saturday": "السبت" }, "backup": { - "path": "مسار" + "path": "مسار", + "automatic_backup": "النسخ الاحتياطي التلقائي", + "backup_now": "نسخ احتياطي الان", + "existing_backups": "النسخ الاحتياطية الموجودة", + "enable_weekly_backup": "تمكين النسخ الاختياطي الاسبوعي", + "enable_monthly_backup": "تمكين النسخ الاحتياطي الشهري", + "date-and-time": "التاريخ والوقت", + "no_backup_yet": "لايوجد نسخة احتياطية لحد الان", + "enable_daily_backup": "تمكين النسخ الاحتياطي اليومي", + "backup_database_now": "نسخ اختياطي لقاعدة البيانات الان" }, "etapi": { "wiki": "ويكي", "created": "تم الأنشاء", "actions": "أجراءات", - "title": "ETAPI" + "title": "ETAPI", + "existing_tokens": "الرموز الموجودة", + "token_name": "اسم الرمز", + "default_token_name": "رمز جديد", + "rename_token_title": "اعادة تسمية الرمز", + "rename_token": "اعادة تسمية هذا الرمز" }, "password": { "heading": "كلمة المرور", - "wiki": "ويكي" + "wiki": "ويكي", + "old_password": "كلمة المرور القديمة", + "new_password": "كلمة مرور جديدة", + "change_password": "تغيير كلمة المرور", + "change_password_heading": "تغيير كلمة المرور", + "set_password_heading": "تعيين كلمة المرور", + "set_password": "تعيين كلمة المرور", + "for_more_info": "لمزيد من المعلومات.", + "protected_session_timeout_label": "انتهت مدة الجلسة المحمية:", + "protected_session_timeout": "انتهاء مهلة الجلسة المحمية", + "new_password_confirmation": "تاكيد كلمة المرور الجديدة" }, "shortcuts": { "shortcuts": "أختصارات", - "description": "الوصف" + "description": "الوصف", + "keyboard_shortcuts": "اختصارات لوحة المفاتيح", + "action_name": "اسم الاجراء", + "default_shortcuts": "اختصارات افتراضية" }, "sync_2": { "timeout_unit": "ميلي ثانية", "note": "ملاحظة", "save": "حفظ", - "help": "المساعدة" + "help": "المساعدة", + "config_title": "تهيئة المزامنة", + "timeout": "انتهاء مهلة المزامنة", + "test_title": "اختبار المزامنة", + "test_button": "اختبار المزامنة", + "server_address": "عنوان نسخة الخادم" }, "api_log": { "close": "أغلاق" }, "bookmark_switch": { - "bookmark": "علامة مرجعية" + "bookmark": "علامة مرجعية", + "remove_bookmark": "ازالة الاشارة المرجعية" }, "editability_select": { "auto": "تلقائي", - "read_only": "قراءة-فقط" + "read_only": "قراءة-فقط", + "always_editable": "قابل للتعديل دائما" }, "tab_row": { - "close": "اغلاق" + "close": "اغلاق", + "close_tab": "اغلاق التبويب", + "new_tab": "تبويب جديد", + "close_all_tabs": "اغلاق كل علامات التبويب", + "add_new_tab": "اضافة علامة تبويب جديدة", + "close_other_tabs": "اغلاق علامات التبويب الاخرى" }, "toc": { - "options": "خيارات" + "options": "خيارات", + "table_of_contents": "جدول المحتويات" }, "tasks": { "due": { @@ -522,28 +765,48 @@ } }, "code_theme": { - "title": "المظهر" + "title": "المظهر", + "word_wrapping": "التفاف النص", + "color-scheme": "نظام الالوان" }, "table_view": { "sort-column-ascending": "تصاعدي", "sort-column-descending": "تنازلي", "new-column-relation": "العلاقة", - "new-column-label": "تسمية" + "new-column-label": "تسمية", + "new-row": "صف جديد", + "new-column": "عمود جديد", + "sort-column-clear": "ازالة الترتيب", + "show-hide-columns": "اظهار/اخفاء الاعمدة", + "edit-column": "تحرير العمود", + "delete-column": "حذف العمود", + "row-insert-above": "ادراج صف للاعلى", + "row-insert-below": "ادراج صف للاسفل", + "row-insert-child": "ادراج ملاحظة فرعية", + "sort-column-by": "ترتيب بواسط \" {{title}}\"", + "hide-column": "اخفاء العمود \"{{title}}\"" }, "modal": { "close": "اغلاق" }, "call_to_action": { - "dismiss": "تجاهل" + "dismiss": "تجاهل", + "background_effects_button": "تفعيل مؤثرات الخلفية" }, "units": { "percentage": "%" }, "clone_to": { - "prefix_optional": "بادئة (اختياري)" + "prefix_optional": "بادئة (اختياري)", + "clone_notes_to": "استنسخ الملاحظات الى...", + "help_on_links": "مساعدة حول الارتباطات التشعبية", + "notes_to_clone": "ملاحظات للنسخ", + "target_parent_note": "الملاحظة الاصلية الهدف", + "clone_to_selected_note": "استنساخ الى الملاحظة المحددة" }, "table_of_contents": { - "unit": "عناوين" + "unit": "عناوين", + "title": "جدول المحتويات" }, "tree-context-menu": { "archive": "أرشفة", @@ -552,7 +815,27 @@ "advanced": "متقدمة", "cut": "قص", "duplicate": "استنساخ", - "export": "تصدير" + "export": "تصدير", + "expand-subtree": "توسيع الشجرة الفرعية", + "collapse-subtree": "طي الشجرة الفرعية", + "sort-by": "ترتيب بواسطة...", + "protect-subtree": "الشجرة الفرعية المحمية", + "unprotect-subtree": "الشجرة الفرعية الغير محمية", + "clone-to": "‍استنساخ الى...", + "move-to": "نقل الى...", + "paste-into": "لصق في", + "paste-after": "لصق بعد", + "open-in-popup": "تحرير سريع", + "hoist-note": "ابراز الملاحظة", + "unhoist-note": "الغاء ابراز الملاحظة", + "copy-clone": "نسخ / استنساخ", + "import-into-note": "استيراد الى الملاحظة", + "insert-note-after": "ادراج ملاحظة بعد", + "insert-child-note": "ادراج ملاحظة فرعية", + "search-in-subtree": "‍البحث في الشجرة الفرعية", + "edit-branch-prefix": "تعديل بادئة الفرع", + "convert-to-attachment": "التحويل الى مرفق", + "apply-bulk-actions": "‌تطبيق الاجراءات الجماعية" }, "note_types": { "text": "نص", @@ -566,31 +849,59 @@ "widget": "عنصر واجهة", "new-feature": "جديد", "collections": "مجاميع", - "beta-feature": "اصدار تجريبي" + "beta-feature": "اصدار تجريبي", + "saved-search": "بحث محفوظ", + "relation-map": "خريطة العلاقة", + "note-map": "خريطة الملاحظة", + "render-note": "عرض الملاحظة", + "mermaid-diagram": "مخطط Mermaid", + "web-view": "عرض الويب", + "mind-map": "خريطة ذهنية", + "geo-map": "خريطة جغرافية", + "ai-chat": "دردشة AI", + "task-list": "قائمة المهام" }, "shared_switch": { - "shared": "مشترك" + "shared": "مشترك", + "toggle-on-title": "مشاركة الملاحظة", + "toggle-off-title": "الغاء مشاركة الملاحظة" }, "template_switch": { "template": "قالب" }, "find": { - "replace": "استبدال" + "replace": "استبدال", + "case_sensitive": "حساسة لحالة الأحرف", + "match_words": "مطابقة الكلمات", + "replace_placeholder": "استبدال ب...", + "replace_all": "استبدال الكل", + "find_placeholder": "البحث في النص..." }, "highlights_list_2": { - "options": "خيارات" + "options": "خيارات", + "title": "قائمة التضليلات" }, "quick-search": { - "searching": "جار البحث..." + "searching": "جار البحث...", + "placeholder": "البحث السريع", + "no-results": "لم يتم العثور على نتائج" }, "note_tree": { - "unhoist": "ارجاع الى الترتيب الطبيعي" + "unhoist": "ارجاع الى الترتيب الطبيعي", + "tree-settings-title": "اعدادات الشجرة", + "toggle-sidebar": "اظهار/اخفاء الشريط الجانبي", + "collapse-title": "طي شجرة الملاحظة", + "hide-archived-notes": "اخفاء الملاحظات المؤرشفة", + "automatically-collapse-notes": "طي الملاحظات تلقائيا", + "create-child-note": "انشاء ملاحظة فرعية" }, "sql_table_schemas": { "tables": "جداول" }, "launcher_context_menu": { - "reset": "اعادة ضبط" + "reset": "اعادة ضبط", + "add-spacer": "اضافة فاصل", + "delete": "حذف\n" }, "editable-text": { "auto-detect-language": "تم اكتشافه تلقائيا" @@ -608,18 +919,26 @@ }, "fixed": { "title": "مثبت" - } + }, + "label": "شريط ادوات التنسيق" } }, "electron_context_menu": { "cut": "قص", "copy": "نسخ", - "paste": "لصق" + "paste": "لصق", + "copy-link": "نسخ الرابط" }, "promoted_attributes": { "url_placeholder": "http://website...", "promoted_attributes": "السمات المعززة", - "unset-field-placeholder": "غير محدد" + "unset-field-placeholder": "غير محدد", + "open_external_link": "فتح رابط خارجي", + "add_new_attribute": "اضافة سمة جديدة", + "remove_this_attribute": "حذف هذه السمة", + "unknown_label_type": "نوع التسمية {{type}} غير معروف", + "unknown_attribute_type": "نوع السمة {{type}} غير معروف", + "remove_color": "حذف لون التسمية" }, "duration": { "seconds": "ثواني", @@ -628,13 +947,37 @@ "days": "أيام" }, "editorfeatures": { - "title": "مميزات" + "title": "مميزات", + "note_completion_enabled": "تمكين الاكمال التلقائي للملاحظة", + "emoji_completion_enabled": "تفعيل الاكمال التلقائي للرموز التعبيرية", + "slash_commands_enabled": "تفعيل اوامر Slash" }, "book_properties_config": { - "raster": "نقطي" + "raster": "نقطي", + "hide-weekends": "اخفاء عطلات نهايات الاسبوع", + "map-style": "نمط الخريطة:", + "vector_light": "متجه (فاتح)", + "vector_dark": "متجه (داكن)", + "show-scale": "اظهار المقياس", + "display-week-numbers": "اظهار ارقام الاسابيع", + "max-nesting-depth": "العمق الاقصى للتداخل:" }, "multi_factor_authentication": { - "oauth_title": "OAuth/OpenID" + "oauth_title": "OAuth/OpenID", + "title": "المصادقة متعددة العوامل", + "mfa_method": "طريقة المصادقة متعددة العوامل", + "oauth_user_account": "حساب المستخدم: ", + "oauth_user_email": "البريد الإلكتروني للمستخدم: ", + "recovery_keys_used": "مستخدم: {{date}}", + "mfa_enabled": "تمكين المصادقة متعددة العوامل", + "recovery_keys_generate": "انشاء رموز الاسترداد", + "recovery_keys_regenerate": "اعادة انشاء رموز الاسترداد", + "oauth_user_not_logged_in": "لم يتم تسجيل الدخول!", + "totp_secret_generate": "توليد TOTP السري", + "totp_secret_regenerate": "اعادة توليد TOTP السري", + "totp_secret_generated": "تم انشاء TOTP السري", + "oauth_missing_vars": "اعدادات مفقودة: {{-variables}}", + "totp_secret_title": "توليد TOTP سري" }, "execute_script": { "execute_script": "تنفيذ السكريبت" @@ -642,20 +985,28 @@ "add_label": { "add_label": "اضافة تسمية", "to_value": "الى القيمة", - "new_value_placeholder": "قيمة جديدة" + "new_value_placeholder": "قيمة جديدة", + "label_name_placeholder": "اسم التسمية", + "help_text": "عل كل الملاحظات المطابقة:" }, "delete_label": { - "delete_label": "حذف التسمية" + "delete_label": "حذف التسمية", + "label_name_placeholder": "اسم التسمية" }, "update_label_value": { "to_value": "الى القيمة", - "new_value_placeholder": "قيمة جديدة" + "new_value_placeholder": "قيمة جديدة", + "label_name_placeholder": "اسم التسمية", + "update_label_value": "تحديث قيمة التصنيف" }, "delete_note": { - "delete_note": "حذف الملاحظة" + "delete_note": "حذف الملاحظة", + "delete_matched_notes": "حف الملاحظات المطابقة" }, "rename_note": { - "rename_note": "اعادة تسمية الملاحظة" + "rename_note": "اعادة تسمية الملاحظة", + "new_note_title": "عنوان ملاحظة جديد", + "rename_note_title_to": "اعادة تسمية عنوان الملاحظة الى" }, "delete_relation": { "delete_relation": "حذف العلاقة", @@ -676,13 +1027,23 @@ "import_files": "استيراد الملفات", "export_note": "تصدير الملاحظة", "delete_note": "حذف الملاحظة", - "print_note": "طباعة الملاحظة" + "print_note": "طباعة الملاحظة", + "save_revision": "حفظ المراجعة", + "convert_into_attachment": "تحويل الى مرفق", + "search_in_note": "بحث في الملاحظة", + "open_note_externally": "فتح الملاحظة خارجيا", + "open_note_custom": "فتح ملاحظة مخصص", + "print_pdf": "تصدير كملف PDF...", + "convert_into_attachment_failed": "فشل تحويل الملاحظة {{title}}." }, "update_available": { "update_available": "تحديث متوفر" }, "code_buttons": { - "execute_button_title": "تنفيذ السكريبت" + "execute_button_title": "تنفيذ السكريبت", + "save_to_note_button_title": "حفظ في الملاحظا", + "opening_api_docs_message": "جاري فتح مستدات API...", + "trilium_api_docs_button_title": "فتح مستندات API لتريليوم" }, "hide_floating_buttons_button": { "button_title": "اخفاء الازرار" @@ -695,27 +1056,33 @@ "zoom_out_title": "تصغير" }, "inherited_attribute_list": { - "title": "السمات الموروثة" + "title": "السمات الموروثة", + "no_inherited_attributes": "لاتوجد سمات موروثة." }, "note_map": { "title": "خريطة الملاحظة", "fix-nodes": "اصلاح العقد", - "link-distance": "مسافة الرابط" + "link-distance": "مسافة الرابط", + "open_full": "توسيع للعرض الكامل", + "collapse": "طي الى الحجم الطبيعي" }, "owned_attribute_list": { "owned_attributes": "السمات المملوكة" }, "similar_notes": { - "title": "ملاحظات مشابهة" + "title": "ملاحظات مشابهة", + "no_similar_notes_found": "لاتوجد ملاحظة مشابهة." }, "fast_search": { "fast_search": "بحث سريع" }, "search_script": { - "title": "نص البحث:" + "title": "نص البحث:", + "example_title": "انظر هذا المثال:" }, "attachment_detail": { - "owning_note": "الملاحظة المالكة: " + "owning_note": "الملاحظة المالكة: ", + "list_of_all_attachments": "قائمة بكل المرفقات" }, "attachment_list": { "owning_note": "الملاحظة المالكة: ", @@ -724,14 +1091,23 @@ "protected_session": { "wrong_password": "كلمة المرور خاطئة", "protecting-title": "الحالة المحمية", - "unprotecting-title": "الحالة الغير محمية" + "unprotecting-title": "الحالة الغير محمية", + "protecting-finished-successfully": "تم الحماية بنجاح.", + "unprotecting-finished-successfully": "تم ازالة الحماية بنجاح.", + "start_session_button": "البدء بالجلسة المحمية enter", + "protecting-in-progress": "جار الحماية: {{count}}", + "unprotecting-in-progress-count": "‏جار الغاء الحماية: {{count}}" }, "relation_map": { "remove_note": "حذف الملاحظة", "edit_title": "تعديل العنوان", "rename_note": "اعادة تسمية الملاحظة", "remove_relation": "حذف العلاقة", - "default_new_note_title": "ملاحظة جديدة" + "default_new_note_title": "ملاحظة جديدة", + "open_in_new_tab": "فتح في تبويب جديد", + "enter_new_title": "ادخل عنوان ملاحظة جديدة:", + "note_not_found": "الملاحظة {{noteId}} غير موجودة!", + "cannot_match_transform": "تعذر مطابقة التحويل: {{transform}}" }, "web_view": { "web_view": "عرض الويب" @@ -742,14 +1118,253 @@ "database_anonymization": { "title": "اخفاء هوية البيانات", "full_anonymization": "الاخفاء الكامل للهوية", - "light_anonymization": "الاخفاء الجزئي للهوية" + "light_anonymization": "الاخفاء الجزئي للهوية", + "existing_anonymized_databases": "قواعد البيانات المجهولة الحالية" }, "vacuum_database": { "title": "تحرير مساحة قاعدة البيانات", "button_text": "تحرير مساحة قاعدة البيانات", - "vacuuming_database": "جار تحرير مساحة قاعدة الييانات..." + "vacuuming_database": "جار تحرير مساحة قاعدة الييانات...", + "database_vacuumed": "تم تنظيف قاعدة البيانات" }, "ribbon": { "widgets": "ادوات الشريط" + }, + "vim_key_bindings": { + "use_vim_keybindings_in_code_notes": "اختصارات لوحة المفاتيح باسلوب Vim" + }, + "network_connections": { + "network_connections_title": "اتصالات الشبكة", + "check_for_updates": "‪التحقق من وجود تحديثات تلقائية" + }, + "tray": { + "title": "شريط النظام" + }, + "highlights_list": { + "title": "قائمة النقاط المميزة", + "bold": "نص عريض", + "italic": "نص مائل", + "underline": "خط تحت النص", + "color": "نص ملون", + "visibility_title": "اظهار قائمة التضليلات" + }, + "revisions_button": { + "note_revisions": "مراجعات الملاحظة" + }, + "custom_date_time_format": { + "format_string": "سلسلة التنسيق:", + "formatted_time": "التاريخ/الوقت المنسق:", + "title": "تنسيق تاريخ/وقت مخصص" + }, + "options_widget": { + "options_status": "حالة الخيارات" + }, + "spellcheck": { + "title": "التدقيق الاملائي", + "enable": "تفعيل التدقيق الاملائي", + "language_code_label": "رمز اللغة او رموز اللغات", + "available_language_codes_label": "رموز اللغات المتاحة:" + }, + "note-map": { + "button-link-map": "خريطة الروابط", + "button-tree-map": "خريطة الشجرة" + }, + "spacer": { + "configure_launchbar": "تهيئة شريط الاطلاق" + }, + "entrypoints": { + "note-executed": "تم تنفيذ الملاحظة." + }, + "branches": { + "delete-status": "حالة الحذف", + "delete-finished-successfully": "تم الحذف بنجاح." + }, + "highlighting": { + "title": "كتل الكود", + "color-scheme": "نظام الالوان" + }, + "code_block": { + "word_wrapping": "التفاف النص", + "theme_group_light": "الثيمات الفاتحة", + "theme_group_dark": "الثيمات الغامقة", + "copy_title": "نسخ الى الحافظة", + "theme_none": "بدون تمييز الصياغة" + }, + "link_context_menu": { + "open_note_in_popup": "تحرير سريع" + }, + "electron_integration": { + "desktop-application": "تطبيقات سطح المكتب", + "zoom-factor": "عامل التكبير", + "native-title-bar": "شريط العنوان الاصلي" + }, + "note_tooltip": { + "quick-edit": "التحرير السريع" + }, + "geo-map-context": { + "open-location": "فتح الموقع", + "remove-from-map": "ازالة من الخريطة" + }, + "share": { + "title": "اعدادات المشاركة" + }, + "note_language": { + "not_set": "غير محدد", + "configure-languages": "لغات التهيئة" + }, + "content_language": { + "title": "لغات المحتوى" + }, + "toggle_read_only_button": { + "unlock-editing": "الغاء قفل التحرير", + "lock-editing": "قفل التحرير" + }, + "cpu_arch_warning": { + "continue_anyway": "المتابعة على اي حال", + "download_link": "تنزيل النسخة الاصلية" + }, + "table_context_menu": { + "delete_row": "حذف الصف" + }, + "board_view": { + "delete-note": "حذف الملاحظة...", + "archive-note": "ارشفة الملاحظة", + "unarchive-note": "الغاء ارشفة الملاحظة", + "move-to": "نقل الى", + "insert-above": "ادراج اعلاه", + "insert-below": "ادراج ادناه", + "delete-column": "حذف العمود", + "new-item": "عنصر جديد", + "add-column": "اضافة عمود", + "new-item-placeholder": "ادخل عنوان الملاحظة...", + "add-column-placeholder": "ادخل اسم العمود...", + "remove-from-board": "ازالة من اللوحة" + }, + "command_palette": { + "export_note_title": "تصدير ملاحظة", + "show_attachments_title": "عرض المرفقات", + "search_notes_title": "البحث في الملاحظات", + "tree-action-name": "شجرة: {{name}}", + "export_note_description": "تصدر الملاحظة الحالية", + "show_attachments_description": "عرض مرفقات الملاحظة", + "search_notes_description": "فتح البحث المتقدم", + "search_subtree_title": "بحث في الشجرة الفرعية", + "search_history_title": "عرص سجل البحث", + "search_history_description": "عرض البحث السابق", + "configure_launch_bar_title": "تكوين شريط الاطلاق" + }, + "content_renderer": { + "open_externally": "فتح خارجيا" + }, + "settings": { + "related_settings": "اعدادات متعلقة" + }, + "pagination": { + "total_notes": "{{count}} ملاحظات" + }, + "mobile_detail_menu": { + "note_revisions": "مراجعات الملاحظة", + "insert_child_note": "ادراج ملاحظة فرعية", + "delete_this_note": "حذف هذه الملاحظة", + "error_unrecognized_command": "امر غير معروف {{command}}" + }, + "move_to": { + "notes_to_move": "الملاحظات المراد نقلها", + "target_parent_note": "ملاحظة الاصل الهدف", + "dialog_title": "انقل الملاحظات الى...", + "move_button": "نقل الىالملاحظة المحددة" + }, + "delete_revisions": { + "delete_note_revisions": "حذف مراجعات الملاحظة" + }, + "close_pane_button": { + "close_this_pane": "اغلاق هذه اللوحة" + }, + "create_pane_button": { + "create_new_split": "انشاء تقسيم جديد" + }, + "edit_button": { + "edit_this_note": "تعديل هذه الملاحظة" + }, + "include_archived_notes": { + "include_archived_notes": "تضمين الملاحظات المؤرشفة" + }, + "book": { + "drag_locked_title": "مقفلة للتعديل" + }, + "database_integrity_check": { + "title": "فحص سلامة قاعدة البيانات", + "check_button": "التحقق من سلامة قاعدة البيانات", + "checking_integrity": "جار التحقق من سلامة قاعدة البيانات..." + }, + "watched_file_update_status": { + "upload_modified_file": "رفع الملف المعدل", + "ignore_this_change": "اهمل هذا التغيير" + }, + "clipboard": { + "copy_success": "تم النسخ للحافظة." + }, + "note_autocomplete": { + "clear-text-field": "مسح حقل النص", + "show-recent-notes": "عرض الملاحظات الاخيرة", + "full-text-search": "البحث بالنص الكامل", + "search-for": "بحث ل \"{{term}}\"" + }, + "protect_note": { + "toggle-off": "ازالة الحماية عن الملاحظة", + "toggle-on": "حماية الملاحظة" + }, + "open-help-page": "فتح صفحة المساعدة", + "empty": { + "enter_workspace": "ادخل مساحة العمل {{title}}" + }, + "attribute_editor": { + "save_attributes": "حفظ السمات ", + "add_a_new_attribute": "اضافة سمة جديدة", + "add_new_label_definition": "اضافة تعريف لتسمية جديدة", + "add_new_relation_definition": "اضافة تعريف لعلاقة جديدة" + }, + "zen_mode": { + "button_exit": "الخروج من وضع Zen" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "مهلة مسح المرفقات" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "مهلة مسح الملاحظة", + "erase_notes_after": "مسح الملاحظات بعد:", + "erase_deleted_notes_now": "مسح الملاحظات المحذوفة الان" + }, + "ws": { + "sync-check-failed": "فشل التحقق من المزامنة!" + }, + "show_highlights_list_widget_button": { + "show_highlights_list": "عرض قائمة التضليلات" + }, + "presentation_view": { + "start-presentation": "بدء العرض التقديمي", + "edit-slide": "تعديل هذه الشريحة" + }, + "jump_to_note": { + "search_button": "البحث في النص الكامل" + }, + "password_not_set": { + "title": "لم يتم تعيين كلمة المرور", + "go_to_password_options": "اذهب الى خيارات كلمة المرور" + }, + "abstract_bulk_action": { + "remove_this_search_action": "حذف اجراء البحث هذا" + }, + "show_toc_widget_button": { + "show_toc": "عرض جدول المحتويات" + }, + "svg_export_button": { + "button_title": "تصدير المخطط ك SVG" + }, + "abstract_search_option": { + "remove_this_search_option": "حذف خيار البحث هذا" + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "الفاصل الزمني لنسخ الملاحظات الاحتياطية" } } diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index 5a2131342..c7053e709 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -646,7 +646,9 @@ "about": "关于 TriliumNext 笔记", "logout": "登出", "show-cheatsheet": "显示快捷帮助", - "toggle-zen-mode": "禅模式" + "toggle-zen-mode": "禅模式", + "new-version-available": "新更新可用", + "download-update": "取得版本 {{latestVersion}}" }, "zen_mode": { "button_exit": "退出禅模式" @@ -736,7 +738,8 @@ "insert_child_note": "插入子笔记", "delete_this_note": "删除此笔记", "error_cannot_get_branch_id": "无法获取 notePath '{{notePath}}' 的 branchId", - "error_unrecognized_command": "无法识别的命令 {{command}}" + "error_unrecognized_command": "无法识别的命令 {{command}}", + "note_revisions": "笔记历史版本" }, "note_icon": { "change_note_icon": "更改笔记图标", @@ -749,7 +752,7 @@ "editable": "可编辑", "basic_properties": "基本属性", "language": "语言", - "configure_code_notes": "配置代码注释..." + "configure_code_notes": "配置代码笔记…" }, "book_properties": { "view_type": "视图类型", @@ -765,7 +768,8 @@ "table": "表格", "geo-map": "地理地图", "board": "看板", - "include_archived_notes": "展示归档笔记" + "include_archived_notes": "展示归档笔记", + "presentation": "演示" }, "edited_notes": { "no_edited_notes_found": "今天还没有编辑过的笔记...", @@ -1258,7 +1262,13 @@ "min-days-in-first-week": "第一周的最小天数", "first-week-info": "第一周包含一年的第一个周四,基于 ISO 8601 标准。", "first-week-warning": "更改第一周选项可能会导致与现有周笔记重复,已创建的周笔记将不会相应更新。", - "formatting-locale": "日期和数字格式" + "formatting-locale": "日期和数字格式", + "tuesday": "周二", + "wednesday": "周三", + "thursday": "周四", + "friday": "周五", + "saturday": "周六", + "formatting-locale-auto": "依应用的语言设置" }, "backup": { "automatic_backup": "自动备份", @@ -2065,5 +2075,10 @@ }, "collections": { "rendering_error": "出现错误无法显示内容。" + }, + "presentation_view": { + "edit-slide": "编辑此幻灯片", + "start-presentation": "开始演示", + "slide-overview": "切换幻灯片概览" } } diff --git a/apps/client/src/translations/cs/translation.json b/apps/client/src/translations/cs/translation.json index aedf9519f..6cdb3321b 100644 --- a/apps/client/src/translations/cs/translation.json +++ b/apps/client/src/translations/cs/translation.json @@ -4,7 +4,7 @@ "homepage": "Domovská stránka:", "app_version": "Verze aplikace:", "db_version": "Verze DB:", - "sync_version": "Verze sync:", + "sync_version": "Verze synchronizace:", "build_date": "Datum sestavení:", "build_revision": "Revize sestavení:", "data_directory": "Datový adresář:" @@ -36,6 +36,29 @@ "add_link": "Přidat odkaz", "help_on_links": "Nápověda k odkazům", "note": "Poznámka", - "search_note": "hledat poznámku podle názvu" + "search_note": "hledat poznámku podle názvu", + "link_title": "Název odkazu", + "button_add_link": "Přidat odkaz" + }, + "branch_prefix": { + "prefix": "Prefix: ", + "save": "Uložit" + }, + "bulk_actions": { + "bulk_actions": "Hromadné akce", + "affected_notes": "Ovlivněné poznámky", + "notes": "Poznámky" + }, + "confirm": { + "cancel": "Zrušit", + "ok": "OK" + }, + "delete_notes": { + "cancel": "Zrušit", + "ok": "OK", + "close": "Zavřít" + }, + "export": { + "close": "Zavřít" } } diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index f9f099eca..ca0e40d69 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -646,7 +646,8 @@ "about": "Über Trilium Notes", "logout": "Abmelden", "show-cheatsheet": "Cheatsheet anzeigen", - "toggle-zen-mode": "Zen Modus" + "toggle-zen-mode": "Zen Modus", + "new-version-available": "Neues Update verfügbar" }, "sync_status": { "unknown": "

Der Synchronisations-Status wird bekannt, sobald der nächste Synchronisierungsversuch gestartet wird.

Klicke, um eine Synchronisierung jetzt auszulösen.

", @@ -733,7 +734,8 @@ "insert_child_note": "Untergeordnete Notiz einfügen", "delete_this_note": "Diese Notiz löschen", "error_cannot_get_branch_id": "BranchId für notePath „{{notePath}}“ kann nicht abgerufen werden", - "error_unrecognized_command": "Unbekannter Befehl {{command}}" + "error_unrecognized_command": "Unbekannter Befehl {{command}}", + "note_revisions": "Notiz Revisionen" }, "note_icon": { "change_note_icon": "Notiz-Icon ändern", @@ -762,7 +764,8 @@ "table": "Tabelle", "geo-map": "Weltkarte", "board": "Tafel", - "include_archived_notes": "Zeige archivierte Notizen" + "include_archived_notes": "Zeige archivierte Notizen", + "presentation": "Präsentation" }, "edited_notes": { "no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...", @@ -1255,7 +1258,13 @@ "min-days-in-first-week": "Mindestanzahl an Tagen in erster Woche", "first-week-info": "Die erste Woche, die den ersten Donnerstag des Jahres enthält, basiert auf dem Standard ISO 8601.", "first-week-warning": "Das Ändern der Optionen für die erste Woche kann zu Duplikaten mit bestehenden Wochen-Notizen führen. Bestehende Wochen-Notizen werden nicht entsprechend aktualisiert.", - "formatting-locale": "Datums- und Zahlenformat" + "formatting-locale": "Datums- und Zahlenformat", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "formatting-locale-auto": "Basierend auf die Anwendungssprache" }, "backup": { "automatic_backup": "Automatische Sicherung", @@ -2067,5 +2076,9 @@ }, "collections": { "rendering_error": "Aufgrund eines Fehlers können keine Inhalte angezeigt werden." + }, + "presentation_view": { + "edit-slide": "Folie bearbeiten", + "start-presentation": "Präsentation starten" } } diff --git a/apps/client/src/translations/el/translation.json b/apps/client/src/translations/el/translation.json index 60e02cc6f..9de9eee04 100644 --- a/apps/client/src/translations/el/translation.json +++ b/apps/client/src/translations/el/translation.json @@ -1,18 +1,24 @@ { - "about": { - "title": "Πληροφορίες για το Trilium Notes", - "homepage": "Αρχική Σελίδα:", - "app_version": "Έκδοση εφαρμογής:", - "db_version": "Έκδοση βάσης δεδομένων:", - "sync_version": "Έκδοση πρωτοκόλου συγχρονισμού:", - "build_date": "Ημερομηνία χτισίματος εφαρμογής:", - "build_revision": "Αριθμός αναθεώρησης χτισίματος:", - "data_directory": "Φάκελος δεδομένων:" - }, - "toast": { - "critical-error": { - "title": "Κρίσιμο σφάλμα", - "message": "Συνέβη κάποιο κρίσιμο σφάλμα, το οποίο δεν επιτρέπει στην εφαρμογή χρήστη να ξεκινήσει:\n\n{{message}}\n\nΤο πιθανότερο είναι να προκλήθηκε από κάποιο script που απέτυχε απρόοπτα. Δοκιμάστε να ξεκινήσετε την εφαρμογή σε ασφαλή λειτουργία για να λύσετε το πρόβλημα." - } + "about": { + "title": "Πληροφορίες για το Trilium Notes", + "homepage": "Αρχική Σελίδα:", + "app_version": "Έκδοση εφαρμογής:", + "db_version": "Έκδοση βάσης δεδομένων:", + "sync_version": "Έκδοση πρωτοκόλου συγχρονισμού:", + "build_date": "Ημερομηνία χτισίματος εφαρμογής:", + "build_revision": "Αριθμός αναθεώρησης χτισίματος:", + "data_directory": "Φάκελος δεδομένων:" + }, + "toast": { + "critical-error": { + "title": "Κρίσιμο σφάλμα", + "message": "Συνέβη κάποιο κρίσιμο σφάλμα, το οποίο δεν επιτρέπει στην εφαρμογή χρήστη να ξεκινήσει:\n\n{{message}}\n\nΤο πιθανότερο είναι να προκλήθηκε από κάποιο script που απέτυχε απρόοπτα. Δοκιμάστε να ξεκινήσετε την εφαρμογή σε ασφαλή λειτουργία για να λύσετε το πρόβλημα." } + }, + "ai_llm": { + "n_notes_queued": "{{ count }} σημείωση στην ουρά για εύρεση", + "n_notes_queued_plural": "{{ count }} σημειώσεις στην ουρά για εύρεση", + "notes_indexed": "{{ count }} σημείωση με ευρετήριο", + "notes_indexed_plural": "{{ count }} σημειώσεις με ευρετήριο" + } } diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 0d962270d..1949d3357 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -164,6 +164,7 @@ "importIntoNote": "Import into note", "chooseImportFile": "Choose import file", "importDescription": "Content of the selected file(s) will be imported as child note(s) into", + "importZipRecommendation": "When importing a ZIP file, the note hierarchy will reflect the subdirectory structure within the archive.", "options": "Options", "safeImportTooltip": "Trilium .zip export files can contain executable scripts which may contain harmful behavior. Safe import will deactivate automatic execution of all imported scripts. Uncheck \"Safe import\" only if the imported archive is supposed to contain executable scripts and you completely trust the contents of the import file.", "safeImport": "Safe import", @@ -647,7 +648,8 @@ "logout": "Logout", "show-cheatsheet": "Show Cheatsheet", "toggle-zen-mode": "Zen Mode", - "update_available": "Version {{latestVersion}} is available, click to download." + "new-version-available": "New Update Available", + "download-update": "Get Version {{latestVersion}}" }, "zen_mode": { "button_exit": "Exit Zen Mode" @@ -767,6 +769,7 @@ "table": "Table", "geo-map": "Geo Map", "board": "Board", + "presentation": "Presentation", "include_archived_notes": "Show archived notes" }, "edited_notes": { @@ -1415,8 +1418,13 @@ "title": "Localization", "language": "Language", "first-day-of-the-week": "First day of the week", - "sunday": "Sunday", "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", "first-week-of-the-year": "First week of the year", "first-week-contains-first-day": "First week contains first day of the year", "first-week-contains-first-thursday": "First week contains first Thursday of the year", @@ -1715,7 +1723,9 @@ "window-on-top": "Keep Window on Top" }, "note_detail": { - "could_not_find_typewidget": "Could not find typeWidget for type '{{type}}'" + "could_not_find_typewidget": "Could not find typeWidget for type '{{type}}'", + "printing": "Printing in progress...", + "printing_pdf": "Exporting to PDF in progress..." }, "note_title": { "placeholder": "type note's title here..." @@ -2023,6 +2033,11 @@ "edit-note-title": "Click to edit note title", "edit-column-title": "Click to edit column title" }, + "presentation_view": { + "edit-slide": "Edit this slide", + "start-presentation": "Start presentation", + "slide-overview": "Toggle an overview of the slides" + }, "command_palette": { "tree-action-name": "Tree: {{name}}", "export_note_title": "Export Note", diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index 81f3f4593..e07ce8036 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -354,7 +354,7 @@ "calendar_root": "marca la nota que debe usarse como raíz para las notas del día. Sólo uno debe estar marcado como tal.", "archived": "las notas con esta etiqueta no serán visibles de forma predeterminada en los resultados de búsqueda (tampoco en los cuadros de diálogo Saltar a, Agregar vínculo, etc.).", "exclude_from_export": "las notas (con su subárbol) no se incluirán en ninguna exportación de notas", - "run": "define en qué eventos debe ejecutarse el script. Los valores posibles son:\n
    \n
  • frontendStartup - cuando el frontend de Trilium inicia (o es recargado), pero no en dispositivos móviles.
  • \n
  • backendStartup - cuando el backend de Trilium se inicia
  • \n
  • hourly - se ejecuta una vez cada hora. Puede usar etiqueta adicional runAtHour para especificar a la hora.
  • \n
  • daily - ejecutar una vez al día
  • \n
", + "run": "define en qué eventos debe ejecutarse el script. Los valores posibles son:\n
    \n
  • frontendStartup - cuando Trilium frontend se inicia (o se actualiza), pero no en móvil.
  • \n
  • mobileStartup - cuando Trilium frontend se inicia (o se actualiza), en móvil.
  • \n
  • backendStartup - cuando Trilium backend se inicia
  • \n
  • hourly - se ejecuta una vez por hora. Se puede usar la etiqueta adicional runAtHour para especificar a qué hora.
  • \n
  • daily - se ejecuta una vez al día
  • \n
", "run_on_instance": "Definir en qué instancia de Trilium se debe ejecutar esto. Predeterminado para todas las instancias.", "run_at_hour": "¿A qué hora debería funcionar? Debe usarse junto con #run=hourly. Se puede definir varias veces para varias ejecuciones durante el día.", "disable_inclusion": "los scripts con esta etiqueta no se incluirán en la ejecución del script principal.", @@ -384,7 +384,7 @@ "inbox": "ubicación predeterminada de la bandeja de entrada para nuevas notas - cuando crea una nota usando el botón \"nueva nota\" en la barra lateral, las notas serán creadas como subnotas de la nota marcada con la etiqueta #inbox.", "workspace_inbox": "ubicación predeterminada de la bandeja de entrada para nuevas notas cuando se anclan a algún antecesor de esta nota del espacio de trabajo", "sql_console_home": "ubicación predeterminada de las notas de la consola SQL", - "bookmark_folder": "la nota con esta etiqueta aparecerá en los marcadores como carpeta (permitiendo el acceso a sus elementos hijos).", + "bookmark_folder": "la nota con esta etiqueta aparecerá en los marcadores como carpeta (permitiendo el acceso a sus elementos hijos)", "share_hidden_from_tree": "esta nota está oculta en el árbol de navegación izquierdo, pero aún se puede acceder a ella con su URL", "share_external_link": "la nota actuará como un enlace a un sitio web externo en el árbol compartido", "share_alias": "define un alias que al usar la nota va a estar disponible en https://your_trilium_host/share/[tu_alias]", @@ -646,7 +646,9 @@ "about": "Acerca de Trilium Notes", "logout": "Cerrar sesión", "show-cheatsheet": "Mostrar hoja de trucos", - "toggle-zen-mode": "Modo Zen" + "toggle-zen-mode": "Modo Zen", + "new-version-available": "Nueva actualización disponible", + "download-update": "Obtener versión {{latestVersion}}" }, "zen_mode": { "button_exit": "Salir del modo Zen" @@ -736,7 +738,8 @@ "insert_child_note": "Insertar subnota", "delete_this_note": "Eliminar esta nota", "error_cannot_get_branch_id": "No se puede obtener el branchID del notePath '{{notePath}}'", - "error_unrecognized_command": "Comando no reconocido {{command}}" + "error_unrecognized_command": "Comando no reconocido {{command}}", + "note_revisions": "Revisiones de notas" }, "note_icon": { "change_note_icon": "Cambiar icono de nota", @@ -765,7 +768,8 @@ "table": "Tabla", "geo-map": "Mapa Geo", "board": "Tablero", - "include_archived_notes": "Mostrar notas archivadas" + "include_archived_notes": "Mostrar notas archivadas", + "presentation": "Presentación" }, "edited_notes": { "no_edited_notes_found": "Aún no hay notas editadas en este día...", @@ -1010,7 +1014,7 @@ "start_dragging_relations": "Empiece a arrastrar relaciones desde aquí y suéltelas en otra nota.", "note_not_found": "¡Nota {{noteId}} no encontrada!", "cannot_match_transform": "No se puede coincidir con la transformación: {{transform}}", - "note_already_in_diagram": "Note \"{{title}}\" is already in the diagram.", + "note_already_in_diagram": "La nota \"{{title}}\" ya está en el diagrama.", "enter_title_of_new_note": "Ingrese el título de la nueva nota", "default_new_note_title": "nueva nota", "click_on_canvas_to_place_new_note": "Haga clic en el lienzo para colocar una nueva nota" @@ -1252,8 +1256,9 @@ "indexing_stopped": "Indexado detenido", "indexing_in_progress": "Indexado en progreso...", "last_indexed": "Último indexado", - "n_notes_queued": "{{ count }} nota agregada a la cola para indexado", - "n_notes_queued_plural": "{{ count }} notas agregadas a la cola para indexado", + "n_notes_queued_0": "{{ count }} nota agregada a la cola para indexar", + "n_notes_queued_1": "{{ count }} notas agregadas a la cola para indexar", + "n_notes_queued_2": "", "note_chat": "Chat de nota", "notes_indexed": "{{ count }} nota indexada", "notes_indexed_plural": "{{ count }} notas indexadas", @@ -1414,7 +1419,13 @@ "min-days-in-first-week": "Días mínimos en la primer semana", "first-week-info": "Primer semana que contiene al primer jueves del año está basado en el estándarISO 8601.", "first-week-warning": "Cambiar las opciones de primer semana puede causar duplicados con las Notas Semanales existentes y las Notas Semanales existentes no serán actualizadas respectivamente.", - "formatting-locale": "Fecha y formato de número" + "formatting-locale": "Fecha y formato de número", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "formatting-locale-auto": "Basado en el idioma de la aplicación" }, "backup": { "automatic_backup": "Copia de seguridad automática", @@ -1507,7 +1518,7 @@ "recovery_keys_used": "Usado: {{date}}", "recovery_keys_unused": "El código de recuperación {{index}} está sin usar", "oauth_title": "OAuth/OpenID", - "oauth_description": "OpenID es una forma estandarizada de permitirle iniciar sesión en sitios web utilizando una cuenta de otro servicio, como Google, para verificar su identidad. Siga estas instrucciones para configurar un servicio OpenID a través de Google.", + "oauth_description": "OpenID es un método estandarizado que permite iniciar sesión en sitios web usando una cuenta de otro servicio, como Google, para verificar tu identidad. El emisor predeterminado es Google, pero se puede cambiar a cualquier otro proveedor de OpenID. Consulta aquí para más información. Sigue estas instrucciones para configurar un servicio OpenID a través de Google.", "oauth_description_warning": "Para habilitar OAuth/OpenID, necesita establecer la URL base de OAuth/OpenID, ID de cliente y secreto de cliente en el archivo config.ini y reiniciar la aplicación. Si desea establecerlas desde variables de ambiente, por favor establezca TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID y TRILIUM_OAUTH_CLIENT_SECRET.", "oauth_missing_vars": "Ajustes faltantes: {{-variables}}", "oauth_user_account": "Cuenta de usuario: ", @@ -1617,8 +1628,8 @@ "unarchive": "Desarchivar" }, "shared_info": { - "shared_publicly": "Esta nota está compartida públicamente en {{- link}}", - "shared_locally": "Esta nota está compartida localmente en {{- link}}", + "shared_publicly": "Esta nota está compartida públicamente en {{- link}}.", + "shared_locally": "Esta nota está compartida localmente en {{- link}}.", "help_link": "Para obtener ayuda visite wiki." }, "note_types": { @@ -1980,7 +1991,8 @@ "new-item-placeholder": "Ingresar título de la nota...", "add-column-placeholder": "Ingresar título de la columna...", "edit-note-title": "Haga clic para editar el título de la nota", - "edit-column-title": "Haga clic para editar el título de la columna" + "edit-column-title": "Haga clic para editar el título de la columna", + "remove-from-board": "Eliminar del tablero" }, "content_renderer": { "open_externally": "Abrir externamente" @@ -2035,7 +2047,7 @@ }, "call_to_action": { "next_theme_title": "Prueba el nuevo tema de Trilium", - "next_theme_message": "Estas usando actualmente el tema heredado, ¿Te gustaría probar el nuevo tema?", + "next_theme_message": "Estás usando actualmente el tema heredado. ¿Te gustaría probar el nuevo tema?", "next_theme_button": "Prueba el nuevo tema", "background_effects_title": "Los efectos de fondo son ahora estables", "background_effects_message": "En los dispositivos Windows, los efectos de fondo ya son totalmente estables. Los efectos de fondo añaden un toque de color a la interfaz de usuario difuminando el fondo que hay detrás. Esta técnica también se utiliza en otras aplicaciones como el Explorador de Windows.", @@ -2063,5 +2075,13 @@ "pagination": { "total_notes": "{{count}} notas", "page_title": "Página de {{startIndex}} - {{endIndex}}" + }, + "presentation_view": { + "edit-slide": "Editar este slide", + "start-presentation": "Iniciar presentación", + "slide-overview": "Alternar vista general de los slides" + }, + "collections": { + "rendering_error": "No se puede mostrar contenido debido a un error." } } diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index a9c8cba0b..5a5518a0b 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -276,7 +276,12 @@ "preview": "Aperçu :", "preview_not_available": "L'aperçu n'est pas disponible pour ce type de note.", "restore_button": "Restaurer", - "delete_button": "Supprimer" + "delete_button": "Supprimer", + "diff_on": "Afficher les différences", + "diff_off": "Afficher le contenu", + "diff_on_hint": "Cliquez pour afficher les différences de la note d'origine", + "diff_off_hint": "Cliquez pour afficher le contenu de la note", + "diff_not_available": "La comparaison n'est pas disponible." }, "sort_child_notes": { "sort_children_by": "Trier les enfants par...", @@ -731,7 +736,8 @@ "insert_child_note": "Insérer une note enfant", "delete_this_note": "Supprimer cette note", "error_cannot_get_branch_id": "Impossible d'obtenir branchId pour notePath '{{notePath}}'", - "error_unrecognized_command": "Commande non reconnue {{command}}" + "error_unrecognized_command": "Commande non reconnue {{command}}", + "note_revisions": "Révision de la note" }, "note_icon": { "change_note_icon": "Changer l'icône de note", @@ -1625,7 +1631,8 @@ "link_context_menu": { "open_note_in_new_tab": "Ouvrir la note dans un nouvel onglet", "open_note_in_new_split": "Ouvrir la note dans une nouvelle division", - "open_note_in_new_window": "Ouvrir la note dans une nouvelle fenêtre" + "open_note_in_new_window": "Ouvrir la note dans une nouvelle fenêtre", + "open_note_in_popup": "Édition rapide" }, "electron_integration": { "desktop-application": "Application de bureau", @@ -1763,7 +1770,14 @@ "reprocess_index": "Rafraîchir l'index de recherche", "reprocessing_index": "Mise à jour...", "reprocess_index_started": "L'optimisation de l'indice de recherche à commencer en arrière-plan", - "reprocess_index_error": "Erreur dans le rafraichissement de l'indice de recherche" + "reprocess_index_error": "Erreur dans le rafraichissement de l'indice de recherche", + "failed_notes": "Notes échouées", + "last_processed": "Dernier traitement", + "restore_provider": "Restaurer le fournisseur de la recherche", + "index_rebuild_progress": "Progression de la reconstruction de l'index", + "index_rebuilding": "Optimisation de l'index ({{percentage}}%)", + "index_rebuild_complete": "Optimisation de l'index terminée", + "index_rebuild_status_error": "Erreur lors de la vérification de l'état de reconstruction de l'index" }, "ui-performance": { "title": "Performance", diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 0b488eb5c..9cb3e2e4d 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -3,6 +3,30 @@ "title": "Tentang Trilium Notes", "homepage": "Halaman utama:", "app_version": "Versi Aplikasi:", - "db_version": "Versi DB:" + "db_version": "Versi DB:", + "sync_version": "Versi sinkronisasi:", + "build_date": "Tanggal pembuatan:", + "build_revision": "Revisi pembuatan:", + "data_directory": "Direktori data:" + }, + "toast": { + "critical-error": { + "title": "Kesalahan kritis", + "message": "Telah terjadi kesalahan kritis yang mencegah aplikasi klien untuk memulai:\n\n{{message}}\n\nHal ini kemungkinan besar disebabkan oleh skrip yang gagal secara tidak terduga. Coba jalankan aplikasi dalam mode aman dan atasi masalahnya." + }, + "widget-error": { + "title": "Gagal menginisialisasi widget", + "message-custom": "Widget kustom dari catatan dengan ID \"{{id}}\", berjudul \"{{title}}\" tidak dapat diinisialisasi karena:\n\n{{message}}", + "message-unknown": "Widget tidak dikenal tidak dapat diinisialisasi karena:\n\n{{message}}" + }, + "bundle-error": { + "title": "Gagal memuat skrip kustom", + "message": "Skrip dari catatan dengan ID \"{{id}}\", berjudul \"{{title}}\" tidak dapat dijalankan karena:\n\n{{message}}" + } + }, + "add_link": { + "add_link": "Tambah tautan", + "help_on_links": "Bantuan pada tautan", + "note": "Catatan" } } diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index 813a4de0f..f6e9d0cef 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -20,7 +20,7 @@ }, "widget-error": { "title": "Impossibile inizializzare un widget", - "message-custom": "Il widget personalizzato della nota con ID \"{{id}}\", dal titolo \"{{title}}\" non è stato inizializzato a causa di:\n\n{{message}}", + "message-custom": "Il widget personalizzato dalla nota con ID “{{id}}”, intitolato “{{title}}”, non è stato possibile inizializzare a causa di:\n\n{{message}}", "message-unknown": "Un widget sconosciuto non è stato inizializzato a causa di:\n\n{{message}}" } }, @@ -83,14 +83,15 @@ "erase_notes_description": "L'eliminazione normale (soft) marca le note come eliminate e potranno essere recuperate entro un certo lasso di tempo (dalla finestra dei cambiamenti recenti). Selezionando questa opzione le note si elimineranno immediatamente e non sarà possibile recuperarle.", "erase_notes_warning": "Elimina le note in modo permanente (non potrà essere disfatto), compresi tutti i cloni. Ciò forzerà un nuovo caricamento dell'applicazione.", "cancel": "Annulla", - "notes_to_be_deleted": "Le seguenti note saranno eliminate ({{- noteCount}})", + "notes_to_be_deleted": "Le seguenti note saranno eliminate ({{notesCount}})", "no_note_to_delete": "Nessuna nota sarà eliminata (solo i cloni).", - "broken_relations_to_be_deleted": "Le seguenti relazioni saranno interrotte ed eliminate ({{- relationCount}})", + "broken_relations_to_be_deleted": "Le seguenti relazioni saranno interrotte ed eliminate ({{relationCount}})", "deleted_relation_text": "La nota {{- note}} (da eliminare) è referenziata dalla relazione {{- relation}} originata da {{- source}}." }, "info": { "okButton": "OK", - "closeButton": "Chiudi" + "closeButton": "Chiudi", + "modalTitle": "Messaggio informativo" }, "export": { "close": "Chiudi", @@ -112,25 +113,57 @@ }, "password_not_set": { "body1": "Le note protette sono crittografate utilizzando una password utente, ma la password non è stata ancora impostata.", - "body2": "Per proteggere le note, fare clic su qui per aprire la finestra di dialogo Opzioni e impostare la password." + "body2": "Per proteggere le note, clicca sul pulsante sottostante per aprire la finestra di dialogo Opzioni e impostare la tua password.", + "title": "La password non è impostata", + "go_to_password_options": "Vai alle opzioni della password" }, "protected_session_password": { - "close_label": "Chiudi" + "close_label": "Chiudi", + "modal_title": "Sessione protetta", + "help_title": "Aiuto sulle note protette", + "form_label": "Per procedere con l’azione richiesta, è necessario avviare una sessione protetta inserendo la password:", + "start_button": "Avvia sessione protetta" }, "abstract_bulk_action": { "remove_this_search_action": "Rimuovi questa azione di ricerca" }, "etapi": { "new_token_title": "Nuovo token ETAPI", - "new_token_message": "Inserire il nuovo nome del token" + "new_token_message": "Inserisci il nome del nuovo token", + "title": "ETAPI", + "description": "ETAPI è un'API REST utilizzata per accedere alle istanze di Trilium in modo programmatico, senza interfaccia utente.", + "see_more": "Per maggiori dettagli consulta {{- link_to_wiki}} e {{- link_to_openapi_spec}} o {{- link_to_swagger_ui}}.", + "wiki": "wiki", + "openapi_spec": "Specifiche ETAPI OpenAPI", + "swagger_ui": "Interfaccia utente ETAPI Swagger", + "create_token": "Crea un nuovo token ETAPI", + "existing_tokens": "Token esistenti", + "no_tokens_yet": "Non ci sono ancora token. Clicca sul pulsante qui sopra per crearne uno.", + "token_name": "Nome del token", + "created": "Creato", + "actions": "Azioni", + "default_token_name": "nuovo token", + "error_empty_name": "Il nome del token non può essere vuoto", + "token_created_title": "Token ETAPI creato", + "token_created_message": "Copia il token creato negli appunti. Trilium memorizza l'hash del token e questa è l'ultima volta che lo vedi.", + "rename_token": "Rinomina questo token", + "delete_token": "Elimina/disattiva questo token", + "rename_token_title": "Rinomina token", + "rename_token_message": "Inserisci il nome del nuovo token", + "delete_token_confirmation": "Sei sicuro di voler eliminare il token ETAPI \"{{name}}\"?" }, "electron_integration": { "zoom-factor": "Fattore di ingrandimento", - "desktop-application": "Applicazione Desktop" + "desktop-application": "Applicazione Desktop", + "native-title-bar": "Barra del titolo nativa", + "native-title-bar-description": "Su Windows e macOS, disattivare la barra del titolo nativa rende l'applicazione più compatta. Su Linux, attivarla si integra meglio con il resto del sistema.", + "background-effects": "Abilita effetti di sfondo (solo Windows 11)", + "background-effects-description": "L'effetto Mica aggiunge uno sfondo sfocato ed elegante alle finestre delle app, creando profondità e un aspetto moderno. La \"Barra del titolo nativa\" deve essere disattivata.", + "restart-app-button": "Riavviare l'applicazione per visualizzare le modifiche" }, "note_autocomplete": { "search-for": "Cerca \"{{term}}\"", - "create-note": "Crea e collega la nota figlia \"{{term}}\"", + "create-note": "Crea e collega la nota secondaria “{{term}}”", "insert-external-link": "Inserisci il collegamento esterno a \"{{term}}\"", "clear-text-field": "Pulisci il campo di testo", "show-recent-notes": "Mostra le note recenti", @@ -151,31 +184,44 @@ "add-note": "Aggiungi un marcatore in questa posizione" }, "debug": { - "debug": "Debug" + "debug": "Debug", + "debug_info": "Debug stamperà informazioni di debug aggiuntive nella console per facilitare il debug di query complesse.", + "access_info": "Per accedere alle informazioni di debug, eseguire la query e fare clic su \"Mostra registro backend\" nell'angolo in alto a sinistra." }, "database_anonymization": { "light_anonymization": "Anonimizzazione parziale", - "title": "Anonimizzazione del Database", + "title": "Anonimizzazione dei database", "full_anonymization": "Anonimizzazione completa", - "full_anonymization_description": "Questa azione creerà una nuova copia del database e lo anonimizzerà (rimuove tutti i contenuti delle note, lasciando solo la struttura e qualche metadato non sensibile) per condividerlo online allo scopo di debugging, senza paura di far trapelare i tuoi dati personali.", - "save_fully_anonymized_database": "Salva il database completamente anonimizzato", + "full_anonymization_description": "Questa azione creerà una nuova copia del database e la renderà anonima (rimuovendo tutto il contenuto delle note e lasciando solo la struttura e alcuni metadati non sensibili) per poterla condividere online a scopo di debug senza timore di divulgare i tuoi dati personali.", + "save_fully_anonymized_database": "Salva database completamente anonimizzato", "light_anonymization_description": "Questa azione creerà una nuova copia del database e lo anonimizzerà in parzialmente — in particolare, solo il contenuto delle note sarà rimosso, ma i titoli e gli attributi rimarranno. Inoltre, note con script personalizzati JS di frontend/backend e widget personalizzati lasciando rimarranno. Ciò mette a disposizione più contesto per il debug dei problemi.", "choose_anonymization": "Puoi decidere da solo se fornire un database completamente o parzialmente anonimizzato. Anche un database completamente anonimizzato è molto utile, sebbene in alcuni casi i database parzialmente anonimizzati possono accelerare il processo di identificazione dei bug e la loro correzione.", - "no_anonymized_database_yet": "Nessun database ancora anonimizzato.", - "save_lightly_anonymized_database": "Salva il database parzialmente anonimizzato", + "no_anonymized_database_yet": "Ancora nessun database anonimizzato.", + "save_lightly_anonymized_database": "Salva database leggermente anonimizzato", "successfully_created_fully_anonymized_database": "Database completamente anonimizzato creato in {{anonymizedFilePath}}", - "successfully_created_lightly_anonymized_database": "Database parzialmente anonimizzato creato in {{anonymizedFilePath}}" + "successfully_created_lightly_anonymized_database": "Database parzialmente anonimizzato creato in {{anonymizedFilePath}}", + "existing_anonymized_databases": "Database anonimizzati esistenti", + "creating_fully_anonymized_database": "Creazione di un database completamente anonimizzato...", + "creating_lightly_anonymized_database": "Creazione di un database leggermente anonimizzato...", + "error_creating_anonymized_database": "Impossibile creare un database anonimo, controllare i log del backend per i dettagli" }, "cpu_arch_warning": { "title": "Per favore scarica la versione ARM64", - "continue_anyway": "Continua Comunque", + "continue_anyway": "Continua comunque", "dont_show_again": "Non mostrare più questo avviso", - "download_link": "Scarica la Versione Nativa" + "download_link": "Scarica la Versione Nativa", + "message_macos": "Al momento TriliumNext è in esecuzione con la traduzione Rosetta 2, il che significa che stai utilizzando la versione Intel (x64) su Mac con Apple Silicon. Ciò avrà un impatto significativo sulle prestazioni e sulla durata della batteria.", + "message_windows": "TriliumNext è attualmente in emulazione, il che significa che stai utilizzando la versione Intel (x64) su un dispositivo Windows su ARM. Ciò avrà un impatto significativo sulle prestazioni e sulla durata della batteria.", + "recommendation": "Per un'esperienza ottimale, scarica la versione nativa ARM64 di TriliumNext dalla nostra pagina delle versioni." }, "editorfeatures": { "title": "Caratteristiche", "emoji_completion_enabled": "Abilita il completamento automatico delle Emoji", - "note_completion_enabled": "Abilita il completamento automatico delle note" + "note_completion_enabled": "Abilita il completamento automatico delle note", + "emoji_completion_description": "Se abilitata, è possibile inserire facilmente gli emoji nel testo digitando `:`, seguito dal nome dell'emoji.", + "note_completion_description": "Se abilitato, è possibile creare collegamenti alle note digitando `@` seguito dal titolo di una nota.", + "slash_commands_enabled": "Abilita i comandi slash", + "slash_commands_description": "Se abilitato, i comandi di modifica come l'inserimento di interruzioni di riga o intestazioni possono essere attivati ​​digitando `/`." }, "table_view": { "new-row": "Nuova riga", @@ -187,24 +233,49 @@ "hide-column": "Nascondi la colonna \"{{title}}\"", "show-hide-columns": "Mostra/nascondi le colonne", "row-insert-above": "Inserisci una riga sopra", - "row-insert-below": "Inserisci una riga sotto" + "row-insert-below": "Inserisci una riga sotto", + "row-insert-child": "Inserisci nota secondaria", + "add-column-to-the-left": "Aggiungi colonna a sinistra", + "add-column-to-the-right": "Aggiungi colonna a destra", + "edit-column": "Modifica colonna", + "delete_column_confirmation": "Vuoi davvero eliminare questa colonna? L'attributo corrispondente verrà rimosso da tutte le note.", + "delete-column": "Elimina colonna", + "new-column-label": "Etichetta", + "new-column-relation": "Relazione" }, "abstract_search_option": { "remove_this_search_option": "Rimuovi questa opzione di ricerca", "failed_rendering": "Opzione di ricerca di rendering non riuscita: {{dto}} con errore: {{error}} {{stack}}" }, "ancestor": { - "label": "Antenato" + "label": "Antenato", + "placeholder": "cerca la nota per nome", + "depth_label": "profondità", + "depth_doesnt_matter": "non importa", + "depth_eq": "è esattamente {{count}}", + "direct_children": "figli diretti", + "depth_gt": "è maggiore di {{count}}", + "depth_lt": "è inferiore a {{count}}" }, "add_label": { "add_label": "Aggiungi etichetta", "label_name_placeholder": "nome dell'etichetta", "new_value_placeholder": "nuovo valore", - "to_value": "al valore" + "to_value": "al valore", + "label_name_title": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "help_text": "Su tutte le note abbinate:", + "help_text_item1": "crea l'etichetta data se la nota non ne ha ancora una", + "help_text_item2": "o modificare il valore dell'etichetta esistente", + "help_text_note": "È possibile chiamare questo metodo anche senza valore, in tal caso l'etichetta verrà assegnata alla nota senza valore." }, "update_label_value": { "to_value": "al valore", - "label_name_placeholder": "nome dell'etichetta" + "label_name_placeholder": "nome dell'etichetta", + "update_label_value": "Aggiorna il valore dell'etichetta", + "label_name_title": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "new_value_placeholder": "nuovo valore", + "help_text": "Su tutte le note corrispondenti, modifica il valore dell'etichetta esistente.", + "help_text_note": "È possibile chiamare questo metodo anche senza valore, in tal caso l'etichetta verrà assegnata alla nota senza valore." }, "delete_label": { "delete_label": "Elimina etichetta", @@ -213,51 +284,151 @@ }, "tree-context-menu": { "move-to": "Muovi in...", - "cut": "Taglia" + "cut": "Taglia", + "open-in-a-new-tab": "Apri in una nuova scheda", + "open-in-a-new-split": "Apri in una nuova divisione", + "insert-note-after": "Inserisci nota dopo", + "insert-child-note": "Inserisci nota secondaria", + "archive": "Archivio", + "unarchive": "Disarchiviare", + "delete": "Eliminare", + "search-in-subtree": "Cerca nel sottoalbero", + "hoist-note": "Nota di sollevamento", + "unhoist-note": "Nota di sgancio", + "edit-branch-prefix": "Modifica prefisso ramo", + "advanced": "Avanzato", + "expand-subtree": "Espandi sottoalbero", + "collapse-subtree": "Comprimi sottoalbero", + "sort-by": "Ordina per...", + "recent-changes-in-subtree": "Modifiche recenti nel sottoalbero", + "convert-to-attachment": "Converti in allegato", + "copy-note-path-to-clipboard": "Copia il percorso della nota negli appunti", + "protect-subtree": "Proteggi sottoalbero", + "unprotect-subtree": "Rimuovi protezione dal sottoalbero", + "copy-clone": "Copia / clona", + "clone-to": "Clona in...", + "paste-into": "Incolla in", + "paste-after": "Incolla dopo", + "duplicate": "Duplicato", + "export": "Esportare", + "import-into-note": "Importa nella nota", + "apply-bulk-actions": "Applica azioni in blocco", + "converted-to-attachments": "{{count}} note sono state convertite in allegati.", + "convert-to-attachment-confirm": "Sei sicuro di voler convertire le note selezionate in allegati delle note padre?", + "open-in-popup": "Modifica rapida" }, "electron_context_menu": { "cut": "Taglia", "copy": "Copia", "paste": "Incolla", "copy-link": "Copia collegamento", - "paste-as-plain-text": "Incolla come testo semplice" + "paste-as-plain-text": "Incolla come testo semplice", + "add-term-to-dictionary": "Aggiungi \"{{term}}\" al dizionario", + "search_online": "Cerca \"{{term}}\" con {{searchEngine}}" }, "editing": { "editor_type": { - "multiline-toolbar": "Mostra la barra degli strumenti su più linee se non entra." + "multiline-toolbar": "Mostra la barra degli strumenti su più linee se non entra.", + "label": "Barra degli strumenti di formattazione", + "floating": { + "title": "Galleggiante", + "description": "gli strumenti di modifica appaiono vicino al cursore;" + }, + "fixed": { + "title": "Fisso", + "description": "gli strumenti di modifica vengono visualizzati nella scheda \"Formattazione\" della barra multifunzione." + } } }, "edit_button": { "edit_this_note": "Modifica questa nota" }, "shortcuts": { - "shortcuts": "Scorciatoie" + "shortcuts": "Scorciatoie", + "keyboard_shortcuts": "Scorciatoie da tastiera", + "multiple_shortcuts": "Più scorciatoie per la stessa azione possono essere separate da virgola.", + "electron_documentation": "Consultare la documentazione di Electron per i modificatori e i codici chiave disponibili.", + "type_text_to_filter": "Digita il testo per filtrare le scorciatoie...", + "action_name": "Nome dell'azione", + "default_shortcuts": "Scorciatoie predefinite", + "description": "Descrizione", + "reload_app": "Ricarica l'app per applicare le modifiche", + "set_all_to_default": "Imposta tutte le scorciatoie sui valori predefiniti", + "confirm_reset": "Vuoi davvero ripristinare tutte le scorciatoie da tastiera ai valori predefiniti?" }, "shared_switch": { "toggle-on-title": "Condividi la nota", - "toggle-off-title": "Non condividere la nota" + "toggle-off-title": "Non condividere la nota", + "shared": "Condiviso", + "shared-branch": "Questa nota esiste solo come nota condivisa; annullando la condivisione verrebbe eliminata. Vuoi continuare ed eliminare questa nota?", + "inherited": "Non è possibile annullare la condivisione della nota in questo caso perché è condivisa tramite eredità da un antenato." }, "search_string": { - "search_prefix": "Cerca:" + "search_prefix": "Cerca:", + "title_column": "Stringa di ricerca:", + "placeholder": "parole chiave a testo completo, #tag = valore...", + "search_syntax": "Sintassi di ricerca", + "also_see": "vedi anche", + "complete_help": "aiuto completo sulla sintassi di ricerca", + "full_text_search": "Basta inserire un testo qualsiasi per la ricerca full text", + "label_abc": "restituisce note con etichetta abc", + "label_year": "corrisponde alle note con l'anno dell'etichetta avente valore 2019", + "label_rock_pop": "corrisponde alle note che hanno sia etichette rock che pop", + "label_rock_or_pop": "deve essere presente solo una delle etichette", + "label_year_comparison": "confronto numerico (anche >, >=, <).", + "label_date_created": "note create nell'ultimo mese", + "error": "Errore di ricerca: {{error}}" }, "attachment_detail": { - "open_help_page": "Apri la pagina di aiuto sugli allegati" + "open_help_page": "Apri la pagina di aiuto sugli allegati", + "owning_note": "Nota di proprietà:", + "you_can_also_open": ", puoi anche aprire il", + "list_of_all_attachments": "Elenco di tutti gli allegati", + "attachment_deleted": "Questo allegato è stato eliminato." }, "search_definition": { "ancestor": "antenato", "debug": "debug", "action": "azione", - "add_search_option": "Aggiungi un opzione di ricerca:", - "search_string": "cerca la stringa", - "limit": "limite" + "add_search_option": "Aggiungi opzione di ricerca:", + "search_string": "stringa di ricerca", + "limit": "limite", + "search_script": "script di ricerca", + "fast_search": "ricerca veloce", + "fast_search_description": "L'opzione di ricerca rapida disattiva la ricerca del testo completo del contenuto delle note, il che potrebbe velocizzare la ricerca in database di grandi dimensioni.", + "include_archived": "includere archiviato", + "include_archived_notes_description": "Per impostazione predefinita, le note archiviate sono escluse dai risultati della ricerca; con questa opzione verranno incluse.", + "order_by": "ordina per", + "limit_description": "Limita il numero di risultati", + "debug_description": "Debug stamperà informazioni di debug aggiuntive nella console per facilitare il debug di query complesse", + "search_button": "Ricerca", + "search_execute": "Cerca ed esegui azioni", + "save_to_note": "Salva per annotare", + "search_parameters": "Parametri di ricerca", + "unknown_search_option": "Opzione di ricerca sconosciuta {{searchOptionName}}", + "search_note_saved": "La nota di ricerca è stata salvata in {{- notePathTitle}}", + "actions_executed": "Le azioni sono state eseguite." }, "modal": { - "close": "Chiudi" + "close": "Chiudi", + "help_title": "Visualizza maggiori informazioni su questa schermata" }, "board_view": { "insert-below": "Inserisci sotto", "delete-column": "Elimina la colonna", - "delete-column-confirmation": "Sei sicuro di vole eliminare questa colonna? Il corrispondente attributo sarà eliminato anche nelle note sotto questa colonna." + "delete-column-confirmation": "Sei sicuro di vole eliminare questa colonna? Il corrispondente attributo sarà eliminato anche nelle note sotto questa colonna.", + "delete-note": "Elimina nota...", + "remove-from-board": "Rimuovi dalla bacheca", + "archive-note": "Nota d'archivio", + "unarchive-note": "Decomprimi nota", + "move-to": "Spostarsi a", + "insert-above": "Inserisci sopra", + "new-item": "Nuovo articolo", + "new-item-placeholder": "Inserisci il titolo della nota...", + "add-column": "Aggiungi colonna", + "add-column-placeholder": "Inserisci il nome della colonna...", + "edit-note-title": "Fare clic per modificare il titolo della nota", + "edit-column-title": "Fare clic per modificare il titolo della colonna" }, "backup": { "enable_weekly_backup": "Abilita le archiviazioni settimanali", @@ -269,8 +440,10 @@ "date-and-time": "Data e ora", "path": "Percorso", "database_backed_up_to": "Il database è stato archiviato in {{backupFilePath}}", - "enable_daily_backup": "Abilita le archiviazioni giornaliere", - "no_backup_yet": "Ancora nessuna archiviazione" + "enable_daily_backup": "Abilita i backup giornalieri", + "no_backup_yet": "Ancora nessuna archiviazione", + "automatic_backup": "Backup Automatico", + "automatic_backup_description": "Trilium può eseguire automaticamente il backup del database:" }, "backend_log": { "refresh": "Aggiorna" @@ -278,19 +451,26 @@ "consistency_checks": { "find_and_fix_button": "Trova e correggi i problemi di coerenza", "finding_and_fixing_message": "In cerca e correzione dei problemi di coerenza...", - "issues_fixed_message": "Qualsiasi problema di coerenza che possa essere stato trovato ora è corretto." + "issues_fixed_message": "Qualsiasi problema di coerenza che possa essere stato trovato ora è corretto.", + "title": "Controlli di coerenza" }, "database_integrity_check": { "check_button": "Controllo dell'integrità del database", "checking_integrity": "Controllo dell'integrità del database in corso...", "title": "Controllo di Integrità del database", "description": "Controllerà che il database non sia corrotto a livello SQLite. Può durare un po' di tempo, a seconda della grandezza del DB.", - "integrity_check_failed": "Controllo di integrità fallito: {{results}}" + "integrity_check_failed": "Controllo di integrità fallito: {{results}}", + "integrity_check_succeeded": "Controllo di integrità riuscito: nessun problema riscontrato." }, "sync": { "title": "Sincronizza", "force_full_sync_button": "Forza una sincronizzazione completa", - "failed": "Sincronizzazione fallita: {{message}}" + "failed": "Sincronizzazione fallita: {{message}}", + "fill_entity_changes_button": "Compila i record delle modifiche dell'entità", + "full_sync_triggered": "Sincronizzazione completa attivata", + "filling_entity_changes": "Il riempimento delle righe modifica l'entità...", + "sync_rows_filled_successfully": "Sincronizzazione righe compilate correttamente", + "finished-successfully": "Sincronizzazione completata con successo." }, "sync_2": { "config_title": "Configurazione per la Sincronizzazione", @@ -299,10 +479,28 @@ "timeout": "Timeout per la sincronizzazione", "timeout_unit": "millisecondi", "save": "Salva", - "help": "Aiuto" + "help": "Aiuto", + "server_address": "Indirizzo dell'istanza del server", + "note": "Nota", + "note_description": "Se si lascia vuota l'impostazione del proxy, verrà utilizzato il proxy di sistema (valido solo per le build desktop/electron).", + "special_value_description": "Un altro valore speciale è noproxy che forza l'ignoramento anche del proxy di sistema e rispetta NODE_TLS_REJECT_UNAUTHORIZED.", + "test_description": "Questo testerà la connessione e l'handshake con il server di sincronizzazione. Se il server di sincronizzazione non è inizializzato, questo lo imposterà per la sincronizzazione con il documento locale.", + "test_button": "Test di sincronizzazione", + "handshake_failed": "Handshake del server di sincronizzazione non riuscito, errore: {{message}}" }, "search_engine": { - "save_button": "Salva" + "save_button": "Salva", + "title": "Motore di ricerca", + "custom_search_engine_info": "Il motore di ricerca personalizzato richiede l'impostazione sia di un nome che di un URL. Se uno di questi non viene impostato, DuckDuckGo verrà utilizzato come motore di ricerca predefinito.", + "predefined_templates_label": "Modelli predefiniti per motori di ricerca", + "bing": "Bing", + "baidu": "Baidu", + "duckduckgo": "DuckDuckGo", + "google": "Google", + "custom_name_label": "Nome del motore di ricerca personalizzato", + "custom_name_placeholder": "Personalizza il nome del motore di ricerca", + "custom_url_label": "L'URL del motore di ricerca personalizzato deve includere {keyword} come segnaposto per il termine di ricerca.", + "custom_url_placeholder": "Personalizza l'URL del motore di ricerca" }, "sql_table_schemas": { "tables": "Tabelle" @@ -320,10 +518,15 @@ "new_tab": "Nuova scheda" }, "toc": { - "table_of_contents": "Sommario" + "table_of_contents": "Sommario", + "options": "Opzioni" }, "table_of_contents": { - "title": "Sommario" + "title": "Sommario", + "description": "L'indice apparirà nelle note di testo quando la nota contiene più di un numero definito di titoli. È possibile personalizzare questo numero:", + "unit": "titoli", + "disable_info": "È anche possibile utilizzare questa opzione per disattivare efficacemente l'indice impostando un numero molto alto.", + "shortcut_info": "È possibile configurare una scorciatoia da tastiera per alternare rapidamente il riquadro destro (incluso il sommario) in Opzioni -> Scorciatoie (nome 'toggleRightPane')." }, "tray": { "title": "Vassoio di Sistema", @@ -331,12 +534,21 @@ }, "heading_style": { "title": "Stile dell'Intestazione", - "plain": "Normale", + "plain": "Semplice", "underline": "Sottolineato", "markdown": "Stile Markdown" }, "highlights_list": { - "title": "Punti salienti" + "title": "Elenco dei punti salienti", + "description": "È possibile personalizzare l'elenco delle evidenziazioni visualizzato nel pannello di destra:", + "bold": "Testo in grassetto", + "italic": "Testo in corsivo", + "underline": "Testo sottolineato", + "color": "Testo colorato", + "bg_color": "Testo con colore di sfondo", + "visibility_title": "Visibilità dell'elenco dei punti salienti", + "visibility_description": "È possibile nascondere il widget delle evidenziazioni per nota aggiungendo un'etichetta #hideHighlightWidget.", + "shortcut_info": "È possibile configurare una scorciatoia da tastiera per alternare rapidamente il riquadro destro (inclusi i punti salienti) in Opzioni -> Scorciatoie (nome 'toggleRightPane')." }, "highlights_list_2": { "title": "Punti salienti", @@ -344,13 +556,1535 @@ }, "quick-search": { "placeholder": "Ricerca rapida", - "searching": "Ricerca in corso..." + "searching": "Ricerca in corso...", + "no-results": "Nessun risultato trovato", + "more-results": "... e altri {{number}} risultati.", + "show-in-full-search": "Mostra nella ricerca completa" }, "help": { "goUpDown": "su/giù nella lista delle note", "collapseExpand": "collassa/espande il nodo", "notSet": "non impostato", "goBackForwards": "indietro/avanti nella cronologia", - "showJumpToNoteDialog": "mostra la finestra di dialogo \"Salta alla nota\"" + "showJumpToNoteDialog": "mostra finestra di dialogo “Vai a”", + "title": "Scheda riassuntiva", + "noteNavigation": "Nota navigazione", + "scrollToActiveNote": "scorri fino alla nota attiva", + "jumpToParentNote": "vai alla nota principale", + "collapseWholeTree": "comprimi l'intero albero delle note", + "collapseSubTree": "comprimi sottoalbero", + "tabShortcuts": "Scorciatoie delle schede", + "newTabNoteLink": "Il link alla nota apre la nota in una nuova scheda", + "newTabWithActivationNoteLink": "Il link alla nota si apre e attiva la nota in una nuova scheda", + "onlyInDesktop": "Solo nella versione desktop (Electron build)", + "openEmptyTab": "apri scheda vuota", + "closeActiveTab": "chiudi scheda attiva", + "activateNextTab": "attiva la scheda successiva", + "activatePreviousTab": "attiva la scheda precedente", + "creatingNotes": "Creazione di note", + "createNoteAfter": "crea una nuova nota dopo quella attiva", + "createNoteInto": "crea una nuova sotto-nota nella nota attiva", + "editBranchPrefix": "modifica prefisso del clone della nota attiva", + "movingCloningNotes": "Spostamento / clonazione delle note", + "moveNoteUpDown": "spostare la nota verso l'alto/verso il basso nell'elenco delle note", + "moveNoteUpHierarchy": "spostare la nota verso l'alto nella gerarchia", + "multiSelectNote": "nota multi-selezione sopra/sotto", + "selectAllNotes": "seleziona tutte le note del livello corrente", + "selectNote": "seleziona nota", + "copyNotes": "copia la nota attiva (o la selezione corrente) negli appunti (utilizzata per la clonazione)", + "cutNotes": "taglia la nota corrente (o la selezione corrente) negli appunti (utilizzato per spostare le note)", + "pasteNotes": "Incolla le note come sotto-note nella nota attiva (che viene spostata o clonata a seconda che sia stata copiata o tagliata negli appunti)", + "deleteNotes": "eliminazione nota / sottoalbero", + "editingNotes": "Modifica delle note", + "editNoteTitle": "nel riquadro ad albero passa dal riquadro ad albero al titolo della nota. Premendo Invio dal titolo della nota, il focus passerà all'editor di testo. Ctrl+. riporterà il focus dall'editor al riquadro ad albero.", + "createEditLink": "crea / modifica collegamento esterno", + "createInternalLink": "creare un collegamento interno", + "followLink": "segui il link sotto il cursore", + "insertDateTime": "inserisci la data e l'ora correnti nella posizione del cursore", + "jumpToTreePane": "passa al riquadro dell'albero e scorri fino alla nota attiva", + "markdownAutoformat": "Formattazione automatica simile a Markdown", + "headings": "##, ###, #### ecc. seguiti da uno spazio per i titoli", + "bulletList": "* o - seguito da uno spazio per un elenco puntato", + "numberedList": "1. o 1) seguito da uno spazio per un elenco numerato", + "blockQuote": "inizia una riga con > seguito da uno spazio per il blocco di citazione", + "troubleshooting": "Risoluzione dei problemi", + "reloadFrontend": "ricarica il frontend Trilium", + "showDevTools": "mostra strumenti di sviluppo", + "showSQLConsole": "mostra console SQL", + "other": "Altro", + "quickSearch": "concentrati sull'input della ricerca rapida", + "inPageSearch": "ricerca all'interno della pagina" + }, + "i18n": { + "saturday": "Sabato", + "sunday": "Domenica", + "first-week-of-the-year": "Prima settimana dell'anno", + "first-week-contains-first-day": "La prima settimana contiene il primo giorno dell'anno", + "first-week-contains-first-thursday": "La prima settimana contiene il primo giovedì dell'anno", + "first-week-has-minimum-days": "La prima settimana ha giorni ridotti", + "min-days-in-first-week": "Giorni minimi nella prima settimana", + "first-week-info": "La prima settimana che contiene il primo giovedì dell'anno si basa su ISO 8601 standard.", + "first-week-warning": "La modifica delle opzioni della prima settimana può causare duplicati con le note settimanali esistenti e queste ultime non verranno aggiornate di conseguenza.", + "formatting-locale": "Formato data e numero", + "formatting-locale-auto": "In base alla lingua dell'applicazione", + "title": "Localizzazione", + "language": "Lingua", + "first-day-of-the-week": "Primo giorno della settimana", + "monday": "Lunedi", + "tuesday": "Martedì", + "wednesday": "Mercoledì", + "thursday": "Giovedì", + "friday": "Venerdì" + }, + "ai_llm": { + "n_notes_queued_0": "{{ count }} nota in coda per l'indicizzazione", + "n_notes_queued_1": "{{ count }} note in coda per l'indicizzazione", + "n_notes_queued_2": "{{ count }} note in coda per l'indicizzazione", + "notes_indexed_0": "{{ count }} nota indicizzata", + "notes_indexed_1": "{{ count }} note indicizzate", + "notes_indexed_2": "{{ count }} note indicizzate", + "not_started": "Non iniziato", + "title": "Impostazioni AI", + "processed_notes": "Note elaborate", + "total_notes": "Note totali", + "progress": "Progressi", + "queued_notes": "Note in coda", + "failed_notes": "Note non riuscite", + "last_processed": "Ultimo elaborato", + "refresh_stats": "Aggiorna statistiche", + "enable_ai_features": "Abilita le funzionalità AI/LLM", + "enable_ai_description": "Abilita funzionalità di intelligenza artificiale come il riepilogo delle note, la generazione di contenuti e altre funzionalità LLM", + "openai_tab": "OpenAI", + "anthropic_tab": "Antropico", + "voyage_tab": "Viaggio AI", + "ollama_tab": "Ollama", + "enable_ai": "Abilita le funzionalità AI/LLM", + "enable_ai_desc": "Abilita funzionalità di intelligenza artificiale come il riepilogo delle note, la generazione di contenuti e altre funzionalità LLM", + "provider_configuration": "Configurazione del fornitore di intelligenza artificiale", + "provider_precedence": "Precedenza del fornitore", + "provider_precedence_description": "Elenco dei provider separati da virgole in ordine di precedenza (ad esempio, 'openai,anthropic,ollama')", + "temperature": "Temperatura", + "temperature_description": "Controlla la casualità nelle risposte (0 = deterministico, 2 = casualità massima)", + "system_prompt": "Prompt di sistema", + "system_prompt_description": "Prompt di sistema predefinito utilizzato per tutte le interazioni con l'IA", + "openai_configuration": "Configurazione OpenAI", + "openai_settings": "Impostazioni OpenAI", + "api_key": "Chiave API", + "url": "URL di base", + "model": "Modello", + "openai_api_key_description": "La tua chiave API OpenAI per accedere ai loro servizi di intelligenza artificiale", + "anthropic_api_key_description": "La tua chiave API Anthropic per accedere ai modelli Claude", + "default_model": "Modello predefinito", + "openai_model_description": "Esempi: gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "base_url": "URL di base", + "openai_url_description": "Predefinito: https://api.openai.com/v1", + "anthropic_settings": "Ambientazioni antropiche", + "anthropic_url_description": "URL di base per l'API Anthropic (predefinito: https://api.anthropic.com)", + "anthropic_model_description": "Modelli di Anthropic Claude per il completamento della chat", + "voyage_settings": "Impostazioni AI di Voyage", + "ollama_settings": "Impostazioni Ollama", + "ollama_url_description": "URL per l'API Ollama (predefinito: http://localhost:11434)", + "ollama_model_description": "Modello Ollama da utilizzare per il completamento della chat", + "anthropic_configuration": "Configurazione antropica", + "voyage_configuration": "Configurazione AI di viaggio", + "voyage_url_description": "Predefinito: https://api.voyageai.com/v1", + "ollama_configuration": "Configurazione Ollama", + "enable_ollama": "Abilita Ollama", + "enable_ollama_description": "Abilita Ollama per l'utilizzo del modello AI locale", + "ollama_url": "URL di Ollama", + "ollama_model": "Modello Ollama", + "refresh_models": "Aggiorna modelli", + "refreshing_models": "Rinfrescante...", + "enable_automatic_indexing": "Abilita l'indicizzazione automatica", + "rebuild_index": "Ricostruisci indice", + "rebuild_index_error": "Errore durante l'avvio della ricostruzione dell'indice. Controllare i log per i dettagli.", + "note_title": "Titolo della nota", + "error": "Errore", + "last_attempt": "Ultimo tentativo", + "actions": "Azioni", + "retry": "Riprova", + "partial": "{{ percentuale }}% completato", + "retry_queued": "Nota in coda per un nuovo tentativo", + "retry_failed": "Impossibile mettere in coda la nota per un nuovo tentativo", + "max_notes_per_llm_query": "Numero massimo di note per query", + "max_notes_per_llm_query_description": "Numero massimo di note simili da includere nel contesto AI", + "active_providers": "Fornitori attivi", + "disabled_providers": "Fornitori disabili", + "remove_provider": "Rimuovi il fornitore dalla ricerca", + "restore_provider": "Ripristina il provider per la ricerca", + "similarity_threshold": "Soglia di similarità", + "similarity_threshold_description": "Punteggio minimo di similarità (0-1) per le note da includere nel contesto per le query LLM", + "reprocess_index": "Ricostruisci l'indice di ricerca", + "reprocessing_index": "Ricostruzione...", + "reprocess_index_started": "Ottimizzazione dell'indice di ricerca avviata in background", + "reprocess_index_error": "Errore durante la ricostruzione dell'indice di ricerca", + "index_rebuild_progress": "Progresso nella ricostruzione dell'indice", + "index_rebuilding": "Indice di ottimizzazione ({{percentuale}}%)", + "index_rebuild_complete": "Ottimizzazione dell'indice completata", + "index_rebuild_status_error": "Errore durante il controllo dello stato di ricostruzione dell'indice", + "never": "Mai", + "processing": "Elaborazione ({{percentuale}}%)", + "incomplete": "Incompleto ({{percentuale}}%)", + "complete": "Completato (100%)", + "refreshing": "Rinfrescante...", + "auto_refresh_notice": "Si aggiorna automaticamente ogni {{seconds}} secondi", + "note_queued_for_retry": "Nota in coda per un nuovo tentativo", + "failed_to_retry_note": "Impossibile riprovare nota", + "all_notes_queued_for_retry": "Tutte le note non riuscite sono in coda per un nuovo tentativo", + "failed_to_retry_all": "Impossibile riprovare le note", + "ai_settings": "Impostazioni AI", + "api_key_tooltip": "Chiave API per accedere al servizio", + "empty_key_warning": { + "anthropic": "La chiave API di Anthropic è vuota. Inserisci una chiave API valida.", + "openai": "La chiave API di OpenAI è vuota. Inserisci una chiave API valida.", + "voyage": "La chiave API di Voyage è vuota. Inserisci una chiave API valida.", + "ollama": "La chiave API di Ollama è vuota. Inserisci una chiave API valida." + }, + "agent": { + "processing": "Elaborazione in corso...", + "thinking": "Pensiero...", + "loading": "Caricamento...", + "generating": "Generazione in corso..." + }, + "name": "intelligenza artificiale", + "openai": "OpenAI", + "use_enhanced_context": "Utilizzare il contesto avanzato", + "enhanced_context_description": "Fornisce all'IA più contesto dalla nota e dalle note correlate per risposte migliori", + "show_thinking": "Mostra il pensiero", + "show_thinking_description": "Mostra la catena del processo di pensiero dell'IA", + "enter_message": "Inserisci il tuo messaggio...", + "error_contacting_provider": "Errore durante la connessione al fornitore dell'IA. Controlla le impostazioni e la connessione Internet.", + "error_generating_response": "Errore durante la generazione della risposta AI", + "index_all_notes": "Indice Tutte le note", + "index_status": "Stato dell'indice", + "indexed_notes": "Note indicizzate", + "indexing_stopped": "Indicizzazione interrotta", + "indexing_in_progress": "Indicizzazione in corso...", + "last_indexed": "Ultimo indicizzato", + "n_notes_queued": "{{ count }} nota in coda per l'indicizzazione", + "note_chat": "Nota Chat", + "notes_indexed": "{{ count }} nota indicizzata", + "sources": "Fonti", + "start_indexing": "Avvia l'indicizzazione", + "use_advanced_context": "Usa contesto avanzato", + "ollama_no_url": "Ollama non è configurato. Inserisci un URL valido.", + "chat": { + "root_note_title": "Chat AI", + "root_note_content": "Questa nota contiene le conversazioni della chat AI salvate.", + "new_chat_title": "Nuova chat", + "create_new_ai_chat": "Crea una nuova chat AI" + }, + "create_new_ai_chat": "Crea una nuova chat AI", + "configuration_warnings": "Ci sono alcuni problemi con la configurazione dell'IA. Controlla le impostazioni.", + "experimental_warning": "La funzionalità LLM è attualmente sperimentale: sei stato avvisato.", + "selected_provider": "Fornitore selezionato", + "selected_provider_description": "Scegli il fornitore di intelligenza artificiale per le funzionalità di chat e completamento", + "select_model": "Seleziona il modello...", + "select_provider": "Seleziona il fornitore...", + "ai_enabled": "Funzionalità AI abilitate", + "ai_disabled": "Funzionalità AI disabilitate", + "no_models_found_online": "Nessun modello trovato. Controlla la tua chiave API e le impostazioni.", + "no_models_found_ollama": "Nessun modello Ollama trovato. Controlla se Ollama è in esecuzione.", + "error_fetching": "Errore durante il recupero dei modelli: {{error}}" + }, + "import": { + "importIntoNote": "Importa nella nota", + "chooseImportFile": "Scegli file di importazione", + "importDescription": "Il contenuto dei file selezionati verranno importati come note secondarie in", + "options": "Opzioni", + "safeImportTooltip": "I file di esportazione Trilium .zip possono contenere script eseguibili che potrebbero avere comportamenti dannosi. L'importazione sicura disattiverà l'esecuzione automatica di tutti gli script importati. Deseleziona “Importazione sicura” solo se l'archivio importato dovrebbe contenere script eseguibili e ti fidi completamente del contenuto del file di importazione.", + "safeImport": "Importazione sicura", + "explodeArchivesTooltip": "Se questa opzione è selezionata, Trilium leggerà i file .zip, .enex e .opml e creerà delle note dai file contenuti in tali archivi. Se l'opzione non è selezionata, Trilium allegherà gli archivi stessi alla nota.", + "shrinkImages": "Riduci immagini", + "explodeArchives": "Leggi il contenuto degli archivi .zip, .enex e .opml .", + "html_import_tags": { + "title": "Tag di importazione HTML", + "description": "Configura quali tag HTML devono essere mantenuti durante l'importazione delle note. I tag che non sono presenti in questo elenco verranno rimossi durante l'importazione. Alcuni tag (come 'script') vengono sempre rimossi per motivi di sicurezza.", + "placeholder": "Inserisci i tag HTML, uno per riga", + "reset_button": "Ripristina elenco predefinito" + }, + "import-status": "Stato importazione", + "in-progress": "Importazione in corso: {{progress}}", + "successful": "Importazione completata con successo.", + "shrinkImagesTooltip": "

Se selezioni questa opzione, Trilium tenterà di ridurre le immagini importate tramite ridimensionamento e ottimizzazione, il che potrebbe influire sulla qualità percepita dell’immagine. Se non selezionata, le immagini verranno importate senza modifiche.

Questo non si applica alle importazioni .zip con metadati, poiché si presume che questi file siano già ottimizzati.

", + "textImportedAsText": "Importa HTML, Markdown e TXT come note di testo se non è chiaro dai metadati", + "codeImportedAsCode": "Importa i file di codice riconosciuti (ad esempio .json) come note di codice se non è chiaro dai metadati", + "replaceUnderscoresWithSpaces": "Sostituisci i trattini bassi con spazi nei nomi delle note importate", + "import": "Importa", + "failed": "Importazione fallita: {{message}}." + }, + "include_note": { + "dialog_title": "Includi nota", + "label_note": "Note", + "placeholder_search": "cerca una nota per nome", + "box_size_prompt": "Dimensione della casella della nota inclusa:", + "box_size_small": "piccola (~ 10 righe)", + "box_size_medium": "media (~ 30 righe)", + "box_size_full": "completa (la casella mostra il testo completo)", + "button_include": "Includi nota" + }, + "jump_to_note": { + "search_placeholder": "Cerca una nota per nome oppure digita > per i comandi...", + "search_button": "Cerca nel testo completo" + }, + "markdown_import": { + "dialog_title": "Importazione Markdown", + "modal_body_text": "A causa del sandbox del browser non è possibile leggere direttamente gli appunti tramite JavaScript. Incolla il Markdown da importare nell'area di testo sottostante e clicca sul pulsante Importa", + "import_button": "Importa", + "import_success": "Il contenuto Markdown è stato importato nel documento." + }, + "move_to": { + "target_parent_note": "Nota principale di destinazione", + "dialog_title": "Sposta note in ...", + "notes_to_move": "Note da spostare", + "search_placeholder": "cerca una nota per nome", + "move_button": "Sposta nella nota selezionata", + "error_no_path": "Nessun percorso in cui spostarsi.", + "move_success_message": "Le note selezionate sono state spostate in " + }, + "note_type_chooser": { + "change_path_prompt": "Cambia dove creare la nuova nota:", + "search_placeholder": "cerca percorso per nome (predefinito se vuoto)", + "modal_title": "Scegli il tipo di nota", + "modal_body": "Scegli il tipo / modello della nuova nota:", + "templates": "Modelli", + "builtin_templates": "Modelli incorporati" + }, + "prompt": { + "title": "Richiesta", + "ok": "OK", + "defaultTitle": "Richiesta" + }, + "recent_changes": { + "title": "Modifiche recenti", + "erase_notes_button": "Cancella ora le note eliminate", + "deleted_notes_message": "Le note eliminate sono state cancellate.", + "no_changes_message": "Nessuna modifica ancora...", + "undelete_link": "ripristinare", + "confirm_undelete": "Vuoi ripristinare questa nota e le sue sotto-note?" + }, + "revisions": { + "note_revisions": "Note Revisioni", + "delete_all_revisions": "Elimina tutte le revisioni di questa nota", + "delete_all_button": "Elimina tutte le revisioni", + "help_title": "Aiuto sulle revisioni delle note", + "revision_last_edited": "Questa revisione è stata modificata l'ultima volta il {{date}}", + "confirm_delete_all": "Vuoi eliminare tutte le revisioni di questa nota?", + "no_revisions": "Ancora nessuna revisione per questa nota...", + "restore_button": "Ripristina", + "diff_on": "Mostra differenze", + "diff_off": "Mostra contenuto", + "diff_on_hint": "Clicca per mostrare la fonte della nota diff", + "diff_off_hint": "Clicca per visualizzare il contenuto della nota", + "diff_not_available": "Diff non è disponibile.", + "confirm_restore": "Vuoi ripristinare questa revisione? Questo sovrascriverà il titolo e il contenuto attuali della nota con questa revisione.", + "delete_button": "Elimina", + "confirm_delete": "Vuoi eliminare questa revisione?", + "revisions_deleted": "Le revisioni delle note sono state eliminate.", + "revision_restored": "La revisione della nota è stata ripristinata.", + "revision_deleted": "La revisione della nota è stata eliminata.", + "snapshot_interval": "Nota Intervallo di revisione istantanea: {{seconds}}.", + "maximum_revisions": "Nota Limite istantaneo di revisione: {{number}}.", + "settings": "Nota Impostazioni di revisione", + "download_button": "Scarica", + "mime": "MIME: ", + "file_size": "Dimensione del file:", + "preview": "Anteprima:", + "preview_not_available": "L'anteprima non è disponibile per questo tipo di nota." + }, + "sort_child_notes": { + "sort_children_by": "Ordina i bambini per...", + "sorting_criteria": "Criteri di ordinamento", + "title": "titolo", + "date_created": "data di creazione", + "date_modified": "data di modifica", + "sorting_direction": "Direzione", + "ascending": "ascendente", + "descending": "discendente", + "folders": "Cartelle", + "sort_folders_at_top": "ordina le cartelle in alto", + "natural_sort": "Ordinamento naturale", + "sort_with_respect_to_different_character_sorting": "ordinare in base alle diverse regole di ordinamento e collazione dei caratteri nelle diverse lingue o regioni.", + "natural_sort_language": "Linguaggio di ordinamento naturale", + "the_language_code_for_natural_sort": "Il codice lingua per l'ordinamento naturale, ad esempio \"zh-CN\" per il cinese.", + "sort": "Ordina" + }, + "upload_attachments": { + "upload_attachments_to_note": "Carica allegati alla nota", + "choose_files": "Scegli i file", + "files_will_be_uploaded": "I file saranno caricati come allegati in {{noteTitle}}", + "options": "Opzioni", + "shrink_images": "Riduci immagini", + "upload": "Carica", + "tooltip": "Se selezioni questa opzione, Trilium tenterà di ridurre le immagini caricate tramite ridimensionamento e ottimizzazione, il che potrebbe influire sulla qualità percepita delle immagini. Se non selezionata, le immagini verranno caricate senza modifiche." + }, + "attribute_detail": { + "attr_detail_title": "Titolo dettagli attributo", + "close_button_title": "Annulla modifiche e chiudi", + "attr_is_owned_by": "L'attributo è di proprietà di", + "attr_name_title": "Il nome dell'attributo può essere composto solo da caratteri alfanumerici, due punti e trattino basso", + "name": "Nome", + "app_theme_base": "impostare su \"next\", \"next-light\" o \"next-dark\" per utilizzare il tema TriliumNext corrispondente (automatico, chiaro o scuro) come base per un tema personalizzato, invece di quello precedente.", + "css_class": "Il valore di questa etichetta viene quindi aggiunto come classe CSS al nodo che rappresenta una determinata nota nell'albero. Ciò può essere utile per la personalizzazione avanzata dei temi. Può essere utilizzato nelle note dei modelli.", + "icon_class": "Il valore di questa etichetta viene aggiunto come classe CSS all'icona sull'albero, il che può aiutare a distinguere visivamente le note nell'albero. Un esempio potrebbe essere bx bx-home - le icone sono prese da boxicons. Può essere utilizzato nelle note del modello.", + "page_size": "numero di elementi per pagina nell'elenco delle note", + "custom_request_handler": "vedi Gestore richieste personalizzato", + "custom_resource_provider": "vedi Gestore richieste personalizzato", + "widget": "contrassegna questa nota come widget personalizzato che verrà aggiunto all'albero dei componenti Trilium", + "workspace": "contrassegna questa nota come area di lavoro che consente un facile ancoraggio", + "workspace_icon_class": "definisce la classe CSS dell'icona della casella che verrà utilizzata nella scheda quando viene sollevata su questa nota", + "workspace_tab_background_color": "Colore CSS utilizzato nella scheda delle note quando viene sollevato su questa nota", + "workspace_calendar_root": "Definisce la radice del calendario per ogni area di lavoro", + "workspace_template": "Questa nota apparirà nella selezione dei modelli disponibili quando si crea una nuova nota, ma solo se inserita in un'area di lavoro che contiene questo modello", + "search_home": "verranno create nuove note di ricerca come sottovoci di questa nota", + "value": "Valore", + "target_note_title": "La relazione è una connessione denominata tra la nota di origine e la nota di destinazione.", + "target_note": "Nota obiettivo", + "promoted_title": "L'attributo promosso viene visualizzato in modo ben visibile sulla nota.", + "promoted": "Promosso", + "promoted_alias_title": "Il nome da visualizzare nell'interfaccia utente degli attributi promossi.", + "promoted_alias": "Alias", + "multiplicity_title": "La molteplicità definisce quanti attributi con lo stesso nome possono essere creati: al massimo 1 o più di 1.", + "multiplicity": "Molteplicità", + "single_value": "Valore singolo", + "multi_value": "Valore multiplo", + "label_type_title": "Il tipo di etichetta aiuterà Trilium a scegliere l'interfaccia adatta per inserire il valore dell'etichetta.", + "label_type": "Tipo", + "text": "Testo", + "number": "Numero", + "boolean": "Booleano", + "date": "Data", + "date_time": "Data e Ora", + "time": "Ora", + "url": "URL", + "precision_title": "Quante cifre dopo la virgola mobile dovrebbero essere disponibili nell'interfaccia di impostazione del valore.", + "precision": "Precisione", + "digits": "cifre", + "inverse_relation_title": "Impostazione facoltativa per definire a quale relazione è opposta questa. Esempio: padre e figlio sono relazioni inverse l'una rispetto all'altra.", + "inheritable": "Ereditabile", + "inverse_relation": "Relazione inversa", + "inheritable_title": "L'attributo ereditario verrà ereditato da tutti i discendenti sotto questo albero.", + "save_and_close": "Salva e chiudi Ctrl+Enter", + "delete": "Eliminazione", + "related_notes_title": "Altre note con questa etichetta", + "more_notes": "Altre note", + "label": "Dettagli etichetta", + "label_definition": "Dettagli definizione etichetta", + "relation": "Dettagli relazione", + "relation_definition": "Dettagli definizione relazione", + "disable_versioning": "disabilita il versioning automatico. Utile ad esempio per note di grandi dimensioni ma non importanti, come le grandi librerie JS utilizzate per lo scripting", + "calendar_root": "segna le note che devono essere utilizzate come note principali per le note giornaliere. Solo una deve essere contrassegnata come tale.", + "archived": "Le note con questa etichetta non saranno visibili per impostazione predefinita nei risultati di ricerca (anche nelle finestre di dialogo Vai a, Aggiungi collegamento ecc.).", + "run_on_instance": "Definire su quale istanza di Trilium eseguire questa operazione. L'impostazione predefinita è tutte le istanze.", + "exclude_from_export": "le note (con la loro sottostruttura) non saranno incluse in nessuna esportazione di note", + "run": "definisce su quali eventi deve essere eseguito lo script. I valori possibili sono:\n
    \n
  • frontendStartup - quando il frontend Trilium viene avviato (o aggiornato), ma non su dispositivi mobili.
  • \n
  • mobileStartup - quando il frontend Trilium viene avviato (o aggiornato) su dispositivi mobili.
  • \n
  • backendStartup - quando viene avviato il backend Trilium
  • \n
  • hourly - eseguire una volta all'ora. È possibile utilizzare l'etichetta aggiuntiva runAtHour per specificare a che ora.
  • \n
  • daily - eseguire una volta al giorno
  • \n
", + "run_at_hour": "A che ora deve essere eseguito. Deve essere utilizzato insieme a #run=hourly. Può essere definito più volte per più esecuzioni durante il giorno.", + "disable_inclusion": "gli script con questa etichetta non saranno inclusi nell'esecuzione dello script principale.", + "sorted": "mantiene le note figlie ordinate alfabeticamente per titolo", + "sort_direction": "ASC (impostazione predefinita) o DESC", + "sort_folders_first": "Le cartelle (note con figlie) devono essere ordinate in cima", + "top": "mantieni la nota in cima al suo genitore (si applica solo ai genitori ordinati)", + "hide_promoted_attributes": "Nascondi gli attributi promossi in questa nota", + "read_only": "L'editor è in modalità di sola lettura. Funziona solo per note di testo e codice.", + "auto_read_only_disabled": "Le note di testo/codice possono essere impostate automaticamente in modalità di lettura quando sono troppo grandi. È possibile disabilitare questo comportamento per ogni singola nota aggiungendo questa etichetta alla nota", + "app_css": "contrassegna le note CSS che vengono caricate nell'applicazione Trilium e possono quindi essere utilizzate per modificare l'aspetto di Trilium.", + "app_theme": "contrassegna le note CSS che sono temi Trilium completi e sono quindi disponibili nelle opzioni Trilium.", + "workspace_search_home": "nuove note di ricerca verranno create come figlie di questa nota quando sollevate a qualche antenato di questa nota dell'area di lavoro", + "inbox": "Posizione predefinita della casella di posta in arrivo per le nuove note: quando crei una nota utilizzando il pulsante \"Nuova nota\" nella barra laterale, le note verranno create come note secondarie nella nota contrassegnata con l'etichetta #inbox.", + "workspace_inbox": "posizione predefinita della casella di posta in arrivo per le nuove note quando vengono trasferite a un antenato di questa nota dell'area di lavoro", + "sql_console_home": "posizione predefinita delle note della console SQL", + "bookmark_folder": "le note con questa etichetta appariranno nei segnalibri come cartelle (consentendo l'accesso ai loro elementi secondari)", + "share_hidden_from_tree": "questa nota è nascosta dall'albero di navigazione a sinistra, ma è comunque accessibile tramite il suo URL", + "share_external_link": "La nota fungerà da collegamento a un sito web esterno nell'albero di condivisione", + "share_alias": "definisci un alias con cui la nota sarà disponibile all'indirizzo https://your_trilium_host/share/[your_alias]", + "share_omit_default_css": "Il CSS predefinito della pagina di condivisione verrà omesso. Utilizzarlo quando si apportano modifiche stilistiche significative.", + "keep_current_hoisting": "L'apertura di questo link non modificherà l'ancoraggio anche se la nota non è visualizzabile nell'attuale sottoalbero ancorato.", + "share_description": "definire il testo da aggiungere al meta tag HTML per la descrizione", + "share_raw": "La nota verrà visualizzata nel suo formato originale, senza wrapper HTML", + "share_disallow_robot_indexing": "impedirà l'indicizzazione robotica di questa nota tramite l'intestazione X-Robots-Tag: noindex", + "share_credentials": "richiedono credenziali per accedere a questa nota condivisa. Il valore deve essere nel formato 'username:password'. Non dimenticare di renderlo ereditabile affinché si applichi alle note/immagini secondarie.", + "share_index": "La nota con questa etichetta elencherà tutte le radici delle note condivise", + "display_relations": "nomi delle relazioni delimitati da virgola che devono essere visualizzati. Tutti gli altri saranno nascosti.", + "hide_relations": "nomi delle relazioni delimitati da virgola che devono essere nascosti. Tutti gli altri saranno visualizzati.", + "title_template": "titolo predefinito delle note create come figlie di questa nota. Il valore viene valutato come stringa JavaScript. \n e quindi può essere arricchito con contenuti dinamici tramite le variabili now e parentNote inserite. Esempi:\n \n
    \n
  • ${parentNote.getLabelValue('authorName')}'s opere letterarie
  • \n
  • Log per ${now.format('YYYY-MM-DD HH:mm:ss')}
  • \n
\n \n Per ulteriori dettagli, consultare wiki con i dettagli, la documentazione API per parentNote e now.", + "template": "Questa nota apparirà nella selezione dei modelli disponibili durante la creazione di una nuova nota", + "toc": "#toc o #toc=show forzeranno la visualizzazione del sommario, mentre #toc=hide ne forzerà la non visualizzazione. Se l'etichetta non esiste, verrà applicata l'impostazione globale", + "color": "definisce il colore della nota nell'albero delle note, nei link ecc. Utilizza qualsiasi valore di colore CSS valido come \"red\" o #a13d5f", + "keyboard_shortcut": "Definisce una scorciatoia da tastiera che consentirà di passare immediatamente a questa nota. Esempio: \"ctrl+alt+e\". Per rendere effettiva la modifica è necessario ricaricare il frontend.", + "execute_button": "Titolo del pulsante che eseguirà il codice della nota corrente", + "execute_description": "Descrizione più dettagliata della nota di codice corrente visualizzata insieme al pulsante di esecuzione", + "exclude_from_note_map": "Le note con questa etichetta saranno nascoste dalla mappa delle note", + "new_notes_on_top": "Le nuove note verranno create nella parte superiore della nota principale, non nella parte inferiore.", + "hide_highlight_widget": "Nascondi widget Elenco evidenziazioni", + "run_on_note_creation": "Viene eseguito quando viene creata una nota sul backend. Utilizza questa relazione se desideri eseguire lo script per tutte le note create in una sottostruttura specifica. In tal caso, crealo sulla nota radice della sottostruttura e rendilo ereditabile. Una nuova nota creata all'interno della sottostruttura (a qualsiasi profondità) attiverà lo script.", + "run_on_child_note_creation": "viene eseguito quando viene creata una nuova nota sotto la nota in cui è definita questa relazione", + "run_on_note_title_change": "viene eseguito quando viene modificato il titolo della nota (include anche la creazione della nota)", + "run_on_note_content_change": "Viene eseguito quando il contenuto della nota viene modificato (compresa la creazione della nota).", + "run_on_note_change": "Viene eseguito quando la nota viene modificata (compresa la creazione della nota). Non include le modifiche al contenuto", + "run_on_note_deletion": "viene eseguito quando la nota viene eliminata", + "run_on_branch_creation": "Viene eseguito quando viene creato un ramo. Il ramo è un collegamento tra la nota principale e la nota secondaria e viene creato, ad esempio, quando si clona o si sposta una nota.", + "run_on_branch_change": "viene eseguito quando un ramo viene aggiornato.", + "run_on_branch_deletion": "Viene eseguito quando viene eliminato un ramo. Il ramo è un collegamento tra una nota padre e una nota figlio e viene eliminato, ad esempio, quando si sposta una nota (il vecchio ramo/collegamento viene eliminato).", + "run_on_attribute_creation": "viene eseguito quando viene creato un nuovo attributo per la nota che definisce questa relazione", + "run_on_attribute_change": " viene eseguito quando viene modificato l'attributo di una nota che definisce questa relazione. Viene attivato anche quando l'attributo viene eliminato", + "relation_template": "Gli attributi della nota saranno ereditati anche senza una relazione padre-figlio, mentre il contenuto e la sottostruttura della nota saranno aggiunti alle note dell'istanza se vuote. Per ulteriori dettagli, consultare la documentazione.", + "inherit": "Gli attributi della nota saranno ereditati anche senza una relazione padre-figlio. Vedi relazione modello per un concetto simile. Vedi eredità degli attributi nella documentazione.", + "render_note": "le note di tipo \"renderizza nota HTML\" saranno renderizzate utilizzando una nota codice (HTML o script) ed è necessario indicare utilizzando questa relazione quale nota deve essere renderizzata", + "widget_relation": "L'obiettivo di questa relazione verrà eseguito e visualizzato come widget nella barra laterale", + "share_css": "Nota CSS che verrà inserita nella pagina condivisa. Anche la nota CSS deve trovarsi nella sottostruttura condivisa. Valuta anche l'utilizzo di 'share_hidden_from_tree' e 'share_omit_default_css'.", + "share_js": "Nota JavaScript che verrà inserita nella pagina di condivisione. Anche la nota JS deve trovarsi nella sottostruttura condivisa. Valuta l'utilizzo di 'share_hidden_from_tree'.", + "share_template": "Nota JavaScript incorporata che verrà utilizzata come modello per la visualizzazione della nota condivisa. Se non disponibile, verrà utilizzato il modello predefinito. Si consiglia di utilizzare 'share_hidden_from_tree'.", + "share_favicon": "Nota Favicon da impostare nella pagina condivisa. In genere è preferibile impostarla su \"condivisione radice\" e renderla ereditabile. Anche la nota Favicon deve trovarsi nella sottostruttura condivisa. Valutare l'utilizzo di 'share_hidden_from_tree'.", + "is_owned_by_note": "è di proprietà di nota", + "other_notes_with_name": "Altre note con {{attributeType}} nome \"{{attributeName}}\"", + "and_more": "... e altri {{count}}.", + "print_landscape": "Quando si esporta in PDF, cambia l'orientamento della pagina da verticale a orizzontale.", + "print_page_size": "Quando si esporta in PDF, modifica le dimensioni della pagina. Valori supportati: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.", + "color_type": "Colore", + "share_root": "segna la nota che viene servita su /share root." + }, + "attribute_editor": { + "help_text_body1": "Per aggiungere un'etichetta, basta digitare ad esempio #rock oppure, se si desidera aggiungere anche un valore, ad esempio #year = 2020", + "help_text_body2": "Per la relazione, digita ~author = @, che dovrebbe far apparire un completamento automatico in cui puoi cercare la nota desiderata.", + "help_text_body3": "In alternativa, è possibile aggiungere etichette e relazioni utilizzando il pulsante + sul lato destro.", + "save_attributes": "Salva attributi ", + "add_a_new_attribute": "Aggiungi un nuovo attributo", + "add_new_label": "Aggiungi nuova etichetta ", + "add_new_relation": "Aggiungi nuova relazione ", + "add_new_relation_definition": "Aggiungi una nuova definizione di relazione", + "placeholder": "Digitare qui le etichette e le relazioni", + "add_new_label_definition": "Aggiungi nuova definizione di etichetta" + }, + "execute_script": { + "execute_script": "Esegui script", + "help_text": "È possibile eseguire semplici script sulle note abbinate.", + "example_1": "Ad esempio, per aggiungere una stringa al titolo di una nota, utilizzare questo piccolo script:", + "example_2": "Un esempio più complesso sarebbe l'eliminazione di tutti gli attributi delle note corrispondenti:" + }, + "rename_label": { + "rename_label": "Rinomina etichetta", + "rename_label_from": "Rinomina etichetta da", + "old_name_placeholder": "vecchio nome", + "to": "A", + "new_name_placeholder": "nuovo nome", + "name_title": "Sono consentiti caratteri alfanumerici, trattino basso e due punti." + }, + "delete_note": { + "delete_note": "Elimina nota", + "delete_matched_notes": "Elimina le note corrispondenti", + "delete_matched_notes_description": "In questo modo verranno eliminate le note corrispondenti.", + "undelete_notes_instruction": "Dopo l'eliminazione, è possibile ripristinarli dalla finestra di dialogo Modifiche recenti.", + "erase_notes_instruction": "Per cancellare definitivamente le note, dopo l'eliminazione puoi andare su Opzioni -> Altro e cliccare sul pulsante \"Cancella note eliminate ora\"." + }, + "delete_revisions": { + "delete_note_revisions": "Elimina le revisioni delle note", + "all_past_note_revisions": "Tutte le revisioni passate delle note corrispondenti verranno eliminate. La nota stessa verrà conservata integralmente. In altri termini, la cronologia della nota verrà rimossa." + }, + "move_note": { + "move_note": "Sposta nota", + "to": "A", + "target_parent_note": "nota del genitore di destinazione", + "on_all_matched_notes": "Su tutte le note abbinate", + "move_note_new_parent": "sposta la nota al nuovo genitore se la nota ha un solo genitore (ad esempio, il vecchio ramo viene rimosso e viene creato un nuovo ramo nel nuovo genitore)", + "clone_note_new_parent": "clona la nota sul nuovo genitore se la nota ha più cloni/rami (non è chiaro quale ramo debba essere rimosso)", + "nothing_will_happen": "non accadrà nulla se la nota non può essere spostata sulla nota di destinazione (cioè ciò creerebbe un ciclo ad albero)" + }, + "rename_note": { + "rename_note": "Rinomina nota", + "rename_note_title_to": "Rinomina il titolo della nota in", + "new_note_title": "nuovo titolo della nota", + "click_help_icon": "Fare clic sull'icona della guida a destra per vedere tutte le opzioni", + "evaluated_as_js_string": "Il valore specificato viene valutato come stringa JavaScript e può quindi essere arricchito con contenuto dinamico tramite la variabile note inserita (la nota viene rinominata). Esempi:", + "example_note": "Nota - tutte le note corrispondenti vengono rinominate in 'Nota'", + "example_new_title": "NEW: ${note.title} - i titoli delle note corrispondenti sono preceduti dal prefisso 'NEW:'", + "example_date_prefix": "${note.dateCreatedObj.format('MM-DD:')}: ${note.title} - le note corrispondenti sono precedute dal mese e dalla data di creazione della nota", + "api_docs": "Per i dettagli, consultare la documentazione API per nota e le sue proprietà dateCreatedObj / utcDateCreatedObj." + }, + "add_relation": { + "add_relation": "Aggiungi relazione", + "relation_name": "nome della relazione", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "to": "A", + "target_note": "nota di destinazione", + "create_relation_on_all_matched_notes": "Su tutte le note corrispondenti crea la relazione data." + }, + "delete_relation": { + "delete_relation": "Elimina relazione", + "relation_name": "nome della relazione", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti." + }, + "rename_relation": { + "rename_relation": "Rinomina relazione", + "rename_relation_from": "Rinomina la relazione da", + "old_name": "vecchio nome", + "to": "A", + "new_name": "nuovo nome", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti." + }, + "update_relation_target": { + "update_relation": "Aggiorna relazione", + "relation_name": "nome della relazione", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "to": "A", + "target_note": "nota di destinazione", + "on_all_matched_notes": "Su tutte le note abbinate", + "change_target_note": "cambia la nota di destinazione della relazione esistente", + "update_relation_target": "Aggiorna la destinazione della relazione" + }, + "attachments_actions": { + "open_externally": "Aperto esternamente", + "open_externally_title": "Il file verrà aperto in un'applicazione esterna e monitorato per eventuali modifiche. Potrai quindi caricare la versione modificata su Trilium.", + "open_custom": "Apri personalizzato", + "open_custom_title": "Il file verrà aperto in un'applicazione esterna e monitorato per eventuali modifiche. Potrai quindi caricare la versione modificata su Trilium.", + "download": "Scaricamento", + "rename_attachment": "Rinomina allegato", + "upload_new_revision": "Carica nuova revisione", + "copy_link_to_clipboard": "Copia il collegamento negli appunti", + "convert_attachment_into_note": "Convertire l'allegato in nota", + "delete_attachment": "Elimina allegato", + "upload_success": "È stata caricata una nuova revisione dell'allegato.", + "upload_failed": "Caricamento di una nuova revisione dell'allegato non riuscito.", + "open_externally_detail_page": "L'apertura esterna dell'allegato è disponibile solo dalla pagina dei dettagli. Per prima cosa, fare clic sui dettagli dell'allegato e ripetere l'operazione.", + "open_custom_client_only": "L'apertura personalizzata degli allegati può essere effettuata solo dal client desktop.", + "delete_confirm": "Sei sicuro di voler eliminare l'allegato '{{title}}'?", + "delete_success": "L'allegato '{{title}}' è stato eliminato.", + "convert_confirm": "Sei sicuro di voler convertire l'allegato '{{title}}' in una nota separata?", + "convert_success": "L'allegato '{{title}}' è stato convertito in nota.", + "enter_new_name": "Inserisci il nome del nuovo allegato" + }, + "calendar": { + "mon": "Lun", + "tue": "Mar", + "wed": "Mer", + "thu": "Gio", + "fri": "Ven", + "sat": "Sab", + "sun": "Dom", + "cannot_find_day_note": "Impossibile trovare la nota del giorno", + "cannot_find_week_note": "Impossibile trovare la nota della settimana", + "january": "Gennaio", + "february": "Febbraio", + "march": "Marzo", + "april": "aprile", + "may": "Maggio", + "june": "Giugno", + "july": "Luglio", + "august": "agosto", + "september": "settembre", + "october": "ottobre", + "november": "novembre", + "december": "Dicembre", + "week": "Settimana", + "week_previous": "Settimana precedente", + "week_next": "La prossima settimana", + "month": "Mese", + "month_previous": "Mese precedente", + "month_next": "Il mese prossimo", + "year": "Anno", + "year_previous": "Anno precedente", + "year_next": "L'anno prossimo", + "list": "Lista", + "today": "Oggi" + }, + "close_pane_button": { + "close_this_pane": "Chiudi questo riquadro" + }, + "create_pane_button": { + "create_new_split": "Crea una nuova divisione" + }, + "show_toc_widget_button": { + "show_toc": "Mostra indice" + }, + "show_highlights_list_widget_button": { + "show_highlights_list": "Mostra elenco punti salienti" + }, + "global_menu": { + "menu": "Menu", + "options": "Opzioni", + "open_new_window": "Apri una nuova finestra", + "switch_to_mobile_version": "Passa alla versione mobile", + "switch_to_desktop_version": "Passa alla versione desktop", + "zoom": "Zoom", + "toggle_fullscreen": "Attiva schermo intero", + "zoom_out": "Rimpicciolisci", + "reset_zoom_level": "Ripristina livello di zoom", + "zoom_in": "Ingrandisci", + "configure_launchbar": "Configura Launchbar", + "show_shared_notes_subtree": "Mostra sottoalbero note condivise", + "advanced": "Avanzato", + "open_dev_tools": "Strumenti di sviluppo aperti", + "open_sql_console": "Apri la console SQL", + "open_sql_console_history": "Apri la cronologia della console SQL", + "open_search_history": "Apri cronologia ricerche", + "show_backend_log": "Mostra registro backend", + "reload_hint": "Ricarica può aiutare a risolvere alcuni problemi visivi senza dover riavviare l'intera app.", + "reload_frontend": "Ricarica Frontend", + "show_hidden_subtree": "Mostra sottoalbero nascosto", + "show_help": "Mostra aiuto", + "about": "Informazioni su Trilium Notes", + "logout": "Esci", + "show-cheatsheet": "Mostra il foglietto illustrativo", + "toggle-zen-mode": "Modalità Zen", + "new-version-available": "Nuovo aggiornamento disponibile", + "download-update": "Ottieni la versione {{latestVersion}}" + }, + "zen_mode": { + "button_exit": "Esci dalla modalità Zen" + }, + "sync_status": { + "unknown": "

Lo stato della sincronizzazione sarà noto una volta avviato il prossimo tentativo di sincronizzazione.

Fai clic per avviare la sincronizzazione ora.

", + "connected_with_changes": "

Connesso al server di sincronizzazione.
Ci sono ancora alcune modifiche in sospeso da sincronizzare.

Fai clic per avviare la sincronizzazione.

", + "connected_no_changes": "

Connesso al server di sincronizzazione.
Tutte le modifiche sono già state sincronizzate.

Fai clic per avviare la sincronizzazione.

", + "disconnected_with_changes": "

La connessione al server di sincronizzazione non è riuscita.
Ci sono alcune modifiche in sospeso che devono ancora essere sincronizzate.

Fai clic per avviare la sincronizzazione.

", + "disconnected_no_changes": "

La connessione al server di sincronizzazione non è riuscita.
Tutte le modifiche note sono state sincronizzate.

Fai clic per avviare la sincronizzazione.

", + "in_progress": "La sincronizzazione con il server è in corso." + }, + "left_pane_toggle": { + "show_panel": "Mostra pannello", + "hide_panel": "Nascondi pannello" + }, + "move_pane_button": { + "move_left": "Spostati a sinistra", + "move_right": "Spostati a destra" + }, + "note_actions": { + "convert_into_attachment": "Convertire in allegato", + "re_render_note": "Nota di ri-renderizzazione", + "search_in_note": "Cerca nella nota", + "note_source": "Nota fonte", + "note_attachments": "Allegati di note", + "open_note_externally": "Apri nota esternamente", + "open_note_externally_title": "Il file verrà aperto in un'applicazione esterna e monitorato per eventuali modifiche. Potrai quindi caricare la versione modificata su Trilium.", + "open_note_custom": "Apri nota personalizzata", + "import_files": "Importa file", + "export_note": "Nota di esportazione", + "delete_note": "Elimina nota", + "print_note": "Stampa nota", + "save_revision": "Salva la revisione", + "convert_into_attachment_failed": "Conversione della nota '{{title}}' fallita.", + "convert_into_attachment_successful": "Nota '{{title}}' è stato convertito in allegato.", + "convert_into_attachment_prompt": "Sei sicuro di voler convertire la nota '{{title}}' in un allegato della nota padre?", + "print_pdf": "Esporta come PDF..." + }, + "onclick_button": { + "no_click_handler": "Il widget pulsante '{{componentId}}' non ha un gestore di clic definito" + }, + "protected_session_status": { + "active": "La sessione protetta è attiva. Clicca per uscire dalla sessione protetta.", + "inactive": "Clicca per entrare nella sessione protetta" + }, + "revisions_button": { + "note_revisions": "Revisioni delle note" + }, + "update_available": { + "update_available": "Aggiornamento disponibile" + }, + "note_launcher": { + "this_launcher_doesnt_define_target_note": "Questo launcher non definisce la nota di destinazione." + }, + "code_buttons": { + "execute_button_title": "Esegui script", + "trilium_api_docs_button_title": "Apri la documentazione API di Trilium", + "save_to_note_button_title": "Salva per annotare", + "opening_api_docs_message": "Apertura dei documenti API...", + "sql_console_saved_message": "La nota della console SQL è stata salvata in {{note_path}}" + }, + "copy_image_reference_button": { + "button_title": "Copia il riferimento all'immagine negli appunti, può essere incollato in una nota di testo." + }, + "hide_floating_buttons_button": { + "button_title": "Nascondi pulsanti" + }, + "show_floating_buttons_button": { + "button_title": "Mostra pulsanti" + }, + "svg_export_button": { + "button_title": "Esporta diagramma come SVG" + }, + "relation_map_buttons": { + "create_child_note_title": "Crea una nuova nota secondaria e aggiungila a questa mappa delle relazioni", + "reset_pan_zoom_title": "Ripristina panoramica e zoom alle coordinate e all'ingrandimento iniziali", + "zoom_in_title": "Ingrandisci", + "zoom_out_title": "Rimpicciolisci" + }, + "zpetne_odkazy": { + "backlink": "{{count}} Backlink", + "backlinks": "{{count}} Backlinks", + "relation": "relazione" + }, + "mobile_detail_menu": { + "insert_child_note": "Inserisci nota secondaria", + "delete_this_note": "Elimina questa nota", + "note_revisions": "Revisioni delle note", + "error_cannot_get_branch_id": "Impossibile ottenere branchId per notePath '{{notePath}}'", + "error_unrecognized_command": "Comando non riconosciuto {{command}}" + }, + "note_icon": { + "change_note_icon": "Cambia icona nota", + "category": "Categoria:", + "search": "Ricerca:", + "reset-default": "Ripristina l'icona predefinita" + }, + "basic_properties": { + "note_type": "Tipo di nota", + "editable": "Modificabile", + "basic_properties": "Proprietà di base", + "language": "Lingua", + "configure_code_notes": "Configura le note del codice..." + }, + "book_properties": { + "view_type": "Tipo di visualizzazione", + "grid": "Griglia", + "list": "Lista", + "collapse_all_notes": "Comprimi tutte le note", + "expand_all_children": "Espandi tutti i bambini", + "collapse": "Crollo", + "expand": "Espandere", + "book_properties": "Proprietà della raccolta", + "invalid_view_type": "Tipo di visualizzazione non valido '{{type}}'", + "calendar": "Calendario", + "table": "Tavolo", + "geo-map": "Mappa geografica", + "board": "Asse", + "presentation": "Presentazione", + "include_archived_notes": "Mostra note archiviate" + }, + "edited_notes": { + "no_edited_notes_found": "Nessuna nota modificata per questo giorno...", + "title": "Note modificate", + "deleted": "(eliminato)" + }, + "file_properties": { + "note_id": "ID nota", + "original_file_name": "Nome del file originale", + "file_type": "Tipo di file", + "file_size": "Dimensione del file", + "download": "Scaricamento", + "open": "Aprire", + "upload_new_revision": "Carica nuova revisione", + "upload_success": "È stata caricata una nuova revisione del file.", + "upload_failed": "Caricamento di una nuova revisione del file non riuscito.", + "title": "File" + }, + "image_properties": { + "original_file_name": "Nome del file originale", + "file_type": "Tipo di file", + "file_size": "Dimensione del file", + "download": "Scaricamento", + "open": "Aprire", + "copy_reference_to_clipboard": "Copia il riferimento negli appunti", + "upload_new_revision": "Carica nuova revisione", + "upload_success": "È stata caricata una nuova revisione dell'immagine.", + "upload_failed": "Caricamento di una nuova revisione dell'immagine non riuscito: {{message}}", + "title": "Immagine" + }, + "inherited_attribute_list": { + "title": "Attributi ereditati", + "no_inherited_attributes": "Nessun attributo ereditato." + }, + "note_info_widget": { + "note_id": "ID nota", + "created": "Creato", + "modified": "Modificato", + "type": "Tipo", + "note_size": "Dimensione della nota", + "note_size_info": "La dimensione della nota fornisce una stima approssimativa dei requisiti di archiviazione per questa nota. Tiene conto del contenuto della nota e del contenuto delle sue revisioni.", + "calculate": "calcolare", + "subtree_size": "(dimensione del sottoalbero: {{size}} in {{count}} note)", + "title": "Nota informativa" + }, + "note_map": { + "open_full": "Espandi completamente", + "collapse": "Ritorna alle dimensioni normali", + "title": "Nota Mappa", + "fix-nodes": "Fissare i nodi", + "link-distance": "Distanza del collegamento" + }, + "note_paths": { + "title": "Percorsi delle note", + "clone_button": "Clona la nota nella nuova posizione...", + "intro_placed": "Questa nota è inserita nei seguenti percorsi:", + "intro_not_placed": "Questa nota non è ancora stata inserita nell'albero delle note.", + "outside_hoisted": "Questo percorso è al di fuori della nota sollevata e dovresti sganciarla.", + "archived": "Archiviato", + "search": "Ricerca" + }, + "note_properties": { + "this_note_was_originally_taken_from": "Questa nota è stata originariamente tratta da:", + "info": "Informazioni" + }, + "owned_attribute_list": { + "owned_attributes": "Attributi posseduti" + }, + "promoted_attributes": { + "promoted_attributes": "Attributi promossi", + "unset-field-placeholder": "non impostato", + "url_placeholder": "http://sito web...", + "open_external_link": "Apri collegamento esterno", + "unknown_label_type": "Tipo di etichetta sconosciuto '{{type}}'", + "unknown_attribute_type": "Tipo di attributo sconosciuto '{{type}}'", + "add_new_attribute": "Aggiungi nuovo attributo", + "remove_this_attribute": "Rimuovi questo attributo", + "remove_color": "Rimuovere l'etichetta colorata" + }, + "script_executor": { + "query": "Domanda", + "script": "Sceneggiatura", + "execute_query": "Esegui query", + "execute_script": "Esegui script" + }, + "similar_notes": { + "title": "Note simili", + "no_similar_notes_found": "Nessuna nota simile trovata." + }, + "fast_search": { + "fast_search": "Ricerca veloce", + "description": "L'opzione di ricerca rapida disattiva la ricerca del testo completo del contenuto delle note, il che potrebbe velocizzare la ricerca in database di grandi dimensioni." + }, + "include_archived_notes": { + "include_archived_notes": "Includi note archiviate" + }, + "limit": { + "limit": "Limite", + "take_first_x_results": "Prendi solo i primi X risultati specificati." + }, + "order_by": { + "order_by": "Ordina per", + "relevancy": "Rilevanza (predefinita)", + "title": "Titolo", + "date_created": "Data di creazione", + "date_modified": "Data dell'ultima modifica", + "content_size": "Nota la dimensione del contenuto", + "content_and_attachments_size": "Nota le dimensioni del contenuto, inclusi gli allegati", + "content_and_attachments_and_revisions_size": "Nota la dimensione del contenuto, inclusi allegati e revisioni", + "revision_count": "Numero di revisioni", + "children_count": "Numero di note sui bambini", + "parent_count": "Numero di cloni", + "owned_label_count": "Numero di etichette", + "owned_relation_count": "Numero di relazioni", + "target_relation_count": "Numero di relazioni che hanno come target la nota", + "random": "Ordine casuale", + "asc": "Crescente (predefinito)", + "desc": "Discendente" + }, + "search_script": { + "title": "Cerca script:", + "placeholder": "cerca la nota per nome", + "description1": "Lo script di ricerca consente di definire i risultati di ricerca eseguendo uno script. Ciò offre la massima flessibilità quando la ricerca standard non è sufficiente.", + "description2": "Lo script di ricerca deve essere di tipo \"codice\" e sottotipo \"backend JavaScript\". Lo script deve restituire un array di noteId o note.", + "example_title": "Guarda questo esempio:", + "example_code": "// 1. Prefiltraggio tramite ricerca standard\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. Applicazione di criteri di ricerca personalizzati\nconst matchedNotes = candidateNotes\n.filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;", + "note": "Si noti che lo script di ricerca e la stringa di ricerca non possono essere combinati tra loro." + }, + "attachment_list": { + "open_help_page": "Apri la pagina di aiuto sugli allegati", + "owning_note": "Nota di proprietà:", + "upload_attachments": "Carica allegati", + "no_attachments": "Questa nota non ha allegati." + }, + "book": { + "no_children_help": "Questa raccolta non ha note secondarie, quindi non c'è nulla da visualizzare. Consulta la wiki per i dettagli.", + "drag_locked_title": "Bloccato per la modifica", + "drag_locked_message": "Trascinamento non consentito poiché la raccolta è bloccata per la modifica." + }, + "editable_code": { + "placeholder": "Digita qui il contenuto della tua nota di codice..." + }, + "editable_text": { + "placeholder": "Digita qui il contenuto della tua nota..." + }, + "empty": { + "open_note_instruction": "Apri una nota digitandone il titolo nel campo sottostante oppure scegli una nota nell'albero.", + "search_placeholder": "cerca una nota per nome", + "enter_workspace": "Accedi all'area di lavoro {{title}}" + }, + "file": { + "file_preview_not_available": "L'anteprima del file non è disponibile per questo formato di file.", + "too_big": "Per motivi di prestazioni, l'anteprima mostra solo i primi {{maxNumChars}} caratteri del file. Scarica il file e aprilo esternamente per poterne visualizzare l'intero contenuto." + }, + "protected_session": { + "enter_password_instruction": "Per visualizzare la nota protetta è necessario inserire la password:", + "start_session_button": "Avvia sessione protetta invio", + "started": "La sessione protetta è stata avviata.", + "wrong_password": "Password errata.", + "protecting-finished-successfully": "Protezione completata con successo.", + "unprotecting-finished-successfully": "Rimozione della protezione completata con successo.", + "protecting-in-progress": "Protezione in corso: {{count}}", + "unprotecting-in-progress-count": "Rimozione della protezione in corso: {{count}}", + "protecting-title": "Stato di protezione", + "unprotecting-title": "Stato non protetto" + }, + "relation_map": { + "open_in_new_tab": "Apri in una nuova scheda", + "remove_note": "Rimuovi nota", + "edit_title": "Modifica titolo", + "rename_note": "Rinomina nota", + "enter_new_title": "Inserisci il titolo della nuova nota:", + "remove_relation": "Rimuovi relazione", + "confirm_remove_relation": "Sei sicuro di voler rimuovere la relazione?", + "specify_new_relation_name": "Specificare il nome della nuova relazione (caratteri consentiti: alfanumerici, due punti e trattino basso):", + "connection_exists": "La connessione '{{name}}' tra queste note esiste già.", + "start_dragging_relations": "Inizia a trascinare le relazioni da qui e rilasciale su un'altra nota.", + "note_not_found": "Nota {{noteId}} non trovata!", + "cannot_match_transform": "Impossibile abbinare la trasformazione: {{transform}}", + "note_already_in_diagram": "Nota che \"{{title}}\" è già presente nel diagramma.", + "enter_title_of_new_note": "Inserisci il titolo della nuova nota", + "default_new_note_title": "nuova nota", + "click_on_canvas_to_place_new_note": "Clicca sulla tela per inserire una nuova nota" + }, + "render": { + "note_detail_render_help_1": "Questa nota di aiuto viene visualizzata perché questa nota di tipo Render HTML non ha la relazione richiesta per funzionare correttamente.", + "note_detail_render_help_2": "Il tipo di nota HTML Render viene utilizzato per lo scripting. In breve, si ottiene una nota in codice HTML (opzionalmente con un po' di JavaScript) che verrà visualizzata. Per farla funzionare, è necessario definire una relazione denominata \"renderNote\" che punti alla nota HTML da visualizzare." + }, + "web_view": { + "web_view": "Visualizzazione Web", + "embed_websites": "La nota di tipo Web View consente di incorporare siti web in Trilium.", + "create_label": "Per iniziare, crea un'etichetta con l'indirizzo URL che desideri incorporare, ad esempio #webViewSrc=\"https://www.google.com\"" + }, + "vacuum_database": { + "title": "Database del vuoto", + "description": "Questa operazione ricostruirà il database, generando in genere un file di dimensioni inferiori. In realtà, nessun dato verrà modificato.", + "button_text": "Database del vuoto", + "vacuuming_database": "Aspirazione del database...", + "database_vacuumed": "Il database è stato svuotato" + }, + "fonts": { + "theme_defined": "Tema definito", + "fonts": "Caratteri", + "main_font": "Carattere principale", + "font_family": "Famiglia di caratteri", + "size": "Misurare", + "note_tree_font": "Carattere dell'albero delle note", + "note_detail_font": "Nota Dettaglio Carattere", + "monospace_font": "Monospace (codice) Font", + "note_tree_and_detail_font_sizing": "Si noti che le dimensioni dei caratteri dell'albero e dei dettagli sono relative all'impostazione della dimensione del carattere principale.", + "not_all_fonts_available": "Non tutti i font elencati potrebbero essere disponibili sul tuo sistema.", + "apply_font_changes": "Per applicare le modifiche al carattere, fare clic su", + "reload_frontend": "ricarica frontend", + "generic-fonts": "Caratteri generici", + "sans-serif-system-fonts": "Caratteri di sistema sans-serif", + "serif-system-fonts": "Caratteri di sistema Serif", + "monospace-system-fonts": "Caratteri di sistema a spaziatura fissa", + "handwriting-system-fonts": "Caratteri del sistema di scrittura a mano", + "serif": "Serif", + "sans-serif": "Sans Serif", + "monospace": "Monospaziatura", + "system-default": "Predefinito del sistema" + }, + "max_content_width": { + "title": "Larghezza del contenuto", + "default_description": "Per impostazione predefinita, Trilium limita la larghezza massima del contenuto per migliorare la leggibilità sugli schermi più grandi.", + "max_width_label": "Larghezza massima del contenuto", + "max_width_unit": "pixel", + "apply_changes_description": "Per applicare le modifiche alla larghezza del contenuto, fare clic su", + "reload_button": "ricarica frontend", + "reload_description": "modifiche dalle opzioni di aspetto" + }, + "native_title_bar": { + "title": "Barra del titolo nativa (richiede il riavvio dell'app)", + "enabled": "abilitato", + "disabled": "disabile" + }, + "ribbon": { + "widgets": "Widget della barra multifunzione", + "promoted_attributes_message": "La scheda della barra multifunzione Attributi promossi si aprirà automaticamente se gli attributi promossi sono presenti nella nota", + "edited_notes_message": "La scheda della barra multifunzione Note modificate si aprirà automaticamente nelle note giornaliere" + }, + "theme": { + "title": "Tema dell'applicazione", + "theme_label": "Tema", + "override_theme_fonts_label": "Ignora i font del tema", + "auto_theme": "Legacy (seguire lo schema dei colori del sistema)", + "light_theme": "Eredità (Luce)", + "dark_theme": "Eredità (Oscuro)", + "triliumnext": "Trilium (seguire lo schema dei colori del sistema)", + "triliumnext-light": "Trilium (Luce)", + "triliumnext-dark": "Trilium (scuro)", + "layout": "Disposizione", + "layout-vertical-title": "Verticale", + "layout-horizontal-title": "Orizzontale", + "layout-vertical-description": "la barra di avvio è a sinistra (impostazione predefinita)", + "layout-horizontal-description": "la barra di avvio si trova sotto la barra delle schede, che ora è a larghezza intera." + }, + "ui-performance": { + "title": "Prestazione", + "enable-motion": "Abilita transizioni e animazioni", + "enable-shadows": "Abilita le ombre", + "enable-backdrop-effects": "Abilita gli effetti di sfondo per menu, popup e pannelli", + "enable-smooth-scroll": "Abilita lo scorrimento fluido", + "app-restart-required": "(per rendere effettiva la modifica è necessario riavviare l'applicazione)" + }, + "zoom_factor": { + "title": "Fattore di zoom (solo versione desktop)", + "description": "Lo zoom può essere controllato anche con le scorciatoie CTRL+- e CTRL+=." + }, + "code_auto_read_only_size": { + "title": "Dimensione automatica di sola lettura", + "description": "La dimensione automatica delle note in sola lettura è la dimensione dopo la quale le note verranno visualizzate in modalità di sola lettura (per motivi di prestazioni).", + "label": "Dimensione automatica di sola lettura (note sul codice)", + "unit": "caratteri" + }, + "code-editor-options": { + "title": "Redattore" + }, + "code_mime_types": { + "title": "Tipi MIME disponibili nel menu a discesa" + }, + "vim_key_bindings": { + "use_vim_keybindings_in_code_notes": "Combinazioni di tasti di Vim", + "enable_vim_keybindings": "Abilita le combinazioni di tasti di Vim nelle note del codice (nessuna modalità ex)" + }, + "wrap_lines": { + "wrap_lines_in_code_notes": "Righe di avvolgimento nelle note del codice", + "enable_line_wrap": "Abilita Line Wrap (la modifica potrebbe richiedere un ricaricamento del frontend per avere effetto)" + }, + "images": { + "images_section_title": "Immagini", + "download_images_automatically": "Scarica automaticamente le immagini per l'utilizzo offline.", + "download_images_description": "L'HTML incollato può contenere riferimenti a immagini online; Trilium troverà tali riferimenti e scaricherà le immagini in modo che siano disponibili offline.", + "enable_image_compression": "Abilita la compressione delle immagini", + "max_image_dimensions": "Larghezza/altezza massima di un'immagine (l'immagine verrà ridimensionata se supera questa impostazione).", + "max_image_dimensions_unit": "pixel", + "jpeg_quality_description": "Qualità JPEG (10 - qualità peggiore, 100 - qualità migliore, 50 - 85 è consigliato)" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "Timeout cancellazione allegato", + "attachment_auto_deletion_description": "Gli allegati vengono eliminati (e cancellati) automaticamente se non vengono più menzionati nella nota dopo un timeout definito.", + "erase_attachments_after": "Cancella gli allegati non utilizzati dopo:", + "manual_erasing_description": "È anche possibile attivare la cancellazione manualmente (senza considerare il timeout definito sopra):", + "erase_unused_attachments_now": "Cancella subito le note degli allegati non utilizzati", + "unused_attachments_erased": "Gli allegati non utilizzati sono stati cancellati." + }, + "network_connections": { + "network_connections_title": "Connessioni di rete", + "check_for_updates": "Controlla automaticamente gli aggiornamenti" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "Timeout cancellazione nota", + "note_erasure_description": "Le note eliminate (e gli attributi, le revisioni...) vengono inizialmente contrassegnate come eliminate ed è possibile recuperarle dalla finestra di dialogo Note recenti. Dopo un certo periodo di tempo, le note eliminate vengono \"cancellate\", il che significa che il loro contenuto non è più recuperabile. Questa impostazione consente di configurare l'intervallo di tempo tra l'eliminazione e la cancellazione definitiva della nota.", + "erase_notes_after": "Cancella le note dopo:", + "manual_erasing_description": "È anche possibile attivare la cancellazione manualmente (senza considerare il timeout definito sopra):", + "erase_deleted_notes_now": "Cancella subito le note eliminate", + "deleted_notes_erased": "Le note eliminate sono state eliminate." + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "Nota Intervallo di istantanea della revisione", + "note_revisions_snapshot_description": "L'intervallo di snapshot della revisione della nota è il tempo dopo il quale verrà creata una nuova revisione per la nota. Per maggiori informazioni, consultare wiki.", + "snapshot_time_interval_label": "Nota intervallo di tempo per l'istantanea della revisione:" + }, + "revisions_snapshot_limit": { + "note_revisions_snapshot_limit_title": "Nota Limite di Snapshot di Revisione", + "note_revisions_snapshot_limit_description": "Il limite del numero di snapshot di revisione della nota si riferisce al numero massimo di revisioni che possono essere salvate per ciascuna nota. Dove -1 significa nessun limite, 0 significa eliminare tutte le revisioni. È possibile impostare il numero massimo di revisioni per una singola nota tramite l'etichetta #versioningLimit.", + "snapshot_number_limit_label": "Nota limite del numero di istantanee di revisione:", + "snapshot_number_limit_unit": "istantanee", + "erase_excess_revision_snapshots": "Cancella subito gli snapshot di revisione in eccesso", + "erase_excess_revision_snapshots_prompt": "Gli snapshot di revisione in eccesso sono stati cancellati." + }, + "text_auto_read_only_size": { + "title": "Dimensione automatica di sola lettura", + "description": "La dimensione automatica delle note in sola lettura è la dimensione dopo la quale le note verranno visualizzate in modalità di sola lettura (per motivi di prestazioni).", + "label": "Dimensione automatica di sola lettura (note di testo)", + "unit": "caratteri" + }, + "custom_date_time_format": { + "title": "Formato data/ora personalizzato", + "description": "Personalizza il formato della data e dell'ora inserite tramite o la barra degli strumenti. Consulta la documentazione Day.js per i token di formato disponibili.", + "format_string": "Stringa di formato:", + "formatted_time": "Data/ora formattata:" + }, + "options_widget": { + "options_status": "Stato delle opzioni", + "options_change_saved": "Le modifiche alle opzioni sono state salvate." + }, + "password": { + "heading": "Password", + "alert_message": "Ricordati di ricordare la nuova password. La password serve per accedere all'interfaccia web e per crittografare le note protette. Se dimentichi la password, tutte le tue note protette andranno perse per sempre.", + "reset_link": "Clicca qui per reimpostarlo.", + "old_password": "Vecchia password", + "new_password": "Nuova password", + "new_password_confirmation": "Conferma della nuova password", + "change_password": "Cambiare la password", + "protected_session_timeout": "Timeout della sessione protetta", + "protected_session_timeout_description": "Il timeout della sessione protetta è un periodo di tempo dopo il quale la sessione protetta viene cancellata dalla memoria del browser. Questo periodo viene calcolato a partire dall'ultima interazione con le note protette. Vedi", + "wiki": "wiki", + "for_more_info": "per maggiori informazioni.", + "protected_session_timeout_label": "Timeout della sessione protetta:", + "reset_confirmation": "Reimpostando la password perderai per sempre l'accesso a tutte le tue note protette. Vuoi davvero reimpostare la password?", + "reset_success_message": "La password è stata reimpostata. Imposta una nuova password.", + "change_password_heading": "Cambiare la password", + "set_password_heading": "Imposta password", + "set_password": "Imposta password", + "password_mismatch": "Le nuove password non sono tutte uguali.", + "password_changed_success": "La password è stata modificata. Trilium verrà ricaricato dopo aver premuto OK." + }, + "multi_factor_authentication": { + "title": "Autenticazione a più fattori", + "description": "L'autenticazione a più fattori (MFA) aggiunge un ulteriore livello di sicurezza al tuo account. Invece di inserire semplicemente una password per accedere, l'MFA richiede di fornire una o più prove aggiuntive per verificare la tua identità. In questo modo, anche se qualcuno dovesse entrare in possesso della tua password, non potrà comunque accedere al tuo account senza la seconda informazione. È come aggiungere una serratura extra alla tua porta, rendendo molto più difficile l'accesso per chiunque altro.

Segui le istruzioni seguenti per abilitare l'MFA. Se la configurazione non è corretta, l'accesso verrà effettuato solo tramite password.", + "mfa_enabled": "Abilita l'autenticazione a più fattori", + "mfa_method": "Metodo MFA", + "electron_disabled": "L'autenticazione a più fattori non è attualmente supportata nella versione desktop.", + "totp_title": "Password monouso basata sul tempo (TOTP)", + "totp_description": "TOTP (Time-Based One-Time Password) è una funzione di sicurezza che genera un codice temporaneo univoco che cambia ogni 30 secondi. Questo codice, insieme alla password, viene utilizzato per accedere al proprio account, rendendolo molto più difficile da accedere per chiunque altro.", + "totp_secret_title": "Genera il segreto TOTP", + "totp_secret_generate": "Genera il segreto TOTP", + "totp_secret_regenerate": "Rigenera il segreto TOTP", + "no_totp_secret_warning": "Per abilitare TOTP, è necessario prima generare un segreto TOTP.", + "totp_secret_description_warning": "Dopo aver generato un nuovo segreto TOTP, ti verrà richiesto di effettuare nuovamente l'accesso con il nuovo segreto TOTP.", + "totp_secret_generated": "TOTP Segreto Generato", + "totp_secret_warning": "Si prega di salvare il segreto generato in un luogo sicuro. Non verrà più visualizzato.", + "totp_secret_regenerate_confirm": "Vuoi davvero rigenerare il segreto TOTP? Questo invaliderà il segreto TOTP precedente e tutti i codici di recupero esistenti.", + "recovery_keys_title": "Chiavi di ripristino Single Sign-on", + "recovery_keys_description": "Le chiavi di recupero Single Sign-On vengono utilizzate per effettuare l'accesso anche se non è possibile accedere ai codici Authenticator.", + "recovery_keys_description_warning": "Le chiavi di recupero non verranno più visualizzate dopo aver abbandonato la pagina: conservale in un luogo sicuro e protetto.
Una volta utilizzata, una chiave di recupero non potrà più essere utilizzata.", + "recovery_keys_error": "Errore durante la generazione dei codici di ripristino", + "recovery_keys_no_key_set": "Nessun codice di ripristino impostato", + "recovery_keys_generate": "Genera codici di recupero", + "recovery_keys_regenerate": "Rigenera i codici di recupero", + "recovery_keys_used": "Utilizzato: {{data}}", + "recovery_keys_unused": "Il codice di ripristino {{index}} non è utilizzato", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenID è un metodo standardizzato che ti consente di accedere ai siti web utilizzando un account di un altro servizio, come Google, per verificare la tua identità. L'emittente predefinito è Google, ma puoi cambiarlo con qualsiasi altro provider OpenID. Per ulteriori informazioni, consulta qui. Segui queste istruzioni per configurare un servizio OpenID tramite Google.", + "oauth_description_warning": "Per abilitare OAuth/OpenID, è necessario impostare l'URL di base di OAuth/OpenID, l'ID client e il segreto client nel file config.ini e riavviare l'applicazione. Per impostare le variabili d'ambiente, impostare TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID e TRILIUM_OAUTH_CLIENT_SECRET.", + "oauth_missing_vars": "Impostazioni mancanti: {{-variabili}}", + "oauth_user_account": "Account utente:", + "oauth_user_email": "Email utente:", + "oauth_user_not_logged_in": "Non hai effettuato l'accesso!" + }, + "spellcheck": { + "title": "Controllo ortografico", + "description": "Queste opzioni sono valide solo per le versioni desktop; i browser utilizzeranno il proprio controllo ortografico nativo.", + "enable": "Abilita il controllo ortografico", + "language_code_label": "Codice/i della lingua", + "language_code_placeholder": "ad esempio \"en-US\", \"de-AT\"", + "multiple_languages_info": "È possibile separare più lingue con una virgola, ad esempio \"en-US, de-DE, cs\".", + "available_language_codes_label": "Codici lingua disponibili:", + "restart-required": "Le modifiche alle opzioni di controllo ortografico avranno effetto dopo il riavvio dell'applicazione." + }, + "api_log": { + "close": "Vicino" + }, + "attachment_detail_2": { + "will_be_deleted_in": "Questo allegato verrà eliminato automaticamente tra {{time}}", + "will_be_deleted_soon": "Questo allegato verrà eliminato automaticamente a breve", + "deletion_reason": ", perché l'allegato non è collegato al contenuto della nota. Per impedirne l'eliminazione, aggiungi nuovamente il collegamento all'allegato nel contenuto o converti l'allegato in nota.", + "role_and_size": "Ruolo: {{role}}, Dimensione: {{size}}", + "link_copied": "Link all'allegato copiato negli appunti.", + "unrecognized_role": "Ruolo di allegato non riconosciuto '{{role}}'." + }, + "bookmark_switch": { + "bookmark": "Segnalibro", + "bookmark_this_note": "Aggiungi questa nota ai segnalibri nel pannello laterale sinistro", + "remove_bookmark": "Rimuovi segnalibro" + }, + "editability_select": { + "auto": "Auto", + "read_only": "Sola lettura", + "always_editable": "Sempre modificabile", + "note_is_editable": "La nota è modificabile se non è troppo lunga.", + "note_is_read_only": "La nota è di sola lettura, ma può essere modificata cliccando su un pulsante.", + "note_is_always_editable": "La nota è sempre modificabile, indipendentemente dalla sua lunghezza." + }, + "note-map": { + "button-link-map": "Mappa dei collegamenti", + "button-tree-map": "Mappa degli alberi" + }, + "shared_info": { + "shared_publicly": "Questa nota è condivisa pubblicamente su {{- link}}.", + "shared_locally": "Questa nota è condivisa localmente su {{- link}}.", + "help_link": "Per assistenza visita wiki." + }, + "note_types": { + "text": "Testo", + "code": "Codice", + "saved-search": "Ricerca salvata", + "relation-map": "Mappa delle relazioni", + "note-map": "Nota Mappa", + "render-note": "Nota di rendering", + "book": "Collezione", + "mermaid-diagram": "Diagramma della sirena", + "canvas": "Tela", + "web-view": "Visualizzazione Web", + "mind-map": "Mappa mentale", + "file": "File", + "image": "Immagine", + "launcher": "Lanciatore", + "doc": "Dottore", + "widget": "Oggetto", + "confirm-change": "Si sconsiglia di cambiare tipo di nota quando il contenuto della nota non è vuoto. Vuoi continuare comunque?", + "geo-map": "Mappa geografica", + "beta-feature": "Beta", + "ai-chat": "Chat AI", + "task-list": "Elenco delle attività", + "new-feature": "Nuovo", + "collections": "Collezioni" + }, + "protect_note": { + "toggle-on": "Proteggi la nota", + "toggle-off": "Rimuovere la protezione dalla nota", + "toggle-on-hint": "La nota non è protetta, clicca per proteggerla", + "toggle-off-hint": "La nota è protetta, clicca per renderla non protetta" + }, + "template_switch": { + "template": "Modello", + "toggle-on-hint": "Trasforma la nota in un modello", + "toggle-off-hint": "Rimuovi la nota come modello" + }, + "open-help-page": "Apri la pagina di aiuto", + "find": { + "case_sensitive": "Maiuscole e minuscole", + "match_words": "Abbina le parole", + "find_placeholder": "Trova nel testo...", + "replace_placeholder": "Sostituisci con...", + "replace": "Sostituire", + "replace_all": "Sostituisci tutto" + }, + "note_tree": { + "collapse-title": "Comprimi l'albero delle note", + "scroll-active-title": "Scorri fino alla nota attiva", + "tree-settings-title": "Impostazioni dell'albero", + "hide-archived-notes": "Nascondi le note archiviate", + "automatically-collapse-notes": "Comprimi automaticamente le note", + "automatically-collapse-notes-title": "Dopo un periodo di inattività, le note verranno compresse per riordinare l'albero.", + "save-changes": "Salva e applica le modifiche", + "auto-collapsing-notes-after-inactivity": "Compressione automatica delle note dopo inattività...", + "saved-search-note-refreshed": "Nota di ricerca salvata aggiornata.", + "hoist-this-note-workspace": "Solleva questa nota (area di lavoro)", + "refresh-saved-search-results": "Aggiorna i risultati della ricerca salvati", + "create-child-note": "Crea nota figlio", + "unhoist": "Sganciare", + "toggle-sidebar": "Attiva/disattiva la barra laterale" + }, + "title_bar_buttons": { + "window-on-top": "Mantieni la finestra in primo piano" + }, + "note_detail": { + "could_not_find_typewidget": "Impossibile trovare typeWidget per il tipo '{{type}}'" + }, + "note_title": { + "placeholder": "scrivi qui il titolo della nota..." + }, + "search_result": { + "no_notes_found": "Non sono state trovate note per i parametri di ricerca specificati.", + "search_not_executed": "La ricerca non è stata ancora eseguita. Clicca sul pulsante \"Cerca\" qui sopra per visualizzare i risultati." + }, + "spacer": { + "configure_launchbar": "Configura Launchbar" + }, + "sql_result": { + "no_rows": "Nessuna riga è stata restituita per questa query" + }, + "watched_file_update_status": { + "file_last_modified": "Il file è stato modificato l'ultima volta il .", + "upload_modified_file": "Carica il file modificato", + "ignore_this_change": "Ignora questa modifica" + }, + "app_context": { + "please_wait_for_save": "Attendi qualche secondo affinché il salvataggio venga completato, quindi potrai riprovare." + }, + "note_create": { + "duplicated": "Nota: \"{{title}}\" è stato duplicato." + }, + "image": { + "copied-to-clipboard": "Un riferimento all'immagine è stato copiato negli appunti. Può essere incollato in qualsiasi nota di testo.", + "cannot-copy": "Impossibile copiare il riferimento all'immagine negli appunti." + }, + "clipboard": { + "cut": "Le note sono state tagliate negli appunti.", + "copied": "Le note sono state copiate negli appunti.", + "copy_failed": "Impossibile copiare negli appunti a causa di problemi di autorizzazione.", + "copy_success": "Copiato negli appunti." + }, + "entrypoints": { + "note-revision-created": "La revisione della nota è stata creata.", + "note-executed": "Nota eseguita.", + "sql-error": "Si è verificato un errore durante l'esecuzione della query SQL: {{message}}" + }, + "branches": { + "cannot-move-notes-here": "Impossibile spostare le note qui.", + "delete-status": "Elimina stato", + "delete-notes-in-progress": "Eliminazione note in corso: {{count}}", + "delete-finished-successfully": "Eliminazione completata con successo.", + "undeleting-notes-in-progress": "Ripristino delle note in corso: {{count}}", + "undeleting-notes-finished-successfully": "Recupero note completato con successo." + }, + "frontend_script_api": { + "async_warning": "Stai passando una funzione asincrona a `api.runOnBackend()` che probabilmente non funzionerà come previsto.\\nRendi la funzione sincrona (rimuovendo la parola chiave `async`) oppure usa `api.runAsyncOnBackendWithManualTransactionHandling()`.", + "sync_warning": "Stai passando una funzione sincrona a `api.runAsyncOnBackendWithManualTransactionHandling()`, mentre probabilmente dovresti usare `api.runOnBackend()`." + }, + "ws": { + "sync-check-failed": "Controllo di sincronizzazione fallito!", + "consistency-checks-failed": "Controlli di coerenza falliti! Vedi i log per i dettagli.", + "encountered-error": "Si è verificato l'errore \"{{message}}\", controlla la console.", + "lost-websocket-connection-title": "Connessione al server persa", + "lost-websocket-connection-message": "Controlla la configurazione del proxy inverso (ad esempio nginx o Apache) per assicurarti che le connessioni WebSocket siano correttamente consentite e non bloccate." + }, + "hoisted_note": { + "confirm_unhoisting": "La nota richiesta '{{requestedNote}}' è esterna al sottoalbero della nota sollevata '{{hoistedNote}}' e devi rimuoverla per accedervi. Vuoi procedere con la rimozione?" + }, + "launcher_context_menu": { + "reset_launcher_confirm": "Vuoi davvero reimpostare \"{{title}}\"? Tutti i dati/le impostazioni in questa nota (e nelle relative note secondarie) andranno persi e il launcher tornerà alla sua posizione originale.", + "add-note-launcher": "Aggiungi un launcher di note", + "add-script-launcher": "Aggiungi un launcher di script", + "add-custom-widget": "Aggiungi un widget personalizzato", + "add-spacer": "Aggiungi distanziatore", + "delete": "Elimina ", + "reset": "Reset", + "move-to-visible-launchers": "Passa ai launcher visibili", + "move-to-available-launchers": "Passa ai launcher disponibili", + "duplicate-launcher": "Duplica il launcher " + }, + "editable-text": { + "auto-detect-language": "Rilevato automaticamente" + }, + "highlighting": { + "title": "Blocchi di codice", + "description": "Controlla l'evidenziazione della sintassi per i blocchi di codice all'interno delle note di testo; le note di codice non saranno interessate.", + "color-scheme": "Schema di colori" + }, + "code_block": { + "word_wrapping": "A capo automatico", + "theme_none": "Nessuna evidenziazione della sintassi", + "theme_group_light": "Temi chiari", + "theme_group_dark": "Temi scuri", + "copy_title": "Copia negli appunti" + }, + "classic_editor_toolbar": { + "title": "Formattazione" + }, + "editor": { + "title": "Redattore" + }, + "image_context_menu": { + "copy_reference_to_clipboard": "Copia il riferimento negli appunti", + "copy_image_to_clipboard": "Copia l'immagine negli appunti" + }, + "link_context_menu": { + "open_note_in_new_tab": "Apri la nota in una nuova scheda", + "open_note_in_new_split": "Apri nota in una nuova divisione", + "open_note_in_new_window": "Apri la nota in una nuova finestra", + "open_note_in_popup": "Modifica rapida" + }, + "help-button": { + "title": "Apri la pagina di aiuto pertinente" + }, + "duration": { + "seconds": "Secondi", + "minutes": "Minuti", + "hours": "Ore", + "days": "Giorni" + }, + "share": { + "title": "Impostazioni di condivisione", + "redirect_bare_domain": "Reindirizza il dominio nudo alla pagina di condivisione", + "redirect_bare_domain_description": "Reindirizza gli utenti anonimi alla pagina Condividi invece di mostrare l'accesso", + "show_login_link": "Mostra il collegamento di accesso nel tema Condividi", + "show_login_link_description": "Aggiungi un collegamento di accesso al piè di pagina della pagina Condividi", + "check_share_root": "Controlla lo stato della radice condivisa", + "share_root_found": "La nota radice condivisa '{{noteTitle}}' è pronta", + "share_root_not_found": "Nessuna nota con etichetta #shareRoot trovata", + "share_root_not_shared": "Nota '{{noteTitle}}' ha l'etichetta #shareRoot ma non è condiviso" + }, + "time_selector": { + "invalid_input": "Il valore temporale immesso non è un numero valido.", + "minimum_input": "Il valore temporale immesso deve essere di almeno {{minimumSeconds}} secondi." + }, + "tasks": { + "due": { + "today": "Oggi", + "tomorrow": "Domani", + "yesterday": "Ieri" + } + }, + "content_widget": { + "unknown_widget": "Widget sconosciuto per \"{{id}}\"." + }, + "note_language": { + "not_set": "Non impostato", + "configure-languages": "Configura le lingue..." + }, + "content_language": { + "title": "Lingue dei contenuti", + "description": "Seleziona una o più lingue che desideri visualizzare nella sezione \"Proprietà di base\" di una nota di testo di sola lettura o modificabile. Ciò consentirà funzionalità come il controllo ortografico o il supporto per la scrittura da destra a sinistra." + }, + "switch_layout_button": { + "title_vertical": "Sposta il riquadro di modifica in basso", + "title_horizontal": "Sposta il riquadro di modifica a sinistra" + }, + "toggle_read_only_button": { + "unlock-editing": "Sblocca la modifica", + "lock-editing": "Modifica blocco" + }, + "png_export_button": { + "button_title": "Esporta diagramma come PNG" + }, + "svg": { + "export_to_png": "Non è stato possibile esportare il diagramma in formato PNG." + }, + "code_theme": { + "title": "Aspetto", + "word_wrapping": "A capo automatico", + "color-scheme": "Schema dei colori" + }, + "book_properties_config": { + "hide-weekends": "Nascondi i fine settimana", + "display-week-numbers": "Visualizza i numeri delle settimane", + "map-style": "Stile mappa:", + "max-nesting-depth": "Profondità massima di nidificazione:", + "raster": "Trama", + "vector_light": "Vettore (Luce)", + "vector_dark": "Vettore (scuro)", + "show-scale": "Mostra scala" + }, + "table_context_menu": { + "delete_row": "Elimina riga" + }, + "presentation_view": { + "edit-slide": "Modifica questa diapositiva", + "start-presentation": "Inizia la presentazione", + "slide-overview": "Attiva/disattiva una panoramica delle diapositive" + }, + "command_palette": { + "tree-action-name": "Albero: {{nome}}", + "export_note_title": "Nota di esportazione", + "export_note_description": "Esporta la nota corrente", + "show_attachments_title": "Mostra allegati", + "show_attachments_description": "Visualizza gli allegati delle note", + "search_notes_title": "Cerca note", + "search_notes_description": "Apri la ricerca avanzata", + "search_subtree_title": "Cerca nel sottoalbero", + "search_subtree_description": "Cerca all'interno del sottoalbero corrente", + "search_history_title": "Mostra cronologia delle ricerche", + "search_history_description": "Visualizza le ricerche precedenti", + "configure_launch_bar_title": "Configura la barra di avvio", + "configure_launch_bar_description": "Aprire la configurazione della barra di avvio per aggiungere o rimuovere elementi." + }, + "content_renderer": { + "open_externally": "Aperto esternamente" + }, + "call_to_action": { + "next_theme_title": "Prova il nuovo tema Trilium", + "next_theme_message": "Al momento stai utilizzando il tema legacy. Vuoi provare il nuovo tema?", + "next_theme_button": "Prova il nuovo tema", + "background_effects_title": "Gli effetti di sfondo sono ora stabili", + "background_effects_message": "Sui dispositivi Windows, gli effetti di sfondo sono ora completamente stabili. Gli effetti di sfondo aggiungono un tocco di colore all'interfaccia utente sfocando lo sfondo retrostante. Questa tecnica è utilizzata anche in altre applicazioni come Esplora risorse di Windows.", + "background_effects_button": "Abilita gli effetti di sfondo", + "dismiss": "Congedare" + }, + "settings": { + "related_settings": "Impostazioni correlate" + }, + "settings_appearance": { + "related_code_blocks": "Schema di colori per i blocchi di codice nelle note di testo", + "related_code_notes": "Schema di colori per le note del codice" + }, + "units": { + "percentage": "%" + }, + "pagination": { + "page_title": "Pagina di {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} note" + }, + "collections": { + "rendering_error": "Impossibile mostrare il contenuto a causa di un errore." } -} +} \ No newline at end of file diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index 70ba11f58..48a4b063b 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -68,7 +68,8 @@ "switch_to_desktop_version": "デスクトップ版に切り替え", "configure_launchbar": "ランチャーバーの設定", "show_shared_notes_subtree": "共有ノートのサブツリーを表示", - "update_available": "バージョン {{latestVersion}} が利用可能です。クリックしてダウンロードしてください。" + "new-version-available": "新しいアップデートが利用可能", + "download-update": "{{latestVersion}} をバージョンを入手" }, "left_pane_toggle": { "show_panel": "パネルを表示", @@ -80,7 +81,7 @@ }, "clone_to": { "notes_to_clone": "クローンするノート", - "target_parent_note": "ターゲットの親ノート", + "target_parent_note": "対象の親ノート", "search_for_note_by_its_name": "ノート名で検索", "cloned_note_prefix_title": "クローンされたノートは、指定された接頭辞を付けてノートツリーに表示されます", "prefix_optional": "接頭辞(任意)", @@ -164,7 +165,12 @@ "first-week-info": "最初の週は、その年の最初の木曜日を含む週を指し、ISO 8601規格に基づいています。", "first-week-warning": "最初の週のオプションを変更すると、既存のウィークノートと重複する可能性があり、既存のウィークノートはそれに応じて更新されません。", "formatting-locale": "日付と数値のフォーマット", - "formatting-locale-auto": "アプリケーションの言語に基づいて" + "formatting-locale-auto": "アプリケーションの言語に基づいて", + "tuesday": "火曜日", + "wednesday": "水曜日", + "thursday": "木曜日", + "friday": "金曜日", + "saturday": "土曜日" }, "tab_row": { "close_tab": "タブを閉じる", @@ -276,11 +282,11 @@ "selectAllNotes": "現在のレベルのノートをすべて選択", "selectNote": "ノートを選択", "copyNotes": "アクティブなノート(または現在の選択範囲)をクリップボードにコピーする(クローンに使用)", - "cutNotes": "アクティブなノート(または現在の選択範囲)をクリップボードにカットする(ノートの移動に使用)", - "pasteNotes": "ノートをサブノートとしてアクティブノートに貼り付ける(コピーされたかカットされたかに よって、移動またはクローンになる)", + "cutNotes": "アクティブなノート(または現在の選択範囲)をクリップボードに切り取り(ノートの移動に使用)", + "pasteNotes": "ノートをサブノートとしてアクティブノートに貼り付ける(コピーされたか切り取りされたかに よって、移動またはクローンになる)", "deleteNotes": "ノート/サブツリーを削除", "editingNotes": "ノート編集", - "editNoteTitle": "押下するとツリーペインからタイトルの編集に移ります。タイトルの編集からEnterキーを押すと、本文の編集に移動します。Ctrl+. で本文の編集からツリーペインに戻ります。", + "editNoteTitle": "ツリーペインでEnterキーを押すと、ツリーペインからノートタイトルに切り替わります。ノートタイトルだとテキストエディタにフォーカスが切り替わります。Ctrl+. を押すと、エディタからツリーペインに戻ります。", "createEditLink": "外部リンクの作成/編集", "createInternalLink": "内部リンクの作成", "followLink": "カーソル下のリンクをたどる", @@ -296,7 +302,7 @@ "showDevTools": "開発者ツールを表示", "showSQLConsole": "SQLコンソールを表示", "other": "その他", - "quickSearch": "クイックサーチにフォーカス", + "quickSearch": "クイック検索にフォーカス", "inPageSearch": "ページ内検索", "showJumpToNoteDialog": "「ジャンプ先」ダイアログを表示", "moveNoteUpDown": "ノートリストでノートを上/下に移動", @@ -328,7 +334,8 @@ "import-status": "インポート状況", "in-progress": "インポート中: {{progress}}", "successful": "インポートは正常に終了しました。", - "explodeArchives": ".zip, .enex および .opml アーカイブの内容を読み取ります。" + "explodeArchives": ".zip, .enex および .opml アーカイブの内容を読み取ります。", + "importZipRecommendation": "ZIP ファイルをインポートすると、ノートの階層はアーカイブ内のサブディレクトリ構造を反映します。" }, "password_not_set": { "title": "パスワードが設定されていない", @@ -346,18 +353,18 @@ }, "sort_child_notes": { "sort_children_by": "子ノートの並び替え...", - "sorting_criteria": "ソート基準", + "sorting_criteria": "並べ替えの基準", "title": "タイトル", "date_created": "作成日", "date_modified": "更新日", - "sorting_direction": "ソート方向", + "sorting_direction": "並べ替えの方向", "ascending": "昇順", "descending": "降順", "folders": "フォルダ", - "sort_folders_at_top": "フォルダーを一番上にソートする", + "sort_folders_at_top": "フォルダーを上にして並べ替える", "natural_sort": "自然順", - "sort_with_respect_to_different_character_sorting": "言語や地域によって異なる文字の並べ替えや照合順序の規則に従ってソートする。", - "sort": "ソート", + "sort_with_respect_to_different_character_sorting": "言語や地域によって異なる文字の並べ替えや照合順序の規則に従って並べ替える。", + "sort": "並べ替え", "natural_sort_language": "自然順言語", "the_language_code_for_natural_sort": "自然順の言語コード。例えば、中国語の場合は \"zh-CN\"。" }, @@ -398,9 +405,9 @@ "protect-subtree": "サブツリーを保護", "unprotect-subtree": "サブツリーの保護を解除", "copy-clone": "コピー/クローン", - "clone-to": "クローン先...", - "cut": "カット", - "move-to": "移動先...", + "clone-to": "クローン...", + "cut": "切り取り", + "move-to": "移動...", "paste-into": "貼り付け", "paste-after": "後ろに貼り付け", "duplicate": "複製", @@ -410,7 +417,7 @@ "converted-to-attachments": "{{count}}ノートが添付ファイルに変換されました。", "convert-to-attachment": "添付ファイルに変換", "convert-to-attachment-confirm": "選択したノートを親ノートの添付ファイルに変換しますか?", - "open-in-popup": "クイックエディット", + "open-in-popup": "クイック編集", "hoist-note": "ホイストノート", "unhoist-note": "ノートをホイストしない", "edit-branch-prefix": "ブランチの接頭辞を編集", @@ -528,7 +535,8 @@ "table": "テーブル", "geo-map": "ジオマップ", "board": "ボード", - "include_archived_notes": "アーカイブされたノートを表示" + "include_archived_notes": "アーカイブされたノートを表示", + "presentation": "プレゼンテーション" }, "note_types": { "geo-map": "ジオマップ", @@ -1047,7 +1055,7 @@ "inheritable": "継承", "related_notes_title": "このラベルが付いた他のノート", "attr_detail_title": "属性の詳細なタイトル", - "target_note_title": "リレーションは、ソースノートとターゲットノート間の名前付き接続です。", + "target_note_title": "リレーションは、ソースノートと対象のノート間の名前付き接続です。", "target_note": "対象のノート", "promoted_title": "プロモート属性はノートに目立つように表示されます。", "promoted": "プロモート", @@ -1070,7 +1078,7 @@ "sorted": "子ノートをアルファベット順に並べ替える", "sort_direction": "ASC(デフォルト)または DESC", "sort_folders_first": "フォルダ(子を持つノート)を上にして並べる", - "top": "指定されたノートをその親ノートの一番上に表示します(ソートされた親ノートにのみ適用されます)", + "top": "指定されたノートをその親ノートの一番上に表示します(並べ替えらた親ノートにのみ適用されます)", "hide_promoted_attributes": "このノートのプロモート属性を非表示にする", "read_only": "エディターは読み取り専用モードです。テキストとコードノートのみ機能します。", "auto_read_only_disabled": "テキスト/コードノートは、サイズが大きすぎる場合、自動的に読み取りモードに設定されます。このラベルをノートに追加することで、ノートごとにこの動作を無効にすることができます", @@ -1144,13 +1152,13 @@ "print_page_size": "PDF にエクスポートするときに、ページのサイズを変更します。サポートされる値: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger。" }, "link_context_menu": { - "open_note_in_popup": "クイックエディット", + "open_note_in_popup": "クイック編集", "open_note_in_new_tab": "新しいタブでノートを開く", "open_note_in_new_split": "新しく分割してノートを開く", "open_note_in_new_window": "新しいウィンドウでノートを開く" }, "note_tooltip": { - "quick-edit": "クイックエディット", + "quick-edit": "クイック編集", "note-has-been-deleted": "ノートは削除されました。" }, "protect_note": { @@ -1182,7 +1190,7 @@ "options": "オプション" }, "quick-search": { - "placeholder": "クイックサーチ", + "placeholder": "クイック検索", "searching": "検索中...", "no-results": "結果は見つかりませんでした", "more-results": "... および {{number}} 件の他の結果。", @@ -1206,7 +1214,7 @@ }, "bulk_actions": { "bulk_actions": "一括操作", - "affected_notes": "影響されたノート", + "affected_notes": "影響されるノート", "include_descendants": "選択したノートの子ノートを含む", "available_actions": "利用可能なアクション", "chosen_actions": "選択されたアクション", @@ -1238,7 +1246,7 @@ "duplicated": "ノート \"{{title}}\" は複製されました。" }, "clipboard": { - "cut": "ノートはクリップボードにカットされました。", + "cut": "ノートはクリップボードに切り取りとられました。", "copied": "ノートはクリップボードにコピーされました。", "copy_failed": "権限の問題で、クリップボードにコピーできません。", "copy_success": "クリップボードにコピーしました。" @@ -1289,7 +1297,7 @@ }, "electron_context_menu": { "add-term-to-dictionary": "辞書に \"{{term}}\" を追加", - "cut": "カット", + "cut": "切り取り", "copy": "コピー", "copy-link": "リンクをコピー", "paste": "貼り付け", @@ -1752,7 +1760,7 @@ "target_parent_note": "対象の親ノート", "move_note_new_parent": "ノートに親が 1 つしかない場合は、ノートを新しい親に移動します (つまり、古いブランチが削除され、新しい親に新しいブランチが作成されます)", "clone_note_new_parent": "ノートに複数のクローン/ブランチがある場合、ノートを新しい親にクローンします(どのブランチを削除すべきか不明なため)", - "nothing_will_happen": "ノートをターゲットノートに移動できない場合は何も起こりません(つまり、ツリーサイクルが生じるため)", + "nothing_will_happen": "ノートを対象のノートに移動できない場合は何も起こりません(つまり、ツリーサイクルが生じるため)", "to": "次へ" }, "onclick_button": { @@ -1875,7 +1883,9 @@ "window-on-top": "ウィンドウを最前面に維持" }, "note_detail": { - "could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした" + "could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした", + "printing": "印刷中です...", + "printing_pdf": "PDF へのエクスポート中です..." }, "watched_file_update_status": { "ignore_this_change": "この変更を無視する", @@ -2068,5 +2078,10 @@ "role_and_size": "ロール: {{role}},サイズ: {{size}}", "link_copied": "添付ファイルのリンクをクリップボードにコピーしました。", "unrecognized_role": "添付ファイルのロール「{{role}}」は認識されません。" + }, + "presentation_view": { + "edit-slide": "このスライドを編集", + "start-presentation": "プレゼンテーションを開始", + "slide-overview": "スライドの概要を切り替え" } } diff --git a/apps/client/src/translations/ko/translation.json b/apps/client/src/translations/ko/translation.json index 6bbef5adb..6cfda1924 100644 --- a/apps/client/src/translations/ko/translation.json +++ b/apps/client/src/translations/ko/translation.json @@ -49,5 +49,11 @@ "chosen_actions": "선택한 액션들", "execute_bulk_actions": "대량 액션들 실행", "bulk_actions_executed": "대량 액션들이 성공적으로 실행되었습니다." + }, + "i18n": { + "saturday": "토요일", + "sunday": "일요일", + "first-week-of-the-year": "일년의 첫째 주", + "first-week-contains-first-day": "첫 번째 주에는 올해의 첫날이 포함됩니다" } } diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index 09f4225df..1d90a30e8 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -1,12 +1,12 @@ { "about": { - "title": "O notatkach Trilium", + "title": "O Trilium Notes", "homepage": "Strona główna:", "app_version": "Wersja aplikacji:", "db_version": "Wersja bazy danych:", "sync_version": "Wersja synchronizacji:", - "build_date": "Zbudowano:", - "build_revision": "Rewizja zbudowania:", + "build_date": "Data kompilacji:", + "build_revision": "Wersja:", "data_directory": "Katalog z danymi:" }, "toast": { @@ -161,7 +161,21 @@ "inPageSearch": "wyszukiwanie wewnątrz strony" }, "book_properties": { - "list": "Lista" + "list": "Lista", + "view_type": "Typ widoku", + "grid": "Siatka", + "collapse_all_notes": "Zwiń wszystkie notatki", + "expand_all_children": "Rozwiń wszystkie dzieci", + "collapse": "Zwiń", + "expand": "Rozwiń", + "book_properties": "Właściwości kolekcji", + "invalid_view_type": "Nieprawidłowy typ widoku '{{type}}'", + "calendar": "Kalendarz", + "table": "Tabela", + "geo-map": "Mapa geograficzna", + "board": "Tablica", + "presentation": "Prezentacja", + "include_archived_notes": "Pokaż zarchiwizowane notatki" }, "board_view": { "move-to": "Przenieś do", @@ -208,7 +222,8 @@ "next_theme_button": "Spróbuj nowego motywu", "background_effects_title": "Efekty w tle są już stabilne", "dismiss": "Odrzuć", - "background_effects_button": "Włącz efekty w tle" + "background_effects_button": "Włącz efekty w tle", + "background_effects_message": "Na urządzeniach z systemem Windows efekty tła są teraz w pełni stabilne. Efekty tła dodają odrobinę koloru do interfejsu użytkownika, rozmywając tło za nim. Ta technika jest również stosowana w innych aplikacjach, takich jak Eksplorator Windows." }, "settings": { "related_settings": "Powiązane ustawienia" @@ -234,7 +249,9 @@ "to_value": "do wartości", "new_value_placeholder": "nowa wartość", "help_text": "We wszystkich dopasowanych notatkach:", - "help_text_item2": "albo zmień wartość istniejącej etykiety" + "help_text_item2": "albo zmień wartość istniejącej etykiety", + "help_text_item1": "utwórz daną etykietę, jeśli notatka jeszcze jej nie ma", + "help_text_note": "Możesz również wywołać tę metodę bez wartości, w takim przypadku etykieta zostanie przypisana do notatki bez wartości." }, "attribute_detail": { "delete": "Usuń", @@ -248,7 +265,118 @@ "precision": "Prezycja", "digits": "znaki", "inverse_relation_title": "Opcjonalne ustawienie definiujące, do której relacji jest ta relacja przeciwna. Przykład: Główna - podnotatka są relacjami odwrotnymi do siebie.", - "inverse_relation": "Odwrócone powiązanie" + "inverse_relation": "Odwrócone powiązanie", + "attr_detail_title": "Tytuł szczegółów atrybutu", + "close_button_title": "Anuluj zmiany i zamknij", + "attr_is_owned_by": "Atrybut jest własnością", + "attr_name_title": "Nazwa atrybutu może składać się tylko ze znaków alfanumerycznych, dwukropka i podkreślenia", + "name": "Nazwa", + "value": "Wartość", + "target_note_title": "Relacja to nazwane połączenie między notatką źródłową a docelową.", + "target_note": "Notatka docelowa", + "promoted_title": "Promowany atrybut jest wyraźnie wyświetlany w notatce.", + "promoted": "Promowany", + "promoted_alias_title": "Nazwa, która ma być wyświetlana w interfejsie promowanych atrybutów.", + "promoted_alias": "Alias", + "multiplicity_title": "Krotność definiuje, ile atrybutów o tej samej nazwie można utworzyć - maksymalnie 1 lub więcej niż 1.", + "multiplicity": "Krotność", + "single_value": "Pojedyncza wartość", + "multi_value": "Wiele wartości", + "label_type_title": "Typ etykiety pomoże Trilium wybrać odpowiedni interfejs do wprowadzenia wartości etykiety.", + "label_type": "Typ", + "text": "Tekst", + "number": "Liczba", + "boolean": "Wartość logiczna", + "date": "Data", + "date_time": "Data i czas", + "time": "Czas", + "url": "URL", + "precision_title": "Jaka liczba cyfr po przecinku powinna być dostępna w interfejsie ustawiania wartości.", + "inheritable_title": "Dziedziczny atrybut będzie dziedziczony przez wszystkich potomków w tym drzewie.", + "inheritable": "Dziedziczny", + "save_and_close": "Zapisz i zamknij Ctrl+Enter", + "calendar_root": "oznacza notatkę, która powinna być używana jako korzeń dla notatek dziennych. Tylko jedna powinna być tak oznaczona.", + "archived": "notatki z tą etykietą nie będą domyślnie widoczne w wynikach wyszukiwania (również w dialogach Przejdź do, Dodaj link itp.).", + "exclude_from_export": "notatki (wraz z ich poddrzewem) nie będą uwzględniane w żadnym eksporcie notatek", + "run": "definiuje, przy jakich zdarzeniach skrypt powinien być uruchamiany. Możliwe wartości to:\n
    \n
  • frontendStartup - gdy frontend Trilium się uruchamia (lub jest odświeżany), ale nie na urządzeniach mobilnych.
  • \n
  • mobileStartup - gdy frontend Trilium się uruchamia (lub jest odświeżany), na urządzeniach mobilnych.
  • \n
  • backendStartup - gdy backend Trilium się uruchamia
  • \n
  • hourly - uruchamiaj raz na godzinę. Możesz użyć dodatkowej etykiety runAtHour, aby określić, o której godzinie.
  • \n
  • daily - uruchamiaj raz dziennie
  • \n
", + "run_on_instance": "Zdefiniuj, która instancja Trilium ma to uruchomić. Domyślnie wszystkie instancje.", + "run_at_hour": "O której godzinie ma to być uruchomione. Powinno być używane razem z #run=hourly. Można zdefiniować wielokrotnie dla większej liczby uruchomień w ciągu dnia.", + "disable_inclusion": "skrypty z tą etykietą nie będą uwzględniane w wykonaniu skryptu nadrzędnego.", + "sorted": "utrzymuje notatki podrzędne posortowane alfabetycznie według tytułu", + "sort_direction": "ASC (domyślnie) lub DESC", + "sort_folders_first": "Foldery (notatki z dziećmi) powinny być sortowane na górze", + "top": "utrzymuj daną notatkę na górze w jej rodzicu (dotyczy tylko posortowanych rodziców)", + "hide_promoted_attributes": "Ukryj promowane atrybuty w tej notatce", + "read_only": "edytor jest w trybie tylko do odczytu. Działa tylko dla notatek tekstowych i kodowych.", + "auto_read_only_disabled": "notatki tekstowe/kodowe mogą być automatycznie ustawiane w tryb tylko do odczytu, gdy są zbyt duże. Możesz wyłączyć to zachowanie dla poszczególnych notatek, dodając tę etykietę do notatki", + "app_css": "oznacza notatki CSS, które są ładowane do aplikacji Trilium i mogą być używane do modyfikacji wyglądu Trilium.", + "app_theme": "oznacza notatki CSS, które są pełnymi motywami Trilium i są dostępne w opcjach Trilium.", + "app_theme_base": "ustaw na \"next\", \"next-light\" lub \"next-dark\", aby użyć odpowiedniego motywu TriliumNext (auto, jasny lub ciemny) jako podstawy dla niestandardowego motywu, zamiast starszego.", + "css_class": "wartość tej etykiety jest dodawana jako klasa CSS do węzła reprezentującego daną notatkę w drzewie. Może to być przydatne do zaawansowanego motywowania. Może być używane w notatkach-szablonach.", + "icon_class": "wartość tej etykiety jest dodawana jako klasa CSS do ikony w drzewie, co może pomóc wizualnie odróżnić notatki w drzewie. Przykładem może być bx bx-home - ikony pochodzą z boxicons. Może być używane w notatkach-szablonach.", + "page_size": "liczba elementów na stronie w liście notatek", + "custom_request_handler": "zobacz Niestandardowy obsługujący żądania", + "custom_resource_provider": "zobacz Niestandardowy obsługujący żądania", + "widget": "oznacza tę notatkę jako niestandardowy widżet, który zostanie dodany do drzewa komponentów Trilium", + "workspace": "oznacza tę notatkę jako obszar roboczy, co pozwala na łatwe podnoszenie", + "workspace_icon_class": "definiuje klasę CSS ikony box, która będzie używana w karcie po podniesieniu do tej notatki", + "workspace_tab_background_color": "Kolor CSS używany w karcie notatki po podniesieniu do tej notatki", + "workspace_calendar_root": "Definiuje korzeń kalendarza dla obszaru roboczego", + "workspace_template": "Ta notatka pojawi się w wyborze dostępnych szablonów podczas tworzenia nowej notatki, ale tylko po podniesieniu do obszaru roboczego zawierającego ten szablon", + "search_home": "nowe notatki wyszukiwania będą tworzone jako dzieci tej notatki", + "workspace_search_home": "nowe notatki wyszukiwania będą tworzone jako dzieci tej notatki po podniesieniu do jakiegoś przodka tej notatki obszaru roboczego", + "inbox": "domyślna lokalizacja skrzynki odbiorczej dla nowych notatek - gdy tworzysz notatkę za pomocą przycisku \"nowa notatka\" na pasku bocznym, notatki będą tworzone jako notatki podrzędne w notatce oznaczonej etykietą #inbox.", + "workspace_inbox": "domyślna lokalizacja skrzynki odbiorczej dla nowych notatek po podniesieniu do jakiegoś przodka tej notatki obszaru roboczego", + "sql_console_home": "domyślna lokalizacja notatek konsoli SQL", + "bookmark_folder": "notatka z tą etykietą pojawi się w zakładkach jako folder (umożliwiając dostęp do jej dzieci)", + "share_hidden_from_tree": "ta notatka jest ukryta w lewym drzewie nawigacyjnym, ale nadal dostępna pod swoim adresem URL", + "share_external_link": "notatka będzie działać jako link do zewnętrznej strony internetowej w drzewie udostępniania", + "share_alias": "zdefiniuj alias, za pomocą którego notatka będzie dostępna pod adresem https://your_trilium_host/share/[your_alias]", + "share_omit_default_css": "domyślny CSS strony udostępniania zostanie pominięty. Użyj, gdy wprowadzasz obszerne zmiany w stylizacji.", + "share_root": "oznacza notatkę, która jest serwowana w katalogu głównym /share.", + "share_description": "zdefiniuj tekst, który ma być dodany do metatagu HTML dla opisu", + "share_raw": "notatka będzie serwowana w surowym formacie, bez opakowania HTML", + "share_disallow_robot_indexing": "zabroni robotom indeksowania tej notatki za pomocą nagłówka X-Robots-Tag: noindex", + "share_credentials": "wymagaj poświadczeń, aby uzyskać dostęp do tej udostępnionej notatki. Oczekuje się, że wartość będzie w formacie 'nazwa_użytkownika:hasło'. Nie zapomnij uczynić tego dziedzicznym, aby zastosować do notatek podrzędnych/obrazów.", + "share_index": "notatka z tą etykietą będzie zawierać listę wszystkich korzeni udostępnionych notatek", + "display_relations": "rozdzielone przecinkami nazwy relacji, które powinny być wyświetlane. Wszystkie inne będą ukryte.", + "hide_relations": "rozdzielone przecinkami nazwy relacji, które powinny być ukryte. Wszystkie inne będą wyświetlane.", + "title_template": "domyślny tytuł notatek tworzonych jako dzieci tej notatki. Wartość jest oceniana jako ciąg znaków JavaScript\n i dlatego może być wzbogacona o dynamiczną treść za pomocą wstrzykniętych zmiennych now i parentNote. Przykłady:\n \n
    \n
  • ${parentNote.getLabelValue('authorName')}'s literary works
  • \n
  • Log for ${now.format('YYYY-MM-DD HH:mm:ss')}
  • \n
\n \n Zobacz wiki ze szczegółami, dokumentację API dla parentNote i now, aby uzyskać szczegółowe informacje.", + "template": "Ta notatka pojawi się w wyborze dostępnych szablonów podczas tworzenia nowej notatki", + "toc": "#toc lub #toc=show wymusi wyświetlenie spisu treści, #toc=hide wymusi jego ukrycie. Jeśli etykieta nie istnieje, obserwowane jest ustawienie globalne", + "color": "definiuje kolor notatki w drzewie notatek, linkach itp. Użyj dowolnej prawidłowej wartości koloru CSS, np. 'red' lub #a13d5f", + "keyboard_shortcut": "Definiuje skrót klawiaturowy, który natychmiast przejdzie do tej notatki. Przykład: 'ctrl+alt+e'. Wymaga ponownego załadowania frontendu, aby zmiana zaczęła obowiązywać.", + "keep_current_hoisting": "Otwarcie tego linku nie zmieni podniesienia, nawet jeśli notatka nie jest wyświetlana w bieżącym podniesionym poddrzewie.", + "execute_button": "Tytuł przycisku, który wykona bieżącą notatkę kodu", + "execute_description": "Dłuższy opis bieżącej notatki kodu wyświetlany razem z przyciskiem wykonania", + "exclude_from_note_map": "Notatki z tą etykietą będą ukryte na Mapie Notatek", + "new_notes_on_top": "Nowe notatki będą tworzone na górze notatki nadrzędnej, a nie na dole.", + "hide_highlight_widget": "Ukryj widżet listy wyróżnień", + "run_on_note_creation": "wykonuje się, gdy notatka jest tworzona na backendzie. Użyj tej relacji, jeśli chcesz uruchomić skrypt dla wszystkich notatek utworzonych w określonym poddrzewie. W takim przypadku utwórz ją w korzeniu poddrzewa i uczyń dziedziczną. Nowa notatka utworzona w poddrzewie (na dowolnej głębokości) uruchomi skrypt.", + "run_on_child_note_creation": "wykonuje się, gdy nowa notatka jest tworzona pod notatką, w której zdefiniowano tę relację", + "run_on_note_title_change": "wykonuje się, gdy tytuł notatki jest zmieniany (obejmuje również tworzenie notatki)", + "run_on_note_content_change": "wykonuje się, gdy zawartość notatki jest zmieniana (obejmuje również tworzenie notatki).", + "run_on_note_change": "wykonuje się, gdy notatka jest zmieniana (obejmuje również tworzenie notatki). Nie obejmuje zmian w zawartości", + "run_on_note_deletion": "wykonuje się, gdy notatka jest usuwana", + "run_on_branch_creation": "wykonuje się, gdy tworzona jest gałąź. Gałąź to połączenie między notatką nadrzędną a podrzędną i jest tworzona np. podczas klonowania lub przenoszenia notatki.", + "run_on_branch_change": "wykonuje się, gdy gałąź jest aktualizowana.", + "run_on_branch_deletion": "wykonuje się, gdy gałąź jest usuwana. Gałąź to połączenie między notatką nadrzędną a podrzędną i jest usuwana np. podczas przenoszenia notatki (stara gałąź/link jest usuwana).", + "run_on_attribute_creation": "wykonuje się, gdy tworzony jest nowy atrybut dla notatki, która definiuje tę relację", + "run_on_attribute_change": " wykonuje się, gdy atrybut jest zmieniany w notatce, która definiuje tę relację. Jest to również wyzwalane, gdy atrybut jest usuwany", + "relation_template": "atrybuty notatki będą dziedziczone nawet bez relacji rodzic-dziecko, zawartość i poddrzewo notatki zostaną dodane do notatek instancji, jeśli są puste. Zobacz dokumentację, aby uzyskać szczegółowe informacje.", + "inherit": "atrybuty notatki będą dziedziczone nawet bez relacji rodzic-dziecko. Zobacz relację szablonu dla podobnego konceptu. Zobacz dziedziczenie atrybutów w dokumentacji.", + "render_note": "notatki typu \"renderuj notatkę HTML\" będą renderowane za pomocą notatki kodu (HTML lub skrypt) i konieczne jest wskazanie za pomocą tej relacji, która notatka ma być renderowana", + "widget_relation": "cel tej relacji zostanie wykonany i wyrenderowany jako widżet na pasku bocznym", + "share_css": "Notatka CSS, która zostanie wstrzyknięta na stronę udostępniania. Notatka CSS musi również znajdować się w udostępnionym poddrzewie. Rozważ również użycie 'share_hidden_from_tree' i 'share_omit_default_css'.", + "share_js": "Notatka JavaScript, która zostanie wstrzyknięta na stronę udostępniania. Notatka JS musi również znajdować się w udostępnionym poddrzewie. Rozważ użycie 'share_hidden_from_tree'.", + "share_template": "Wbudowana notatka JavaScript, która będzie używana jako szablon do wyświetlania udostępnionej notatki. W razie niepowodzenia używany jest domyślny szablon. Rozważ użycie 'share_hidden_from_tree'.", + "share_favicon": "Notatka favicon do ustawienia na udostępnionej stronie. Zazwyczaj chcesz ustawić ją w katalogu głównym udostępniania i uczynić ją dziedziczną. Notatka favicon musi również znajdować się w udostępnionym poddrzewie. Rozważ użycie 'share_hidden_from_tree'.", + "is_owned_by_note": "jest własnością notatki", + "other_notes_with_name": "Inne notatki z nazwą {{attributeType}} \"{{attributeName}}\"", + "and_more": "... i {{count}} więcej.", + "print_landscape": "Podczas eksportowania do formatu PDF zmienia orientację strony na poziomą zamiast pionowej.", + "print_page_size": "Podczas eksportowania do formatu PDF zmienia rozmiar strony. Obsługiwane wartości: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.", + "color_type": "Kolor" }, "import": { "importIntoNote": "Importuj do notatki", @@ -268,7 +396,13 @@ "description": "Skonfiguruj, które tagi HTML mają zostać zachowane podczas importowania notatek. Tagi spoza tej listy zostaną usunięte podczas importu. Niektóre tagi (np. „script”) są zawsze usuwane ze względów bezpieczeństwa.", "placeholder": "Wpisz tagi HTML, jedna na linijkę", "reset_button": "Zresetuj do domyślnej listy" - } + }, + "explodeArchivesTooltip": "Jeśli ta opcja jest zaznaczona, Trilium odczyta pliki .zip, .enex i .opml i utworzy notatki z plików wewnątrz tych archiwów. Jeśli opcja nie jest zaznaczona, Trilium dołączy same archiwa do notatki.", + "explodeArchives": "Czytaj zawartość archiwów .zip, .enex i .opml.", + "shrinkImagesTooltip": "

Jeśli zaznaczysz tę opcję, Trilium spróbuje zmniejszyć importowane obrazy poprzez skalowanie i optymalizację, co może wpłynąć na postrzeganą jakość obrazu. Jeśli opcja nie jest zaznaczona, obrazy zostaną zaimportowane bez zmian.

Nie dotyczy to importów .zip z metadanymi, ponieważ zakłada się, że te pliki są już zoptymalizowane.

", + "textImportedAsText": "Importuj HTML, Markdown i TXT jako notatki tekstowe, jeśli nie jest to jasne z metadanych", + "codeImportedAsCode": "Importuj rozpoznane pliki kodu (np. .json) jako notatki kodu, jeśli nie jest to jasne z metadanych", + "replaceUnderscoresWithSpaces": "Zastąp podkreślenia spacjami w nazwach importowanych notatek" }, "image_properties": { "title": "Obraz", @@ -353,7 +487,12 @@ "search_parameters": "Parametry wyszukiwania", "unknown_search_option": "Nieznana opcja wyszukiwania {{searchOptionName}}", "search_note_saved": "Wyszukiwana notatka została zapisana do {{- notePathTitle}}", - "actions_executed": "Akcja została wykonana." + "actions_executed": "Akcja została wykonana.", + "debug": "debugowanie", + "debug_description": "Debugowanie wydrukuje dodatkowe informacje debugowania w konsoli, aby pomóc w debugowaniu złożonych zapytań", + "action": "akcja", + "search_button": "Szukaj", + "search_execute": "Szukaj i wykonaj akcje" }, "similar_notes": { "title": "Podobne notatki", @@ -375,10 +514,12 @@ }, "debug": { "debug": "Debuguj", - "debug_info": "Debugowanie wyświetli dodatkowe informacje debugowania w konsoli, aby ułatwić debugowanie złożonych zapytań." + "debug_info": "Debugowanie wyświetli dodatkowe informacje debugowania w konsoli, aby ułatwić debugowanie złożonych zapytań.", + "access_info": "Aby uzyskać dostęp do informacji debugowania, wykonaj zapytanie i kliknij \"Pokaż logi backendu\" w lewym górnym rogu." }, "fast_search": { - "fast_search": "Szybkie wyszukiwanie" + "fast_search": "Szybkie wyszukiwanie", + "description": "Opcja szybkiego wyszukiwania wyłącza pełnotekstowe przeszukiwanie zawartości notatek, co może przyspieszyć wyszukiwanie w dużych bazach danych." }, "file_properties": { "download": "Pobierz", @@ -386,13 +527,21 @@ "upload_new_revision": "Wgraj nową wersję", "upload_success": "Nowa wersja pliku nie została wysłana.", "upload_failed": "Wysyłanie nowej wersji pliku się nie udało.", - "title": "Plik" + "title": "Plik", + "note_id": "ID notatki", + "original_file_name": "Oryginalna nazwa pliku", + "file_type": "Typ pliku", + "file_size": "Rozmiar pliku" }, "include_note": { "label_note": "Notatka", "placeholder_search": "szukaj notatki po jej nazwie", "dialog_title": "Dołącz notatkę", - "button_include": "Dołącz notatkę" + "button_include": "Dołącz notatkę", + "box_size_prompt": "Rozmiar okna dołączonej notatki:", + "box_size_small": "mały (~ 10 linii)", + "box_size_medium": "średni (~ 30 linii)", + "box_size_full": "pełny (okno pokazuje cały tekst)" }, "info": { "closeButton": "Zamknij", @@ -406,10 +555,12 @@ "markdown_import": { "dialog_title": "Zaimportuj Markdown", "import_button": "Import", - "import_success": "Treść Markdown została zaimportowana do dokumentu." + "import_success": "Treść Markdown została zaimportowana do dokumentu.", + "modal_body_text": "Ze względu na środowisko przeglądarki nie jest możliwe bezpośrednie odczytanie schowka z JavaScript. Wklej Markdown do importu do poniższego pola tekstowego i kliknij przycisk Importuj" }, "limit": { - "limit": "Limit" + "limit": "Limit", + "take_first_x_results": "Weź tylko pierwsze X określonych wyników." }, "link_context_menu": { "open_note_in_popup": "Szybka edycja", @@ -418,7 +569,13 @@ "open_note_in_new_window": "Otwórz notatkę w nowym oknie" }, "electron_integration": { - "desktop-application": "Aplikacja desktopowa" + "desktop-application": "Aplikacja desktopowa", + "native-title-bar": "Natywny pasek tytułu", + "native-title-bar-description": "Dla systemów Windows i macOS wyłączenie natywnego paska tytułu sprawia, że aplikacja wygląda bardziej kompaktowo. W systemie Linux włączenie natywnego paska tytułu lepiej integruje się z resztą systemu.", + "background-effects": "Włącz efekty tła (tylko Windows 11)", + "background-effects-description": "Efekt Mica dodaje rozmyte, stylowe tło do okien aplikacji, tworząc głębię i nowoczesny wygląd. \"Natywny pasek tytułu\" musi być wyłączony.", + "restart-app-button": "Uruchom ponownie aplikację, aby zobaczyć zmiany", + "zoom-factor": "Współczynnik powiększenia" }, "electron_context_menu": { "cut": "Wytnij", @@ -426,7 +583,8 @@ "copy-link": "Kopiuj link", "paste": "Wklej", "paste-as-plain-text": "Wklej jako plain text", - "search_online": "Szukaj \"{{term}}\" za pomocą {{searchEngine}}" + "search_online": "Szukaj \"{{term}}\" za pomocą {{searchEngine}}", + "add-term-to-dictionary": "Dodaj \"{{term}}\" do słownika" }, "image_context_menu": { "copy_reference_to_clipboard": "Skopiuj odnośnik do schowka", @@ -435,7 +593,10 @@ "note_autocomplete": { "clear-text-field": "Wyczyść pole tekstowe", "show-recent-notes": "Pokaż ostatnie notatki", - "full-text-search": "Wyszukiwanie pełnotekstowe" + "full-text-search": "Wyszukiwanie pełnotekstowe", + "search-for": "Szukaj \"{{term}}\"", + "create-note": "Utwórz i połącz notatkę podrzędną \"{{term}}\"", + "insert-external-link": "Wstaw link zewnętrzny do \"{{term}}\"" }, "note_tooltip": { "note-has-been-deleted": "Notatka została usunięta.", @@ -448,7 +609,15 @@ "days": "dni" }, "share": { - "title": "Ustawienia udostępniania" + "title": "Ustawienia udostępniania", + "redirect_bare_domain": "Przekieruj gołą domenę na stronę udostępniania", + "redirect_bare_domain_description": "Przekieruj anonimowych użytkowników na stronę udostępniania zamiast pokazywać stronę logowania", + "show_login_link": "Pokaż link logowania w motywie udostępniania", + "show_login_link_description": "Dodaj link logowania do stopki strony udostępniania", + "check_share_root": "Sprawdź status korzenia udostępniania", + "share_root_found": "Notatka korzenia udostępniania '{{noteTitle}}' jest gotowa", + "share_root_not_found": "Nie znaleziono notatki z etykietą #shareRoot", + "share_root_not_shared": "Notatka '{{noteTitle}}' ma etykietę #shareRoot, ale nie jest udostępniona" }, "tasks": { "due": { @@ -499,7 +668,11 @@ "editorfeatures": { "title": "Cechy", "emoji_completion_enabled": "Włącz autouzupełnianie Emoji", - "note_completion_enabled": "Włącz autouzupełnianie notatki" + "note_completion_enabled": "Włącz autouzupełnianie notatki", + "emoji_completion_description": "Jeśli włączone, emoji można łatwo wstawiać do tekstu, wpisując `:`, a następnie nazwę emoji.", + "note_completion_description": "Jeśli włączone, linki do notatek można tworzyć, wpisując `@`, a następnie tytuł notatki.", + "slash_commands_enabled": "Włącz polecenia z ukośnikiem", + "slash_commands_description": "Jeśli włączone, polecenia edycji, takie jak wstawianie podziałów wierszy lub nagłówków, można przełączać, wpisując `/`." }, "table_view": { "new-row": "Nowy wiersz", @@ -536,23 +709,34 @@ }, "move_to": { "dialog_title": "Przenieś notatki do ...", - "notes_to_move": "Notatki do przeniesienia" + "notes_to_move": "Notatki do przeniesienia", + "target_parent_note": "Docelowa notatka nadrzędna", + "search_placeholder": "szukaj notatki po jej nazwie", + "move_button": "Przenieś do wybranej notatki", + "error_no_path": "Brak ścieżki do przeniesienia.", + "move_success_message": "Wybrane notatki zostały przeniesione do " }, "note_type_chooser": { "modal_title": "Wybierz typ notatki", "modal_body": "Wybierz typ / szablon notatki dla nowej notatki:", "templates": "Szablony", - "builtin_templates": "Wbudowane szablony" + "builtin_templates": "Wbudowane szablony", + "change_path_prompt": "Zmień ścieżkę, gdzie utworzyć nową notatkę:", + "search_placeholder": "wyszukaj ścieżkę po nazwie (domyślna, jeśli pusta)" }, "password_not_set": { - "title": "Hasło nie zostało ustawione" + "title": "Hasło nie zostało ustawione", + "body1": "Chronione notatki są szyfrowane hasłem użytkownika, ale hasło nie zostało jeszcze ustawione.", + "body2": "Aby móc chronić notatki, kliknij poniższy przycisk, aby otworzyć okno dialogowe Opcje i ustawić hasło.", + "go_to_password_options": "Przejdź do opcji hasła" }, "add_relation": { "add_relation": "Dodaj powiązanie", "relation_name": "nazwa powiązania", "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.", "to": "do", - "target_note": "docelowa notatka" + "target_note": "docelowa notatka", + "create_relation_on_all_matched_notes": "We wszystkich dopasowanych notatkach utwórz daną relację." }, "ai_llm": { "actions": "Akcje", @@ -629,6 +813,1276 @@ "disabled_providers": "Wyłączeni dostawcy", "remove_provider": "Usuń dostawcę z wyszukiwania", "restore_provider": "Przywróć dostawcę do wyszukiwania", - "similarity_threshold": "Próg podobieństwa" + "similarity_threshold": "Próg podobieństwa", + "not_started": "Nie rozpoczęto", + "title": "Ustawienia AI", + "processed_notes": "Przetworzone notatki", + "total_notes": "Wszystkie notatki", + "progress": "Postęp", + "similarity_threshold_description": "Minimalny wynik podobieństwa (0-1) dla notatek, które mają być uwzględnione w kontekście zapytań LLM", + "reprocess_index": "Odbuduj indeks wyszukiwania", + "reprocessing_index": "Odbudowywanie...", + "reprocess_index_started": "Optymalizacja indeksu wyszukiwania rozpoczęta w tle", + "reprocess_index_error": "Błąd odbudowywania indeksu wyszukiwania", + "index_rebuild_progress": "Postęp odbudowy indeksu", + "index_rebuilding": "Optymalizowanie indeksu ({{percentage}}%)", + "index_rebuild_complete": "Optymalizacja indeksu zakończona", + "index_rebuild_status_error": "Błąd sprawdzania statusu odbudowy indeksu", + "never": "Nigdy", + "processing": "Przetwarzanie ({{percentage}}%)", + "incomplete": "Niekompletne ({{percentage}}%)", + "complete": "Ukończono (100%)", + "refreshing": "Odświeżanie...", + "auto_refresh_notice": "Automatyczne odświeżanie co {{seconds}} sekund", + "note_queued_for_retry": "Notatka zakolejkowana do ponownej próby", + "failed_to_retry_note": "Nie udało się ponowić próby dla notatki", + "all_notes_queued_for_retry": "Wszystkie nieudane notatki zakolejkowane do ponownej próby", + "failed_to_retry_all": "Nie udało się ponowić próby dla notatek", + "ai_settings": "Ustawienia AI", + "api_key_tooltip": "Klucz API do uzyskiwania dostępu do usługi", + "empty_key_warning": { + "anthropic": "Klucz API Anthropic jest pusty. Wprowadź prawidłowy klucz API.", + "openai": "Klucz API OpenAI jest pusty. Wprowadź prawidłowy klucz API.", + "voyage": "Klucz API Voyage jest pusty. Wprowadź prawidłowy klucz API.", + "ollama": "Klucz API Ollama jest pusty. Wprowadź prawidłowy klucz API." + }, + "agent": { + "processing": "Przetwarzanie...", + "thinking": "Myślenie...", + "loading": "Ładowanie...", + "generating": "Generowanie..." + }, + "name": "AI", + "openai": "OpenAI", + "use_enhanced_context": "Użyj rozszerzonego kontekstu", + "enhanced_context_description": "Dostarcza AI więcej kontekstu z notatki i jej powiązanych notatek dla lepszych odpowiedzi", + "show_thinking": "Pokaż proces myślowy", + "show_thinking_description": "Pokaż proces myślowy AI", + "enter_message": "Wpisz swoją wiadomość...", + "error_contacting_provider": "Błąd kontaktu z dostawcą AI. Sprawdź ustawienia i połączenie internetowe.", + "error_generating_response": "Błąd generowania odpowiedzi AI", + "notes_indexed_0": "{{ count }} notatka zaindeksowana", + "notes_indexed_1": "{{ count }} notatek zaindeksowanych", + "notes_indexed_2": "", + "sources": "Źródła", + "start_indexing": "Rozpocznij indeksowanie", + "use_advanced_context": "Użyj zaawansowanego kontekstu", + "ollama_no_url": "Ollama nie jest skonfigurowana. Wprowadź prawidłowy URL.", + "chat": { + "root_note_title": "Czaty AI", + "root_note_content": "Ta notatka zawiera zapisane rozmowy na czacie AI.", + "new_chat_title": "Nowy czat", + "create_new_ai_chat": "Utwórz nowy czat AI" + }, + "create_new_ai_chat": "Utwórz nowy czat AI", + "configuration_warnings": "Występują problemy z konfiguracją AI. Sprawdź ustawienia.", + "experimental_warning": "Funkcja LLM jest obecnie eksperymentalna - zostałeś ostrzeżony.", + "selected_provider": "Wybrany dostawca", + "selected_provider_description": "Wybierz dostawcę AI dla funkcji czatu i uzupełniania", + "select_model": "Wybierz model...", + "select_provider": "Wybierz dostawcę...", + "ai_enabled": "Funkcje AI włączone", + "ai_disabled": "Funkcje AI wyłączone", + "no_models_found_online": "Nie znaleziono modeli. Sprawdź swój klucz API i ustawienia.", + "no_models_found_ollama": "Nie znaleziono modeli Ollama. Sprawdź, czy Ollama jest uruchomiona.", + "error_fetching": "Błąd pobierania modeli: {{error}}" + }, + "prompt": { + "title": "Monit", + "ok": "OK", + "defaultTitle": "Monit" + }, + "protected_session_password": { + "modal_title": "Sesja chroniona", + "help_title": "Pomoc dotycząca notatek chronionych", + "close_label": "Zamknij", + "form_label": "Aby kontynuować żądaną akcję, musisz rozpocząć sesję chronioną, wprowadzając hasło:", + "start_button": "Rozpocznij sesję chronioną" + }, + "recent_changes": { + "title": "Ostatnie zmiany", + "erase_notes_button": "Wymaż teraz usunięte notatki", + "deleted_notes_message": "Usunięte notatki zostały wymazane.", + "no_changes_message": "Brak zmian...", + "undelete_link": "przywróć", + "confirm_undelete": "Czy chcesz przywrócić tę notatkę i jej podnotatki?" + }, + "revisions": { + "note_revisions": "Wersje notatki", + "delete_all_revisions": "Usuń wszystkie wersje tej notatki", + "delete_all_button": "Usuń wszystkie wersje", + "help_title": "Pomoc dotycząca wersji notatki", + "revision_last_edited": "Ta wersja była ostatnio edytowana {{date}}", + "confirm_delete_all": "Czy chcesz usunąć wszystkie wersje tej notatki?", + "no_revisions": "Brak wersji dla tej notatki...", + "restore_button": "Przywróć", + "diff_on": "Pokaż różnice", + "diff_off": "Pokaż zawartość", + "diff_on_hint": "Kliknij, aby pokazać różnice w źródle notatki", + "diff_off_hint": "Kliknij, aby pokazać zawartość notatki", + "diff_not_available": "Różnice nie są dostępne.", + "confirm_restore": "Czy chcesz przywrócić tę wersję? Spowoduje to nadpisanie bieżącego tytułu i zawartości notatki tą wersją.", + "delete_button": "Usuń", + "confirm_delete": "Czy chcesz usunąć tę wersję?", + "revisions_deleted": "Wersje notatki zostały usunięte.", + "revision_restored": "Wersja notatki została przywrócona.", + "revision_deleted": "Wersja notatki została usunięta.", + "snapshot_interval": "Interwał migawki wersji notatki: {{seconds}}s.", + "maximum_revisions": "Limit migawek wersji notatki: {{number}}.", + "settings": "Ustawienia wersji notatki", + "download_button": "Pobierz", + "mime": "MIME: ", + "file_size": "Rozmiar pliku:", + "preview": "Podgląd:", + "preview_not_available": "Podgląd nie jest dostępny dla tego typu notatki." + }, + "sort_child_notes": { + "sort_children_by": "Sortuj elementy podrzędne według...", + "sorting_criteria": "Kryteria sortowania", + "title": "tytuł", + "date_created": "data utworzenia", + "date_modified": "data modyfikacji", + "sorting_direction": "Kierunek sortowania", + "ascending": "rosnąco", + "descending": "malejąco", + "folders": "Foldery", + "sort_folders_at_top": "sortuj foldery na górze", + "natural_sort": "Sortowanie naturalne", + "sort_with_respect_to_different_character_sorting": "sortuj z uwzględnieniem różnych zasad sortowania znaków i zestawień w różnych językach lub regionach.", + "natural_sort_language": "Język sortowania naturalnego", + "the_language_code_for_natural_sort": "Kod języka dla sortowania naturalnego, np. \"zh-CN\" dla chińskiego.", + "sort": "Sortuj" + }, + "upload_attachments": { + "upload_attachments_to_note": "Prześlij załączniki do notatki", + "choose_files": "Wybierz pliki", + "files_will_be_uploaded": "Pliki zostaną przesłane jako załączniki do {{noteTitle}}", + "options": "Opcje", + "shrink_images": "Zmniejsz obrazy", + "upload": "Prześlij", + "tooltip": "Jeśli zaznaczysz tę opcję, Trilium spróbuje zmniejszyć przesyłane obrazy poprzez skalowanie i optymalizację, co może wpłynąć na postrzeganą jakość obrazu. Jeśli opcja nie jest zaznaczona, obrazy zostaną przesłane bez zmian." + }, + "attribute_editor": { + "help_text_body1": "Aby dodać etykietę, po prostu wpisz np. #rock lub jeśli chcesz dodać również wartość, to np. #year = 2020", + "help_text_body2": "Dla relacji wpisz ~author = @, co powinno wywołać autouzupełnianie, w którym możesz wyszukać żądaną notatkę.", + "help_text_body3": "Alternatywnie możesz dodać etykietę i relację za pomocą przycisku + po prawej stronie.", + "save_attributes": "Zapisz atrybuty ", + "add_a_new_attribute": "Dodaj nowy atrybut", + "add_new_label": "Dodaj nową etykietę ", + "add_new_relation": "Dodaj nową relację ", + "add_new_label_definition": "Dodaj nową definicję etykiety", + "add_new_relation_definition": "Dodaj nową definicję relacji", + "placeholder": "Wpisz tutaj etykiety i relacje" + }, + "abstract_bulk_action": { + "remove_this_search_action": "Usuń tę akcję wyszukiwania" + }, + "execute_script": { + "execute_script": "Wykonaj skrypt", + "help_text": "Możesz wykonywać proste skrypty na dopasowanych notatkach.", + "example_1": "Na przykład, aby dołączyć ciąg znaków do tytułu notatki, użyj tego małego skryptu:", + "example_2": "Bardziej złożonym przykładem byłoby usunięcie wszystkich atrybutów dopasowanej notatki:" + }, + "delete_label": { + "delete_label": "Usuń etykietę", + "label_name_placeholder": "nazwa etykiety", + "label_name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "rename_label": { + "rename_label": "Zmień nazwę etykiety", + "rename_label_from": "Zmień nazwę etykiety z", + "old_name_placeholder": "stara nazwa", + "to": "Na", + "new_name_placeholder": "nowa nazwa", + "name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "update_label_value": { + "update_label_value": "Zaktualizuj wartość etykiety", + "label_name_placeholder": "nazwa etykiety", + "label_name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.", + "to_value": "do wartości", + "new_value_placeholder": "nowa wartość", + "help_text": "We wszystkich dopasowanych notatkach zmień wartość istniejącej etykiety.", + "help_text_note": "Możesz również wywołać tę metodę bez wartości, w takim przypadku etykieta zostanie przypisana do notatki bez wartości." + }, + "delete_note": { + "delete_note": "Usuń notatkę", + "delete_matched_notes": "Usuń dopasowane notatki", + "delete_matched_notes_description": "Spowoduje to usunięcie dopasowanych notatek.", + "undelete_notes_instruction": "Po usunięciu można je przywrócić z okna dialogowego Ostatnie zmiany.", + "erase_notes_instruction": "Aby trwale usunąć notatki, możesz po usunięciu przejść do Opcje -> Inne i kliknąć przycisk \"Wymaż teraz usunięte notatki\"." + }, + "delete_revisions": { + "delete_note_revisions": "Usuń wersje notatek", + "all_past_note_revisions": "Wszystkie przeszłe wersje dopasowanych notatek zostaną usunięte. Sama notatka zostanie w pełni zachowana. Innymi słowy, historia notatki zostanie usunięta." + }, + "move_note": { + "move_note": "Przenieś notatkę", + "to": "do", + "target_parent_note": "docelowa notatka nadrzędna", + "on_all_matched_notes": "We wszystkich dopasowanych notatkach", + "move_note_new_parent": "przenieś notatkę do nowego rodzica, jeśli notatka ma tylko jednego rodzica (tj. stara gałąź jest usuwana, a nowa gałąź do nowego rodzica jest tworzona)", + "clone_note_new_parent": "sklonuj notatkę do nowego rodzica, jeśli notatka ma wiele klonów/gałęzi (nie jest jasne, która gałąź powinna zostać usunięta)", + "nothing_will_happen": "nic się nie stanie, jeśli notatka nie może być przeniesiona do notatki docelowej (tj. spowodowałoby to cykl w drzewie)" + }, + "rename_note": { + "rename_note": "Zmień nazwę notatki", + "rename_note_title_to": "Zmień tytuł notatki na", + "new_note_title": "nowy tytuł notatki", + "click_help_icon": "Kliknij ikonę pomocy po prawej stronie, aby zobaczyć wszystkie opcje", + "evaluated_as_js_string": "Podana wartość jest oceniana jako ciąg znaków JavaScript i dlatego może być wzbogacona o dynamiczną treść za pomocą wstrzykniętej zmiennej note (notatka, której nazwa jest zmieniana). Przykłady:", + "example_note": "Notatka - wszystkie dopasowane notatki mają zmienioną nazwę na 'Notatka'", + "example_new_title": "NOWY: ${note.title} - tytuły dopasowanych notatek są poprzedzone prefiksem 'NOWY: '", + "example_date_prefix": "${note.dateCreatedObj.format('MM-DD:')}: ${note.title} - dopasowane notatki są poprzedzone prefiksem miesiąc-dzień utworzenia notatki", + "api_docs": "Zobacz dokumentację API dla note i jej właściwości dateCreatedObj / utcDateCreatedObj, aby uzyskać szczegółowe informacje." + }, + "delete_relation": { + "delete_relation": "Usuń relację", + "relation_name": "nazwa relacji", + "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "rename_relation": { + "rename_relation": "Zmień nazwę relacji", + "rename_relation_from": "Zmień nazwę relacji z", + "old_name": "stara nazwa", + "to": "Na", + "new_name": "nowa nazwa", + "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "update_relation_target": { + "update_relation": "Zaktualizuj relację", + "relation_name": "nazwa relacji", + "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.", + "to": "do", + "target_note": "notatka docelowa", + "on_all_matched_notes": "We wszystkich dopasowanych notatkach", + "change_target_note": "zmień notatkę docelową istniejącej relacji", + "update_relation_target": "Zaktualizuj cel relacji" + }, + "attachments_actions": { + "open_externally": "Otwórz zewnętrznie", + "open_externally_title": "Plik zostanie otwarty w zewnętrznej aplikacji i będzie obserwowany pod kątem zmian. Następnie będziesz mógł przesłać zmodyfikowaną wersję z powrotem do Trilium.", + "open_custom": "Otwórz niestandardowo", + "open_custom_title": "Plik zostanie otwarty w zewnętrznej aplikacji i będzie obserwowany pod kątem zmian. Następnie będziesz mógł przesłać zmodyfikowaną wersję z powrotem do Trilium.", + "download": "Pobierz", + "rename_attachment": "Zmień nazwę załącznika", + "upload_new_revision": "Prześlij nową wersję", + "copy_link_to_clipboard": "Kopiuj link do schowka", + "convert_attachment_into_note": "Konwertuj załącznik na notatkę", + "delete_attachment": "Usuń załącznik", + "upload_success": "Nowa wersja załącznika została przesłana.", + "upload_failed": "Przesyłanie nowej wersji załącznika nie powiodło się.", + "open_externally_detail_page": "Otwieranie załącznika zewnętrznie jest dostępne tylko ze strony szczegółów, najpierw kliknij szczegóły załącznika i powtórz akcję.", + "open_custom_client_only": "Niestandardowe otwieranie załączników można wykonać tylko z klienta stacjonarnego.", + "delete_confirm": "Czy na pewno chcesz usunąć załącznik '{{title}}'?", + "delete_success": "Załącznik '{{title}}' został usunięty.", + "convert_confirm": "Czy na pewno chcesz przekonwertować załącznik '{{title}}' na osobną notatkę?", + "convert_success": "Załącznik '{{title}}' został przekonwertowany na notatkę.", + "enter_new_name": "Wprowadź nową nazwę załącznika" + }, + "calendar": { + "mon": "Pon", + "tue": "Wt", + "wed": "Śr", + "thu": "Czw", + "fri": "Pt", + "sat": "Sob", + "sun": "Niedz", + "cannot_find_day_note": "Nie można znaleźć notatki dziennej", + "cannot_find_week_note": "Nie można znaleźć notatki tygodniowej", + "january": "Styczeń", + "february": "Luty", + "march": "Marzec", + "april": "Kwiecień", + "may": "Maj", + "june": "Czerwiec", + "july": "Lipiec", + "august": "Sierpień", + "september": "Wrzesień", + "october": "Październik", + "november": "Listopad", + "december": "Grudzień", + "week": "Tydzień", + "week_previous": "Poprzedni tydzień", + "week_next": "Następny tydzień", + "month": "Miesiąc", + "month_previous": "Poprzedni miesiąc", + "month_next": "Następny miesiąc", + "year": "Rok", + "year_previous": "Poprzedni rok", + "year_next": "Następny rok", + "list": "Lista", + "today": "Dzisiaj" + }, + "close_pane_button": { + "close_this_pane": "Zamknij ten panel" + }, + "create_pane_button": { + "create_new_split": "Utwórz nowy podział" + }, + "edit_button": { + "edit_this_note": "Edytuj tę notatkę" + }, + "show_toc_widget_button": { + "show_toc": "Pokaż spis treści" + }, + "show_highlights_list_widget_button": { + "show_highlights_list": "Pokaż listę wyróżnień" + }, + "global_menu": { + "menu": "Menu", + "options": "Opcje", + "open_new_window": "Otwórz nowe okno", + "switch_to_mobile_version": "Przełącz na wersję mobilną", + "switch_to_desktop_version": "Przełącz na wersję stacjonarną", + "zoom": "Powiększenie", + "toggle_fullscreen": "Przełącz pełny ekran", + "zoom_out": "Pomniejsz", + "reset_zoom_level": "Zresetuj poziom powiększenia", + "zoom_in": "Powiększ", + "configure_launchbar": "Skonfiguruj pasek uruchamiania", + "show_shared_notes_subtree": "Pokaż poddrzewo udostępnionych notatek", + "advanced": "Zaawansowane", + "open_dev_tools": "Otwórz narzędzia deweloperskie", + "open_sql_console": "Otwórz konsolę SQL", + "open_sql_console_history": "Otwórz historię konsoli SQL", + "open_search_history": "Otwórz historię wyszukiwania", + "show_backend_log": "Pokaż logi backendu", + "reload_hint": "Przeładowanie może pomóc w niektórych problemach wizualnych bez ponownego uruchamiania całej aplikacji.", + "reload_frontend": "Przeładuj frontend", + "show_hidden_subtree": "Pokaż ukryte poddrzewo", + "show_help": "Pokaż pomoc", + "about": "O notatkach Trilium", + "logout": "Wyloguj", + "show-cheatsheet": "Pokaż ściągawkę", + "toggle-zen-mode": "Tryb Zen", + "new-version-available": "Dostępna nowa aktualizacja", + "download-update": "Pobierz wersję {{latestVersion}}" + }, + "zen_mode": { + "button_exit": "Wyjdź z trybu Zen" + }, + "sync_status": { + "unknown": "

Status synchronizacji będzie znany po rozpoczęciu następnej próby synchronizacji.

Kliknij, aby wywołać synchronizację teraz.

", + "connected_with_changes": "

Połączono z serwerem synchronizacji.
Istnieją pewne oczekujące zmiany, które należy zsynchronizować.

Kliknij, aby wywołać synchronizację.

", + "connected_no_changes": "

Połączono z serwerem synchronizacji.
Wszystkie zmiany zostały już zsynchronizowane.

Kliknij, aby wywołać synchronizację.

", + "disconnected_with_changes": "

Nawiązanie połączenia z serwerem synchronizacji nie powiodło się.
Istnieją pewne oczekujące zmiany, które należy zsynchronizować.

Kliknij, aby wywołać synchronizację.

", + "disconnected_no_changes": "

Nawiązanie połączenia z serwerem synchronizacji nie powiodło się.
Wszystkie znane zmiany zostały zsynchronizowane.

Kliknij, aby wywołać synchronizację.

", + "in_progress": "Synchronizacja z serwerem jest w toku." + }, + "left_pane_toggle": { + "show_panel": "Pokaż panel", + "hide_panel": "Ukryj panel" + }, + "move_pane_button": { + "move_left": "Przesuń w lewo", + "move_right": "Przesuń w prawo" + }, + "note_actions": { + "convert_into_attachment": "Konwertuj na załącznik", + "re_render_note": "Wyrenderuj ponownie notatkę", + "search_in_note": "Szukaj w notatce", + "note_source": "Źródło notatki", + "note_attachments": "Załączniki notatki", + "open_note_externally": "Otwórz notatkę zewnętrznie", + "open_note_externally_title": "Plik zostanie otwarty w zewnętrznej aplikacji i będzie obserwowany pod kątem zmian. Następnie będziesz mógł przesłać zmodyfikowaną wersję z powrotem do Trilium.", + "open_note_custom": "Otwórz notatkę niestandardowo", + "import_files": "Importuj pliki", + "export_note": "Eksportuj notatkę", + "delete_note": "Usuń notatkę", + "print_note": "Drukuj notatkę", + "save_revision": "Zapisz wersję", + "convert_into_attachment_failed": "Konwersja notatki '{{title}}' nie powiodła się.", + "convert_into_attachment_successful": "Notatka '{{title}}' została przekonwertowana na załącznik.", + "convert_into_attachment_prompt": "Czy na pewno chcesz przekonwertować notatkę '{{title}}' na załącznik notatki nadrzędnej?", + "print_pdf": "Eksportuj jako PDF..." + }, + "onclick_button": { + "no_click_handler": "Widżet przycisku '{{componentId}}' nie ma zdefiniowanego obsługi kliknięcia" + }, + "protected_session_status": { + "active": "Sesja chroniona jest aktywna. Kliknij, aby opuścić sesję chronioną.", + "inactive": "Kliknij, aby wejść w sesję chronioną" + }, + "revisions_button": { + "note_revisions": "Wersje notatki" + }, + "update_available": { + "update_available": "Dostępna aktualizacja" + }, + "note_launcher": { + "this_launcher_doesnt_define_target_note": "Ten program uruchamiający nie definiuje notatki docelowej." + }, + "code_buttons": { + "execute_button_title": "Wykonaj skrypt", + "trilium_api_docs_button_title": "Otwórz dokumentację API Trilium", + "save_to_note_button_title": "Zapisz do notatki", + "opening_api_docs_message": "Otwieranie dokumentacji API...", + "sql_console_saved_message": "Notatka konsoli SQL została zapisana w {{note_path}}" + }, + "copy_image_reference_button": { + "button_title": "Kopiuj odniesienie do obrazu do schowka, można je wkleić do notatki tekstowej." + }, + "hide_floating_buttons_button": { + "button_title": "Ukryj przyciski" + }, + "show_floating_buttons_button": { + "button_title": "Pokaż przyciski" + }, + "svg_export_button": { + "button_title": "Eksportuj diagram jako SVG" + }, + "relation_map_buttons": { + "create_child_note_title": "Utwórz nową notatkę podrzędną i dodaj ją do tej mapy relacji", + "reset_pan_zoom_title": "Zresetuj przesuwanie i powiększanie do początkowych współrzędnych i powiększenia", + "zoom_in_title": "Powiększ", + "zoom_out_title": "Pomniejsz" + }, + "zpetne_odkazy": { + "backlink": "{{count}} Backlink", + "backlinks": "{{count}} Backlinków", + "relation": "relacja" + }, + "mobile_detail_menu": { + "insert_child_note": "Wstaw notatkę podrzędną", + "delete_this_note": "Usuń tę notatkę", + "note_revisions": "Wersje notatki", + "error_cannot_get_branch_id": "Nie można uzyskać branchId dla notePath '{{notePath}}'", + "error_unrecognized_command": "Nierozpoznane polecenie {{command}}" + }, + "note_icon": { + "change_note_icon": "Zmień ikonę notatki", + "category": "Kategoria:", + "search": "Szukaj:", + "reset-default": "Zresetuj do domyślnej ikony" + }, + "basic_properties": { + "note_type": "Typ notatki", + "editable": "Edytowalny", + "basic_properties": "Podstawowe właściwości", + "language": "Język", + "configure_code_notes": "Skonfiguruj notatki kodowe..." + }, + "edited_notes": { + "no_edited_notes_found": "Brak edytowanych notatek tego dnia...", + "title": "Edytowane notatki", + "deleted": "(usunięto)" + }, + "include_archived_notes": { + "include_archived_notes": "Uwzględnij zarchiwizowane notatki" + }, + "order_by": { + "order_by": "Sortuj według", + "relevancy": "Trafność (domyślnie)", + "title": "Tytuł", + "date_created": "Data utworzenia", + "date_modified": "Data ostatniej modyfikacji", + "content_size": "Rozmiar zawartości notatki", + "content_and_attachments_size": "Rozmiar zawartości notatki wraz z załącznikami", + "content_and_attachments_and_revisions_size": "Rozmiar zawartości notatki wraz z załącznikami i wersjami", + "revision_count": "Liczba wersji", + "children_count": "Liczba notatek podrzędnych", + "parent_count": "Liczba klonów", + "owned_label_count": "Liczba etykiet", + "owned_relation_count": "Liczba relacji", + "target_relation_count": "Liczba relacji wskazujących na notatkę", + "random": "Kolejność losowa", + "asc": "Rosnąco (domyślnie)", + "desc": "Malejąco" + }, + "search_script": { + "title": "Skrypt wyszukiwania:", + "placeholder": "szukaj notatki po jej nazwie", + "description1": "Skrypt wyszukiwania pozwala zdefiniować wyniki wyszukiwania poprzez uruchomienie skryptu. Zapewnia to maksymalną elastyczność, gdy standardowe wyszukiwanie nie wystarcza.", + "description2": "Skrypt wyszukiwania musi być typu \"kod\" i podtypu \"JavaScript backend\". Skrypt musi zwrócić tablicę noteIds lub notatek.", + "example_title": "Zobacz ten przykład:", + "example_code": "// 1. wstępne filtrowanie za pomocą standardowego wyszukiwania\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. zastosowanie niestandardowych kryteriów wyszukiwania\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;", + "note": "Pamiętaj, że skrypt wyszukiwania i ciąg wyszukiwania nie mogą być łączone ze sobą." + }, + "search_string": { + "title_column": "Ciąg wyszukiwania:", + "placeholder": "słowa kluczowe pełnotekstowe, #tag = wartość...", + "search_syntax": "Składnia wyszukiwania", + "also_see": "zobacz również", + "complete_help": "pełna pomoc dotycząca składni wyszukiwania", + "full_text_search": "Wpisz dowolny tekst do wyszukiwania pełnotekstowego", + "label_abc": "zwraca notatki z etykietą abc", + "label_year": "dopasowuje notatki z etykietą rok o wartości 2019", + "label_rock_pop": "dopasowuje notatki, które mają zarówno etykiety rock, jak i pop", + "label_rock_or_pop": "musi być obecna tylko jedna z etykiet", + "label_year_comparison": "porównanie numeryczne (również >, >=, <).", + "label_date_created": "notatki utworzone w ostatnim miesiącu", + "error": "Błąd wyszukiwania: {{error}}", + "search_prefix": "Szukaj:" + }, + "attachment_detail": { + "open_help_page": "Otwórz stronę pomocy dotyczącą załączników", + "owning_note": "Notatka nadrzędna: ", + "you_can_also_open": ", możesz również otworzyć ", + "list_of_all_attachments": "Listę wszystkich załączników", + "attachment_deleted": "Ten załącznik został usunięty." + }, + "attachment_list": { + "open_help_page": "Otwórz stronę pomocy dotyczącą załączników", + "owning_note": "Notatka nadrzędna: ", + "upload_attachments": "Prześlij załączniki", + "no_attachments": "Ta notatka nie ma załączników." + }, + "book": { + "no_children_help": "Ta kolekcja nie ma żadnych notatek podrzędnych, więc nie ma nic do wyświetlenia. Zobacz wiki, aby uzyskać szczegółowe informacje.", + "drag_locked_title": "Zablokowano do edycji", + "drag_locked_message": "Przeciąganie niedozwolone, ponieważ kolekcja jest zablokowana do edycji." + }, + "editable_code": { + "placeholder": "Wpisz tutaj treść swojej notatki kodowej..." + }, + "editable_text": { + "placeholder": "Wpisz tutaj treść swojej notatki..." + }, + "empty": { + "open_note_instruction": "Otwórz notatkę, wpisując jej tytuł w poniższe pole lub wybierz notatkę z drzewa.", + "search_placeholder": "szukaj notatki po jej nazwie", + "enter_workspace": "Wejdź do obszaru roboczego {{title}}" + }, + "file": { + "file_preview_not_available": "Podgląd pliku nie jest dostępny dla tego formatu.", + "too_big": "Podgląd pokazuje tylko pierwsze {{maxNumChars}} znaków pliku ze względów wydajnościowych. Pobierz plik i otwórz go zewnętrznie, aby zobaczyć całą zawartość." + }, + "protected_session": { + "enter_password_instruction": "Wyświetlenie chronionej notatki wymaga wprowadzenia hasła:", + "start_session_button": "Rozpocznij sesję chronioną enter", + "started": "Sesja chroniona została rozpoczęta.", + "wrong_password": "Nieprawidłowe hasło.", + "protecting-finished-successfully": "Ochrona zakończona pomyślnie.", + "unprotecting-finished-successfully": "Odblokowywanie zakończone pomyślnie.", + "protecting-in-progress": "Ochrona w toku: {{count}}", + "unprotecting-in-progress-count": "Odblokowywanie w toku: {{count}}", + "protecting-title": "Status ochrony", + "unprotecting-title": "Status odblokowywania" + }, + "relation_map": { + "open_in_new_tab": "Otwórz w nowej karcie", + "remove_note": "Usuń notatkę", + "edit_title": "Edytuj tytuł", + "rename_note": "Zmień nazwę notatki", + "enter_new_title": "Wprowadź nowy tytuł notatki:", + "remove_relation": "Usuń relację", + "confirm_remove_relation": "Czy na pewno chcesz usunąć tę relację?", + "specify_new_relation_name": "Określ nową nazwę relacji (dozwolone znaki: alfanumeryczne, dwukropek i podkreślenie):", + "connection_exists": "Połączenie '{{name}}' między tymi notatkami już istnieje.", + "start_dragging_relations": "Zacznij przeciągać stąd relacje i upuść je na inną notatkę.", + "note_not_found": "Nie znaleziono notatki {{noteId}}!", + "cannot_match_transform": "Nie można dopasować transformacji: {{transform}}", + "note_already_in_diagram": "Notatka \"{{title}}\" jest już na diagramie.", + "enter_title_of_new_note": "Wprowadź tytuł nowej notatki", + "default_new_note_title": "nowa notatka", + "click_on_canvas_to_place_new_note": "Kliknij na płótno, aby umieścić nową notatkę" + }, + "render": { + "note_detail_render_help_1": "Ta notatka pomocy jest wyświetlana, ponieważ ta notatka typu Renderuj HTML nie ma wymaganej relacji do prawidłowego działania.", + "note_detail_render_help_2": "Typ notatki Renderuj HTML jest używany do skryptowania. W skrócie, masz notatkę kodu HTML (opcjonalnie z pewnym JavaScriptem), a ta notatka ją wyrenderuje. Aby to zadziałało, musisz zdefiniować relację o nazwie \"renderNote\" wskazującą na notatkę HTML do wyrenderowania." + }, + "web_view": { + "web_view": "Widok sieciowy", + "embed_websites": "Notatka typu Widok sieciowy pozwala na osadzanie stron internetowych w Trilium.", + "create_label": "Aby rozpocząć, utwórz etykietę z adresem URL, który chcesz osadzić, np. #webViewSrc=\"https://www.google.com\"" + }, + "backend_log": { + "refresh": "Odśwież" + }, + "consistency_checks": { + "title": "Sprawdzanie spójności", + "find_and_fix_button": "Znajdź i napraw problemy ze spójnością", + "finding_and_fixing_message": "Znajdowanie i naprawianie problemów ze spójnością...", + "issues_fixed_message": "Wszelkie problemy ze spójnością, które mogły zostać znalezione, są teraz naprawione." + }, + "database_anonymization": { + "title": "Anonimizacja bazy danych", + "full_anonymization": "Pełna anonimizacja", + "full_anonymization_description": "Ta akcja utworzy nową kopię bazy danych i zanonimizuje ją (usunie całą zawartość notatek, pozostawiając tylko strukturę i niektóre niewrażliwe metadane) w celu udostępnienia online do celów debugowania bez obawy o wyciek danych osobowych.", + "save_fully_anonymized_database": "Zapisz w pełni zanonimizowaną bazę danych", + "light_anonymization": "Lekka anonimizacja", + "light_anonymization_description": "Ta akcja utworzy nową kopię bazy danych i przeprowadzi na niej lekką anonimizację — w szczególności usunięta zostanie tylko zawartość wszystkich notatek, ale tytuły i atrybuty pozostaną. Dodatkowo niestandardowe notatki skryptów JS frontend/backend oraz niestandardowe widżety pozostaną. Zapewnia to więcej kontekstu do debugowania problemów.", + "choose_anonymization": "Możesz sam zdecydować, czy chcesz udostępnić w pełni, czy lekko zanonimizowaną bazę danych. Nawet w pełni zanonimizowana baza danych jest bardzo przydatna, jednak w niektórych przypadkach lekko zanonimizowana baza danych może przyspieszyć proces identyfikacji i naprawy błędów.", + "save_lightly_anonymized_database": "Zapisz lekko zanonimizowaną bazę danych", + "existing_anonymized_databases": "Istniejące zanonimizowane bazy danych", + "creating_fully_anonymized_database": "Tworzenie w pełni zanonimizowanej bazy danych...", + "creating_lightly_anonymized_database": "Tworzenie lekko zanonimizowanej bazy danych...", + "error_creating_anonymized_database": "Nie można utworzyć zanonimizowanej bazy danych, sprawdź logi backendu, aby uzyskać szczegółowe informacje", + "successfully_created_fully_anonymized_database": "Utworzono w pełni zanonimizowaną bazę danych w {{anonymizedFilePath}}", + "successfully_created_lightly_anonymized_database": "Utworzono lekko zanonimizowaną bazę danych w {{anonymizedFilePath}}", + "no_anonymized_database_yet": "Brak jeszcze zanonimizowanej bazy danych." + }, + "database_integrity_check": { + "title": "Sprawdzanie integralności bazy danych", + "description": "Sprawdzi to, czy baza danych nie jest uszkodzona na poziomie SQLite. Może to zająć trochę czasu, w zależności od rozmiaru bazy danych.", + "check_button": "Sprawdź integralność bazy danych", + "checking_integrity": "Sprawdzanie integralności bazy danych...", + "integrity_check_succeeded": "Sprawdzanie integralności zakończyło się pomyślnie - nie znaleziono żadnych problemów.", + "integrity_check_failed": "Sprawdzanie integralności nie powiodło się: {{results}}" + }, + "sync": { + "title": "Synchronizacja", + "force_full_sync_button": "Wymuś pełną synchronizację", + "fill_entity_changes_button": "Wypełnij rekordy zmian encji", + "full_sync_triggered": "Wywołano pełną synchronizację", + "filling_entity_changes": "Wypełnianie wierszy zmian encji...", + "sync_rows_filled_successfully": "Wiersze synchronizacji wypełnione pomyślnie", + "finished-successfully": "Synchronizacja zakończona pomyślnie.", + "failed": "Synchronizacja nie powiodła się: {{message}}" + }, + "vacuum_database": { + "title": "Odkurzanie bazy danych", + "description": "Spowoduje to przebudowanie bazy danych, co zazwyczaj skutkuje mniejszym plikiem bazy danych. Żadne dane nie zostaną faktycznie zmienione.", + "button_text": "Odkurz bazę danych", + "vacuuming_database": "Odkurzanie bazy danych...", + "database_vacuumed": "Baza danych została odkurzona" + }, + "fonts": { + "theme_defined": "Zdefiniowane przez motyw", + "fonts": "Czcionki", + "main_font": "Główna czcionka", + "font_family": "Rodzina czcionek", + "size": "Rozmiar", + "note_tree_font": "Czcionka drzewa notatek", + "note_detail_font": "Czcionka szczegółów notatki", + "monospace_font": "Czcionka monospaced (kod)", + "note_tree_and_detail_font_sizing": "Pamiętaj, że rozmiar czcionki drzewa i szczegółów jest względny w stosunku do ustawienia rozmiaru czcionki głównej.", + "not_all_fonts_available": "Nie wszystkie wymienione czcionki mogą być dostępne w Twoim systemie.", + "apply_font_changes": "Aby zastosować zmiany czcionki, kliknij na", + "reload_frontend": "przeładuj frontend", + "generic-fonts": "Czcionki generyczne", + "sans-serif-system-fonts": "Czcionki systemowe bezszeryfowe", + "serif-system-fonts": "Czcionki systemowe szeryfowe", + "monospace-system-fonts": "Czcionki systemowe monospaced", + "handwriting-system-fonts": "Czcionki systemowe odręczne", + "serif": "Szeryfowa", + "sans-serif": "Bezszeryfowa", + "monospace": "Monospaced", + "system-default": "Domyślna systemowa" + }, + "max_content_width": { + "title": "Szerokość zawartości", + "default_description": "Trilium domyślnie ogranicza maksymalną szerokość zawartości, aby poprawić czytelność na zmaksymalizowanych ekranach o dużej szerokości.", + "max_width_label": "Maksymalna szerokość zawartości", + "max_width_unit": "piksele", + "apply_changes_description": "Aby zastosować zmiany szerokości zawartości, kliknij na", + "reload_button": "przeładuj frontend", + "reload_description": "zmiany z opcji wyglądu" + }, + "native_title_bar": { + "title": "Natywny pasek tytułu (wymaga ponownego uruchomienia aplikacji)", + "enabled": "włączony", + "disabled": "wyłączony" + }, + "ribbon": { + "widgets": "Widżety wstążki", + "promoted_attributes_message": "Karta wstążki Promowane atrybuty otworzy się automatycznie, jeśli na notatce znajdują się promowane atrybuty", + "edited_notes_message": "Karta wstążki Edytowane notatki otworzy się automatycznie w notatkach dziennych" + }, + "theme": { + "title": "Motyw aplikacji", + "theme_label": "Motyw", + "override_theme_fonts_label": "Nadpisz czcionki motywu", + "auto_theme": "Starszy (Dostosuj do schematu kolorów systemu)", + "light_theme": "Starszy (Jasny)", + "dark_theme": "Starszy (Ciemny)", + "triliumnext": "Trilium (Dostosuj do schematu kolorów systemu)", + "triliumnext-light": "Trilium (Jasny)", + "triliumnext-dark": "Trilium (Ciemny)", + "layout": "Układ", + "layout-vertical-title": "Pionowy", + "layout-horizontal-title": "Poziomy", + "layout-vertical-description": "pasek uruchamiania znajduje się po lewej stronie (domyślnie)", + "layout-horizontal-description": "pasek uruchamiania znajduje się pod paskiem kart, pasek kart ma teraz pełną szerokość." + }, + "ui-performance": { + "title": "Wydajność", + "enable-motion": "Włącz przejścia i animacje", + "enable-shadows": "Włącz cienie", + "enable-backdrop-effects": "Włącz efekty tła dla menu, wyskakujących okien i paneli", + "enable-smooth-scroll": "Włącz płynne przewijanie", + "app-restart-required": "(ponowne uruchomienie aplikacji jest wymagane, aby zmiana zaczęła obowiązywać)" + }, + "zoom_factor": { + "title": "Współczynnik powiększenia (tylko w wersji stacjonarnej)", + "description": "Powiększanie można również kontrolować za pomocą skrótów CTRL+- i CTRL+=" + }, + "code_auto_read_only_size": { + "title": "Automatyczny rozmiar tylko do odczytu", + "description": "Automatyczny rozmiar notatki tylko do odczytu to rozmiar, po którym notatki będą wyświetlane w trybie tylko do odczytu (ze względów wydajnościowych).", + "label": "Automatyczny rozmiar tylko do odczytu (notatki kodowe)", + "unit": "znaki" + }, + "code-editor-options": { + "title": "Edytor" + }, + "code_mime_types": { + "title": "Dostępne typy MIME w rozwijanym menu" + }, + "vim_key_bindings": { + "use_vim_keybindings_in_code_notes": "Skróty klawiszowe Vim", + "enable_vim_keybindings": "Włącz skróty klawiszowe Vim w notatkach kodowych (bez trybu ex)" + }, + "wrap_lines": { + "wrap_lines_in_code_notes": "Zawijaj wiersze w notatkach kodowych", + "enable_line_wrap": "Włącz zawijanie wierszy (zmiana może wymagać ponownego załadowania frontendu, aby zaczęła obowiązywać)" + }, + "images": { + "images_section_title": "Obrazy", + "download_images_automatically": "Pobieraj obrazy automatycznie do użytku offline.", + "download_images_description": "Wklejony HTML może zawierać odniesienia do obrazów online, Trilium znajdzie te odniesienia i pobierze obrazy, aby były dostępne offline.", + "enable_image_compression": "Włącz kompresję obrazów", + "max_image_dimensions": "Maksymalna szerokość / wysokość obrazu (obraz zostanie przeskalowany, jeśli przekroczy to ustawienie).", + "max_image_dimensions_unit": "piksele", + "jpeg_quality_description": "Jakość JPEG (10 - najgorsza jakość, 100 - najlepsza jakość, 50 - 85 jest zalecane)" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "Limit czasu usuwania załączników", + "attachment_auto_deletion_description": "Załączniki są automatycznie usuwane (i wymazywane), jeśli nie są już powiązane z ich notatką po określonym czasie.", + "erase_attachments_after": "Wymaż nieużywane załączniki po:", + "manual_erasing_description": "Możesz również wywołać wymazywanie ręcznie (bez uwzględniania powyższego limitu czasu):", + "erase_unused_attachments_now": "Wymaż teraz nieużywane załączniki", + "unused_attachments_erased": "Nieużywane załączniki zostały wymazane." + }, + "network_connections": { + "network_connections_title": "Połączenia sieciowe", + "check_for_updates": "Sprawdzaj aktualizacje automatycznie" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "Limit czasu usuwania notatek", + "note_erasure_description": "Usunięte notatki (i atrybuty, wersje...) są na początku tylko oznaczane jako usunięte i można je odzyskać z okna dialogowego Ostatnie notatki. Po pewnym czasie usunięte notatki są \"wymazywane\", co oznacza, że ich zawartość nie jest już możliwa do odzyskania. To ustawienie pozwala skonfigurować długość okresu między usunięciem a wymazaniem notatki.", + "erase_notes_after": "Wymaż notatki po:", + "manual_erasing_description": "Możesz również wywołać wymazywanie ręcznie (bez uwzględniania powyższego limitu czasu):", + "erase_deleted_notes_now": "Wymaż teraz usunięte notatki", + "deleted_notes_erased": "Usunięte notatki zostały wymazane." + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "Interwał migawki wersji notatki", + "note_revisions_snapshot_description": "Interwał migawki wersji notatki to czas, po którym dla notatki zostanie utworzona nowa wersja. Zobacz wiki, aby uzyskać więcej informacji.", + "snapshot_time_interval_label": "Interwał czasowy migawki wersji notatki:" + }, + "revisions_snapshot_limit": { + "note_revisions_snapshot_limit_title": "Limit migawek wersji notatki", + "note_revisions_snapshot_limit_description": "Limit liczby migawek wersji notatki odnosi się do maksymalnej liczby wersji, które można zapisać dla każdej notatki. Gdzie -1 oznacza brak limitu, 0 oznacza usunięcie wszystkich wersji. Możesz ustawić maksymalną liczbę wersji dla pojedynczej notatki za pomocą etykiety #versioningLimit.", + "snapshot_number_limit_label": "Limit liczby migawek wersji notatki:", + "snapshot_number_limit_unit": "migawki", + "erase_excess_revision_snapshots": "Wymaż teraz nadmiarowe migawki wersji", + "erase_excess_revision_snapshots_prompt": "Nadmiarowe migawki wersji zostały wymazane." + }, + "search_engine": { + "title": "Wyszukiwarka", + "custom_search_engine_info": "Niestandardowa wyszukiwarka wymaga ustawienia zarówno nazwy, jak i adresu URL. Jeśli którykolwiek z nich nie jest ustawiony, domyślną wyszukiwarką będzie DuckDuckGo.", + "predefined_templates_label": "Predefiniowane szablony wyszukiwarek", + "bing": "Bing", + "baidu": "Baidu", + "duckduckgo": "DuckDuckGo", + "google": "Google", + "custom_name_label": "Niestandardowa nazwa wyszukiwarki", + "custom_name_placeholder": "Dostosuj nazwę wyszukiwarki", + "custom_url_label": "Niestandardowy adres URL wyszukiwarki powinien zawierać {keyword} jako symbol zastępczy dla wyszukiwanego terminu.", + "custom_url_placeholder": "Dostosuj adres URL wyszukiwarki", + "save_button": "Zapisz" + }, + "tray": { + "title": "Zasobnik systemowy", + "enable_tray": "Włącz zasobnik (zmiana ta wymaga ponownego uruchomienia Trilium, aby zaczęła obowiązywać)" + }, + "heading_style": { + "title": "Styl nagłówka", + "plain": "Zwykły", + "underline": "Podkreślenie", + "markdown": "Styl Markdown" + }, + "highlights_list": { + "title": "Lista wyróżnień", + "description": "Możesz dostosować listę wyróżnień wyświetlaną w prawym panelu:", + "bold": "Pogrubiony tekst", + "italic": "Kursywa", + "underline": "Podkreślony tekst", + "color": "Kolorowy tekst", + "bg_color": "Tekst z kolorem tła", + "visibility_title": "Widoczność listy wyróżnień", + "visibility_description": "Możesz ukryć widżet wyróżnień dla poszczególnych notatek, dodając etykietę #hideHighlightWidget.", + "shortcut_info": "Możesz skonfigurować skrót klawiaturowy do szybkiego przełączania prawego panelu (w tym wyróżnień) w Opcje -> Skróty (nazwa 'toggleRightPane')." + }, + "table_of_contents": { + "title": "Spis treści", + "description": "Spis treści pojawi się w notatkach tekstowych, gdy notatka ma więcej niż zdefiniowaną liczbę nagłówków. Możesz dostosować tę liczbę:", + "unit": "nagłówki", + "disable_info": "Możesz również użyć tej opcji, aby skutecznie wyłączyć spis treści, ustawiając bardzo wysoką liczbę.", + "shortcut_info": "Możesz skonfigurować skrót klawiaturowy do szybkiego przełączania prawego panelu (w tym spisu treści) w Opcje -> Skróty (nazwa 'toggleRightPane')." + }, + "text_auto_read_only_size": { + "title": "Automatyczny rozmiar tylko do odczytu", + "description": "Automatyczny rozmiar notatki tylko do odczytu to rozmiar, po którym notatki będą wyświetlane w trybie tylko do odczytu (ze względów wydajnościowych).", + "label": "Automatyczny rozmiar tylko do odczytu (notatki tekstowe)", + "unit": "znaki" + }, + "custom_date_time_format": { + "title": "Niestandardowy format daty/czasu", + "description": "Dostosuj format daty i czasu wstawianego za pomocą lub paska narzędzi. Zobacz dokumentację Day.js dla dostępnych tokenów formatu.", + "format_string": "Ciąg formatujący:", + "formatted_time": "Sformatowana data/czas:" + }, + "i18n": { + "title": "Lokalizacja", + "language": "Język", + "first-day-of-the-week": "Pierwszy dzień tygodnia", + "monday": "Poniedziałek", + "tuesday": "Wtorek", + "wednesday": "Środa", + "thursday": "Czwartek", + "friday": "Piątek", + "saturday": "Sobota", + "sunday": "Niedziela", + "first-week-of-the-year": "Pierwszy tydzień roku", + "first-week-contains-first-day": "Pierwszy tydzień zawiera pierwszy dzień roku", + "first-week-contains-first-thursday": "Pierwszy tydzień zawiera pierwszy czwartek roku", + "first-week-has-minimum-days": "Pierwszy tydzień ma minimalną liczbę dni", + "min-days-in-first-week": "Minimalna liczba dni w pierwszym tygodniu", + "first-week-info": "Pierwszy tydzień zawiera pierwszy czwartek roku jest oparty na standardzie ISO 8601.", + "first-week-warning": "Zmiana opcji pierwszego tygodnia może powodować duplikaty z istniejącymi notatkami tygodniowymi, a istniejące notatki tygodniowe nie zostaną odpowiednio zaktualizowane.", + "formatting-locale": "Format daty i liczb", + "formatting-locale-auto": "Na podstawie języka aplikacji" + }, + "backup": { + "automatic_backup": "Automatyczna kopia zapasowa", + "automatic_backup_description": "Trilium może automatycznie tworzyć kopie zapasowe bazy danych:", + "enable_daily_backup": "Włącz codzienną kopię zapasową", + "enable_weekly_backup": "Włącz tygodniową kopię zapasową", + "enable_monthly_backup": "Włącz miesięczną kopię zapasową", + "backup_recommendation": "Zaleca się włączenie kopii zapasowej, ale może to spowolnić uruchamianie aplikacji przy dużych bazach danych i/lub wolnych urządzeniach pamięci masowej.", + "backup_now": "Utwórz kopię zapasową teraz", + "backup_database_now": "Utwórz kopię zapasową bazy danych teraz", + "existing_backups": "Istniejące kopie zapasowe", + "date-and-time": "Data i godzina", + "path": "Ścieżka", + "database_backed_up_to": "Baza danych została zarchiwizowana do {{backupFilePath}}", + "no_backup_yet": "brak jeszcze kopii zapasowej" + }, + "etapi": { + "title": "ETAPI", + "description": "ETAPI to interfejs API REST używany do programowego dostępu do instancji Trilium, bez interfejsu użytkownika.", + "see_more": "Zobacz więcej szczegółów w {{- link_to_wiki}} oraz w {{- link_to_openapi_spec}} lub {{- link_to_swagger_ui }}.", + "wiki": "wiki", + "openapi_spec": "specyfikacja ETAPI OpenAPI", + "swagger_ui": "ETAPI Swagger UI", + "create_token": "Utwórz nowy token ETAPI", + "existing_tokens": "Istniejące tokeny", + "no_tokens_yet": "Nie ma jeszcze żadnych tokenów. Kliknij przycisk powyżej, aby utworzyć jeden.", + "token_name": "Nazwa tokenu", + "created": "Utworzono", + "actions": "Akcje", + "new_token_title": "Nowy token ETAPI", + "new_token_message": "Wprowadź nazwę nowego tokenu", + "default_token_name": "nowy token", + "error_empty_name": "Nazwa tokenu nie może być pusta", + "token_created_title": "Utworzono token ETAPI", + "token_created_message": "Skopiuj utworzony token do schowka. Trilium przechowuje token w postaci zaszyfrowanej i jest to ostatni raz, kiedy go widzisz.", + "rename_token": "Zmień nazwę tego tokenu", + "delete_token": "Usuń / dezaktywuj ten token", + "rename_token_title": "Zmień nazwę tokenu", + "rename_token_message": "Wprowadź nową nazwę tokenu", + "delete_token_confirmation": "Czy na pewno chcesz usunąć token ETAPI \"{{name}}\"?" + }, + "options_widget": { + "options_status": "Status opcji", + "options_change_saved": "Zmiany w opcjach zostały zapisane." + }, + "password": { + "heading": "Hasło", + "alert_message": "Pamiętaj o zapamiętaniu nowego hasła. Hasło jest używane do logowania się do interfejsu internetowego i szyfrowania chronionych notatek. Jeśli zapomnisz hasła, wszystkie Twoje chronione notatki zostaną utracone na zawsze.", + "reset_link": "Kliknij tutaj, aby je zresetować.", + "old_password": "Stare hasło", + "new_password": "Nowe hasło", + "new_password_confirmation": "Potwierdzenie nowego hasła", + "change_password": "Zmień hasło", + "protected_session_timeout": "Limit czasu sesji chronionej", + "protected_session_timeout_description": "Limit czasu sesji chronionej to okres, po którym sesja chroniona jest usuwana z pamięci przeglądarki. Mierzy się go od ostatniej interakcji z chronionymi notatkami. Zobacz", + "wiki": "wiki", + "for_more_info": "aby uzyskać więcej informacji.", + "protected_session_timeout_label": "Limit czasu sesji chronionej:", + "reset_confirmation": "Resetując hasło, na zawsze utracisz dostęp do wszystkich istniejących chronionych notatek. Czy na pewno chcesz zresetować hasło?", + "reset_success_message": "Hasło zostało zresetowane. Ustaw nowe hasło", + "change_password_heading": "Zmień hasło", + "set_password_heading": "Ustaw hasło", + "set_password": "Ustaw hasło", + "password_mismatch": "Nowe hasła nie są takie same.", + "password_changed_success": "Hasło zostało zmienione. Trilium zostanie przeładowane po naciśnięciu OK." + }, + "multi_factor_authentication": { + "title": "Uwierzytelnianie wieloskładnikowe", + "description": "Uwierzytelnianie wieloskładnikowe (MFA) dodaje dodatkową warstwę zabezpieczeń do Twojego konta. Zamiast wpisywać tylko hasło, aby się zalogować, MFA wymaga podania jednego lub więcej dodatkowych dowodów weryfikujących Twoją tożsamość. W ten sposób, nawet jeśli ktoś zdobędzie Twoje hasło, nadal nie będzie mógł uzyskać dostępu do Twojego konta bez drugiego elementu informacji. To jak dodanie dodatkowego zamka do drzwi, co znacznie utrudnia włamanie.

Postępuj zgodnie z poniższymi instrukcjami, aby włączyć MFA. Jeśli nie skonfigurujesz go poprawnie, logowanie powróci do samego hasła.", + "mfa_enabled": "Włącz uwierzytelnianie wieloskładnikowe", + "mfa_method": "Metoda MFA", + "electron_disabled": "Uwierzytelnianie wieloskładnikowe nie jest obecnie obsługiwane w wersji stacjonarnej.", + "totp_title": "Jednorazowe hasło czasowe (TOTP)", + "totp_description": "TOTP (Time-Based One-Time Password) to funkcja bezpieczeństwa, która generuje unikalny, tymczasowy kod, który zmienia się co 30 sekund. Używasz tego kodu wraz z hasłem do logowania się na swoje konto, co znacznie utrudnia dostęp do niego innym osobom.", + "totp_secret_title": "Wygeneruj sekret TOTP", + "totp_secret_generate": "Wygeneruj sekret TOTP", + "totp_secret_regenerate": "Wygeneruj ponownie sekret TOTP", + "no_totp_secret_warning": "Aby włączyć TOTP, musisz najpierw wygenerować sekret TOTP.", + "totp_secret_description_warning": "Po wygenerowaniu nowego sekretu TOTP będziesz musiał ponownie zalogować się przy użyciu nowego sekretu TOTP.", + "totp_secret_generated": "Wygenerowano sekret TOTP", + "totp_secret_warning": "Zapisz wygenerowany sekret w bezpiecznym miejscu. Nie zostanie on ponownie pokazany.", + "totp_secret_regenerate_confirm": "Czy na pewno chcesz wygenerować ponownie sekret TOTP? Spowoduje to unieważnienie poprzedniego sekretu TOTP i wszystkich istniejących kodów odzyskiwania.", + "recovery_keys_title": "Klucze odzyskiwania jednorazowego logowania", + "recovery_keys_description": "Klucze odzyskiwania jednorazowego logowania są używane do logowania w przypadku, gdy nie możesz uzyskać dostępu do swoich kodów Authenticator.", + "recovery_keys_description_warning": "Klucze odzyskiwania nie zostaną ponownie pokazane po opuszczeniu strony, przechowuj je w bezpiecznym miejscu.
Po użyciu klucza odzyskiwania nie można go użyć ponownie.", + "recovery_keys_error": "Błąd generowania kodów odzyskiwania", + "recovery_keys_no_key_set": "Nie ustawiono kodów odzyskiwania", + "recovery_keys_generate": "Wygeneruj kody odzyskiwania", + "recovery_keys_regenerate": "Wygeneruj ponownie kody odzyskiwania", + "recovery_keys_used": "Użyto: {{date}}", + "recovery_keys_unused": "Kod odzyskiwania {{index}} jest nieużywany", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenID to standaryzowany sposób logowania się na strony internetowe przy użyciu konta z innej usługi, takiej jak Google, w celu zweryfikowania Twojej tożsamości. Domyślnym dostawcą jest Google, ale możesz zmienić go na dowolnego innego dostawcę OpenID. Sprawdź tutaj, aby uzyskać więcej informacji. Postępuj zgodnie z tymi instrukcjami, aby skonfigurować usługę OpenID za pośrednictwem Google.", + "oauth_description_warning": "Aby włączyć OAuth/OpenID, musisz ustawić podstawowy adres URL OAuth/OpenID, identyfikator klienta i sekret klienta w pliku config.ini i ponownie uruchomić aplikację. Jeśli chcesz ustawić je ze zmiennych środowiskowych, ustaw TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID i TRILIUM_OAUTH_CLIENT_SECRET.", + "oauth_missing_vars": "Brakujące ustawienia: {{-variables}}", + "oauth_user_account": "Konto użytkownika: ", + "oauth_user_email": "E-mail użytkownika: ", + "oauth_user_not_logged_in": "Niezalogowany!" + }, + "shortcuts": { + "keyboard_shortcuts": "Skróty klawiaturowe", + "multiple_shortcuts": "Wiele skrótów dla tej samej akcji można oddzielić przecinkiem.", + "electron_documentation": "Zobacz dokumentację Electron dla dostępnych modyfikatorów i kodów klawiszy.", + "type_text_to_filter": "Wpisz tekst, aby filtrować skróty...", + "action_name": "Nazwa akcji", + "shortcuts": "Skróty", + "default_shortcuts": "Domyślne skróty", + "description": "Opis", + "reload_app": "Przeładuj aplikację, aby zastosować zmiany", + "set_all_to_default": "Ustaw wszystkie skróty na domyślne", + "confirm_reset": "Czy na pewno chcesz zresetować wszystkie skróty klawiaturowe do domyślnych?" + }, + "spellcheck": { + "title": "Sprawdzanie pisowni", + "description": "Te opcje dotyczą tylko wersji stacjonarnych, przeglądarki będą używać własnego natywnego sprawdzania pisowni.", + "enable": "Włącz sprawdzanie pisowni", + "language_code_label": "Kod(y) języka", + "language_code_placeholder": "na przykład \"en-US\", \"de-AT\"", + "multiple_languages_info": "Wiele języków można oddzielić przecinkiem, np. \"en-US, de-DE, cs\". ", + "available_language_codes_label": "Dostępne kody języków:", + "restart-required": "Zmiany w opcjach sprawdzania pisowni zaczną obowiązywać po ponownym uruchomieniu aplikacji." + }, + "sync_2": { + "config_title": "Konfiguracja synchronizacji", + "server_address": "Adres instancji serwera", + "timeout": "Limit czasu synchronizacji", + "timeout_unit": "milisekundy", + "proxy_label": "Serwer proxy synchronizacji (opcjonalnie)", + "note": "Notatka", + "note_description": "Jeśli pozostawisz ustawienie proxy puste, zostanie użyty systemowy serwer proxy (dotyczy tylko wersji stacjonarnej/electron).", + "special_value_description": "Inną specjalną wartością jest noproxy, która wymusza ignorowanie nawet systemowego serwera proxy i respektuje NODE_TLS_REJECT_UNAUTHORIZED.", + "save": "Zapisz", + "help": "Pomoc", + "test_title": "Test synchronizacji", + "test_description": "Sprawdzi to połączenie i uzgadnianie z serwerem synchronizacji. Jeśli serwer synchronizacji nie jest zainicjowany, spowoduje to jego skonfigurowanie do synchronizacji z lokalnym dokumentem.", + "test_button": "Testuj synchronizację", + "handshake_failed": "Uzgadnianie serwera synchronizacji nie powiodło się, błąd: {{message}}" + }, + "api_log": { + "close": "Zamknij" + }, + "attachment_detail_2": { + "will_be_deleted_in": "Ten załącznik zostanie automatycznie usunięty za {{time}}", + "will_be_deleted_soon": "Ten załącznik zostanie wkrótce automatycznie usunięty", + "deletion_reason": ", ponieważ załącznik nie jest powiązany z treścią notatki. Aby zapobiec usunięciu, dodaj link do załącznika z powrotem do treści lub przekonwertuj załącznik na notatkę.", + "role_and_size": "Rola: {{role}}, Rozmiar: {{size}}", + "link_copied": "Link do załącznika skopiowany do schowka.", + "unrecognized_role": "Nierozpoznana rola załącznika '{{role}}'." + }, + "bookmark_switch": { + "bookmark": "Zakładka", + "bookmark_this_note": "Dodaj tę notatkę do zakładek w lewym panelu bocznym", + "remove_bookmark": "Usuń zakładkę" + }, + "editability_select": { + "auto": "Auto", + "read_only": "Tylko do odczytu", + "always_editable": "Zawsze edytowalny", + "note_is_editable": "Notatka jest edytowalna, jeśli nie jest zbyt długa.", + "note_is_read_only": "Notatka jest tylko do odczytu, ale można ją edytować po kliknięciu przycisku.", + "note_is_always_editable": "Notatka jest zawsze edytowalna, niezależnie od jej długości." + }, + "note-map": { + "button-link-map": "Mapa linków", + "button-tree-map": "Mapa drzewa" + }, + "tree-context-menu": { + "open-in-a-new-tab": "Otwórz w nowej karcie", + "open-in-a-new-split": "Otwórz w nowym podziale", + "insert-note-after": "Wstaw notatkę po", + "insert-child-note": "Wstaw notatkę podrzędną", + "archive": "Archiwizuj", + "unarchive": "Przywróć z archiwum", + "delete": "Usuń", + "search-in-subtree": "Szukaj w poddrzewie", + "hoist-note": "Podnieś notatkę", + "unhoist-note": "Opuść notatkę", + "edit-branch-prefix": "Edytuj prefiks gałęzi", + "advanced": "Zaawansowane", + "expand-subtree": "Rozwiń poddrzewo", + "collapse-subtree": "Zwiń poddrzewo", + "sort-by": "Sortuj według...", + "recent-changes-in-subtree": "Ostatnie zmiany w poddrzewie", + "convert-to-attachment": "Konwertuj na załącznik", + "copy-note-path-to-clipboard": "Kopiuj ścieżkę notatki do schowka", + "protect-subtree": "Chroń poddrzewo", + "unprotect-subtree": "Odblokuj poddrzewo", + "copy-clone": "Kopiuj / klonuj", + "clone-to": "Klonuj do...", + "cut": "Wytnij", + "move-to": "Przenieś do...", + "paste-into": "Wklej do", + "paste-after": "Wklej po", + "duplicate": "Duplikuj", + "export": "Eksportuj", + "import-into-note": "Importuj do notatki", + "apply-bulk-actions": "Zastosuj akcje zbiorcze", + "converted-to-attachments": "{{count}} notatek zostało przekonwertowanych na załączniki.", + "convert-to-attachment-confirm": "Czy na pewno chcesz przekonwertować wybrane notatki na załączniki ich notatek nadrzędnych?", + "open-in-popup": "Szybka edycja" + }, + "shared_info": { + "shared_publicly": "Ta notatka jest udostępniona publicznie na {{- link}}.", + "shared_locally": "Ta notatka jest udostępniona lokalnie na {{- link}}.", + "help_link": "Aby uzyskać pomoc, odwiedź wiki." + }, + "note_types": { + "text": "Tekst", + "code": "Kod", + "saved-search": "Zapisane wyszukiwanie", + "relation-map": "Mapa relacji", + "note-map": "Mapa notatek", + "render-note": "Renderuj notatkę", + "book": "Kolekcja", + "mermaid-diagram": "Diagram Mermaid", + "canvas": "Płótno", + "web-view": "Widok sieciowy", + "mind-map": "Mapa myśli", + "file": "Plik", + "image": "Obraz", + "launcher": "Program uruchamiający", + "doc": "Dokument", + "widget": "Widżet", + "confirm-change": "Nie zaleca się zmiany typu notatki, gdy zawartość notatki nie jest pusta. Czy chcesz kontynuować mimo to?", + "geo-map": "Mapa geograficzna", + "beta-feature": "Beta", + "ai-chat": "Czat AI", + "task-list": "Lista zadań", + "new-feature": "Nowość", + "collections": "Kolekcje" + }, + "protect_note": { + "toggle-on": "Chroń notatkę", + "toggle-off": "Odblokuj notatkę", + "toggle-on-hint": "Notatka nie jest chroniona, kliknij, aby ją chronić", + "toggle-off-hint": "Notatka jest chroniona, kliknij, aby ją odblokować" + }, + "shared_switch": { + "shared": "Udostępnione", + "toggle-on-title": "Udostępnij notatkę", + "toggle-off-title": "Przestań udostępniać notatkę", + "shared-branch": "Ta notatka istnieje tylko jako notatka udostępniona, zaprzestanie udostępniania spowoduje jej usunięcie. Czy chcesz kontynuować i tym samym usunąć tę notatkę?", + "inherited": "Notatka nie może być tutaj nieudostępniona, ponieważ jest udostępniana poprzez dziedziczenie od przodka." + }, + "template_switch": { + "template": "Szablon", + "toggle-on-hint": "Uczyń notatkę szablonem", + "toggle-off-hint": "Usuń notatkę jako szablon" + }, + "open-help-page": "Otwórz stronę pomocy", + "find": { + "case_sensitive": "Uwzględniaj wielkość liter", + "match_words": "Dopasuj słowa", + "find_placeholder": "Znajdź w tekście...", + "replace_placeholder": "Zastąp...", + "replace": "Zastąp", + "replace_all": "Zastąp wszystko" + }, + "highlights_list_2": { + "title": "Lista wyróżnień", + "options": "Opcje" + }, + "quick-search": { + "placeholder": "Szybkie wyszukiwanie", + "searching": "Wyszukiwanie...", + "no-results": "Nie znaleziono wyników", + "more-results": "... i {{number}} więcej wyników.", + "show-in-full-search": "Pokaż w pełnym wyszukiwaniu" + }, + "note_tree": { + "collapse-title": "Zwiń drzewo notatek", + "scroll-active-title": "Przewiń do aktywnej notatki", + "tree-settings-title": "Ustawienia drzewa", + "hide-archived-notes": "Ukryj zarchiwizowane notatki", + "automatically-collapse-notes": "Automatycznie zwijaj notatki", + "automatically-collapse-notes-title": "Notatki zostaną zwinięte po okresie bezczynności, aby uporządkować drzewo.", + "save-changes": "Zapisz i zastosuj zmiany", + "auto-collapsing-notes-after-inactivity": "Automatyczne zwijanie notatek po bezczynności...", + "saved-search-note-refreshed": "Odświeżono zapisaną notatkę wyszukiwania.", + "hoist-this-note-workspace": "Podnieś tę notatkę (obszar roboczy)", + "refresh-saved-search-results": "Odśwież zapisane wyniki wyszukiwania", + "create-child-note": "Utwórz notatkę podrzędną", + "unhoist": "Opuść", + "toggle-sidebar": "Przełącz pasek boczny" + }, + "title_bar_buttons": { + "window-on-top": "Trzymaj okno na wierzchu" + }, + "note_detail": { + "could_not_find_typewidget": "Nie można znaleźć typeWidget dla typu '{{type}}'" + }, + "note_title": { + "placeholder": "wpisz tutaj tytuł notatki..." + }, + "search_result": { + "no_notes_found": "Nie znaleziono żadnych notatek dla podanych parametrów wyszukiwania.", + "search_not_executed": "Wyszukiwanie nie zostało jeszcze wykonane. Kliknij przycisk \"Szukaj\" powyżej, aby zobaczyć wyniki." + }, + "spacer": { + "configure_launchbar": "Skonfiguruj pasek uruchamiania" + }, + "sql_result": { + "no_rows": "Nie zwrócono żadnych wierszy dla tego zapytania" + }, + "sql_table_schemas": { + "tables": "Tabele" + }, + "tab_row": { + "close_tab": "Zamknij kartę", + "add_new_tab": "Dodaj nową kartę", + "close": "Zamknij", + "close_other_tabs": "Zamknij inne karty", + "close_right_tabs": "Zamknij karty po prawej", + "close_all_tabs": "Zamknij wszystkie karty", + "reopen_last_tab": "Otwórz ponownie ostatnią zamkniętą kartę", + "move_tab_to_new_window": "Przenieś tę kartę do nowego okna", + "copy_tab_to_new_window": "Skopiuj tę kartę do nowego okna", + "new_tab": "Nowa karta" + }, + "toc": { + "table_of_contents": "Spis treści", + "options": "Opcje" + }, + "watched_file_update_status": { + "file_last_modified": "Plik został ostatnio zmodyfikowany .", + "upload_modified_file": "Prześlij zmodyfikowany plik", + "ignore_this_change": "Ignoruj tę zmianę" + }, + "app_context": { + "please_wait_for_save": "Poczekaj kilka sekund na zakończenie zapisywania, a następnie spróbuj ponownie." + }, + "note_create": { + "duplicated": "Notatka \"{{title}}\" została zduplikowana." + }, + "image": { + "copied-to-clipboard": "Odniesienie do obrazu zostało skopiowane do schowka. Można je wkleić w dowolnej notatce tekstowej.", + "cannot-copy": "Nie można skopiować odniesienia do obrazu do schowka." + }, + "clipboard": { + "cut": "Notatka(i) została(y) wycięta(e) do schowka.", + "copied": "Notatka(i) została(y) skopiowana(e) do schowka.", + "copy_failed": "Nie można skopiować do schowka z powodu problemów z uprawnieniami.", + "copy_success": "Skopiowano do schowka." + }, + "entrypoints": { + "note-revision-created": "Utworzono wersję notatki.", + "note-executed": "Notatka wykonana.", + "sql-error": "Wystąpił błąd podczas wykonywania zapytania SQL: {{message}}" + }, + "branches": { + "cannot-move-notes-here": "Nie można przenieść tutaj notatek.", + "delete-status": "Status usuwania", + "delete-notes-in-progress": "Usuwanie notatek w toku: {{count}}", + "delete-finished-successfully": "Usuwanie zakończone pomyślnie.", + "undeleting-notes-in-progress": "Przywracanie notatek w toku: {{count}}", + "undeleting-notes-finished-successfully": "Przywracanie notatek zakończone pomyślnie." + }, + "frontend_script_api": { + "async_warning": "Przekazujesz funkcję asynchroniczną do `api.runOnBackend()`, co prawdopodobnie nie zadziała zgodnie z zamierzeniami.\\nAlbo uczyń funkcję synchroniczną (usuwając słowo kluczowe `async`), albo użyj `api.runAsyncOnBackendWithManualTransactionHandling()`.", + "sync_warning": "Przekazujesz funkcję synchroniczną do `api.runAsyncOnBackendWithManualTransactionHandling()`,\\npodczas gdy prawdopodobnie powinieneś użyć `api.runOnBackend()`." + }, + "ws": { + "sync-check-failed": "Sprawdzanie synchronizacji nie powiodło się!", + "consistency-checks-failed": "Sprawdzanie spójności nie powiodło się! Zobacz logi, aby uzyskać szczegółowe informacje.", + "encountered-error": "Napotkano błąd \"{{message}}\", sprawdź konsolę.", + "lost-websocket-connection-title": "Utracono połączenie z serwerem", + "lost-websocket-connection-message": "Sprawdź konfigurację swojego odwrotnego serwera proxy (np. nginx lub Apache), aby upewnić się, że połączenia WebSocket są prawidłowo dozwolone i nie są blokowane." + }, + "hoisted_note": { + "confirm_unhoisting": "Żądana notatka '{{requestedNote}}' znajduje się poza poddrzewem podniesionej notatki '{{hoistedNote}}' i musisz ją opuścić, aby uzyskać do niej dostęp. Czy chcesz kontynuować opuszczanie?" + }, + "launcher_context_menu": { + "reset_launcher_confirm": "Czy na pewno chcesz zresetować \"{{title}}\"? Wszystkie dane / ustawienia w tej notatce (i jej dzieciach) zostaną utracone, a program uruchamiający zostanie przywrócony do pierwotnej lokalizacji.", + "add-note-launcher": "Dodaj program uruchamiający notatkę", + "add-script-launcher": "Dodaj program uruchamiający skrypt", + "add-custom-widget": "Dodaj niestandardowy widżet", + "add-spacer": "Dodaj odstęp", + "delete": "Usuń ", + "reset": "Resetuj", + "move-to-visible-launchers": "Przenieś do widocznych programów uruchamiających", + "move-to-available-launchers": "Przenieś do dostępnych programów uruchamiających", + "duplicate-launcher": "Duplikuj program uruchamiający " + }, + "editable-text": { + "auto-detect-language": "Wykryto automatycznie" + }, + "highlighting": { + "title": "Bloki kodu", + "description": "Kontroluje podświetlanie składni dla bloków kodu w notatkach tekstowych, notatki kodowe nie będą miały wpływu.", + "color-scheme": "Schemat kolorów" + }, + "code_block": { + "word_wrapping": "Zawijanie słów", + "theme_none": "Brak podświetlania składni", + "theme_group_light": "Jasne motywy", + "theme_group_dark": "Ciemne motywy", + "copy_title": "Kopiuj do schowka" + }, + "classic_editor_toolbar": { + "title": "Formatowanie" + }, + "editor": { + "title": "Edytor" + }, + "editing": { + "editor_type": { + "label": "Pasek narzędzi formatowania", + "floating": { + "title": "Pływający", + "description": "narzędzia do edycji pojawiają się w pobliżu kursora;" + }, + "fixed": { + "title": "Stały", + "description": "narzędzia do edycji pojawiają się na karcie wstążki \"Formatowanie\"." + }, + "multiline-toolbar": "Wyświetlaj pasek narzędzi w wielu wierszach, jeśli się nie mieści." + } + }, + "geo-map": { + "create-child-note-title": "Utwórz nową notatkę podrzędną i dodaj ją do mapy", + "create-child-note-instruction": "Kliknij na mapę, aby utworzyć nową notatkę w tej lokalizacji, lub naciśnij Escape, aby anulować.", + "unable-to-load-map": "Nie można załadować mapy." + }, + "geo-map-context": { + "open-location": "Otwórz lokalizację", + "remove-from-map": "Usuń z mapy", + "add-note": "Dodaj znacznik w tej lokalizacji" + }, + "help-button": { + "title": "Otwórz odpowiednią stronę pomocy" + }, + "time_selector": { + "invalid_input": "Wprowadzona wartość czasu nie jest prawidłową liczbą.", + "minimum_input": "Wprowadzona wartość czasu musi wynosić co najmniej {{minimumSeconds}} sekund." + }, + "presentation_view": { + "edit-slide": "Edytuj ten slajd", + "start-presentation": "Rozpocznij prezentację", + "slide-overview": "Przełącz podgląd slajdów" } } diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 4613f0547..f35d2ce89 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -289,7 +289,8 @@ "table": "Tabel", "geo-map": "Hartă geografică", "board": "Tablă Kanban", - "include_archived_notes": "Afișează notițele arhivate" + "include_archived_notes": "Afișează notițele arhivate", + "presentation": "Prezentare" }, "bookmark_switch": { "bookmark": "Semn de carte", @@ -611,7 +612,9 @@ "zoom_in": "Mărește", "zoom_out": "Micșorează", "show-cheatsheet": "Afișează ghidul rapid", - "toggle-zen-mode": "Mod zen" + "toggle-zen-mode": "Mod zen", + "new-version-available": "Actualizare nouă disponibilă", + "download-update": "Obțineți versiunea {{latestVersion}}" }, "heading_style": { "markdown": "Stil Markdown", @@ -701,7 +704,13 @@ "first-week-has-minimum-days": "Prima săptămână are numărul minim de zile", "min-days-in-first-week": "Numărul minim de zile pentru prima săptămână", "first-week-info": "Opțiunea de prima săptămână conține prima zi de joi din an este bazată pe standardul ISO 8601.", - "first-week-warning": "Schimbarea opțiunii primei săptămâni poate cauza duplicate cu notițele săptămânale existente deoarece acestea nu vor fi actualizate retroactiv." + "first-week-warning": "Schimbarea opțiunii primei săptămâni poate cauza duplicate cu notițele săptămânale existente deoarece acestea nu vor fi actualizate retroactiv.", + "tuesday": "Marți", + "wednesday": "Miercuri", + "thursday": "Joi", + "friday": "Vineri", + "saturday": "Sâmbătă", + "formatting-locale-auto": "În funcție de limba aplicației" }, "image_properties": { "copy_reference_to_clipboard": "Copiază referință în clipboard", @@ -803,7 +812,8 @@ "delete_this_note": "Șterge această notiță", "error_cannot_get_branch_id": "Nu s-a putut obține branchId-ul pentru calea „{{notePath}}”", "error_unrecognized_command": "Comandă nerecunoscută „{{command}}”", - "insert_child_note": "Inserează subnotiță" + "insert_child_note": "Inserează subnotiță", + "note_revisions": "Revizuiri ale notițelor" }, "move_note": { "clone_note_new_parent": "clonează notița la noul părinte dacă notița are mai multe clone/ramuri (când nu este clar care ramură trebuie ștearsă)", @@ -2069,5 +2079,10 @@ }, "collections": { "rendering_error": "Nu a putut fi afișat conținutul din cauza unei erori." + }, + "presentation_view": { + "edit-slide": "Editați acest slide", + "start-presentation": "Începeți prezentarea", + "slide-overview": "Afișați o imagine de ansamblu a slide-urilor" } } diff --git a/apps/client/src/translations/sv/translation.json b/apps/client/src/translations/sv/translation.json new file mode 100644 index 000000000..c5ec9a096 --- /dev/null +++ b/apps/client/src/translations/sv/translation.json @@ -0,0 +1,8 @@ +{ + "about": { + "title": "Om Trilium Notes", + "homepage": "Hemsida:", + "app_version": "App version:", + "db_version": "DB version:" + } +} diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 4db3764bd..8fdd79540 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -646,7 +646,9 @@ "about": "關於 TriliumNext 筆記", "logout": "登出", "show-cheatsheet": "顯示快捷鍵說明", - "toggle-zen-mode": "禪模式" + "toggle-zen-mode": "禪模式", + "new-version-available": "發現新更新", + "download-update": "取得版本 {{latestVersion}}" }, "sync_status": { "unknown": "

同步狀態將在下一次同步嘗試開始後顯示。

點擊以立即觸發同步。

", @@ -733,7 +735,8 @@ "insert_child_note": "插入子筆記", "delete_this_note": "刪除此筆記", "error_cannot_get_branch_id": "無法獲取 notePath '{{notePath}}' 的 branchId", - "error_unrecognized_command": "無法識別的命令 {{command}}" + "error_unrecognized_command": "無法識別的命令 {{command}}", + "note_revisions": "筆記歷史版本" }, "note_icon": { "change_note_icon": "更改筆記圖標", @@ -746,7 +749,7 @@ "editable": "可編輯", "basic_properties": "基本屬性", "language": "語言", - "configure_code_notes": "配寘代碼注釋..." + "configure_code_notes": "設定程式碼筆記…" }, "book_properties": { "view_type": "視圖類型", @@ -762,7 +765,8 @@ "table": "表格", "geo-map": "地理地圖", "board": "看板", - "include_archived_notes": "顯示已封存筆記" + "include_archived_notes": "顯示已封存筆記", + "presentation": "簡報" }, "edited_notes": { "no_edited_notes_found": "今天還沒有編輯過的筆記...", @@ -1250,7 +1254,13 @@ "min-days-in-first-week": "第一週的最少天數", "first-week-info": "年度第一週包含第一個週四是基於 ISO 8601 標準。", "first-week-warning": "變更第一週選項可能導致與現有的「週筆記」重複,現有的「週筆記」將不會相應更新。", - "formatting-locale": "日期和數字格式" + "formatting-locale": "日期和數字格式", + "tuesday": "週二", + "wednesday": "週三", + "thursday": "週四", + "friday": "週五", + "saturday": "週六", + "formatting-locale-auto": "根據應用程式的語言設定" }, "backup": { "automatic_backup": "自動備份", @@ -1431,7 +1441,7 @@ "relation-map": "關聯圖", "note-map": "筆記地圖", "render-note": "渲染筆記", - "mermaid-diagram": "美人魚圖(Mermaid)", + "mermaid-diagram": "美人魚圖", "canvas": "畫布", "web-view": "網頁顯示", "mind-map": "心智圖", @@ -1507,7 +1517,9 @@ "window-on-top": "保持此視窗置頂" }, "note_detail": { - "could_not_find_typewidget": "找不到類型為 '{{type}}' 的 typeWidget" + "could_not_find_typewidget": "找不到類型為 '{{type}}' 的 typeWidget", + "printing": "正在列印…", + "printing_pdf": "正在匯出為 PDF…" }, "note_title": { "placeholder": "請輸入筆記標題..." @@ -1627,7 +1639,7 @@ "label": "格式工具欄", "floating": { "title": "浮動", - "description": "編輯工具出現在遊標附近;" + "description": "編輯工具出現在游標附近;" }, "fixed": { "title": "固定", @@ -2065,5 +2077,10 @@ }, "collections": { "rendering_error": "發現錯誤,無法顯示內容。" + }, + "presentation_view": { + "edit-slide": "編輯此投影片", + "start-presentation": "開始簡報", + "slide-overview": "切換投影片概覽" } } diff --git a/apps/client/src/translations/vi/translation.json b/apps/client/src/translations/vi/translation.json index 878731e1b..f554442f0 100644 --- a/apps/client/src/translations/vi/translation.json +++ b/apps/client/src/translations/vi/translation.json @@ -4,7 +4,10 @@ "title": "Về Trilium Notes", "app_version": "Phiên bản:", "db_version": "Phiên bản DB:", - "sync_version": "Phiên bản liên kết:" + "sync_version": "Phiên bản liên kết:", + "build_date": "Ngày build:", + "build_revision": "Xây dựng bản sửa đổi:", + "data_directory": "Đường dẫn dữ liệu:" }, "add_link": { "add_link": "Thêm liên kết", @@ -34,7 +37,11 @@ }, "toast": { "critical-error": { - "title": "Lỗi nghiêm trọng" + "title": "Lỗi nghiêm trọng", + "message": "Đã xảy ra lỗi nghiêm trọng ngăn ứng dụng client khởi động\n\n{{message}}\n\nĐiều này có khả năng bị gây ra bởi một script hoạt động không như mong đợi. Hãy thử khởi động ứng dụng ở chế độ an toàn và giải quyết vấn đề." + }, + "widget-error": { + "title": "Khởi tạo widget thất bại" } }, "import": { diff --git a/apps/client/src/types.d.ts b/apps/client/src/types.d.ts index 36b56b9a6..c5a93bd0a 100644 --- a/apps/client/src/types.d.ts +++ b/apps/client/src/types.d.ts @@ -16,7 +16,7 @@ interface ElectronProcess { interface CustomGlobals { isDesktop: typeof utils.isDesktop; isMobile: typeof utils.isMobile; - device: "mobile" | "desktop"; + device: "mobile" | "desktop" | "print"; getComponentByEl: typeof appContext.getComponentByEl; getHeaders: typeof server.getHeaders; getReferenceLinkTitle: (href: string) => Promise; @@ -59,6 +59,9 @@ declare global { process?: ElectronProcess; glob?: CustomGlobals; + /** On the printing endpoint, set to true when the note has fully loaded and is ready to be printed/exported as PDF. */ + _noteReady?: boolean; + EXCALIDRAW_ASSET_PATH?: string; } diff --git a/apps/client/src/utils/css-var.ts b/apps/client/src/utils/css-var.ts new file mode 100644 index 000000000..886247881 --- /dev/null +++ b/apps/client/src/utils/css-var.ts @@ -0,0 +1,45 @@ +export function readCssVar(element: HTMLElement, varName: string) { + return new CssVarReader(getComputedStyle(element).getPropertyValue("--" + varName)); +} + +export class CssVarReader { + protected value: string; + + constructor(rawValue: string) { + this.value = rawValue; + } + + asString(defaultValue?: string) { + return (this.value) ? this.value : defaultValue; + } + + asNumber(defaultValue?: number) { + let number: Number = NaN; + + if (this.value) { + number = parseFloat(this.value); + } + + return (!isNaN(number.valueOf()) ? number.valueOf() : defaultValue) + } + + asEnum(enumType: T, defaultValue?: T[keyof T]): T[keyof T] | undefined { + let result: T[keyof T] | undefined; + + result = enumType[this.value as keyof T]; + + if (result === undefined) { + result = defaultValue; + } + + return result; + } + + asArray(delimiter: string = " "): CssVarReader[] { + // Note: ignoring delimiters inside quotation marks is currently unsupported + let values = this.value.split(delimiter); + + return values.map((v) => new CssVarReader(v)); + } + +} \ No newline at end of file diff --git a/apps/client/src/utils/formatters.spec.ts b/apps/client/src/utils/formatters.spec.ts new file mode 100644 index 000000000..821207d9f --- /dev/null +++ b/apps/client/src/utils/formatters.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from "vitest"; +import options from "../services/options"; +import { formatDateTime, normalizeLocale } from "./formatters"; + +describe("formatters", () => { + it("tolerates incorrect locale", () => { + options.set("formattingLocale", "cn_TW"); + + expect(formatDateTime(new Date())).toBeTruthy(); + expect(formatDateTime(new Date(), "full", "none")).toBeTruthy(); + expect(formatDateTime(new Date(), "none", "full")).toBeTruthy(); + }); + + it("normalizes locale", () => { + expect(normalizeLocale("zh_CN")).toBe("zh-CN"); + expect(normalizeLocale("cn")).toBe("zh-CN"); + expect(normalizeLocale("tw")).toBe("zh-TW"); + }); +}); diff --git a/apps/client/src/utils/formatters.ts b/apps/client/src/utils/formatters.ts index 40f97e673..a7c9cceed 100644 --- a/apps/client/src/utils/formatters.ts +++ b/apps/client/src/utils/formatters.ts @@ -10,7 +10,7 @@ export function formatDateTime(date: string | Date | number | null | undefined, return ""; } - const locale = options.get("formattingLocale") || options.get("locale") || navigator.language; + const locale = normalizeLocale(options.get("formattingLocale") || options.get("locale") || navigator.language); let parsedDate; if (typeof date === "string" || typeof date === "number") { @@ -26,15 +26,37 @@ export function formatDateTime(date: string | Date | number | null | undefined, if (timeStyle !== "none" && dateStyle !== "none") { // Format the date and time - const formatter = new Intl.DateTimeFormat(locale, { dateStyle, timeStyle }); - return formatter.format(parsedDate); + try { + const formatter = new Intl.DateTimeFormat(locale, { dateStyle, timeStyle }); + return formatter.format(parsedDate); + } catch (e) { + const formatter = new Intl.DateTimeFormat(undefined, { dateStyle, timeStyle }); + return formatter.format(parsedDate); + } } else if (timeStyle === "none" && dateStyle !== "none") { // Format only the date - return parsedDate.toLocaleDateString(locale, { dateStyle }); + try { + return parsedDate.toLocaleDateString(locale, { dateStyle }); + } catch (e) { + return parsedDate.toLocaleDateString(undefined, { dateStyle }); + } } else if (dateStyle === "none" && timeStyle !== "none") { // Format only the time - return parsedDate.toLocaleTimeString(locale, { timeStyle }); + try { + return parsedDate.toLocaleTimeString(locale, { timeStyle }); + } catch (e) { + return parsedDate.toLocaleTimeString(undefined, { timeStyle }); + } } throw new Error("Incorrect state."); } + +export function normalizeLocale(locale: string) { + locale = locale.replaceAll("_", "-"); + switch (locale) { + case "cn": return "zh-CN"; + case "tw": return "zh-TW"; + default: return locale; + } +} diff --git a/apps/client/src/widgets/buttons/calendar.ts b/apps/client/src/widgets/buttons/calendar.ts index 56e9ff3b8..27a4344c8 100644 --- a/apps/client/src/widgets/buttons/calendar.ts +++ b/apps/client/src/widgets/buttons/calendar.ts @@ -8,13 +8,15 @@ import options from "../../services/options.js"; import { Dropdown } from "bootstrap"; import type { EventData } from "../../components/app_context.js"; import dayjs, { Dayjs } from "dayjs"; +import isoWeek from "dayjs/plugin/isoWeek.js"; import utc from "dayjs/plugin/utc.js"; import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; import "../../stylesheets/calendar.css"; -import type { AttributeRow } from "@triliumnext/commons"; +import type { AttributeRow, OptionDefinitions } from "@triliumnext/commons"; dayjs.extend(utc); dayjs.extend(isSameOrAfter); +dayjs.extend(isoWeek); const MONTHS = [ t("calendar.january"), @@ -69,7 +71,15 @@ const DROPDOWN_TPL = `
`; -const DAYS_OF_WEEK = [t("calendar.sun"), t("calendar.mon"), t("calendar.tue"), t("calendar.wed"), t("calendar.thu"), t("calendar.fri"), t("calendar.sat")]; +const DAYS_OF_WEEK = [ + t("calendar.sun"), + t("calendar.mon"), + t("calendar.tue"), + t("calendar.wed"), + t("calendar.thu"), + t("calendar.fri"), + t("calendar.sat") +]; interface DateNotesForMonth { [date: string]: string; @@ -90,7 +100,8 @@ export default class CalendarWidget extends RightDropdownButtonWidget { private $nextYear!: JQuery; private $previousYear!: JQuery; private monthDropdown!: Dropdown; - private firstDayOfWeek!: number; + // stored in ISO 1–7 + private firstDayOfWeekISO!: number; private weekCalculationOptions!: WeekCalculationOptions; private activeDate: Dayjs | null = null; private todaysDate!: Dayjs; @@ -126,6 +137,7 @@ export default class CalendarWidget extends RightDropdownButtonWidget { this.createMonth(); } }); + this.$next = this.$dropdownContent.find('[data-calendar-toggle="next"]'); this.$next.on("click", () => { this.date = this.date.add(1, 'month'); @@ -144,23 +156,24 @@ export default class CalendarWidget extends RightDropdownButtonWidget { this.date = this.date.year(parseInt(target.value)); this.createMonth(); }); + this.$nextYear = this.$dropdownContent.find('[data-calendar-toggle="nextYear"]'); this.$nextYear.on("click", () => { this.date = this.date.add(1, 'year'); this.createMonth(); }); + this.$previousYear = this.$dropdownContent.find('[data-calendar-toggle="previousYear"]'); this.$previousYear.on("click", () => { this.date = this.date.subtract(1, 'year'); this.createMonth(); }); + // Date click this.$dropdownContent.on("click", ".calendar-date", async (ev) => { const date = $(ev.target).closest(".calendar-date").attr("data-calendar-date"); - if (date) { const note = await dateNoteService.getDayNote(date); - if (note) { appContext.tabManager.getActiveContext()?.setNote(note.noteId); this.dropdown?.hide(); @@ -168,10 +181,10 @@ export default class CalendarWidget extends RightDropdownButtonWidget { toastService.showError(t("calendar.cannot_find_day_note")); } } - ev.stopPropagation(); }); + // Week click this.$dropdownContent.on("click", ".calendar-week-number", async (ev) => { if (!this.weekNoteEnable) { return; @@ -218,23 +231,17 @@ export default class CalendarWidget extends RightDropdownButtonWidget { return; } const noteAttributes = await server.get(`notes/${noteId}/attributes`); - - for (const attribute of noteAttributes) { - if (attribute.name === 'enableWeekNote') { - this.weekNoteEnable = true; - return - } - } - this.weekNoteEnable = false; + this.weekNoteEnable = noteAttributes.some(a => a.name === 'enableWeekNote'); } + // Store firstDayOfWeek as ISO (1–7) manageFirstDayOfWeek() { - this.firstDayOfWeek = options.getInt("firstDayOfWeek") || 0; + const rawFirstDayOfWeek = options.getInt("firstDayOfWeek") || 0; + this.firstDayOfWeekISO = rawFirstDayOfWeek === 0 ? 7 : rawFirstDayOfWeek; - // Generate the list of days of the week taking into consideration the user's selected first day of week. let localeDaysOfWeek = [...DAYS_OF_WEEK]; - const daysToBeAddedAtEnd = localeDaysOfWeek.splice(0, this.firstDayOfWeek); - localeDaysOfWeek = ['', ...localeDaysOfWeek, ...daysToBeAddedAtEnd]; + const shifted = localeDaysOfWeek.splice(0, rawFirstDayOfWeek); + localeDaysOfWeek = ['', ...localeDaysOfWeek, ...shifted]; this.$weekHeader.html(localeDaysOfWeek.map((el) => `${el}`).join('')); } @@ -245,72 +252,15 @@ export default class CalendarWidget extends RightDropdownButtonWidget { }; } + getWeekStartDate(date: Dayjs): Dayjs { + const currentISO = date.isoWeekday(); + const diff = (currentISO - this.firstDayOfWeekISO + 7) % 7; + return date.clone().subtract(diff, "day").startOf("day"); + } + getWeekNumber(date: Dayjs): number { - const year = date.year(); - const dayOfWeek = (day: number) => (day - this.firstDayOfWeek + 7) % 7; - - // Get first day of the year and adjust to first week start - const jan1 = date.clone().year(year).month(0).date(1); - const jan1Weekday = jan1.day(); - const dayOffset = dayOfWeek(jan1Weekday); - let firstWeekStart = jan1.clone().subtract(dayOffset, 'day'); - - // Adjust based on week rule - switch (this.weekCalculationOptions.firstWeekType) { - case 1: { // ISO 8601: first week contains Thursday - const thursday = firstWeekStart.clone().add(3, 'day'); // Monday + 3 = Thursday - if (thursday.year() < year) { - firstWeekStart = firstWeekStart.add(7, 'day'); - } - break; - } - case 2: { // minDaysInFirstWeek rule - const daysInFirstWeek = 7 - dayOffset; - if (daysInFirstWeek < this.weekCalculationOptions.minDaysInFirstWeek) { - firstWeekStart = firstWeekStart.add(7, 'day'); - } - break; - } - // default case 0: week containing Jan 1 → already handled - } - - const diffDays = date.startOf('day').diff(firstWeekStart.startOf('day'), 'day'); - const weekNumber = Math.floor(diffDays / 7) + 1; - - // Handle case when date is before first week start → belongs to last week of previous year - if (weekNumber <= 0) { - return this.getWeekNumber(date.subtract(1, 'day')); - } - - // Handle case when date belongs to first week of next year - const nextYear = year + 1; - const jan1Next = date.clone().year(nextYear).month(0).date(1); - const jan1WeekdayNext = jan1Next.day(); - const offsetNext = dayOfWeek(jan1WeekdayNext); - let nextYearWeekStart = jan1Next.clone().subtract(offsetNext, 'day'); - - switch (this.weekCalculationOptions.firstWeekType) { - case 1: { - const thursday = nextYearWeekStart.clone().add(3, 'day'); - if (thursday.year() < nextYear) { - nextYearWeekStart = nextYearWeekStart.add(7, 'day'); - } - break; - } - case 2: { - const daysInFirstWeek = 7 - offsetNext; - if (daysInFirstWeek < this.weekCalculationOptions.minDaysInFirstWeek) { - nextYearWeekStart = nextYearWeekStart.add(7, 'day'); - } - break; - } - } - - if (date.isSameOrAfter(nextYearWeekStart)) { - return 1; - } - - return weekNumber; + const weekStart = this.getWeekStartDate(date); + return weekStart.isoWeek(); } async dropdownShown() { @@ -320,32 +270,25 @@ export default class CalendarWidget extends RightDropdownButtonWidget { } init(activeDate: string | null) { - // attaching time fixes local timezone handling this.activeDate = activeDate ? dayjs(`${activeDate}T12:00:00`) : null; this.todaysDate = dayjs(); this.date = dayjs(this.activeDate || this.todaysDate).startOf('month'); - this.createMonth(); } createDay(dateNotesForMonth: DateNotesForMonth, num: number) { - const $newDay = $("").addClass("calendar-date").attr("data-calendar-date", this.date.local().format('YYYY-MM-DD')); + const $newDay = $("") + .addClass("calendar-date") + .attr("data-calendar-date", this.date.local().format('YYYY-MM-DD')); const $date = $("").html(String(num)); - const dateNoteId = dateNotesForMonth[this.date.local().format('YYYY-MM-DD')]; if (dateNoteId) { - $newDay.addClass("calendar-date-exists"); - $newDay.attr("data-href", `#root/${dateNoteId}`); + $newDay.addClass("calendar-date-exists").attr("data-href", `#root/${dateNoteId}`); } - if (this.date.isSame(this.activeDate, 'day')) { - $newDay.addClass("calendar-date-active"); - } - - if (this.date.isSame(this.todaysDate, 'day')) { - $newDay.addClass("calendar-date-today"); - } + if (this.date.isSame(this.activeDate, 'day')) $newDay.addClass("calendar-date-active"); + if (this.date.isSame(this.todaysDate, 'day')) $newDay.addClass("calendar-date-today"); $newDay.append($date); return $newDay; @@ -353,29 +296,26 @@ export default class CalendarWidget extends RightDropdownButtonWidget { createWeekNumber(weekNumber: number) { const weekNoteId = this.date.local().format('YYYY-') + 'W' + String(weekNumber).padStart(2, '0'); - let $newWeekNumber; + if (this.weekNoteEnable) { - // Utilize the hover effect of calendar-date $newWeekNumber = $("").addClass("calendar-date"); - if (this.weekNotes.includes(weekNoteId)) { - $newWeekNumber.addClass("calendar-date-exists"); - $newWeekNumber.attr("data-href", `#root/${weekNoteId}`); + $newWeekNumber.addClass("calendar-date-exists").attr("data-href", `#root/${weekNoteId}`); } - } else { $newWeekNumber = $("").addClass("calendar-week-number-disabled"); } + $newWeekNumber.addClass("calendar-week-number").attr("data-calendar-week-number", weekNoteId); $newWeekNumber.append($("").html(String(weekNumber))); - return $newWeekNumber; } - private getPrevMonthDays(firstDayOfWeek: number): { weekNumber: number, dates: Dayjs[] } { + // Use isoWeekday() consistently + private getPrevMonthDays(firstDayISO: number): { weekNumber: number, dates: Dayjs[] } { const prevMonthLastDay = this.date.subtract(1, 'month').endOf('month'); - const daysToAdd = (firstDayOfWeek - this.firstDayOfWeek + 7) % 7; + const daysToAdd = (firstDayISO - this.firstDayOfWeekISO + 7) % 7; const dates: Dayjs[] = []; const firstDay = this.date.startOf('month'); @@ -389,18 +329,16 @@ export default class CalendarWidget extends RightDropdownButtonWidget { return { weekNumber, dates }; } - private getNextMonthDays(lastDayOfWeek: number): Dayjs[] { + private getNextMonthDays(lastDayISO: number): Dayjs[] { const nextMonthFirstDay = this.date.add(1, 'month').startOf('month'); const dates: Dayjs[] = []; - const lastDayOfUserWeek = (this.firstDayOfWeek + 6) % 7; - const daysToAdd = (lastDayOfUserWeek - lastDayOfWeek + 7) % 7; + const lastDayOfUserWeek = ((this.firstDayOfWeekISO + 6 - 1) % 7) + 1; // ISO wrap + const daysToAdd = (lastDayOfUserWeek - lastDayISO + 7) % 7; - // Get dates from next month for (let i = 0; i < daysToAdd; i++) { dates.push(nextMonthFirstDay.add(i, 'day')); } - return dates; } @@ -411,12 +349,11 @@ export default class CalendarWidget extends RightDropdownButtonWidget { this.$month.empty(); const firstDay = this.date.startOf('month'); - const firstDayOfWeek = firstDay.day(); - - // Add dates from previous month - if (firstDayOfWeek !== this.firstDayOfWeek) { - const { weekNumber, dates } = this.getPrevMonthDays(firstDayOfWeek); + const firstDayISO = firstDay.isoWeekday(); + // Previous month filler + if (firstDayISO !== this.firstDayOfWeekISO) { + const { weekNumber, dates } = this.getPrevMonthDays(firstDayISO); const prevMonth = this.date.subtract(1, 'month').format('YYYY-MM'); const dateNotesForPrevMonth: DateNotesForMonth = await server.get(`special-notes/notes-for-month/${prevMonth}`); @@ -435,18 +372,16 @@ export default class CalendarWidget extends RightDropdownButtonWidget { const currentMonth = this.date.month(); + // Main month while (this.date.month() === currentMonth) { const weekNumber = this.getWeekNumber(this.date); - - // Add week number if it's first day of week - if (this.date.day() === this.firstDayOfWeek) { + if (this.date.isoWeekday() === this.firstDayOfWeekISO) { const $weekNumber = this.createWeekNumber(weekNumber); this.$month.append($weekNumber); } const $day = this.createDay(dateNotesForMonth, this.date.date()); this.$month.append($day); - this.date = this.date.add(1, 'day'); } // while loop trips over and day is at 30/31, bring it back @@ -454,11 +389,11 @@ export default class CalendarWidget extends RightDropdownButtonWidget { // Add dates from next month const lastDayOfMonth = this.date.endOf('month'); - const lastDayOfWeek = lastDayOfMonth.day(); - const lastDayOfUserWeek = (this.firstDayOfWeek + 6) % 7; - if (lastDayOfWeek !== lastDayOfUserWeek) { - const dates = this.getNextMonthDays(lastDayOfWeek); + const lastDayISO = lastDayOfMonth.isoWeekday(); + const lastDayOfUserWeek = ((this.firstDayOfWeekISO + 6 - 1) % 7) + 1; + if (lastDayISO !== lastDayOfUserWeek) { + const dates = this.getNextMonthDays(lastDayISO); const nextMonth = this.date.add(1, 'month').format('YYYY-MM'); const dateNotesForNextMonth: DateNotesForMonth = await server.get(`special-notes/notes-for-month/${nextMonth}`); @@ -477,9 +412,12 @@ export default class CalendarWidget extends RightDropdownButtonWidget { } async entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) { - if (!loadResults.getOptionNames().includes("firstDayOfWeek") && - !loadResults.getOptionNames().includes("firstWeekOfYear") && - !loadResults.getOptionNames().includes("minDaysInFirstWeek")) { + const WEEK_OPTIONS: (keyof OptionDefinitions)[] = [ + "firstDayOfWeek", + "firstWeekOfYear", + "minDaysInFirstWeek", + ]; + if (!WEEK_OPTIONS.some(opt => loadResults.getOptionNames().includes(opt))) { return; } diff --git a/apps/client/src/widgets/buttons/global_menu.css b/apps/client/src/widgets/buttons/global_menu.css index 0d14456e1..d0a7f78dc 100644 --- a/apps/client/src/widgets/buttons/global_menu.css +++ b/apps/client/src/widgets/buttons/global_menu.css @@ -9,6 +9,9 @@ } button.global-menu-button { + --update-badge-x-offset: 4%; + --update-badge-y-offset: -16%; + position: relative; width: 100% !important; height: 100% !important; @@ -55,13 +58,26 @@ button.global-menu-button { .global-menu-button-update-available { position: absolute; - inset-inline-end: -30px; - bottom: -30px; - width: 100%; - height: 100%; + display: flex; + width: 16px; + height: 16px; + right: calc(0px - var(--update-badge-x-offset)); + bottom: calc(0px - var(--update-badge-y-offset)); + justify-content: center; + align-items: center; + border-radius: 50%; + background: var(--global-menu-update-available-badge-background-color, var(--admonition-tip-accent-color)); + color: var(--global-menu-update-available-badge-color, var(--main-background-color)); + font-size: 16px; + transition: transform 200ms ease-in-out; pointer-events: none; } +.global-menu-button.show .global-menu-button-update-available { + transform: scale(.75); + transform-origin: center; +} + .global-menu .zoom-container { display: flex; flex-direction: row; @@ -99,21 +115,6 @@ button.global-menu-button { margin-inline-end: 6px; } -/* #region Update available */ -.global-menu-button-update-available-button { - width: 21px !important; - height: 21px !important; - padding: 0 !important; - - border-radius: var(--button-border-radius); - transform: scale(0.9); - border: none; - opacity: 0.8; - - display: flex; - align-items: center; - justify-content: center; -} .global-menu-button-wrapper:hover .global-menu-button-update-available-button { opacity: 1; diff --git a/apps/client/src/widgets/buttons/global_menu.tsx b/apps/client/src/widgets/buttons/global_menu.tsx index aaf6a785f..9b36d83a5 100644 --- a/apps/client/src/widgets/buttons/global_menu.tsx +++ b/apps/client/src/widgets/buttons/global_menu.tsx @@ -3,7 +3,7 @@ import "./global_menu.css"; import { useStaticTooltip, useStaticTooltipWithKeyboardShortcut, useTriliumOption, useTriliumOptionBool, useTriliumOptionInt } from "../react/hooks"; import { useContext, useEffect, useRef, useState } from "preact/hooks"; import { t } from "../../services/i18n"; -import { FormDropdownDivider, FormDropdownSubmenu, FormListItem } from "../react/FormList"; +import { FormDropdownDivider, FormDropdownSubmenu, FormListHeader, FormListItem } from "../react/FormList"; import { CommandNames } from "../../components/app_context"; import KeyboardShortcut from "../react/KeyboardShortcut"; import { KeyboardActionNames } from "@triliumnext/commons"; @@ -26,7 +26,7 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout: const isVerticalLayout = !isHorizontalLayout; const parentComponent = useContext(ParentComponent); const { isUpdateAvailable, latestVersion } = useTriliumUpdateStatus(); - + return ( {isVerticalLayout && } {isUpdateAvailable && } } noDropdownListStyle @@ -58,7 +58,14 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout: - {isUpdateAvailable && window.open("https://github.com/TriliumNext/Trilium/releases/latest")} icon="bx bx-sync" text={t("global_menu.update_available", { latestVersion })} /> } + + {isUpdateAvailable && <> + + window.open("https://github.com/TriliumNext/Trilium/releases/latest")} + icon="bx bx-download" + text={t("global_menu.download-update", {latestVersion})} /> + } + {!isElectron() && } ) diff --git a/apps/client/src/widgets/buttons/left_pane_toggle.css b/apps/client/src/widgets/buttons/left_pane_toggle.css new file mode 100644 index 000000000..e1ef90c8a --- /dev/null +++ b/apps/client/src/widgets/buttons/left_pane_toggle.css @@ -0,0 +1,29 @@ +@keyframes left-pane-toggle-button-expand { + from { + rotate: 0deg; + } to { + rotate: 180deg; + } +} + +@keyframes left-pane-toggle-button-collapse { + from { + rotate: 180deg; + } to { + rotate: 360deg; + } +} + +.layout-vertical .left-pane-toggle-button::before { + display: block; +} + +.layout-vertical .left-pane-toggle-button.action-collapse::before { + rotate: 360deg; + animation: left-pane-toggle-button-collapse 600ms ease-in-out; +} + +.layout-vertical .left-pane-toggle-button.action-expand::before { + rotate: 180deg; + animation: left-pane-toggle-button-expand 600ms ease-in-out; +} \ No newline at end of file diff --git a/apps/client/src/widgets/buttons/left_pane_toggle.tsx b/apps/client/src/widgets/buttons/left_pane_toggle.tsx index f6c4b3ab8..106c4be00 100644 --- a/apps/client/src/widgets/buttons/left_pane_toggle.tsx +++ b/apps/client/src/widgets/buttons/left_pane_toggle.tsx @@ -1,3 +1,4 @@ +import "./left_pane_toggle.css"; import { useEffect, useState } from "preact/hooks"; import ActionButton from "../react/ActionButton"; import options from "../../services/options"; @@ -18,12 +19,10 @@ export default function LeftPaneToggle({ isHorizontalLayout }: { isHorizontalLay return ( ) } \ No newline at end of file diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index e721d3eb9..c39b4e7e8 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -1,4 +1,4 @@ -import { allViewTypes, ViewModeProps, ViewTypeOptions } from "./interface"; +import { allViewTypes, ViewModeMedia, ViewModeProps, ViewTypeOptions } from "./interface"; import { useNoteContext, useNoteLabel, useNoteLabelBoolean, useTriliumEvent } from "../react/hooks"; import FNote from "../../entities/fnote"; import "./NoteList.css"; @@ -12,8 +12,9 @@ import BoardView from "./board"; import { subscribeToMessages, unsubscribeToMessage as unsubscribeFromMessage } from "../../services/ws"; import { WebSocketMessage } from "@triliumnext/commons"; import froca from "../../services/froca"; +import PresentationView from "./presentation"; -interface NoteListProps { +interface NoteListProps { note: FNote | null | undefined; notePath: string | null | undefined; highlightedTokens?: string[] | null; @@ -21,22 +22,24 @@ interface NoteListProps { displayOnlyCollections?: boolean; isEnabled: boolean; ntxId: string | null | undefined; + media: ViewModeMedia; + onReady?: () => void; } -export default function NoteList(props: Pick, "displayOnlyCollections">) { +export default function NoteList(props: Pick) { const { note, noteContext, notePath, ntxId } = useNoteContext(); const isEnabled = noteContext?.hasNoteList(); return } -export function SearchNoteList(props: Omit, "isEnabled">) { +export function SearchNoteList(props: Omit) { return } -function CustomNoteList({ note, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId }: NoteListProps) { +export function CustomNoteList({ note, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId, onReady, ...restProps }: NoteListProps) { const widgetRef = useRef(null); const viewType = useNoteViewType(note); - const noteIds = useNoteIds(note, viewType, ntxId); + const noteIds = useNoteIds(shouldEnable ? note : null, viewType, ntxId); const isFullHeight = (viewType && viewType !== "list" && viewType !== "grid"); const [ isIntersecting, setIsIntersecting ] = useState(false); const shouldRender = (isFullHeight || isIntersecting || note?.type === "book"); @@ -75,12 +78,14 @@ function CustomNoteList({ note, isEnabled: shouldEnable, noteP note, noteIds, notePath, highlightedTokens, viewConfig: viewModeConfig[0], - saveConfig: viewModeConfig[1] + saveConfig: viewModeConfig[1], + onReady: onReady ?? (() => {}), + ...restProps } } return ( -
+
{props && isEnabled && (
{getComponentByViewType(viewType, props)} @@ -104,6 +109,8 @@ function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps< return case "board": return + case "presentation": + return } } @@ -120,7 +127,7 @@ function useNoteViewType(note?: FNote | null): ViewTypeOptions | undefined { } } -function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined, ntxId: string | null | undefined) { +export function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined, ntxId: string | null | undefined) { const [ noteIds, setNoteIds ] = useState([]); const [ includeArchived ] = useNoteLabelBoolean(note, "includeArchived"); @@ -133,7 +140,7 @@ function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | } async function getNoteIds(note: FNote) { - if (viewType === "list" || viewType === "grid") { + if (viewType === "list" || viewType === "grid" || viewType === "table" || note.type === "search") { return note.getChildNoteIds(); } else { return await note.getSubtreeNoteIds(includeArchived); @@ -184,7 +191,7 @@ function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | return noteIds; } -function useViewModeConfig(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined) { +export function useViewModeConfig(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined) { const [ viewConfig, setViewConfig ] = useState<[T | undefined, (data: T) => void]>(); useEffect(() => { diff --git a/apps/client/src/widgets/collections/board/data.ts b/apps/client/src/widgets/collections/board/data.ts index 273ca3c91..db315564a 100644 --- a/apps/client/src/widgets/collections/board/data.ts +++ b/apps/client/src/widgets/collections/board/data.ts @@ -66,7 +66,7 @@ async function recursiveGroupBy(branches: FBranch[], byColumn: ColumnMap, groupB const note = await branch.getNote(); if (!note || (!includeArchived && note.isArchived)) continue; - if (note.hasChildren()) { + if (note.type !== "search" && note.hasChildren()) { await recursiveGroupBy(note.getChildBranches(), byColumn, groupByColumn, includeArchived); } diff --git a/apps/client/src/widgets/collections/interface.ts b/apps/client/src/widgets/collections/interface.ts index 0b2fdb22d..7bec23a64 100644 --- a/apps/client/src/widgets/collections/interface.ts +++ b/apps/client/src/widgets/collections/interface.ts @@ -1,8 +1,10 @@ import FNote from "../../entities/fnote"; -export const allViewTypes = ["list", "grid", "calendar", "table", "geoMap", "board"] as const; +export const allViewTypes = ["list", "grid", "calendar", "table", "geoMap", "board", "presentation"] as const; export type ViewTypeOptions = typeof allViewTypes[number]; +export type ViewModeMedia = "screen" | "print"; + export interface ViewModeProps { note: FNote; notePath: string; @@ -13,4 +15,6 @@ export interface ViewModeProps { highlightedTokens: string[] | null | undefined; viewConfig: T | undefined; saveConfig(newConfig: T): void; + media: ViewModeMedia; + onReady(): void; } diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.css b/apps/client/src/widgets/collections/legacy/ListOrGridView.css index 3a62b85b3..60afe8954 100644 --- a/apps/client/src/widgets/collections/legacy/ListOrGridView.css +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.css @@ -106,6 +106,12 @@ text-align: center; } +.note-list.list-view .note-path { + margin-left: 0.5em; + vertical-align: middle; + opacity: 0.5; +} + /* #region Grid view */ .note-list.grid-view .note-list-container { display: flex; diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx index 274ef2111..d29d7e275 100644 --- a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx @@ -74,12 +74,12 @@ function ListNoteCard({ note, parentNote, expand, highlightedTokens }: { note: F /> - + {isExpanded && <> - + }
@@ -110,7 +110,11 @@ function GridNoteCard({ note, parentNote, highlightedTokens }: { note: FNote, pa {noteTitle} - +
) } @@ -126,12 +130,15 @@ function NoteAttributes({ note }: { note: FNote }) { return } -function NoteContent({ note, trim, highlightedTokens }: { note: FNote, trim?: boolean, highlightedTokens }) { +function NoteContent({ note, trim, noChildrenList, highlightedTokens }: { note: FNote, trim?: boolean, noChildrenList?: boolean, highlightedTokens: string[] | null | undefined }) { const contentRef = useRef(null); const highlightSearch = useImperativeSearchHighlighlighting(highlightedTokens); useEffect(() => { - content_renderer.getRenderedContent(note, { trim }) + content_renderer.getRenderedContent(note, { + trim, + noChildrenList + }) .then(({ $renderedContent, type }) => { if (!contentRef.current) return; contentRef.current.replaceChildren(...$renderedContent); diff --git a/apps/client/src/widgets/collections/presentation/index.css b/apps/client/src/widgets/collections/presentation/index.css new file mode 100644 index 000000000..5aafffd9f --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/index.css @@ -0,0 +1,10 @@ +.presentation-button-bar { + position: absolute; + top: 1em; + right: 1em; +} + +.presentation-container { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/presentation/index.tsx b/apps/client/src/widgets/collections/presentation/index.tsx new file mode 100644 index 000000000..dfa4574e0 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/index.tsx @@ -0,0 +1,245 @@ +import { ViewModeMedia, ViewModeProps } from "../interface"; +import { useEffect, useLayoutEffect, useRef, useState } from "preact/hooks"; +import Reveal from "reveal.js"; +import slideBaseStylesheet from "reveal.js/dist/reveal.css?raw"; +import slideCustomStylesheet from "./slidejs.css?raw"; +import { buildPresentationModel, PresentationModel, PresentationSlideBaseModel } from "./model"; +import ShadowDom from "../../react/ShadowDom"; +import ActionButton from "../../react/ActionButton"; +import "./index.css"; +import { RefObject } from "preact"; +import { openInCurrentNoteContext } from "../../../components/note_context"; +import { useNoteLabelWithDefault, useTriliumEvent } from "../../react/hooks"; +import { t } from "../../../services/i18n"; +import { DEFAULT_THEME, loadPresentationTheme } from "./themes"; +import FNote from "../../../entities/fnote"; + +export default function PresentationView({ note, noteIds, media, onReady }: ViewModeProps<{}>) { + const [ presentation, setPresentation ] = useState(); + const containerRef = useRef(null); + const [ api, setApi ] = useState(); + const stylesheets = usePresentationStylesheets(note, media); + + function refresh() { + buildPresentationModel(note).then(setPresentation); + } + + useTriliumEvent("entitiesReloaded", ({ loadResults }) => { + if (loadResults.getNoteIds().find(noteId => noteIds.includes(noteId)) || + loadResults.getAttributeRows().find(attr => attr.noteId && attr.name?.startsWith("slide:") && noteIds.includes(attr.noteId))) { + refresh(); + } + }); + + useLayoutEffect(refresh, [ note, noteIds ]); + + useEffect(() => { + // We need to wait for Reveal.js to initialize (by setting api) and for the presentation to become available. + if (api && presentation) { + // Timeout is necessary because it otherwise can cause flakiness by rendering only the first slide. + setTimeout(onReady, 200); + } + }, [ api, presentation ]); + + if (!presentation || !stylesheets) return; + const content = ( + <> + {stylesheets.map(stylesheet => )} + + + ); + + if (media === "screen") { + return ( + <> + {content} + + + ) + } else if (media === "print") { + // Printing needs a query parameter that is read by Reveal.js. + const url = new URL(window.location.href); + url.searchParams.set("print-pdf", ""); + window.history.replaceState({}, '', url); + + // Shadow DOM doesn't work well with Reveal.js's PDF printing mechanism. + return content; + } +} + +function usePresentationStylesheets(note: FNote, media: ViewModeMedia) { + const [ themeName ] = useNoteLabelWithDefault(note, "presentation:theme", DEFAULT_THEME); + const [ stylesheets, setStylesheets ] = useState(); + + useLayoutEffect(() => { + loadPresentationTheme(themeName).then((themeStylesheet) => { + let stylesheets = [ + slideBaseStylesheet, + themeStylesheet, + slideCustomStylesheet + ]; + if (media === "screen") { + // We are rendering in the shadow DOM, so the global variables are not set correctly. + stylesheets = stylesheets.map(stylesheet => stylesheet.replace(/:root/g, ":host")); + } + setStylesheets(stylesheets); + }); + }, [ themeName ]); + + return stylesheets; +} + +function ButtonOverlay({ containerRef, api }: { containerRef: RefObject, api: Reveal.Api | undefined }) { + const [ isOverviewActive, setIsOverviewActive ] = useState(false); + useEffect(() => { + if (!api) return; + setIsOverviewActive(api.isOverview()); + const onEnabled = () => setIsOverviewActive(true); + const onDisabled = () => setIsOverviewActive(false); + api.on("overviewshown", onEnabled); + api.on("overviewhidden", onDisabled); + return () => { + api.off("overviewshown", onEnabled); + api.off("overviewhidden", onDisabled); + }; + }, [ api ]); + + return ( +
+
+ { + const currentSlide = api?.getCurrentSlide(); + const noteId = getNoteIdFromSlide(currentSlide); + + if (noteId) { + openInCurrentNoteContext(e, noteId); + } + }} + /> + + api?.toggleOverview()} + /> + + containerRef.current?.requestFullscreen()} + /> +
+
+ ) +} + +function Presentation({ presentation, setApi } : { presentation: PresentationModel, setApi: (api: Reveal.Api | undefined) => void }) { + const containerRef = useRef(null); + const [revealApi, setRevealApi] = useState(); + + useEffect(() => { + if (!containerRef.current) return; + + const api = new Reveal(containerRef.current, { + transition: "slide", + embedded: true, + pdfMaxPagesPerSlide: 1, + keyboardCondition(event) { + // Full-screen requests sometimes fail, we rely on the UI button instead. + if (event.key === "f") { + return false; + } + + return true; + }, + }); + api.initialize().then(() => { + setRevealApi(api); + setApi(api); + + if (containerRef.current) { + rewireLinks(containerRef.current, api); + } + }); + + return () => { + api.destroy(); + setRevealApi(undefined); + setApi(undefined); + } + }, []); + + useEffect(() => { + revealApi?.sync(); + }, [ presentation, revealApi ]); + + return ( +
+
+ {presentation.slides?.map(slide => { + if (!slide.verticalSlides) { + return + } else { + return ( +
+ + {slide.verticalSlides.map(slide => )} +
+ ); + } + })} +
+
+ ) + +} + +function Slide({ slide }: { slide: PresentationSlideBaseModel }) { + return ( +
+ ); +} + +function getNoteIdFromSlide(slide: HTMLElement | undefined) { + if (!slide) return; + return slide.dataset.noteId; +} + +function rewireLinks(container: HTMLElement, api: Reveal.Api) { + const links = container.querySelectorAll("a.reference-link"); + for (const link of links) { + link.addEventListener("click", () => { + /** + * Reveal.js has built-in navigation by either index or ID. However, the ID-based navigation doesn't work because it tries to look + * outside the shadom DOM (via document.getElementById). + */ + const url = new URL(link.href); + if (!url.hash.startsWith("#/slide-")) return; + const targetId = url.hash.substring(8); + const slide = container.querySelector(`#slide-${targetId}`); + if (!slide) return; + + const { h, v, f } = api.getIndices(slide); + api.slide(h, v, f); + }); + } +} diff --git a/apps/client/src/widgets/collections/presentation/model.spec.ts b/apps/client/src/widgets/collections/presentation/model.spec.ts new file mode 100644 index 000000000..e5b5b49b6 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/model.spec.ts @@ -0,0 +1,83 @@ +import { beforeAll, describe, expect, it } from "vitest"; +import { buildNote } from "../../../test/easy-froca"; +import FNote from "../../../entities/fnote"; +import { buildPresentationModel, PresentationModel } from "./model"; + +let presentationNote!: FNote; +let data!: PresentationModel; + +describe("Presentation model", () => { + beforeAll(async () => { + presentationNote = buildNote({ + title: "Presentation", + id: "presentation", + "#viewType": "presentation", + "children": [ + { + id: "slide1", + title: "First slide", + children: [ + { + id: "slide2", + title: "First-sub", + content: `

Go to Other note.

` + } + ] + }, + { + title: "Second slide", + id: "slide3", + content: `

Go to First slide.

`, + children: [ + { + id: "slide4", + title: "Second-sub", + content: `

Go to First-sub.

`, + } + ] + } + ] + }); + buildNote({ + id: "other", + title: "Other note" + }); + data = await buildPresentationModel(presentationNote); + }); + + it("it correctly maps horizontal and vertical slides", () => { + expect(data).toMatchObject({ + slides: [ + { + noteId: "slide1", + verticalSlides: [ + { + noteId: "slide2" + } + ] + }, + { + noteId: "slide3", + verticalSlides: [ + { + noteId: "slide4" + } + ] + } + ] + }) + }); + + it("empty slides don't render children", () => { + expect(data.slides[0].content.__html).toStrictEqual(""); + }); + + it("rewrites links to other slides", () => { + expect(data.slides[1].content.__html).toStrictEqual(`

Go to First slide.

`); + expect(data.slides[1].verticalSlides![0].content.__html).toStrictEqual(`

Go to First-sub.

`); + }); + + it("rewrites links even if they are not part of the slideshow", () => { + expect(data.slides[0].verticalSlides![0].content.__html).toStrictEqual(`

Go to Other note.

`); + }); +}); diff --git a/apps/client/src/widgets/collections/presentation/model.ts b/apps/client/src/widgets/collections/presentation/model.ts new file mode 100644 index 000000000..92b7ffe76 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/model.ts @@ -0,0 +1,73 @@ +import { NoteType } from "@triliumnext/commons"; +import FNote from "../../../entities/fnote"; +import contentRenderer from "../../../services/content_renderer"; + +type DangerouslySetInnerHTML = { __html: string; }; + +/** A top-level slide with optional vertical slides. */ +interface PresentationSlideModel extends PresentationSlideBaseModel { + verticalSlides: PresentationSlideBaseModel[] | undefined; +} + +/** Either a top-level slide or a vertical slide. */ +export interface PresentationSlideBaseModel { + noteId: string; + type: NoteType; + content: DangerouslySetInnerHTML; + backgroundColor?: string; + backgroundGradient?: string; +} + +export interface PresentationModel { + slides: PresentationSlideModel[]; +} + +export async function buildPresentationModel(note: FNote): Promise { + const slideNotes = await note.getChildNotes(); + const slides: PresentationSlideModel[] = await Promise.all(slideNotes.map(async slideNote => ({ + ...(await buildSlideModel(slideNote)), + verticalSlides: note.type !== "search" ? await buildVerticalSlides(slideNote) : undefined + }))); + + postProcessSlides(slides); + return { slides }; +} + +async function buildVerticalSlides(parentSlideNote: FNote): Promise { + const children = await parentSlideNote.getChildNotes(); + if (!children.length) return; + + const slides: PresentationSlideBaseModel[] = await Promise.all(children.map(buildSlideModel)); + + return slides; +} + +async function buildSlideModel(note: FNote): Promise { + const slideBackground = note.getLabelValue("slide:background") ?? undefined; + const isGradient = slideBackground?.includes("gradient("); + + return { + noteId: note.noteId, + type: note.type, + content: await processContent(note), + backgroundColor: !isGradient ? slideBackground : undefined, + backgroundGradient: isGradient ? slideBackground : undefined + } +} + +async function processContent(note: FNote): Promise { + const { $renderedContent } = await contentRenderer.getRenderedContent(note, { + noChildrenList: true + }); + return { __html: $renderedContent.html() }; +} + +async function postProcessSlides(slides: (PresentationSlideModel | PresentationSlideBaseModel)[]) { + for (const slide of slides) { + if (slide.type !== "text") continue; + slide.content.__html = slide.content.__html.replaceAll(/href="[^"]*#root[a-zA-Z0-9_\/]*\/([a-zA-Z0-9_]+)[^"]*"/g, `href="#/slide-$1"`); + if ("verticalSlides" in slide && slide.verticalSlides) { + postProcessSlides(slide.verticalSlides); + } + } +} diff --git a/apps/client/src/widgets/collections/presentation/slidejs.css b/apps/client/src/widgets/collections/presentation/slidejs.css new file mode 100644 index 000000000..4fee508f2 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/slidejs.css @@ -0,0 +1,29 @@ +figure img { + aspect-ratio: unset !important; + height: auto !important; +} + +span.katex-html { + display: none !important; +} + +p:has(span.text-tiny), +p:has(span.text-small), +p:has(span.text-big), +p:has(span.text-huge) { + line-height: unset !important; +} + +span.text-tiny { font-size: 0.5em; } +span.text-small { font-size: 0.75em; } +span.text-big { font-size: 1.5em; } +span.text-huge { font-size: 2em; } + +footer.file-footer { + display: none !important; +} + +.reveal video { + max-width: unset; + max-height: unset; +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/presentation/themes.spec.ts b/apps/client/src/widgets/collections/presentation/themes.spec.ts new file mode 100644 index 000000000..854cad190 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/themes.spec.ts @@ -0,0 +1,10 @@ +import { it, describe } from "vitest"; +import { getPresentationThemes, loadPresentationTheme } from "./themes"; + +describe("Presentation themes", () => { + it("can load all themes", async () => { + const themes = getPresentationThemes(); + + await Promise.all(themes.map(theme => loadPresentationTheme(theme.id))); + }); +}); diff --git a/apps/client/src/widgets/collections/presentation/themes.ts b/apps/client/src/widgets/collections/presentation/themes.ts new file mode 100644 index 000000000..414472d56 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/themes.ts @@ -0,0 +1,58 @@ +export const DEFAULT_THEME = "white"; + +const themes = { + black: { + name: "Black", + loadTheme: () => import("reveal.js/dist/theme/black.css?raw") + }, + white: { + name: "White", + loadTheme: () => import("reveal.js/dist/theme/white.css?raw") + }, + beige: { + name: "Beige", + loadTheme: () => import("reveal.js/dist/theme/beige.css?raw") + }, + serif: { + name: "Serif", + loadTheme: () => import("reveal.js/dist/theme/serif.css?raw") + }, + simple: { + name: "Simple", + loadTheme: () => import("reveal.js/dist/theme/simple.css?raw") + }, + solarized: { + name: "Solarized", + loadTheme: () => import("reveal.js/dist/theme/solarized.css?raw") + }, + moon: { + name: "Moon", + loadTheme: () => import("reveal.js/dist/theme/moon.css?raw") + }, + dracula: { + name: "Dracula", + loadTheme: () => import("reveal.js/dist/theme/dracula.css?raw") + }, + sky: { + name: "Sky", + loadTheme: () => import("reveal.js/dist/theme/sky.css?raw") + }, + blood: { + name: "Blood", + loadTheme: () => import("reveal.js/dist/theme/blood.css?raw") + } +} as const; + +export function getPresentationThemes() { + return Object.entries(themes).map(([ id, theme ]) => ({ + id: id, + name: theme.name + })); +} + +export async function loadPresentationTheme(name: keyof typeof themes | string) { + let theme = themes[name]; + if (!theme) theme = themes[DEFAULT_THEME]; + + return (await theme.loadTheme()).default; +} diff --git a/apps/client/src/widgets/collections/table/index.tsx b/apps/client/src/widgets/collections/table/index.tsx index 2a40c594c..f6ae82009 100644 --- a/apps/client/src/widgets/collections/table/index.tsx +++ b/apps/client/src/widgets/collections/table/index.tsx @@ -2,7 +2,7 @@ import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "p import { ViewModeProps } from "../interface"; import { buildColumnDefinitions } from "./columns"; import getAttributeDefinitionInformation, { buildRowDefinitions, TableData } from "./rows"; -import { useLegacyWidget, useNoteLabelBoolean, useNoteLabelInt, useSpacedUpdate, useTriliumEvent } from "../../react/hooks"; +import { useLegacyWidget, useNoteLabelBoolean, useNoteLabelInt, useTriliumEvent } from "../../react/hooks"; import Tabulator from "./tabulator"; import { Tabulator as VanillaTabulator, SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule, ColumnDefinition, DataTreeModule, Options, RowComponent} from 'tabulator-tables'; import { useContextMenu } from "./context_menu"; @@ -17,6 +17,7 @@ import AttributeDetailWidget from "../../attribute_widgets/attribute_detail"; import attributes from "../../../services/attributes"; import { RefObject } from "preact"; import SpacedUpdate from "../../../services/spaced_update"; +import froca from "../../../services/froca"; interface TableConfig { tableData: { @@ -132,25 +133,27 @@ function useData(note: FNote, noteIds: string[], viewConfig: TableConfig | undef const [ isSorted ] = useNoteLabelBoolean(note, "sorted"); const [ movableRows, setMovableRows ] = useState(false); - function refresh() { + async function refresh() { const info = getAttributeDefinitionInformation(note); - buildRowDefinitions(note, info, includeArchived, maxDepth).then(({ definitions: rowData, hasSubtree: hasChildren, rowNumber }) => { - const columnDefs = buildColumnDefinitions({ - info, - movableRows, - existingColumnData: viewConfig?.tableData?.columns, - rowNumberHint: rowNumber, - position: newAttributePosition.current ?? undefined - }); - setColumnDefs(columnDefs); - setRowData(rowData); - setHasChildren(hasChildren); - resetNewAttributePosition(); + // Ensure all note IDs are loaded. + await froca.getNotes(noteIds); + + const { definitions: rowData, hasSubtree: hasChildren, rowNumber } = await buildRowDefinitions(note, info, includeArchived, maxDepth); + const columnDefs = buildColumnDefinitions({ + info, + movableRows, + existingColumnData: viewConfig?.tableData?.columns, + rowNumberHint: rowNumber, + position: newAttributePosition.current ?? undefined }); + setColumnDefs(columnDefs); + setRowData(rowData); + setHasChildren(hasChildren); + resetNewAttributePosition(); } - useEffect(refresh, [ note, noteIds, maxDepth, movableRows ]); + useEffect(() => { refresh() }, [ note, noteIds, maxDepth, movableRows ]); useTriliumEvent("entitiesReloaded", ({ loadResults}) => { // React to column changes. diff --git a/apps/client/src/widgets/collections/table/rows.ts b/apps/client/src/widgets/collections/table/rows.ts index 84b4c5882..e1b0a765e 100644 --- a/apps/client/src/widgets/collections/table/rows.ts +++ b/apps/client/src/widgets/collections/table/rows.ts @@ -20,6 +20,10 @@ export async function buildRowDefinitions(parentNote: FNote, infos: AttributeDef let hasSubtree = false; let rowNumber = childBranches.length; + if (parentNote.type === "search") { + maxDepth = 0; + } + for (const branch of childBranches) { const note = await branch.getNote(); if (!note || (!includeArchived && note.isArchived)) { diff --git a/apps/client/src/widgets/dialogs/import.tsx b/apps/client/src/widgets/dialogs/import.tsx index a54a01573..46db5b8cd 100644 --- a/apps/client/src/widgets/dialogs/import.tsx +++ b/apps/client/src/widgets/dialogs/import.tsx @@ -37,7 +37,7 @@ export default function ImportDialog() { onSubmit={async () => { if (!files || !parentNoteId) { return; - } + } const options: UploadFilesOptions = { safeImport: boolToString(safeImport), @@ -51,11 +51,19 @@ export default function ImportDialog() { setShown(false); await importService.uploadFiles("notes", parentNoteId, Array.from(files), options); }} - onHidden={() => setShown(false)} + onHidden={() => { + setShown(false); + setFiles(null); + }} footer={
diff --git a/apps/edit-docs/package.json b/apps/edit-docs/package.json index 91fe601ac..14c843def 100644 --- a/apps/edit-docs/package.json +++ b/apps/edit-docs/package.json @@ -12,7 +12,7 @@ "@triliumnext/desktop": "workspace:*", "@types/fs-extra": "11.0.4", "copy-webpack-plugin": "13.0.1", - "electron": "38.2.2", + "electron": "38.3.0", "fs-extra": "11.3.2" }, "scripts": { diff --git a/apps/server-e2e/src/i18n.spec.ts b/apps/server-e2e/src/i18n.spec.ts index bda21026c..ef4b810b0 100644 --- a/apps/server-e2e/src/i18n.spec.ts +++ b/apps/server-e2e/src/i18n.spec.ts @@ -42,19 +42,19 @@ test("User can change language from settings", async ({ page, context }) => { // Check that the default value (English) is set. await expect(app.currentNoteSplit).toContainText("First day of the week"); - const languageCombobox = app.currentNoteSplit.getByRole("combobox").first(); - await expect(languageCombobox).toHaveValue("en"); + const languageCombobox = app.dropdown(app.currentNoteSplit.locator(".options-section .dropdown").first()); + await expect(languageCombobox).toContainText("English"); // Select Chinese and ensure the translation is set. - await languageCombobox.selectOption("cn"); + await languageCombobox.selectOptionByText("简体中文"); await app.currentNoteSplit.locator("button[name=restart-app-button]").click(); await expect(app.currentNoteSplit).toContainText("一周的第一天", { timeout: 15000 }); - await expect(languageCombobox).toHaveValue("cn"); + await expect(languageCombobox).toContainText("简体中文"); // Select English again. - await languageCombobox.selectOption("en"); + await languageCombobox.selectOptionByText("English"); await app.currentNoteSplit.locator("button[name=restart-app-button]").click(); await expect(app.currentNoteSplit).toContainText("Language", { timeout: 15000 }); - await expect(languageCombobox).toHaveValue("en"); + await expect(languageCombobox).toContainText("English"); }); diff --git a/apps/server-e2e/src/support/app.ts b/apps/server-e2e/src/support/app.ts index 391d458c5..a0c3ca1ad 100644 --- a/apps/server-e2e/src/support/app.ts +++ b/apps/server-e2e/src/support/app.ts @@ -9,6 +9,10 @@ interface GotoOpts { const BASE_URL = "http://127.0.0.1:8082"; +interface DropdownLocator extends Locator { + selectOptionByText: (text: string) => Promise; +} + export default class App { readonly page: Page; readonly context: BrowserContext; @@ -157,4 +161,14 @@ export default class App { }) ).toBeOK(); } + + dropdown(_locator: Locator): DropdownLocator { + let locator = _locator as DropdownLocator; + locator.selectOptionByText = async (text: string) => { + await locator.locator(".dropdown-toggle").click(); + await locator.locator(".dropdown-item", { hasText: text }).click(); + }; + return locator; + } + } diff --git a/apps/server/package.json b/apps/server/package.json index 275d6274d..ec76897aa 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -1,6 +1,6 @@ { "name": "@triliumnext/server", - "version": "0.99.1", + "version": "0.99.2", "description": "The server-side component of TriliumNext, which exposes the client via the web, allows for sync and provides a REST API for both internal and external use.", "private": true, "main": "./src/main.ts", @@ -29,7 +29,7 @@ "node-html-parser": "7.0.1" }, "devDependencies": { - "@anthropic-ai/sdk": "0.65.0", + "@anthropic-ai/sdk": "0.67.0", "@braintree/sanitize-url": "7.1.1", "@electron/remote": "2.1.3", "@preact/preset-vite": "2.10.2", @@ -81,7 +81,7 @@ "debounce": "2.2.0", "debug": "4.4.3", "ejs": "3.1.10", - "electron": "38.2.2", + "electron": "38.3.0", "electron-debug": "4.1.0", "electron-window-state": "5.0.3", "escape-html": "1.0.3", @@ -97,7 +97,7 @@ "html2plaintext": "2.1.4", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", - "i18next": "25.5.3", + "i18next": "25.6.0", "i18next-fs-backend": "2.6.0", "image-type": "6.0.0", "ini": "5.0.0", @@ -105,12 +105,12 @@ "is-svg": "6.1.0", "jimp": "1.6.0", "js-yaml": "4.1.0", - "marked": "16.4.0", + "marked": "16.4.1", "mime-types": "3.0.1", "multer": "2.0.2", "normalize-strings": "1.1.1", "ollama": "0.6.0", - "openai": "6.3.0", + "openai": "6.6.0", "rand-token": "1.0.1", "safe-compare": "1.1.4", "sanitize-filename": "1.6.3", @@ -127,7 +127,7 @@ "tmp": "0.2.5", "turndown": "7.2.1", "unescape": "1.0.1", - "vite": "7.1.9", + "vite": "7.1.11", "ws": "8.18.3", "xml2js": "0.6.2", "yauzl": "3.2.0" diff --git a/apps/server/src/assets/db/demo.zip b/apps/server/src/assets/db/demo.zip index 5ddc6a768..ebf3f8a7c 100644 Binary files a/apps/server/src/assets/db/demo.zip and b/apps/server/src/assets/db/demo.zip differ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json b/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json index 5da8e98fd..14e062249 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json +++ b/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json @@ -1 +1 @@ -[{"id":"_help_BOCnjTMBCoxW","title":"Feature Highlights","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Feature Highlights"},{"name":"iconClass","value":"bx bx-star","type":"label"}]},{"id":"_help_Otzi9La2YAUX","title":"Installation & Setup","type":"book","attributes":[{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_poXkQfguuA0U","title":"Desktop Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WOcw2SLH6tbX","title":"Server Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_Dgg7bR3b6K9j","title":"1. Installing the server","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_3tW6mORuTHnB","title":"Packaged version for Linux","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_rWX5eY045zbE","title":"Using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker"},{"name":"iconClass","value":"bx bxl-docker","type":"label"}]},{"id":"_help_moVgBcoxE3EK","title":"On NixOS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_J1Bb6lVlwU5T","title":"Manually","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]},{"id":"_help_DCmT6e7clMoP","title":"Using Kubernetes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes"},{"name":"iconClass","value":"bx bxl-kubernetes","type":"label"}]},{"id":"_help_klCWNks3ReaQ","title":"Multiple server instances","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances"},{"name":"iconClass","value":"bx bxs-user-account","type":"label"}]}]},{"id":"_help_vcjrb3VVYPZI","title":"2. Reverse proxy","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_ud6MShXL4WpO","title":"Nginx","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_fDLvzOx29Pfg","title":"Apache","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_l2VkvOwUNfZj","title":"TLS Configuration","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_0hzsNCP31IAB","title":"Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Authentication"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_7DAiwaf8Z7Rz","title":"Multi-Factor Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication"},{"name":"iconClass","value":"bx bx-stopwatch","type":"label"}]}]},{"id":"_help_cbkrhQjrkKrh","title":"Synchronization","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Synchronization"},{"name":"iconClass","value":"bx bx-sync","type":"label"}]},{"id":"_help_RDslemsQ6gCp","title":"Mobile Frontend","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Mobile Frontend"},{"name":"iconClass","value":"bx bx-mobile-alt","type":"label"}]},{"id":"_help_MtPxeAWVAzMg","title":"Web Clipper","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Web Clipper"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_n1lujUxCwipy","title":"Upgrading TriliumNext","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_ODY7qQn5m2FT","title":"Backup","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Backup"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_tAassRL4RSQL","title":"Data directory","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Data directory"},{"name":"iconClass","value":"bx bx-folder-open","type":"label"}]}]},{"id":"_help_gh7bpGYxajRS","title":"Basic Concepts and Features","type":"book","attributes":[{"name":"iconClass","value":"bx bx-help-circle","type":"label"}],"children":[{"id":"_help_Vc8PjrjAGuOp","title":"UI Elements","type":"book","attributes":[{"name":"iconClass","value":"bx bx-window-alt","type":"label"}],"children":[{"id":"_help_x0JgW8UqGXvq","title":"Vertical and horizontal layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout"},{"name":"iconClass","value":"bx bxs-layout","type":"label"}]},{"id":"_help_x3i7MxGccDuM","title":"Global menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_oPVyFC7WL2Lp","title":"Note Tree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree"},{"name":"iconClass","value":"bx bxs-tree-alt","type":"label"}],"children":[{"id":"_help_YtSN43OrfzaA","title":"Note tree contextual menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_yTjUdsOi4CIE","title":"Multiple selection","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_DvdZhoQZY9Yd","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]}]},{"id":"_help_BlN9DFI679QC","title":"Ribbon","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon"},{"name":"iconClass","value":"bx bx-dots-horizontal","type":"label"}]},{"id":"_help_3seOhtN8uLIY","title":"Tabs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs"},{"name":"iconClass","value":"bx bx-dock-top","type":"label"}]},{"id":"_help_xYmIYSP6wE3F","title":"Launch Bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar"},{"name":"iconClass","value":"bx bx-sidebar","type":"label"}]},{"id":"_help_8YBEPzcpUgxw","title":"Note buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons"},{"name":"iconClass","value":"bx bx-dots-vertical-rounded","type":"label"}]},{"id":"_help_4TIF1oA4VQRO","title":"Options","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]},{"id":"_help_luNhaphA37EO","title":"Split View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View"},{"name":"iconClass","value":"bx bx-dock-right","type":"label"}]},{"id":"_help_XpOYSgsLkTJy","title":"Floating buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons"},{"name":"iconClass","value":"bx bx-rectangle","type":"label"}]},{"id":"_help_RnaPdbciOfeq","title":"Right Sidebar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar"},{"name":"iconClass","value":"bx bxs-dock-right","type":"label"}]},{"id":"_help_r5JGHN99bVKn","title":"Recent Changes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_ny318J39E5Z0","title":"Zoom","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom"},{"name":"iconClass","value":"bx bx-zoom-in","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_lgKX7r3aL30x","title":"Note Tooltip","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip"},{"name":"iconClass","value":"bx bx-message-detail","type":"label"}]}]},{"id":"_help_BFs8mudNFgCS","title":"Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes"},{"name":"iconClass","value":"bx bx-notepad","type":"label"}],"children":[{"id":"_help_p9kXRFAkwN4o","title":"Note Icons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_0vhv7lsOLy82","title":"Attachments","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_IakOLONlIfGI","title":"Cloning Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes"},{"name":"iconClass","value":"bx bx-duplicate","type":"label"}],"children":[{"id":"_help_TBwsyfadTA18","title":"Branch prefix","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix"},{"name":"iconClass","value":"bx bx-rename","type":"label"}]}]},{"id":"_help_bwg0e8ewQMak","title":"Protected Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_MKmLg5x6xkor","title":"Archived Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes"},{"name":"iconClass","value":"bx bx-box","type":"label"}]},{"id":"_help_vZWERwf8U3nx","title":"Note Revisions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_aGlEvb9hyDhS","title":"Sorting Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes"},{"name":"iconClass","value":"bx bx-sort-up","type":"label"}]},{"id":"_help_NRnIZmSMc5sj","title":"Export as PDF","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF"},{"name":"iconClass","value":"bx bxs-file-pdf","type":"label"}]},{"id":"_help_CoFPLs3dRlXc","title":"Read-Only Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_0ESUbbAxVnoK","title":"Note List","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note List"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]}]},{"id":"_help_wArbEsdSae6g","title":"Navigation","type":"book","attributes":[{"name":"iconClass","value":"bx bx-navigation","type":"label"}],"children":[{"id":"_help_kBrnXNG3Hplm","title":"Tree Concepts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}]},{"id":"_help_MMiBEQljMQh2","title":"Note Navigation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation"},{"name":"iconClass","value":"bx bxs-navigation","type":"label"}]},{"id":"_help_Ms1nauBra7gq","title":"Quick search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_F1r9QtzQLZqm","title":"Jump to...","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to"},{"name":"iconClass","value":"bx bx-send","type":"label"}]},{"id":"_help_eIg8jdvaoNNd","title":"Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_u3YFHC9tQlpm","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmarks","type":"label"}]},{"id":"_help_OR8WJ7Iz9K4U","title":"Note Hoisting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting"},{"name":"iconClass","value":"bx bxs-chevrons-up","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick edit.clone"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_9sRHySam5fXb","title":"Workspaces","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces"},{"name":"iconClass","value":"bx bx-door-open","type":"label"}]},{"id":"_help_xWtq5NUHOwql","title":"Similar Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes"},{"name":"iconClass","value":"bx bx-bar-chart","type":"label"}]},{"id":"_help_McngOG2jbUWX","title":"Search in note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]}]},{"id":"_help_A9Oc6YKKc65v","title":"Keyboard Shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_Wy267RK4M69c","title":"Themes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes"},{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_VbjZvtUek0Ln","title":"Theme Gallery","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]}]},{"id":"_help_mHbBMPDPkVV5","title":"Import & Export","type":"book","attributes":[{"name":"iconClass","value":"bx bx-import","type":"label"}],"children":[{"id":"_help_Oau6X9rCuegd","title":"Markdown","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}],"children":[{"id":"_help_rJ9grSgoExl9","title":"Supported syntax","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown/Supported syntax"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]}]},{"id":"_help_syuSEKf2rUGr","title":"Evernote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_GnhlmrATVqcH","title":"OneNote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_rC3pL2aptaRE","title":"Zen mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Zen mode"},{"name":"iconClass","value":"bx bxs-yin-yang","type":"label"}]}]},{"id":"_help_s3YCWHBfmYuM","title":"Quick Start","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Quick Start"},{"name":"iconClass","value":"bx bx-run","type":"label"}]},{"id":"_help_i6dbnitykE5D","title":"FAQ","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/FAQ"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_KSZ04uQ2D1St","title":"Note Types","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types"},{"name":"iconClass","value":"bx bx-edit","type":"label"}],"children":[{"id":"_help_iPIMuisry3hd","title":"Text","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text"},{"name":"iconClass","value":"bx bx-note","type":"label"}],"children":[{"id":"_help_NwBbFdNZ9h7O","title":"Block quotes & admonitions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Block quotes & admonitions"},{"name":"iconClass","value":"bx bx-info-circle","type":"label"}]},{"id":"_help_oSuaNgyyKnhu","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmark","type":"label"}]},{"id":"_help_veGu4faJErEM","title":"Content language & Right-to-left support","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Content language & Right-to-le"},{"name":"iconClass","value":"bx bx-align-right","type":"label"}]},{"id":"_help_2x0ZAX9ePtzV","title":"Cut to subnote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Cut to subnote"},{"name":"iconClass","value":"bx bx-cut","type":"label"}]},{"id":"_help_UYuUB1ZekNQU","title":"Developer-specific formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_QxEyIjRBizuC","title":"Code blocks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks"},{"name":"iconClass","value":"bx bx-code","type":"label"}]}]},{"id":"_help_AgjCISero73a","title":"Footnotes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Footnotes"},{"name":"iconClass","value":"bx bx-bracket","type":"label"}]},{"id":"_help_nRhnJkTT8cPs","title":"Formatting toolbar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Formatting toolbar"},{"name":"iconClass","value":"bx bx-text","type":"label"}]},{"id":"_help_Gr6xFaF6ioJ5","title":"General formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/General formatting"},{"name":"iconClass","value":"bx bx-bold","type":"label"}]},{"id":"_help_AxshuNRegLAv","title":"Highlights list","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Highlights list"},{"name":"iconClass","value":"bx bx-highlight","type":"label"}]},{"id":"_help_mT0HEkOsz6i1","title":"Images","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images"},{"name":"iconClass","value":"bx bx-image-alt","type":"label"}],"children":[{"id":"_help_0Ofbk1aSuVRu","title":"Image references","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images/Image references"},{"name":"iconClass","value":"bx bxs-file-image","type":"label"}]}]},{"id":"_help_nBAXQFj20hS1","title":"Include Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Include Note"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_CohkqWQC1iBv","title":"Insert buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Insert buttons"},{"name":"iconClass","value":"bx bx-plus","type":"label"}]},{"id":"_help_oiVPnW8QfnvS","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_QEAPj01N5f7w","title":"Links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links"},{"name":"iconClass","value":"bx bx-link-alt","type":"label"}],"children":[{"id":"_help_3IDVtesTQ8ds","title":"External links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/External links"},{"name":"iconClass","value":"bx bx-link-external","type":"label"}]},{"id":"_help_hrZ1D00cLbal","title":"Internal (reference) links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/Internal (reference) links"},{"name":"iconClass","value":"bx bx-link","type":"label"}]}]},{"id":"_help_S6Xx8QIWTV66","title":"Lists","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Lists"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_QrtTYPmdd1qq","title":"Markdown-like formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Markdown-like formatting"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}]},{"id":"_help_YfYAtQBcfo5V","title":"Math Equations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Math Equations"},{"name":"iconClass","value":"bx bx-math","type":"label"}]},{"id":"_help_dEHYtoWWi8ct","title":"Other features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Other features"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_gLt3vA97tMcp","title":"Premium features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features"},{"name":"iconClass","value":"bx bx-star","type":"label"}],"children":[{"id":"_help_ZlN4nump6EbW","title":"Slash Commands","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Slash Commands"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_pwc194wlRzcH","title":"Text Snippets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Text Snippets"},{"name":"iconClass","value":"bx bx-align-left","type":"label"}]}]},{"id":"_help_BFvAtE74rbP6","title":"Table of contents","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Table of contents"},{"name":"iconClass","value":"bx bx-heading","type":"label"}]},{"id":"_help_NdowYOC1GFKS","title":"Tables","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Tables"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_6f9hih2hXXZk","title":"Code","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Code"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_m523cpzocqaD","title":"Saved Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Saved Search"},{"name":"iconClass","value":"bx bx-file-find","type":"label"}]},{"id":"_help_iRwzGnHPzonm","title":"Relation Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Relation Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_bdUJEHsAPYQR","title":"Note Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Note Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_HcABDtFCkbFN","title":"Render Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Render Note"},{"name":"iconClass","value":"bx bx-extension","type":"label"}]},{"id":"_help_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Calendar View"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Geo Map View"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Grid View"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_mULW0Q3VojwY","title":"List View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Table View"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Board View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Board View"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]}]},{"id":"_help_s1aBHPd79XYj","title":"Mermaid Diagrams","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams"},{"name":"iconClass","value":"bx bx-selection","type":"label"}],"children":[{"id":"_help_RH6yLjjWJHof","title":"ELK layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]}]},{"id":"_help_grjYqerjn243","title":"Canvas","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Canvas"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_1vHRoWCEjj0L","title":"Web View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Web View"},{"name":"iconClass","value":"bx bx-globe-alt","type":"label"}]},{"id":"_help_gBbsAeiuUxI5","title":"Mind Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mind Map"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_W8vYD3Q1zjCR","title":"File","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_BgmBlOIl72jZ","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting"},{"name":"iconClass","value":"bx bx-bug","type":"label"}],"children":[{"id":"_help_wy8So3yZZlH9","title":"Reporting issues","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Reporting issues"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_x59R8J8KV5Bp","title":"Anonymized Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Anonymized Database"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_qzNzp9LYQyPT","title":"Error logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs"},{"name":"iconClass","value":"bx bx-comment-error","type":"label"}],"children":[{"id":"_help_bnyigUA2UK7s","title":"Backend (server) logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Backend (server) logs"},{"name":"iconClass","value":"bx bx-server","type":"label"}]},{"id":"_help_9yEHzMyFirZR","title":"Frontend logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Frontend logs"},{"name":"iconClass","value":"bx bx-window-alt","type":"label"}]}]},{"id":"_help_vdlYGAcpXAgc","title":"Synchronization fails with 504 Gateway Timeout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Synchronization fails with 504"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_s8alTXmpFR61","title":"Refreshing the application","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Refreshing the application"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_pKK96zzmvBGf","title":"Theme development","type":"book","attributes":[{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_7NfNr5pZpVKV","title":"Creating a custom theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating a custom theme"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WFGzWeUK6arS","title":"Customize the Next theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Customize the Next theme"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WN5z4M8ASACJ","title":"Reference","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Reference"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_AlhDUqhENtH7","title":"Custom app-wide CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Custom app-wide CSS"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_tC7s2alapj8V","title":"Advanced Usage","type":"book","attributes":[{"name":"iconClass","value":"bx bx-rocket","type":"label"}],"children":[{"id":"_help_zEY4DaJG4YT5","title":"Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes"},{"name":"iconClass","value":"bx bx-list-check","type":"label"}],"children":[{"id":"_help_HI6GBBIduIgv","title":"Labels","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Labels"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_Cq5X6iKQop6R","title":"Relations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Relations"},{"name":"iconClass","value":"bx bx-transfer","type":"label"}]},{"id":"_help_bwZpz2ajCEwO","title":"Attribute Inheritance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_OFXdgB2nNk1F","title":"Promoted Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_KC1HB96bqqHX","title":"Templates","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Templates"},{"name":"iconClass","value":"bx bx-copy","type":"label"}]},{"id":"_help_BCkXAVs63Ttv","title":"Note Map (Link map, Tree map)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map)"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_R9pX4DGra2Vt","title":"Sharing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing"},{"name":"iconClass","value":"bx bx-share-alt","type":"label"}],"children":[{"id":"_help_Qjt68inQ2bRj","title":"Serving directly the content of a note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_5668rwcirq1t","title":"Advanced Showcases","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_l0tKav7yLHGF","title":"Day Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_R7abl2fc6Mxi","title":"Weight Tracker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_xYjQUYhpbUEW","title":"Task Manager","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager"},{"name":"iconClass","value":"bx bx-calendar-check","type":"label"}]}]},{"id":"_help_J5Ex1ZrMbyJ6","title":"Custom Request Handler","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Request Handler"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_d3fAXQ2diepH","title":"Custom Resource Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Resource Providers"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_pgxEVkzLl1OP","title":"ETAPI (REST API)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/ETAPI (REST API)"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/etapi/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_47ZrP6FNuoG8","title":"Default Note Title","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Default Note Title"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_wX4HbRucYSDD","title":"Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database"},{"name":"iconClass","value":"bx bx-data","type":"label"}],"children":[{"id":"_help_oyIAJ9PvvwHX","title":"Manually altering the database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_YKWqdJhzi2VY","title":"SQL Console","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console"},{"name":"iconClass","value":"bx bx-data","type":"label"}]}]},{"id":"_help_6tZeKvSHEUiB","title":"Demo Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Demo Notes"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_Gzjqa934BdH4","title":"Configuration (config.ini or environment variables)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_c5xB8m4g2IY6","title":"Trilium instance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_LWtBjFej3wX3","title":"Cross-Origin Resource Sharing (CORS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing "},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_ivYnonVFBxbQ","title":"Bulk Actions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Bulk Actions"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_4FahAwuGTAwC","title":"Note source","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note source"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_1YeN2MzFUluU","title":"Technologies used","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_MI26XDLSAlCD","title":"CKEditor","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_N4IDkixaDG9C","title":"MindElixir","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_H0mM1lTxF9JI","title":"Excalidraw","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_MQHyy2dIFgxS","title":"Leaflet","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_m1lbrzyKDaRB","title":"Note ID","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note ID"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_0vTSyvhPTAOz","title":"Internal API","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/api/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_2mUhVmZK8RF3","title":"Hidden Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Hidden Notes"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]},{"id":"_help_uYF7pmepw27K","title":"Metrics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Metrics"},{"name":"iconClass","value":"bx bxs-data","type":"label"}],"children":[{"id":"_help_bOP3TB56fL1V","title":"grafana-dashboard.json","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]},{"id":"_help_LMAv4Uy3Wk6J","title":"AI","type":"book","attributes":[{"name":"iconClass","value":"bx bx-bot","type":"label"}],"children":[{"id":"_help_GBBMSlVSOIGP","title":"Introduction","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Introduction"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WkM7gsEUyCXs","title":"AI Provider Information","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_7EdTxPADv95W","title":"Ollama","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_vvUCN7FDkq7G","title":"Installing Ollama","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_ZavFigBX9AwP","title":"OpenAI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/OpenAI"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_e0lkirXEiSNc","title":"Anthropic","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/Anthropic"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]},{"id":"_help_CdNpE2pqjmI6","title":"Scripting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting"},{"name":"iconClass","value":"bx bxs-file-js","type":"label"}],"children":[{"id":"_help_yIhgI5H7A2Sm","title":"Frontend Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_TjLYAo3JMO8X","title":"\"New Task\" launcher button","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/New Task launcher button"},{"name":"iconClass","value":"bx bx-task","type":"label"}]},{"id":"_help_7kZPMD0uFwkH","title":"Downloading responses from Google Forms","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/Downloading responses from Goo"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_DL92EjAaXT26","title":"Using promoted attributes to configure scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/Using promoted attributes to c"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GPERMystNGTB","title":"Events","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Events"},{"name":"iconClass","value":"bx bx-rss","type":"label"}]},{"id":"_help_MgibgPcfeuGz","title":"Custom Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_YNxAqkI5Kg1M","title":"Word count widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets/Word count widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_SynTBQiBsdYJ","title":"Widget Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets/Widget Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GLks18SNjxmC","title":"Script API","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_vElnKeDNPSVl","title":"Logging","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Logging"},{"name":"iconClass","value":"bx bx-terminal","type":"label"}]}]}] \ No newline at end of file +[{"id":"_help_BOCnjTMBCoxW","title":"Feature Highlights","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Feature Highlights"},{"name":"iconClass","value":"bx bx-star","type":"label"}]},{"id":"_help_Otzi9La2YAUX","title":"Installation & Setup","type":"book","attributes":[{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_poXkQfguuA0U","title":"Desktop Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_nRqcgfTb97uV","title":"Using the desktop application as a server","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application "},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_WOcw2SLH6tbX","title":"Server Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_Dgg7bR3b6K9j","title":"1. Installing the server","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_3tW6mORuTHnB","title":"Packaged version for Linux","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_rWX5eY045zbE","title":"Using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker"},{"name":"iconClass","value":"bx bxl-docker","type":"label"}]},{"id":"_help_moVgBcoxE3EK","title":"On NixOS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_J1Bb6lVlwU5T","title":"Manually","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]},{"id":"_help_DCmT6e7clMoP","title":"Using Kubernetes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes"},{"name":"iconClass","value":"bx bxl-kubernetes","type":"label"}]},{"id":"_help_klCWNks3ReaQ","title":"Multiple server instances","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances"},{"name":"iconClass","value":"bx bxs-user-account","type":"label"}]}]},{"id":"_help_vcjrb3VVYPZI","title":"2. Reverse proxy","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_ud6MShXL4WpO","title":"Nginx","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_fDLvzOx29Pfg","title":"Apache using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_LLzSMXACKhUs","title":"Trusted proxy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_l2VkvOwUNfZj","title":"HTTPS (TLS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS)"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_0hzsNCP31IAB","title":"Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Authentication"},{"name":"iconClass","value":"bx bx-user","type":"label"}]},{"id":"_help_7DAiwaf8Z7Rz","title":"Multi-Factor Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication"},{"name":"iconClass","value":"bx bx-stopwatch","type":"label"}]}]},{"id":"_help_cbkrhQjrkKrh","title":"Synchronization","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Synchronization"},{"name":"iconClass","value":"bx bx-sync","type":"label"}]},{"id":"_help_RDslemsQ6gCp","title":"Mobile Frontend","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Mobile Frontend"},{"name":"iconClass","value":"bx bx-mobile-alt","type":"label"}]},{"id":"_help_MtPxeAWVAzMg","title":"Web Clipper","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Web Clipper"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_n1lujUxCwipy","title":"Upgrading TriliumNext","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_ODY7qQn5m2FT","title":"Backup","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Backup"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_tAassRL4RSQL","title":"Data directory","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Data directory"},{"name":"iconClass","value":"bx bx-folder-open","type":"label"}]}]},{"id":"_help_gh7bpGYxajRS","title":"Basic Concepts and Features","type":"book","attributes":[{"name":"iconClass","value":"bx bx-help-circle","type":"label"}],"children":[{"id":"_help_Vc8PjrjAGuOp","title":"UI Elements","type":"book","attributes":[{"name":"iconClass","value":"bx bx-window-alt","type":"label"}],"children":[{"id":"_help_x0JgW8UqGXvq","title":"Vertical and horizontal layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout"},{"name":"iconClass","value":"bx bxs-layout","type":"label"}]},{"id":"_help_x3i7MxGccDuM","title":"Global menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_oPVyFC7WL2Lp","title":"Note Tree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree"},{"name":"iconClass","value":"bx bxs-tree-alt","type":"label"}],"children":[{"id":"_help_YtSN43OrfzaA","title":"Note tree contextual menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_yTjUdsOi4CIE","title":"Multiple selection","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_DvdZhoQZY9Yd","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]}]},{"id":"_help_BlN9DFI679QC","title":"Ribbon","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon"},{"name":"iconClass","value":"bx bx-dots-horizontal","type":"label"}]},{"id":"_help_3seOhtN8uLIY","title":"Tabs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs"},{"name":"iconClass","value":"bx bx-dock-top","type":"label"}]},{"id":"_help_xYmIYSP6wE3F","title":"Launch Bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar"},{"name":"iconClass","value":"bx bx-sidebar","type":"label"}]},{"id":"_help_8YBEPzcpUgxw","title":"Note buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons"},{"name":"iconClass","value":"bx bx-dots-vertical-rounded","type":"label"}]},{"id":"_help_4TIF1oA4VQRO","title":"Options","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]},{"id":"_help_luNhaphA37EO","title":"Split View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View"},{"name":"iconClass","value":"bx bx-dock-right","type":"label"}]},{"id":"_help_XpOYSgsLkTJy","title":"Floating buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons"},{"name":"iconClass","value":"bx bx-rectangle","type":"label"}]},{"id":"_help_RnaPdbciOfeq","title":"Right Sidebar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar"},{"name":"iconClass","value":"bx bxs-dock-right","type":"label"}]},{"id":"_help_r5JGHN99bVKn","title":"Recent Changes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_ny318J39E5Z0","title":"Zoom","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom"},{"name":"iconClass","value":"bx bx-zoom-in","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_lgKX7r3aL30x","title":"Note Tooltip","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip"},{"name":"iconClass","value":"bx bx-message-detail","type":"label"}]}]},{"id":"_help_BFs8mudNFgCS","title":"Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes"},{"name":"iconClass","value":"bx bx-notepad","type":"label"}],"children":[{"id":"_help_p9kXRFAkwN4o","title":"Note Icons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_0vhv7lsOLy82","title":"Attachments","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_IakOLONlIfGI","title":"Cloning Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes"},{"name":"iconClass","value":"bx bx-duplicate","type":"label"}],"children":[{"id":"_help_TBwsyfadTA18","title":"Branch prefix","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix"},{"name":"iconClass","value":"bx bx-rename","type":"label"}]}]},{"id":"_help_bwg0e8ewQMak","title":"Protected Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_MKmLg5x6xkor","title":"Archived Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes"},{"name":"iconClass","value":"bx bx-box","type":"label"}]},{"id":"_help_vZWERwf8U3nx","title":"Note Revisions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_aGlEvb9hyDhS","title":"Sorting Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes"},{"name":"iconClass","value":"bx bx-sort-up","type":"label"}]},{"id":"_help_NRnIZmSMc5sj","title":"Printing & Exporting as PDF","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF"},{"name":"iconClass","value":"bx bx-printer","type":"label"}]},{"id":"_help_CoFPLs3dRlXc","title":"Read-Only Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_0ESUbbAxVnoK","title":"Note List","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note List"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]}]},{"id":"_help_wArbEsdSae6g","title":"Navigation","type":"book","attributes":[{"name":"iconClass","value":"bx bx-navigation","type":"label"}],"children":[{"id":"_help_kBrnXNG3Hplm","title":"Tree Concepts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}]},{"id":"_help_MMiBEQljMQh2","title":"Note Navigation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation"},{"name":"iconClass","value":"bx bxs-navigation","type":"label"}]},{"id":"_help_Ms1nauBra7gq","title":"Quick search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_F1r9QtzQLZqm","title":"Jump to...","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to"},{"name":"iconClass","value":"bx bx-send","type":"label"}]},{"id":"_help_eIg8jdvaoNNd","title":"Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_u3YFHC9tQlpm","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmarks","type":"label"}]},{"id":"_help_OR8WJ7Iz9K4U","title":"Note Hoisting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting"},{"name":"iconClass","value":"bx bxs-chevrons-up","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick edit.clone"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_9sRHySam5fXb","title":"Workspaces","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces"},{"name":"iconClass","value":"bx bx-door-open","type":"label"}]},{"id":"_help_xWtq5NUHOwql","title":"Similar Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes"},{"name":"iconClass","value":"bx bx-bar-chart","type":"label"}]},{"id":"_help_McngOG2jbUWX","title":"Search in note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]}]},{"id":"_help_A9Oc6YKKc65v","title":"Keyboard Shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_Wy267RK4M69c","title":"Themes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes"},{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_VbjZvtUek0Ln","title":"Theme Gallery","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]}]},{"id":"_help_mHbBMPDPkVV5","title":"Import & Export","type":"book","attributes":[{"name":"iconClass","value":"bx bx-import","type":"label"}],"children":[{"id":"_help_Oau6X9rCuegd","title":"Markdown","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}],"children":[{"id":"_help_rJ9grSgoExl9","title":"Supported syntax","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown/Supported syntax"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]}]},{"id":"_help_syuSEKf2rUGr","title":"Evernote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_GnhlmrATVqcH","title":"OneNote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_rC3pL2aptaRE","title":"Zen mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Zen mode"},{"name":"iconClass","value":"bx bxs-yin-yang","type":"label"}]}]},{"id":"_help_s3YCWHBfmYuM","title":"Quick Start","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Quick Start"},{"name":"iconClass","value":"bx bx-run","type":"label"}]},{"id":"_help_i6dbnitykE5D","title":"FAQ","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/FAQ"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_KSZ04uQ2D1St","title":"Note Types","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types"},{"name":"iconClass","value":"bx bx-edit","type":"label"}],"children":[{"id":"_help_iPIMuisry3hd","title":"Text","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text"},{"name":"iconClass","value":"bx bx-note","type":"label"}],"children":[{"id":"_help_NwBbFdNZ9h7O","title":"Block quotes & admonitions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Block quotes & admonitions"},{"name":"iconClass","value":"bx bx-info-circle","type":"label"}]},{"id":"_help_oSuaNgyyKnhu","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmark","type":"label"}]},{"id":"_help_veGu4faJErEM","title":"Content language & Right-to-left support","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Content language & Right-to-le"},{"name":"iconClass","value":"bx bx-align-right","type":"label"}]},{"id":"_help_2x0ZAX9ePtzV","title":"Cut to subnote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Cut to subnote"},{"name":"iconClass","value":"bx bx-cut","type":"label"}]},{"id":"_help_UYuUB1ZekNQU","title":"Developer-specific formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_QxEyIjRBizuC","title":"Code blocks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks"},{"name":"iconClass","value":"bx bx-code","type":"label"}]}]},{"id":"_help_AgjCISero73a","title":"Footnotes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Footnotes"},{"name":"iconClass","value":"bx bx-bracket","type":"label"}]},{"id":"_help_nRhnJkTT8cPs","title":"Formatting toolbar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Formatting toolbar"},{"name":"iconClass","value":"bx bx-text","type":"label"}]},{"id":"_help_Gr6xFaF6ioJ5","title":"General formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/General formatting"},{"name":"iconClass","value":"bx bx-bold","type":"label"}]},{"id":"_help_AxshuNRegLAv","title":"Highlights list","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Highlights list"},{"name":"iconClass","value":"bx bx-highlight","type":"label"}]},{"id":"_help_mT0HEkOsz6i1","title":"Images","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images"},{"name":"iconClass","value":"bx bx-image-alt","type":"label"}],"children":[{"id":"_help_0Ofbk1aSuVRu","title":"Image references","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images/Image references"},{"name":"iconClass","value":"bx bxs-file-image","type":"label"}]}]},{"id":"_help_nBAXQFj20hS1","title":"Include Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Include Note"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_CohkqWQC1iBv","title":"Insert buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Insert buttons"},{"name":"iconClass","value":"bx bx-plus","type":"label"}]},{"id":"_help_oiVPnW8QfnvS","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_QEAPj01N5f7w","title":"Links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links"},{"name":"iconClass","value":"bx bx-link-alt","type":"label"}],"children":[{"id":"_help_3IDVtesTQ8ds","title":"External links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/External links"},{"name":"iconClass","value":"bx bx-link-external","type":"label"}]},{"id":"_help_hrZ1D00cLbal","title":"Internal (reference) links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/Internal (reference) links"},{"name":"iconClass","value":"bx bx-link","type":"label"}]}]},{"id":"_help_S6Xx8QIWTV66","title":"Lists","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Lists"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_QrtTYPmdd1qq","title":"Markdown-like formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Markdown-like formatting"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}]},{"id":"_help_YfYAtQBcfo5V","title":"Math Equations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Math Equations"},{"name":"iconClass","value":"bx bx-math","type":"label"}]},{"id":"_help_dEHYtoWWi8ct","title":"Other features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Other features"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_gLt3vA97tMcp","title":"Premium features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features"},{"name":"iconClass","value":"bx bx-star","type":"label"}],"children":[{"id":"_help_ZlN4nump6EbW","title":"Slash Commands","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Slash Commands"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_pwc194wlRzcH","title":"Text Snippets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Text Snippets"},{"name":"iconClass","value":"bx bx-align-left","type":"label"}]}]},{"id":"_help_BFvAtE74rbP6","title":"Table of contents","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Table of contents"},{"name":"iconClass","value":"bx bx-heading","type":"label"}]},{"id":"_help_NdowYOC1GFKS","title":"Tables","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Tables"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_6f9hih2hXXZk","title":"Code","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Code"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_m523cpzocqaD","title":"Saved Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Saved Search"},{"name":"iconClass","value":"bx bx-file-find","type":"label"}]},{"id":"_help_iRwzGnHPzonm","title":"Relation Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Relation Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_bdUJEHsAPYQR","title":"Note Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Note Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_HcABDtFCkbFN","title":"Render Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Render Note"},{"name":"iconClass","value":"bx bx-extension","type":"label"}]},{"id":"_help_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Calendar View"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Geo Map View"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Grid View"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_mULW0Q3VojwY","title":"List View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Table View"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Board View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Board View"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]},{"id":"_help_zP3PMqaG71Ct","title":"Presentation View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Presentation View"},{"name":"iconClass","value":"bx bx-slideshow","type":"label"}]}]},{"id":"_help_s1aBHPd79XYj","title":"Mermaid Diagrams","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams"},{"name":"iconClass","value":"bx bx-selection","type":"label"}],"children":[{"id":"_help_RH6yLjjWJHof","title":"ELK layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]}]},{"id":"_help_grjYqerjn243","title":"Canvas","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Canvas"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_1vHRoWCEjj0L","title":"Web View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Web View"},{"name":"iconClass","value":"bx bx-globe-alt","type":"label"}]},{"id":"_help_gBbsAeiuUxI5","title":"Mind Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mind Map"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_W8vYD3Q1zjCR","title":"File","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_BgmBlOIl72jZ","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting"},{"name":"iconClass","value":"bx bx-bug","type":"label"}],"children":[{"id":"_help_wy8So3yZZlH9","title":"Reporting issues","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Reporting issues"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_x59R8J8KV5Bp","title":"Anonymized Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Anonymized Database"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_qzNzp9LYQyPT","title":"Error logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs"},{"name":"iconClass","value":"bx bx-comment-error","type":"label"}],"children":[{"id":"_help_bnyigUA2UK7s","title":"Backend (server) logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Backend (server) logs"},{"name":"iconClass","value":"bx bx-server","type":"label"}]},{"id":"_help_9yEHzMyFirZR","title":"Frontend logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Frontend logs"},{"name":"iconClass","value":"bx bx-window-alt","type":"label"}]}]},{"id":"_help_vdlYGAcpXAgc","title":"Synchronization fails with 504 Gateway Timeout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Synchronization fails with 504"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_s8alTXmpFR61","title":"Refreshing the application","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Refreshing the application"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_pKK96zzmvBGf","title":"Theme development","type":"book","attributes":[{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_7NfNr5pZpVKV","title":"Creating a custom theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating a custom theme"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WFGzWeUK6arS","title":"Customize the Next theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Customize the Next theme"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WN5z4M8ASACJ","title":"Reference","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Reference"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_AlhDUqhENtH7","title":"Custom app-wide CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Custom app-wide CSS"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_tC7s2alapj8V","title":"Advanced Usage","type":"book","attributes":[{"name":"iconClass","value":"bx bx-rocket","type":"label"}],"children":[{"id":"_help_zEY4DaJG4YT5","title":"Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes"},{"name":"iconClass","value":"bx bx-list-check","type":"label"}],"children":[{"id":"_help_HI6GBBIduIgv","title":"Labels","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Labels"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_Cq5X6iKQop6R","title":"Relations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Relations"},{"name":"iconClass","value":"bx bx-transfer","type":"label"}]},{"id":"_help_bwZpz2ajCEwO","title":"Attribute Inheritance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_OFXdgB2nNk1F","title":"Promoted Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_KC1HB96bqqHX","title":"Templates","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Templates"},{"name":"iconClass","value":"bx bx-copy","type":"label"}]},{"id":"_help_BCkXAVs63Ttv","title":"Note Map (Link map, Tree map)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map)"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_R9pX4DGra2Vt","title":"Sharing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing"},{"name":"iconClass","value":"bx bx-share-alt","type":"label"}],"children":[{"id":"_help_Qjt68inQ2bRj","title":"Serving directly the content of a note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_5668rwcirq1t","title":"Advanced Showcases","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_l0tKav7yLHGF","title":"Day Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_R7abl2fc6Mxi","title":"Weight Tracker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_xYjQUYhpbUEW","title":"Task Manager","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager"},{"name":"iconClass","value":"bx bx-calendar-check","type":"label"}]}]},{"id":"_help_J5Ex1ZrMbyJ6","title":"Custom Request Handler","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Request Handler"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_d3fAXQ2diepH","title":"Custom Resource Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Resource Providers"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_pgxEVkzLl1OP","title":"ETAPI (REST API)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/ETAPI (REST API)"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/etapi/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_47ZrP6FNuoG8","title":"Default Note Title","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Default Note Title"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_wX4HbRucYSDD","title":"Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database"},{"name":"iconClass","value":"bx bx-data","type":"label"}],"children":[{"id":"_help_oyIAJ9PvvwHX","title":"Manually altering the database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_YKWqdJhzi2VY","title":"SQL Console","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console"},{"name":"iconClass","value":"bx bx-data","type":"label"}]}]},{"id":"_help_6tZeKvSHEUiB","title":"Demo Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Demo Notes"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_Gzjqa934BdH4","title":"Configuration (config.ini or environment variables)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_c5xB8m4g2IY6","title":"Trilium instance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_LWtBjFej3wX3","title":"Cross-Origin Resource Sharing (CORS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing "},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_ivYnonVFBxbQ","title":"Bulk Actions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Bulk Actions"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_4FahAwuGTAwC","title":"Note source","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note source"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_1YeN2MzFUluU","title":"Technologies used","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_MI26XDLSAlCD","title":"CKEditor","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_N4IDkixaDG9C","title":"MindElixir","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_H0mM1lTxF9JI","title":"Excalidraw","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_MQHyy2dIFgxS","title":"Leaflet","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_m1lbrzyKDaRB","title":"Note ID","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note ID"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_0vTSyvhPTAOz","title":"Internal API","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/api/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_2mUhVmZK8RF3","title":"Hidden Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Hidden Notes"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]},{"id":"_help_uYF7pmepw27K","title":"Metrics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Metrics"},{"name":"iconClass","value":"bx bxs-data","type":"label"}],"children":[{"id":"_help_bOP3TB56fL1V","title":"grafana-dashboard.json","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]},{"id":"_help_LMAv4Uy3Wk6J","title":"AI","type":"book","attributes":[{"name":"iconClass","value":"bx bx-bot","type":"label"}],"children":[{"id":"_help_GBBMSlVSOIGP","title":"Introduction","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Introduction"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WkM7gsEUyCXs","title":"AI Provider Information","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_7EdTxPADv95W","title":"Ollama","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_vvUCN7FDkq7G","title":"Installing Ollama","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_ZavFigBX9AwP","title":"OpenAI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/OpenAI"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_e0lkirXEiSNc","title":"Anthropic","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/Anthropic"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]},{"id":"_help_CdNpE2pqjmI6","title":"Scripting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting"},{"name":"iconClass","value":"bx bxs-file-js","type":"label"}],"children":[{"id":"_help_yIhgI5H7A2Sm","title":"Frontend Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_TjLYAo3JMO8X","title":"\"New Task\" launcher button","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/New Task launcher button"},{"name":"iconClass","value":"bx bx-task","type":"label"}]},{"id":"_help_7kZPMD0uFwkH","title":"Downloading responses from Google Forms","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/Downloading responses from Goo"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_DL92EjAaXT26","title":"Using promoted attributes to configure scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/Using promoted attributes to c"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GPERMystNGTB","title":"Events","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Events"},{"name":"iconClass","value":"bx bx-rss","type":"label"}]},{"id":"_help_MgibgPcfeuGz","title":"Custom Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_YNxAqkI5Kg1M","title":"Word count widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets/Word count widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_SynTBQiBsdYJ","title":"Widget Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets/Widget Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GLks18SNjxmC","title":"Script API","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_vElnKeDNPSVl","title":"Logging","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Logging"},{"name":"iconClass","value":"bx bx-terminal","type":"label"}]}]}] \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html index d3d0f7e8d..0edc5714b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html @@ -302,7 +302,9 @@ color defines color of the note in note tree, links etc. Use any valid CSS color - value like 'red' or #a13d5f + value like 'red' or #a13d5f +
Note: this color may be automatically adjusted when displayed to ensure + sufficient contrast with the background. keyboardShortcut diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.html index 1b35888ab..46523a9ce 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.html @@ -337,7 +337,7 @@

Examples

Docker Compose Example

services:
   trilium:
-    image: triliumnext/notes
+    image: triliumnext/trilium
     environment:
       # Using full format
       TRILIUM_GENERAL_INSTANCENAME: "My Trilium Instance"
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html
index a9ae4e829..693bdb39b 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html	
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html	
@@ -46,4 +46,9 @@ curl "$SERVER/etapi/notes/$NOTE_ID/content" -H "Authorization: $TOKEN" SERVER with the correct protocol, host name and port to your
     Trilium instance.
   
  • NOTE_ID with an existing note ID to download.
  • - \ No newline at end of file + +

    As another example, to obtain a .zip export of a note and place it in + a directory called out, simply replace the last statement in + the script with:

    curl -H "Authorization: $TOKEN" \
    +	-X GET "$SERVER/etapi/notes/$NOTE_ID/export" \
    +    --output "out/$NOTE_ID.zip"
    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/1_Export as PDF_image.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/1_Printing & Exporting as PD.png similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/1_Export as PDF_image.png rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/1_Printing & Exporting as PD.png diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.html deleted file mode 100644 index 491c4ad6e..000000000 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.html +++ /dev/null @@ -1,42 +0,0 @@ -

    - -

    -

    Screenshot of the note contextual menu indicating the “Export as PDF” - option.

    -

    On the desktop application of Trilium it is possible to export a note - as PDF. On the server or PWA (mobile), the option is not available due - to technical constraints and it will be hidden.

    -

    To print a note, select the - button to the right of the note and select Export as PDF.

    -

    Afterwards you will be prompted to select where to save the PDF file.

    -

    Automatic opening of the file

    -

    When the PDF is exported, it is automatically opened with the system default - application for easy preview.

    -

    Note that if you are using Linux with the GNOME desktop environment, sometimes - the default application might seem incorrect (such as opening in GIMP). - This is because it uses Gnome's “Recommended applications” list.

    -

    To solve this, you can change the recommended application for PDFs via - this command line. First, list the available applications via gio mime application/pdf and - then set the desired one. For example to use GNOME's Evince:

    gio mime application/pdf
    -

    Reporting issues with the rendering

    -

    Should you encounter any visual issues in the resulting PDF file (e.g. - a table does not fit properly, there is cut off text, etc.) feel free to - report the issue. In this case, it's best to offer a sample note (click - on the - button, select Export note → This note and all of its descendants → HTML - in ZIP archive). Make sure not to accidentally leak any personal information.

    -

    Landscape mode

    -

    When exporting to PDF, there are no customizable settings such as page - orientation, size, etc. However, it is possible to specify a given note - to be printed as a PDF in landscape mode by adding the #printLandscape attribute - to it (see Attributes).

    -

    Page size

    -

    By default, the resulting PDF will be in Letter format. It is possible - to adjust it to another page size via the #printPageSize attribute, - with one of the following values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.

    -

    Keyboard shortcut

    -

    It's possible to trigger the export to PDF from the keyboard by going - to Keyboard shortcuts in Options and assigning a key combination - for the exportAsPdf action.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF_image.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PD.png similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF_image.png rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PD.png diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html new file mode 100644 index 000000000..3104cac57 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html @@ -0,0 +1,118 @@ +
    + +
    Screenshot of the note contextual menu indicating the “Export as PDF” + option.
    +
    +

    Printing

    +

    This feature allows printing of notes. It works on both the desktop client, + but also on the web.

    +

    Note that not all note types are printable as of now. We do plan to increase + the coverage of supported note types in the future.

    +

    To print a note, select the + button to the right of the note and select Print note. Depending + on the size and type of the note, this can take up to a few seconds. Afterwards + you will be redirected to the system/browser printing dialog.

    + +

    Reporting issues with the rendering

    +

    Should you encounter any visual issues in the resulting PDF file (e.g. + a table does not fit properly, there is cut off text, etc.) feel free to + report the issue. In this case, it's best to offer a sample note (click + on the + button, select Export note → This note and all of its descendants → HTML + in ZIP archive). Make sure not to accidentally leak any personal information.

    +

    Consider adjusting font sizes and using page breaks to + work around the layout.

    +

    Exporting as PDF

    +

    On the desktop application of Trilium it is possible to export a note + as PDF. On the server or PWA (mobile), the option is not available due + to technical constraints and it will be hidden.

    +

    To print a note, select the + button to the right of the note and select Export as PDF. Afterwards + you will be prompted to select where to save the PDF file.

    + +

    Automatic opening of the file

    +

    When the PDF is exported, it is automatically opened with the system default + application for easy preview.

    +

    Note that if you are using Linux with the GNOME desktop environment, sometimes + the default application might seem incorrect (such as opening in GIMP). + This is because it uses Gnome's “Recommended applications” list.

    +

    To solve this, you can change the recommended application for PDFs via + this command line. First, list the available applications via gio mime application/pdf and + then set the desired one. For example to use GNOME's Evince:

    gio mime application/pdf
    +

    Customizing exporting as PDF

    +

    When exporting to PDF, there are no customizable settings such as page + orientation, size. However, there are a few Attributes to adjust some of the + settings:

    +
      +
    • To print in landscape mode instead of portrait (useful for big diagrams + or slides), add #printLandscape.
    • +
    • By default, the resulting PDF will be in Letter format. It is possible + to adjust it to another page size via the #printPageSize attribute, + with one of the following values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
    • +
    + +

    Keyboard shortcut

    +

    It's possible to trigger both printing and export as PDF from the keyboard + by going to Keyboard shortcuts in Options and assigning a key combination + for:

    +
      +
    • Print Active Note +
    • +
    • Export Active Note as PDF +
    • +
    +

    Constraints & limitations

    +

    Not all Note Types are + supported when printing, in which case the Print and Export as PDF options + will be disabled.

    +
      +
    • For Code notes: +
        +
      • Line numbers are not printed.
      • +
      • Syntax highlighting is enabled, however a default theme (Visual Studio) + is enforced.
      • +
      +
    • +
    • For Collections: +
        +
      • Only Presentation View is + currently supported.
      • +
      • We plan to add support for all the collection types at some point.
      • +
      +
    • +
    • Using Custom app-wide CSS for + printing is not longer supported, due to a more stable but isolated mechanism. +
        +
      • We plan to introduce a new mechanism specifically for a print CSS.
      • +
      +
    • +
    +

    Under the hood

    +

    Both printing and exporting as PDF use the same mechanism: a note is rendered + individually in a separate webpage that is then sent to the browser or + the Electron application either for printing or exporting as PDF.

    +

    The webpage that renders a single note can actually be accessed in a web + browser. For example http://localhost:8080/#root/WWRGzqHUfRln/RRZsE9Al8AIZ?ntxId=0o4fzk becomes http://localhost:8080/?print#root/WWRGzqHUfRln/RRZsE9Al8AIZ.

    +

    Accessing the print note in a web browser allows for easy debugging to + understand why a particular note doesn't render well. The mechanism for + rendering is similar to the one used in Note List.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .html new file mode 100644 index 000000000..133c93d13 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .html @@ -0,0 +1,35 @@ +

    Sometimes, setting up a dedicated server installation is + not feasible. The desktop application ships with a fully functional server + instance by default.

    +

    You can access this web interface locally by navigating to http://localhost:37840/login.

    + +

    Mobile interface

    +

    By default, this will display the desktop user interface, even on mobile. + To switch to the mobile version, simply go to the Global menu and select “Switch + to the mobile version”.

    +

    Allowing the port externally on Windows with Windows Defender Firewall

    +

    First, find out the IP of your desktop server by running ipconfig in + your local terminal. Then try accessing http://<ip>:37840/login on + another device. If it doesn't work, then most likely the port is blocked + by your operating system's firewall.

    +

    If you use Windows Defender Firewall:

    +
      +
    1. Go to Windows's start menu and look for “Windows Defender Firewall with + Advanced Security”.
    2. +
    3. Go to “Inbound Rules” on the left tree, and select “New Rule” in the “Actions” + sidebar on the right.
    4. +
    5. Select “Port” and press “Next”.
    6. +
    7. Type in 37840 in the “Specific local ports” section and then + press “Next”.
    8. +
    9. Leave “Allow the connection” checked and press “Next”.
    10. +
    11. Configure the networks to apply to (check all if unsure) and then press + “Next”.
    12. +
    13. Add an appropriate name to the rule (e.g. “Trilium Notes”) and press “Finish”.
    14. +
    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html index 6446279a9..afecd5fb1 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html @@ -6,15 +6,11 @@ See below for more details on this.

    Note that this is not an Android/iOS app, this is just mobile friendly web page served on the server edition.

    -

    Screenshots

    -

    Mobile phone

    -

    - -

    -

    Tablet

    -

    - -

    +

    Testing via the desktop application

    +

    If you are running Trilium without a dedicated server installation, + you can still test the mobile application using the desktop application. + For more information, see Using the desktop application as a server. + To access it go to http://<ip>:37840/login?mobile .

    Limitations

    Mobile frontend provides only some of the features of the full desktop frontend:

    diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-sma.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-sma.png deleted file mode 100644 index cd839420d..000000000 Binary files a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-sma.png and /dev/null differ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-tab.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-tab.png deleted file mode 100644 index 6d890f90d..000000000 Binary files a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-tab.png and /dev/null differ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker.html new file mode 100644 index 000000000..a3a9db167 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker.html @@ -0,0 +1,76 @@ +

    This tutorial assumes that you have created a DNS A record for trilium.yourdomain.com that + you want to use for your Trilium server.

    +

    Docker setup

    +

    Download docker image and create container

     docker pull triliumnext/trilium:[VERSION]
    + docker create --name trilium -t -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/trilium:[VERSION]
    +

    Configuring the Apache proxy

    +
      +
    1. +

      Enable apache proxy modules

       a2enmod ssl
      + a2enmod proxy
      + a2enmod proxy_http
      + a2enmod proxy_wstunnel
      +
    2. +
    3. +

      Create a new let's encrypt certificate

       sudo certbot certonly -d trilium.mydomain.com
      +

      Choose standalone (2) and note the location of the created certificates + (typically /etc/letsencrypt/live/...)

      +
    4. +
    5. +

      Create a new virtual host file for apache (you may want to use apachectl -S to + determine the server root location, mine is /etc/apache2)

       sudo nano /etc/apache2/sites-available/trilium.yourdomain.com.conf
      +

      Paste (and customize) the following text into the configuration file

       
      +     ServerName http://trilium.yourdomain.com
      +     RewriteEngine on
      +         RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
      + 
      + 
      +     ServerName https://trilium.yourdomain.com
      +     RewriteEngine On
      +     RewriteCond %{HTTP:Connection} Upgrade [NC]
      +     RewriteCond %{HTTP:Upgrade} websocket [NC]
      +     RewriteRule /(.*) ws://localhost:8080/$1 [P,L]
      +     AllowEncodedSlashes NoDecode
      +     ProxyPass / http://localhost:8080/ nocanon
      +     ProxyPassReverse / http://localhost:8080/
      +     SSLCertificateFile /etc/letsencrypt/live/trilium.yourdomain.com/fullchain.pem
      +     SSLCertificateKeyFile /etc/letsencrypt/live/trilium.yourdomain.com/privkey.pem
      +     Include /etc/letsencrypt/options-ssl-apache.conf
      + 
      +
    6. +
    7. +

      Enable the virtual host with sudo a2ensite trilium.yourdomain.com.conf +

      +
    8. +
    9. +

      Reload apache2 with sudo systemctl reload apache2 +

      +
    10. +
    +

    Configuring the trusted proxy

    +

    After setting up a reverse proxy, make sure to configure the Trusted proxy.

    +

    Setup the systemd service to start up the server

    +

    Create and enable a systemd service to start the docker container on boot

    +
      +
    1. +

      Create a new empty file called /lib/systemd/system/trilium.service with + the contents

       [Unit]
      + Description=Trilium Server
      + Requires=docker.service
      + After=docker.service
      +
      + [Service]
      + Restart=always
      + ExecStart=/usr/bin/docker start -a trilium
      + ExecStop=/usr/bin/docker stop -t 2 trilium
      +
      + [Install]
      + WantedBy=local.target
      +
    2. +
    3. +

      Install, enable and start service

       sudo systemctl daemon-reload
      + sudo systemctl enable trilium.service
      + sudo systemctl start trilium.service
      +
    4. +
    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.html deleted file mode 100644 index 4e2bedc8a..000000000 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.html +++ /dev/null @@ -1,79 +0,0 @@ -

    I've assumed you have created a DNS A record for trilium.yourdomain.com that - you want to use for your Trilium server.

    -
      -
    1. -

      Download docker image and create container

       docker pull triliumnext/trilium:[VERSION]
      - docker create --name trilium -t -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/trilium:[VERSION]
      -
    2. -
    3. -

      Configure Apache proxy and websocket proxy

      -
        -
      1. -

        Enable apache proxy modules

         a2enmod ssl
        - a2enmod proxy
        - a2enmod proxy_http
        - a2enmod proxy_wstunnel
        -
      2. -
      3. -

        Create a new let's encrypt certificate

         sudo certbot certonly -d trilium.mydomain.com
        -

        Choose standalone (2) and note the location of the created certificates - (typically /etc/letsencrypt/live/...)

        -
      4. -
      5. -

        Create a new virtual host file for apache (you may want to use apachectl -S to - determine the server root location, mine is /etc/apache2)

         sudo nano /etc/apache2/sites-available/trilium.yourdomain.com.conf
        -

        Paste (and customize) the following text into the configuration file

         
        -     ServerName http://trilium.yourdomain.com
        -     RewriteEngine on
        -         RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
        - 
        - 
        -     ServerName https://trilium.yourdomain.com
        -     RewriteEngine On
        -     RewriteCond %{HTTP:Connection} Upgrade [NC]
        -     RewriteCond %{HTTP:Upgrade} websocket [NC]
        -     RewriteRule /(.*) ws://localhost:8080/$1 [P,L]
        -     AllowEncodedSlashes NoDecode
        -     ProxyPass / http://localhost:8080/ nocanon
        -     ProxyPassReverse / http://localhost:8080/
        -     SSLCertificateFile /etc/letsencrypt/live/trilium.yourdomain.com/fullchain.pem
        -     SSLCertificateKeyFile /etc/letsencrypt/live/trilium.yourdomain.com/privkey.pem
        -     Include /etc/letsencrypt/options-ssl-apache.conf
        - 
        -
      6. -
      7. -

        Enable the virtual host with sudo a2ensite trilium.yourdomain.com.conf -

        -
      8. -
      9. -

        Reload apache2 with sudo systemctl reload apache2 -

        -
      10. -
      -
    4. -
    5. -

      Create and enable a systemd service to start the docker container on boot

      -
        -
      1. -

        Create a new empty file called /lib/systemd/system/trilium.service with - the contents

         [Unit]
        - Description=Trilium Server
        - Requires=docker.service
        - After=docker.service
        -
        - [Service]
        - Restart=always
        - ExecStart=/usr/bin/docker start -a trilium
        - ExecStop=/usr/bin/docker stop -t 2 trilium
        -
        - [Install]
        - WantedBy=local.target
        -
      2. -
      3. -

        Install, enable and start service

         sudo systemctl daemon-reload
        - sudo systemctl enable trilium.service
        - sudo systemctl start trilium.service
        -
      4. -
      -
    6. -
    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.html index 7b7e958a0..3ea96af02 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.html @@ -1,11 +1,11 @@ -

    Configure Nginx proxy and HTTPS. The operating system here is Ubuntu 18.04.

    +

    Configure Nginx proxy and HTTPS. The operating system here is Ubuntu.

    +

    Installing Nginx

    +

    Download Nginx and remove Apache2

    sudo apt-get install nginx
    +sudo apt-get remove apache2
    +

    Build the configuration file

    1. -

      Download Nginx and remove Apache2

      sudo apt-get install nginx
      -sudo apt-get remove apache2
      -
    2. -
    3. -

      Create configure file

      cd /etc/nginx/conf.d
      +    

      First, create the configuration file:

      cd /etc/nginx/conf.d
       vim default.conf
    4. @@ -48,16 +48,17 @@ server { return 301 https://$server_name$request_uri; }
    -
  • -

    Alternatively if you want to serve the instance under a different path - (useful e.g. if you want to serve multiple instances), update the location - block like so:

    -
      -
    • update the location with your desired path (make sure to not leave a trailing - slash "/", if your proxy_pass does not end on a slash as well)
    • -
    • add the proxy_cookie_path directive with the same path: this - allows you to stay logged in at multiple instances at the same time.
    • -
        location /trilium/instance-one {
    +
    +

    Serving under a different path

    +

    Alternatively if you want to serve the instance under a different path + (useful e.g. if you want to serve multiple instances), update the location + block like so:

    +
      +
    • update the location with your desired path (make sure to not leave a trailing + slash "/", if your proxy_pass does not end on a slash as well)
    • +
    • add the proxy_cookie_path directive with the same path: this + allows you to stay logged in at multiple instances at the same time.
    • +
        location /trilium/instance-one {
             rewrite /trilium/instance-one/(.*) /$1  break;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
    @@ -68,7 +69,7 @@ server {
             proxy_pass http://trilium;
             proxy_cookie_path / /trilium/instance-one
             proxy_read_timeout 90;
    -    }
    -
    -
  • - \ No newline at end of file + } +

    Configuring the trusted proxy

    +

    After setting up a reverse proxy, make sure to configure the Trusted proxy.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy.html new file mode 100644 index 000000000..e477571ac --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy.html @@ -0,0 +1,11 @@ +

    If you are running the Trilium server under a reverse proxy, + it's important to configure it as a trusted proxy so that the application + can correctly identify the real IP address of the clients (for authentication + and rate limiting purposes).

    +

    To do so, simply modify Configuration (config.ini or environment variables) and + set:

    [Network]
    +trustedReverseProxy=true
    +

    This will use the left-most IP in the X-Forwarded-For header. + Alternatively, instead of true use the IP address of the reverse + proxy or Express.js shortcuts such as:

    loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7)
    +

    For more information, consult Express behind proxies.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).html new file mode 100644 index 000000000..c63e72e26 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).html @@ -0,0 +1,52 @@ +

    Configuring TLS is essential for server installation in + Trilium. This guide details the steps to set up TLS within Trilium itself.

    + +

    Obtaining a TLS Certificate

    +

    You have two options for obtaining a TLS certificate:

    +
      +
    • Recommended: Obtain a TLS certificate signed by a root + certificate authority. For personal use, Let's Encrypt is + an excellent choice. It is free, automated, and straightforward. Certbot + can facilitate automatic TLS setup.
    • +
    • Generate a self-signed certificate. This option is not recommended due + to the additional complexity of importing the certificate into all machines + connecting to the server.
    • +
    +

    Modifying config.ini

    +

    Once you have your certificate, modify the config.ini file + in the data directory to configure + Trilium to use it:

    [Network]
    +port=8080
    +# Set to true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
    +https=true
    +# Path to the certificate (run "bash bin/generate-cert.sh" to generate a self-signed certificate).
    +# Relevant only if https=true
    +certPath=/[username]/.acme.sh/[hostname]/fullchain.cer
    +keyPath=/[username]/.acme.sh/[hostname]/example.com.key
    +

    You can also review the configuration file + to provide all config.ini values as environment variables instead. + For example, you can configure TLS using environment variables:

    export TRILIUM_NETWORK_HTTPS=true
    +export TRILIUM_NETWORK_CERTPATH=/path/to/cert.pem
    +export TRILIUM_NETWORK_KEYPATH=/path/to/key.pem
    +

    The above example shows how this is set up in an environment where the + certificate was generated using Let's Encrypt's ACME utility. Your paths + may differ. For Docker installations, ensure these paths are within a volume + or another directory accessible by the Docker container, such as /home/node/trilium-data/[DIR IN DATA DIRECTORY].

    +

    After configuring config.ini, restart Trilium and access the + hostname using "https".

    +

    Self-Signed Certificate

    +

    If you opt to use a self-signed certificate for your server instance, + note that the desktop instance will not trust it by default.

    +

    To bypass this, disable certificate validation by setting the following + environment variable (for Linux):

    export NODE_TLS_REJECT_UNAUTHORIZED=0
    +trilium
    +

    Trilium provides scripts to start in this mode, such as trilium-no-cert-check.bat for + Windows.

    +

    Warning: Disabling TLS certificate validation is insecure. + Proceed only if you fully understand the implications.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.html deleted file mode 100644 index 2a1c6d346..000000000 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.html +++ /dev/null @@ -1,48 +0,0 @@ -

    Configuring TLS is essential for server installation in - Trilium. This guide details the steps to set up TLS within Trilium itself.

    -

    For a more robust solution, consider using TLS termination with a reverse - proxy (recommended, e.g., Nginx). You can follow a guide like this for - such setups.

    -

    Obtaining a TLS Certificate

    -

    You have two options for obtaining a TLS certificate:

    -
      -
    • Recommended: Obtain a TLS certificate signed by a root - certificate authority. For personal use, Let's Encrypt is - an excellent choice. It is free, automated, and straightforward. Certbot - can facilitate automatic TLS setup.
    • -
    • Generate a self-signed certificate. This option is not recommended due - to the additional complexity of importing the certificate into all machines - connecting to the server.
    • -
    -

    Modifying config.ini

    -

    Once you have your certificate, modify the config.ini file - in the data directory to configure - Trilium to use it:

    [Network]
    -port=8080
    -# Set to true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
    -https=true
    -# Path to the certificate (run "bash bin/generate-cert.sh" to generate a self-signed certificate).
    -# Relevant only if https=true
    -certPath=/[username]/.acme.sh/[hostname]/fullchain.cer
    -keyPath=/[username]/.acme.sh/[hostname]/example.com.key
    -

    You can also review the configuration file - to provide all config.ini values as environment variables instead. - For example, you can configure TLS using environment variables:

    export TRILIUM_NETWORK_HTTPS=true
    -export TRILIUM_NETWORK_CERTPATH=/path/to/cert.pem
    -export TRILIUM_NETWORK_KEYPATH=/path/to/key.pem
    -

    The above example shows how this is set up in an environment where the - certificate was generated using Let's Encrypt's ACME utility. Your paths - may differ. For Docker installations, ensure these paths are within a volume - or another directory accessible by the Docker container, such as /home/node/trilium-data/[DIR IN DATA DIRECTORY].

    -

    After configuring config.ini, restart Trilium and access the - hostname using "https".

    -

    Self-Signed Certificate

    -

    If you opt to use a self-signed certificate for your server instance, - note that the desktop instance will not trust it by default.

    -

    To bypass this, disable certificate validation by setting the following - environment variable (for Linux):

    export NODE_TLS_REJECT_UNAUTHORIZED=0
    -trilium
    -

    Trilium provides scripts to start in this mode, such as trilium-no-cert-check.bat for - Windows.

    -

    Warning: Disabling TLS certificate validation is insecure. - Proceed only if you fully understand the implications.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html index 4caedaaf8..0c06f1279 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html @@ -49,11 +49,19 @@

    Now the text will be displayed above while still maintaining the collection view.

    Using saved search

    -

    Since collections are based on the Note List mechanism, - it's possible to apply the same configuration to Saved Search to do advanced querying - and presenting the result in an adequate matter such as a calendar, a table - or even a map.

    +

    Collections, by default, only display the child notes. However, it is + possible to use the Search functionality + to display notes all across the tree, with advanced querying functionality.

    +

    To do so, simply start a Search and + go to the Collection Properties tab in the Ribbon and select a desired type + of collection. To keep the search-based collection, use a Saved Search.

    +

    Creating a collection from scratch

    By default, collections come with a default configuration and sometimes even sample notes. To create a collection completely from scratch:

    diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png new file mode 100644 index 000000000..83b0c01af Binary files /dev/null and b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png differ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Board View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Board View.html index 67a727656..922171f0d 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Board View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Board View.html @@ -15,73 +15,71 @@ in a hierarchy.

    Interaction with columns

      -
    • Create a new column by pressing Add Column near the last column. +
    • Create a new column by pressing Add Column near the last column.
        -
      • Once pressed, a text box will be displayed to set the name of the column. +
      • Once pressed, a text box will be displayed to set the name of the column. Press Enter to confirm, or Escape to dismiss.
    • -
    • To reorder a column, simply hold the mouse over the title and drag it +
    • To reorder a column, simply hold the mouse over the title and drag it to the desired position.
    • -
    • To delete a column, right click on its title and select Delete column.
    • -
    • To rename a column, click on the note title. +
    • To delete a column, right click on its title and select Delete column.
    • +
    • To rename a column, click on the note title.
        -
      • Press Enter to confirm.
      • -
      • Upon renaming a column, the corresponding status attribute of all its +
      • Press Enter to confirm.
      • +
      • Upon renaming a column, the corresponding status attribute of all its notes will be changed in bulk.
      -
    • -
    • If there are many columns, use the mouse wheel to scroll.
    • + +
    • If there are many columns, use the mouse wheel to scroll.

    Interaction with notes

      -
    • Create a new note in any column by pressing New item +
    • Create a new note in any column by pressing New item
        -
      • Enter the name of the note and press Enter or click away. To +
      • Enter the name of the note and press Enter or click away. To dismiss the creation of a new note, simply press Escape or leave the name empty.
      • -
      • Once created, the new note will have an attribute (status label +
      • Once created, the new note will have an attribute (status label by default) set to the name of the column.
    • -
    • To open the note, simply click on it.
    • -
    • To change the title of the note directly from the board, hover the mouse +
    • To open the note, simply click on it.
    • +
    • To change the title of the note directly from the board, hover the mouse over its card and press the edit button on the right.
    • -
    • To change the state of a note, simply drag a note from one column to the +
    • To change the state of a note, simply drag a note from one column to the other to change its state.
    • -
    • The order of the notes in each column corresponds to their position in +
    • The order of the notes in each column corresponds to their position in the tree.
        -
      • It's possible to reorder notes simply by dragging them to the desired +
      • It's possible to reorder notes simply by dragging them to the desired position within the same columns.
      • -
      • It's also possible to drag notes across columns, at the desired position.
      • +
      • It's also possible to drag notes across columns, at the desired position.
    • -
    • For more options, right click on a note to display a context menu with +
    • For more options, right click on a note to display a context menu with the following options:
        -
      • Open the note in a new tab/split/window or quick edit.
      • -
      • Move the note to any column.
      • -
      • Insert a new note above/below the current one.
      • -
      • Archive/unarchive the current note.
      • -
      • Delete the current note.
      • +
      • Open the note in a new tab/split/window or quick edit.
      • +
      • Move the note to any column.
      • +
      • Insert a new note above/below the current one.
      • +
      • Archive/unarchive the current note.
      • +
      • Delete the current note.
    • -
    • If there are many notes within the column, move the mouse over the column +
    • If there are many notes within the column, move the mouse over the column and use the mouse wheel to scroll.

    Keyboard interaction

    The board view has mild support for keyboard-based navigation:

      -
    • Use Tab and Shift+Tab to navigate between +
    • Use Tab and Shift+Tab to navigate between column titles, notes and the “New item” button for each of the columns, in sequential order.
    • -
    • To rename a column or a note, press F2 while it is focused.
    • -
    • To open a specific note or create a new item, press Enter while +
    • To rename a column or a note, press F2 while it is focused.
    • +
    • To open a specific note or create a new item, press Enter while it is focused.
    • -
    • To dismiss a rename of a note or a column, press Escape.
    • +
    • To dismiss a rename of a note or a column, press Escape.

    Configuration

    Grouping by another attribute

    @@ -96,5 +94,5 @@ class="admonition note">

    Interaction

    Limitations

      -
    • It is not possible yet to use group by a relation, only by label.
    • +
    • It is not possible yet to use group by a relation, only by label.
    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View.html new file mode 100644 index 000000000..ca888c9cf --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View.html @@ -0,0 +1,135 @@ +
    + +
    +

    The Presentation view allows the creation of slideshows directly from + within Trilium.

    +

    How it works

    +
      +
    • Each slide is a child note of the collection.
    • +
    • The order of the child notes determines the order of the slides.
    • +
    • Unlike traditional presentation software, slides can be laid out both + horizontally and vertically (see belwo for more information).
    • +
    • Direct children will be laid out horizontally and the children of those + will be laid out vertically. Children deeper than two levels of nesting + are ignored.
    • +
    +

    Interaction and navigation

    +

    In the floating buttons section (top-right):

    +
      +
    • Edit button to go to the corresponding note of the current slide.
    • +
    • Press Overview button (or the O key) to show a birds-eye view + of the slides. Press the button again to disable it.
    • +
    • Press the “Start presentation” button to show the presentation in full-screen.
    • +
    +

    The following keyboard shortcuts are supported:

    +
      +
    • Press and (or H and L) to go + to the slide on the left or on the right (horizontal).
    • +
    • Press and  (or K and J) + to go to the upward or downward slide (vertical).
    • +
    • Press Space and Shift + Space or  to go + to the next/previous slide in order.
    • +
    • And a few more, press ? to display a popup with all the supported + keyboard combinations.
    • +
    +

    Vertical slides and nesting

    +

    Unlike traditional presentation software such as Microsoft PowerPoint, + the slides in Trilium can be laid out horizontally or vertically in order + to create depth or better organize the slides by topic.

    +

    This horizontal/vertical organization affects transitions (especially + on the “slide” transition), however it is most noticeable in navigation.

    +
      +
    • Pressing and will navigate through slides horizontally, + thus skipping vertical notes under the current slide. This is useful to + skip entire chapters/related slides.
    • +
    • Pressing and will navigate through the vertical + slides at the current level.
    • +
    • Pressing Space and Shift + Space will go to + the next/previous slide in order, regardless of the direction. This is + generally the key combination to use when presenting.
    • +
    • The arrows on the bottom-right of the slide will also reflect this navigation + scheme.
    • +
    +
    + +
    +

    All direct children of the collection will be laid out horizontally. If + a direct child also has children, those children will be placed as vertical + slides.

    +

    In the following example, the note structure is as follows:

    +
      +
    • Presentation collection +
        +
      • Trilium Notes (demo page)
      • +
      • “Introduction” slide +
          +
        • “The challenge of personal knowledge management”
        • +
        • “Note-taking structures”
        • +
        +
      • +
      • “Demo & Feature highlights” slide +
          +
        • “Really fast installation process”
        • +
        • Video slide
        • +
        +
      • +
      +
    • +
    +

    Customization

    +

    At collection level, it's possible to adjust:

    +
      +
    • The theme of the entire presentation to one of the predefined themes by + going to the Ribbon and + looking for the Collection Properties tab.
    • +
    • It's currently not possible to create custom themes, although it is planned.
    • +
    • Note that it is note possible to alter the CSS via Custom app-wide CSS because the + slides are rendered isolated (in a shadow DOM).
    • +
    +

    At slide level:

    +
      +
    • It's possible to adjust the background color of a slide by using the + predefined promoted attributefor the color or manually setting #slide:background to + a hex color.
    • +
    • More complex backgrounds can be achieved via gradients. There's no UI + for it; it has to be set via #slide:background to a CSS gradient + definition such as: linear-gradient(to bottom, #283b95, #17b2c3).
    • +
    +

    Tips and tricks

    +
      +
    • Text notes generally respect the formatting (bold, italic, foreground + and background colors) and font size. Code blocks and tables also work.
    • +
    • Try using more than just text notes, the presentation uses the same mechanism + as shared notes and Note List so it should be able + to display Mermaid Diagrams,  + Canvas and Mind Map in + full-screen (without the interactivity). +
        +
      • +

        Consider using a transparent background for Canvas, if the slides have a custom + background (go to the hamburger menu in the Canvas, press the button select + a custom color and write transparent).

        +
      • +
      • +

        For Mermaid Diagrams, + some of them have a predefined background which can be changed via the + frontmatter. For example, for XY-charts:

        ---
        +config:
        +    themeVariables:
        +        xyChart:
        +            backgroundColor: transparent
        +---
        +
      • +
      +
    • +
    +

    Under the hood

    +

    The Presentation view uses Reveal.js to + handle the navigation and layout of the slides.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View_image.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View_image.png new file mode 100644 index 000000000..b87b47a4b Binary files /dev/null and b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View_image.png differ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html index 957acc574..64ee6ff60 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html @@ -1,16 +1,51 @@ -

    Relation map is a type of Note which - visualizes notes and their relations. - See an example:

    +

    Relation map is a type of note which visualizes notes and their + relations.

    +

    Interaction

    +
      +
    • To create a new note and add it to the board, press the plus button in + the Floating buttons. +
        +
      • Afterwards, click anywhere on the map to place it there.
      • +
      • The note will be placed as a sub-child of the map.
      • +
      +
    • +
    • An existing note can also be dragged from the Note Tree. It will be placed at the + position it's dragged on. +
        +
      • Multiple notes can also be dragged via Multiple selection. The notes will + be positioned near the dragged position without overlapping.
      • +
      • The dragged note can be a sub-child of the map, or it can be at any arbitrary + position.
      • +
      +
    • +
    • To create a relationship, hold the mouse on the box on the right of a + note and then: +
        +
      • Drag it over another note to create a relationship pointing from the first + note to the second one.
      • +
      • Drag over the same note to create a self-referencing relationship (represented + as a loop).
      • +
      • Once dragged, enter the name of the relationship to create. To cancel, + simply dismiss the dialog or press Esc.
      • +
      +
    • +
    • To open a note, either click on the note (opening it in the current view) + or use the right click menu to open in a new tab.
    • +
    • To edit the title of a note or to delete it (either from the map, or delete + it completely), right click the note.
    • +
    • To delete a relationship, right click it and select the corresponding + option.
    • +

    Development process demo

    This is a basic example how you can create simple diagram using relation maps:

    -

    - -

    +

    And this is how you can create it:

    -

    - -

    +

    We start completely from scratch by first creating new note called "Development process" and changing its type to "Relation map". After that we create new notes one by one and place them by clicking into the map. We also drag @@ -23,17 +58,15 @@

    Family demo

    This is more complicated demo using some advanced concepts. Resulting diagram is here:

    -

    - -

    +

    This is how you get to it:

    -

    - -

    +

    There are several steps here:

    • we start with empty relation map and two existing notes representing Prince - Philip and Queen Elizabeth II. These two notes already have "isPartnerOf" + Philip and Queen Elizabeth II. These two notes already have isPartnerOf relationsdefined.
        @@ -42,22 +75,24 @@
    • we drag both notes to relation map and place to suitable position. Notice - how the existing "isPartnerOf" relations are displayed.
    • + how the existing isPartnerOf relations are displayed.
    • now we create new note - we name it "Prince Charles" and place it on the relation map by clicking on the desired position. The note is by default created under the relation map note (visible in the note tree on the left).
    • -
    • we create two new relations "isChildOf" targeting both Philip and Elizabeth +
    • we create two new relations isChildOf targeting both Philip + and Elizabeth
      • now there's something unexpected - we can also see the relation to display - another "hasChild" relation. This is because there's a relation definition which - puts "isChildOf" as an "inverse" - relation of "hasChildOf" (and vice versa) and thus it is created automatically.
      • + another hasChild relation. This is because there's a relation definition which + puts isChildOf as an "inverse" + relation of hasChildOf (and vice versa) and thus it is created + automatically.
    • -
    • we create another note for Princess Diana and create "isPartnerOf" relation +
    • we create another note for Princess Diana and create isPartnerOf relation from Charles. Again notice how the relation has arrows both ways - this - is because "isPartnerOf" definition specifies its inverse relation as again - "isPartnerOf" so the opposite relation is created automatically.
    • + is because isPartnerOf definition specifies its inverse relation + as again "isPartnerOf" so the opposite relation is created automatically.
    • as the last step we pan & zoom the map to fit better to window dimensions.

    Relation definitions mentioned above come from "Person template" note @@ -71,5 +106,6 @@ the ones defined in the label.

    See also

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Custom app-wide CSS.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Custom app-wide CSS.html index 195bfd275..f7d9fd394 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Custom app-wide CSS.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Custom app-wide CSS.html @@ -24,7 +24,7 @@ - Type the desired CSS.  + Type the desired CSS.  

    Generally it's a good idea to append !important for the styles that are being changed, in order to prevent other @@ -87,4 +87,10 @@ right: 1em; opacity: 0.5; z-index: 0; -} \ No newline at end of file +} +

    Limitations

    +

    Some parts of the application can't be styled directly via custom CSS + because they are rendered in an isolated mode (shadow DOM), more specifically:

    + \ No newline at end of file diff --git a/apps/server/src/assets/translations/ar/server.json b/apps/server/src/assets/translations/ar/server.json index 2083d41d4..e51c4c9f9 100644 --- a/apps/server/src/assets/translations/ar/server.json +++ b/apps/server/src/assets/translations/ar/server.json @@ -55,7 +55,36 @@ "reload-frontend-app": "اعادة تحميل الواجهة", "zoom-out": "تصغير العرض", "zoom-in": "تكبير العرض", - "note-navigation": "التنقل بين الملاحظات" + "note-navigation": "التنقل بين الملاحظات", + "show-options": "افتح صفحة \"الخيارات\"", + "text-note-operations": "عمليات الملاحظة النصية", + "add-new-label": "انشاء تسمية جديدة", + "create-new-relation": "انشاء علاقة جديدة", + "toggle-basic-properties": "اظهار/اخفاء الخصائص الاساسية", + "toggle-file-properties": "اظهار/اخفاء خصائص الملف", + "toggle-image-properties": "اظهار/اخفاء خصائص الصورة", + "toggle-owned-attributes": "اظهار/اخفاء السمات المملوكة", + "toggle-inherited-attributes": "اظهار/اخفاء السمات المتوارثه", + "toggle-promoted-attributes": "اظخار/اخفاء السمات المروجة", + "toggle-link-map": "اظهار/اخفاء خريطة الرابط", + "toggle-note-info": "اظهار/اخفاء معلومات الملاحظة", + "toggle-note-paths": "اظها/اخفاء مسارات الملاحظة", + "toggle-similar-notes": "اظهار/اخفاء الملاحظات المشابهة", + "print-active-note": "طباعة الملاحظة‍ النشطة", + "unhoist": "الغاء التركيز من اي مكان", + "open-dev-tools": "فتح ادوات المطور", + "find-in-text": "اظهار/اخفاء لوحة الفتح", + "toggle-full-screen": "اظهار/اخفاء وضع ملء الشاشة", + "reset-zoom-level": "اعادة ضبط مستوى التكبير", + "toggle-book-properties": "اظهار/اخفاء خصائص المجموعة", + "show-note-source": "عرض مربع حوار \"مصدر الملاحظات\"", + "show-revisions": "عرض مربع حوار \" مراجعات الملاحظة\"", + "show-recent-changes": "عرض مربع حوار \" التغيرات الاخيرة\"", + "show-sql-console": "فتح صفحة \" وحدة تحكم SQL\"", + "show-backend-log": "فتح صفحة \"سجل الخلفية\"", + "edit-readonly-note": "تعديل ملاحظة القراءة فقط", + "attributes-labels-and-relations": "سمات ( تسميات و علاقات)", + "render-active-note": "عرض ( اعادة عرض) الملاحظة المؤرشفة" }, "setup_sync-from-server": { "note": "ملاحظة:", @@ -64,7 +93,10 @@ "back": "رجوع", "server-host-placeholder": "https://:", "proxy-server-placeholder": "https://:", - "finish-setup": "اكمال التثبيت" + "finish-setup": "اكمال التثبيت", + "heading": "مزامنة من الخادم", + "server-host": "عنوان خادم تريليوم", + "proxy-server": "خادم وكيل (اختياري)" }, "weekdays": { "monday": "الاثنين", @@ -134,7 +166,16 @@ "code-notes-title": "ملاحظات برمجية", "visible-launchers-title": "المشغلات المرئية", "user-guide": "دليل المستخدم", - "ai-llm-title": "AI/LLM" + "ai-llm-title": "AI/LLM", + "etapi-title": "ETAPI", + "sql-console-history-title": "سجل وحدة تحكم SQL", + "launch-bar-templates-title": "قوالب شريط التشغيل", + "base-abstract-launcher-title": "المشغل الاساسي المجرد", + "llm-chat-title": "الدردشة مع الملاحظات", + "localization": "اللغة والمنطقة", + "go-to-previous-note-title": "اذهب الى الملاحظة السابقة", + "go-to-next-note-title": "اذهب الى الملاحظة التالية", + "open-today-journal-note-title": "فتح ملاحظة مجلة اليوم" }, "tray": { "bookmarks": "العلامات المرجعية", @@ -142,7 +183,9 @@ "close": "انهاء تريليوم", "recents": "الملاحظات الحديثة", "new-note": "ملاحظة جديدة", - "show-windows": "اظهار النوافذ" + "show-windows": "اظهار النوافذ", + "open_new_window": "فتح نافذة جديدة", + "today": "فتح ملاحظة مجلة اليوم" }, "modals": { "error_title": "خطأ" @@ -152,7 +195,8 @@ "subpages": "الصفحات الفرعية:", "expand": "توسيع", "site-theme": "المظهر العام للموقع", - "image_alt": "صورة المقال" + "image_alt": "صورة المقال", + "on-this-page": "في هذه السفحة" }, "hidden_subtree_templates": { "description": "الوصف", @@ -175,7 +219,12 @@ "grid-view": "عرض شبكي", "geo-map": "خريطة جغرافية", "start-date": "تاريخ البدء", - "end-date": "تاريخ الانتهاء" + "end-date": "تاريخ الانتهاء", + "presentation": "عرض تقديمي", + "presentation_slide": "شريحة العرض التقديمي", + "presentation_slide_first": "الشريحة الاولى", + "presentation_slide_second": "الشريحة الثانية", + "background": "الخلفية" }, "login": { "title": "تسجيل الدخول", @@ -193,13 +242,19 @@ }, "setup": { "next": "التالي", - "title": "تثبيت" + "title": "تثبيت", + "heading": "تثبيت تريليوم للملاحظات", + "init-in-progress": "جار تهيئة المستند" }, "setup_sync-from-desktop": { - "step6-here": "هنا" + "step6-here": "هنا", + "heading": "مزامنة من سطح المكتب", + "step3": "انقر على صنف المزامنة." }, "setup_sync-in-progress": { - "outstanding-items-default": "غير متوفر" + "outstanding-items-default": "غير متوفر", + "heading": "المزامنة جارية", + "outstanding-items": "عناصر المزامنة المعلقة:" }, "share_page": { "parent": "الأصل:", @@ -224,12 +279,75 @@ "show-cheatsheet": "عرض دليل الاختصارات", "unhoist-note": "الغاء تثبيت الملاحظة", "zoom-out": "تصغير العرض", - "zoom-in": "تكبير العرض" + "zoom-in": "تكبير العرض", + "search-in-subtree": "البحث في الشجرة الفرعية", + "sort-child-notes": "ترتيب الملاحظات الفرعية", + "create-note-after": "انشاء ملاحظة بعد", + "create-note-into": "انشاء معلومات الملاحظة", + "move-note-up": "انقل الملاحظة للاعلى", + "move-note-down": "انقل الملاحظة للاسفل", + "edit-note-title": "تحرير عنوان الملاحظة", + "clone-notes-to": "نسخ الملاحظة الى", + "move-notes-to": "نقل الملاحظات الى", + "open-new-tab": "فتح علامة تبويب جديدة", + "close-active-tab": "اغلاق التبويب النشط", + "reopen-last-tab": "اعادة فتح اخر تبويب", + "activate-next-tab": "تنشيط علامة التبويب اللاحقة", + "activate-previous-tab": "تنشيط علامة التبويب السابقة", + "open-new-window": "فتح نافذة جديدة", + "print-active-note": "طباعة الملاحظة النشطة", + "open-note-externally": "افتح الملاحظة خارجيا", + "render-active-note": "عرض الملاحظة النشطة", + "run-active-note": "تشغيل الملاحظة النشطة", + "open-developer-tools": "فتح ادوات المطور", + "find-in-text": "البحث في النص", + "toggle-left-pane": "اظهار/اخفاء اللوحة اليسرى", + "toggle-full-screen": "اظهار/اخفاء وضع ملء الشاشة", + "reset-zoom-level": "اعادة ضبط مستوى التكبير", + "copy-without-formatting": "نسخ بدون تنسيق", + "add-new-relation": "اضافة علاقة جديدة", + "toggle-right-pane": "اظهار/اخفاء اللوحة اليمنى", + "switch-to-second-tab": "الانتقال الى التبويب الثاني", + "switch-to-third-tab": "الانتقال الى التبويب الثالث", + "switch-to-fourth-tab": "الانتقال الى التبويب الرابع", + "switch-to-fifth-tab": "الانتقال الى التبويب الخامس", + "switch-to-sixth-tab": "الانتقال الى التبويب السادس", + "switch-to-seventh-tab": "الانتقال الى التبويب السابع", + "switch-to-eighth-tab": "الانتقال الى التبويب الثامن", + "switch-to-ninth-tab": "الانتقال الى التبويب التاسع", + "switch-to-last-tab": "الانتقال الى اخر تبويب", + "add-link-to-text": "اضافة رابط الى النص", + "edit-branch-prefix": "تحرير بادئة الفرع", + "toggle-zen-mode": "اظهار/ اخفاء وضع Zen", + "show-note-source": "اظهار مصدر الملاحظة", + "show-recent-changes": "عرض التغيرات الاخيرة", + "show-sql-console": "عرض وحدة تحكم SQL", + "show-backend-log": "عرض سجل الخلفية", + "cut-into-note": "قص الى الملاحظة", + "edit-read-only-note": "تحرير ملاحظة للقراءة فقط", + "add-new-label": "اضافة تسمية جديدة", + "reload-frontend-app": "اعادة تحميل الواجهة الامامية للتطبيق", + "force-save-revision": "فرض حفظ المراجعة", + "toggle-note-hoisting": "اظهار/ اخفاء التركيز في الملاحظة", + "back-in-note-history": "الرجوع الى سجل الملاحظة", + "forward-in-note-history": "التقدم للامام في سجل الملاحظة", + "scroll-to-active-note": "تمرير تلى الملاحظة النشطة", + "create-note-into-inbox": "انشاء ملاحظة في البريد الوارد", + "copy-notes-to-clipboard": "نسخ الملاحظات الى الخافظة", + "paste-notes-from-clipboard": "لصق الملاحظات الى الحافظة", + "cut-notes-to-clipboard": "قص الملاحظات الى الحافظة", + "toggle-system-tray-icon": "تبديل ايقونة علبة النظام", + "switch-to-first-tab": "التبديل الى التبويب الاول", + "follow-link-under-cursor": "اتبع الرابط اسفل المؤشر", + "paste-markdown-into-text": "لصق نص بتنسبق Markdown" }, "share_404": { "title": "غير موجود", "heading": "غير موجود" }, "weekdayNumber": "الاسبوع{رقم الاسيوع}", - "quarterNumber": "الربع {رقم الربع}" + "quarterNumber": "الربع {رقم الربع}", + "pdf": { + "export_filter": "مستند PDF (.pdf)" + } } diff --git a/apps/server/src/assets/translations/cn/server.json b/apps/server/src/assets/translations/cn/server.json index 0e5a1d620..788af2b5a 100644 --- a/apps/server/src/assets/translations/cn/server.json +++ b/apps/server/src/assets/translations/cn/server.json @@ -423,7 +423,12 @@ "board_note_third": "第三个笔记", "board_status_todo": "待办", "board_status_progress": "进行中", - "board_status_done": "已完成" + "board_status_done": "已完成", + "presentation": "演示", + "presentation_slide": "演示幻灯片", + "presentation_slide_first": "第一张幻灯片", + "presentation_slide_second": "第二张幻灯片", + "background": "背景" }, "sql_init": { "db_not_initialized_desktop": "数据库尚未初始化,请依照屏幕提示操作。", diff --git a/apps/server/src/assets/translations/de/server.json b/apps/server/src/assets/translations/de/server.json index 0043f21cf..6ee28f60f 100644 --- a/apps/server/src/assets/translations/de/server.json +++ b/apps/server/src/assets/translations/de/server.json @@ -307,7 +307,12 @@ "board_note_second": "Zweite Notiz", "board_note_third": "Dritte Notiz", "board_status_todo": "To-Do", - "board_status_progress": "In Bearbeitung" + "board_status_progress": "In Bearbeitung", + "presentation": "Präsentation", + "presentation_slide": "Präsentationsfolie", + "presentation_slide_first": "Erste Folie", + "presentation_slide_second": "Zweite Folie", + "background": "Hintergrund" }, "keyboard_action_names": { "copy-notes-to-clipboard": "Notizen in Zwischenablage kopieren", diff --git a/apps/server/src/assets/translations/el/server.json b/apps/server/src/assets/translations/el/server.json index 0967ef424..7f584b034 100644 --- a/apps/server/src/assets/translations/el/server.json +++ b/apps/server/src/assets/translations/el/server.json @@ -1 +1,8 @@ -{} +{ + "keyboard_actions": { + "back-in-note-history": "Μετάβαση στην προηγούμενη σημείωση στο ιστορικό", + "forward-in-note-history": "Μεταβείτε στην επόμενη σημείωση στο ιστορικό", + "open-jump-to-note-dialog": "Ανοίξτε το παράθυρο διαλόγου \"Μετάβαση στη σημείωση\"", + "open-command-palette": "Άνοιγμα παλέτας εντολών" + } +} diff --git a/apps/server/src/assets/translations/en/server.json b/apps/server/src/assets/translations/en/server.json index 2fcbe5464..972f45154 100644 --- a/apps/server/src/assets/translations/en/server.json +++ b/apps/server/src/assets/translations/en/server.json @@ -373,7 +373,8 @@ "export_filter": "PDF Document (*.pdf)", "unable-to-export-message": "The current note could not be exported as a PDF.", "unable-to-export-title": "Unable to export as PDF", - "unable-to-save-message": "The selected file could not be written to. Try again or select another destination." + "unable-to-save-message": "The selected file could not be written to. Try again or select another destination.", + "unable-to-print": "Unable to print the note" }, "tray": { "tooltip": "Trilium Notes", @@ -423,7 +424,12 @@ "board_note_third": "Third note", "board_status_todo": "To Do", "board_status_progress": "In Progress", - "board_status_done": "Done" + "board_status_done": "Done", + "presentation": "Presentation", + "presentation_slide": "Presentation slide", + "presentation_slide_first": "First slide", + "presentation_slide_second": "Second slide", + "background": "Background" }, "sql_init": { "db_not_initialized_desktop": "DB not initialized, please follow on-screen instructions.", diff --git a/apps/server/src/assets/translations/es/server.json b/apps/server/src/assets/translations/es/server.json index c76720589..2577e2442 100644 --- a/apps/server/src/assets/translations/es/server.json +++ b/apps/server/src/assets/translations/es/server.json @@ -3,7 +3,7 @@ "back-in-note-history": "Navegar a la nota previa en el historial", "forward-in-note-history": "Navegar a la nota siguiente en el historial", "open-jump-to-note-dialog": "Abrir cuadro de diálogo \"Saltar a nota\"", - "scroll-to-active-note": "Desplazarse a la nota activa en el árbol de notas", + "scroll-to-active-note": "Desplazar el árbol de notas a la nota activa", "quick-search": "Activar barra de búsqueda rápida", "search-in-subtree": "Buscar notas en el subárbol de la nota activa", "expand-subtree": "Expandir el subárbol de la nota actual", @@ -380,8 +380,8 @@ "reload-frontend-app": "Recargar aplicación del cliente", "run-active-note": "Ejecutar nota activa", "render-active-note": "Generar nota activa", - "back-in-note-history": "Anterior en el historial de notas", - "forward-in-note-history": "Posterior en el historial de notas", + "back-in-note-history": "Atrás en el historial de notas", + "forward-in-note-history": "Avanzar en el historial de notas", "cut-notes-to-clipboard": "Cortar notas al portapapeles", "select-all-notes-in-parent": "Seleccionar todas las notas en padre", "show-backend-log": "Mostrar registro del servidor", @@ -423,7 +423,11 @@ "built-in-templates": "Plantillas predefinidas", "board_status_todo": "Por hacer", "board_status_done": "Hecho", - "board": "Tablero" + "board": "Tablero", + "presentation": "Presentación", + "presentation_slide": "Slide de presentación", + "presentation_slide_first": "Primer slide", + "presentation_slide_second": "Segundo slide" }, "sql_init": { "db_not_initialized_desktop": "Base de datos no inicializada, por favor, siga las instrucciones en pantalla.", diff --git a/apps/server/src/assets/translations/id/server.json b/apps/server/src/assets/translations/id/server.json index 9a6086a1a..f4a654123 100644 --- a/apps/server/src/assets/translations/id/server.json +++ b/apps/server/src/assets/translations/id/server.json @@ -3,6 +3,86 @@ "back-in-note-history": "Navigasi ke catatan sebelumnya di history", "forward-in-note-history": "Navigasi ke catatan selanjutnya di history", "open-jump-to-note-dialog": "Buka dialog \"Menuju ke catatan\"", - "open-command-palette": "Buka palet perintah" + "open-command-palette": "Buka palet perintah", + "scroll-to-active-note": "Gulir cabang catatan ke catatan aktif", + "quick-search": "Aktifkan bilah pencarian cepat", + "search-in-subtree": "Mencari catatan di sub cabang catatan aktif", + "expand-subtree": "Perluas sub-cabang catatan saat ini", + "collapse-tree": "Buka cabang seluruh catatan", + "collapse-subtree": "Buka sub-cabang catatan saat ini", + "sort-child-notes": "Urutkan sub catatan", + "creating-and-moving-notes": "Membuat dan memindahkan catatan", + "create-note-after": "Buat catatan setelah catatan aktif", + "create-note-into": "Buat catatan sebagai sub dari catatan aktif", + "create-note-into-inbox": "Buat catatan di kotak masuk (jika ditentukan) atau catatan harian", + "delete-note": "Hapus catatan", + "move-note-up": "Pindah catatan ke atas", + "move-note-down": "Pindah catatan ke bawah", + "move-note-up-in-hierarchy": "Pindahkan catatan ke atas dalam hierarki", + "move-note-down-in-hierarchy": "Pindahkan catatan ke bawah dalam hierarki", + "edit-note-title": "Lompat dari pohon ke detail catatan dan edit judul", + "edit-branch-prefix": "Tampilkan dialog \"Edit awalan cabang\"", + "clone-notes-to": "Kloning catatan yang dipilih", + "move-notes-to": "Pindahkan catatan yang dipilih", + "note-clipboard": "Clipboard catatan", + "copy-notes-to-clipboard": "Salin catatan yang dipilih ke clipboard", + "paste-notes-from-clipboard": "Tempel catatan dari clipboard ke catatan aktif", + "cut-notes-to-clipboard": "Potong catatan yang dipilih ke clipboard", + "select-all-notes-in-parent": "Pilih semua catatan dari level catatan saat ini", + "add-note-above-to-the-selection": "Tambahkan catatan di atas ke pilihan", + "add-note-below-to-selection": "Tambahkan catatan di bawah ini ke pilihan", + "duplicate-subtree": "Duplikasi sub-cabang", + "tabs-and-windows": "Tab & Jendela", + "open-new-tab": "Buka tab baru", + "close-active-tab": "Tutup tab aktif", + "reopen-last-tab": "Buka kembali tab terakhir yang ditutup", + "activate-next-tab": "Aktifkan tab di sebelah kanan", + "activate-previous-tab": "Aktifkan tab di sebelah kiri", + "open-new-window": "Buka jendela kosong baru", + "toggle-tray": "Menampilkan/menyembunyikan aplikasi dari tray sistem", + "first-tab": "Aktifkan tab pertama dalam daftar", + "second-tab": "Aktifkan tab kedua dalam daftar", + "third-tab": "Aktifkan tab ketiga dalam daftar", + "fourth-tab": "Aktifkan tab keempat dalam daftar", + "fifth-tab": "Aktifkan tab kelima dalam daftar", + "sixth-tab": "Aktifkan tab keenam dalam daftar", + "seventh-tab": "Aktifkan tab ketujuh dalam daftar", + "eight-tab": "Aktifkan tab kedelapan dalam daftar", + "ninth-tab": "Aktifkan tab kesembilan dalam daftar", + "last-tab": "Aktifkan tab terakhir dalam daftar", + "dialogs": "Dialog", + "show-note-source": "Tampilkan dialog \"Sumber Catatan\"", + "show-options": "Buka halaman \"Opsi\"", + "show-revisions": "Tampilkan dialog \"Revisi Catatan\"", + "show-recent-changes": "Tampilkan dialog \"Perubahan Terbaru\"", + "show-sql-console": "Buka halaman \"SQL Console\"", + "show-backend-log": "Buka halaman \"Log Backend\"", + "show-help": "Buka Panduan Pengguna bawaan", + "show-cheatsheet": "Menampilkan modal dengan operasi keyboard umum", + "text-note-operations": "Operasi catatan teks", + "add-link-to-text": "Buka dialog untuk menambahkan tautan ke teks", + "follow-link-under-cursor": "Ikuti tautan tempat tanda sisipan ditempatkan", + "insert-date-and-time-to-text": "Masukkan tanggal & waktu saat ini ke dalam teks", + "paste-markdown-into-text": "Menempelkan Markdown dari clipboard ke catatan teks", + "cut-into-note": "Memotong pilihan dari catatan saat ini dan membuat subcatatan dengan teks yang dipilih", + "add-include-note-to-text": "Membuka dialog untuk menyertakan catatan", + "edit-readonly-note": "Edit catatan read-only", + "attributes-labels-and-relations": "Atribut (label & relasi)", + "add-new-label": "Buat label baru", + "create-new-relation": "Buat relasi baru", + "ribbon-tabs": "Tab pita", + "toggle-basic-properties": "Alihkan Properti Dasar", + "toggle-file-properties": "Alihkan Properti File", + "toggle-image-properties": "Alihkan Properti Gambar", + "toggle-owned-attributes": "Alihkan Atribut yang Dimiliki", + "toggle-inherited-attributes": "Alihkan Atribut yang Diwarisi", + "toggle-promoted-attributes": "Alihkan Atribut yang Dipromosikan", + "toggle-link-map": "Alihkan Peta Tautan", + "toggle-note-info": "Alihkan Info Catatan", + "toggle-note-paths": "Alihkan Jalur Catatan", + "toggle-similar-notes": "Alihkan Catatan Serupa", + "other": "Yang lain", + "toggle-right-pane": "Alihkan tampilan panel kanan, yang mencakup Daftar Isi dan Sorotan", + "print-active-note": "Cetak catatan aktif" } } diff --git a/apps/server/src/assets/translations/it/server.json b/apps/server/src/assets/translations/it/server.json index 7bffe90ca..63a04e1ff 100644 --- a/apps/server/src/assets/translations/it/server.json +++ b/apps/server/src/assets/translations/it/server.json @@ -2,43 +2,152 @@ "keyboard_action_names": { "zoom-in": "Ingrandisci", "reset-zoom-level": "Ripristina il livello di ingrandimento", - "zoom-out": "Riduci", - "toggle-full-screen": "Attiva/disattiva lo Schermo Intero", - "toggle-left-pane": "Attiva/disattiva il Pannello Sinistro", + "zoom-out": "Rimpicciolisci", + "toggle-full-screen": "Attiva/Disattiva la modalità a schermo intero", + "toggle-left-pane": "Attiva/Disattiva il pannello sinistro", "toggle-zen-mode": "Attiva/disattiva la modalità zen", - "toggle-right-pane": "Attiva/disattiva il Pannello Destro", - "toggle-system-tray-icon": "Attiva/disattiva l'Icona nel Vassoio di Sistema", - "toggle-note-hoisting": "Attiva/disattiva l'Ancoraggio della Nota", - "unhoist-note": "Disancora la Nota", - "reload-frontend-app": "Ricarica l'Applicazione Frontend", - "open-developer-tools": "Apri gli Strumenti da Sviluppatore", - "find-in-text": "Cerca nel Testo", - "print-active-note": "Stampa la Nota Attiva", + "toggle-right-pane": "Attiva/disattiva il pannello destro", + "toggle-system-tray-icon": "Attiva/Disattiva l'Icona nel vassoio di sistema", + "toggle-note-hoisting": "Attiva/Disattiva l'ancoraggio della Nota", + "unhoist-note": "Disancora la nota", + "reload-frontend-app": "Ricarica l'applicazione frontend", + "open-developer-tools": "Apri gli strumenti per sviluppatori", + "find-in-text": "Cerca nel testo", + "print-active-note": "Stampa la nota attiva", "export-active-note-as-pdf": "Esporta la nota attiva come PDF", - "open-note-externally": "Apri Esternamente la Nota", + "open-note-externally": "Apri la nota esternamente", "run-active-note": "Esegui la Nota Attiva", - "render-active-note": "Presenta la Nota Attiva" + "render-active-note": "Renderizza nota attiva", + "back-in-note-history": "Torna alla cronologia della nota", + "forward-in-note-history": "Avanti nella cronologia della nota", + "jump-to-note": "Vai a...", + "command-palette": "Menù dei comandi", + "scroll-to-active-note": "Scorri alla nota attiva", + "quick-search": "Ricerca rapida", + "search-in-subtree": "Ricerca in sotto-albero", + "expand-subtree": "Espandi sotto-albero", + "collapse-tree": "Comprimi albero", + "collapse-subtree": "Comprimi sotto-albero", + "sort-child-notes": "Ordina le note figlie", + "create-note-after": "Crea nota dopo", + "create-note-into": "Crea nota dentro", + "create-note-into-inbox": "Crea nota in Inbox", + "delete-notes": "Elimina note", + "move-note-up": "Sposta nota in alto", + "move-note-down": "Sposta nota in basso", + "move-note-up-in-hierarchy": "Sposta nota in alto nella gerarchia", + "move-note-down-in-hierarchy": "Sposta nota in basso nella gerarchia", + "edit-note-title": "Modifica il titolo della nota", + "edit-branch-prefix": "Modifica il prefisso del ramo", + "clone-notes-to": "Clona note in", + "move-notes-to": "Sposta note in", + "copy-notes-to-clipboard": "Copia note negli appunti", + "paste-notes-from-clipboard": "Incolla note dagli appunti", + "cut-notes-to-clipboard": "Taglia note negli appunti", + "select-all-notes-in-parent": "Seleziona tutte le note al livello superiore", + "add-note-above-to-selection": "Aggiungi una nota sopra la selezione", + "add-note-below-to-selection": "Aggiungi nota sotto la selezione", + "duplicate-subtree": "Duplica sotto-albero", + "open-new-tab": "Apri nuova scheda", + "close-active-tab": "Chiudi scheda attiva", + "reopen-last-tab": "Apri ultima scheda", + "activate-next-tab": "Attiva scheda seguente", + "activate-previous-tab": "Attiva scheda precedente", + "open-new-window": "Apri nuova finestra", + "switch-to-first-tab": "Vai alla prima scheda", + "switch-to-second-tab": "Vai alla seconda scheda", + "switch-to-third-tab": "Vai alla terza scheda", + "switch-to-fourth-tab": "Vai alla quarta scheda", + "switch-to-fifth-tab": "Vai alla quinta scheda", + "switch-to-sixth-tab": "Vai alla sesta scheda", + "switch-to-seventh-tab": "Vai alla settima scheda", + "switch-to-eighth-tab": "Vai alla ottava scheda", + "switch-to-ninth-tab": "Vai alla nona scheda", + "switch-to-last-tab": "Vai all'ultima scheda", + "show-note-source": "Mostra sorgente della nota", + "show-options": "Mostra opzioni", + "show-revisions": "Mostra revisioni", + "show-recent-changes": "Mostra cambiamenti recenti", + "show-sql-console": "Mostra console SQL", + "show-backend-log": "Mostra log del backend", + "show-help": "Mostra aiuto", + "show-cheatsheet": "Mostra scheda riassuntiva", + "add-link-to-text": "Aggiungi un collegamento al testo", + "follow-link-under-cursor": "Segui collegamento sotto il cursore", + "insert-date-and-time-to-text": "Inserisci data ed ora nel testo", + "paste-markdown-into-text": "Incolla markdown nel testo", + "cut-into-note": "Taglia in una nota", + "add-include-note-to-text": "Aggiungi una nota inclusa nel testo", + "edit-read-only-note": "Modifica nota in sola lettura", + "add-new-label": "Aggiungi una nuova etichetta", + "add-new-relation": "Aggiungi una nuova relazione", + "toggle-ribbon-tab-classic-editor": "Mostra/Nascondi il nastro delle schede nell'editor classico", + "copy-without-formatting": "Copia senza formattazione", + "force-save-revision": "Forza il salvataggio della revisione", + "toggle-ribbon-tab-basic-properties": "Mostra/Nascondi le proprietà di base", + "toggle-ribbon-tab-book-properties": "Mostra/Nascondi le proprietà del libro", + "toggle-ribbon-tab-file-properties": "Mostra/Nascondi le proprietà del file", + "toggle-ribbon-tab-image-properties": "Mostra/Nascondi le proprietà dell'immagine", + "toggle-ribbon-tab-owned-attributes": "Mostra/Nascondi le proprietà proprie", + "toggle-ribbon-tab-inherited-attributes": "Mostra/Nascondi le proprietà ereditate", + "toggle-ribbon-tab-promoted-attributes": "Mostra/Nascondi le proprietà promosse", + "toggle-ribbon-tab-note-map": "Mostra/Nascondi la mappa delle note", + "toggle-ribbon-tab-note-info": "Mostra/Nascondi le informazioni sulla nota", + "toggle-ribbon-tab-note-paths": "Mostra/Nascondi i percorsi della nota", + "toggle-ribbon-tab-similar-notes": "Mostra/Nascondi le note simili" }, "hidden-subtree": { "options-title": "Opzioni", "appearance-title": "Aspetto", "shortcuts-title": "Scorciatoie", - "text-notes": "Note di Testo", - "code-notes-title": "Note di Codice", + "text-notes": "Note di testo", + "code-notes-title": "Note di codice", "images-title": "Immagini", - "spellcheck-title": "Controllo Ortografico", + "spellcheck-title": "Controllo ortografico", "password-title": "Password", - "multi-factor-authentication-title": "MFA", + "multi-factor-authentication-title": "Autenticazione a più fattori", "etapi-title": "ETAPI", - "backup-title": "Archiviazione", + "backup-title": "Backup", "sync-title": "Sincronizza", "ai-llm-title": "IA/LLM", "other": "Altro", "advanced-title": "Avanzato", - "user-guide": "Guida Utente", - "visible-launchers-title": "Lanciatori Visibili", - "localization": "Lingua e Regione", - "inbox-title": "Posta in arrivo" + "user-guide": "Guida utente", + "visible-launchers-title": "Scorciatoie visibili", + "localization": "Lingua e regione", + "inbox-title": "Posta in arrivo", + "root-title": "Note nascoste", + "search-history-title": "Storico delle ricerche", + "note-map-title": "Mappa delle note", + "sql-console-history-title": "Storico della console SQL", + "shared-notes-title": "Note condivise", + "bulk-action-title": "Azioni di gruppo", + "backend-log-title": "Log del backend", + "user-hidden-title": "Utente nascosto", + "launch-bar-templates-title": "Modelli di barra delle scorciatoie", + "base-abstract-launcher-title": "Scorciatoia di base astratta", + "command-launcher-title": "Avviatore di comandi", + "built-in-widget-title": "Widget integrato", + "spacer-title": "Separatore", + "custom-widget-title": "Widget personalizzato", + "launch-bar-title": "Barra delle scorciatoie", + "available-launchers-title": "Barre delle scorciatoie disponibili", + "go-to-previous-note-title": "Vai alla nota precedente", + "go-to-next-note-title": "Vai alla nota successiva", + "new-note-title": "Nuova nota", + "search-notes-title": "Ricerca note", + "jump-to-note-title": "Vai a...", + "calendar-title": "Calendario", + "recent-changes-title": "Cambiamenti recenti", + "bookmarks-title": "Segnalibri", + "open-today-journal-note-title": "Apri la nota di oggi", + "quick-search-title": "Ricerca rapida", + "protected-session-title": "Sessione Protetta", + "sync-status-title": "Stato della sincronizzazione", + "settings-title": "Impostazioni", + "llm-chat-title": "Parla con Notes", + "note-launcher-title": "Scorciatoie delle note", + "script-launcher-title": "Scorciatoie degli script" }, "notes": { "new-note": "Nuova nota", @@ -69,7 +178,7 @@ "open_new_window": "Aprire una nuova finestra" }, "migration": { - "old_version": "La migrazione diretta dalla tua versione attuale non è supportata. Si prega di aggiornare prima all'ultima versione v0.60.4 e solo dopo a questa versione.", + "old_version": "La migrazione diretta dalla tua versione attuale non è supportata. Aggiorna prima all'ultima versione v0.60.4 e solo dopo a questa versione.", "error_message": "Errore durante la migrazione alla versione {{version}}: {{stack}}", "wrong_db_version": "La versione del database ({{version}}) è più recente di quanto l'applicazione si aspetti ({{targetVersion}}), il che significa che è stato creato da una versione più nuova e incompatibile di Trilium. Aggiorna Trilium all'ultima versione per risolvere questo problema." }, @@ -77,30 +186,35 @@ "error_title": "Errore" }, "share_theme": { - "site-theme": "Tema del Sito", - "search_placeholder": "Cerca..." + "site-theme": "Tema del sito", + "search_placeholder": "Cerca...", + "image_alt": "Immagine dell'articolo", + "last-updated": "Ultimo aggiornamento il {{- date}}", + "subpages": "Sottopagine:", + "on-this-page": "In questa pagina", + "expand": "Espandi" }, "keyboard_actions": { - "back-in-note-history": "Navigare alla nota precedente della cronologia", - "forward-in-note-history": "Navigare alla prossima nota della cronologia", + "back-in-note-history": "Naviga alla nota precedente della cronologia", + "forward-in-note-history": "Naviga alla prossima nota della cronologia", "open-jump-to-note-dialog": "Apri la finestra di dialogo \"Salta alla nota\"", - "open-command-palette": "Apri la palette dei comandi", + "open-command-palette": "Apri il menù dei comandi", "scroll-to-active-note": "Scorri l'albero fino alla nota attiva", "quick-search": "Attiva la barra di ricerca rapida", - "search-in-subtree": "Cerca le note nel sotto albero della nota attiva", - "expand-subtree": "Espande il sotto albero della nota corrente", - "collapse-tree": "Contrae l'albero completo delle note", - "collapse-subtree": "Contrae il sotto albero della nota corrente", + "search-in-subtree": "Cerca le note nel sotto-albero della nota attiva", + "expand-subtree": "Espandi il sotto-albero della nota corrente", + "collapse-tree": "Comprime l'albero completo delle note", + "collapse-subtree": "Comprime il sotto-albero della nota corrente", "sort-child-notes": "Ordina le note figlio", "creating-and-moving-notes": "Crea e sposta le note", "create-note-after": "Crea una nota dopo quella attiva", "create-note-into": "Crea una nota come figlia di quella attiva", - "create-note-into-inbox": "Creare una nota nella casella di posta (se definita) o nella nota del giorno", - "delete-note": "Elimina una nota", - "move-note-up": "Sposta su una nota", - "move-note-down": "Sposta giù una nota", + "create-note-into-inbox": "Crea una nota nella casella di posta (se definita) o nella nota del giorno", + "delete-note": "Elimina la nota", + "move-note-up": "Sposta su la nota", + "move-note-down": "Sposta giù la nota", "move-note-up-in-hierarchy": "Sposta su la nota nella gerarchia", - "move-note-down-in-hierarchy": "Sposta giù una nota nella gerarchia", + "move-note-down-in-hierarchy": "Sposta giù la nota nella gerarchia", "edit-note-title": "Salta dall'albero al dettaglio della nota e modifica il titolo", "edit-branch-prefix": "Mostra la finestra di dialogo \"Modifica il prefisso del ramo\"", "clone-notes-to": "Clona le note selezionate", @@ -112,7 +226,7 @@ "select-all-notes-in-parent": "Seleziona tutte le note dal livello di nota corrente", "add-note-above-to-the-selection": "Aggiungi una nota sopra alla selezione", "add-note-below-to-selection": "Aggiungi una nota sotto alla selezione", - "duplicate-subtree": "Duplica il sotto albero", + "duplicate-subtree": "Duplica il sotto-albero", "tabs-and-windows": "Schede e Finestre", "open-new-tab": "Apri una nuova scheda", "close-active-tab": "Chiudi la scheda attiva", @@ -132,13 +246,13 @@ "ninth-tab": "Attiva la nona scheda nella lista", "last-tab": "Attiva l'ultima scheda nell'elenco", "dialogs": "Finestre di dialogo", - "show-note-source": "Mostra la finestra di dialogo \"Sorgente della Nota\"", + "show-note-source": "Mostra la finestra di dialogo \"Sorgente della nota\"", "show-options": "Apri la pagina \"Opzioni\"", - "show-revisions": "Mostra la finestra di dialogo \"Revisione della Nota\"", - "show-recent-changes": "Mostra la finestra di dialogo \"Modifiche Recenti\"", + "show-revisions": "Mostra la finestra di dialogo \"Revisione della nota\"", + "show-recent-changes": "Mostra la finestra di dialogo \"Modifiche recenti\"", "show-sql-console": "Apri la pagina \"Console SQL\"", - "show-backend-log": "Apri la pagina \"Log del Backend\"", - "show-help": "Apri la Guida Utente integrata", + "show-backend-log": "Apri la pagina \"Log del backend\"", + "show-help": "Apri la guida utente integrata", "show-cheatsheet": "Mostra una finestra modale con le operazioni comuni da tastiera", "text-note-operations": "Operazioni sulle note di testo", "add-link-to-text": "Apri la finestra di dialogo per aggiungere il collegamento al testo", @@ -151,17 +265,175 @@ "attributes-labels-and-relations": "Attributi (etichette e relazioni)", "add-new-label": "Crea una nuova etichetta", "create-new-relation": "Crea una nuova relazione", - "ribbon-tabs": "Nastro delle schede", - "toggle-basic-properties": "Mostra/nascondi le Proprietà di Base", - "toggle-file-properties": "Attiva Proprietà del file", - "toggle-image-properties": "Attiva Proprietà Immagine", - "toggle-owned-attributes": "Attiva Attributi Propri", - "toggle-inherited-attributes": "Attiva Attributi Ereditati", - "toggle-promoted-attributes": "Attiva Attributi Promossi", - "toggle-link-map": "Attiva Mappa Link", - "toggle-note-info": "Attiva Informazioni Nota", - "toggle-note-paths": "Attiva Percorsi Note", - "toggle-similar-notes": "Attiva Note Simili", - "other": "Altro" + "ribbon-tabs": "Barra delle schede", + "toggle-basic-properties": "Mostra/Nascondi le proprietà di base", + "toggle-file-properties": "Mostra/Nascondi le proprietà del file", + "toggle-image-properties": "Mostra/Nascondi le proprietà dell'immagine", + "toggle-owned-attributes": "Mostra/Nascondi gli attributi propri", + "toggle-inherited-attributes": "Mostra/Nascondi gli attributi ereditati", + "toggle-promoted-attributes": "Mostra/Nascondi gli attributi promossi", + "toggle-link-map": "Mostra/Nascondi la mappa dei collegamenti", + "toggle-note-info": "Mostra/Nascondi le informazioni sulla nota", + "toggle-note-paths": "Mostra/Nascondi i percorsi della nota", + "toggle-similar-notes": "Mostra/Nascondi note simili", + "other": "Altro", + "toggle-right-pane": "Attiva/Disattiva la visualizzazione del riquadro destro, che include l'indice e gli elementi evidenziati", + "print-active-note": "Stampa nota attiva", + "open-note-externally": "Apri nota come file con l'applicazione predefinita", + "reload-frontend-app": "Ricarica frontend", + "open-dev-tools": "Apri strumenti di svilippo", + "toggle-full-screen": "Attiva la modalità a schermo intero", + "zoom-out": "Rimpicciolisci", + "zoom-in": "Ingrandisci", + "render-active-note": "Elabora (ri-elabora) la nota corrente", + "run-active-note": "Esegui nota JavaScript corrente (frontend/backend)", + "toggle-note-hoisting": "Cambia l'ancoraggio della nota corrente", + "find-in-text": "Mostra/Nascondi pannello di ricerca", + "note-navigation": "Navigazione note", + "reset-zoom-level": "Reimposta il livello di ingrandimento", + "copy-without-formatting": "Copia il testo selezionato senza formattazione", + "force-save-revision": "Forza la creazione o il salvataggio di una nuova revisione della nota corrente", + "toggle-book-properties": "Mostra/Nascondi le proprietà della collezione", + "export-as-pdf": "Esporta la nota corrente come PDF", + "toggle-zen-mode": "Abilita/disabilita la modalità Zen (Interfaccia minimale per una scrittura senza distrazioni)", + "toggle-left-note-tree-panel": "Mostra/Nascondi il pannello di sinistra (albero delle note)", + "toggle-classic-editor-toolbar": "Mostra/Nascondi il pannello della formattazione per l'editor con la barra degli strumenti fissa", + "unhoist": "Rimuovi qualsiasi ancoraggio" + }, + "desktop": { + "instance_already_running": "C'è già una istanza in esecuzione, verrà mostrata." + }, + "login": { + "title": "Accedi", + "heading": "Trilium", + "incorrect-totp": "Il codice TOTP è errato. Riprovare.", + "incorrect-password": "Le credenziali sono errate. Riprovare.", + "password": "Password", + "remember-me": "Ricorda l'accesso", + "button": "Accedi", + "sign_in_with_sso": "Accedi con {{ ssoIssuerName }}" + }, + "set_password": { + "title": "Imposta password", + "heading": "Imposta password", + "description": "Prima di poter usare Trilium dal web, occorre impostare una password. Questa password sarà necessaria per accedere.", + "password": "Password", + "password-confirmation": "Conferma della password", + "button": "Imposta password" + }, + "javascript-required": "Trilium richiede JavaScript abilitato per funzionare.", + "setup": { + "heading": "Configurazione di Trilium Notes", + "new-document": "Sono un nuovo utente, e desidero creare un nuovo documento Trilium per le mie note", + "sync-from-desktop": "Ho già una istanza desktop, e desidero configurare la sincronizzazione con quest'ultima", + "sync-from-server": "Ho già una istanza server, e desidero configurare la sincronizzazione con quest'ultima", + "next": "Avanti", + "init-in-progress": "Inizializzazione del documento in corso", + "redirecting": "Sarai reindirizzato a breve all'applicazione.", + "title": "Configurazione" + }, + "setup_sync-from-desktop": { + "heading": "Sincronizza dal desktop", + "description": "Questa configurazione deve essere iniziata dalla istanza desktop:", + "step1": "Apri la tua istanza desktop di Trilium Notes.", + "step2": "Dal menù di Trilium, seleziona \"Opzioni\".", + "step3": "Clicca sulla categoria \"Sincronizzazione\".", + "step4": "Imposta \"{{- host}}\" come l'indirizzo dell'istanza server e clicca \"Salva\".", + "step5": "Clicca \"Prova sincronizzazione\" per verificare la connessione.", + "step6": "Dopo aver completato questi passaggi, clicca {{- link}}.", + "step6-here": "qui" + }, + "setup_sync-from-server": { + "heading": "Sincronizza dal server", + "instructions": "Inserire l'indirizzo e le credenziali del server Trilium. L'intero documento Trilium verrà scaricato dal server, e sarà configurata la sincronizzazione allo stesso. L'operazione potrebbe impiegare un po' di tempo, in base alla velocità della connessione e alla dimensione del documento.", + "server-host": "Indirizzo del server Trilium", + "server-host-placeholder": "https://:", + "proxy-server": "Server proxy (facoltativo)", + "proxy-server-placeholder": "https://:", + "note": "Note:", + "proxy-instruction": "Se il campo del proxy viene lasciato vuoto, il proxy di sistema verrà utilizzato (si applica solo all'applicazione desktop)", + "password": "Password", + "password-placeholder": "Password", + "back": "Indietro", + "finish-setup": "Termina configurazione" + }, + "setup_sync-in-progress": { + "heading": "Sincronizzazione in corso", + "successful": "La sincronizzazione è stata configurata correttamente. Ci potrebbe volere un po' di tempo prima che la sincronizzazione iniziale termini. Appena sarà terminata, sarai ri-indirizzato alla pagina di accesso.", + "outstanding-items": "Elementi eccezionali in sincronizzazione:", + "outstanding-items-default": "N/A" + }, + "share_404": { + "title": "Pagina non trovata", + "heading": "Pagina non trovata" + }, + "share_page": { + "parent": "padre:", + "clipped-from": "Questa nota è stata estratta inizialmente da {{- url}}", + "child-notes": "Note figlie:", + "no-content": "Questa nota è vuota." + }, + "weekdays": { + "monday": "Lunedì", + "tuesday": "Martedì", + "wednesday": "Mercoledì", + "thursday": "Giovedì", + "friday": "Venerdì", + "saturday": "Sabato", + "sunday": "Domenica" + }, + "weekdayNumber": "Settimana n. {weekNumber}", + "months": { + "january": "Gennaio", + "february": "Febbraio", + "march": "Marzo", + "april": "Aprile", + "may": "Maggio", + "june": "Giugno", + "july": "Luglio", + "august": "Agosto", + "september": "Settembre", + "october": "Ottobre", + "november": "Novembre", + "december": "Dicembre" + }, + "quarterNumber": "Quadrimestre n. {quarterNumber}", + "special_notes": { + "search_prefix": "Ricerca:" + }, + "test_sync": { + "not-configured": "L'host del server di sincronizzazione non è impostato. Configurare prima la sincronizzazione.", + "successful": "La sessione con il server di sincronizzazione è stata stabilita con successo. La sincronizzazione è iniziata." + }, + "hidden_subtree_templates": { + "text-snippet": "Frammento di testo", + "description": "Descrizione", + "list-view": "Vista elenco", + "grid-view": "Vista griglia", + "calendar": "Calendario", + "table": "Tabella", + "geo-map": "Mappa geografica", + "start-date": "Data di inizio", + "end-date": "Data di fine", + "start-time": "Ora di inizio", + "end-time": "Ora di fine", + "geolocation": "Geolocalizzazione", + "built-in-templates": "Modelli integrati", + "board": "Tavola", + "status": "Stato", + "board_note_first": "Prima nota", + "board_note_second": "Seconda nota", + "board_note_third": "Terza nota", + "board_status_todo": "Da fare", + "board_status_progress": "In avanzamento", + "board_status_done": "Conclusi", + "presentation": "Presentazione", + "presentation_slide": "Diapositiva di presentazione", + "presentation_slide_first": "Prima diapositiva", + "presentation_slide_second": "Seconda diapositiva" + }, + "sql_init": { + "db_not_initialized_desktop": "Database non inizializzato, seguire le istruzioni a schermo.", + "db_not_initialized_server": "Database non inizializzato, visitare la pagina di configurazione - http://[host-del-tuo-server]:{{port}} per ricevere istruzioni su come inizializzare Trilium." } } diff --git a/apps/server/src/assets/translations/ja/server.json b/apps/server/src/assets/translations/ja/server.json index cdf149cdc..8ceb8a5f9 100644 --- a/apps/server/src/assets/translations/ja/server.json +++ b/apps/server/src/assets/translations/ja/server.json @@ -22,7 +22,7 @@ "move-notes-to": "選択したノートを移動", "copy-notes-to-clipboard": "選択したノートをクリップボードにコピー", "paste-notes-from-clipboard": "クリップボードからアクティブなノートにノートを貼り付け", - "cut-notes-to-clipboard": "選択したノートをクリップボードにカット", + "cut-notes-to-clipboard": "選択したノートをクリップボードに切り取り", "select-all-notes-in-parent": "現在のノートレベルと同じノートをすべて選択する", "add-note-above-to-the-selection": "上のノートを選択範囲に追加", "add-note-below-to-selection": "下のノートを選択範囲に追加", @@ -101,16 +101,16 @@ "toggle-book-properties": "コレクションプロパティ切り替え", "toggle-zen-mode": "禅モード(集中した編集のための最小限のUI)を有効/無効にする", "add-include-note-to-text": "ノートを埋め込むダイアログを開く", - "toggle-promoted-attributes": "プロモートされた属性をトグルする", + "toggle-promoted-attributes": "プロモート属性切り替え", "force-save-revision": "アクティブノートの新しいノートリヴィジョンを強制する", - "toggle-classic-editor-toolbar": "固定ツールバーを持ったエディターのフォーマットタブをトグルする" + "toggle-classic-editor-toolbar": "固定ツールバーエディターの書式設定タブ切り替え" }, "keyboard_action_names": { "back-in-note-history": "ノートの履歴を戻る", "forward-in-note-history": "ノートの履歴を進む", "command-palette": "コマンドパレット", "scroll-to-active-note": "アクティブノートまでスクロール", - "quick-search": "クイックサーチ", + "quick-search": "クイック検索", "search-in-subtree": "サブツリー内を検索", "expand-subtree": "サブツリーを展開", "collapse-subtree": "サブツリーを折りたたむ", @@ -128,7 +128,7 @@ "move-notes-to": "ノートを移動", "copy-notes-to-clipboard": "ノートをクリップボードにコピー", "paste-notes-from-clipboard": "クリップボードからノートを貼り付け", - "cut-notes-to-clipboard": "ノートをクリップボードにカット", + "cut-notes-to-clipboard": "ノートをクリップボードに切り取り", "select-all-notes-in-parent": "親ノート内のすべてのノートを選択", "add-note-above-to-selection": "選択範囲に上のノートを追加", "add-note-below-to-selection": "選択範囲に下のノートを追加", @@ -200,7 +200,7 @@ "force-save-revision": "強制保存リビジョン", "add-include-note-to-text": "埋め込みノートを追加", "toggle-ribbon-tab-classic-editor": "リボンタブのクラシックエディターに切り替える", - "toggle-ribbon-tab-promoted-attributes": "リボンタブのプロモート属性を切り替える" + "toggle-ribbon-tab-promoted-attributes": "リボンタブ切り替え:プロモート属性" }, "login": { "title": "ログイン", @@ -312,7 +312,7 @@ "new-note-title": "新しいノート", "bookmarks-title": "ブックマーク", "open-today-journal-note-title": "今日の日記を開く", - "quick-search-title": "クイックサーチ", + "quick-search-title": "クイック検索", "recent-changes-title": "最近の変更", "root-title": "隠されたノート", "note-map-title": "ノートマップ", @@ -361,7 +361,8 @@ "export_filter": "PDFドキュメント (*.pdf)", "unable-to-export-message": "現在のノートをPDFとしてエクスポートできませんでした。", "unable-to-export-title": "PDFとしてエクスポートできません", - "unable-to-save-message": "選択されたファイルに書き込めませんでした。もう一度試すか、別の保存先を選択してください。" + "unable-to-save-message": "選択されたファイルに書き込めませんでした。もう一度試すか、別の保存先を選択してください。", + "unable-to-print": "ノートを印刷できません" }, "tray": { "tooltip": "Trilium Notes", @@ -411,7 +412,12 @@ "geo-map": "ジオマップ", "geolocation": "ジオロケーション", "built-in-templates": "内蔵のテンプレート", - "board_status_todo": "未完了" + "board_status_todo": "未完了", + "presentation": "プレゼンテーション", + "presentation_slide": "プレゼンテーションスライド", + "presentation_slide_first": "最初のスライド", + "presentation_slide_second": "2番目のスライド", + "background": "背景" }, "share_404": { "title": "該当なし", diff --git a/apps/server/src/assets/translations/pl/server.json b/apps/server/src/assets/translations/pl/server.json index 5fc0f3e95..2838d138c 100644 --- a/apps/server/src/assets/translations/pl/server.json +++ b/apps/server/src/assets/translations/pl/server.json @@ -13,7 +13,7 @@ "sort-child-notes": "Sortuj podnotatki", "creating-and-moving-notes": "Tworzenie oraz przestawianie notatek", "create-note-after": "Utwórz notatkę po aktywnej notatce", - "create-note-into": "Utwórz notatkę jako podnotatka aktywnej notatki", + "create-note-into": "Utwórz notatkę jako pod-notatka aktywnej notatki", "create-note-into-inbox": "Utwórz notatkę w skrzyncę (jeśli zdefiniowana) lub jako notatka dnia", "delete-note": "Usuń notatkę", "move-note-up": "Przestaw notatkę wyżej", diff --git a/apps/server/src/assets/translations/ro/server.json b/apps/server/src/assets/translations/ro/server.json index c0eb7c4ae..5ed87626d 100644 --- a/apps/server/src/assets/translations/ro/server.json +++ b/apps/server/src/assets/translations/ro/server.json @@ -423,7 +423,11 @@ "board_note_third": "A treia notiță", "board_status_todo": "De făcut", "board_status_progress": "În lucru", - "board_status_done": "Finalizat" + "board_status_done": "Finalizat", + "presentation": "Prezentare", + "presentation_slide": "Slide de prezentare", + "presentation_slide_first": "Primul slide", + "presentation_slide_second": "Al doilea slide" }, "sql_init": { "db_not_initialized_desktop": "Baza de date nu este inițializată, urmați instrucțiunile de pe ecran.", diff --git a/apps/server/src/assets/translations/sv/server.json b/apps/server/src/assets/translations/sv/server.json new file mode 100644 index 000000000..0fc334731 --- /dev/null +++ b/apps/server/src/assets/translations/sv/server.json @@ -0,0 +1,7 @@ +{ + "keyboard_actions": { + "back-in-note-history": "Gå till föregående anteckning i historiken", + "forward-in-note-history": "Gå till nästa anteckning i historiken", + "open-jump-to-note-dialog": "Öppna \"Hoppa till anteckning\" dialog" + } +} diff --git a/apps/server/src/assets/translations/tr/server.json b/apps/server/src/assets/translations/tr/server.json index 0967ef424..2ee2a7721 100644 --- a/apps/server/src/assets/translations/tr/server.json +++ b/apps/server/src/assets/translations/tr/server.json @@ -1 +1,6 @@ -{} +{ + "keyboard_actions": { + "back-in-note-history": "Geçmişteki önceki nota git", + "forward-in-note-history": "Geçmişteki sonraki nota git" + } +} diff --git a/apps/server/src/assets/translations/tw/server.json b/apps/server/src/assets/translations/tw/server.json index cf9917a21..b4ad3e966 100644 --- a/apps/server/src/assets/translations/tw/server.json +++ b/apps/server/src/assets/translations/tw/server.json @@ -373,7 +373,8 @@ "export_filter": "PDF 文件 (*.pdf)", "unable-to-export-message": "目前筆記無法被匯出為 PDF 。", "unable-to-export-title": "無法匯出為 PDF", - "unable-to-save-message": "所選檔案無法被寫入。請重試或選擇其他路徑。" + "unable-to-save-message": "所選檔案無法被寫入。請重試或選擇其他路徑。", + "unable-to-print": "無法列印筆記" }, "tray": { "tooltip": "Trilium 筆記", @@ -423,7 +424,12 @@ "board_note_third": "第三個筆記", "board_status_todo": "待辦", "board_status_progress": "進行中", - "board_status_done": "已完成" + "board_status_done": "已完成", + "presentation": "簡報", + "presentation_slide": "簡報投影片", + "presentation_slide_first": "第一張投影片", + "presentation_slide_second": "第二張投影片", + "background": "背景" }, "sql_init": { "db_not_initialized_desktop": "資料庫尚未初始化,請依螢幕指示操作。", diff --git a/apps/server/src/assets/translations/vi/server.json b/apps/server/src/assets/translations/vi/server.json index 8b0479d17..ced460cb3 100644 --- a/apps/server/src/assets/translations/vi/server.json +++ b/apps/server/src/assets/translations/vi/server.json @@ -1,7 +1,23 @@ { "keyboard_actions": { - "delete-note": "Xoá ghi chép", + "delete-note": "Xoá ghi chú", "move-notes-to": "Di chuyển ghi chép được chọn", - "back-in-note-history": "Điều hướng đến ghi chú trước đó trong lịch sử" + "back-in-note-history": "Điều hướng đến ghi chú trước đó trong lịch sử", + "forward-in-note-history": "Chuyển hướng đến ghi chú tiếp theo trong lịch sử", + "open-jump-to-note-dialog": "Mở hộp thoại \"Jump to note\"", + "open-command-palette": "Mở bảng lệnh", + "scroll-to-active-note": "Cuộn cây ghi chú đến ghi chú đang sử dụng", + "quick-search": "Kích hoạt thanh tìm kiếm nhanh", + "search-in-subtree": "Tìm kiếm các ghi chú trong cây con của ghi chú hiện tại", + "expand-subtree": "Mở rộng cây con của ghi chú hiện tại", + "collapse-tree": "Thu gọn toàn bộ cây ghi chú", + "collapse-subtree": "Thu gọn cây con của ghi chú hiện tại", + "sort-child-notes": "Sắp xếp các ghi chú con", + "creating-and-moving-notes": "Tạo và di chuyển ghi chú", + "create-note-after": "Tạo ghi chú sau ghi chú hiện tại", + "create-note-into": "Tạo ghi chú con cho ghi chú hiện tại", + "create-note-into-inbox": "Tạo một ghi chú trong thư mục đầu vào (nếu được khai báo) hoặc ghi chú của ngày", + "move-note-up": "Chuyển ghi chú lên", + "move-note-down": "Chuyển ghi chú xuống" } } diff --git a/apps/server/src/assets/views/partials/windowGlobal.ejs b/apps/server/src/assets/views/partials/windowGlobal.ejs index 3536d5265..c69351e1a 100644 --- a/apps/server/src/assets/views/partials/windowGlobal.ejs +++ b/apps/server/src/assets/views/partials/windowGlobal.ejs @@ -3,7 +3,7 @@ window.glob = { device: "<%= device %>", - baseApiUrl: 'api/', + baseApiUrl: "<%= baseApiUrl %>", activeDialog: null, maxEntityChangeIdAtLoad: <%= maxEntityChangeIdAtLoad %>, maxEntityChangeSyncIdAtLoad: <%= maxEntityChangeSyncIdAtLoad %>, diff --git a/apps/server/src/assets/views/print.ejs b/apps/server/src/assets/views/print.ejs new file mode 100644 index 000000000..c1808e507 --- /dev/null +++ b/apps/server/src/assets/views/print.ejs @@ -0,0 +1,32 @@ + + + + + + + + + + Trilium Notes + + + + + + + +<%- include("./partials/windowGlobal.ejs", locals) %> + + + + + + + + diff --git a/apps/server/src/routes/index.ts b/apps/server/src/routes/index.ts index 6bede94d7..ea4821e3a 100644 --- a/apps/server/src/routes/index.ts +++ b/apps/server/src/routes/index.ts @@ -16,9 +16,11 @@ import type { Request, Response } from "express"; import type BNote from "../becca/entities/bnote.js"; import { getCurrentLocale } from "../services/i18n.js"; +type View = "desktop" | "mobile" | "print"; + function index(req: Request, res: Response) { - const options = optionService.getOptionMap(); const view = getView(req); + const options = optionService.getOptionMap(); //'overwrite' set to false (default) => the existing token will be re-used and validated //'validateOnReuse' set to false => if validation fails, generate a new token instead of throwing an error @@ -57,13 +59,19 @@ function index(req: Request, res: Response) { isProtectedSessionAvailable: protectedSessionService.isProtectedSessionAvailable(), maxContentWidth: Math.max(640, parseInt(options.maxContentWidth)), triliumVersion: packageJson.version, - assetPath: assetPath, - appPath: appPath, + assetPath, + appPath, + baseApiUrl: 'api/', currentLocale: getCurrentLocale() }); } -function getView(req: Request): "desktop" | "mobile" { +function getView(req: Request): View { + // Special override for printing. + if ("print" in req.query) { + return "print"; + } + // Electron always uses the desktop view. if (isElectron) { return "desktop"; diff --git a/apps/server/src/routes/routes.ts b/apps/server/src/routes/routes.ts index f1aeb9209..9ba6b686c 100644 --- a/apps/server/src/routes/routes.ts +++ b/apps/server/src/routes/routes.ts @@ -378,8 +378,6 @@ function register(app: express.Application) { asyncApiRoute(PST, "/api/llm/chat/:chatNoteId/messages", llmRoute.sendMessage); asyncApiRoute(PST, "/api/llm/chat/:chatNoteId/messages/stream", llmRoute.streamMessage); - - // LLM provider endpoints - moved under /api/llm/providers hierarchy asyncApiRoute(GET, "/api/llm/providers/ollama/models", ollamaRoute.listModels); asyncApiRoute(GET, "/api/llm/providers/openai/models", openaiRoute.listModels); diff --git a/apps/server/src/services/date_notes.ts b/apps/server/src/services/date_notes.ts index afec6c882..7b8849b2d 100644 --- a/apps/server/src/services/date_notes.ts +++ b/apps/server/src/services/date_notes.ts @@ -16,10 +16,12 @@ import searchService from "../services/search/services/search.js"; import sql from "./sql.js"; import { t } from "i18next"; import { ordinal } from "./i18n.js"; +import isoWeek from "dayjs/plugin/isoWeek.js"; dayjs.extend(isSameOrAfter); dayjs.extend(quarterOfYear); dayjs.extend(advancedFormat); +dayjs.extend(isoWeek); const CALENDAR_ROOT_LABEL = "calendarRoot"; const YEAR_LABEL = "yearNote"; @@ -295,88 +297,16 @@ function getMonthNote(dateStr: string, _rootNote: BNote | null = null): BNote { } function getWeekStartDate(date: Dayjs): Dayjs { - const day = date.day(); - let diff: number; - - if (optionService.getOption("firstDayOfWeek") === "0") { // Sunday - diff = date.date() - day + (day === 0 ? -6 : 1); // adjust when day is sunday - } else { // Monday - diff = date.date() - day; - } - - const startDate = date.clone().date(diff); - return startDate; + const firstDayISO = parseInt(optionService.getOptionOrNull("firstDayOfWeek") ?? "1", 10); + const day = date.isoWeekday(); + const diff = (day - firstDayISO + 7) % 7; + return date.clone().subtract(diff, "day").startOf("day"); } -// TODO: Duplicated with getWeekNumber in src/public/app/widgets/buttons/calendar.ts -// Maybe can be merged later in monorepo setup function getWeekNumberStr(date: Dayjs): string { - const year = date.year(); - const dayOfWeek = (day: number) => - (day - parseInt(optionService.getOption("firstDayOfWeek")) + 7) % 7; - - // Get first day of the year and adjust to first week start - const jan1 = date.clone().year(year).month(0).date(1); - const jan1Weekday = jan1.day(); - const dayOffset = dayOfWeek(jan1Weekday); - let firstWeekStart = jan1.clone().subtract(dayOffset, "day"); - - // Adjust based on week rule - switch (parseInt(optionService.getOption("firstWeekOfYear"))) { - case 1: { // ISO 8601: first week contains Thursday - const thursday = firstWeekStart.clone().add(3, "day"); // Monday + 3 = Thursday - if (thursday.year() < year) { - firstWeekStart = firstWeekStart.add(7, "day"); - } - break; - } - case 2: { // minDaysInFirstWeek rule - const daysInFirstWeek = 7 - dayOffset; - if (daysInFirstWeek < parseInt(optionService.getOption("minDaysInFirstWeek"))) { - firstWeekStart = firstWeekStart.add(7, "day"); - } - break; - } - // default case 0: week containing Jan 1 → already handled - } - - const diffDays = date.startOf("day").diff(firstWeekStart.startOf("day"), "day"); - const weekNumber = Math.floor(diffDays / 7) + 1; - - // Handle case when date is before first week start → belongs to last week of previous year - if (weekNumber <= 0) { - return getWeekNumberStr(date.subtract(1, "day")); - } - - // Handle case when date belongs to first week of next year - const nextYear = year + 1; - const jan1Next = date.clone().year(nextYear).month(0).date(1); - const jan1WeekdayNext = jan1Next.day(); - const offsetNext = dayOfWeek(jan1WeekdayNext); - let nextYearWeekStart = jan1Next.clone().subtract(offsetNext, "day"); - - switch (parseInt(optionService.getOption("firstWeekOfYear"))) { - case 1: { - const thursday = nextYearWeekStart.clone().add(3, "day"); - if (thursday.year() < nextYear) { - nextYearWeekStart = nextYearWeekStart.add(7, "day"); - } - break; - } - case 2: { - const daysInFirstWeek = 7 - offsetNext; - if (daysInFirstWeek < parseInt(optionService.getOption("minDaysInFirstWeek"))) { - nextYearWeekStart = nextYearWeekStart.add(7, "day"); - } - break; - } - } - - if (date.isSameOrAfter(nextYearWeekStart)) { - return `${nextYear}-W01`; - } - - return `${year}-W${weekNumber.toString().padStart(2, "0")}`; + const isoYear = date.isoWeekYear(); + const isoWeekNum = date.isoWeek(); + return `${isoYear}-W${isoWeekNum.toString().padStart(2, "0")}`; } function getWeekFirstDayNote(dateStr: string, rootNote: BNote | null = null) { diff --git a/apps/server/src/services/export/single.spec.ts b/apps/server/src/services/export/single.spec.ts index cf9d391fc..a7c8118ae 100644 --- a/apps/server/src/services/export/single.spec.ts +++ b/apps/server/src/services/export/single.spec.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from "vitest"; -import BNote from "../../becca/entities/bnote.js"; import { mapByNoteType } from "./single.js"; +import { buildNote } from "../../test/becca_easy_mocking.js"; describe("Note type mappings", () => { it("supports mermaid note", () => { - const note = new BNote({ + const note = buildNote({ type: "mermaid", title: "New note" }); diff --git a/apps/server/src/services/hidden_subtree.ts b/apps/server/src/services/hidden_subtree.ts index 5d8854aaa..1013d16fc 100644 --- a/apps/server/src/services/hidden_subtree.ts +++ b/apps/server/src/services/hidden_subtree.ts @@ -345,24 +345,31 @@ function checkHiddenSubtreeRecursively(parentNoteId: string, item: HiddenSubtree let branch; if (!note) { + // Missing item, add it. ({ note, branch } = noteService.createNewNote({ noteId: item.id, title: item.title, type: item.type, parentNoteId: parentNoteId, - content: "", + content: item.content ?? "", ignoreForbiddenParents: true })); } else { + // Existing item, check if it's in the right state. branch = note.getParentBranches().find((branch) => branch.parentNoteId === parentNoteId); + if (item.content && note.getContent() !== item.content) { + log.info(`Updating content of ${item.id}.`); + note.setContent(item.content); + } + // Clean up any branches that shouldn't exist according to the meta definition // For hidden subtree notes, we want to ensure they only exist in their designated locations if (item.enforceBranches || item.id.startsWith("_help")) { // If the note exists but doesn't have a branch in the expected parent, // create the missing branch to ensure it's in the correct location if (!branch) { - console.log("Creating missing branch for note", item.id, "under parent", parentNoteId); + log.info(`Creating missing branch for note ${item.id} under parent ${parentNoteId}.`); branch = new BBranch({ noteId: item.id, parentNoteId: parentNoteId, @@ -466,7 +473,7 @@ function checkHiddenSubtreeRecursively(parentNoteId: string, item: HiddenSubtree }).save(); } else if (attr.name === "docName" || (existingAttribute.noteId.startsWith("_help") && attr.name === "iconClass")) { if (existingAttribute.value !== attr.value) { - console.log(`Updating attribute ${attrId} from "${existingAttribute.value}" to "${attr.value}"`); + log.info(`Updating attribute ${attrId} from "${existingAttribute.value}" to "${attr.value}"`); existingAttribute.value = attr.value ?? ""; existingAttribute.save(); } diff --git a/apps/server/src/services/hidden_subtree_templates.ts b/apps/server/src/services/hidden_subtree_templates.ts index 11ed6c66b..7f5710776 100644 --- a/apps/server/src/services/hidden_subtree_templates.ts +++ b/apps/server/src/services/hidden_subtree_templates.ts @@ -234,6 +234,77 @@ export default function buildHiddenSubtreeTemplates() { } ] }, + { + id: "_template_presentation_slide", + type: "text", + title: t("hidden_subtree_templates.presentation_slide"), + icon: "bx bx-rectangle", + attributes: [ + { + name: "slide", + type: "label" + }, + { + name: "label:slide:background", + type: "label", + value: `promoted,alias=${t("hidden_subtree_templates.background")},single,color` + } + ] + }, + { + id: "_template_presentation", + type: "book", + title: t("hidden_subtree_templates.presentation"), + icon: "bx bx-slideshow", + attributes: [ + { + name: "template", + type: "label" + }, + { + name: "viewType", + type: "label", + value: "presentation" + }, + { + name: "collection", + type: "label" + }, + { + name: "child:template", + type: "relation", + value: "_template_presentation_slide" + } + ], + children: [ + { + id: "_template_presentation_first", + type: "text", + title: t("hidden_subtree_templates.presentation_slide_first"), + content: t("hidden_subtree_templates.presentation_slide_first"), + attributes: [ + { + name: "template", + type: "relation", + value: "_template_presentation_slide" + } + ] + }, + { + id: "_template_presentation_second", + type: "text", + title: t("hidden_subtree_templates.presentation_slide_second"), + content: t("hidden_subtree_templates.presentation_slide_second"), + attributes: [ + { + name: "template", + type: "relation", + value: "_template_presentation_slide" + } + ] + } + ] + } ] }; diff --git a/apps/server/src/services/migration.spec.ts b/apps/server/src/services/migration.spec.ts index 690956904..f47803ac4 100644 --- a/apps/server/src/services/migration.spec.ts +++ b/apps/server/src/services/migration.spec.ts @@ -12,7 +12,7 @@ describe("Migration", () => { const migration = (await import("./migration.js")).default; await migration.migrateIfNecessary(); - expect(sql.getValue("SELECT count(*) FROM blobs")).toBe(116); + expect(sql.getValue("SELECT count(*) FROM blobs")).toBe(118); resolve(); }); }); diff --git a/apps/server/src/services/window.ts b/apps/server/src/services/window.ts index b26b000af..459ebdf59 100644 --- a/apps/server/src/services/window.ts +++ b/apps/server/src/services/window.ts @@ -8,10 +8,12 @@ import sqlInit from "./sql_init.js"; import cls from "./cls.js"; import keyboardActionsService from "./keyboard_actions.js"; import electron from "electron"; -import type { App, BrowserWindowConstructorOptions, BrowserWindow, WebContents } from "electron"; +import type { App, BrowserWindowConstructorOptions, BrowserWindow, WebContents, IpcMainEvent } from "electron"; import { formatDownloadTitle, isDev, isMac, isWindows } from "./utils.js"; import { t } from "i18next"; import { RESOURCE_DIR } from "./resource_dir.js"; +import { PerformanceObserverEntryList } from "perf_hooks"; +import options from "./options.js"; // Prevent the window being garbage collected let mainWindow: BrowserWindow | null; @@ -67,61 +69,102 @@ electron.ipcMain.on("create-extra-window", (event, arg) => { createExtraWindow(arg.extraWindowHash); }); +interface PrintOpts { + notePath: string; + printToPdf: boolean; +} + interface ExportAsPdfOpts { + notePath: string; title: string; landscape: boolean; pageSize: "A0" | "A1" | "A2" | "A3" | "A4" | "A5" | "A6" | "Legal" | "Letter" | "Tabloid" | "Ledger"; } -electron.ipcMain.on("export-as-pdf", async (e, opts: ExportAsPdfOpts) => { - const browserWindow = electron.BrowserWindow.fromWebContents(e.sender); - if (!browserWindow) { - return; - } - - const filePath = electron.dialog.showSaveDialogSync(browserWindow, { - defaultPath: formatDownloadTitle(opts.title, "file", "application/pdf"), - filters: [ - { - name: t("pdf.export_filter"), - extensions: ["pdf"] - } - ] +electron.ipcMain.on("print-note", async (e, { notePath }: PrintOpts) => { + const browserWindow = await getBrowserWindowForPrinting(e, notePath); + browserWindow.webContents.print({}, (success, failureReason) => { + if (!success) { + electron.dialog.showErrorBox(t("pdf.unable-to-print"), failureReason); + } + e.sender.send("print-done"); + browserWindow.destroy(); }); - if (!filePath) { - return; - } - - let buffer: Buffer; - try { - buffer = await browserWindow.webContents.printToPDF({ - landscape: opts.landscape, - pageSize: opts.pageSize, - generateDocumentOutline: true, - generateTaggedPDF: true, - printBackground: true, - displayHeaderFooter: true, - headerTemplate: `
    `, - footerTemplate: ` -
    -
    - ` - }); - } catch (e) { - electron.dialog.showErrorBox(t("pdf.unable-to-export-title"), t("pdf.unable-to-export-message")); - return; - } - - try { - await fs.writeFile(filePath, buffer); - } catch (e) { - electron.dialog.showErrorBox(t("pdf.unable-to-export-title"), t("pdf.unable-to-save-message")); - return; - } - - electron.shell.openPath(filePath); }); +electron.ipcMain.on("export-as-pdf", async (e, { title, notePath, landscape, pageSize }: ExportAsPdfOpts) => { + const browserWindow = await getBrowserWindowForPrinting(e, notePath); + + async function print() { + const filePath = electron.dialog.showSaveDialogSync(browserWindow, { + defaultPath: formatDownloadTitle(title, "file", "application/pdf"), + filters: [ + { + name: t("pdf.export_filter"), + extensions: ["pdf"] + } + ] + }); + if (!filePath) return; + + let buffer: Buffer; + try { + buffer = await browserWindow.webContents.printToPDF({ + landscape, + pageSize, + generateDocumentOutline: true, + generateTaggedPDF: true, + printBackground: true, + displayHeaderFooter: true, + headerTemplate: `
    `, + footerTemplate: ` +
    +
    + ` + }); + } catch (e) { + electron.dialog.showErrorBox(t("pdf.unable-to-export-title"), t("pdf.unable-to-export-message")); + return; + } + + try { + await fs.writeFile(filePath, buffer); + } catch (e) { + electron.dialog.showErrorBox(t("pdf.unable-to-export-title"), t("pdf.unable-to-save-message")); + return; + } + + electron.shell.openPath(filePath); + } + + try { + await print(); + } finally { + e.sender.send("print-done"); + browserWindow.destroy(); + } +}); + +async function getBrowserWindowForPrinting(e: IpcMainEvent, notePath: string) { + const browserWindow = new electron.BrowserWindow({ + show: false, + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + offscreen: true, + session: e.sender.session + }, + }); + await browserWindow.loadURL(`http://127.0.0.1:${port}/?print#${notePath}`); + await browserWindow.webContents.executeJavaScript(` + new Promise(resolve => { + if (window._noteReady) return resolve(); + window.addEventListener("note-ready", () => resolve()); + }); + `); + return browserWindow; +} + async function createMainWindow(app: App) { if ("setUserTasks" in app) { app.setUserTasks([ diff --git a/apps/server/src/test/becca_easy_mocking.ts b/apps/server/src/test/becca_easy_mocking.ts index c3d6b6293..1fe4cfdc0 100644 --- a/apps/server/src/test/becca_easy_mocking.ts +++ b/apps/server/src/test/becca_easy_mocking.ts @@ -2,6 +2,7 @@ import utils from "../services/utils.js"; import BNote from "../becca/entities/bnote.js"; import BAttribute from "../becca/entities/battribute.js"; import BBranch from "../becca/entities/bbranch.js"; +import { NoteType } from "@triliumnext/commons"; type AttributeDefinitions = { [key in `#${string}`]: string; }; type RelationDefinitions = { [key in `~${string}`]: string; }; @@ -10,6 +11,7 @@ interface NoteDefinition extends AttributeDefinitions, RelationDefinitions { id?: string | undefined; title?: string; content?: string; + type?: NoteType; children?: NoteDefinition[]; } @@ -42,7 +44,7 @@ export function buildNote(noteDef: NoteDefinition) { const note = new BNote({ noteId: noteDef.id ?? utils.randomString(12), title: noteDef.title ?? "New note", - type: "text", + type: noteDef.type ?? "text", mime: "text/html", isProtected: false, blobId: "" diff --git a/apps/website/package.json b/apps/website/package.json index a818aba4d..9aec2e719 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -8,17 +8,20 @@ "preview": "pnpm build && vite preview" }, "dependencies": { + "i18next": "25.6.0", + "i18next-http-backend": "3.0.2", "preact": "10.27.2", "preact-iso": "2.11.0", - "preact-render-to-string": "6.6.2" + "preact-render-to-string": "6.6.2", + "react-i18next": "16.1.2" }, "devDependencies": { "@preact/preset-vite": "2.10.2", - "eslint": "9.37.0", + "eslint": "9.38.0", "eslint-config-preact": "2.0.0", "typescript": "5.9.3", "user-agent-data-types": "0.4.2", - "vite": "7.1.9" + "vite": "7.1.11" }, "eslintConfig": { "extends": "preact" diff --git a/apps/website/public/translations/ar/translation.json b/apps/website/public/translations/ar/translation.json new file mode 100644 index 000000000..ce83352fc --- /dev/null +++ b/apps/website/public/translations/ar/translation.json @@ -0,0 +1,117 @@ +{ + "download_helper_server_linux": { + "download_tar_arm64": "بصيغة ARM (.tar.xz)", + "download_nixos": "مكون NixOS", + "download_tar_x64": "x64 (.tar.xz)", + "title": "الاستضافة الذاتية على نظام لينكس" + }, + "download_helper_server_hosted": { + "title": "استضافة مدفوعة", + "download_triliumcc": "بدلا من ذلك، راجع trillum. cc" + }, + "get-started": { + "architecture": "المعمارية:", + "older_releases": "انظر الى الاصدارات القديمة", + "title": "ابدأ الان" + }, + "hero_section": { + "github": "GitHub", + "get_started": "ابدأ الان", + "dockerhub": "مستودع Docker" + }, + "organization_benefits": { + "title": "تنظيم", + "note_structure_title": "هيكيلية الملاحظة", + "hoisting_title": "مساحات العمل والتركيز على الملاحظة" + }, + "productivity_benefits": { + "sync_title": "‎المزامنة", + "revisions_title": "مراجعات الملاحظة", + "protected_notes_title": "الملاحظات المحمية", + "search_title": "البحث القوي", + "web_clipper_title": "اداة قص الويب", + "title": "الانتاجية والسلامة" + }, + "note_types": { + "canvas_title": "مساحة العمل", + "mindmap_title": "خريطة ذهنية", + "text_title": "ملاحظات النص", + "code_title": "ملاحظات الكود", + "file_title": "ملاحظات الملف", + "mermaid_title": "مخططات Mermaid" + }, + "extensibility_benefits": { + "import_export_title": "استيراد/تصدير", + "title": "المشاركة وقابلية التوسيع", + "scripting_title": "البرمجة النصية المتقدمة", + "api_title": "واجهة برمجة REST" + }, + "collections": { + "calendar_title": "التقويم", + "table_title": "جدول", + "board_title": "لوحة", + "geomap_title": "خريطة جغرافية" + }, + "footer": { + "copyright_community": "المجتمع", + "copyright_and_the": " و ال " + }, + "social_buttons": { + "github": "GitHub", + "matrix": "‍مصفوفة", + "reddit": "Reddit", + "github_discussions": "مناقشات GitHub" + }, + "support_us": { + "paypal": "PayPal", + "title": "ادعمنا", + "financial_donations_title": "التبرعات المالية", + "github_sponsors": "الرعاة على GitHub" + }, + "download_helper_desktop_windows": { + "download_scoop": "Scoop", + "download_exe": "تحميل ملف التثبيت (exe.)", + "title_x64": "ويندوز 64 بت", + "download_zip": "النسخة المحمولة بصيغة zip", + "title_arm64": "نظام ويندوز عاى ARM" + }, + "download_helper_desktop_linux": { + "download_deb": ".deb", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR", + "download_rpm": "rpm.", + "download_flatpak": "flatpak.", + "title_x64": "لينيكس 64 بت", + "download_zip": "النسخة المحمولة بصيغة zip", + "title_arm64": "نظام لينكس على ARM" + }, + "download_helper_server_docker": { + "download_ghcr": "ghcr.io", + "download_dockerhub": "مستودع Docker", + "title": "الاستضافة الذاتية باستخدام الDocker" + }, + "final_cta": { + "get_started": "ابدأ الان" + }, + "components": { + "link_learn_more": "تعلم المزيد..." + }, + "download_now": { + "text": "تنزيل الان ", + "platform_small": "لاجل{{platform}}", + "linux_small": "لLinux", + "linux_big": "اصدار v {{version}} لنظام لينكس" + }, + "faq": { + "title": "الاسئلة المتكررة" + }, + "404": { + "title": "404: غير موجود" + }, + "download_helper_desktop_macos": { + "download_dmg": "تحميل ملف التثبيت (dmg.)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "النسخة المحمولة بصيغة zip", + "title_x64": "نظام macOS لاصدار intel" + } +} diff --git a/apps/website/public/translations/ca/translation.json b/apps/website/public/translations/ca/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/ca/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/cs/translation.json b/apps/website/public/translations/cs/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/cs/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/de/translation.json b/apps/website/public/translations/de/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/de/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/el/translation.json b/apps/website/public/translations/el/translation.json new file mode 100644 index 000000000..9fa1bbd04 --- /dev/null +++ b/apps/website/public/translations/el/translation.json @@ -0,0 +1,49 @@ +{ + "get-started": { + "title": "Ξεκινήστε", + "desktop_title": "Κατεβάστε την εφαρμογή desktop (v{{version}})", + "architecture": "Αρχιτεκτονική:", + "older_releases": "Δείτε παλαιότερες εκδόσεις", + "server_title": "Ρυθμίστε έναν server για πρόσβαση σε πολλαπλές συσκευές" + }, + "hero_section": { + "title": "Οργανώστε τις σκέψεις σας. Δημιουργήστε την προσωπική σας βάση γνώσεων.", + "subtitle": "Το Trilium είναι μια λύση ανοικτού κώδικα για τη λήψη και την οργάνωση μιας προσωπικής βάσης γνώσεων. Χρησιμοποιήστε το σε τοπικό επίπεδο στο desktop σας, ή συγχρονίστε το με τον δικό σας server σας για να κρατήσετε τις σημειώσεις σας όπου πηγαίνετε.", + "get_started": "Ξεκινήστε", + "screenshot_alt": "Στιγμιότυπο οθόνης της desktop εφαρμογής Trilium Notes", + "github": "GitHub", + "dockerhub": "Docker Hub" + }, + "organization_benefits": { + "title": "Οργανισμός", + "note_structure_title": "Δομή σημειώσεων", + "note_structure_description": "Οι σημειώσεις μπορούν να ταξινομηθούν ιεραρχικά. Δεν χρειάζονται φάκελοι, καθώς κάθε σημείωση μπορεί να περιέχει δευτερεύουσες σημειώσεις. Μια μεμονωμένη σημείωση μπορεί να προστεθεί σε πολλά σημεία της ιεραρχίας.", + "attributes_title": "Ετικέτες σημειώσεων και σχέσεις", + "attributes_description": "Χρησιμοποιήστε σχέσεις μεταξύ σημειώσεων ή προσθέστε ετικέτες για εύκολη κατηγοριοποίηση. Χρησιμοποιήστε προωθημένες ιδιότητες για να εισάγετε δομημένες πληροφορίες που μπορούν να χρησιμοποιηθούν σε πίνακες, συμβούλια.", + "hoisting_description": "Διαχωρίστε εύκολα τις προσωπικές και τις εργασιακές σας σημειώσεις ομαδοποιώντας τις σε έναν χώρο εργασίας, ο οποίος εστιάζει το δέντρο σημειώσεών σας ώστε να εμφανίζει μόνο ένα συγκεκριμένο σύνολο σημειώσεων.", + "hoisting_title": "Χώροι εργασίας και ανύψωση" + }, + "productivity_benefits": { + "title": "Παραγωγικότητα και ασφάλεια", + "revisions_title": "Aναθεωρήσεις σημειώσεων", + "revisions_content": "Οι σημειώσεις αποθηκεύονται περιοδικά στο παρασκήνιο και οι αναθεωρήσεις μπορούν να χρησιμοποιηθούν για έλεγχο ή για αναίρεση τυχαίων αλλαγών. Οι αναθεωρήσεις μπορούν επίσης να δημιουργηθούν κατ' απαίτηση.", + "sync_title": "Συγχρονισμός", + "sync_content": "Χρησιμοποιήστε μια δικής σας εγκατάσταση ή μια εγκατάσταση cloud για να συγχρονίσετε εύκολα τις σημειώσεις σας σε πολλές συσκευές και να αποκτήσετε πρόσβαση σε αυτές από το κινητό σας τηλέφωνο χρησιμοποιώντας ένα PWA.", + "protected_notes_title": "Προστατευμένες σημειώσεις", + "protected_notes_content": "Προστατέψτε ευαίσθητες προσωπικές πληροφορίες κρυπτογραφώντας τις σημειώσεις και κλειδώνοντάς τις πίσω από μια περίοδο λειτουργίας που προστατεύεται με κωδικό πρόσβασης.", + "jump_to_title": "Γρήγορη αναζήτηση και εντολές", + "jump_to_content": "Μεταβείτε γρήγορα σε σημειώσεις ή εντολές σε όλη την ιεραρχία αναζητώντας τον τίτλο τους, με ασαφή αντιστοίχιση για να ληφθούν υπόψη τυπογραφικά λάθη ή μικρές διαφορές.", + "search_title": "Ισχυρή αναζήτηση", + "search_content": "Εναλλακτικά, αναζητήστε κείμενο μέσα σε σημειώσεις και περιορίστε την αναζήτηση φιλτράροντας με βάση την ανώτερη σημείωση ή κατά βάθος.", + "web_clipper_title": "Εργαλείο αποκομμάτων web", + "web_clipper_content": "Πάρτε ιστοσελίδες (ή στιγμιότυπα οθόνης) και τοποθετήστε τις απευθείας στο Trilium χρησιμοποιώντας το εργαλείο αποκομμάτων web του προγράμματος περιήγησης." + }, + "note_types": { + "text_title": "Σημειώσεις κειμένου", + "text_description": "Οι σημειώσεις επεξεργάζονται χρησιμοποιώντας έναν οπτικό επεξεργαστή (WYSIWYG), με υποστήριξη για πίνακες, εικόνες, μαθηματικές εκφράσεις, μπλοκ κώδικα με επισήμανση σύνταξης. Μορφοποιήστε γρήγορα το κείμενο χρησιμοποιώντας σύνταξη παρόμοια με το Markdown ή χρησιμοποιώντας εντολές με κάθετο.", + "code_title": "Σημειώσεις κώδικα", + "code_description": "Μεγάλα δείγματα πηγαίου κώδικα ή scripts χρησιμοποιούν έναν ειδικό επεξεργαστή, με επισήμανση σύνταξης για πολλές γλώσσες προγραμματισμού και με διάφορα χρωματικά θέματα.", + "file_title": "Σημειώσεις αρχείων", + "file_description": "Ενσωματώστε αρχεία πολυμέσων όπως PDF, εικόνες, βίντεο με προεπισκόπηση εντός εφαρμογής." + } +} diff --git a/apps/website/public/translations/en/translation.json b/apps/website/public/translations/en/translation.json new file mode 100644 index 000000000..929a307a8 --- /dev/null +++ b/apps/website/public/translations/en/translation.json @@ -0,0 +1,192 @@ +{ + "get-started": { + "title": "Get started", + "desktop_title": "Download the desktop application (v{{version}})", + "architecture": "Architecture:", + "older_releases": "See older releases", + "server_title": "Set up a server for access on multiple devices" + }, + "hero_section": { + "title": "Organize your thoughts. Build your personal knowledge base.", + "subtitle": "Trilium is an open-source solution for note-taking and organizing a personal knowledge base. Use it locally on your desktop, or sync it with your self-hosted server to keep your notes everywhere you go.", + "get_started": "Get started", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Screenshot of the Trilium Notes desktop application" + }, + "organization_benefits": { + "title": "Organization", + "note_structure_title": "Note structure", + "note_structure_description": "Notes can be arranged hierarchically. There's no need for folders, since each note can contain sub-notes. A single note can be added in multiple places in the hierarchy.", + "attributes_title": "Note labels and relationships", + "attributes_description": "Use relations between notes or add labels for easy categorization. Use promoted attributes to enter structured information which can be used in tables, boards.", + "hoisting_title": "Workspaces and hoisting", + "hoisting_description": "Easily separate your personal and work notes by grouping them under a workspace, which focuses your note tree to only show a specific set of notes." + }, + "productivity_benefits": { + "title": "Productivity and safety", + "revisions_title": "Note revisions", + "revisions_content": "Notes are periodically saved in the background and revisions can be used for review or to undo accidental changes. Revisions can also be created on-demand.", + "sync_title": "Synchronization", + "sync_content": "Use a self-hosted or cloud instance to easily synchronize your notes across multiple devices, and to access it from your mobile phone using a PWA.", + "protected_notes_title": "Protected notes", + "protected_notes_content": "Protect sensitive personal information by encrypting the notes and locking them behind a password-protected session.", + "jump_to_title": "Quick search and commands", + "jump_to_content": "Jump quickly to notes or UI commands across the hierarchy by searching for their title, with fuzzy matching to account for typos or slight differences.", + "search_title": "Powerful search", + "search_content": "Or search for text inside notes and narrow down the search by filtering by the parent note, or by depth.", + "web_clipper_title": "Web clipper", + "web_clipper_content": "Grab web pages (or screenshots) and place them directly into Trilium using the web clipper browser extension." + }, + "note_types": { + "text_title": "Text notes", + "text_description": "The notes are edited using a visual (WYSIWYG) editor, with support for tables, images, math expressions, code blocks with syntax highlighting. Quickly format the text using Markdown-like syntax or using slash commands.", + "code_title": "Code notes", + "code_description": "Large samples of source code or scripts use a dedicated editor, with syntax highlighting for many programming languages and with various color themes.", + "file_title": "File notes", + "file_description": "Embed multimedia files such as PDFs, images, videos with an in-application preview.", + "canvas_title": "Canvas", + "canvas_description": "Arrange shapes, images and text across an infinite canvas, using the same technology behind excalidraw.com. Ideal for diagrams, sketches and visual planning.", + "mermaid_title": "Mermaid diagrams", + "mermaid_description": "Create diagrams such as flowcharts, class & sequence diagrams, Gantt charts and many more, using the Mermaid syntax.", + "mindmap_title": "Mindmap", + "mindmap_description": "Organize your thoughts visually or do a brainstorming session.", + "others_list": "and others: <0>note map, <1>relation map, <2>saved searches, <3>render note, and <4>web views." + }, + "extensibility_benefits": { + "title": "Sharing & extensibility", + "import_export_title": "Import/export", + "import_export_description": "Easily interact with other applications using Markdown, ENEX, OML formats.", + "share_title": "Share notes on the web", + "share_description": "If you have a server, it can be used to share a subset of your notes with other people.", + "scripting_title": "Advanced scripting", + "scripting_description": "Build your own integrations within Trilium with custom widgets, or server-side logic.", + "api_title": "REST API", + "api_description": "Interact with Trilium programatically using its builtin REST API." + }, + "collections": { + "calendar_title": "Calendar", + "calendar_description": "Organize your personal or professional events using a calendar, with support for all-day and multi-day events. See your events at a glance with the week, month and year views. Easy interaction to add or drag events.", + "table_title": "Table", + "table_description": "Display and edit information about notes in a tabular structure, with various column types such as text, number, check boxes, date & time, links and colors and support for relations. Optionally, display the notes within a tree hierarchy inside the table.", + "board_title": "Board", + "board_description": "Organize your tasks or project status into a Kanban board with an easy way to create new items and columns and simply changing their status by dragging across the board.", + "geomap_title": "Geomap", + "geomap_description": "Plan your vacations or mark your points of interest directly on a geographical map using customizable markers. Display recorded GPX tracks to track itineraries." + }, + "faq": { + "title": "Frequently Asked Questions", + "mobile_question": "Is there a mobile application?", + "mobile_answer": "Currently there is no official mobile application. However, if you have a server instance you can access it using a web browser and even install it as a PWA. For Android, there is an unofficial application called TriliumDroid that even works offline (same as a desktop client).", + "database_question": "Where is the data stored?", + "database_answer": "All your notes will be stored in an SQLite database in an application folder. The reasoning why Trilium uses a database instead of plain text files is both performance and some features would be much more difficult to implement such as clones (same note in multiple places in the tree). To find the application folder, simply go to the About window.", + "server_question": "Do I need a server to use Trilium?", + "server_answer": "No, the server allows access via a web browser and manages the synchronization if you have multiple devices. To get started, it's enough to download the desktop application and start using it.", + "scaling_question": "How well does the application scale with a large amount of notes?", + "scaling_answer": "Depending on usage, the application should be able to handle at least 100,000 notes without an issue. Do note that the sync process can sometimes fail if uploading many large files (1 GB per file) since Trilium is meant more as a knowledge base application rather than a file store (like NextCloud, for example).", + "network_share_question": "Can I share my database over a network drive?", + "network_share_answer": "No, it's generally not a good idea to share a SQLite database over a network drive. Although sometimes it might work, there are chances that the database will get corrupted due to imperfect file locks over a network.", + "security_question": "How is my data protected?", + "security_answer": "By default, notes are not encrypted and can be read directly from the database. Once a note is marked as encrypted, the note is encrypted using AES-128-CBC." + }, + "final_cta": { + "title": "Ready to get started with Trilium Notes?", + "description": "Build your personal knowledge base with powerful features and full privacy.", + "get_started": "Get started" + }, + "components": { + "link_learn_more": "Learn more...", + "list_with_screenshot_alt": "Screenshot of the feature being selected" + }, + "download_now": { + "text": "Download now ", + "platform_big": "v{{version}} for {{platform}}", + "platform_small": "for {{platform}}", + "linux_big": "v{{version}} for Linux", + "linux_small": "for Linux", + "more_platforms": "More platforms & server setup" + }, + "footer": { + "copyright_and_the": " and the ", + "copyright_community": "community" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub Discussions", + "matrix": "Matrix", + "reddit": "Reddit" + }, + "support_us": { + "title": "Support us", + "financial_donations_title": "Financial donations", + "financial_donations_description": "Trilium is built and maintained with hundreds of hours of work. Your support keeps it open-source, improves features, and covers costs such as hosting.", + "financial_donations_cta": "Consider supporting the main developer (eliandoran) of the application via:", + "github_sponsors": "GitHub Sponsors", + "paypal": "PayPal", + "buy_me_a_coffee": "Buy Me A Coffee" + }, + "contribute": { + "title": "Other ways to contribute", + "way_translate": "Translate the application into your native language via Weblate.", + "way_community": "Interact with the community on GitHub Discussions or on Matrix.", + "way_reports": "Report bugs via GitHub issues.", + "way_document": "Improve the documentation by informing us on gaps in the documentation or contributing guides, FAQs or tutorials.", + "way_market": "Spread the word: Share Trilium Notes with friends, or on blogs and social media." + }, + "404": { + "title": "404: Not Found", + "description": "The page you were looking for could not be found. Maybe it was deleted or the URL is incorrect." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64-bit", + "title_arm64": "Windows on ARM", + "description_x64": "Compatible with Intel or AMD devices running Windows 10 and 11.", + "description_arm64": "Compatible with ARM devices (e.g. with Qualcomm Snapdragon).", + "quick_start": "To install via Winget:", + "download_exe": "Download Installer (.exe)", + "download_zip": "Portable (.zip)", + "download_scoop": "Scoop" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64-bit", + "title_arm64": "Linux on ARM", + "description_x64": "For most Linux distributions, compatible with x86_64 architecture.", + "description_arm64": "For ARM-based Linux distributions, compatible with aarch64 architecture.", + "quick_start": "Select an appropriate package format, depending on your distribution:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "Portable (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS for Intel", + "title_arm64": "macOS for Apple Silicon", + "description_x64": "For Intel-based Macs running macOS Big Sur or later.", + "description_arm64": "For Apple Silicon Macs such as those with M1 and M2 chips.", + "quick_start": "To install via Homebrew:", + "download_dmg": "Download Installer (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "Portable (.zip)" + }, + "download_helper_server_docker": { + "title": "Self-hosted using Docker", + "description": "Easily deploy on Windows, Linux or macOS using a Docker container.", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "Self-hosted on Linux", + "description": "Deploy Trilium Notes on your own server or VPS, compatible with most distributions.", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)", + "download_nixos": "NixOS module" + }, + "download_helper_server_hosted": { + "title": "Paid hosting", + "description": "Trilium Notes hosted on PikaPods, a paid service for easy access and management. Not directly affiliated with the Trilium team.", + "download_pikapod": "Set up on PikaPods", + "download_triliumcc": "Alternatively see trilium.cc" + } +} diff --git a/apps/website/public/translations/es/translation.json b/apps/website/public/translations/es/translation.json new file mode 100644 index 000000000..bd376bc55 --- /dev/null +++ b/apps/website/public/translations/es/translation.json @@ -0,0 +1,192 @@ +{ + "get-started": { + "title": "Comenzar", + "desktop_title": "Descarga la aplicación de escritorio (v{{version}})", + "architecture": "Arquitectura:", + "older_releases": "Ver versiones anteriores", + "server_title": "Configura un servidor para acceder desde múltiples dispositivos" + }, + "hero_section": { + "title": "Organiza tus ideas. Construye tu propia base de conocimiento personal.", + "subtitle": "Trilium es una aplicación de código abierto para tomar notas y organizar tu base de conocimiento personal. Puedes usarla localmente en tu escritorio o sincronizarla con tu propio servidor para tener tus notas disponibles en cualquier lugar.", + "get_started": "Comenzar", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Captura de pantalla de la aplicación de escritorio Trilium Notes" + }, + "organization_benefits": { + "title": "Organización", + "note_structure_title": "Estructura de notas", + "note_structure_description": "Las notas se pueden organizar de forma jerárquica. No necesitas carpetas, ya que cada nota puede contener subnotas. Una misma nota puede añadirse en varios lugares de la jerarquía.", + "attributes_title": "Etiquetas de notas y relaciones", + "attributes_description": "Puedes establecer relaciones entre notas o añadir etiquetas para categorizarlas más fácilmente. Los atributos promovidos te permiten ingresar información estructurada, que luego puedes usar en tablas o tableros.", + "hoisting_title": "Espacios de trabajo y organización jerárquica", + "hoisting_description": "Se pueden separar fácilmente tus notas personales y de trabajo agrupándolas en un espacio de trabajo, lo que centra el árbol de notas en mostrar únicamente un conjunto específico de ellas." + }, + "productivity_benefits": { + "title": "Productividad y seguridad", + "revisions_title": "Revisiones de notas", + "revisions_content": "Las notas se guardan automáticamente en segundo plano y las revisiones te permiten revisarlas o deshacer cambios accidentales. También se pueden crear revisiones manualmente cuando se necesite.", + "sync_title": "Sincronización", + "sync_content": "Usa una instancia propia o en la nube para sincronizar fácilmente tus notas entre varios dispositivos y acceder a ellas desde el móvil mediante una PWA.", + "protected_notes_title": "Notas protegidas", + "protected_notes_content": "Protege información personal sensible cifrando las notas y bloqueándolas dentro de una sesión protegida con contraseña.", + "jump_to_title": "Búsqueda rápida y comandos", + "jump_to_content": "Accede rápidamente a notas o comandos de la interfaz en toda la jerarquía buscando por su título, con búsqueda aproximada que corrige errores tipográficos o variaciones mínimas.", + "search_title": "Búsqueda potente", + "search_content": "O busca texto dentro de las notas y acota la búsqueda filtrando por la nota principal o por nivel de profundidad.", + "web_clipper_title": "Clipper web", + "web_clipper_content": "Captura páginas web (o capturas de pantalla) y agrégalas directamente a Trilium usando la extensión del \"Clipper web\" para el navegador." + }, + "note_types": { + "text_title": "Notas tipo texto", + "text_description": "Las notas se editan con un editor visual (WYSIWYG), con soporte para tablas, imágenes, expresiones matemáticas y bloques de código con resaltado de sintaxis. Puedes formatear rápidamente el texto usando una sintaxis similar a Markdown o mediante comandos con barra (/).", + "code_title": "Notas tipo código", + "code_description": "Fragmentos extensos de código fuente o scripts se manejan en un editor dedicado, con resaltado de sintaxis para múltiples lenguajes de programación y distintos temas de color.", + "file_title": "Notas tipo archivo", + "file_description": "Incorpora archivos multimedia, como PDFs, imágenes o videos, con vista previa directamente en la aplicación.", + "canvas_title": "Lienzo", + "canvas_description": "Organiza formas, imágenes y texto en un lienzo infinito, usando la misma tecnología de excalidraw.com. Perfecto para diagramas, bocetos y planificación visual.", + "mermaid_title": "Diagramas Mermaid", + "mermaid_description": "Crea diagramas de flujo, de clases, de secuencia, de Gantt y muchos más con la sintaxis de Mermaid.", + "mindmap_title": "Mapa mental", + "mindmap_description": "Organiza ideas visualmente o haz una sesión de lluvia de ideas.", + "others_list": "y otros: <0>mapa de notas, <1>mapa de relaciones, <2>búsquedas guardadas, <3>vista de nota, y <4>vistas web." + }, + "extensibility_benefits": { + "title": "Compartir y extensibilidad", + "import_export_title": "Importar/Exportar", + "import_export_description": "Interactúa fácilmente con otras aplicaciones usando los formatos Markdown, ENEX y OML.", + "share_title": "Compartir notas en la web", + "share_description": "Si se dispone de un servidor, se puede usar para compartir un subconjunto de notas con otras personas.", + "scripting_title": "Scripting avanzado", + "scripting_description": "Crea tus propias integraciones en Trilium con widgets personalizados o lógica en el servidor.", + "api_title": "API REST", + "api_description": "Interactúa con Trilium de forma programática usando su API REST integrada." + }, + "collections": { + "calendar_title": "Calendario", + "calendar_description": "Organiza tus eventos personales o profesionales en un calendario, con soporte para eventos de todo el día o de varios días. Consulta tus eventos rápidamente con las vistas semanal, mensual y anual. Añade o mueve eventos de forma sencilla.", + "table_title": "Tabla", + "table_description": "Muestra y edita información sobre las notas en una estructura tabular, con distintos tipos de columna como texto, número, casillas de verificación, fecha y hora, enlaces y colores, y con soporte para relaciones. Opcionalmente, muestra las notas dentro de una jerarquía en forma de árbol dentro de la tabla.", + "board_title": "Tablero Kanban", + "board_description": "Organiza tus tareas o el progreso de tus proyectos en un tablero Kanban. Crea fácilmente nuevos elementos y columnas, y cambia su estado simplemente arrastrándolos por el tablero.", + "geomap_title": "Mapa geográfico", + "geomap_description": "Planifica vacaciones o marca puntos de interés en un mapa geográfico con marcadores personalizables. Visualiza rutas GPX registradas para seguir itinerarios." + }, + "faq": { + "title": "Preguntas frecuentes", + "mobile_question": "¿Existe una aplicación móvil?", + "mobile_answer": "Actualmente no hay una aplicación móvil oficial. Sin embargo, si se dispone de una instancia en un servidor, se puede acceder desde un navegador web e incluso instalarla como PWA. Para Android, existe una aplicación no oficial llamada TriliumDroid que funciona incluso sin conexión (igual que un cliente de escritorio).", + "database_question": "¿Dónde se almacenan los datos?", + "database_answer": "Todas las notas se almacenan en una base de datos SQLite dentro de la carpeta de la aplicación. Trilium utiliza una base de datos en lugar de archivos de texto plano por motivos de rendimiento y porque algunas funciones, como los clones (la misma nota en varios lugares del árbol), serían mucho más difíciles de implementar. Para localizar la carpeta de la aplicación, basta con abrir la ventana \"Acerca de\".", + "server_question": "¿Es necesario un servidor para usar Trilium?", + "server_answer": "No, el servidor permite acceder desde un navegador web y gestionar la sincronización si se usan varios dispositivos. Para empezar, basta con descargar la aplicación de escritorio y comenzar a usarla.", + "scaling_question": "¿Cómo escala la aplicación con una gran cantidad de notas?", + "scaling_answer": "Según el uso, la aplicación puede manejar al menos 100.000 notas sin problemas. Hay que tener en cuenta que la sincronización puede fallar al subir muchos archivos grandes (1 GB por archivo), ya que Trilium está pensado como una base de conocimiento y no como un almacenamiento de archivos (como NextCloud, por ejemplo).", + "network_share_question": "¿Puedo compartir mi base de datos a través de una unidad de red?", + "network_share_answer": "No, generalmente no es recomendable compartir una base de datos SQLite mediante una unidad de red. Aunque a veces podría funcionar, existe el riesgo de que la base de datos se corrompa debido a bloqueos de archivos imperfectos en la red.", + "security_question": "¿Cómo se protegen mis datos?", + "security_answer": "Por defecto, las notas no están encriptadas y se pueden leer directamente desde la base de datos. Una vez que una nota se marca como encriptada, se cifra usando AES-128-CBC." + }, + "final_cta": { + "title": "¿Listo para empezar con Trilium Notes?", + "description": "Construye tu propia base de conocimiento con funciones avanzadas y total privacidad.", + "get_started": "Comenzar" + }, + "components": { + "link_learn_more": "Saber más…", + "list_with_screenshot_alt": "Captura de pantalla de la función seleccionada" + }, + "download_now": { + "text": "Descarga ahora ", + "platform_big": "v{{version}} para {{platform}}", + "platform_small": "para {{platform}}", + "linux_big": "v{{version}} para Linux", + "linux_small": "para Linux", + "more_platforms": "Más plataformas y configuración del servidor" + }, + "footer": { + "copyright_and_the": " y el ", + "copyright_community": "comunidad" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub Discussions", + "matrix": "Matrix", + "reddit": "Reddit" + }, + "support_us": { + "title": "Apóyanos", + "financial_donations_title": "Donaciones económicas", + "financial_donations_description": "Trilium se desarrolla y mantiene con cientos de horas de trabajo. Tu apoyo ayuda a mantenerlo de código abierto, mejorar sus funciones y cubrir gastos como el alojamiento.", + "financial_donations_cta": "Considera apoyar al desarrollador principal (eliandoran) de la aplicación a través de:", + "github_sponsors": "Patrocinadores de GitHub", + "paypal": "PayPal", + "buy_me_a_coffee": "Compra un café" + }, + "contribute": { + "title": "Otras formas de contribuir", + "way_translate": "Traduce la aplicación a tu idioma nativo a través de Weblate.", + "way_community": "Interactúa con la comunidad en GitHub Discussions o en Matrix.", + "way_reports": "Reporta errores a través de GitHub Issues.", + "way_document": "Ayuda a mejorar la documentación señalando vacíos en ella o contribuyendo con guías, preguntas frecuentes o tutoriales.", + "way_market": "Corre la voz: comparte Trilium Notes con amigos, en blogs o en redes sociales." + }, + "404": { + "title": "404: No encontrado", + "description": "La página que buscas no se pudo encontrar. Tal vez fue eliminada o la URL es incorrecta." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows de 64 bits", + "title_arm64": "Windows en ARM", + "description_x64": "Compatible con dispositivos Intel o AMD que ejecuten Windows 10 u 11.", + "description_arm64": "Compatible con dispositivos ARM (por ejemplo, con Qualcomm Snapdragon).", + "quick_start": "Para instalar mediante Winget:", + "download_exe": "Descarga instalador (.exe)", + "download_zip": "Versión portátil (.zip)", + "download_scoop": "Scoop" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux de 64 bits", + "title_arm64": "Linux en ARM", + "description_x64": "Compatible con la mayoría de distribuciones Linux, para arquitectura x86_64.", + "description_arm64": "Compatible con distribuciones Linux basadas en ARM, para arquitectura aarch64.", + "quick_start": "Selecciona el formato de paquete adecuado según tu distribución:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "Versión portátil (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS para Intel", + "title_arm64": "macOS para Apple Silicon", + "description_x64": "Para Macs con procesador Intel que ejecuten macOS Big Sur o posterior.", + "description_arm64": "Para Macs con Apple Silicon, como los que tienen chips M1 y M2.", + "quick_start": "Para instalar mediante Homebrew:", + "download_dmg": "Descargar instalador (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "Versión portátil (.zip)" + }, + "download_helper_server_docker": { + "title": "Autohospedado usando Docker", + "description": "Despliega fácilmente en Windows, Linux o macOS mediante un contenedor Docker.", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "Autohospedado en Linux", + "description": "Despliega Trilium Notes en tu propio servidor o VPS, compatible con la mayoría de las distribuciones.", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)", + "download_nixos": "Módulo de NixOS" + }, + "download_helper_server_hosted": { + "title": "Alojamiento de pago", + "description": "Trilium Notes hospedado en PikaPods, un servicio de pago que ofrece acceso y gestión sencillos. Sin afiliación directa con el equipo de Trilium.", + "download_pikapod": "Configurar en PikaPods", + "download_triliumcc": "Alternativamente, consulta trilium.cc" + } +} diff --git a/apps/website/public/translations/fa/translation.json b/apps/website/public/translations/fa/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/fa/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/fi/translation.json b/apps/website/public/translations/fi/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/fi/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/fr/translation.json b/apps/website/public/translations/fr/translation.json new file mode 100644 index 000000000..32b521fea --- /dev/null +++ b/apps/website/public/translations/fr/translation.json @@ -0,0 +1,49 @@ +{ + "get-started": { + "title": "Commencer", + "desktop_title": "Télécharger l'application de bureau (v{{version}})", + "architecture": "Architecture:", + "older_releases": "Voir les versions plus anciennes", + "server_title": "Configurer un serveur pour accéder à plusieurs appareils" + }, + "hero_section": { + "github": "GitHub", + "get_started": "Commencer", + "title": "Organisez vos pensées. Construisez votre base de connaissances personnelles.", + "subtitle": "Trilium est une solution open source pour la prise de notes et l'organisation de votre base de connaissances personnelle. Utilisez-la localement sur votre ordinateur ou synchronisez-la avec votre serveur auto-hébergé pour conserver vos notes où que vous soyez.", + "dockerhub": "Docker Hub", + "screenshot_alt": "Capture d'écran de l'application de bureau Trilium Notes" + }, + "organization_benefits": { + "title": "Organisation", + "note_structure_title": "Structure des notes", + "note_structure_description": "Les notes peuvent être organisées hiérarchiquement. Il n'est pas nécessaire de créer des dossiers, car chaque note peut contenir des sous-notes. Une même note peut être ajoutée à plusieurs endroits de la hiérarchie.", + "attributes_title": "Noter les étiquettes et les relations", + "attributes_description": "Utilisez des relations entre les notes ou ajoutez des étiquettes pour faciliter la catégorisation. Utilisez les attributs promus pour saisir des informations structurées utilisables dans des tableaux et des tableaux de bord.", + "hoisting_title": "Espaces de travail et focalisation", + "hoisting_description": "Séparez facilement vos notes personnelles et professionnelles en les regroupant sous un espace de travail, ce qui concentre votre arborescence de notes pour afficher uniquement l'ensemble spécifique de celles-ci." + }, + "productivity_benefits": { + "title": "Productivité et sécurité", + "revisions_title": "Révisions de note", + "revisions_content": "Les notes sont sauvegardées périodiquement en arrière-plan, et les révisions peuvent être utilisées pour consulter l’historique ou annuler des modifications accidentelles. Il est également possible de créer des révisions à la demande.", + "sync_title": "Synchronisation", + "sync_content": "Utilisez une instance auto-hébergée ou cloud pour synchroniser facilement vos notes sur plusieurs appareils, et pour y accéder à partir de votre téléphone mobile en utilisant un PWA.", + "protected_notes_title": "Notes protégées", + "protected_notes_content": "Protégez les informations personnelles sensibles en chiffrant les notes et en les verrouillant dans une session protégée par mot de passe.", + "jump_to_title": "Recherche rapide et commandes", + "jump_to_content": "Accédez rapidement à des notes ou commandes de l’interface dans toute la hiérarchie en recherchant leur titre, avec une correspondance approximative pour gérer les fautes de frappe ou légères variations.", + "search_title": "Recherche puissante", + "search_content": "Ou recherchez du texte à l’intérieur des notes et affinez les résultats en filtrant par note parente ou par profondeur.", + "web_clipper_title": "Web clipper", + "web_clipper_content": "Récupérez des pages Web (ou des captures d'écran) et placez-les directement dans Trilium à l'aide de l'extension de navigateur \"Web Clipper\"." + }, + "note_types": { + "text_title": "Notes de texte", + "text_description": "Les notes sont éditées à l'aide d'un éditeur visuel (WYSIWYG) prenant en charge les tableaux, les images, les expressions mathématiques et les blocs de code avec coloration syntaxique. Formatez rapidement le texte grâce à une syntaxe de type Markdown ou à des commandes slash.", + "code_title": "Notes de code" + }, + "faq": { + "database_question": "Où sont les données stockées?" + } +} diff --git a/apps/website/public/translations/hr/translation.json b/apps/website/public/translations/hr/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/hr/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/hu/translation.json b/apps/website/public/translations/hu/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/hu/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/id/translation.json b/apps/website/public/translations/id/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/id/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/it/translation.json b/apps/website/public/translations/it/translation.json new file mode 100644 index 000000000..f06f24ddd --- /dev/null +++ b/apps/website/public/translations/it/translation.json @@ -0,0 +1,192 @@ +{ + "get-started": { + "title": "Inizia", + "desktop_title": "Scarica l'applicazione desktop (v{{version}})", + "architecture": "Architettura:", + "older_releases": "Vedi le versioni precedenti", + "server_title": "Configurare un server per l'accesso su più dispositivi" + }, + "hero_section": { + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Screenshot dell'applicazione desktop Trilium Notes", + "title": "Organizza i tuoi pensieri. Costruisci la tua conoscenza personale.", + "subtitle": "Trilium è una soluzione open source per prendere appunti e organizzare una base di conoscenze personali. Utilizzalo localmente sul tuo desktop o sincronizzalo con il tuo server self-hosted per avere i tuoi appunti sempre con te, ovunque tu vada.", + "get_started": "Inizia ora" + }, + "organization_benefits": { + "title": "Organizzazione", + "note_structure_title": "Struttura della nota", + "note_structure_description": "Le note possono essere organizzate gerarchicamente. Non sono necessarie cartelle, poiché ogni nota può contenere sottonote. Una singola nota può essere aggiunta in più punti della gerarchia.", + "attributes_title": "Nota etichette e relazioni", + "attributes_description": "Utilizza le relazioni tra le note o aggiungi etichette per una facile categorizzazione. Utilizza gli attributi promossi per inserire informazioni strutturate che possono essere utilizzate in tabelle e bacheche.", + "hoisting_title": "Aree di lavoro e ancoraggi", + "hoisting_description": "Separa facilmente le tue note personali da quelle di lavoro raggruppandole in un'area di lavoro, che concentra la struttura delle note in modo da mostrare solo un insieme specifico di note." + }, + "productivity_benefits": { + "title": "Produttività e sicurezza", + "revisions_title": "Nota sulle revisioni", + "revisions_content": "Le note vengono salvate periodicamente in background e le revisioni possono essere utilizzate per la revisione o per annullare modifiche accidentali. Le revisioni possono anche essere create su richiesta.", + "sync_title": "Sincronizzazione", + "sync_content": "Utilizza un'istanza self-hosted o cloud per sincronizzare facilmente le tue note su più dispositivi e accedervi dal tuo cellulare utilizzando una PWA.", + "protected_notes_title": "Note protette", + "protected_notes_content": "Proteggi le informazioni personali sensibili crittografando le note e bloccandole dietro una sessione protetta da password.", + "jump_to_title": "Ricerca rapida e comandi", + "jump_to_content": "Passa rapidamente alle note o ai comandi dell'interfaccia utente in tutta la gerarchia cercando il loro titolo, con corrispondenza approssimativa per tenere conto di errori di battitura o lievi differenze.", + "search_title": "Ricerca avanzata", + "search_content": "Oppure cerca del testo all'interno delle note e restringi la ricerca filtrando per nota principale o per profondità.", + "web_clipper_title": "Web clipper", + "web_clipper_content": "Cattura pagine web (o screenshot) e inseriscile direttamente in Trilium utilizzando l'estensione del browser Web Clipper." + }, + "note_types": { + "text_title": "Note di testo", + "text_description": "Le note vengono modificate utilizzando un editor visivo (WYSIWYG), con supporto per tabelle, immagini, espressioni matematiche, blocchi di codice con evidenziazione della sintassi. Formatta rapidamente il testo utilizzando una sintassi simile a Markdown o utilizzando comandi slash.", + "code_title": "Note di codice", + "code_description": "Campioni di codice sorgente o script di grandi dimensioni utilizzano un editor dedicato, con evidenziazione della sintassi per molti linguaggi di programmazione e con vari temi cromatici.", + "file_title": "Note di file", + "file_description": "Incorpora file multimediali come PDF, immagini, video con un'anteprima nell'applicazione.", + "canvas_title": "Canvas", + "canvas_description": "Disponi forme, immagini e testo su una tela infinita, utilizzando la stessa tecnologia alla base di excalidraw.com. Ideale per diagrammi, schizzi e pianificazione visiva.", + "mermaid_title": "Diagrammi a sirena", + "mermaid_description": "Crea diagrammi come diagrammi di flusso, diagrammi di classe e sequenza, diagrammi di Gantt e molti altri, utilizzando la sintassi Mermaid.", + "mindmap_title": "Mappe mentali", + "mindmap_description": "Organizza i tuoi pensieri visivamente o fai una sessione di brainstorming.", + "others_list": "e altri: <0>mappa delle note, <1>mappa delle relazioni, <2>ricerche salvate, <3>renderizza nota e <4>visualizzazioni web." + }, + "extensibility_benefits": { + "title": "Condivisione ed estensibilità", + "import_export_title": "Importazione/esportazione", + "import_export_description": "Interagisci facilmente con altre applicazioni utilizzando i formati Markdown, ENEX e OML.", + "share_title": "Condividi note sul web", + "share_description": "Se disponi di un server, puoi utilizzarlo per condividere una parte delle tue note con altre persone.", + "scripting_title": "Scripting avanzato", + "scripting_description": "Crea le tue integrazioni all'interno di Trilium con widget personalizzati o logica lato server.", + "api_title": "REST API", + "api_description": "Interagisci con Trilium a livello di programmazione utilizzando la sua API REST integrata." + }, + "collections": { + "calendar_title": "Calendario", + "calendar_description": "Organizza i tuoi eventi personali o professionali utilizzando un calendario, con supporto per eventi di un giorno intero o di più giorni. Visualizza i tuoi eventi a colpo d'occhio con le viste settimanale, mensile e annuale. Interazione semplice per aggiungere o trascinare eventi.", + "table_title": "Tabella", + "table_description": "Visualizza e modifica le informazioni relative alle note in una struttura tabellare, con vari tipi di colonne quali testo, numeri, caselle di controllo, data e ora, collegamenti e colori, oltre al supporto per le relazioni. Facoltativamente, è possibile visualizzare le note all'interno di una gerarchia ad albero all'interno della tabella.", + "board_title": "Board", + "board_description": "Organizza le tue attività o lo stato dei tuoi progetti in una lavagna Kanban con un modo semplice per creare nuovi elementi e colonne e modificare facilmente il loro stato trascinandoli sulla lavagna.", + "geomap_title": "Geomappa", + "geomap_description": "Pianifica le tue vacanze o segna i tuoi punti di interesse direttamente su una mappa geografica utilizzando indicatori personalizzabili. Visualizza le tracce GPX registrate per seguire gli itinerari." + }, + "faq": { + "title": "Domande frequenti", + "mobile_question": "Esiste un'applicazione mobile?", + "mobile_answer": "Al momento non esiste un'applicazione mobile ufficiale. Tuttavia, se disponi di un'istanza server, puoi accedervi utilizzando un browser web e persino installarla come PWA. Per Android, esiste un'applicazione non ufficiale chiamata TriliumDroid che funziona anche offline (come un client desktop).", + "database_question": "Dove vengono archiviati i dati?", + "database_answer": "Tutte le tue note saranno archiviate in un database SQLite nella cartella dell'applicazione. Il motivo per cui Trilium utilizza un database anziché file di testo semplice è sia una questione di prestazioni sia perché alcune funzionalità sarebbero molto più difficili da implementare, come i cloni (stessa nota in più punti dell'albero). Per trovare la cartella dell'applicazione, basta andare alla finestra Informazioni.", + "server_question": "Ho bisogno di un server per usare Trilium?", + "server_answer": "No, il server consente l'accesso tramite un browser web e gestisce la sincronizzazione se si dispone di più dispositivi. Per iniziare, è sufficiente scaricare l'applicazione desktop e iniziare a utilizzarla.", + "scaling_question": "Quanto è scalabile l'applicazione con una grande quantità di note?", + "scaling_answer": "A seconda dell'utilizzo, l'applicazione dovrebbe essere in grado di gestire almeno 100.000 note senza problemi. Si noti che il processo di sincronizzazione a volte può fallire se si caricano molti file di grandi dimensioni (1 GB per file), poiché Trilium è concepito più come un'applicazione di knowledge base che come un archivio di file (come NextCloud, ad esempio).", + "network_share_question": "Posso condividere il mio database su un'unità di rete?", + "network_share_answer": "No, in genere non è una buona idea condividere un database SQLite su un'unità di rete. Anche se a volte potrebbe funzionare, c'è il rischio che il database venga danneggiato a causa di blocchi dei file imperfetti sulla rete.", + "security_question": "Come vengono protetti i miei dati?", + "security_answer": "Per impostazione predefinita, le note non sono crittografate e possono essere lette direttamente dal database. Una volta contrassegnata come crittografata, la nota viene crittografata utilizzando AES-128-CBC." + }, + "final_cta": { + "title": "Pronti per iniziare con Trilium Notes?", + "description": "Costruisci la tua conoscenza personale con potenti funzionalità e privacy totale.", + "get_started": "Inizia ora" + }, + "components": { + "link_learn_more": "Per saperne di più...", + "list_with_screenshot_alt": "Screenshot della funzione selezionata" + }, + "download_now": { + "text": "Scarica ora ", + "platform_big": "v{{version}} per {{platform}}", + "platform_small": "per {{platform}}", + "linux_big": "v{{version}} per Linux", + "linux_small": "per Linux", + "more_platforms": "Più piattaforme e configurazione del server" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub Discussions", + "matrix": "Matrix", + "reddit": "Reddit" + }, + "support_us": { + "title": "Supportaci", + "financial_donations_title": "Donazioni pecuniarie", + "financial_donations_description": "Trilium è costruito e mantenuto con centinaia di ore di lavoro. Il tuo supporto permette di mantenerlo open-source, di migliorare le funzionalità e di coprire i costi (ad esempio dell'hosting).", + "financial_donations_cta": "Considera di supportare lo sviluppatore principale dell'applicazione (eliandoran) attraverso:", + "github_sponsors": "Sponsor GitHub", + "paypal": "PayPal", + "buy_me_a_coffee": "Offrimi un caffè" + }, + "footer": { + "copyright_community": "comunità", + "copyright_and_the": " e il " + }, + "contribute": { + "title": "Altre possibilità di contribuzione", + "way_translate": "Traduci l'applicazione nella tua madrelingua su Weblate.", + "way_community": "Interagisci con la comunità su GitHub Discussions o su Matrix.", + "way_reports": "Segnalare i bug tramite GitHub issues.", + "way_document": "Migliora la documentazione segnalandoci eventuali lacune o contribuendo con guide, domande frequenti o tutorial.", + "way_market": "Spargi la voce: condividi Trilium Notes con gli amici, sui blog e sui social media." + }, + "404": { + "title": "404: Non trovato", + "description": "La pagina che stavi cercando non è stata trovata. Forse è stata cancellata o l'URL non è corretto." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64-bit", + "title_arm64": "Windows on ARM", + "description_x64": "Compatibile con dispositivi Intel o AMD con sistema operativo Windows 10 e 11.", + "description_arm64": "Compatibile con dispositivi ARM (ad esempio con Qualcomm Snapdragon).", + "quick_start": "Per installare tramite Winget:", + "download_exe": "Scarica il programma di installazione (.exe)", + "download_zip": "Portatile (.zip)", + "download_scoop": "Scoop" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64-bit", + "title_arm64": "Linux on ARM", + "description_x64": "Per la maggior parte delle distribuzioni Linux, compatibile con l'architettura x86_64.", + "description_arm64": "Per distribuzioni Linux basate su ARM, compatibili con l'architettura aarch64.", + "quick_start": "Seleziona un formato pacchetto appropriato, a seconda della tua distribuzione:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "Portatile (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS per Intel", + "title_arm64": "macOS per Apple Silicon", + "description_x64": "Per Mac basati su Intel con macOS Big Sur o versioni successive.", + "description_arm64": "Per i Mac Apple Silicon, come quelli con chip M1 e M2.", + "quick_start": "Per installare tramite Homebrew:", + "download_dmg": "Scarica il programma di installazione (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "Portatile (.zip)" + }, + "download_helper_server_docker": { + "title": "Self-hosted utilizzando Docker", + "description": "Facile da implementare su Windows, Linux o macOS utilizzando un container Docker.", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "Self-hosted utilizzando Linux", + "description": "Distribuisci Trilium Notes sul tuo server o VPS, compatibile con la maggior parte delle distribuzioni.", + "download_nixos": "Modulo NixOS", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)" + }, + "download_helper_server_hosted": { + "title": "Hosting a pagamento", + "description": "Trilium Notes è ospitato su PikaPods, un servizio a pagamento che consente un facile accesso e una semplice gestione. Non è direttamente affiliato al team Trilium.", + "download_pikapod": "Configurazione su PikaPods", + "download_triliumcc": "In alternativa, consultare trilium.cc" + } +} diff --git a/apps/website/public/translations/ja/translation.json b/apps/website/public/translations/ja/translation.json new file mode 100644 index 000000000..95d9c70c4 --- /dev/null +++ b/apps/website/public/translations/ja/translation.json @@ -0,0 +1,192 @@ +{ + "get-started": { + "title": "はじめる", + "desktop_title": "デスクトップアプリケーションをダウンロード (v{{version}})", + "architecture": "アーキテクチャ:", + "older_releases": "以前のリリースを見る", + "server_title": "複数のデバイスからアクセスできるようにサーバーを設定する" + }, + "hero_section": { + "title": "思考を整理し、自分だけの知識ベースを構築しましょう。", + "subtitle": "Triliumは、ノート作成と個人のナレッジベースの整理に役立つオープンソースソリューションです。デスクトップでローカルで使用することも、セルフホストサーバーと同期してどこにいてもノートを保存することもできます。", + "get_started": "はじめる", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Trilium Notes デスクトップアプリケーションのスクリーンショット" + }, + "organization_benefits": { + "title": "組織", + "note_structure_title": "ノートの構造", + "note_structure_description": "ノートは階層的に整理できます。各ノートにサブノートを作成できるため、フォルダは必要ありません。1つのノートを階層内の複数の場所に追加できます。", + "attributes_title": "ノートのラベルとリレーション", + "attributes_description": "ノート間のリレーションシップを使用したり、ラベルを追加したりすることで、簡単に分類できます。プロモート属性を使用して、表やボードで使用できる構造化された情報を入力できます。", + "hoisting_title": "ワークスペースとホイスト", + "hoisting_description": "ワークスペースの下にグループ化することで、個人用ノートと仕事用ノートを簡単に区別できます。これにより、ノートツリーに特定のノートセットのみが表示されるようになります。" + }, + "productivity_benefits": { + "title": "生産性と安全性", + "revisions_title": "ノートの変更履歴", + "revisions_content": "ノートは定期的にバックグラウンドで保存され、変更履歴は確認や誤って変更してしまった部分を元に戻すために使用できます。また、変更履歴はいつでも作成することができます。", + "sync_title": "同期", + "sync_content": "セルフホスト型またはクラウド インスタンスを使用すると、複数のデバイス間でノートを簡単に同期し、PWA を使用してモバイルからアクセスできます。", + "protected_notes_title": "保護されたノート", + "protected_notes_content": "ノートを暗号化し、パスワードで保護されたセッションでロックすることで、機密性の高い個人情報を保護します。", + "jump_to_title": "クイック検索とコマンド", + "jump_to_content": "あいまい一致によりタイプミスやわずかな違いを考慮しながらタイトルを検索することで、階層全体のノートや UI コマンドにすばやくジャンプできます。", + "search_title": "強力な検索", + "search_content": "ノート内のテキストを検索し、親ノートや階層の深度でフィルタリングして検索を絞り込むこともできます。", + "web_clipper_title": "Web クリッパー", + "web_clipper_content": "Web クリッパー ブラウザ拡張機能を使用して、Web ページ (またはスクリーンショット) を取得し、Trilium に直接配置します。" + }, + "note_types": { + "text_title": "テキストノート", + "text_description": "ノートはビジュアル(WYSIWYG)エディタで編集できます。表、画像、数式、構文ハイライト付きのコードブロックなど、様々な編集機能を備えています。Markdownのような構文やスラッシュコマンドを使って、テキストを素早くフォーマットできます。", + "code_title": "Code ノート", + "code_description": "ソースコードやスクリプトの大きなサンプルでは、多くのプログラミング言語の構文強調表示とさまざまなカラー テーマを備えた専用のエディターが使用できます。", + "file_title": "ファイルノート", + "file_description": "PDF、画像、ビデオなどのマルチメディア ファイルをアプリケーション内にプレビュー表示で埋め込みます。", + "canvas_title": "キャンバス", + "canvas_description": "excalidraw.comと同じ技術を使って、無限のキャンバスに図形、画像、テキストを配置できます。図表、スケッチ、ビジュアルプランニングに最適です。", + "mermaid_title": "Mermaid ダイアグラム", + "mermaid_description": "Mermaid 構文を使用して、フローチャート、クラス図、シーケンス図、ガント チャートなどの図を作成します。", + "mindmap_title": "マインドマップ", + "mindmap_description": "考えを視覚的に整理したり、ブレインストーミング セッションを行ったりします。", + "others_list": "その他: <0>ノートマップ、<1>リレーションマップ、<2>保存された検索、<3>レンダリングノート、<4>Web ビュー。" + }, + "extensibility_benefits": { + "title": "共有と拡張性", + "import_export_title": "インポート / エクスポート", + "import_export_description": "Markdown、ENEX、OML 形式を使用して他のアプリケーションと簡単に連携できます。", + "share_title": "ウェブ上でノートを共有", + "share_description": "サーバーをお持ちの場合は、それを使用してノートの一部を他の人と共有することができます。", + "scripting_title": "高度なスクリプト", + "scripting_description": "カスタムウィジェットまたはサーバー側のロジックを使用して、Trilium 内で独自の統合機能を構築できます。", + "api_title": "REST API", + "api_description": "組み込みの REST API を使用して、プログラムで Trilium と対話します。" + }, + "collections": { + "calendar_title": "カレンダー", + "calendar_description": "カレンダーを使って、個人的な予定や仕事上の予定を管理しましょう。終日イベントと複数日イベントに対応しています。週、月、年表示でイベントを一目で確認できます。イベントの追加やドラッグ操作で簡単に行えます。", + "table_title": "テーブル", + "table_description": "ノートに関する情報を表形式で表示・編集できます。テキスト、数値、チェックボックス、日時、リンク、色など、様々な列タイプに対応し、リレーションもサポートしています。オプションで、ノートを表内のツリー階層に表示することもできます。", + "board_title": "ボード", + "board_description": "新しい項目や列を簡単に作成し、ボード上でドラッグするだけでステータスを変更できるカンバン ボードで、タスクやプロジェクトのステータスを整理できます。", + "geomap_title": "ジオマップ", + "geomap_description": "カスタマイズ可能なマーカーを使って、休暇を計画したり、興味のある場所を地図上に直接マークしたりできます。記録されたGPXトラックを表示して、旅程を追跡できます。" + }, + "faq": { + "title": "よくある質問", + "mobile_question": "モバイルアプリケーションはありますか?", + "mobile_answer": "現在、公式モバイルアプリケーションはありません。ただし、サーバーインスタンスをお持ちの場合は、Web ブラウザからアクセスでき、PWAとしてインストールすることもできます。Android 向けには、オフラインでも動作する TriliumDroid という非公式アプリケーションがあります(デスクトップクライアントと同様です)。", + "database_question": "データはどこに保存されますか?", + "database_answer": "すべてのノートはアプリケーションフォルダ内の SQLite データベースに保存されます。Trilium がプレーンテキストファイルではなくデータベースを使用する理由は、パフォーマンスと、クローン(ツリー内の複数の場所に同じノートが存在する状態)などの一部の機能の実装がはるかに困難になるからです。アプリケーションフォルダを見つけるには、「About」ウィンドウを開いてください。", + "server_question": "Trilium を使用するにはサーバーが必要ですか?", + "server_answer": "いいえ、サーバーは Web ブラウザ経由でアクセスを許可し、複数のデバイスがある場合の同期を管理します。使いはじめるには、デスクトップアプリケーションをダウンロードして使いはじめるだけで十分です。", + "scaling_question": "アプリケーションは大量のノートに対してどの程度拡張できますか?", + "scaling_answer": "使用状況にもよりますが、アプリケーションは少なくとも10万件のノートを問題なく処理できるはずです。ただし、Trilium はファイルストア(例えば NextCloud)ではなく、ナレッジベースアプリケーションとして設計されているため、大容量ファイル(1 ファイルあたり 1GB)を多数アップロードすると同期プロセスが失敗する場合があることにご注意ください。", + "network_share_question": "データベースをネットワークドライブ経由で共有できますか?", + "network_share_answer": "いいえ、一般的に SQLite データベースをネットワークドライブ経由で共有するのはお勧めできません。場合によっては動作することもありますが、ネットワーク経由のファイルロックが不完全であるため、データベースが破損する可能性がありえます。", + "security_question": "データはどのように保護されますか?", + "security_answer": "デフォルトではノートは暗号化されておらず、データベースから直接読み取ることができます。ノートが暗号化済みとしてマークされると、AES-128-CBC を使用して暗号化されます。" + }, + "final_cta": { + "title": "Trilium Notes を使いはじめる準備はできましたか?", + "description": "強力な機能と完全なプライバシーを備えた個人の知識ベースを構築します。", + "get_started": "はじめる" + }, + "components": { + "link_learn_more": "さらに詳しく...", + "list_with_screenshot_alt": "選択中の機能のスクリーンショット" + }, + "download_now": { + "text": "今すぐダウンロード ", + "platform_big": "v{{version}} for {{platform}}", + "platform_small": "for {{platform}}", + "linux_big": "v{{version}} for Linux", + "linux_small": "for Linux", + "more_platforms": "より多くのプラットフォームとサーバー設定" + }, + "footer": { + "copyright_and_the": " および ", + "copyright_community": "コミュニティ" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHubディスカッション", + "matrix": "Matrix", + "reddit": "Reddit" + }, + "support_us": { + "title": "私たちをサポートしてください", + "financial_donations_title": "資金援助", + "financial_donations_description": "Trilium は 数百時間もの作業 をかけて構築・維持されています。皆様のご支援により、オープンソースとしての維持、機能の向上、ホスティングなどの費用を賄うことができます。", + "financial_donations_cta": "次の方法で、アプリケーションの主な開発者 (eliandoran) をサポートすることを検討してください:", + "github_sponsors": "GitHub Sponsors", + "paypal": "PayPal", + "buy_me_a_coffee": "Buy Me A Coffee" + }, + "contribute": { + "title": "その他の貢献方法", + "way_translate": "Weblate を使用して、アプリケーションを母国語に翻訳してください。", + "way_community": "GitHub Discussions または Matrix でコミュニティと交流しましょう。", + "way_reports": "GitHub issues でバグを報告してください。", + "way_document": "ドキュメントの不足している点をお知らせいただくか、ガイド、FAQ、チュートリアルを投稿して、ドキュメントを改善してください。", + "way_market": "広めましょう: Trilium Notes を友達やブログ、ソーシャルメディアで共有しましょう。" + }, + "404": { + "title": "404: Not Found", + "description": "お探しのページは見つかりませんでした。削除されたか、URLが間違っている可能性があります。" + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64-bit", + "title_arm64": "Windows on ARM", + "description_x64": "Windows 10 および 11 を実行している Intel または AMD デバイスと互換性があります。", + "description_arm64": "ARM デバイス (例 Qualcomm Snapdragon など) と互換性があります。", + "quick_start": "Winget 経由でインストールするには:", + "download_exe": "インストーラーをダウンロード (.exe)", + "download_zip": "ポータブル (.zip)", + "download_scoop": "Scoop" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64-bit", + "title_arm64": "Linux on ARM", + "description_x64": "ほとんどの Linux ディストリビューションでは、x86_64 アーキテクチャと互換性があります。", + "description_arm64": "ARM ベースの Linux ディストリビューションの場合、aarch64 アーキテクチャと互換性があります。", + "quick_start": "ディストリビューションに応じて適切なパッケージ形式を選択してください:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "ポータブル (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "Intel 向け macOS", + "title_arm64": "Apple Silicon 向け macOS", + "description_x64": "macOS Big Sur 以降を実行している Intel ベースの Mac 向け。", + "description_arm64": "M1 および M2 チップを搭載した Apple Silicon Mac 向け。", + "quick_start": "Homebrew 経由でインストールするには:", + "download_dmg": "インストーラーをダウンロード (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "ポータブル (.zip)" + }, + "download_helper_server_docker": { + "title": "Docker を使用したセルフホスト", + "description": "Docker コンテナを使用して、Windows、Linux、または macOS に簡単に展開できます。", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "Linux でセルフホスト", + "description": "ほとんどのディストリビューションと互換性のある Trilium Notes を独自のサーバー、または VPS に展開できます。", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)", + "download_nixos": "NixOS モジュール" + }, + "download_helper_server_hosted": { + "title": "有料ホスティング", + "description": "Trilium Notesは、アクセスと管理を容易にする有料サービス PikaPods でホストされています。Trilium チームとは直接関係ありません。", + "download_pikapod": "PikaPods にセットアップする", + "download_triliumcc": "または、trilium.cc を参照してください" + } +} diff --git a/apps/website/public/translations/ko/translation.json b/apps/website/public/translations/ko/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/ko/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/md/translation.json b/apps/website/public/translations/md/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/md/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/nb-NO/translation.json b/apps/website/public/translations/nb-NO/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/nb-NO/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/nl/translation.json b/apps/website/public/translations/nl/translation.json new file mode 100644 index 000000000..fc4b454d2 --- /dev/null +++ b/apps/website/public/translations/nl/translation.json @@ -0,0 +1,34 @@ +{ + "get-started": { + "title": "Aan de slag", + "desktop_title": "Download de desktop applicatie (v{{version}})", + "architecture": "Architectuur:", + "older_releases": "Bekijk oudere versies", + "server_title": "Richt een server in voor toegang vanaf meerdere apparaten" + }, + "hero_section": { + "title": "Organiseer je gedachten. Bouw je persoonlijke kennisbank.", + "subtitle": "Trilium is een open-source oplossing voor notities en het organiseren van een persoonlijke kennisbank. Gebruik het lokaal op je desktop, of synchroniseer het met je zelfgehoste server om je notities overal bij de hand te hebben.", + "get_started": "Aan de slag", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Schermafbeelding van de Trilium Notes-desktopapplicatie" + }, + "organization_benefits": { + "title": "Organisatie", + "note_structure_title": "Notitie structuur", + "note_structure_description": "Notities kunnen hiërarchisch worden geordend. Mappen zijn niet nodig, aangezien elke notitie subnotities kan bevatten. Een enkele notitie kan bovendien op meerdere plaatsen in de hiërarchie worden toegevoegd.", + "attributes_title": "Notitielabels en relaties", + "attributes_description": "Gebruik relaties tussen notities of voeg labels toe voor eenvoudige categorisatie. Gebruik gepromoveerde attributen om gestructureerde informatie in te voeren die kan worden gebruikt in tabellen en borden.", + "hoisting_title": "Werkruimtes en focus (hoisting)", + "hoisting_description": "Scheid eenvoudig je persoonlijke en werknotities door ze te groeperen onder een werkruimte, waarmee je de notitieboom kunt focussen op een specifieke set notities." + }, + "productivity_benefits": { + "title": "Productiviteit en veiligheid", + "revisions_title": "Notitie revisies", + "revisions_content": "Notities worden periodiek op de achtergrond opgeslagen, en versies kunnen worden gebruikt om wijzigingen te bekijken of om per ongeluk gemaakte aanpassingen ongedaan te maken. Revisies kunnen ook handmatig worden aangemaakt.", + "sync_title": "Synchronisatie", + "sync_content": "Gebruik een zelfgehoste of cloudinstantie om je notities eenvoudig te synchroniseren tussen meerdere apparaten, en om er via een PWA toegang toe te krijgen op je mobiele telefoon.", + "protected_notes_title": "Beveiligde notities" + } +} diff --git a/apps/website/public/translations/pl/translation.json b/apps/website/public/translations/pl/translation.json new file mode 100644 index 000000000..4d4c5df02 --- /dev/null +++ b/apps/website/public/translations/pl/translation.json @@ -0,0 +1,192 @@ +{ + "get-started": { + "desktop_title": "Pobierz wersję desktopową (v{{version}})", + "architecture": "Architektura:", + "older_releases": "Sprawdź poprzednie wydania", + "server_title": "Skonfiguruj serwer, aby mieć dostęp z wielu urządzeń", + "title": "Start" + }, + "hero_section": { + "title": "Uporządkuj swoje myśli i zbuduj bazę Twojej wiedzy.", + "subtitle": "Trilium to otwartoźródłowe rozwiązanie do notowania i organizacji swojej personalnej bazy wiedzy. Używaj go lokalnie na swoim komputerze lub synchronizuj swoje notatki na własnym serwerze i miej do nich dostęp gdziekolwiek jesteś.", + "get_started": "Start", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Zrzut ekranu wersji desktopowej Trilium Notes" + }, + "organization_benefits": { + "title": "Układ", + "note_structure_title": "Struktura notatek", + "note_structure_description": "Notatki mogą być ułożone w hierarchię. Każda notatka może zawierać w sobie inne, co pozwala umieścić tą samą notatkę w wielu miejscach w hierarchii i nie wymusza to tworzenia dodatkowych folderów.", + "attributes_title": "Etykiety i korelacje", + "attributes_description": "Porządkuj łatwiej swoje notatki przy użyciu relacji i etykiet, używaj ich jako odnośników w tabelach i tablicach.", + "hoisting_title": "Przestrzenie robocze i windowanie notatek", + "hoisting_description": "Łatwo oddziel swoje personalne notatki od tych z pracy przez grupowanie ich w przestrzenie robocze, które pomogą ci się skupić na danym temacie." + }, + "productivity_benefits": { + "title": "Produktywność i bezpieczeństwo", + "revisions_title": "Historia zmian", + "revisions_content": "Notatki są regularnie zapisywane w tle, co pozwala to przeglądać i cofać wprowadzone zmiany. Zapisy można także wykonywać \"na życzenie\".", + "sync_title": "Synchronizacja", + "sync_content": "Używaj własnych lub chmurowych instancji do łatwiejszej synchronizacji notatek między wieloma urządzeniami, w tym twoim telefonem używając PWA.", + "protected_notes_title": "Notatki chronione", + "protected_notes_content": "Chroń wrażliwe informacje szyfrując notatki i blokując dostęp do nich za pomocą hasła sesji.", + "jump_to_title": "Szybkie wyszukiwanie i komendy", + "jump_to_content": "Szybko i łatwo wyszukuj swoje notatki używając funkcji lub komend, nawet gdy nie pamiętasz dokładnej ich nazwy.", + "search_title": "Dokładne wyszukiwanie", + "search_content": "Albo wyszukaj tekst w notatkach, możesz dostosować zakres szukania do konkretnej notatki albo hierarchii pliku.", + "web_clipper_title": "Web clipper", + "web_clipper_content": "Dołączaj strony internetowe albo ich zrzuty i umieszczaj je bezpośrednio w swoich notatkach dzięki rozszerzeniu do przeglądarki." + }, + "note_types": { + "text_title": "Notatki tekstowe", + "text_description": "Edytuj notatki w graficznym interfejsie (WYSIWYG), który wspiera tabele, obrazy, działania matematyczne i bloki kodu z podświetlaniem składni. Szybko formatuj tekst używając skrótów (Markdown), jak i komend (/).", + "code_title": "Notatki kodowe", + "code_description": "Duże fragmenty kodu źródłowego albo skryptów można umieścić w dedykowanych plikach z własnym edytorem. Podświetlenie składni i struktur, różne motywy i wsparcie dla wielu języków programowania ułatwi edycję.", + "file_title": "Obsługa plików", + "file_description": "Dodawaj pliki takie jak PDF-y, zdjęcia i pliki wideo z podglądem w aplikacji.", + "canvas_title": "Płótno", + "canvas_description": "Dodawaj kształty, zdjęcia i tekst na nieskończonym płótnie, używając tej samej technologii co excalidraw.com. Idealne do diagramów, szkiców i projektowania.", + "mermaid_title": "Diagramy Mermaid", + "mermaid_description": "Twórz diagramy, takie jak schematy blokowe, diagramy klas i sekwencyjne, wykresy Gantta i wiele innych, korzystając z składni Mermaid.", + "mindmap_title": "Mapy myśli", + "mindmap_description": "Organizuj wizualnie swoje myśli albo przeprowadź sesję burzy mózgów.", + "others_list": "I wiele innych: <0>mapa notatek, <1>mapa powiązań, <2>zapisane wyszukiwania, <3>renderowane notatki, and <4>podgląd stron www." + }, + "extensibility_benefits": { + "title": "Udostępnianie i rozszerzenia", + "import_export_title": "Import/Export", + "import_export_description": "Łatwa interakcja z innymi aplikacjami przy użyciu formatów Markdown, ENEX i OLM.", + "share_title": "Udostępniaj notatki w internecie", + "share_description": "Jeśli masz własny serwer, możesz go używać do udostępniania danych notatek z innymi.", + "scripting_title": "Zaawansowane skrypty", + "scripting_description": "Stwórz swoje własne integracje z Trilium przy użyciu personalizowanych widżetów albo z serwerowych skryptów.", + "api_title": "REST API", + "api_description": "Twórz integracje Trilium z użyciem REST API." + }, + "collections": { + "calendar_title": "Kalendarze", + "calendar_description": "Organizuj swoje prywatne i służbowe wydarzenia używając kalendarza. Miej plany pod kontrolą z tygodniowym, miesięcznym i rocznym podglądem. Twórz i edytuj wydarzenia w prosty i intuicyjny sposób.", + "table_title": "Tabele", + "table_description": "Wyświetlaj i edytuj informacje o notatkach w tabelach na wiele sposobów dzięki wielu typom kolumn: Tekstowym, numerycznym, z polami wyboru, z datami i godzinami, zawierającym linki, z kolorowymi wypełnieniami i powiązaniami notatek. Możesz nawet wyświetlić całe drzewo hierarchii w tabeli.", + "board_title": "Tablice", + "board_description": "Organizuj swoje zadania i postępy projektów w tablicach Kanban z prostym tworzeniem nowych elementów i kolumn, a możliwość graficznego ich przenoszenia ułatwi zmianę statusu i pozwoli zachować porządek.", + "geomap_title": "Mapy", + "geomap_description": "Zaplanuj wakacje albo interesujące miejsca bezpośrednio na mapie, używaj personalizowanych pinezek. Dzięki możliwości importu plików GPX możesz wyświetlać przebyte trasy." + }, + "faq": { + "title": "Częste pytania", + "mobile_question": "Czy jest dostępna aplikacja mobilna?", + "mobile_answer": "Aktualnie nie ma oficjalnej aplikacji mobilnej, jednak jeśli posiadasz uruchomioną aplikacje na serwerze, to możesz mieć dostęp za pomocą przeglądarki, a nawet zainstalować ją jako PWA. Dla systemu android jest nieoficjalna aplikacja \"TriliumDroid\", która działa nawet w trybie offline (jak zwykła desktopowa).", + "database_question": "Gdzie są przechowywane moje dane?", + "database_answer": "Wszystkie twoje notatki są przechowywane w bazie danych SQLite, w folderze aplikacji (lokalnie). Trilium używa baz danych zamiast zwykłych plików tekstowych dla lepszej wydajności i niektórych funkcji, które byłoby trudno zaimplementować w inny sposób (np. ta sama notatka w wielu miejscach). Folder aplikacji możesz łatwo znaleźć w zakładce \"O programie\".", + "server_question": "Czy muszę posiadać serwer, aby używać Trilium?", + "server_answer": "Nie, serwer umożliwia dostęp do aplikacji z poziomu przeglądarki, i obsługuje synchronizację na wielu urządzeniach. Z początku wystarczającym rozwiązaniem jest aplikacja desktopowa.", + "scaling_question": "Jak dobrze aplikacja radzi sobie z dużą ilością notatek?", + "scaling_answer": "W zależności od użycia, aplikacja powinna być w stanie utrzymać bezproblemowo do 100 000 notatek. Trzeba zaznaczyć, że synchronizacja czasami może skończyć się niepowodzeniem w przypadku wielu plików ponad 1GB. Trilium jest bardziej przystosowane do tworzenia baz wiedzy, niż do jako katalog plików (np. NextCloud).", + "network_share_question": "Czy mogę udostępniać moje bazy danych przez dyski sieciowe?", + "network_share_answer": "Nie, ogólnie przesyłanie baz SQLite przez dyski sieciowe nie jest dobrym pomysłem. Czasami może to zadziałać, ale istnieje szansa, że taka baza danych może zostać uszkodzona przez niedoskonałości blokad plików w sieci.", + "security_question": "Jak są chronione moje dane?", + "security_answer": "Domyślnie notatki nie są szyfrowane i mogą być odczytane bezpośrednio z bazy danych. Kiedy notatka zostanie oznaczona jako zaszyfrowana, to ta notatka szyfrowana jest używając AES-128-CBC." + }, + "final_cta": { + "title": "Gotowy aby zacząć przygodę z Trilium Notes?", + "description": "Zbuduj swoją personalną bazę wiedzy z zaawansowanymi funkcjami i pełną prywatnością.", + "get_started": "Start" + }, + "components": { + "link_learn_more": "Dowiedz się więcej....", + "list_with_screenshot_alt": "Zrzut ekranu wybranej funkcji" + }, + "download_now": { + "text": "Pobierz teraz ", + "platform_big": "v{{version}} dla {{platform}}", + "platform_small": "dla {{platform}}", + "linux_big": "v{{version}} dla Linuxa", + "linux_small": "dla Linuxa", + "more_platforms": "Więcej platform i konfiguracja serwera" + }, + "footer": { + "copyright_and_the": " i ", + "copyright_community": "społeczność" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub - Forum", + "matrix": "Matrix", + "reddit": "Reddit" + }, + "support_us": { + "title": "Wesprzyj nas", + "financial_donations_title": "Wsparcie finansowe", + "financial_donations_description": "Trilium jest tworzone i rozwijane przez setki godzin pracy. Twoje wsparcie utrzymuje projekt jako otwartoźródłowy, pomaga dodawać nowe rzeczy i pokrywa koszty hostingu.", + "financial_donations_cta": "Rozważ wsparcie głównego programisty (eliandoran) poza aplikacją przez:", + "github_sponsors": "GitHub Sponsors", + "paypal": "PayPal", + "buy_me_a_coffee": "Postaw mi wirtualną kawę" + }, + "contribute": { + "title": "Inne sposoby wsparcia", + "way_translate": "Przetłumacz aplikacja na swój natywny język przez Weblate.", + "way_community": "Dołącz do społeczności na GitHub Discussions lub na Matrix.", + "way_reports": "Zgłoś błędy przezGitHub issues.", + "way_document": "Pomóż nam w doskonaleniu dokumentacji przez informowanie nas o lukach albo sam pomóż w tworzeniu treści (dokumentacja, FAQ, poradniki).", + "way_market": "Powiedz o nas swoim znajomym, na blogu albo na social mediach." + }, + "404": { + "title": "404: Nie znaleziono strony", + "description": "Strona, której szukasz, nie istnieje. Mogła zostać usunięta, albo wpisany adres jest niepoprawny." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64-bit", + "title_arm64": "Windows na ARM", + "description_x64": "Kompatybilne z urządzeniami Intel i AMD działającymi pod kontrolą Windows 10 i 11.", + "description_arm64": "Kompatybilne z procesorami ARM (np. Qualcomm Snapdragon).", + "quick_start": "Aby zainstalować przez WinGet:", + "download_exe": "Pobierz instalator (.exe)", + "download_zip": "Wersja przenośna - Portable (.zip)", + "download_scoop": "Scoop" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64-bit", + "title_arm64": "Linux na ARM", + "description_x64": "Dla większości dystrybucji Linux, kompatybilnych z architekturą x86_64.", + "description_arm64": "Dla dystrybucji ARM Linux kompatybilnych z architekturą aarch64.", + "quick_start": "Wybierz odpowiedni format paczki, w zależności od twojej dystrybucji:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "Wersja przenośna - Portable (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS z Intel", + "title_arm64": "macOS z Apple Silicon (ARM)", + "description_x64": "Dla macOS w wersji Big Sur i późniejszymi, z procesorem Intel.", + "description_arm64": "Dla produktów Apple z procesorami M1 i M2.", + "quick_start": "Instalacja przez Homebrew:", + "download_dmg": "Pobierz instalator (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "Wersja przenośna - Portable (.zip)" + }, + "download_helper_server_docker": { + "title": "Własny serwer przez Docker", + "description": "Łatwa instalacja na Windows, Linux albo macOS używając Docker container.", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "Własny serwer na Linux", + "description": "Wrzuć Trilium Notes na swój serwer albo VPS, kompatybilne z większością dystrybucji.", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)", + "download_nixos": "moduł NixOS" + }, + "download_helper_server_hosted": { + "title": "Płatny Serwer - Hosting", + "description": "Trilium Notes hostowane na PikaPods, płatnym serwisie dla łatwego dostępu i zarządzania. Bezpośrednio nie związanie z Trilium team.", + "download_pikapod": "Konfiguruj na PikaPods", + "download_triliumcc": "Alternatywnie patrz na trilium.cc" + } +} diff --git a/apps/website/public/translations/pt-BR/translation.json b/apps/website/public/translations/pt-BR/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/pt-BR/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/pt/translation.json b/apps/website/public/translations/pt/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/pt/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/ro/translation.json b/apps/website/public/translations/ro/translation.json new file mode 100644 index 000000000..18e47da9e --- /dev/null +++ b/apps/website/public/translations/ro/translation.json @@ -0,0 +1,192 @@ +{ + "get-started": { + "title": "Primii pași", + "desktop_title": "Descărcați aplicația desktop (v{{version}})", + "architecture": "Arhitectură:", + "older_releases": "Versiuni mai vechi", + "server_title": "Versiunea server, pentru acces pe mai multe dispozitive" + }, + "hero_section": { + "title": "Organizați-vă gândurile. Construiți-vă propria bază de cunoștințe digitală.", + "subtitle": "Trilium este o aplicație open-source pentru notițe și pentru organizarea unei baze de cunoștințe personală. Se poate folosi local pe desktop sau se poate sincroniza cu un server găzduit de dvs. pentru a putea accesa notițele de oriunde.", + "get_started": "Primii pași", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Captură de ecran a aplicației de desktop Trilium Notes" + }, + "organization_benefits": { + "title": "Funcții de organizare", + "note_structure_title": "Structura notițelor", + "note_structure_description": "Notițele pot fi aranjate ierarhic. Nu este nevoie de dosare, deoarece fiecare notiță poate conține sub-notițe. O singură notiță poate fi adăugată în mai multe locuri în ierarhie.", + "attributes_title": "Etichete și relații pentru notițe", + "attributes_description": "Folosiți relațiile dintre notițe sau adăugați etichete pentru o categorizare ușoară. Folosiți atribute promovate pentru a introduce informații structurate ce pot fi utilizate ulterior în tabele sau table Kanban.", + "hoisting_title": "Spații de lucru și focalizare", + "hoisting_description": "Separați cu ușurință notițele personale și de muncă prin gruparea lor într-un spațiu de lucru, ce focalizează arborele de notițe astfel încât afișează un anumit set de notițe." + }, + "productivity_benefits": { + "title": "Productivitate și siguranță", + "revisions_title": "Revizii ale notițelor", + "revisions_content": "Notițele sunt salvate periodic în fundal, iar reviziile acestora pot fi utilizate pentru comparație sau pentru a anula modificări accidentale. Reviziile pot fi create și manual.", + "sync_title": "Sincronizare", + "sync_content": "Folosiți o instanță găzduită de dvs. sau în cloud pentru a putea sincroniza rapid notițele între mai multe dispozitive și pentru a putea să le accesați utilizând telefonul mobil (prin PWA).", + "protected_notes_title": "Notițe protejate", + "protected_notes_content": "Protejați informațiile personale prin criptarea acestora în spatele unei sesiuni protejate prin parolă.", + "jump_to_title": "Căutare și comenzi rapide", + "jump_to_content": "Navigați rapid printre notițe sau comenzi căutând după numele acestora, având căutare de tip fuzzy pentru a ignora greșeli de tastare sau diferențe minore.", + "search_title": "Căutare performantă", + "search_content": "Căutați în interiorul notițelor și reduceți numărul de rezultate prin filtrarea după notița părinte, sau după adâncime.", + "web_clipper_title": "Clipper web", + "web_clipper_content": "Preluați pagini web (sau capturi de ecran), care vor apărea direct în Trilium utilizând extensia de browser „Clipper web”." + }, + "note_types": { + "text_title": "Notițe de tip text", + "text_description": "Aceste notițe sunt editate printr-un editor vizual (WYSIWYG), cu suport pentru tabele, imagini, expresii matematice și blocuri de cod cu evidențierea sintaxei. Formatați rapid textul folosind sintaxă similară cu Markdown sau folosind comenzi la tasta slash.", + "code_title": "Notițe de tip cod", + "code_description": "Stocați secvențe mari de cod sau script-uri utilizând un editor dedicat, cu evidențierea sintaxei pentru multe limbaje de programare și multiple teme de culori.", + "file_title": "Notițe de tip fișier", + "file_description": "Adăugați fișiere multimedia precum PDF-uri, imagini și video-uri cu previzualizare direct în aplicație.", + "canvas_title": "Schițe", + "canvas_description": "Aranjați forme geometrice, imagini și text pe o schiță infinită, utilizând aceeași tehnologie din spatele excalidraw.com. Ideală pentru diagrame, desene și planificare vizuală.", + "mermaid_title": "Diagrame Mermaid", + "mermaid_description": "Creați diagrame precum flowchart-uri, diagrame de secvență sau de clase, Gantt și multe altele, folosind sintaxa Mermaid.", + "mindmap_title": "Hartă mentală", + "mindmap_description": "Organizați-vă gândurile vizual sau organizați o sesiune de brainstorming.", + "others_list": "și altele: <0>hartă a notițelor, <1>hartă a relațiilor, <2>căutări salvate, <3>randare a notițelor, și <4>vizualizări web." + }, + "extensibility_benefits": { + "title": "Partajare și extensibilitate", + "import_export_title": "Import/export", + "import_export_description": "Interacționați rapid cu alte aplicații utilizând formatele Markdown, ENEX și OML.", + "share_title": "Publicați notițe pe Internet", + "share_description": "Dacă aveți o instanță de server, puteți să partajați pe Internet un set de notițe.", + "scripting_title": "Script-are avansată", + "scripting_description": "Construiți-vă propriile integrări cu Trilium utilizând widget-uri personalizate sau logică la nivel de server.", + "api_title": "API REST", + "api_description": "Interacționați cu Trilium programatic folosind API-ul REST integrat." + }, + "collections": { + "calendar_title": "Calendar", + "calendar_description": "Organizați-vă evenimentele personale sau profesionale folosind un calendar, cu suport pentru evenimente pe toată ziua sau chiar pe mai multe zile. Vedeți evenimentele cu ușurință la nivel de săptămână, lună sau an. Interacțiune ușoară pentru a adăuga sau muta evenimente.", + "table_title": "Tabel", + "table_description": "Afișați și editați informații despre notițe într-o structură tabelară, cu multiple tipuri de coloane precum text, număr, bife, dată și timp, link-uri, culori și suport pentru relații. Opțional se poate afișa și structura ierarhică a notițelor în interiorul tabelului.", + "board_title": "Tabelă Kanban", + "board_description": "Organizați-vă sarcinile sau proiectele într-o tabelă Kanban cu o modalitate ușoară de a adăuga elemente și coloane noi și schimbarea stării acestora prin glisare cu mouse-ul.", + "geomap_title": "Hartă geografică", + "geomap_description": "Planificați-vă vacanțele sau marcați-vă punctele de interes direct pe o hartă geografică. Afișați traseele GPX înregistrate pentru a putea urmări itinerarii." + }, + "faq": { + "title": "Întrebări frecvente", + "mobile_question": "Există o aplicație de mobil?", + "mobile_answer": "În momentul de față nu există o aplicație de mobil oficială. Totuși, dacă aveți o instanță de server o puteți accesa folosind un navigator web și o puteți instala ca un PWA. Pentru Android, există o aplicație neoficială denumită TriliumDroid care poate funcționa chiar și offline (similar cu aplicația de desktop).", + "database_question": "Unde sunt stocate datele?", + "database_answer": "Toate notițele sunt stocate într-o bază de date SQLite la nivelul unui dosar al aplicației. Motivul pentru care Trilium folosește o bază de date în locul de fișiere text este legat de performanță și deoarece unele funcții ar fi fost mult mai greu de replicat precum clone (aceeași notițe în mai multe locuri). Pentru a găsi folder-ul aplicației, mergeți în fereastra „Despre”.", + "server_question": "Am nevoie de un server să folosesc Trilium?", + "server_answer": "Nu, server-ul permite accesarea printr-un browser web și coordonează sincronizarea dacă aveți dispozitive multiple. Pentru început este suficient să descărcați aplicația de desktop și s-o folosiți.", + "scaling_question": "Cât de bine suportă aplicația un număr mare de notițe?", + "scaling_answer": "În funcție de modul de utilizare, aplicația ar trebui să suporte cel puțin 100.000 de notițe fără probleme. De avut în vedere faptul că procesul de sincronizare poate eșua dacă se încarcă prea multe fișiere mari (ex. 1 GB per fișier) deoarece Trilium este prevăzut mai mult ca o aplicație de bază de cunoștințe decât de stocare a fișierelor (precum NextCloud, spre exemplu).", + "network_share_question": "Pot partaja baza mea de date pe rețea?", + "network_share_answer": "Nu, nu este o idee bună să partajați o bază de date SQLite pe rețea. Deși uneori poate funcționa, sunt șanse mari ca baza de date să se corupă din cauza sistemului de blocare al fișierului la nivel de rețea.", + "security_question": "Cum sunt datele mele protejate?", + "security_answer": "În mod implicit, notițele nu sunt criptate și pot fi citite direct din baza de date. Odată ce o notiță este marcată drept protejată, conținutul este criptat folosind AES-128-CBC." + }, + "final_cta": { + "title": "Gata de a folosi Trilium Notes?", + "description": "Construiți-vă baza de cunoștințe personală cu funcții puternice și intimitate maximă.", + "get_started": "Începe" + }, + "components": { + "link_learn_more": "Mai multe detalii...", + "list_with_screenshot_alt": "Captură de ecran a funcției selectate" + }, + "download_now": { + "text": "Descărcați acum ", + "platform_big": "v{{version}} pentru {{platform}}", + "platform_small": "pentru {{platform}}", + "linux_big": "v{{version}} pentru Linux", + "linux_small": "pentru Linux", + "more_platforms": "Mai multe platforme și instalarea server-ului" + }, + "footer": { + "copyright_and_the": " și ", + "copyright_community": "comunitatea" + }, + "support_us": { + "title": "Sprijină-ne", + "financial_donations_title": "Donații financiare", + "financial_donations_description": "Trilium este construit și menținut prin sute de ore de muncă. Sprijinul dvs. ne ajută să-l menținem open-source, să îmbunătățim funcțiile și să acoperim costuri precum găzduirea.", + "financial_donations_cta": "Considerați sprijinirea dezvoltatorului principal al aplicației (eliandoran) prin:", + "github_sponsors": "Sponsori GitHub", + "paypal": "PayPal", + "buy_me_a_coffee": "Buy Me A Coffee" + }, + "contribute": { + "title": "Alte modalități de a contribui", + "way_translate": "Traduceți aplicația într-o limbă străină prin Weblate.", + "way_community": "Interacționați cu comunitatea pe Discuții GitHub sau pe Matrix.", + "way_reports": "Raportați bug-uri prin GitHub Issues.", + "way_document": "Îmbunătățiți documentația prin a ne informa de lacune în documentație sau prin a contribui ghiduri, întrebări frecvente și tutoriale.", + "way_market": "Informați-vă prietenii, colegii despre Trilium Notes sau prin blog-uri și social media." + }, + "404": { + "title": "404: Nu s-a găsit pagina", + "description": "Pagina pe care ați căutat-o nu a putut fi găsită. Posibil să fi fost ștearsă sau URL-ul să fie incorect." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64 biți", + "title_arm64": "Windows pe ARM", + "description_x64": "Compatibil cu dispozitive Intel sau AMD ce rulează Windows 10 și 11.", + "description_arm64": "Compatibil cu dispozitive ARM (ex. cu Qualcomm Snapdragon).", + "quick_start": "Instalare prin Winget:", + "download_exe": "Descarcă Installer (.exe)", + "download_zip": "Portabil (.zip)", + "download_scoop": "Scoop" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64 biți", + "title_arm64": "Linux pe ARM", + "description_x64": "Pentru majoritatea distribuțiilor, compatibilă cu arhitectura x86_64.", + "description_arm64": "Pentru distribuțiile bazate pe ARM, compatibilă cu arhitectura aarch64.", + "quick_start": "Selectați un format de împachetare potrivit pentru distribuția dvs.:", + "download_deb": ".deb", + "download_zip": "Portabil (.zip)", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS pentru Intel", + "title_arm64": "macOS pentru Apple Silicon", + "description_x64": "Pentru Mac-uri bazate pe Intel ce rulează macOS Big Sur sau mai nou.", + "description_arm64": "Pentru Mac-uri bazate pe Apple Silicon, precum cele cu chip-uri M1, M2.", + "quick_start": "Instalați prin Homebrew:", + "download_dmg": "Descarcă instalatorul (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "Portabil (.zip)" + }, + "download_helper_server_docker": { + "title": "Găzduit în regim propriu prin Docker", + "description": "Lansați rapid o instanță pe Windows, Linux sau macOS folosind un container Docker.", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "Găzduit în regim propriu pe Linux", + "description": "Rulați Trilium Notes pe propriul server sau VPS, compatibil cu majoritatea distribuțiilor.", + "download_tar_x64": "x64 (.tar.xz)", + "download_nixos": "Modul NixOS", + "download_tar_arm64": "ARM (.tar.xz)" + }, + "download_helper_server_hosted": { + "title": "Găzduire contra cost", + "description": "Trilium Notes găzduit pe PikaPods, un serviciu plătit pentru acces facil. Nu este direct afiliat cu echipa Trilium.", + "download_pikapod": "Folosește PikaPods", + "download_triliumcc": "Alternativ, trilium.cc" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub Discussions", + "matrix": "Matrix", + "reddit": "Reddit" + } +} diff --git a/apps/website/public/translations/ru/translation.json b/apps/website/public/translations/ru/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/ru/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/sl/translation.json b/apps/website/public/translations/sl/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/sl/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/sr/translation.json b/apps/website/public/translations/sr/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/sr/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/sv/translation.json b/apps/website/public/translations/sv/translation.json new file mode 100644 index 000000000..46df51fba --- /dev/null +++ b/apps/website/public/translations/sv/translation.json @@ -0,0 +1,7 @@ +{ + "get-started": { + "title": "Kom igång", + "desktop_title": "Ladda ner skrivbordsprogrammet (v{{version}})", + "architecture": "Arkitektur:" + } +} diff --git a/apps/website/public/translations/tr/translation.json b/apps/website/public/translations/tr/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/tr/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/uk/translation.json b/apps/website/public/translations/uk/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/public/translations/uk/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/public/translations/vi/translation.json b/apps/website/public/translations/vi/translation.json new file mode 100644 index 000000000..c9568f8dd --- /dev/null +++ b/apps/website/public/translations/vi/translation.json @@ -0,0 +1,17 @@ +{ + "get-started": { + "title": "Bắt đầu", + "desktop_title": "Tải về ứng dụng desktop (v{{version}})", + "architecture": "Kiến trúc:", + "older_releases": "Xem các bản phát hành cũ hơn", + "server_title": "Thiết lập máy chủ để truy cập trên nhiều thiết bị" + }, + "hero_section": { + "title": "Sắp xếp những suy nghĩ. Xây dựng cơ sở tri thức cá nhân của bạn.", + "subtitle": "Trilium là một giải pháp mã nguồn mở cho việc ghi chú và tổ chức cơ sở tri thức cá nhân. Sử dụng nó cục bộ trên máy tính, hoặc đồng bộ với một máy chủ tự triển khai của riêng bạn để mang theo các ghi chú mọi nơi bạn đến.", + "get_started": "Bắt đầu", + "github": "Github", + "dockerhub": "Kho Docker", + "screenshot_alt": "Ảnh chụp màn hình ứng dụng Trilium Notes (desktop)" + } +} diff --git a/apps/website/public/translations/zh-Hans/translation.json b/apps/website/public/translations/zh-Hans/translation.json new file mode 100644 index 000000000..a9a2973a2 --- /dev/null +++ b/apps/website/public/translations/zh-Hans/translation.json @@ -0,0 +1,51 @@ +{ + "get-started": { + "desktop_title": "下载桌面版应用 (v{{version}})", + "architecture": "架构:" + }, + "organization_benefits": { + "hoisting_description": "你可以通过将个人笔记和工作笔记分组到不同的工作区中,轻松地将它们分开。每个工作区会聚焦于特定的笔记集合,使你的笔记树仅显示相关内容。" + }, + "productivity_benefits": { + "title": "高效且安全", + "revisions_title": "笔记历史版本", + "revisions_content": "笔记会在后台定期保存,且修订版本可用于回顾或撤销误修改。你也可以按需创建修订版本。", + "sync_title": "同步", + "sync_content": "使用自建或云端实例,可以轻松地在多设备之间同步笔记,并通过 PWA 从手机上访问它。", + "protected_notes_title": "被保护的笔记", + "protected_notes_content": "通过加密笔记并将其锁定在受密码保护的会话中,来保护敏感的个人信息。", + "jump_to_title": "快速的搜索和命令", + "jump_to_content": "通过搜索标题,可以在层级结构中快速跳转到笔记或 UI 命令;模糊匹配可容忍拼写错误或细微差异。", + "search_content": "或者在笔记中搜索文本,并通过筛选父笔记或深度来缩小搜索范围。", + "web_clipper_content": "抓取网页(或截图),并通过网页剪藏浏览器扩展直接保存到 Trilium 中。" + }, + "note_types": { + "text_title": "文本笔记", + "text_description": "笔记是使用可视化(所见即所得,WYSIWYG)编辑器进行编辑的,支持表格、图像、数学表达式和带语法高亮的代码块。你可以通过类似 Markdown 的语法或使用斜杠命令快速格式化文本。", + "code_title": "代码笔记", + "code_description": "大量源代码或脚本通常使用专门的编辑器进行编写,这类编辑器为多种编程语言提供语法高亮,并支持多种配色主题。", + "file_title": "文件笔记", + "file_description": "嵌入多媒体文件(如 PDF、图像、视频),并在应用程序内进行预览。", + "canvas_title": "画布", + "canvas_description": "在无限画布上排列形状、图像和文本,使用与 excalidraw.com 相同的技术。非常适合用于绘制图表、草图和进行可视化规划。", + "mermaid_title": "Mermaid 图表", + "mermaid_description": "使用 Mermaid 语法创建各种图表,例如流程图、类图和时序图、甘特图等。", + "mindmap_title": "思维导图", + "mindmap_description": "把你的想法用视觉方式整理出来,或者进行一次头脑风暴。", + "others_list": "以及其他内容:<0>笔记映射、<1>关系映射、<2>已保存的搜索、<3>渲染笔记 和 <4>网页视图。" + }, + "extensibility_benefits": { + "title": "分享与可扩展性", + "import_export_title": "导入/导出", + "import_export_description": "使用 Markdown、ENEX、OML 格式即可轻松与其他应用程序交互。", + "share_title": "在网络上分享笔记", + "share_description": "如果你有一台服务器,它可以用来与他人共享你的一部分笔记。" + }, + "download_helper_server_hosted": { + "download_triliumcc": "也可以访问 trilium.cc" + }, + "download_helper_desktop_linux": { + "download_aur": "AUR", + "download_nixpkgs": "nixpkgs" + } +} diff --git a/apps/website/public/translations/zh-Hant/translation.json b/apps/website/public/translations/zh-Hant/translation.json new file mode 100644 index 000000000..f90649247 --- /dev/null +++ b/apps/website/public/translations/zh-Hant/translation.json @@ -0,0 +1,192 @@ +{ + "get-started": { + "title": "上手指南", + "desktop_title": "下載桌面應用程式 (v{{version}})", + "architecture": "架構:", + "older_releases": "查看舊版本", + "server_title": "設定伺服器以供多台裝置存取" + }, + "hero_section": { + "title": "整理您的思緒。建立您的個人知識庫。", + "subtitle": "Trilium 是一款開源解決方案,專為筆記記錄與個人知識庫管理而生。您可選擇在桌面端本地使用,或與自架伺服器同步,讓筆記隨行無阻。", + "get_started": "上手指南", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Trilium Notes 桌面應用程式的螢幕截圖" + }, + "organization_benefits": { + "title": "組織", + "note_structure_title": "筆記結構", + "note_structure_description": "筆記可依層級排列。由於每則筆記皆可包含子筆記,故無需使用資料夾。單一筆記可在層級結構中的多個位置添加。", + "attributes_title": "筆記標籤及關聯", + "attributes_description": "運用筆記間的關聯或添加標籤以利分類。使用提升屬性輸入結構化資訊,此類資訊可用於表格與看板中。", + "hoisting_title": "工作區及聚焦", + "hoisting_description": "輕鬆將個人筆記與工作筆記分開管理,只需將它們歸類至特定工作區,該工作區會聚焦顯示筆記樹中的特定筆記群組。" + }, + "productivity_benefits": { + "title": "生產力及安全性", + "revisions_title": "筆記歷史版本", + "revisions_content": "筆記會定期在背景自動儲存,您可透過版本記錄功能檢視修改歷程或撤銷意外變更。版本記錄亦可依需求手動建立。", + "sync_title": "同步", + "sync_content": "使用自託管或雲端實例,輕鬆在多台裝置間同步筆記,並透過 PWA 從手機存取。", + "protected_notes_title": "受保護的筆記", + "protected_notes_content": "透過加密筆記並將其鎖定在密碼保護的工作階段中,以保護敏感的個人資訊。", + "jump_to_title": "快速搜尋及命令", + "jump_to_content": "透過搜尋標題快速跳轉至各層級的筆記或介面指令,並支援模糊匹配以容許拼寫錯誤或細微差異。", + "search_title": "強大的搜尋功能", + "search_content": "或在筆記內搜尋文字,並透過篩選父筆記或層級深度來縮小搜尋範圍。", + "web_clipper_title": "網頁剪取器", + "web_clipper_content": "使用網頁剪取器瀏覽器擴充功能,直接擷取網頁(或截圖)並將其置入 Trilium。" + }, + "note_types": { + "text_title": "文字筆記", + "text_description": "筆記採用所見即所得(WYSIWYG)編輯器進行編輯,支援表格、圖片、數學公式及帶有語法高亮的程式碼區塊。您可透過類 Markdown 語法或斜線指令快速格式化文字。", + "code_title": "程式碼筆記", + "code_description": "大型原始碼或腳本樣本採用專用編輯器,支援多種程式語言的語法高亮顯示,並提供多種色彩主題。", + "file_title": "檔案筆記", + "file_description": "嵌入多媒體檔案(例如 PDF、圖片、影片),並提供應用程式內預覽功能。", + "canvas_title": "畫布", + "canvas_description": "在無限畫布上排列圖形、圖像與文字,採用與 excalidraw.com 相同的技術。適用於繪製圖表、草圖與視覺化規劃。", + "mermaid_title": "美人魚圖", + "mermaid_description": "使用 Mermaid 語法繪製流程圖、類別圖與序列圖、甘特圖等多種圖表。", + "mindmap_title": "心智圖", + "mindmap_description": "以視覺方式整理思緒,或進行腦力激盪。", + "others_list": "及其他項目:<0>筆記地圖、<1>關聯地圖、<2>儲存搜尋、<3>渲染筆記,以及<4>網頁檢視。" + }, + "extensibility_benefits": { + "title": "分享及擴展性", + "import_export_title": "匯入/匯出", + "import_export_description": "輕鬆透過 Markdown、ENEX、OML 格式與其他應用程式互動。", + "share_title": "在網頁上分享筆記", + "share_description": "若您擁有伺服器,便可藉此與他人共享筆記的子集。", + "scripting_title": "進階腳本編寫", + "scripting_description": "在 Trilium 中透過自訂小工具或伺服器端邏輯,打造專屬整合方案。", + "api_title": "REST API", + "api_description": "透過其內建的 REST API 以程式化方式與 Trilium 進行互動。" + }, + "collections": { + "calendar_title": "日曆", + "calendar_description": "使用行事曆規劃個人或專業活動,支援全天及多日活動。透過週、月、年檢視模式,一覽所有活動。輕鬆互動即可新增或拖曳活動。", + "table_title": "表格", + "table_description": "以表格結構顯示並編輯筆記資訊,支援多種欄位類型,包括文字、數字、核取方塊、日期與時間、連結及顏色,並具備關聯性功能。可選擇性地在表格內以樹狀層級結構顯示筆記內容。", + "board_title": "看板", + "board_description": "將您的任務或專案狀態整理成看板,輕鬆建立新項目與欄位,並透過在看板上拖曳即可簡單變更狀態。", + "geomap_title": "地理地圖", + "geomap_description": "使用可自訂的標記,直接在地圖上規劃您的假期行程或標記感興趣的地點。顯示已記錄的GPX軌跡,以便追蹤行程路線。" + }, + "faq": { + "title": "常見問題", + "mobile_question": "是否有行動應用程式?", + "mobile_answer": "目前尚無官方行動應用程式。不過,若您擁有伺服器實例,可透過網頁瀏覽器存取,甚至能將其安裝為進程式網路應用程式(PWA)。至於 Android系統,則有款名為 TriliumDroid 的非官方應用程式,其功能與桌面端客戶端相同,甚至支援離線運作。", + "database_question": "資料儲存在哪裡?", + "database_answer": "所有筆記都將儲存於應用程式資料夾內的 SQLite 資料庫中。Trilium 採用資料庫而非純文字檔案的考量,在於效能表現,以及某些功能(例如複製筆記——在樹狀結構中多處出現相同筆記)若以純文字檔案實現將困難得多。若需尋找應用程式資料夾位置,請直接開啟「關於」視窗即可。", + "server_question": "使用 Trilium 是否需要伺服器?", + "server_answer": "不,伺服器允許透過網頁瀏覽器存取,並在您擁有多台裝置時管理同步作業。若無多台裝置同步需求,只需下載桌面應用程式並啟動即可。", + "scaling_question": "應用程式在筆記數量龐大時表現如何?", + "scaling_answer": "根據使用情境,本應用程式應能無障礙處理至少十萬筆筆記。請注意,若上傳大量大型檔案(單一檔案達 1 GB),同步過程可能發生失敗,因 Trilium 本質上更偏向知識庫應用程式,而非檔案儲存服務(例如 NextCloud)。", + "network_share_question": "我能否透過網路磁碟機共享我的資料庫?", + "network_share_answer": "不,通常不建議透過網路磁碟機共享 SQLite 資料庫。雖然有時可能運作正常,但由於網路環境中檔案鎖定機制不完善,資料庫仍存在損毀的風險。", + "security_question": "我的資料如何受到保護?", + "security_answer": "預設情況下,筆記不會進行加密,可直接從資料庫讀取。一旦將筆記標記為加密狀態,系統便會使用 AES-128-CBC 演算法對該筆記進行加密。" + }, + "final_cta": { + "title": "準備好開始使用 Trilium Notes 了嗎?", + "description": "運用強大功能與完整隱私保護,建立您的個人知識庫。", + "get_started": "上手指南" + }, + "components": { + "link_learn_more": "了解更多…", + "list_with_screenshot_alt": "已選擇功能的螢幕截圖" + }, + "download_now": { + "text": "馬上下載 ", + "platform_big": "v{{version}} 適用於 {{platform}}", + "platform_small": "適用於 {{platform}}", + "linux_big": "v{{version}} 適用於 Linux", + "linux_small": "適用於 Linux", + "more_platforms": "更多平台與伺服器設定" + }, + "footer": { + "copyright_and_the": " 以及 ", + "copyright_community": "社群" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "GitHub Discussions", + "matrix": "Matrix", + "reddit": "Reddit" + }, + "support_us": { + "title": "支持我們", + "financial_donations_title": "財務捐贈", + "financial_donations_description": "Trilium 的開發與維護耗費了 數百小時的工作。您的支持能確保其開源性質、提升功能品質,並支付伺服器託管等相關成本。", + "financial_donations_cta": "請考慮透過以下方式支持本應用程式的主要開發者(eliandoran):", + "github_sponsors": "GitHub Sponsors", + "paypal": "PayPal", + "buy_me_a_coffee": "Buy Me A Coffee" + }, + "contribute": { + "title": "其他貢獻方式", + "way_translate": "透過 Weblate 將應用程式翻譯成您的母語。", + "way_community": "在 GitHub DiscussionsMatrix 上與社群互動。", + "way_reports": "透過 GitHub issues 回報錯誤。", + "way_document": "告訴我們文件中的缺漏之處,或貢獻指南、常見問題解答或教學內容,協助完善文件。", + "way_market": "廣為宣傳:將 Trilium Notes 分享給朋友,或發佈於部落格與社群媒體。" + }, + "404": { + "title": "404:找不到此頁面", + "description": "您所尋找的頁面無法找到。可能是該頁面已被刪除,或是網址有誤。" + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64 位元", + "title_arm64": "Windows on ARM", + "description_x64": "相容於運行 Windows 10 及 11 的 Intel 或 AMD 裝置。", + "description_arm64": "相容於 ARM 裝置(例如搭載高通驍龍處理器的裝置)。", + "quick_start": "透過 Winget 安裝:", + "download_exe": "下載安裝程式 (.exe)", + "download_zip": "免安裝版 (.zip)", + "download_scoop": "Scoop" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64 位元", + "title_arm64": "Linux on ARM", + "description_x64": "適用於大多數 Linux 發行版,相容於 x86_64 架構。", + "description_arm64": "適用於基於 ARM 架構的 Linux 發行版,相容於 aarch64 架構。", + "quick_start": "請根據您的發行版選擇適當的套件格式:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "免安裝版 (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS 適用於 Intel", + "title_arm64": "macOS 適用於 Apple Silicon", + "description_x64": "適用於搭載 Intel 處理器的 Mac,並運行 macOS Big Sur 或更新版本。", + "description_arm64": "適用於搭載 Apple Silicon 的 Mac,例如配備 M1 和 M2 晶片的機型。", + "quick_start": "透過 Homebrew 安裝:", + "download_dmg": "下載安裝程式 (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "免安裝版 (.zip)" + }, + "download_helper_server_docker": { + "title": "使用 Docker 自行託管", + "description": "輕鬆透過 Docker 容器在 Windows、Linux 或 macOS 上部署。", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "在 Linux 上自行架設", + "description": "在您自己的伺服器或虛擬專用伺服器上部署 Trilium Notes,相容於大多數發行版。", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)", + "download_nixos": "NixOS 模組" + }, + "download_helper_server_hosted": { + "title": "付費託管", + "description": "Trilium Notes 託管於 PikaPods,此為付費服務,提供便捷存取與管理功能。與 Trilium 團隊無直接關聯。", + "download_pikapod": "在 PikaPods 上設定", + "download_triliumcc": "或參見 trilium.cc" + } +} diff --git a/apps/website/src/components/Button.tsx b/apps/website/src/components/Button.tsx index 729346e58..3c2c3e455 100644 --- a/apps/website/src/components/Button.tsx +++ b/apps/website/src/components/Button.tsx @@ -6,7 +6,7 @@ interface LinkProps { className?: string; href?: string; openExternally?: boolean; - children: ComponentChildren; + children?: ComponentChildren; title?: string; onClick?: (e: MouseEvent) => void; } diff --git a/apps/website/src/components/Card.tsx b/apps/website/src/components/Card.tsx index 49c357132..593a9025b 100644 --- a/apps/website/src/components/Card.tsx +++ b/apps/website/src/components/Card.tsx @@ -1,6 +1,7 @@ import { ComponentChildren, HTMLAttributes } from "preact"; import { Link } from "./Button.js"; import Icon from "./Icon.js"; +import { t } from "../i18n.js"; interface CardProps extends Omit, "title"> { title: ComponentChildren; @@ -28,7 +29,7 @@ export default function Card({ title, children, imageUrl, iconSvg, className, mo {moreInfoUrl && (
    - Learn more... + {t("components.link_learn_more")}
    )} diff --git a/apps/website/src/components/DownloadButton.tsx b/apps/website/src/components/DownloadButton.tsx index 815f4cad8..75fbeff18 100644 --- a/apps/website/src/components/DownloadButton.tsx +++ b/apps/website/src/components/DownloadButton.tsx @@ -4,6 +4,7 @@ import Button from "./Button.js"; import downloadIcon from "../assets/boxicons/bx-arrow-in-down-square-half.svg?raw"; import packageJson from "../../../../package.json" with { type: "json" }; import { useEffect, useState } from "preact/hooks"; +import { t } from "../i18n.js"; interface DownloadButtonProps { big?: boolean; @@ -24,10 +25,10 @@ export default function DownloadButton({ big }: DownloadButtonProps) { href={recommendedDownload.url} iconSvg={downloadIcon} text={<> - Download now{" "} + {t("download_now.text")} {big - ? v{packageJson.version} for {recommendedDownload.name} - : for {recommendedDownload.name} + ? {t("download_now.platform_big", { version: packageJson.version, platform: recommendedDownload.name })} + : {t("download_now.platform_small", { platform: recommendedDownload.name })} } } /> @@ -37,17 +38,17 @@ export default function DownloadButton({ big }: DownloadButtonProps) { href="/get-started/" iconSvg={downloadIcon} text={<> - Download now{" "} + {t("download_now.text")} {big - ? v{packageJson.version} for Linux - : for Linux + ? {t("download_now.linux_big", { version: packageJson.version })} + : {t("download_now.linux_small")} } } /> )} {big && ( - More platforms & server setup + {t("download_now.more_platforms")} )} ) diff --git a/apps/website/src/components/Footer.tsx b/apps/website/src/components/Footer.tsx index a652e524c..04033f565 100644 --- a/apps/website/src/components/Footer.tsx +++ b/apps/website/src/components/Footer.tsx @@ -5,13 +5,14 @@ import githubDiscussionsIcon from "../assets/boxicons/bx-discussion.svg?raw"; import matrixIcon from "../assets/boxicons/bx-message-dots.svg?raw"; import redditIcon from "../assets/boxicons/bx-reddit.svg?raw"; import { Link } from "./Button.js"; +import { t } from "../i18n"; export default function Footer() { return (