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..827320146 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" @@ -86,12 +86,12 @@ jobs: - name: Upload Playwright trace if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: Playwright trace (${{ matrix.dockerfile }}) path: test-output/playwright/output - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 if: ${{ !cancelled() }} with: name: Playwright report (${{ matrix.dockerfile }}) @@ -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' @@ -209,7 +209,7 @@ jobs: touch "/tmp/digests/${digest#sha256:}" - name: Upload digest - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: digests-${{ env.PLATFORM_PAIR }}-${{ matrix.dockerfile }} path: /tmp/digests/* @@ -223,7 +223,7 @@ jobs: - build steps: - name: Download digests - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: path: /tmp/digests pattern: digests-* diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 50c97417c..ac15f9914 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 @@ -89,7 +89,7 @@ jobs: name: Nightly Build - name: Publish artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: ${{ github.event_name == 'pull_request' }} with: name: TriliumNotes ${{ matrix.os.name }} ${{ matrix.arch }} @@ -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..e2a2757f5 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' @@ -35,7 +35,7 @@ jobs: - name: Upload test report if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: e2e report path: apps/server-e2e/test-output diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f8e77159a..1bd2d89ba 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' @@ -73,7 +73,7 @@ jobs: GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }} - name: Upload the artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: release-desktop-${{ matrix.os.name }}-${{ matrix.arch }} path: apps/desktop/upload/*.* @@ -100,7 +100,7 @@ jobs: arch: ${{ matrix.arch }} - name: Upload the artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: release-server-linux-${{ matrix.arch }} path: upload/*.* @@ -120,14 +120,14 @@ jobs: docs/Release Notes - name: Download all artifacts - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: merge-multiple: true pattern: release-* 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..1937327e0 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", - "@types/express": "5.0.3", - "@types/node": "22.18.9", - "@types/yargs": "17.0.33", + "@playwright/test": "1.56.1", + "@stylistic/eslint-plugin": "5.5.0", + "@types/express": "5.0.4", + "@types/node": "22.18.12", + "@types/yargs": "17.0.34", "@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..61738b8bb 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.3", "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.4", "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.2.0", + "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/tabulator-tables": "6.2.11", + "@types/reveal.js": "5.2.1", + "@types/tabulator-tables": "6.3.0", "copy-webpack-plugin": "13.0.1", - "happy-dom": "20.0.0", + "happy-dom": "20.0.8", "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 535582b03..900a1cf2a 100644 --- a/apps/client/src/components/note_context.ts +++ b/apps/client/src/components/note_context.ts @@ -327,9 +327,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()) { @@ -439,4 +441,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 00f0c3473..0f75666b8 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() - .child() + .child() .child() .child() .child() diff --git a/apps/client/src/layouts/layout_commons.tsx b/apps/client/src/layouts/layout_commons.tsx index 7f187baa0..031ef03de 100644 --- a/apps/client/src/layouts/layout_commons.tsx +++ b/apps/client/src/layouts/layout_commons.tsx @@ -28,9 +28,10 @@ import NoteIconWidget from "../widgets/note_icon"; import PromotedAttributesWidget from "../widgets/promoted_attributes.js"; import CallToActionDialog from "../widgets/dialogs/call_to_action.jsx"; import NoteTitleWidget from "../widgets/note_title.jsx"; -import { PopupEditorFormattingToolbar } from "../widgets/ribbon/FormattingToolbar.js"; +import FormattingToolbar from "../widgets/ribbon/FormattingToolbar.js"; import NoteList from "../widgets/collections/NoteList.jsx"; import NoteDetail from "../widgets/NoteDetail.jsx"; +import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx"; export function applyModals(rootContainer: RootContainer) { rootContainer @@ -63,9 +64,9 @@ export function applyModals(rootContainer: RootContainer) { .cssBlock(".title-row > * { margin: 5px; }") .child() .child()) - .child() + .child() .child(new PromotedAttributesWidget()) .child() - .child()) + .child()) .child(); } diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 0bed126e3..2ea4831a2 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -24,6 +24,9 @@ import NoteWrapperWidget from "../widgets/note_wrapper.js"; import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js"; import NoteList from "../widgets/collections/NoteList.jsx"; import NoteDetail from "../widgets/NoteDetail.jsx"; +import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx"; +import SearchDefinitionTab from "../widgets/ribbon/SearchDefinitionTab.jsx"; +import SearchResult from "../widgets/search_result.jsx"; const MOBILE_CSS = ` `); + 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 65735aae1..a583ea65b 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 @@ export function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDo 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 0be3cc580..4916f18b9 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,18 @@ 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; +} + +.excalidraw.theme--dark canvas { + --theme-filter: invert(100%) hue-rotate(180deg); } \ 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..a356d32fd 100644 --- a/apps/client/src/stylesheets/theme-dark.css +++ b/apps/client/src/stylesheets/theme-dark.css @@ -82,6 +82,17 @@ body ::-webkit-calendar-picker-indicator { filter: invert(1); } +#left-pane .fancytree-node.tinted { + --custom-color: var(--dark-theme-custom-color); +} + +:root .reference-link, +:root .reference-link:hover, +.ck-content a.reference-link > span, +.board-note { + color: var(--dark-theme-custom-color, inherit); +} + .excalidraw.theme--dark { --theme-filter: invert(80%) hue-rotate(180deg) !important; } @@ -97,3 +108,4 @@ body .todo-list input[type="checkbox"]:not(:checked):before { .ck-content pre { box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6) !important; } + diff --git a/apps/client/src/stylesheets/theme-light.css b/apps/client/src/stylesheets/theme-light.css index 7aca1b3f9..872e7431f 100644 --- a/apps/client/src/stylesheets/theme-light.css +++ b/apps/client/src/stylesheets/theme-light.css @@ -81,3 +81,14 @@ html { --mermaid-theme: default; --native-titlebar-background: #ffffff00; } + +#left-pane .fancytree-node.tinted { + --custom-color: var(--light-theme-custom-color); +} + +:root .reference-link, +:root .reference-link:hover, +.ck-content a.reference-link > span, +.board-note { + color: var(--light-theme-custom-color, inherit); +} \ 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..98fe11a4b 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,22 @@ * 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); +} + +:root .reference-link, +:root .reference-link:hover, +.ck-content a.reference-link > span, +.board-note { + color: var(--dark-theme-custom-color, inherit); +} + body ::-webkit-calendar-picker-indicator { filter: invert(1); } @@ -275,4 +294,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 3e546d2c0..025af3462 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/dialogs.css b/apps/client/src/stylesheets/theme-next/dialogs.css index c3b1d5238..ed617991c 100644 --- a/apps/client/src/stylesheets/theme-next/dialogs.css +++ b/apps/client/src/stylesheets/theme-next/dialogs.css @@ -392,7 +392,8 @@ div.tn-tool-dialog { } .delete-notes-list .note-path { - padding-inline-end: 8px; + padding-inline-start: 8px; + color: var(--muted-text-color) } /* 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..70517ef2e 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; @@ -665,4 +666,17 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child { .ck-content .table > figcaption { background: var(--accented-background-color); color: var(--main-text-color); +} + +/* Reference link */ + +.ck-content a.reference-link, +.ck-content a.reference-link:hover { + /* Apply underline only to the span inside the link so it can follow the + * target note's user defined color */ + text-decoration: none; +} + +.ck-content a.reference-link > span { + text-decoration: underline; } \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next/pages.css b/apps/client/src/stylesheets/theme-next/pages.css index d0c092321..8b5a9ed9a 100644 --- a/apps/client/src/stylesheets/theme-next/pages.css +++ b/apps/client/src/stylesheets/theme-next/pages.css @@ -63,7 +63,7 @@ /* Button bar */ .search-definition-widget .search-setting-table tbody:last-child div { - justify-content: flex-end !important; + justify-content: flex-end; gap: 8px; } 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 82bbd71e5..b04472d7c 100644 --- a/apps/client/src/translations/ar/translation.json +++ b/apps/client/src/translations/ar/translation.json @@ -12,6 +12,9 @@ "toast": { "critical-error": { "title": "خطأ فادح" + }, + "widget-error": { + "title": "فشل في البدء بعنصر الواجهة" } }, "add_link": { @@ -19,12 +22,15 @@ "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": "مساعدة حول بادئة الشجرة", + "branch_prefix_saved": "تم حفظ بادئة الفرع." }, "bulk_actions": { "bulk_actions": "اجراءات جماعية", @@ -43,7 +49,8 @@ "options": "خيارات", "upload": "تحميل", "choose_files": "اختر الملفات", - "shrink_images": "تصغير الصور" + "shrink_images": "تصغير الصور", + "upload_attachments_to_note": "تحميل المرفقات الى الملاحظة" }, "attribute_detail": { "name": "الاسم", @@ -69,17 +76,32 @@ "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}}مرات اكثر.", + "related_notes_title": "ملاحظات اخرى بنفس التسمية" }, "rename_label": { "to": "الى", "old_name_placeholder": "الاسم القديم", "new_name_placeholder": "الاسم الجديد", - "rename_label": "اعادة تسمية التسمية" + "rename_label": "اعادة تسمية التسمية", + "rename_label_from": "اعادة تسمية التسمية من" }, "move_note": { "to": "الى", - "move_note": "نقل الملاحظة" + "move_note": "نقل الملاحظة", + "target_parent_note": "ملاحظة الاصل الهدف", + "on_all_matched_notes": "على كل الملاحظات المطابقة" }, "add_relation": { "to": "الى", @@ -91,20 +113,28 @@ "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": "تحويل المرفق الى ملاحظة", + "delete_success": "تم حذف المرفق \"{{title}}\" .", + "enter_new_name": "ادخل اسم مرفق جديد" }, "calendar": { "week": "أسبوع", @@ -136,7 +166,9 @@ "month_previous": "الشهر السابق", "month_next": "الشهر التالي", "year_previous": "السنة السابقة", - "year_next": "السنة التالية" + "year_next": "السنة التالية", + "cannot_find_day_note": "لا يمكن ايجاد ملاحظة اليوم", + "cannot_find_week_note": "لايمكن ايجاد ملاحظة الاسبوع" }, "global_menu": { "menu": "القائمة", @@ -151,20 +183,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": "قائمة", @@ -176,7 +227,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": "تنزيل", @@ -184,14 +240,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": "انشاء", @@ -205,7 +266,8 @@ "note_paths": { "search": "بحث", "archived": "مؤرشف", - "title": "مسارات الملاحظة" + "title": "مسارات الملاحظة", + "clone_button": "جار نسخ الملاحظة الى مكان جديد..." }, "script_executor": { "query": "استعلام", @@ -224,13 +286,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": "الحد الاقصى" @@ -245,16 +316,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": "خطوط", @@ -267,23 +353,35 @@ "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}}", + "choose_export_type": "اختر نوع التصدير اولا من فضلك" }, "help": { "troubleshooting": "أستكشاف الاخطاء واصلاحها", @@ -298,19 +396,48 @@ "selectNote": "تحديد الملاحظة", "editingNotes": "تحرير الملاحظات", "inPageSearch": "البحث داخل الصفحة", - "markdownAutoformat": "التنسيق التلقائي باسلوب Markdown" + "markdownAutoformat": "التنسيق التلقائي باسلوب Markdown", + "openEmptyTab": "فتح علامة تبويب فارغة", + "closeActiveTab": "اغلاق علامة تبويب نشطة", + "activateNextTab": "تنشيط التبويب التالي", + "activatePreviousTab": "تنشيط التبويب السابق", + "multiSelectNote": "تحديد متعدد للملاحظة اعلاه/اسفل", + "createInternalLink": "انشاء رابط داخلي", + "reloadFrontend": "اعادة تحميل الواجهة اللمامية لتريليوم", + "showDevTools": "عرض ادوات المطور", + "showSQLConsole": "عرض وحده تحكم SQL", + "scrollToActiveNote": "مدتمرير الى الملاحظة النشطة", + "jumpToParentNote": "الانتقال الى الملاحظة الاصل", + "movingCloningNotes": "نقل/ استنساخ الملاحظات", + "deleteNotes": "حذف الملاحظة/ الشجرة الفرعية", + "collapseWholeTree": "طي شجرة الملاحظة باكملها", + "followLink": "اتبع تلرابط تحت المؤشر", + "onlyInDesktop": "في سطح المكتب فقط(Electron build)", + "createEditLink": "انشاء/ تحرير رابط خارجي", + "quickSearch": "الانتقال الى مربع البحث السريع" }, "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": "أغلاق", @@ -323,7 +450,8 @@ }, "note_type_chooser": { "templates": "قوالب", - "builtin_templates": "القوالب المدمجة" + "builtin_templates": "القوالب المدمجة", + "modal_title": "اختر نوع الملاحظة" }, "prompt": { "title": "ترقية", @@ -332,7 +460,9 @@ }, "protected_session_password": { "close_label": "أغلاق", - "modal_title": "جلسة محمية" + "modal_title": "جلسة محمية", + "start_button": "بدء جلسة محمية", + "help_title": "مساعدة حول الملاحظات المحمية" }, "revisions": { "delete_button": "حذف", @@ -343,7 +473,17 @@ "diff_on": "عرض الفروقات", "diff_off": "عرض المحتوى", "file_size": "حجم الملف:", - "mime": "MIME: " + "mime": "MIME: ", + "delete_all_button": "حذف كل المراجعات", + "settings": "اعدادات مراجعة الملاحظة", + "diff_not_available": "المقارنة غير متوفرة.", + "help_title": "مساعدة حول مراجعات الملاحظة", + "diff_off_hint": "انقر لعرض محتويات الملاحظة", + "revisions_deleted": "تم حذف جميع نسخ المراجعات للملاحظة.", + "revision_restored": "تم استعادة نسخ المراجعة للملاحظة.", + "revision_deleted": "تم حذف مراجعة الملاحظة.", + "snapshot_interval": "فاصل زمني لحفظ لقطات اصدارات المراجعة: {{seconds}}", + "maximum_revisions": "حد عدد لقطات اصدارات الملاحظة: {{number}}" }, "sort_child_notes": { "title": "عنوان", @@ -355,11 +495,17 @@ "date_created": "تاريخ الانشاء", "date_modified": "تاريخ التعديل", "sorting_direction": "اتجاه الترتيب", - "natural_sort": "الترتيب الطبيعي" + "natural_sort": "الترتيب الطبيعي", + "natural_sort_language": "لغات الترتيب الطبيعي", + "sort_children_by": "ترتيب العناصر الفرعية حسب...", + "sort_folders_at_top": "ترتيب المجلدات في الاعلى" }, "recent_changes": { "undelete_link": "الغاء الحذف", - "title": "التغيرات الاخيرة" + "title": "التغيرات الاخيرة", + "no_changes_message": "لايوجد تغيير لحد الان...", + "erase_notes_button": "مسح الملاحظات المحذوفة الان", + "deleted_notes_message": "تم حذف الملاحظات نهائيا." }, "edited_notes": { "deleted": "(حذف)", @@ -374,7 +520,9 @@ "max_content_width": { "max_width_unit": "بكسل", "title": "عرض المحتوى", - "reload_button": "اعادة تحميل الواجهة" + "reload_button": "اعادة تحميل الواجهة", + "max_width_label": "اقصى عرض للمحتوى", + "reload_description": "تغييرات من خيارات المظهر" }, "native_title_bar": { "enabled": "مفعل", @@ -389,11 +537,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": "تقدم", @@ -457,30 +608,66 @@ "start_indexing": "بدء الفهرسة", "chat": { "root_note_title": "دردشات AI", - "new_chat_title": "دردشة جديدة" + "new_chat_title": "دردشة جديدة", + "create_new_ai_chat": "انشاء دردشة AI جديدة" }, "selected_provider": "المزود المحدد", "select_model": "اختر النموذج...", - "select_provider": "اختى المزود...", + "select_provider": "اختر المزود...", "ollama_model": "نموذج Ollama", "refresh_models": "تحديث النماذج", "rebuild_index": "اعادة بناء الفهرس", "note_title": "عنوان الملاحظة", "processing": "جاري المعالجة ({{percentage}}%)", - "incomplete": "غير مكتمل ({{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", @@ -488,7 +675,11 @@ "google": "جوجل", "save_button": "حفظ", "baidu": "Baidu", - "title": "محرك البحث" + "title": "محرك البحث", + "predefined_templates_label": "قوالب محرك البحث المعرفة مسبقا", + "custom_name_label": "اسم محرك البحث المخصص", + "custom_name_placeholder": "اسم محرك البحث المخصص", + "custom_url_placeholder": "تخصيص عنوان URL لمحرك البحث" }, "heading_style": { "plain": "بسيط", @@ -497,29 +688,46 @@ "title": "نمط العنوان" }, "text_auto_read_only_size": { - "unit": "حروف" + "unit": "حروف", + "title": "الحجم التلقائي للقراءة فقط" }, "i18n": { "language": "لغة", "sunday": "الاحد", "monday": "الاثنين", - "title": "تعريب" + "title": "تعريب", + "tuesday": "الثلاثاء", + "wednesday": "الاربعاء", + "thursday": "الخميس", + "friday": "الجمعة", + "saturday": "السبت", + "formatting-locale": "تنسيق التاريخ والارقام" }, "backup": { "path": "مسار", "automatic_backup": "النسخ الاحتياطي التلقائي", "backup_now": "نسخ احتياطي الان", - "existing_backups": "النسخ الاحتياطية الموجودة" + "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", - "existing_tokens": "الرموز الموجوده", + "existing_tokens": "الرموز الموجودة", "token_name": "اسم الرمز", "default_token_name": "رمز جديد", - "rename_token_title": "اعادة تسمية الرمز" + "rename_token_title": "اعادة تسمية الرمز", + "rename_token": "اعادة تسمية هذا الرمز", + "create_token": "انشاء رمز PEAPI جديد", + "new_token_title": "رمز ETAPI جديد", + "token_created_title": "انشاء رمز ETAPI" }, "password": { "heading": "كلمة المرور", @@ -529,7 +737,11 @@ "change_password": "تغيير كلمة المرور", "change_password_heading": "تغيير كلمة المرور", "set_password_heading": "تعيين كلمة المرور", - "set_password": "تعيين كلمة المرور" + "set_password": "تعيين كلمة المرور", + "for_more_info": "لمزيد من المعلومات.", + "protected_session_timeout_label": "انتهت مدة الجلسة المحمية:", + "protected_session_timeout": "انتهاء مهلة الجلسة المحمية", + "new_password_confirmation": "تاكيد كلمة المرور الجديدة" }, "shortcuts": { "shortcuts": "أختصارات", @@ -546,7 +758,9 @@ "config_title": "تهيئة المزامنة", "timeout": "انتهاء مهلة المزامنة", "test_title": "اختبار المزامنة", - "test_button": "اختبار المزامنة" + "test_button": "اختبار المزامنة", + "server_address": "عنوان نسخة الخادم", + "proxy_label": "خادم وكيل المزامنة (اخياري)" }, "api_log": { "close": "أغلاق" @@ -563,10 +777,15 @@ "tab_row": { "close": "اغلاق", "close_tab": "اغلاق التبويب", - "new_tab": "تبويب جديد" + "new_tab": "تبويب جديد", + "close_all_tabs": "اغلاق كل علامات التبويب", + "add_new_tab": "اضافة علامة تبويب جديدة", + "close_other_tabs": "اغلاق علامات التبويب الاخرى", + "reopen_last_tab": "اعادة فتح اخر علامة تبويب مغلقة" }, "toc": { - "options": "خيارات" + "options": "خيارات", + "table_of_contents": "جدول المحتويات" }, "tasks": { "due": { @@ -590,22 +809,36 @@ "sort-column-clear": "ازالة الترتيب", "show-hide-columns": "اظهار/اخفاء الاعمدة", "edit-column": "تحرير العمود", - "delete-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": "تفعيل مؤثرات الخلفية", + "next_theme_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": "استنساخ الى الملاحظة المحددة", + "no_path_to_clone_to": "لايوجد مسار لنسخ المحتوى الية." }, "table_of_contents": { - "unit": "عناوين" + "unit": "عناوين", + "title": "جدول المحتويات" }, "tree-context-menu": { "archive": "أرشفة", @@ -619,12 +852,23 @@ "collapse-subtree": "طي الشجرة الفرعية", "sort-by": "ترتيب بواسطة...", "protect-subtree": "الشجرة الفرعية المحمية", - "unprotect-subtree": "الجرةةالفرعية الغير محمية", + "unprotect-subtree": "الشجرة الفرعية الغير محمية", "clone-to": "‍استنساخ الى...", "move-to": "نقل الى...", "paste-into": "لصق في", "paste-after": "لصق بعد", - "open-in-popup": "تحرير سريع" + "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": "‌تطبيق الاجراءات الجماعية", + "recent-changes-in-subtree": "التغييرات الاخيرة في الشجرة الفرعية" }, "note_types": { "text": "نص", @@ -651,37 +895,58 @@ "task-list": "قائمة المهام" }, "shared_switch": { - "shared": "مشترك" + "shared": "مشترك", + "toggle-on-title": "مشاركة الملاحظة", + "toggle-off-title": "الغاء مشاركة الملاحظة" }, "template_switch": { "template": "قالب" }, "find": { "replace": "استبدال", - "case_sensitive": "حساسة لحالة الاحرف", + "case_sensitive": "حساسة لحالة الأحرف", "match_words": "مطابقة الكلمات", "replace_placeholder": "استبدال ب...", - "replace_all": "استبدال الكل" + "replace_all": "استبدال الكل", + "find_placeholder": "البحث في النص..." }, "highlights_list_2": { "options": "خيارات", - "title": "قائمة التمييزات" + "title": "قائمة التضليلات" }, "quick-search": { "searching": "جار البحث...", - "placeholder": "البحث السريع" + "placeholder": "البحث السريع", + "no-results": "لم يتم العثور على نتائج", + "show-in-full-search": "عرض في البحث الكامل" }, "note_tree": { "unhoist": "ارجاع الى الترتيب الطبيعي", "tree-settings-title": "اعدادات الشجرة", - "toggle-sidebar": "اظهار/اخفاء الشريط الجانبي" + "toggle-sidebar": "اظهار/اخفاء الشريط الجانبي", + "collapse-title": "طي شجرة الملاحظة", + "hide-archived-notes": "اخفاء الملاحظات المؤرشفة", + "automatically-collapse-notes": "طي الملاحظات تلقائيا", + "create-child-note": "انشاء ملاحظة فرعية", + "scroll-active-title": "تمرير الى الملاحظة النشطة", + "save-changes": "حفظ وتطبيق التغييرات", + "saved-search-note-refreshed": "تم تحديث ملاحظة البحث المحفوظة.", + "hoist-this-note-workspace": "تثبيت هذه الملاحظة (مساحة العمل)", + "refresh-saved-search-results": "تحديث نتائج البحث المحفوظة" }, "sql_table_schemas": { "tables": "جداول" }, "launcher_context_menu": { "reset": "اعادة ضبط", - "add-spacer": "اضافة فاصل" + "add-spacer": "اضافة فاصل", + "delete": "حذف\n", + "add-note-launcher": "اضافة مشغل الملاحظة", + "add-script-launcher": "اضافة مشغل السكريبت", + "add-custom-widget": "اضافة عنصر واجهة مخصص", + "move-to-visible-launchers": "نقل الى المشغلات المرئية", + "move-to-available-launchers": "نقل الى المشغلات المتوفرة", + "duplicate-launcher": "تكرار المشغل " }, "editable-text": { "auto-detect-language": "تم اكتشافه تلقائيا" @@ -707,12 +972,20 @@ "cut": "قص", "copy": "نسخ", "paste": "لصق", - "copy-link": "نسخ الرابط" + "copy-link": "نسخ الرابط", + "add-term-to-dictionary": "اضافة \"{{term}}\" الى القاموس", + "paste-as-plain-text": "لصق كنص عادي" }, "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": "ثواني", @@ -721,7 +994,10 @@ "days": "أيام" }, "editorfeatures": { - "title": "مميزات" + "title": "مميزات", + "note_completion_enabled": "تمكين الاكمال التلقائي للملاحظة", + "emoji_completion_enabled": "تفعيل الاكمال التلقائي للرموز التعبيرية", + "slash_commands_enabled": "تفعيل اوامر Slash" }, "book_properties_config": { "raster": "نقطي", @@ -729,14 +1005,30 @@ "map-style": "نمط الخريطة:", "vector_light": "متجه (فاتح)", "vector_dark": "متجه (داكن)", - "show-scale": "اظهار المقياس" + "show-scale": "اظهار المقياس", + "display-week-numbers": "اظهار ارقام الاسابيع", + "max-nesting-depth": "العمق الاقصى للتداخل:" }, "multi_factor_authentication": { "oauth_title": "OAuth/OpenID", "title": "المصادقة متعددة العوامل", "mfa_method": "طريقة المصادقة متعددة العوامل", "oauth_user_account": "حساب المستخدم: ", - "oauth_user_email": "البريد الإلكتروني للمستخدم: " + "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 سري", + "totp_title": "كلمة مرور لمرة واحدة معتمدة على الوقت (TOTP)", + "recovery_keys_title": "مفاتيح استرداد تسجيل الدخول الاحادي", + "recovery_keys_error": "حدث خطأ اثناء توليد رموز الاسترجاع", + "recovery_keys_no_key_set": "لاتوجد رموز استرجاع معينة" }, "execute_script": { "execute_script": "تنفيذ السكريبت" @@ -745,7 +1037,8 @@ "add_label": "اضافة تسمية", "to_value": "الى القيمة", "new_value_placeholder": "قيمة جديدة", - "label_name_placeholder": "اسم التسمية" + "label_name_placeholder": "اسم التسمية", + "help_text": "عل كل الملاحظات المطابقة:" }, "delete_label": { "delete_label": "حذف التسمية", @@ -754,13 +1047,18 @@ "update_label_value": { "to_value": "الى القيمة", "new_value_placeholder": "قيمة جديدة", - "label_name_placeholder": "اسم التسمية" + "label_name_placeholder": "اسم التسمية", + "update_label_value": "تحديث قيمة التصنيف" }, "delete_note": { - "delete_note": "حذف الملاحظة" + "delete_note": "حذف الملاحظة", + "delete_matched_notes": "حف الملاحظات المطابقة", + "delete_matched_notes_description": "سوف يؤدي هذا الى حذف الملاحظات المطابقة." }, "rename_note": { - "rename_note": "اعادة تسمية الملاحظة" + "rename_note": "اعادة تسمية الملاحظة", + "new_note_title": "عنوان ملاحظة جديد", + "rename_note_title_to": "اعادة تسمية عنوان الملاحظة الى" }, "delete_relation": { "delete_relation": "حذف العلاقة", @@ -782,13 +1080,22 @@ "export_note": "تصدير الملاحظة", "delete_note": "حذف الملاحظة", "print_note": "طباعة الملاحظة", - "save_revision": "حفظ المراجعة" + "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": "اخفاء الازرار" @@ -801,27 +1108,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": "الملاحظة المالكة: ", @@ -830,14 +1143,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": "عرض الويب" @@ -848,12 +1170,19 @@ "database_anonymization": { "title": "اخفاء هوية البيانات", "full_anonymization": "الاخفاء الكامل للهوية", - "light_anonymization": "الاخفاء الجزئي للهوية" + "light_anonymization": "الاخفاء الجزئي للهوية", + "existing_anonymized_databases": "قواعد البيانات المجهولة الحالية", + "save_fully_anonymized_database": "حفظ قاعدة البيانات بعد اخفاء كل الهويات", + "save_lightly_anonymized_database": "حفظ قاعدةةبيانات مخفية جزئيا", + "creating_fully_anonymized_database": "انشاء قاعدة بيانات مجهولة بالكامل", + "creating_lightly_anonymized_database": "انشاء قاعدةة بيانات مجهولة جزئيا...", + "no_anonymized_database_yet": "لاتوجد قاعدة بيانات مجهولة بعد." }, "vacuum_database": { "title": "تحرير مساحة قاعدة البيانات", "button_text": "تحرير مساحة قاعدة البيانات", - "vacuuming_database": "جار تحرير مساحة قاعدة الييانات..." + "vacuuming_database": "جار تحرير مساحة قاعدة الييانات...", + "database_vacuumed": "تم تنظيف قاعدة البيانات" }, "ribbon": { "widgets": "ادوات الشريط" @@ -862,31 +1191,38 @@ "use_vim_keybindings_in_code_notes": "اختصارات لوحة المفاتيح باسلوب Vim" }, "network_connections": { - "network_connections_title": "اتصالات الشبكة" + "network_connections_title": "اتصالات الشبكة", + "check_for_updates": "‪التحقق من وجود تحديثات تلقائية" }, "tray": { "title": "شريط النظام" }, "highlights_list": { "title": "قائمة النقاط المميزة", - "bold": "نص عربض", + "bold": "نص عريض", "italic": "نص مائل", "underline": "خط تحت النص", - "color": "نص ملون" + "color": "نص ملون", + "visibility_title": "اظهار قائمة التضليلات", + "bg_color": "نص مع لون خلفية" }, "revisions_button": { "note_revisions": "مراجعات الملاحظة" }, "custom_date_time_format": { "format_string": "سلسلة التنسيق:", - "formatted_time": "التاريخ/الوقت المنسق:" + "formatted_time": "التاريخ/الوقت المنسق:", + "title": "تنسيق تاريخ/وقت مخصص" }, "options_widget": { "options_status": "حالة الخيارات" }, "spellcheck": { "title": "التدقيق الاملائي", - "enable": "تفعيل التدقيق الاملائي" + "enable": "تفعيل التدقيق الاملائي", + "language_code_label": "رمز اللغة او رموز اللغات", + "available_language_codes_label": "رموز اللغات المتاحة:", + "language_code_placeholder": "على سبيل المثال \"en-US\", \"de-AI\"" }, "note-map": { "button-link-map": "خريطة الروابط", @@ -899,7 +1235,10 @@ "note-executed": "تم تنفيذ الملاحظة." }, "branches": { - "delete-status": "حالة الحذف" + "delete-status": "حالة الحذف", + "delete-finished-successfully": "تم الحذف بنجاح.", + "cannot-move-notes-here": "لايمكن نقل الملاحظات الى هنا.", + "undeleting-notes-finished-successfully": "تم استرجاع الملاحظات بنجاح." }, "highlighting": { "title": "كتل الكود", @@ -908,23 +1247,29 @@ "code_block": { "word_wrapping": "التفاف النص", "theme_group_light": "الثيمات الفاتحة", - "theme_group_dark": "الثيمات الغامقة" + "theme_group_dark": "الثيمات الغامقة", + "copy_title": "نسخ الى الحافظة", + "theme_none": "بدون تمييز الصياغة" }, "link_context_menu": { "open_note_in_popup": "تحرير سريع" }, "electron_integration": { - "desktop-application": "تطبيقات سطح المكتبة", - "zoom-factor": "عامل التكبير" + "desktop-application": "تطبيقات سطح المكتب", + "zoom-factor": "عامل التكبير", + "native-title-bar": "شريط العنوان الاصلي" }, "note_tooltip": { - "quick-edit": "التحرير السريع" + "quick-edit": "التحرير السريع", + "note-has-been-deleted": "تم حذف الملاحظة." }, "geo-map-context": { - "open-location": "فتح الموقع" + "open-location": "فتح الموقع", + "remove-from-map": "ازالة من الخريطة" }, "share": { - "title": "اعدادات المشاركة" + "title": "اعدادات المشاركة", + "check_share_root": "التحقق من حالة جذر المشاركة" }, "note_language": { "not_set": "غير محدد", @@ -938,7 +1283,8 @@ "lock-editing": "قفل التحرير" }, "cpu_arch_warning": { - "continue_anyway": "المتابعة على اي حال" + "continue_anyway": "المتابعة على اي حال", + "download_link": "تنزيل النسخة الاصلية" }, "table_context_menu": { "delete_row": "حذف الصف" @@ -952,17 +1298,170 @@ "insert-below": "ادراج ادناه", "delete-column": "حذف العمود", "new-item": "عنصر جديد", - "add-column": "اضافة عمود" + "add-column": "اضافة عمود", + "new-item-placeholder": "ادخل عنوان الملاحظة...", + "add-column-placeholder": "ادخل اسم العمود...", + "remove-from-board": "ازالة من اللوحة" }, "command_palette": { "export_note_title": "تصدير ملاحظة", "show_attachments_title": "عرض المرفقات", - "search_notes_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": "تكوين شريط الاطلاق", + "search_subtree_description": "البحث ضمن الشجرة الفرعية الحالية" }, "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": "نقل الىالملاحظة المحددة", + "error_no_path": "لايوجد مسار لنقل العنصر الية." + }, + "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": "جار التحقق من سلامة قاعدة البيانات...", + "integrity_check_failed": "فشل التحقق من السلامة: {{results}}" + }, + "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": "اضافة تعريف لعلاقة جديدة", + "add_new_relation": "اضافة علاقة جديدة " + }, + "zen_mode": { + "button_exit": "الخروج من وضع Zen" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "مهلة مسح المرفقات", + "erase_attachments_after": "حذف المرفقات الغير مستخدمة بعد:" + }, + "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": "الفاصل الزمني لنسخ الملاحظات الاحتياطية" + }, + "note_detail": { + "printing": "جار الطباعة ..." + }, + "attachment_detail_2": { + "role_and_size": "الدور: {{role}}، الحجم: {{size}}", + "unrecognized_role": "دور المرفق '{{role}}'الغير معروف." + }, + "title_bar_buttons": { + "window-on-top": "ابقاء النافذة في الاعلى" + }, + "note_title": { + "placeholder": "اكتب عنوان الملاحظة هنا..." + }, + "image_context_menu": { + "copy_reference_to_clipboard": "نسخ المرجع الى الحافظة", + "copy_image_to_clipboard": "نسخ الصورة الى الحافظة" + }, + "geo-map": { + "unable-to-load-map": "تعذر تحميل الخريطة." + }, + "content_widget": { + "unknown_widget": "عنصر واجهة غير معروف للمعرف \"{{id}}\"." + }, + "png_export_button": { + "button_title": "تصدير المخطط كملف PNG" + }, + "protected_session_status": { + "inactive": "انقر للدخول الى جلسة محمية" } } diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index f2932b3f9..b635b557f 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 a308371f8..e34982c6a 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -184,7 +184,8 @@ }, "import-status": "Importstatus", "in-progress": "Import läuft: {{progress}}", - "successful": "Import erfolgreich abgeschlossen." + "successful": "Import erfolgreich abgeschlossen.", + "importZipRecommendation": "Beim Import einer ZIP-Datei wird die Notizhierarchie aus der Ordnerstruktur im Archiv übernommen." }, "include_note": { "dialog_title": "Notiz beifügen", @@ -646,7 +647,9 @@ "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", + "download-update": "Version {{latestVersion}} herunterladen" }, "sync_status": { "unknown": "

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

Klicke, um eine Synchronisierung jetzt auszulösen.

", @@ -733,7 +736,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 +766,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 +1260,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", @@ -1512,7 +1523,9 @@ "window-on-top": "Dieses Fenster immer oben halten" }, "note_detail": { - "could_not_find_typewidget": "Konnte typeWidget für Typ ‚{{type}}‘ nicht finden" + "could_not_find_typewidget": "Konnte typeWidget für Typ ‚{{type}}‘ nicht finden", + "printing": "Druckvorgang läuft…", + "printing_pdf": "PDF-Export läuft…" }, "note_title": { "placeholder": "Titel der Notiz hier eingeben…" @@ -2067,5 +2080,10 @@ }, "collections": { "rendering_error": "Aufgrund eines Fehlers können keine Inhalte angezeigt werden." + }, + "presentation_view": { + "edit-slide": "Folie bearbeiten", + "start-presentation": "Präsentation starten", + "slide-overview": "Übersicht der Folien ein-/ausblenden" } } 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 45b99227b..cff40010f 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": { @@ -1720,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..." @@ -2028,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 2b61d9d45..ce70f474b 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 dfd3f6b38..2c12c9bff 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -184,7 +184,8 @@ }, "import-status": "Statut de l'importation", "in-progress": "Importation en cours : {{progress}}", - "successful": "Importation terminée avec succès." + "successful": "Importation terminée avec succès.", + "importZipRecommendation": "Lors de l'importation d'un fichier ZIP, la hiérarchie des notes reflétera la structure des sous-répertoires au sein de l'archive." }, "include_note": { "dialog_title": "Inclure une note", @@ -276,7 +277,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": "Cliquer pour afficher les différences avec la note d'origine", + "diff_off_hint": "Cliquer 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...", @@ -641,7 +647,9 @@ "about": "À propos de Trilium Notes", "logout": "Déconnexion", "show-cheatsheet": "Afficher l'aide rapide", - "toggle-zen-mode": "Zen Mode" + "toggle-zen-mode": "Zen Mode", + "new-version-available": "Nouvelle mise à jour disponible", + "download-update": "Obtenir la version {{latestVersion}}" }, "zen_mode": { "button_exit": "Sortir du Zen mode" @@ -668,7 +676,7 @@ "search_in_note": "Rechercher dans la note", "note_source": "Code source", "note_attachments": "Pièces jointes", - "open_note_externally": "Ouverture externe", + "open_note_externally": "Ouvrir la note en externe", "open_note_externally_title": "Le fichier sera ouvert dans une application externe et les modifications apportées seront surveillées. Vous pourrez ensuite téléverser la version modifiée dans Trilium.", "open_note_custom": "Ouvrir la note avec", "import_files": "Importer des fichiers", @@ -731,7 +739,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", @@ -760,7 +769,8 @@ "table": "Tableau", "geo-map": "Carte géographique", "board": "Tableau de bord", - "include_archived_notes": "Afficher les notes archivées" + "include_archived_notes": "Afficher les notes archivées", + "presentation": "Présentation" }, "edited_notes": { "no_edited_notes_found": "Aucune note modifiée ce jour-là...", @@ -1135,7 +1145,8 @@ "code_auto_read_only_size": { "title": "Taille pour la lecture seule automatique", "description": "La taille pour la lecture seule automatique est le seuil au-delà de laquelle les notes seront affichées en mode lecture seule (pour optimiser les performances).", - "label": "Taille pour la lecture seule automatique (notes de code)" + "label": "Taille pour la lecture seule automatique (notes de code)", + "unit": "caractères" }, "code_mime_types": { "title": "Types MIME disponibles dans la liste déroulante" @@ -1154,7 +1165,8 @@ "download_images_description": "Le HTML collé peut contenir des références à des images en ligne, Trilium trouvera ces références et téléchargera les images afin qu'elles soient disponibles hors ligne.", "enable_image_compression": "Activer la compression des images", "max_image_dimensions": "Largeur/hauteur maximale d'une image en pixels (l'image sera redimensionnée si elle dépasse ce paramètre).", - "jpeg_quality_description": "Qualité JPEG (10 - pire qualité, 100 - meilleure qualité, 50 - 85 est recommandé)" + "jpeg_quality_description": "Qualité JPEG (10 - pire qualité, 100 - meilleure qualité, 50 - 85 est recommandé)", + "max_image_dimensions_unit": "pixels" }, "attachment_erasure_timeout": { "attachment_erasure_timeout": "Délai d'effacement des pièces jointes", @@ -1186,7 +1198,8 @@ "note_revisions_snapshot_limit_description": "La limite du nombre de versions de note désigne le nombre maximum de versions pouvant être enregistrées pour chaque note. -1 signifie aucune limite, 0 signifie supprimer toutes les versions. Vous pouvez définir le nombre maximal de versions pour une seule note avec le label #versioningLimit.", "snapshot_number_limit_label": "Nombre limite de versions de note :", "erase_excess_revision_snapshots": "Effacer maintenant les versions en excès", - "erase_excess_revision_snapshots_prompt": "Les versions en excès ont été effacées." + "erase_excess_revision_snapshots_prompt": "Les versions en excès ont été effacées.", + "snapshot_number_limit_unit": "instantanés" }, "search_engine": { "title": "Moteur de recherche", @@ -1228,19 +1241,35 @@ "title": "Table des matières", "description": "La table des matières apparaîtra dans les notes textuelles lorsque la note comporte plus d'un nombre défini de titres. Vous pouvez personnaliser ce nombre :", "disable_info": "Vous pouvez également utiliser cette option pour désactiver la table des matières en définissant un nombre très élevé.", - "shortcut_info": "Vous pouvez configurer un raccourci clavier pour afficher/masquer le volet de droite (y compris la table des matières) dans Options -> Raccourcis (nom « toggleRightPane »)." + "shortcut_info": "Vous pouvez configurer un raccourci clavier pour afficher/masquer le volet de droite (y compris la table des matières) dans Options -> Raccourcis (nom « toggleRightPane »).", + "unit": "titres" }, "text_auto_read_only_size": { "title": "Taille automatique en lecture seule", "description": "La taille automatique des notes en lecture seule est la taille au-delà de laquelle les notes seront affichées en mode lecture seule (pour des raisons de performances).", - "label": "Taille automatique en lecture seule (notes de texte)" + "label": "Taille automatique en lecture seule (notes de texte)", + "unit": "caractères" }, "i18n": { "title": "Paramètres régionaux", "language": "Langue", "first-day-of-the-week": "Premier jour de la semaine", "sunday": "Dimanche", - "monday": "Lundi" + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "first-week-of-the-year": "Première semaine de l'année", + "first-week-contains-first-day": "La première semaine contient le premier jour de l'année", + "first-week-contains-first-thursday": "La première semaine contient le premier jeudi de l'année", + "first-week-has-minimum-days": "La première semaine a un nombre minimum de jours", + "min-days-in-first-week": "Nombre minimum de jours dans la première semaine", + "first-week-info": "La première semaine contient le premier jeudi de l'année et est basée sur la norme ISO 8601 .", + "first-week-warning": "La modification des options de la première semaine peut entraîner des doublons avec les notes de semaine existantes et les notes de semaine existantes ne seront pas mises à jour en conséquence.", + "formatting-locale": "Format de date et de nombre", + "formatting-locale-auto": "En fonction de la langue de l'application" }, "backup": { "automatic_backup": "Sauvegarde automatique", @@ -1278,7 +1307,9 @@ "delete_token": "Supprimer/désactiver ce token", "rename_token_title": "Renommer le jeton", "rename_token_message": "Veuillez saisir le nom du nouveau jeton", - "delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?" + "delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?", + "see_more": "Voir plus de détails dans le {{- link_to_wiki}} et le {{- link_to_openapi_spec}} ou le {{- link_to_swagger_ui }}.", + "swagger_ui": "Interface utilisateur ETAPI Swagger" }, "options_widget": { "options_status": "Statut des options", @@ -1341,7 +1372,8 @@ "test_title": "Test de synchronisation", "test_description": "Testera la connexion et la prise de contact avec le serveur de synchronisation. Si le serveur de synchronisation n'est pas initialisé, cela le configurera pour qu'il se synchronise avec le document local.", "test_button": "Tester la synchronisation", - "handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}" + "handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}", + "timeout_unit": "millisecondes" }, "api_log": { "close": "Fermer" @@ -1401,11 +1433,14 @@ "import-into-note": "Importer dans la note", "apply-bulk-actions": "Appliquer des Actions groupées", "converted-to-attachments": "Les notes {{count}} ont été converties en pièces jointes.", - "convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?" + "convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?", + "archive": "Archive", + "unarchive": "Désarchiver", + "open-in-popup": "Modification rapide" }, "shared_info": { - "shared_publicly": "Cette note est partagée publiquement sur {{- link}}", - "shared_locally": "Cette note est partagée localement sur {{- link}}", + "shared_publicly": "Cette note est partagée publiquement sur {{- link}}.", + "shared_locally": "Cette note est partagée localement sur {{- link}}.", "help_link": "Pour obtenir de l'aide, visitez le wiki." }, "note_types": { @@ -1427,7 +1462,11 @@ "confirm-change": "Il n'est pas recommandé de modifier le type de note lorsque son contenu n'est pas vide. Voulez-vous continuer ?", "geo-map": "Carte géo", "beta-feature": "Beta", - "task-list": "Liste de tâches" + "task-list": "Liste de tâches", + "book": "Collection", + "ai-chat": "Chat IA", + "new-feature": "Nouveau", + "collections": "Collections" }, "protect_note": { "toggle-on": "Protéger la note", @@ -1480,13 +1519,16 @@ "hoist-this-note-workspace": "Focus cette note (espace de travail)", "refresh-saved-search-results": "Rafraîchir les résultats de recherche enregistrée", "create-child-note": "Créer une note enfant", - "unhoist": "Désactiver le focus" + "unhoist": "Désactiver le focus", + "toggle-sidebar": "Basculer la barre latérale" }, "title_bar_buttons": { "window-on-top": "Épingler cette fenêtre au premier plan" }, "note_detail": { - "could_not_find_typewidget": "Impossible de trouver typeWidget pour le type '{{type}}'" + "could_not_find_typewidget": "Impossible de trouver typeWidget pour le type '{{type}}'", + "printing": "Impression en cours...", + "printing_pdf": "Export au format PDF en cours..." }, "note_title": { "placeholder": "saisir le titre de la note ici..." @@ -1537,7 +1579,9 @@ }, "clipboard": { "cut": "Les note(s) ont été coupées dans le presse-papiers.", - "copied": "Les note(s) ont été coupées dans le presse-papiers." + "copied": "Les note(s) ont été coupées dans le presse-papiers.", + "copy_failed": "Impossible de copier dans le presse-papiers en raison de problèmes d'autorisation.", + "copy_success": "Copié dans le presse-papiers." }, "entrypoints": { "note-revision-created": "La version de la note a été créée.", @@ -1559,7 +1603,9 @@ "ws": { "sync-check-failed": "Le test de synchronisation a échoué !", "consistency-checks-failed": "Les tests de cohérence ont échoué ! Consultez les journaux pour plus de détails.", - "encountered-error": "Erreur \"{{message}}\", consultez la console." + "encountered-error": "Erreur \"{{message}}\", consultez la console.", + "lost-websocket-connection-title": "Connexion au serveur perdue", + "lost-websocket-connection-message": "Vérifiez la configuration de votre proxy inverse (par exemple nginx ou Apache) pour vous assurer que les connexions WebSocket sont correctement autorisées et ne sont pas bloquées." }, "hoisted_note": { "confirm_unhoisting": "La note demandée «{{requestedNote}}» est en dehors du sous-arbre de la note focus «{{hoistedNote}}». Le focus doit être désactivé pour accéder à la note. Voulez-vous enlever le focus ?" @@ -1581,13 +1627,15 @@ }, "highlighting": { "description": "Contrôle la coloration syntaxique des blocs de code à l'intérieur des notes texte, les notes de code ne seront pas affectées.", - "color-scheme": "Jeu de couleurs" + "color-scheme": "Jeu de couleurs", + "title": "Blocs de code" }, "code_block": { "word_wrapping": "Saut à la ligne automatique suivant la largeur", "theme_none": "Pas de coloration syntaxique", "theme_group_light": "Thèmes clairs", - "theme_group_dark": "Thèmes sombres" + "theme_group_dark": "Thèmes sombres", + "copy_title": "Copier dans le presse-papiers" }, "classic_editor_toolbar": { "title": "Mise en forme" @@ -1625,7 +1673,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", @@ -1645,7 +1694,8 @@ "full-text-search": "Recherche dans le texte" }, "note_tooltip": { - "note-has-been-deleted": "La note a été supprimée." + "note-has-been-deleted": "La note a été supprimée.", + "quick-edit": "Edition rapide" }, "geo-map": { "create-child-note-title": "Créer une nouvelle note enfant et l'ajouter à la carte", @@ -1654,7 +1704,8 @@ }, "geo-map-context": { "open-location": "Ouvrir la position", - "remove-from-map": "Retirer de la carte" + "remove-from-map": "Retirer de la carte", + "add-note": "Ajouter un marqueur à cet endroit" }, "help-button": { "title": "Ouvrir la page d'aide correspondante" @@ -1681,10 +1732,41 @@ "minimum_input": "La valeur de temps saisie doit être d'au moins {{minimumSeconds}} secondes." }, "multi_factor_authentication": { - "oauth_user_email": "Courriel de l'utilisateur : " + "oauth_user_email": "Courriel de l'utilisateur : ", + "title": "Authentification multifacteur", + "description": "L'authentification multifacteur (MFA) renforce la sécurité de votre compte. Au lieu de simplement saisir un mot de passe pour vous connecter, le MFA vous demande de fournir une ou plusieurs preuves supplémentaires pour vérifier votre identité. Ainsi, même si quelqu'un obtient votre mot de passe, il ne peut accéder à votre compte sans cette deuxième information. C'est comme ajouter une serrure supplémentaire à votre porte, rendant l'effraction beaucoup plus difficile.

Veuillez suivre les instructions ci-dessous pour activer le MFA. Si vous ne configurez pas correctement, la connexion se fera uniquement par mot de passe.", + "mfa_enabled": "Activer l'authentification multifacteur", + "mfa_method": "Méthode MFA", + "electron_disabled": "L'authentification multifacteur n'est actuellement pas prise en charge dans la version de bureau.", + "totp_title": "Mot de passe à usage unique basé sur le temps (TOTP)", + "totp_description": "Le TOTP (Time-Based One-Time Password) est une fonctionnalité de sécurité qui génère un code unique et temporaire, modifié toutes les 30 secondes. Vous utilisez ce code, associé à votre mot de passe, pour vous connecter à votre compte, ce qui rend l'accès à celui-ci beaucoup plus difficile.", + "totp_secret_title": "Générer un secret TOTP", + "totp_secret_generate": "Générer un secret TOTP", + "totp_secret_regenerate": "Re-générer un secret TOTP", + "no_totp_secret_warning": "Pour activer TOTP, vous devez d’abord générer un secret TOTP.", + "totp_secret_description_warning": "Après avoir généré un nouveau secret TOTP, vous devrez vous reconnecter avec le nouveau secret TOTP.", + "totp_secret_generated": "Secret TOTP généré", + "totp_secret_warning": "Veuillez conserver le secret généré dans un endroit sûr. Il ne sera plus affiché.", + "totp_secret_regenerate_confirm": "Voulez-vous vraiment régénérer le secret TOTP ? Cela invalidera le secret TOTP précédent et tous les codes de récupération existants.", + "recovery_keys_title": "Clés de récupération d'authentification unique", + "recovery_keys_description": "Les clés de récupération d'authentification unique sont utilisées pour vous connecter même si vous ne pouvez pas accéder à vos codes d'authentification.", + "recovery_keys_description_warning": "Les clés de récupération ne seront plus affichées après avoir quitté la page, conservez-les dans un endroit sûr et sécurisé.
Une fois qu'une clé de récupération a été utilisée, elle devient inutilisable.", + "recovery_keys_error": "Erreur lors de la génération des codes de récupération", + "recovery_keys_no_key_set": "Aucun code de récupération défini", + "recovery_keys_generate": "Générer des codes de récupération", + "recovery_keys_regenerate": "Re-générer des codes de récupération", + "recovery_keys_used": "Utilisé : {{date}}", + "recovery_keys_unused": "Le code de récupération {{index}} n'est pas utilisé", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenID est un moyen standardisé de vous connecter à des sites web avec un compte d'un autre service, comme Google, afin de vérifier votre identité. L'émetteur par défaut est Google, mais vous pouvez le modifier pour n'importe quel autre fournisseur OpenID. Consultez ici pour plus d'informations. Suivez ces instructions pour configurer un service OpenID via Google.", + "oauth_description_warning": "Pour activer OAuth/OpenID, vous devez définir l'URL de base, l'ID client et le secret client OAuth/OpenID dans le fichier config.ini, puis redémarrer l'application. Pour les définir à partir des variables d'environnement, définissez TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID et TRILIUM_OAUTH_CLIENT_SECRET.", + "oauth_missing_vars": "Paramètres manquants : {{-variables}}", + "oauth_user_account": "Compte utilisateur: ", + "oauth_user_not_logged_in": "Pas connecté !" }, "modal": { - "close": "Fermer" + "close": "Fermer", + "help_title": "Afficher plus d'informations sur cet écran" }, "ai_llm": { "not_started": "Non démarré", @@ -1763,7 +1845,77 @@ "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 en erreur", + "last_processed": "Dernier traitement", + "restore_provider": "Restaurer le fournisseur de 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", + "provider_precedence": "Priorité du fournisseur", + "never": "Jamais", + "processing": "Traitement en cours ({{percentage}}%)", + "incomplete": "Incomplet ({{percentage}}%)", + "complete": "Terminé (100%)", + "refreshing": "Mise à jour...", + "auto_refresh_notice": "Actualisation automatique toutes les {{seconds}} secondes", + "note_queued_for_retry": "Note mise en file d'attente pour une nouvelle tentative", + "failed_to_retry_note": "Échec de la nouvelle tentative de note", + "all_notes_queued_for_retry": "Toutes les notes ayant échoué sont mises en file d'attente pour une nouvelle tentative", + "failed_to_retry_all": "Échec du ré essai des notes", + "ai_settings": "Paramètres IA", + "api_key_tooltip": "Clé API pour accéder au service", + "empty_key_warning": { + "anthropic": "La clé API Anthropic est vide. Veuillez saisir une clé API valide.", + "openai": "La clé API OpenAI est vide. Veuillez saisir une clé API valide.", + "voyage": "La clé API Voyage est vide. Veuillez saisir une clé API valide.", + "ollama": "La clé API Ollama est vide. Veuillez saisir une clé API valide." + }, + "agent": { + "processing": "Traitement...", + "thinking": "Réflexion...", + "loading": "Chargement...", + "generating": "Génération..." + }, + "name": "IA", + "openai": "OpenAI", + "use_enhanced_context": "Utiliser un contexte amélioré", + "enhanced_context_description": "Fournit à l'IA plus de contexte à partir de la note et de ses notes associées pour de meilleures réponses", + "show_thinking": "Montrer la réflexion", + "show_thinking_description": "Montrer la chaîne de pensée de l'IA", + "enter_message": "Entrez votre message...", + "error_contacting_provider": "Erreur lors de la connexion au fournisseur d'IA. Veuillez vérifier vos paramètres et votre connexion Internet.", + "error_generating_response": "Erreur lors de la génération de la réponse de l'IA", + "index_all_notes": "Indexer toutes les notes", + "index_status": "Statut de l'index", + "indexed_notes": "Notes indexées", + "indexing_stopped": "Arrêt de l'indexation", + "indexing_in_progress": "Indexation en cours...", + "last_indexed": "Dernière indexée", + "note_chat": "Note discussion", + "sources": "Sources", + "start_indexing": "Démarrage de l'indexation", + "use_advanced_context": "Utiliser le contexte avancé", + "ollama_no_url": "Ollama n'est pas configuré. Veuillez saisir une URL valide.", + "chat": { + "root_note_title": "Discussions IA", + "root_note_content": "Cette note contient vos conversations de chat IA enregistrées.", + "new_chat_title": "Nouvelle discussion", + "create_new_ai_chat": "Créer une nouvelle discussion IA" + }, + "create_new_ai_chat": "Créer une nouvelle discussion IA", + "configuration_warnings": "Il y a quelques problèmes avec la configuration de votre IA. Veuillez vérifier vos paramètres.", + "experimental_warning": "La fonctionnalité LLM est actuellement expérimentale – vous êtes prévenu.", + "selected_provider": "Fournisseur sélectionné", + "selected_provider_description": "Choisissez le fournisseur d’IA pour les fonctionnalités de discussion et de complétion", + "select_model": "Sélectionner le modèle...", + "select_provider": "Sélectionnez un fournisseur...", + "ai_enabled": "Fonctionnalités d'IA activées", + "ai_disabled": "Fonctionnalités d'IA désactivées", + "no_models_found_online": "Aucun modèle trouvé. Veuillez vérifier votre clé API et vos paramètres.", + "no_models_found_ollama": "Aucun modèle Ollama trouvé. Veuillez vérifier si Ollama est en cours d'exécution.", + "error_fetching": "Erreur lors de la récupération des modèles : {{error}}" }, "ui-performance": { "title": "Performance", @@ -1772,5 +1924,168 @@ "enable-backdrop-effects": "Activer les effets d'arrière plan pour les menus, popups et panneaux", "enable-smooth-scroll": "Active le défilement fluide", "app-restart-required": "(redémarrer l'application pour appliquer les changements)" + }, + "custom_date_time_format": { + "title": "Format de date/heure personnalisé", + "description": "Personnalisez le format de la date et de l'heure insérées via ou la barre d'outils. Consultez la Day.js docs pour connaître les formats disponibles.", + "format_string": "Chaîne de format :", + "formatted_time": "Date/heure formatée :" + }, + "table_view": { + "delete_column_confirmation": "Êtes-vous sûr de vouloir supprimer cette colonne ? L'attribut correspondant sera supprimé de toutes les notes.", + "delete-column": "Supprimer la colonne", + "new-column-label": "Étiquette", + "new-column-relation": "Relation", + "edit-column": "Editer la colonne", + "add-column-to-the-right": "Ajouter une colonne à droite", + "new-row": "Nouvelle ligne", + "new-column": "Nouvelle colonne", + "sort-column-by": "Trier par « {{title}} »", + "sort-column-ascending": "Ascendant", + "sort-column-descending": "Descendant", + "sort-column-clear": "Annuler le tri", + "hide-column": "Masquer la colonne \"{{title}}\"", + "show-hide-columns": "Afficher/masquer les colonnes", + "row-insert-above": "Insérer une ligne au-dessus", + "row-insert-below": "Insérer une ligne au-dessous", + "row-insert-child": "Insérer une note enfant", + "add-column-to-the-left": "Ajouter une colonne à gauche" + }, + "book_properties_config": { + "hide-weekends": "Masquer les week-ends", + "display-week-numbers": "Afficher les numéros de semaine", + "map-style": "Style de carte :", + "max-nesting-depth": "Profondeur d'imbrication maximale :", + "raster": "Trame", + "vector_light": "Vecteur (clair)", + "vector_dark": "Vecteur (foncé)", + "show-scale": "Afficher l'échelle" + }, + "table_context_menu": { + "delete_row": "Supprimer la ligne" + }, + "board_view": { + "delete-note": "Supprimer la note...", + "remove-from-board": "Retirer du tableau", + "archive-note": "Note archivée", + "unarchive-note": "Note désarchivée", + "move-to": "Déplacer vers", + "insert-above": "Insérer au-dessus", + "insert-below": "Insérer au-dessous", + "delete-column": "Supprimer la colonne", + "delete-column-confirmation": "Êtes-vous sûr de vouloir supprimer cette colonne ? L'attribut correspondant sera également supprimé dans les notes sous cette colonne.", + "new-item": "Nouvel article", + "new-item-placeholder": "Entrez le titre de note...", + "add-column": "Ajouter une colonne", + "add-column-placeholder": "Entrez le nom de la colonne...", + "edit-note-title": "Cliquez pour modifier le titre de la note", + "edit-column-title": "Cliquez pour modifier le titre de la colonne" + }, + "presentation_view": { + "edit-slide": "Modifier cette diapositive", + "start-presentation": "Démarrer la présentation", + "slide-overview": "Afficher un aperçu des diapositives" + }, + "command_palette": { + "tree-action-name": "Arborescence : {{name}}", + "export_note_title": "Exporter la note", + "export_note_description": "Exporter la note actuelle", + "show_attachments_title": "Afficher les pièces jointes", + "show_attachments_description": "Afficher les pièces jointes des notes", + "search_notes_title": "Rechercher des notes", + "search_notes_description": "Ouvrir la recherche avancée", + "search_subtree_title": "Rechercher dans la sous-arborescence", + "search_subtree_description": "Rechercher dans la sous-arborescence actuelle", + "search_history_title": "Afficher l'historique de recherche", + "search_history_description": "Afficher les recherches précédentes", + "configure_launch_bar_title": "Configurer la barre de lancement", + "configure_launch_bar_description": "Ouvrir la configuration de la barre de lancement pour ajouter ou supprimer des éléments." + }, + "content_renderer": { + "open_externally": "Ouverture externe" + }, + "call_to_action": { + "next_theme_title": "Essayez le nouveau thème Trilium", + "next_theme_message": "Vous utilisez actuellement le thème hérité de l'ancienne version, souhaitez-vous essayer le nouveau thème ?", + "next_theme_button": "Essayez le nouveau thème", + "background_effects_title": "Les effets d'arrière-plan sont désormais stables", + "background_effects_message": "Sur les appareils Windows, les effets d'arrière-plan sont désormais parfaitement stables. Ils ajoutent une touche de couleur à l'interface utilisateur en floutant l'arrière-plan. Cette technique est également utilisée dans d'autres applications comme l'Explorateur Windows.", + "background_effects_button": "Activer les effets d'arrière-plan", + "dismiss": "Rejeter" + }, + "settings": { + "related_settings": "Paramètres associés" + }, + "settings_appearance": { + "related_code_blocks": "Schéma de coloration syntaxique pour les blocs de code dans les notes de texte", + "related_code_notes": "Schéma de couleurs pour les notes de code" + }, + "units": { + "percentage": "%" + }, + "pagination": { + "page_title": "Page de {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} notes" + }, + "collections": { + "rendering_error": "Impossible d'afficher le contenu en raison d'une erreur." + }, + "code-editor-options": { + "title": "Éditeur" + }, + "tasks": { + "due": { + "today": "Aujourd'hui", + "tomorrow": "Demain", + "yesterday": "Hier" + } + }, + "content_widget": { + "unknown_widget": "Widget inconnu pour « {{id}} »." + }, + "note_language": { + "not_set": "Non défini", + "configure-languages": "Configurer les langues..." + }, + "content_language": { + "title": "Contenu des langues", + "description": "Sélectionnez une ou plusieurs langues à afficher dans la section « Propriétés de base » d'une note textuelle en lecture seule ou modifiable. Cela permettra d'utiliser des fonctionnalités telles que la vérification orthographique ou la prise en charge de l'écriture de droite à gauche." + }, + "switch_layout_button": { + "title_vertical": "Déplacer le volet d'édition vers le bas", + "title_horizontal": "Déplacer le panneau d'édition vers la gauche" + }, + "toggle_read_only_button": { + "unlock-editing": "Déverrouiller l'édition", + "lock-editing": "Verrouiller l'édition" + }, + "png_export_button": { + "button_title": "Exporter le diagramme au format PNG" + }, + "svg": { + "export_to_png": "Le diagramme n'a pas pu être exporté au format PNG." + }, + "code_theme": { + "title": "Apparence", + "word_wrapping": "retour à la ligne automatique", + "color-scheme": "Jeu de couleurs" + }, + "cpu_arch_warning": { + "title": "Veuillez télécharger la version ARM64", + "message_macos": "TriliumNext fonctionne actuellement sous Rosetta 2, ce qui signifie que vous utilisez la version Intel (x64) sur un Mac Apple Silicon. Cela aura un impact significatif sur les performances et l'autonomie de la batterie.", + "message_windows": "TriliumNext fonctionne actuellement en mode émulation, ce qui signifie que vous utilisez la version Intel (x64) sur un appareil Windows sur ARM. Cela aura un impact significatif sur les performances et l'autonomie de la batterie.", + "recommendation": "Pour une expérience optimale, veuillez télécharger la version ARM64 native de TriliumNext depuis notre page de versions.", + "download_link": "Télécharger la version native", + "continue_anyway": "Continuer quand même", + "dont_show_again": "Ne plus afficher cet avertissement" + }, + "editorfeatures": { + "title": "Caractéristiques", + "emoji_completion_enabled": "Activer la saisie semi-automatique des emojis", + "emoji_completion_description": "Si cette option est activée, les emojis peuvent être facilement insérés dans le texte en tapant `:` , suivi du nom d'un emoji.", + "note_completion_enabled": "Activer la saisie semi-automatique des notes", + "note_completion_description": "Si cette option est activée, des liens vers des notes peuvent être créés en tapant `@` suivi du titre d'une note.", + "slash_commands_enabled": "Activer les commandes slash", + "slash_commands_description": "Si cette option est activée, les commandes d'édition telles que l'insertion de sauts de ligne ou d'en-têtes peuvent être activées en tapant `/`." } } diff --git a/apps/client/src/translations/hu/translation.json b/apps/client/src/translations/hu/translation.json index 0967ef424..042fbb281 100644 --- a/apps/client/src/translations/hu/translation.json +++ b/apps/client/src/translations/hu/translation.json @@ -1 +1,50 @@ -{} +{ + "about": { + "title": "A Trilium Notes-ról", + "homepage": "Kezdőlap:", + "app_version": "Alkalmazás verziója:", + "db_version": "Adatbázis verzió:", + "sync_version": "Verzió szinkronizálás :", + "build_revision": "Build revízió:", + "data_directory": "Adatkönyvtár:", + "build_date": "Build dátum:" + }, + "toast": { + "critical-error": { + "title": "Kritikus hiba", + "message": "Kritikus hiba történt, amely megakadályozza a kliensalkalmazás indítását:\n\n{{message}}\n\nEzt valószínűleg egy váratlan szkripthiba okozza. Próbálja meg biztonságos módban elindítani az alkalmazást, és hárítsa el a problémát." + }, + "widget-error": { + "title": "Nem sikerült inicializálni egy widgetet", + "message-custom": "A(z) \"{{id}}\" azonosítójú, \"{{title}}\" című jegyzetből származó egyéni widget inicializálása sikertelen volt a következő ok miatt:\n\n{{message}}", + "message-unknown": "Ismeretlen widget inicializálása sikertelen volt a következő ok miatt:\n\n{{message}}" + }, + "bundle-error": { + "title": "Nem sikerült betölteni az egyéni szkriptet", + "message": "A(z) \"{{id}}\" azonosítójú, \"{{title}}\" című jegyzetből származó szkript nem hajtható végre a következő ok miatt:\n\n{{message}}" + } + }, + "add_link": { + "add_link": "Link hozzáadása", + "help_on_links": "Segítség a linkekhez", + "note": "Jegyzet", + "search_note": "név szerinti jegyzetkeresés", + "link_title_mirrors": "A link cím tükrözi a jegyzet aktuális címét", + "link_title_arbitrary": "link cím önkényesen módosítható", + "link_title": "Link cím", + "button_add_link": "Link hozzáadása" + }, + "branch_prefix": { + "edit_branch_prefix": "Az elágazás előtagjának szerkesztése", + "help_on_tree_prefix": "Segítség a fa előtagján", + "prefix": "Az előtag: ", + "save": "Mentés" + }, + "bulk_actions": { + "bulk_actions": "Tömeges akciók", + "affected_notes": "Érintett jegyzetek", + "labels": "Címkék", + "relations": "Kapcsolatok", + "notes": "Jegyzetek" + } +} 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..a49a9a5dc 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,1536 @@ }, "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": "{{ percentage }}% 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 ({{percentage}}%)", + "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 ({{percentage}}%)", + "incomplete": "Incompleto ({{percentage}}%)", + "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", + "note_chat": "Nota Chat", + "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}}.", + "importZipRecommendation": "Quando si importa un file ZIP, la gerarchia delle note rifletterà la struttura delle sottodirectory all'interno dell'archivio." + }, + "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 resettata. 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: {{date}}", + "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: {{-variables}}", + "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}}'", + "printing": "Stampa in corso...", + "printing_pdf": "Esportazione in PDF in corso..." + }, + "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()`, \\nmentre 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: {{name}}", + "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." } } diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index 70ba11f58..1f81a4a4f 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -68,11 +68,12 @@ "switch_to_desktop_version": "デスクトップ版に切り替え", "configure_launchbar": "ランチャーバーの設定", "show_shared_notes_subtree": "共有ノートのサブツリーを表示", - "update_available": "バージョン {{latestVersion}} が利用可能です。クリックしてダウンロードしてください。" + "new-version-available": "新しいアップデートが利用可能", + "download-update": "{{latestVersion}} をバージョンを入手" }, "left_pane_toggle": { "show_panel": "パネルを表示", - "hide_panel": "パネルを隠す" + "hide_panel": "パネルを非表示" }, "move_pane_button": { "move_left": "左に移動", @@ -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": "ジオマップ", @@ -733,7 +741,7 @@ "new-column": "新しい列", "sort-column-by": "\"{{title}}\" で並べ替え", "sort-column-clear": "並べ替えをクリア", - "hide-column": "列 \"{{title}}\" を隠す", + "hide-column": "列 \"{{title}}\" を非表示", "show-hide-columns": "列を表示/非表示", "row-insert-above": "上に行を挿入", "row-insert-below": "下に行を挿入", @@ -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}} 件の他の結果。", @@ -1192,7 +1200,7 @@ "collapse-title": "ノートツリーを折りたたむ", "scroll-active-title": "アクティブノートまでスクロール", "tree-settings-title": "ツリーの設定", - "hide-archived-notes": "アーカイブノートを隠す", + "hide-archived-notes": "アーカイブノートを非表示", "automatically-collapse-notes": "ノートを自動的に折りたたむ", "automatically-collapse-notes-title": "一定期間使用されないと、ツリーを整理するためにノートは折りたたまれます。", "save-changes": "変更を保存して適用", @@ -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 174247f9f..14350bc83 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/ru/translation.json b/apps/client/src/translations/ru/translation.json index b7da05e48..07c323a89 100644 --- a/apps/client/src/translations/ru/translation.json +++ b/apps/client/src/translations/ru/translation.json @@ -320,7 +320,8 @@ "explodeArchivesTooltip": "Если этот флажок установлен, Trilium будет читать файлы .zip, .enex и .opml и создавать заметки из файлов внутри этих архивов. Если флажок не установлен, Trilium будет прикреплять сами архивы к заметке.", "explodeArchives": "Прочитать содержимое архивов .zip, .enex и .opml.", "shrinkImagesTooltip": "

Если этот параметр включен, Trilium попытается уменьшить размер импортируемых изображений путём масштабирования и оптимизации, что может повлиять на воспринимаемое качество изображения. Если этот параметр не установлен, изображения будут импортированы без изменений.

Это не относится к импорту файлов .zip с метаданными, поскольку предполагается, что эти файлы уже оптимизированы.

", - "codeImportedAsCode": "Импортировать распознанные файлы кода (например, .json) в виде заметок типа \"код\", если это неясно из метаданных" + "codeImportedAsCode": "Импортировать распознанные файлы кода (например, .json) в виде заметок типа \"код\", если это неясно из метаданных", + "importZipRecommendation": "При импорте ZIP файла иерархия заметок будет отражена в структуре папок внутри архива." }, "markdown_import": { "dialog_title": "Импорт Markdown", @@ -980,7 +981,8 @@ "open_sql_console_history": "Открыть историю консоли SQL", "show_shared_notes_subtree": "Поддерево общедоступных заметок", "switch_to_mobile_version": "Перейти на мобильную версию", - "switch_to_desktop_version": "Переключиться на версию для ПК" + "switch_to_desktop_version": "Переключиться на версию для ПК", + "new-version-available": "Доступно обновление" }, "zpetne_odkazy": { "backlink": "{{count}} ссылки", 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 8bf6461b1..12a3bd68d 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -184,7 +184,8 @@ }, "import-status": "匯入狀態", "in-progress": "正在匯入:{{progress}}", - "successful": "匯入成功。" + "successful": "匯入成功。", + "importZipRecommendation": "匯入 ZIP 檔案時,筆記層級將反映壓縮檔內的子目錄結構。" }, "include_note": { "dialog_title": "內嵌筆記", @@ -646,7 +647,9 @@ "about": "關於 TriliumNext 筆記", "logout": "登出", "show-cheatsheet": "顯示快捷鍵說明", - "toggle-zen-mode": "禪模式" + "toggle-zen-mode": "禪模式", + "new-version-available": "發現新更新", + "download-update": "取得版本 {{latestVersion}}" }, "sync_status": { "unknown": "

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

點擊以立即觸發同步。

", @@ -733,7 +736,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 +750,7 @@ "editable": "可編輯", "basic_properties": "基本屬性", "language": "語言", - "configure_code_notes": "配寘代碼注釋..." + "configure_code_notes": "設定程式碼筆記…" }, "book_properties": { "view_type": "視圖類型", @@ -762,7 +766,8 @@ "table": "表格", "geo-map": "地理地圖", "board": "看板", - "include_archived_notes": "顯示已封存筆記" + "include_archived_notes": "顯示已封存筆記", + "presentation": "簡報" }, "edited_notes": { "no_edited_notes_found": "今天還沒有編輯過的筆記...", @@ -1250,7 +1255,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 +1442,7 @@ "relation-map": "關聯圖", "note-map": "筆記地圖", "render-note": "渲染筆記", - "mermaid-diagram": "美人魚圖(Mermaid)", + "mermaid-diagram": "美人魚圖", "canvas": "畫布", "web-view": "網頁顯示", "mind-map": "心智圖", @@ -1507,7 +1518,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 +1640,7 @@ "label": "格式工具欄", "floating": { "title": "浮動", - "description": "編輯工具出現在遊標附近;" + "description": "編輯工具出現在游標附近;" }, "fixed": { "title": "固定", @@ -2065,5 +2078,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..77f455067 100644 --- a/apps/client/src/translations/vi/translation.json +++ b/apps/client/src/translations/vi/translation.json @@ -4,11 +4,15 @@ "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", - "button_add_link": "Thêm liên kết" + "button_add_link": "Thêm liên kết", + "help_on_links": "Trợ giúp về các liên kết" }, "bulk_actions": { "other": "Khác" @@ -34,7 +38,17 @@ }, "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", + "message-custom": "Tiện ích tùy chỉnh từ ghi chú với ID \"{{id}}\", tiêu đề \"{{title}}\" không thể khởi tạo vì:\n\n{{message}}", + "message-unknown": "Tiện ích chưa biết không thể được khởi tạo vì:\n\n{{message}}" + }, + "bundle-error": { + "title": "Tải script tùy chọn thất bại", + "message": "Script từ ghi chú ID \"{{id}}\", tiêu đề \"{{title}}\" không thể chạy được vì:\n\n{{message}}" } }, "import": { diff --git a/apps/client/src/types.d.ts b/apps/client/src/types.d.ts index 2a14b032d..f549680a7 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/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 1ee6d01ec..1084011ed 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -8,7 +8,9 @@ import { TypeWidgetProps } from "./type_widgets/type_widget"; import "./NoteDetail.css"; import attributes from "../services/attributes"; import { ExtendedNoteType, TYPE_MAPPINGS, TypeWidget } from "./note_types"; -import { dynamicRequire, isMobile } from "../services/utils"; +import { dynamicRequire, isElectron, isMobile } from "../services/utils"; +import toast from "../services/toast.js"; +import { t } from "../services/i18n"; /** * The note detail is in charge of rendering the content of a note, by determining its type (e.g. text, code) and using the appropriate view widget. @@ -107,6 +109,17 @@ export default function NoteDetail() { document.body.classList.toggle("force-fixed-tree", hasFixedTree); }, [ note ]); + // Handle toast notifications. + useEffect(() => { + if (!isElectron()) return; + const { ipcRenderer } = dynamicRequire("electron"); + const listener = () => { + toast.closePersistent("printing"); + }; + ipcRenderer.on("print-done", listener); + return () => ipcRenderer.off("print-done", listener); + }, []); + useTriliumEvent("executeInActiveNoteDetailWidget", ({ callback }) => { if (!noteContext?.isActive()) return; callback(parentComponent); @@ -126,15 +139,50 @@ export default function NoteDetail() { useTriliumEvent("printActiveNote", () => { if (!noteContext?.isActive() || !note) return; - // Trigger in timeout to dismiss the menu while printing. - setTimeout(window.print, 0); + toast.showPersistent({ + icon: "bx bx-loader-circle bx-spin", + message: t("note_detail.printing"), + id: "printing" + }); + + if (isElectron()) { + const { ipcRenderer } = dynamicRequire("electron"); + ipcRenderer.send("print-note", { + notePath: noteContext.notePath + }); + } else { + const iframe = document.createElement('iframe'); + iframe.src = `?print#${noteContext.notePath}`; + iframe.className = "print-iframe"; + document.body.appendChild(iframe); + iframe.onload = () => { + if (!iframe.contentWindow) { + toast.closePersistent("printing"); + document.body.removeChild(iframe); + return; + } + + iframe.contentWindow.addEventListener("note-ready", () => { + toast.closePersistent("printing"); + iframe.contentWindow?.print(); + document.body.removeChild(iframe); + }); + }; + } }); useTriliumEvent("exportAsPdf", () => { if (!noteContext?.isActive() || !note) return; + toast.showPersistent({ + icon: "bx bx-loader-circle bx-spin", + message: t("note_detail.printing_pdf"), + id: "printing" + }); + const { ipcRenderer } = dynamicRequire("electron"); ipcRenderer.send("export-as-pdf", { title: note.title, + notePath: noteContext.notePath, pageSize: note.getAttributeValue("label", "printPageSize") ?? "Letter", landscape: note.hasAttribute("label", "printLandscape") }); 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/buttons/right_dropdown_button.ts b/apps/client/src/widgets/buttons/right_dropdown_button.ts index 6d896eae2..7c43f14af 100644 --- a/apps/client/src/widgets/buttons/right_dropdown_button.ts +++ b/apps/client/src/widgets/buttons/right_dropdown_button.ts @@ -47,8 +47,9 @@ export default class RightDropdownButtonWidget extends BasicWidget { } }); - this.$tooltip = this.$widget.find(".tooltip-trigger").attr("title", this.title); - this.tooltip = new Tooltip(this.$tooltip[0], { + this.$widget.attr("title", this.title); + this.tooltip = Tooltip.getOrCreateInstance(this.$widget[0], { + trigger: "hover", placement: handleRightToLeftPlacement(this.settings.titlePlacement), fallbackPlacements: [ handleRightToLeftPlacement(this.settings.titlePlacement) ] }); @@ -56,9 +57,7 @@ export default class RightDropdownButtonWidget extends BasicWidget { this.$widget .find(".right-dropdown-button") .addClass(this.iconClass) - .on("click", () => this.tooltip.hide()) - .on("mouseenter", () => this.tooltip.show()) - .on("mouseleave", () => this.tooltip.hide()); + .on("click", () => this.tooltip.hide()); this.$widget.on("show.bs.dropdown", async () => { await this.dropdownShown(); 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/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 652782646..518af914c 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -66,6 +66,7 @@ export const LOCALE_MAPPINGS: Record Promise<{ de de: () => import("@fullcalendar/core/locales/de"), es: () => import("@fullcalendar/core/locales/es"), fr: () => import("@fullcalendar/core/locales/fr"), + it: () => import("@fullcalendar/core/locales/it"), cn: () => import("@fullcalendar/core/locales/zh-cn"), tw: () => import("@fullcalendar/core/locales/zh-tw"), ro: () => import("@fullcalendar/core/locales/ro"), 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..2b5d1bdd0 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,15 +130,22 @@ 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); + if ($renderedContent[0].innerHTML) { + contentRef.current.replaceChildren(...$renderedContent); + } else { + contentRef.current.replaceChildren(); + } contentRef.current.classList.add(`type-${type}`); highlightSearch(contentRef.current); }) 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={