mirror of
https://github.com/TriliumNext/Trilium.git
synced 2026-10-12 02:09:59 +00:00
Merge remote-tracking branch 'origin/main' into feature/relation_map_improvements
; Conflicts: ; apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json ; apps/standalone/src/assets/help_meta.json
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { beforeEach, describe, expect, it } from "vitest";
|
||||
|
||||
import type { ViewScope } from "../services/link.js";
|
||||
import { buildNote } from "../test/easy-froca.js";
|
||||
import appContext from "./app_context.js";
|
||||
import NoteContext from "./note_context.js";
|
||||
@@ -63,3 +64,20 @@ describe("NoteContext read-only capability", () => {
|
||||
expect(await noteContext.isReadOnly()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("NoteContext view scope", () => {
|
||||
it("keeps its own copy of the view scope it is given", async () => {
|
||||
buildNote({ id: "root", title: "root", children: [ { id: "blocks", title: "Blocks" } ] });
|
||||
const viewScope: ViewScope = { block: "a" };
|
||||
const noteContext = new NoteContext();
|
||||
|
||||
await noteContext.setNote("root/blocks", {
|
||||
viewScope, skipRecentNotes: true, triggerSwitchEvent: false
|
||||
});
|
||||
expect(noteContext.viewScope).toEqual({ block: "a", viewMode: "default" });
|
||||
|
||||
// What `revealBlockReference()` does once it has scrolled to the block.
|
||||
if (noteContext.viewScope) noteContext.viewScope.block = undefined;
|
||||
expect(viewScope).toEqual({ block: "a" });
|
||||
});
|
||||
});
|
||||
|
||||
@@ -162,8 +162,11 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
|
||||
/** @returns the note context that ended up showing the note: usually `this`, or a new tab when a pinned tab redirected the navigation. `undefined` if nothing was navigated. */
|
||||
async setNote(inputNotePath: string | undefined, opts: SetNoteOpts = {}): Promise<NoteContext | undefined> {
|
||||
opts.triggerSwitchEvent = opts.triggerSwitchEvent !== undefined ? opts.triggerSwitchEvent : true;
|
||||
opts.viewScope = opts.viewScope || {};
|
||||
opts.viewScope.viewMode = opts.viewScope.viewMode || "default";
|
||||
// Readers like `revealBlockReference()` change the scope, so the context keeps a copy.
|
||||
const viewScope: ViewScope = {
|
||||
...opts.viewScope,
|
||||
viewMode: opts.viewScope?.viewMode || "default"
|
||||
};
|
||||
|
||||
if (!inputNotePath) {
|
||||
return;
|
||||
@@ -175,7 +178,8 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.notePath === resolvedNotePath && utils.areObjectsEqual(this.viewScope, opts.viewScope)) {
|
||||
const isSameView = utils.areObjectsEqual(this.viewScope, viewScope);
|
||||
if (this.notePath === resolvedNotePath && isSameView) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -184,7 +188,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
|
||||
if (shouldRedirectPinnedNavigation(this.pinned, this.noteId, targetNoteId)) {
|
||||
return appContext.tabManager.openContextWithNote(resolvedNotePath, {
|
||||
activate: true,
|
||||
viewScope: opts.viewScope,
|
||||
viewScope,
|
||||
hoistedNoteId: this.hoistedNoteId
|
||||
});
|
||||
}
|
||||
@@ -198,7 +202,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
|
||||
const previousNoteId = this.noteId;
|
||||
|
||||
this.notePath = resolvedNotePath;
|
||||
this.viewScope = opts.viewScope;
|
||||
this.viewScope = viewScope;
|
||||
({ noteId: this.noteId, parentNoteId: this.parentNoteId } = treeService.getNoteIdAndParentIdFromUrl(resolvedNotePath));
|
||||
|
||||
// Clear context data only when actually switching to a different note.
|
||||
|
||||
@@ -27,7 +27,10 @@ vi.mock("./text_editor_context_menu", () => ({
|
||||
getTextEditorContaining: mocks.getTextEditorContaining
|
||||
}));
|
||||
|
||||
vi.mock("../services/content_renderer", () => ({ getEmbedBoxSize: mocks.getEmbedBoxSize }));
|
||||
vi.mock("../services/content_renderer", () => ({
|
||||
EXCERPT_BOX_SIZE: "full",
|
||||
getEmbedBoxSize: mocks.getEmbedBoxSize
|
||||
}));
|
||||
|
||||
vi.mock("./context_menu", () => ({ default: { show: mocks.show } }));
|
||||
|
||||
@@ -379,6 +382,38 @@ describe("openContextMenu", () => {
|
||||
expect(mocks.show.mock.calls[1][0].items).toHaveLength(4);
|
||||
});
|
||||
|
||||
it("offers converting a link to blocks of a note to an excerpt of full size", async () => {
|
||||
const execute = vi.fn();
|
||||
mocks.getNote.mockResolvedValue({ noteId: "n1" });
|
||||
mocks.getEmbedBoxSize.mockReturnValue("medium");
|
||||
mocks.getTextEditorContaining.mockResolvedValue({
|
||||
commands: { get: () => ({ isEnabled: true }) },
|
||||
plugins: { get: () => ({ canConvertLinkToEmbed: () => true }) },
|
||||
execute
|
||||
});
|
||||
const editable = document.createElement("div");
|
||||
editable.className = "ck-editor__editable";
|
||||
editable.setAttribute("contenteditable", "true");
|
||||
editable.innerHTML = `<p><a class="reference-link" href="#root/n1?block=b1">Note</a></p>`;
|
||||
const link = editable.querySelector("a");
|
||||
expect(link).not.toBeNull();
|
||||
|
||||
await linkContextMenu.openContextMenu(
|
||||
"root/n1", contextMenuEvent(link ?? undefined), { block: "b1" }
|
||||
);
|
||||
|
||||
const item = mocks.show.mock.calls[0][0].items.at(-1);
|
||||
expect(item).toMatchObject({
|
||||
title: "link_context_menu.convert_link_to_note_excerpt",
|
||||
uiIcon: "bx bx-window-alt"
|
||||
});
|
||||
item.handler();
|
||||
expect(execute).toHaveBeenCalledWith("convertLinkToEmbed", {
|
||||
domElement: link,
|
||||
boxSize: "full"
|
||||
});
|
||||
});
|
||||
|
||||
describe("opened on an embed in a note being edited", () => {
|
||||
const CHECK = "bx bx-check";
|
||||
const execute = vi.fn();
|
||||
|
||||
@@ -43,7 +43,7 @@ async function openContextMenu(
|
||||
const embed = editor && getMenuEmbed(e, editor);
|
||||
const ownItems = viewScope.viewMode === "attachments" && viewScope.attachmentId
|
||||
? await getAttachmentItems(noteId, viewScope.attachmentId, e, editor, embed)
|
||||
: await getNoteItems(noteId, e, editor, embed);
|
||||
: await getNoteItems(noteId, e, editor, embed, !!viewScope.block);
|
||||
// A later right-click opened its own menu while this one waited for the editor or the
|
||||
// attachment.
|
||||
if (request !== lastMenuRequest) {
|
||||
@@ -195,18 +195,23 @@ async function getAttachmentItems(
|
||||
|
||||
/**
|
||||
* The commands of an embedded note that the menu is opened on, in a group of their own, and
|
||||
* converting it in another. A menu opened on a link to the note offers converting the link.
|
||||
* converting it in another. A menu opened on a link to the note offers converting the link, to an
|
||||
* excerpt for a link to blocks of the note.
|
||||
*/
|
||||
async function getNoteItems(
|
||||
noteId: string,
|
||||
e: LinkMenuOrigin,
|
||||
editor: CKTextEditor | null,
|
||||
embed: MenuEmbed | null
|
||||
embed: MenuEmbed | null,
|
||||
isBlockReference: boolean
|
||||
): Promise<MenuItem<CommandNames>[]> {
|
||||
if (!embed) {
|
||||
const embedItem = await getConvertToEmbedItem(
|
||||
e, editor, t("link_context_menu.convert_link_to_included_note"),
|
||||
() => froca.getNote(noteId)
|
||||
e, editor, isBlockReference
|
||||
? t("link_context_menu.convert_link_to_note_excerpt")
|
||||
: t("link_context_menu.convert_link_to_included_note"),
|
||||
() => froca.getNote(noteId),
|
||||
isBlockReference
|
||||
);
|
||||
return embedItem ? [ { kind: "separator" }, embedItem ] : [];
|
||||
}
|
||||
@@ -294,13 +299,15 @@ function runEmbedCommand(
|
||||
|
||||
/**
|
||||
* The item titled `title` that converts a link to a note or an attachment into an embed, in a
|
||||
* text note open for editing, for a link that the editor can convert.
|
||||
* text note open for editing, for a link that the editor can convert. `isExcerpt` is set for a
|
||||
* link to blocks of a note.
|
||||
*/
|
||||
async function getConvertToEmbedItem(
|
||||
e: LinkMenuOrigin,
|
||||
editor: CKTextEditor | null,
|
||||
title: string,
|
||||
getLinkedEntity: () => Promise<FNote | FAttachment | null>
|
||||
getLinkedEntity: () => Promise<FNote | FAttachment | null>,
|
||||
isExcerpt = false
|
||||
): Promise<MenuItem<CommandNames> | null> {
|
||||
const link = getTarget(e)?.closest<HTMLElement>("a.reference-link");
|
||||
if (!link || !editor?.commands.get("convertLinkToEmbed")?.isEnabled
|
||||
@@ -309,7 +316,7 @@ async function getConvertToEmbedItem(
|
||||
}
|
||||
|
||||
// Imported on demand: `content_renderer` imports `link`, which imports this module.
|
||||
const [ entity, { getEmbedBoxSize } ] = await Promise.all([
|
||||
const [ entity, { EXCERPT_BOX_SIZE, getEmbedBoxSize } ] = await Promise.all([
|
||||
getLinkedEntity(),
|
||||
import("../services/content_renderer.js")
|
||||
]);
|
||||
@@ -322,7 +329,7 @@ async function getConvertToEmbedItem(
|
||||
uiIcon: "bx bx-window-alt",
|
||||
handler: () => editor.execute("convertLinkToEmbed", {
|
||||
domElement: link,
|
||||
boxSize: getEmbedBoxSize(entity)
|
||||
boxSize: isExcerpt ? EXCERPT_BOX_SIZE : getEmbedBoxSize(entity)
|
||||
})
|
||||
};
|
||||
}
|
||||
@@ -359,7 +366,7 @@ async function isInReadOnlyNote(element: Element | null) {
|
||||
|
||||
/** The text editor containing `element`, or `null` when there is none or it is read-only. */
|
||||
async function getEditingTextEditor(element: Element | null) {
|
||||
// Checked first: a note shown read-only has no editor, and asking for one waits for a timeout.
|
||||
// An editor in read-only mode renders its editable with `contenteditable="false"`.
|
||||
if (!element?.closest(".ck-editor__editable[contenteditable='true']")) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -2,24 +2,18 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
// All mutable mock state lives in a hoisted holder so the (hoisted) vi.mock
|
||||
// factory below can reference it.
|
||||
const h = vi.hoisted(() => {
|
||||
const tabManager = {
|
||||
activeNote: null as { type: string } | null,
|
||||
activeContext: null as { getTextEditor: () => Promise<unknown> } | null,
|
||||
getActiveContext: () => tabManager.activeContext
|
||||
&& { note: tabManager.activeNote, ...tabManager.activeContext },
|
||||
getNoteContexts: () => []
|
||||
};
|
||||
return { tabManager, triggerCommand: vi.fn() };
|
||||
});
|
||||
const h = vi.hoisted(() => ({ triggerCommand: vi.fn() }));
|
||||
|
||||
vi.mock("../components/app_context.js", () => ({
|
||||
default: { tabManager: h.tabManager, triggerCommand: h.triggerCommand }
|
||||
default: { triggerCommand: h.triggerCommand }
|
||||
}));
|
||||
|
||||
// The module under test pulls in several DOM/jQuery-heavy collaborators at import
|
||||
// time; stub them so importing stays cheap and side-effect free.
|
||||
vi.mock("../components/zoom.js", () => ({ default: {} }));
|
||||
vi.mock("../services/block_reference.js", () => ({
|
||||
buildBlockReferenceMenuItems: vi.fn(async () => null)
|
||||
}));
|
||||
vi.mock("../services/clipboard_ext.js", () => ({ copyHtml: vi.fn(), copyTextWithToast: vi.fn() }));
|
||||
vi.mock("../services/i18n.js", () => ({ t: (key: string) => key }));
|
||||
vi.mock("../services/options.js", () => ({ default: { get: () => "" } }));
|
||||
@@ -33,8 +27,10 @@ vi.mock("./table_context_menu.js", () => ({
|
||||
hasTableCellSelection: vi.fn(async () => false)
|
||||
}));
|
||||
|
||||
import { buildBlockReferenceMenuItems } from "../services/block_reference.js";
|
||||
import { copyHtml, copyTextWithToast } from "../services/clipboard_ext.js";
|
||||
import server from "../services/server.js";
|
||||
import { setEditorNoteId } from "../widgets/react/NoteStore.js";
|
||||
import contextMenu, { type MenuCommandItem, type MenuItem } from "./context_menu.js";
|
||||
import {
|
||||
buildTableContextMenuSections,
|
||||
@@ -49,12 +45,13 @@ import {
|
||||
setupContextMenu
|
||||
} from "./note_context_menu.js";
|
||||
|
||||
const { tabManager } = h;
|
||||
|
||||
/** Builds an editor whose editable DOM root is `domRoot` and selection HTML is `selectedHtml`. */
|
||||
function fakeEditor(domRoot: Node | null, selectedHtml: string, plainText = "") {
|
||||
/**
|
||||
* Builds an editor whose editable DOM root is `domRoot` and selection HTML is `selectedHtml`. It
|
||||
* holds the content of a note unless `holdsNote` is `false`, as the attribute editor does not.
|
||||
*/
|
||||
function fakeEditor(domRoot: HTMLElement, selectedHtml: string, plainText = "", holdsNote = true) {
|
||||
const pasteTarget = { paste: vi.fn(), release: vi.fn() };
|
||||
return {
|
||||
const editor = {
|
||||
editing: { view: { getDomRoot: () => domRoot } },
|
||||
getSelectedHtml: vi.fn(() => selectedHtml),
|
||||
getSelectedPlainText: vi.fn(() => plainText),
|
||||
@@ -65,6 +62,12 @@ function fakeEditor(domRoot: Node | null, selectedHtml: string, plainText = "")
|
||||
isReadOnly: false,
|
||||
execute: vi.fn()
|
||||
};
|
||||
domRoot.classList.add("ck-editor__editable");
|
||||
Object.assign(domRoot, { ckeditorInstance: editor });
|
||||
if (holdsNote) {
|
||||
setEditorNoteId(editor, "note1");
|
||||
}
|
||||
return editor;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -147,8 +150,6 @@ function submenu(items: MenuItem<any>[], title: string): MenuItem<any>[] {
|
||||
describe("buildNoteContextMenuItems", () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
tabManager.activeNote = null;
|
||||
tabManager.activeContext = null;
|
||||
});
|
||||
|
||||
it("offers copy, copy-as-markdown and the search rows for a plain selection", async () => {
|
||||
@@ -310,6 +311,52 @@ describe("buildNoteContextMenuItems", () => {
|
||||
expect(buildTableContextMenuSections).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("puts the block reference rows in the copy and paste submenus", async () => {
|
||||
const cell = document.createElement("td");
|
||||
vi.mocked(buildTableContextMenuSections).mockResolvedValueOnce({
|
||||
main: [],
|
||||
sort: { title: "S" },
|
||||
delete: [],
|
||||
select: { title: "SEL" },
|
||||
pasteRows: [ { title: "PR1" } ]
|
||||
} as TableMenuSections);
|
||||
vi.mocked(buildBlockReferenceMenuItems).mockResolvedValueOnce({
|
||||
copy: { title: "BC" },
|
||||
paste: [ { title: "BP1" }, { title: "BP2" } ]
|
||||
});
|
||||
const host = browserLikeHost({
|
||||
paste: { enabled: true, run: vi.fn(), runAsPlainText: vi.fn(), read: vi.fn() }
|
||||
});
|
||||
|
||||
const items = await build({ isEditable: true, element: cell, selectionText: "" }, host);
|
||||
|
||||
expect(buildBlockReferenceMenuItems).toHaveBeenCalledWith(cell, host.paste);
|
||||
// Built once the table sections have moved the selection into the clicked cell.
|
||||
expect(vi.mocked(buildTableContextMenuSections).mock.invocationCallOrder[0])
|
||||
.toBeLessThan(vi.mocked(buildBlockReferenceMenuItems).mock.invocationCallOrder[0]);
|
||||
expect(titles(submenu(items, "electron_context_menu.copy"))).toEqual([
|
||||
"electron_context_menu.copy",
|
||||
"electron_context_menu.copy-as-markdown",
|
||||
"---",
|
||||
"BC"
|
||||
]);
|
||||
// Without a selection only the reference can be copied, so the row opens its submenu.
|
||||
expect(findItem(items, "electron_context_menu.copy"))
|
||||
.toMatchObject({ enabled: true, handler: undefined });
|
||||
expect(titles(submenu(items, "electron_context_menu.paste"))).toEqual([
|
||||
"electron_context_menu.paste",
|
||||
"electron_context_menu.paste-as-plain-text",
|
||||
"---",
|
||||
"BP1",
|
||||
"BP2",
|
||||
"---",
|
||||
"PR1"
|
||||
]);
|
||||
|
||||
await build({ element: cell });
|
||||
expect(buildBlockReferenceMenuItems).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("converts the selection through the to-markdown route", async () => {
|
||||
vi.mocked(server.post).mockResolvedValue({ markdownContent: "# Hi" });
|
||||
setSelection(document.createElement("span"), "<h1>Hi</h1>");
|
||||
@@ -382,8 +429,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
tabManager.activeNote = null;
|
||||
tabManager.activeContext = null;
|
||||
});
|
||||
|
||||
/** Right-clicks `element`, holding Shift or letting another widget claim the event first. */
|
||||
@@ -571,7 +616,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
const execCommand = stubExecCommand();
|
||||
|
||||
const content = codeEditable();
|
||||
tabManager.activeNote = { type: "code" }; // so no CKEditor answers for the selection
|
||||
setSelection(content, "<span>code</span>", "code");
|
||||
|
||||
const codeRows = await menuFor(content);
|
||||
@@ -585,8 +629,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
const anchor = document.createElement("span");
|
||||
editorRoot.appendChild(anchor);
|
||||
const editor = fakeEditor(editorRoot, "<p>clean</p>");
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(anchor, "<p>clean</p>", "clean");
|
||||
|
||||
await run(await menuFor(editorRoot), "electron_context_menu.cut");
|
||||
@@ -600,8 +642,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
const anchor = document.createElement("span");
|
||||
editorRoot.appendChild(anchor);
|
||||
const editor = fakeEditor(editorRoot, "<table><tr><td>a1</td></tr></table>", "a1");
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(anchor, "", "Selected 1 cell");
|
||||
|
||||
await run(await menuFor(editorRoot), "electron_context_menu.copy");
|
||||
@@ -628,8 +668,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
const anchor = document.createElement("span");
|
||||
editorRoot.appendChild(anchor);
|
||||
const editor = fakeEditor(editorRoot, "<p>clean</p>");
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(anchor, "<p>clean</p>", "clean");
|
||||
|
||||
const rows = await menuFor(editorRoot);
|
||||
@@ -667,8 +705,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
const anchor = document.createElement("span");
|
||||
editorRoot.appendChild(anchor);
|
||||
const editor = fakeEditor(editorRoot, "<p>clean</p>");
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(anchor, "<p>clean</p>", "clean");
|
||||
|
||||
await run(await menuFor(editorRoot), "electron_context_menu.paste");
|
||||
@@ -697,7 +733,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
|
||||
try {
|
||||
const content = codeEditable();
|
||||
tabManager.activeNote = { type: "code" };
|
||||
setSelection(content, "<span>code</span>", "code");
|
||||
|
||||
await run(await menuFor(content), "electron_context_menu.paste");
|
||||
@@ -715,7 +750,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
|
||||
try {
|
||||
const content = codeEditable();
|
||||
tabManager.activeNote = { type: "code" };
|
||||
setSelection(content, "<span>code</span>", "code");
|
||||
|
||||
const shown = titles(await menuFor(content));
|
||||
@@ -729,7 +763,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
|
||||
it("drops the cut row in a read-only code note", async () => {
|
||||
const content = codeEditable(true);
|
||||
tabManager.activeNote = { type: "code" };
|
||||
setSelection(content, "<span>code</span>", "code");
|
||||
|
||||
const rows = await menuFor(content);
|
||||
@@ -765,8 +798,6 @@ describe("setupContextMenu (browser)", () => {
|
||||
describe("getSelectedHtmlForMarkdown", () => {
|
||||
beforeEach(() => {
|
||||
vi.restoreAllMocks();
|
||||
tabManager.activeNote = null;
|
||||
tabManager.activeContext = null;
|
||||
});
|
||||
|
||||
it("uses the editor's data-pipeline HTML when the selection is inside the editor", async () => {
|
||||
@@ -775,8 +806,6 @@ describe("getSelectedHtmlForMarkdown", () => {
|
||||
editorRoot.appendChild(anchor);
|
||||
const editor = fakeEditor(editorRoot, "<p>clean</p>");
|
||||
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(anchor, "<b>dom clone</b>");
|
||||
|
||||
expect(await getSelectedHtmlForMarkdown()).toBe("<p>clean</p>");
|
||||
@@ -788,8 +817,6 @@ describe("getSelectedHtmlForMarkdown", () => {
|
||||
const outsideAnchor = document.createElement("span"); // not appended to editorRoot
|
||||
const editor = fakeEditor(editorRoot, "<p>clean</p>");
|
||||
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(outsideAnchor, "<b>dom clone</b>");
|
||||
|
||||
expect(await getSelectedHtmlForMarkdown()).toBe("<b>dom clone</b>");
|
||||
@@ -802,38 +829,22 @@ describe("getSelectedHtmlForMarkdown", () => {
|
||||
editorRoot.appendChild(anchor);
|
||||
const editor = fakeEditor(editorRoot, ""); // empty model selection
|
||||
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(anchor, "<b>dom clone</b>");
|
||||
|
||||
expect(await getSelectedHtmlForMarkdown()).toBe("<b>dom clone</b>");
|
||||
});
|
||||
|
||||
it("skips the editor path entirely for a non-text note", async () => {
|
||||
const editor = fakeEditor(document.createElement("div"), "<p>clean</p>");
|
||||
tabManager.activeNote = { type: "code" };
|
||||
tabManager.activeContext = { getTextEditor: async () => editor };
|
||||
setSelection(document.createElement("span"), "<b>dom clone</b>");
|
||||
it("skips an editor that holds no note, such as the attribute editor", async () => {
|
||||
const editorRoot = document.createElement("div");
|
||||
const anchor = editorRoot.appendChild(document.createElement("span"));
|
||||
const editor = fakeEditor(editorRoot, "<p>clean</p>", "", false);
|
||||
setSelection(anchor, "<b>dom clone</b>");
|
||||
|
||||
expect(await getSelectedHtmlForMarkdown()).toBe("<b>dom clone</b>");
|
||||
expect(editor.getSelectedHtml).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("falls back when resolving the text editor throws or times out", async () => {
|
||||
vi.spyOn(console, "error").mockImplementation(() => {}); // the catch logs the timeout
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = {
|
||||
getTextEditor: async () => {
|
||||
throw new Error("timed out");
|
||||
}
|
||||
};
|
||||
setSelection(document.createElement("span"), "<b>dom clone</b>");
|
||||
|
||||
expect(await getSelectedHtmlForMarkdown()).toBe("<b>dom clone</b>");
|
||||
});
|
||||
|
||||
it("returns an empty string when there is no selection at all", async () => {
|
||||
tabManager.activeNote = { type: "text" };
|
||||
setSelection(null);
|
||||
|
||||
expect(await getSelectedHtmlForMarkdown()).toBe("");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { CKTextEditor } from "@triliumnext/ckeditor5";
|
||||
|
||||
import appContext, { type CommandNames } from "../components/app_context.js";
|
||||
import { buildBlockReferenceMenuItems } from "../services/block_reference.js";
|
||||
import { copyHtml, copyTextWithToast } from "../services/clipboard_ext.js";
|
||||
import { t } from "../services/i18n.js";
|
||||
import options from "../services/options.js";
|
||||
@@ -135,6 +136,9 @@ export async function buildNoteContextMenuItems(
|
||||
// A cell selection supersedes `selectionText`: over one, Electron reports the hidden
|
||||
// fake-selection label as the selected text, which no row should act on.
|
||||
const hasCellSelection = tableSections !== null && await hasTableCellSelection(target.element);
|
||||
const blockReferenceItems = target.isEditable
|
||||
? await buildBlockReferenceMenuItems(target.element, host.paste)
|
||||
: null;
|
||||
const hasText = !hasCellSelection && target.selectionText.trim().length > 0;
|
||||
const hasClipboardContent = hasText || hasCellSelection;
|
||||
|
||||
@@ -186,6 +190,9 @@ export async function buildNoteContextMenuItems(
|
||||
handler: copySelectionAsMarkdown
|
||||
}
|
||||
];
|
||||
if (blockReferenceItems?.copy) {
|
||||
copyVariants.push({ kind: "separator" }, blockReferenceItems.copy);
|
||||
}
|
||||
|
||||
items.push(splitMenuItem({
|
||||
enabled: host.canCopy && hasClipboardContent,
|
||||
@@ -220,6 +227,9 @@ export async function buildNoteContextMenuItems(
|
||||
handler: runAsPlainText
|
||||
}
|
||||
];
|
||||
if (blockReferenceItems?.paste.length) {
|
||||
pasteVariants.push({ kind: "separator" }, ...blockReferenceItems.paste);
|
||||
}
|
||||
if (tableSections?.pasteRows.length) {
|
||||
pasteVariants.push({ kind: "separator" }, ...tableSections.pasteRows);
|
||||
}
|
||||
|
||||
@@ -1,31 +1,12 @@
|
||||
import type { AiQuickAction, AiQuickActionFooter, AiQuickActionGroup } from "@triliumnext/ckeditor5";
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
const h = vi.hoisted(() => {
|
||||
interface FakeContext {
|
||||
ntxId?: string;
|
||||
note?: { type: string } | null;
|
||||
getTextEditor: () => Promise<unknown>;
|
||||
}
|
||||
const tabManager = {
|
||||
activeNote: null as { type: string } | null,
|
||||
activeContext: null as FakeContext | null,
|
||||
contexts: [] as FakeContext[],
|
||||
getActiveContext: () => tabManager.activeContext
|
||||
&& { note: tabManager.activeNote, ...tabManager.activeContext },
|
||||
getNoteContexts: () => tabManager.contexts
|
||||
};
|
||||
return { tabManager };
|
||||
});
|
||||
|
||||
vi.mock("../components/app_context.js", () => ({ default: { tabManager: h.tabManager } }));
|
||||
vi.mock("../services/i18n.js", () => ({ t: (key: string) => key }));
|
||||
|
||||
import { setEditorNoteId } from "../widgets/react/NoteStore.js";
|
||||
import type { MenuCommandItem, MenuItem } from "./context_menu.js";
|
||||
import { buildAiActionsMenuItem, getTextEditorAtSelection } from "./text_editor_context_menu.js";
|
||||
|
||||
const { tabManager } = h;
|
||||
|
||||
const GROUPS: AiQuickActionGroup[] = [
|
||||
{
|
||||
id: "edit",
|
||||
@@ -63,7 +44,7 @@ function fakeEditor({
|
||||
isEnabled = true,
|
||||
hasPlugin = true
|
||||
}: {
|
||||
domRoot: Node | null;
|
||||
domRoot: HTMLElement;
|
||||
groups?: AiQuickActionGroup[];
|
||||
menuFooter?: AiQuickActionFooter[];
|
||||
hasContext?: boolean;
|
||||
@@ -79,11 +60,28 @@ function fakeEditor({
|
||||
commands: { get: () => ({ isEnabled }) },
|
||||
execute: vi.fn()
|
||||
};
|
||||
tabManager.activeNote = { type: "text" };
|
||||
tabManager.activeContext = { getTextEditor: () => Promise.resolve(editor) };
|
||||
makeNoteEditorRoot(domRoot, editor, "note1");
|
||||
return { editor, ui };
|
||||
}
|
||||
|
||||
/**
|
||||
* An editable root of `editor`, as CKEditor renders it, in a text editor that holds the content
|
||||
* of `noteId`.
|
||||
*/
|
||||
function noteEditorRoot(editor: object, noteId?: string) {
|
||||
return makeNoteEditorRoot(document.createElement("div"), editor, noteId);
|
||||
}
|
||||
|
||||
/** Turns `element` into an editable root of `editor`, which holds the content of `noteId`. */
|
||||
function makeNoteEditorRoot(element: HTMLElement, editor: object, noteId?: string) {
|
||||
element.classList.add("ck-editor__editable");
|
||||
Object.assign(element, { ckeditorInstance: editor });
|
||||
if (noteId) {
|
||||
setEditorNoteId(editor, noteId);
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
/** Points `window.getSelection()` at `anchorNode`. */
|
||||
function setSelection(anchorNode: Node | null) {
|
||||
vi.spyOn(window, "getSelection").mockReturnValue({ anchorNode } as unknown as Selection);
|
||||
@@ -100,34 +98,31 @@ function commandItems(items: MenuItem<string>[]) {
|
||||
describe("getTextEditorAtSelection", () => {
|
||||
beforeEach(() => {
|
||||
vi.restoreAllMocks();
|
||||
tabManager.activeNote = null;
|
||||
tabManager.activeContext = null;
|
||||
tabManager.contexts = [];
|
||||
});
|
||||
|
||||
it("returns the editor only when the selection is inside its DOM root", async () => {
|
||||
const root = document.createElement("div");
|
||||
const inside = document.createTextNode("hello");
|
||||
root.appendChild(inside);
|
||||
it("finds the editor of the note holding the selection, wherever it is", async () => {
|
||||
for (const holder of [ "note-split", "modal popup-editor-dialog" ]) {
|
||||
const container = document.createElement("div");
|
||||
container.className = holder;
|
||||
const editor = {};
|
||||
const root = container.appendChild(noteEditorRoot(editor, "note1"));
|
||||
const inside = root.appendChild(document.createTextNode("hello"));
|
||||
|
||||
const { editor } = fakeEditor({ domRoot: root });
|
||||
setSelection(inside);
|
||||
expect(await getTextEditorAtSelection()).toBe(editor);
|
||||
setSelection(inside);
|
||||
expect(await getTextEditorAtSelection(), holder).toBe(editor);
|
||||
}
|
||||
|
||||
// Same editor, but the click landed in a dialog rather than in the note.
|
||||
setSelection(document.createTextNode("elsewhere"));
|
||||
expect(await getTextEditorAtSelection()).toBeNull();
|
||||
setSelection(null);
|
||||
expect(await getTextEditorAtSelection()).toBeNull();
|
||||
});
|
||||
|
||||
it("returns the editor of an included note that is edited inside the note", async () => {
|
||||
const root = document.createElement("div");
|
||||
root.className = "ck-editor__editable";
|
||||
const { editor } = fakeEditor({ domRoot: root });
|
||||
const nestedEditor = { editing: { view: {} } };
|
||||
const nestedRoot = Object.assign(document.createElement("div"), {
|
||||
className: "ck-editor__editable",
|
||||
ckeditorInstance: nestedEditor
|
||||
});
|
||||
const editor = {};
|
||||
const root = noteEditorRoot(editor, "note1");
|
||||
const nestedEditor = {};
|
||||
const nestedRoot = noteEditorRoot(nestedEditor, "note2");
|
||||
const caption = document.createElement("div");
|
||||
caption.className = "ck-editor__editable ck-editor__nested-editable";
|
||||
root.append(nestedRoot, caption);
|
||||
@@ -143,43 +138,10 @@ describe("getTextEditorAtSelection", () => {
|
||||
expect(await getTextEditorAtSelection()).toBe(editor);
|
||||
});
|
||||
|
||||
it("returns null for a non-text note, and swallows a failing editor lookup", async () => {
|
||||
setSelection(document.createTextNode("hello"));
|
||||
it("leaves out an editor that holds no note, such as the attribute editor", async () => {
|
||||
const root = noteEditorRoot({});
|
||||
setSelection(root.appendChild(document.createTextNode("#label")));
|
||||
|
||||
tabManager.activeNote = { type: "code" };
|
||||
tabManager.activeContext = { getTextEditor: () => Promise.reject(new Error("timed out")) };
|
||||
expect(await getTextEditorAtSelection()).toBeNull();
|
||||
|
||||
tabManager.activeNote = { type: "text" };
|
||||
vi.spyOn(console, "error").mockImplementation(() => {});
|
||||
expect(await getTextEditorAtSelection()).toBeNull();
|
||||
});
|
||||
|
||||
it("looks the editor up in the split pane holding the node, active or not", async () => {
|
||||
const pane = document.createElement("div");
|
||||
pane.dataset.ntxId = "ntx-right";
|
||||
const root = document.createElement("div");
|
||||
const inside = document.createTextNode("cell");
|
||||
root.appendChild(inside);
|
||||
pane.appendChild(root);
|
||||
|
||||
const editor = { editing: { view: { getDomRoot: () => root } } };
|
||||
tabManager.activeNote = { type: "code" };
|
||||
tabManager.activeContext = { ntxId: "ntx-left", getTextEditor: () => Promise.reject() };
|
||||
tabManager.contexts = [
|
||||
{ ntxId: "ntx-left", note: { type: "code" }, getTextEditor: () => Promise.reject() },
|
||||
{ ntxId: "ntx-right", note: { type: "text" }, getTextEditor: async () => editor }
|
||||
];
|
||||
|
||||
setSelection(inside);
|
||||
expect(await getTextEditorAtSelection()).toBe(editor);
|
||||
|
||||
// A pane whose note context is gone, or holds another note type.
|
||||
tabManager.contexts = [];
|
||||
expect(await getTextEditorAtSelection()).toBeNull();
|
||||
tabManager.contexts = [
|
||||
{ ntxId: "ntx-right", note: { type: "code" }, getTextEditor: async () => editor }
|
||||
];
|
||||
expect(await getTextEditorAtSelection()).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import type { AiQuickAction, AiQuickActionFooter, AiQuickActionGroup, CKTextEditor } from "@triliumnext/ckeditor5";
|
||||
|
||||
import type { CommandNames } from "../components/app_context.js";
|
||||
import appContext from "../components/app_context.js";
|
||||
import type NoteContext from "../components/note_context.js";
|
||||
import { t } from "../services/i18n.js";
|
||||
import { getEditorNoteId } from "../widgets/react/NoteStore.js";
|
||||
import type { MenuItem } from "./context_menu.js";
|
||||
|
||||
/**
|
||||
@@ -144,58 +143,23 @@ export async function getTextEditorAtSelection(): Promise<CKTextEditor | null> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the text editor whose editable contains `node`, or `null` when no text editor does.
|
||||
* Takes the right-click target instead of the DOM selection, because a right-click does not move
|
||||
* the selection in every browser.
|
||||
* Returns the text editor of a note whose editable contains `node`, or `null` when no such editor
|
||||
* does. Takes the right-click target instead of the DOM selection, because a right-click does not
|
||||
* move the selection in every browser.
|
||||
*
|
||||
* Looks up the editor in the split pane that contains `node`, because a right-click does not
|
||||
* activate that pane. Inside an included note edited in place, the editor of that note answers.
|
||||
* Reads the editor off the innermost editable root around `node`, so it finds the editor of a split
|
||||
* pane the right-click did not activate, of a dialog such as the quick edit, and of an included
|
||||
* note edited in place. An editor that holds no note, such as the attribute editor, does not count.
|
||||
*/
|
||||
export async function getTextEditorContaining(
|
||||
node: Node | null | undefined
|
||||
): Promise<CKTextEditor | null> {
|
||||
const noteContext = node ? getNoteContextContaining(node) : null;
|
||||
if (!node || noteContext?.note?.type !== "text") {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const editor = await noteContext.getTextEditor();
|
||||
const domRoot = editor?.editing.view.getDomRoot();
|
||||
|
||||
if (editor && domRoot && domRoot.contains(node)) {
|
||||
return getNestedEditor(node, domRoot) ?? editor;
|
||||
}
|
||||
} catch (error) {
|
||||
// Editor not ready or the request timed out.
|
||||
console.error("Failed to read the text editor at the selection:", error);
|
||||
}
|
||||
|
||||
return null;
|
||||
const element = node instanceof Element ? node : node?.parentElement;
|
||||
const editor = element?.closest<EditorRootElement>(EDITOR_ROOT_SELECTOR)?.ckeditorInstance;
|
||||
return editor && getEditorNoteId(editor) ? editor : null;
|
||||
}
|
||||
|
||||
/** The editor of an included note edited inside the editable `domRoot`, which contains `node`. */
|
||||
function getNestedEditor(node: Node, domRoot: HTMLElement) {
|
||||
const element = node instanceof Element ? node : node.parentElement;
|
||||
const editable = element?.closest<HTMLElement & { ckeditorInstance?: CKTextEditor }>(
|
||||
".ck-editor__editable:not(.ck-editor__nested-editable)"
|
||||
);
|
||||
return editable && editable !== domRoot && domRoot.contains(editable)
|
||||
? editable.ckeditorInstance ?? null
|
||||
: null;
|
||||
}
|
||||
/** The editable root of a text editor, which CKEditor gives a reference to the editor. */
|
||||
type EditorRootElement = HTMLElement & { ckeditorInstance?: CKTextEditor | null };
|
||||
|
||||
/**
|
||||
* Returns the note context whose `ntxId` matches the `data-ntx-id` of the split pane that contains
|
||||
* `node`, or the active note context when `node` is outside every pane, e.g. in a dialog.
|
||||
*/
|
||||
function getNoteContextContaining(node: Node): NoteContext | null {
|
||||
const { tabManager } = appContext;
|
||||
const element = node instanceof Element ? node : node.parentElement;
|
||||
const ntxId = element?.closest<HTMLElement>("[data-ntx-id]")?.dataset.ntxId;
|
||||
if (!ntxId) {
|
||||
return tabManager.getActiveContext();
|
||||
}
|
||||
|
||||
return tabManager.getNoteContexts().find((noteContext) => noteContext.ntxId === ntxId) ?? null;
|
||||
}
|
||||
const EDITOR_ROOT_SELECTOR = ".ck-editor__editable:not(.ck-editor__nested-editable)";
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { buildNote } from "../test/easy-froca";
|
||||
import {
|
||||
getBlockExcerpt, getCachedBlockReferenceLabel, loadBlockReferenceLabel
|
||||
} from "./block_excerpts.js";
|
||||
|
||||
vi.mock("./i18n.js", () => ({ t: (key: string) => key }));
|
||||
|
||||
const CONTENT = "<p data-trilium-block-id=\"a\">First block\n text</p>"
|
||||
+ "<ul><li><p data-trilium-block-id=\"b\">Second</p></li></ul>"
|
||||
+ "<figure class=\"image\" data-trilium-block-id=\"img\"><img src=\"x.png\"></figure>";
|
||||
const FIRST_LABEL = { text: "First block text", isBroken: false };
|
||||
|
||||
describe("loadBlockReferenceLabel", () => {
|
||||
it("labels blocks by their text, and a missing block as broken", async () => {
|
||||
const note = buildNote({ title: "Source", content: CONTENT });
|
||||
|
||||
expect(await loadBlockReferenceLabel(note, "a")).toEqual(FIRST_LABEL);
|
||||
expect(await loadBlockReferenceLabel(note, "a:b")).toEqual({
|
||||
text: "First block text … Second",
|
||||
isBroken: false
|
||||
});
|
||||
expect(await loadBlockReferenceLabel(note, "img")).toEqual({
|
||||
text: "block_reference.untitled",
|
||||
isBroken: false
|
||||
});
|
||||
expect(await loadBlockReferenceLabel(note, "a:gone")).toEqual({
|
||||
text: "block_reference.broken",
|
||||
isBroken: true
|
||||
});
|
||||
});
|
||||
|
||||
it("reads the content of a note once for each version of it", async () => {
|
||||
const note = buildNote({ title: "Source", content: CONTENT });
|
||||
const getBlob = vi.spyOn(note, "getBlob");
|
||||
|
||||
expect(getCachedBlockReferenceLabel(note, "a")).toBeNull();
|
||||
await Promise.all([
|
||||
loadBlockReferenceLabel(note, "a"),
|
||||
loadBlockReferenceLabel(note, "b")
|
||||
]);
|
||||
expect(getCachedBlockReferenceLabel(note, "a")).toEqual(FIRST_LABEL);
|
||||
expect(getBlob).toHaveBeenCalledTimes(1);
|
||||
|
||||
note.blobId = "changed";
|
||||
expect(getCachedBlockReferenceLabel(note, "a")).toBeNull();
|
||||
await loadBlockReferenceLabel(note, "a");
|
||||
expect(getBlob).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
|
||||
it("reads nothing of a note that is not text or whose content is protected", async () => {
|
||||
const code = buildNote({ title: "Code", type: "code", content: CONTENT });
|
||||
const locked = buildNote({ title: "Locked", content: CONTENT });
|
||||
vi.spyOn(locked, "isContentAvailable").mockReturnValue(false);
|
||||
|
||||
expect(await loadBlockReferenceLabel(code, "a")).toBeNull();
|
||||
expect(await loadBlockReferenceLabel(locked, "a")).toBeNull();
|
||||
});
|
||||
|
||||
it("tries again after the content failed to load", async () => {
|
||||
const note = buildNote({ title: "Source", content: CONTENT });
|
||||
const getBlob = vi.spyOn(note, "getBlob").mockRejectedValueOnce(new Error("offline"));
|
||||
|
||||
expect(await loadBlockReferenceLabel(note, "a")).toBeNull();
|
||||
expect(await loadBlockReferenceLabel(note, "a")).toEqual(FIRST_LABEL);
|
||||
expect(getBlob).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
|
||||
it("keeps the content of the 20 notes read last", async () => {
|
||||
const notes = Array.from({ length: 21 }, () =>
|
||||
buildNote({ title: "Source", content: CONTENT }));
|
||||
for (const note of notes) {
|
||||
await loadBlockReferenceLabel(note, "a");
|
||||
}
|
||||
|
||||
expect(getCachedBlockReferenceLabel(notes[0], "a")).toBeNull();
|
||||
expect(getCachedBlockReferenceLabel(notes[20], "a")).not.toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("getBlockExcerpt", () => {
|
||||
it("shortens a long text, sharing the length between the two ends of a range", () => {
|
||||
const long = document.createElement("p");
|
||||
long.textContent = "word ".repeat(30);
|
||||
const short = document.createElement("p");
|
||||
short.textContent = "end";
|
||||
|
||||
const single = getBlockExcerpt(long, long);
|
||||
const range = getBlockExcerpt(long, short);
|
||||
|
||||
expect(single).toHaveLength(60);
|
||||
expect(single.endsWith("word…")).toBe(true);
|
||||
expect(range).toBe(`${"word ".repeat(6).trimEnd()}… … end`);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,106 @@
|
||||
import "./block_reference.css";
|
||||
|
||||
import { resolveBlockReference } from "@triliumnext/commons";
|
||||
|
||||
import type FNote from "../entities/fnote.js";
|
||||
import { t } from "./i18n.js";
|
||||
|
||||
const MAX_CACHED_NOTES = 20;
|
||||
const EXCERPT_LENGTH = 60;
|
||||
|
||||
/** What a reference link shows for the blocks it points at. */
|
||||
export interface BlockReferenceLabel {
|
||||
text: string;
|
||||
isBroken: boolean;
|
||||
}
|
||||
|
||||
interface CachedContent {
|
||||
blobId: string;
|
||||
content: Document | null;
|
||||
loaded: Promise<Document | null>;
|
||||
}
|
||||
|
||||
const cache = new Map<string, CachedContent>();
|
||||
|
||||
/**
|
||||
* The label of a reference to `block`, a `block` link parameter, of `note`. `null` when the
|
||||
* content of the note cannot be read.
|
||||
*/
|
||||
export async function loadBlockReferenceLabel(note: FNote, block: string) {
|
||||
const content = await loadContent(note);
|
||||
return content ? getLabel(content, block) : null;
|
||||
}
|
||||
|
||||
/** The label of {@link loadBlockReferenceLabel}, if the content of `note` is loaded already. */
|
||||
export function getCachedBlockReferenceLabel(note: FNote, block: string) {
|
||||
const cached = cache.get(note.noteId);
|
||||
if (cached?.blobId !== note.blobId || !cached.content) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return getLabel(cached.content, block);
|
||||
}
|
||||
|
||||
/** A short text of the blocks from `start` to `end`. */
|
||||
export function getBlockExcerpt(start: Element, end: Element) {
|
||||
const blocks = start === end ? [ start ] : [ start, end ];
|
||||
const maxLength = EXCERPT_LENGTH / blocks.length;
|
||||
const texts = blocks
|
||||
.map((block) => truncate(getText(block), maxLength))
|
||||
.filter((text) => text);
|
||||
|
||||
return texts.join(" … ") || t("block_reference.untitled");
|
||||
}
|
||||
|
||||
function getLabel(content: Document, block: string): BlockReferenceLabel {
|
||||
const { start, end } = resolveBlockReference<Element>(content.body, block);
|
||||
if (!start || !end) {
|
||||
return { text: t("block_reference.broken"), isBroken: true };
|
||||
}
|
||||
|
||||
return { text: getBlockExcerpt(start, end), isBroken: false };
|
||||
}
|
||||
|
||||
function loadContent(note: FNote) {
|
||||
if (note.type !== "text" || !note.isContentAvailable()) {
|
||||
return Promise.resolve(null);
|
||||
}
|
||||
|
||||
const cached = cache.get(note.noteId);
|
||||
if (cached?.blobId === note.blobId) {
|
||||
return cached.loaded;
|
||||
}
|
||||
|
||||
const entry: CachedContent = {
|
||||
blobId: note.blobId,
|
||||
content: null,
|
||||
loaded: Promise.resolve(null)
|
||||
};
|
||||
entry.loaded = note.getBlob()
|
||||
.then((blob) => {
|
||||
entry.content = new DOMParser().parseFromString(blob?.content ?? "", "text/html");
|
||||
return entry.content;
|
||||
})
|
||||
.catch(() => {
|
||||
if (cache.get(note.noteId) === entry) {
|
||||
cache.delete(note.noteId);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
cache.delete(note.noteId);
|
||||
cache.set(note.noteId, entry);
|
||||
if (cache.size > MAX_CACHED_NOTES) {
|
||||
cache.delete(cache.keys().next().value as string);
|
||||
}
|
||||
|
||||
return entry.loaded;
|
||||
}
|
||||
|
||||
function getText(element: Element) {
|
||||
return (element.textContent ?? "").replace(/\s+/g, " ").trim();
|
||||
}
|
||||
|
||||
function truncate(text: string, maxLength: number) {
|
||||
return text.length > maxLength ? `${text.slice(0, maxLength - 1).trimEnd()}…` : text;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
:where(:root) {
|
||||
--block-reference-flash-color: rgb(255 200 0 / 40%);
|
||||
--block-reference-broken-color: var(--muted-text-color);
|
||||
}
|
||||
|
||||
.block-reference-flash {
|
||||
/* The duration matches FLASH_DURATION_MS in block_reference.ts. */
|
||||
animation: block-reference-flash 1.5s ease-out;
|
||||
}
|
||||
|
||||
@keyframes block-reference-flash {
|
||||
from,
|
||||
30% {
|
||||
box-shadow:
|
||||
0 0 0 4px var(--block-reference-flash-color),
|
||||
inset 0 0 0 100vmax var(--block-reference-flash-color);
|
||||
}
|
||||
|
||||
to {
|
||||
box-shadow: 0 0 0 4px transparent, inset 0 0 0 100vmax transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.block-reference-highlight {
|
||||
box-shadow:
|
||||
0 0 0 4px var(--block-reference-flash-color),
|
||||
inset 0 0 0 100vmax var(--block-reference-flash-color);
|
||||
}
|
||||
|
||||
.block-reference-broken {
|
||||
color: var(--block-reference-broken-color);
|
||||
font-style: italic;
|
||||
}
|
||||
@@ -0,0 +1,428 @@
|
||||
import type { CKTextEditor } from "@triliumnext/ckeditor5";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import type { CommandNames } from "../components/app_context.js";
|
||||
import type { MenuCommandItem, MenuItem } from "../menus/context_menu.js";
|
||||
import {
|
||||
buildBlockReferenceMenuItems, consumeBlockReference, copyBlockReference,
|
||||
getBlockRangeElements, getClipboardBlockReference, highlightBlockReference,
|
||||
openBlockHandleMenu, revealHighlightedBlocks
|
||||
} from "./block_reference.js";
|
||||
import type { ViewScope } from "./link.js";
|
||||
|
||||
const {
|
||||
showError, showMessage, showMenu, copyHtmlWithToast, getTextEditorContaining, getNote
|
||||
} = vi.hoisted(() => ({
|
||||
showError: vi.fn(),
|
||||
showMessage: vi.fn(),
|
||||
showMenu: vi.fn(),
|
||||
copyHtmlWithToast: vi.fn(),
|
||||
getTextEditorContaining: vi.fn(),
|
||||
getNote: vi.fn()
|
||||
}));
|
||||
vi.mock("./i18n.js", () => ({
|
||||
t: (key: string, options?: { count?: number }) => options ? `${key}:${options.count}` : key
|
||||
}));
|
||||
vi.mock("./toast.js", () => ({ default: { showError, showMessage } }));
|
||||
vi.mock("../menus/context_menu.js", () => ({ default: { show: showMenu } }));
|
||||
vi.mock("../menus/text_editor_context_menu.js", () => ({ getTextEditorContaining }));
|
||||
vi.mock("./clipboard_ext.js", () => ({ copyHtmlWithToast }));
|
||||
vi.mock("./froca.js", () => ({ default: { getNote } }));
|
||||
vi.mock("./content_renderer.js", () => ({
|
||||
EXCERPT_BOX_SIZE: "full",
|
||||
getEmbedBoxSize: () => "medium"
|
||||
}));
|
||||
|
||||
const scrollIntoView = vi.fn();
|
||||
const getComponentByEl = vi.fn();
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
vi.useFakeTimers();
|
||||
Element.prototype.scrollIntoView = scrollIntoView;
|
||||
glob.getComponentByEl = getComponentByEl;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
describe("consumeBlockReference", () => {
|
||||
it("reveals a block, flashes it for a moment and consumes the reference", () => {
|
||||
const container = buildContainer(
|
||||
"<details><summary>s</summary><p data-trilium-block-id=\"a\">A</p></details>"
|
||||
);
|
||||
const block = container.querySelector("p");
|
||||
const viewScope: ViewScope = { block: "a" };
|
||||
|
||||
consumeBlockReference(container, viewScope);
|
||||
|
||||
expect(container.querySelector("details")?.open).toBe(true);
|
||||
expect(scrollIntoView).toHaveBeenCalledWith({ behavior: "smooth", block: "center" });
|
||||
expect(scrollIntoView.mock.contexts[0]).toBe(block);
|
||||
expect(block?.classList.contains("block-reference-flash")).toBe(true);
|
||||
expect(viewScope.block).toBeUndefined();
|
||||
expect(showError).not.toHaveBeenCalled();
|
||||
|
||||
vi.advanceTimersByTime(1500);
|
||||
expect(block?.classList.contains("block-reference-flash")).toBe(false);
|
||||
});
|
||||
|
||||
it("flashes the outermost elements of a range", () => {
|
||||
const container = buildContainer(
|
||||
"<p>before</p><p data-trilium-block-id=\"a\">A</p><blockquote><p>quote</p></blockquote>"
|
||||
+ "<ul><li><p data-trilium-block-id=\"b\">B</p><p>rest of item</p></li>"
|
||||
+ "<li>after</li></ul>"
|
||||
);
|
||||
|
||||
consumeBlockReference(container, { block: "b:a" });
|
||||
|
||||
expect(getFlashed(container)).toEqual([ "A", "quote", "B" ]);
|
||||
});
|
||||
|
||||
it("shows the block still found of a broken range, and says that it is broken", () => {
|
||||
const container = buildContainer("<p data-trilium-block-id=\"b\">B</p>");
|
||||
|
||||
consumeBlockReference(container, { block: "gone:b" });
|
||||
|
||||
expect(getFlashed(container)).toEqual([ "B" ]);
|
||||
expect(scrollIntoView).toHaveBeenCalledTimes(1);
|
||||
expect(showError).toHaveBeenCalledWith("block_reference.not_found");
|
||||
});
|
||||
|
||||
it("only says so when no block is found, or the reference is malformed", () => {
|
||||
const container = buildContainer("<p data-trilium-block-id=\"a\">A</p>");
|
||||
|
||||
consumeBlockReference(container, { block: "gone" });
|
||||
consumeBlockReference(container, { block: "a:b:c" });
|
||||
|
||||
expect(scrollIntoView).not.toHaveBeenCalled();
|
||||
expect(showError).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
|
||||
it("waits for the content, and does nothing without a reference", () => {
|
||||
const viewScope: ViewScope = { block: "a" };
|
||||
|
||||
consumeBlockReference(null, viewScope);
|
||||
consumeBlockReference(buildContainer(""), {});
|
||||
consumeBlockReference(buildContainer(""), undefined);
|
||||
|
||||
expect(viewScope.block).toBe("a");
|
||||
expect(showError).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe("getBlockRangeElements", () => {
|
||||
it("returns a single block, or the blocks between two in a list", () => {
|
||||
const container = buildContainer(
|
||||
"<ol><li data-trilium-block-id=\"a\">A</li><li>B</li>"
|
||||
+ "<li data-trilium-block-id=\"c\">C</li><li>D</li></ol>"
|
||||
);
|
||||
const [ first, , third ] = container.querySelectorAll("li");
|
||||
|
||||
expect(getBlockRangeElements(first, first)).toEqual([ first ]);
|
||||
expect(getBlockRangeElements(first, third).map((element) => element.textContent))
|
||||
.toEqual([ "A", "B", "C" ]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("highlightBlockReference", () => {
|
||||
it("highlights a range and opens the collapsed blocks at its ends", () => {
|
||||
const container = buildContainer(
|
||||
"<details><summary>s1</summary><p data-trilium-block-id=\"a\">A</p></details>"
|
||||
+ "<blockquote><p>quote</p></blockquote>"
|
||||
+ "<details><summary>s2</summary><p data-trilium-block-id=\"b\">B</p></details>"
|
||||
);
|
||||
|
||||
highlightBlockReference(container, "a:b");
|
||||
|
||||
expect(getHighlighted(container)).toEqual([ "A", "quote", "s2", "B" ]);
|
||||
expect([ ...container.querySelectorAll("details") ].map((details) => details.open))
|
||||
.toEqual([ true, true ]);
|
||||
});
|
||||
|
||||
it("highlights the block found of a broken range, and nothing for a missing block", () => {
|
||||
const container = buildContainer("<p data-trilium-block-id=\"b\">B</p><p>other</p>");
|
||||
|
||||
highlightBlockReference(container, "gone");
|
||||
highlightBlockReference(container, "a:b:c");
|
||||
expect(getHighlighted(container)).toEqual([]);
|
||||
|
||||
highlightBlockReference(container, "gone:b");
|
||||
expect(getHighlighted(container)).toEqual([ "B" ]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("revealHighlightedBlocks", () => {
|
||||
it("centers the highlighted blocks, or scrolls to their top when they don't fit", () => {
|
||||
const container = buildContainer(
|
||||
"<p>before</p><p class=\"block-reference-highlight\">A</p>"
|
||||
+ "<p class=\"block-reference-highlight\">B</p>"
|
||||
);
|
||||
const [ , first, last ] = container.querySelectorAll("p");
|
||||
Object.defineProperty(container, "clientHeight", { value: 300 });
|
||||
stubRect(container, 100, 400);
|
||||
stubRect(first, 600, 650);
|
||||
stubRect(last, 650, 700);
|
||||
|
||||
revealHighlightedBlocks(container);
|
||||
expect(container.scrollTop).toBe(400);
|
||||
|
||||
container.scrollTop = 0;
|
||||
stubRect(last, 650, 1200);
|
||||
revealHighlightedBlocks(container);
|
||||
expect(container.scrollTop).toBe(500);
|
||||
});
|
||||
|
||||
it("leaves the scroll position alone without highlighted blocks", () => {
|
||||
const container = buildContainer("<p>A</p>");
|
||||
container.scrollTop = 20;
|
||||
|
||||
revealHighlightedBlocks(container);
|
||||
|
||||
expect(container.scrollTop).toBe(20);
|
||||
});
|
||||
});
|
||||
|
||||
describe("copyBlockReference", () => {
|
||||
it("copies a link to the selected blocks, named by their text, and flashes them", async () => {
|
||||
const root = buildContainer(
|
||||
"<p>one</p><p data-trilium-block-id=\"s1\">Start</p>"
|
||||
+ "<p data-trilium-block-id=\"e1\">End</p>"
|
||||
);
|
||||
const editor = buildEditor(root, { startId: "s1", endId: "e1", count: 2 });
|
||||
|
||||
await copyBlockReference(editor, "root/p1/n1", "Note");
|
||||
|
||||
const href = "#root/p1/n1?block=s1:e1";
|
||||
expect(editor.execute).toHaveBeenCalledWith("assignBlockReference");
|
||||
expect(copyHtmlWithToast).toHaveBeenCalledWith(
|
||||
`<a class="reference-link" href="${href}">Note - Start … End</a>`,
|
||||
href
|
||||
);
|
||||
expect(getFlashed(root)).toEqual([ "Start", "End" ]);
|
||||
});
|
||||
|
||||
it("copies nothing when no block is referenced", async () => {
|
||||
const root = buildContainer("<p>one</p>");
|
||||
|
||||
await copyBlockReference(buildEditor(root, undefined), "root/n1", "Note");
|
||||
const missingTarget = { startId: "x", endId: "x", count: 1 };
|
||||
await copyBlockReference(buildEditor(root, missingTarget), "root/n1", "Note");
|
||||
|
||||
expect(copyHtmlWithToast).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe("openBlockHandleMenu", () => {
|
||||
it("offers to copy a reference to the selected blocks", () => {
|
||||
const event = new MouseEvent("contextmenu", { clientX: 10, clientY: 20 });
|
||||
const copyReference = vi.fn();
|
||||
|
||||
openBlockHandleMenu(event, 3, copyReference);
|
||||
|
||||
expect(showMenu).toHaveBeenCalledWith(expect.objectContaining({
|
||||
x: event.pageX,
|
||||
y: event.pageY,
|
||||
items: [ expect.objectContaining({
|
||||
title: "block_reference.copy:3",
|
||||
handler: copyReference
|
||||
}) ]
|
||||
}));
|
||||
});
|
||||
});
|
||||
|
||||
describe("getClipboardBlockReference", () => {
|
||||
it("reads the first link to blocks in the HTML, else the text, as a reference link", () => {
|
||||
const html = "<p><a href=\"https://example.com\">web</a><a href=\"#root/note0\">note</a>"
|
||||
+ "<a href=\"#root/parent1/note1?block=s1%3Ae1\">blocks</a></p>";
|
||||
|
||||
expect(getClipboardBlockReference({ html, text: "#root/note2?block=b2" })).toEqual({
|
||||
noteId: "note1",
|
||||
block: "s1:e1",
|
||||
href: "#root/parent1/note1?block=s1:e1"
|
||||
});
|
||||
expect(getClipboardBlockReference({
|
||||
html: "<p>No link</p>",
|
||||
text: " http://localhost:8080/#root/note2?block=b2&ntxId=x \n"
|
||||
})).toEqual({ noteId: "note2", block: "b2", href: "#root/note2?block=b2" });
|
||||
});
|
||||
|
||||
it("finds none in a link to a whole note or with a malformed block parameter", () => {
|
||||
const texts = [
|
||||
"#root/note1", "#root/note1?block=", "#root/note1?block=a:b:c",
|
||||
"#root/note1?block=%E0", "plain text", ""
|
||||
];
|
||||
|
||||
for (const text of texts) {
|
||||
expect(getClipboardBlockReference({ html: "", text })).toBeNull();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("buildBlockReferenceMenuItems", () => {
|
||||
const element = document.createElement("p");
|
||||
const href = "#root/parent1/note1?block=s1:e1";
|
||||
|
||||
it("copies a reference to the selected blocks through the host of the editor", async () => {
|
||||
const copyReference = vi.fn(async () => {});
|
||||
const { editor, root } = buildMenuEditor({ count: 3 });
|
||||
getTextEditorContaining.mockResolvedValue(editor);
|
||||
getComponentByEl.mockReturnValue({ copyBlockReference: copyReference });
|
||||
|
||||
const items = await buildBlockReferenceMenuItems(element);
|
||||
runItem(items?.copy);
|
||||
|
||||
expect(getTextEditorContaining).toHaveBeenCalledWith(element);
|
||||
expect(getComponentByEl).toHaveBeenCalledWith(root);
|
||||
expect(items?.copy).toMatchObject({ title: "block_reference.copy:3" });
|
||||
expect(copyReference).toHaveBeenCalledTimes(1);
|
||||
expect(items?.paste).toEqual([]);
|
||||
});
|
||||
|
||||
it("offers no copy row where no reference can be made or the host cannot copy", async () => {
|
||||
getComponentByEl.mockReturnValue({ copyBlockReference: vi.fn() });
|
||||
getTextEditorContaining.mockResolvedValue(buildMenuEditor({ canReference: false }).editor);
|
||||
expect((await buildBlockReferenceMenuItems(element))?.copy).toBeNull();
|
||||
|
||||
getComponentByEl.mockReturnValue({});
|
||||
getTextEditorContaining.mockResolvedValue(buildMenuEditor().editor);
|
||||
expect((await buildBlockReferenceMenuItems(element))?.copy).toBeNull();
|
||||
});
|
||||
|
||||
it("offers no rows outside a text editor with block references", async () => {
|
||||
getTextEditorContaining.mockResolvedValue(null);
|
||||
expect(await buildBlockReferenceMenuItems(element)).toBeNull();
|
||||
|
||||
getTextEditorContaining.mockResolvedValue(buildMenuEditor({ hasPlugin: false }).editor);
|
||||
expect(await buildBlockReferenceMenuItems(element)).toBeNull();
|
||||
});
|
||||
|
||||
it("pastes the reference on the clipboard as a link or an excerpt", async () => {
|
||||
const { editor, pasteTarget } = buildMenuEditor();
|
||||
getTextEditorContaining.mockResolvedValue(editor);
|
||||
getNote.mockResolvedValue({ noteId: "note1" });
|
||||
const clipboard = {
|
||||
enabled: true,
|
||||
read: vi.fn(async () => ({ html: `<a href="${href}">x</a>`, text: "" }))
|
||||
};
|
||||
|
||||
const paste = (await buildBlockReferenceMenuItems(element, clipboard))?.paste ?? [];
|
||||
expect(paste).toMatchObject([
|
||||
{ title: "block_reference.paste_as_link", enabled: true },
|
||||
{ title: "block_reference.paste_as_excerpt", enabled: true }
|
||||
]);
|
||||
|
||||
runItem(paste[0]);
|
||||
await vi.waitFor(() => expect(pasteTarget.release).toHaveBeenCalledTimes(1));
|
||||
expect(editor.capturePasteTarget.mock.invocationCallOrder[0])
|
||||
.toBeLessThan(clipboard.read.mock.invocationCallOrder[0]);
|
||||
expect(pasteTarget.paste).toHaveBeenLastCalledWith(
|
||||
`<a class="reference-link" href="${href}">${href}</a>`, href);
|
||||
|
||||
runItem(paste[1]);
|
||||
await vi.waitFor(() => expect(pasteTarget.release).toHaveBeenCalledTimes(2));
|
||||
expect(getNote).toHaveBeenCalledWith("note1", true);
|
||||
expect(pasteTarget.paste).toHaveBeenLastCalledWith(
|
||||
"<figure class=\"include-note\" data-note-id=\"note1\" data-block=\"s1:e1\""
|
||||
+ " data-box-size=\"full\"></figure>",
|
||||
href
|
||||
);
|
||||
});
|
||||
|
||||
it("disables the paste rows for an empty clipboard, and the excerpt where no embed fits",
|
||||
async () => {
|
||||
const clipboard = { enabled: false, read: vi.fn() };
|
||||
getTextEditorContaining.mockResolvedValue(buildMenuEditor().editor);
|
||||
const empty = await buildBlockReferenceMenuItems(element, clipboard);
|
||||
|
||||
clipboard.enabled = true;
|
||||
getTextEditorContaining.mockResolvedValue(buildMenuEditor({ canEmbed: false }).editor);
|
||||
const noEmbed = await buildBlockReferenceMenuItems(element, clipboard);
|
||||
|
||||
expect(getEnabled(empty?.paste)).toEqual([ false, false ]);
|
||||
expect(getEnabled(noEmbed?.paste)).toEqual([ true, false ]);
|
||||
});
|
||||
|
||||
it("reports a clipboard without a reference and a referenced note that is gone", async () => {
|
||||
const { editor, pasteTarget } = buildMenuEditor();
|
||||
getTextEditorContaining.mockResolvedValue(editor);
|
||||
getNote.mockResolvedValue(null);
|
||||
const clipboard = {
|
||||
enabled: true,
|
||||
read: vi.fn(async () => ({ html: "", text: "plain text" }))
|
||||
};
|
||||
const paste = (await buildBlockReferenceMenuItems(element, clipboard))?.paste ?? [];
|
||||
|
||||
runItem(paste[0]);
|
||||
await vi.waitFor(() => expect(pasteTarget.release).toHaveBeenCalledTimes(1));
|
||||
expect(showMessage).toHaveBeenCalledWith(
|
||||
"block_reference.no_reference_on_clipboard", 3000, "bx bx-info-circle");
|
||||
|
||||
// A reference copied from another instance is to a note this one does not have.
|
||||
clipboard.read.mockResolvedValue({ html: "", text: `https://other.example/${href}` });
|
||||
runItem(paste[0]);
|
||||
await vi.waitFor(() => expect(pasteTarget.release).toHaveBeenCalledTimes(2));
|
||||
runItem(paste[1]);
|
||||
await vi.waitFor(() => expect(pasteTarget.release).toHaveBeenCalledTimes(3));
|
||||
expect(getNote.mock.calls).toEqual([ [ "note1", true ], [ "note1", true ] ]);
|
||||
expect(showError.mock.calls).toEqual([
|
||||
[ "block_reference.not_found" ], [ "block_reference.not_found" ]
|
||||
]);
|
||||
expect(pasteTarget.paste).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
function buildMenuEditor({
|
||||
count = 2, canReference = true, canEmbed = true, hasPlugin = true
|
||||
} = {}) {
|
||||
const root = document.createElement("div");
|
||||
const pasteTarget = { paste: vi.fn(), release: vi.fn() };
|
||||
const commands: Record<string, { isEnabled: boolean; value?: number }> = {
|
||||
assignBlockReference: { isEnabled: canReference, value: count },
|
||||
insertContentEmbed: { isEnabled: canEmbed }
|
||||
};
|
||||
const editor = {
|
||||
plugins: { has: (name: string) => hasPlugin && name === "BlockReference" },
|
||||
commands: { get: (name: string) => commands[name] },
|
||||
editing: { view: { getDomRoot: () => root } },
|
||||
capturePasteTarget: vi.fn(() => pasteTarget)
|
||||
};
|
||||
|
||||
return { editor: editor as typeof editor & CKTextEditor, root, pasteTarget };
|
||||
}
|
||||
|
||||
function runItem(item: MenuItem<CommandNames> | null | undefined) {
|
||||
(item as MenuCommandItem<CommandNames> | undefined)?.handler?.({} as never, {} as never);
|
||||
}
|
||||
|
||||
function getEnabled(items: MenuItem<CommandNames>[] | undefined) {
|
||||
return items?.map((item) => (item as MenuCommandItem<CommandNames>).enabled);
|
||||
}
|
||||
|
||||
function buildContainer(html: string) {
|
||||
const container = document.createElement("div");
|
||||
container.innerHTML = html;
|
||||
return container;
|
||||
}
|
||||
|
||||
function getFlashed(container: HTMLElement) {
|
||||
return [ ...container.querySelectorAll(".block-reference-flash") ]
|
||||
.map((element) => element.textContent);
|
||||
}
|
||||
|
||||
function getHighlighted(container: HTMLElement) {
|
||||
return [ ...container.querySelectorAll(".block-reference-highlight") ]
|
||||
.map((element) => element.textContent);
|
||||
}
|
||||
|
||||
function stubRect(element: Element, top: number, bottom: number) {
|
||||
vi.spyOn(element, "getBoundingClientRect").mockReturnValue({ top, bottom } as DOMRect);
|
||||
}
|
||||
|
||||
function buildEditor(root: HTMLElement, target: unknown) {
|
||||
return {
|
||||
execute: vi.fn(() => target),
|
||||
editing: { view: { getDomRoot: () => root } }
|
||||
} as unknown as CKTextEditor;
|
||||
}
|
||||
@@ -0,0 +1,337 @@
|
||||
import type { CKTextEditor } from "@triliumnext/ckeditor5";
|
||||
import {
|
||||
formatBlockRange, parseBlockRange, resolveBlockRange, resolveBlockReference
|
||||
} from "@triliumnext/commons";
|
||||
|
||||
import type { CommandNames } from "../components/app_context.js";
|
||||
import contextMenu, { type MenuItem } from "../menus/context_menu.js";
|
||||
import type { ClipboardAccess } from "../menus/table_context_menu.js";
|
||||
import { getTextEditorContaining } from "../menus/text_editor_context_menu.js";
|
||||
import { getBlockExcerpt } from "./block_excerpts.js";
|
||||
import { copyHtmlWithToast } from "./clipboard_ext.js";
|
||||
import { expandAncestorDetails } from "./collapsible.js";
|
||||
import froca from "./froca.js";
|
||||
import { t } from "./i18n.js";
|
||||
import { calculateHash, parseNavigationStateFromUrl, type ViewScope } from "./link.js";
|
||||
import toast from "./toast.js";
|
||||
|
||||
const FLASH_CLASS = "block-reference-flash";
|
||||
/** The duration of the `block-reference-flash` animation in `block_reference.css`. */
|
||||
const FLASH_DURATION_MS = 1500;
|
||||
const HIGHLIGHT_CLASS = "block-reference-highlight";
|
||||
|
||||
/** A reference to blocks of a note, read from the clipboard. */
|
||||
export interface ClipboardBlockReference {
|
||||
noteId: string;
|
||||
/** The `block` link parameter. */
|
||||
block: string;
|
||||
/** The href of a reference link to the blocks. */
|
||||
href: string;
|
||||
}
|
||||
|
||||
/** The block reference rows of the text editor's right-click menu. */
|
||||
export interface BlockReferenceMenuItems {
|
||||
/** Copies a reference to the selected blocks, in the _Copy_ submenu, or `null`. */
|
||||
copy: MenuItem<CommandNames> | null;
|
||||
/** Pastes the reference on the clipboard, in the _Paste_ submenu. */
|
||||
paste: MenuItem<CommandNames>[];
|
||||
}
|
||||
|
||||
/** The component of a text editor that copies references to the blocks of its note. */
|
||||
interface BlockReferenceHost {
|
||||
copyBlockReference?(): Promise<void>;
|
||||
}
|
||||
|
||||
/** Opens the menu of the block handle at `event`, which copies a reference to `count` blocks. */
|
||||
export function openBlockHandleMenu(event: MouseEvent, count: number, copyReference: () => void) {
|
||||
void contextMenu.show({
|
||||
x: event.pageX,
|
||||
y: event.pageY,
|
||||
items: [ getCopyItem(count, copyReference) ],
|
||||
selectMenuItemHandler: () => {}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* The block reference rows for a right-click on `element`, or `null` when `element` is not in a
|
||||
* text editor. `clipboard` enables the paste rows.
|
||||
*/
|
||||
export async function buildBlockReferenceMenuItems(
|
||||
element: Element | null | undefined,
|
||||
clipboard?: ClipboardAccess
|
||||
): Promise<BlockReferenceMenuItems | null> {
|
||||
const editor = await getTextEditorContaining(element);
|
||||
if (!editor?.plugins.has("BlockReference")) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
copy: getCopyMenuItem(editor),
|
||||
paste: clipboard ? getPasteMenuItems(editor, clipboard) : []
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* The first link to blocks of a note in the HTML of the clipboard, else its text as such a link,
|
||||
* or `null`.
|
||||
*/
|
||||
export function getClipboardBlockReference(
|
||||
{ html, text }: { html: string; text: string }
|
||||
): ClipboardBlockReference | null {
|
||||
const links = html
|
||||
? new DOMParser().parseFromString(html, "text/html").querySelectorAll("a[href]")
|
||||
: [];
|
||||
const hrefs = Array.from(links, (link) => link.getAttribute("href") ?? "");
|
||||
|
||||
for (const href of [ ...hrefs, text ]) {
|
||||
const reference = parseBlockReferenceHref(href);
|
||||
if (reference) {
|
||||
return reference;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives ids to the selected blocks of `editor`, flashes the blocks and copies a reference link to
|
||||
* them. `notePath` and `noteTitle` are of the note the editor shows.
|
||||
*/
|
||||
export async function copyBlockReference(
|
||||
editor: CKTextEditor,
|
||||
notePath: string,
|
||||
noteTitle: string
|
||||
) {
|
||||
const target = editor.execute("assignBlockReference");
|
||||
const root = editor.editing.view.getDomRoot();
|
||||
const { start, end } = target && root
|
||||
? resolveBlockRange<HTMLElement>(root, target)
|
||||
: { start: null, end: null };
|
||||
if (!target || !start || !end) {
|
||||
return;
|
||||
}
|
||||
|
||||
flashBlocks(getBlockRangeElements(start, end));
|
||||
const href = calculateHash({ notePath, viewScope: { block: formatBlockRange(target) } });
|
||||
const $link = $("<a>")
|
||||
.addClass("reference-link")
|
||||
.attr("href", href)
|
||||
.text(`${noteTitle} - ${getBlockExcerpt(start, end)}`);
|
||||
await copyHtmlWithToast($link[0].outerHTML, href);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads and clears `viewScope.block`, then scrolls to the blocks it points at in `container` and
|
||||
* flashes them. When a block is missing, the blocks found are shown, with an error toast.
|
||||
*/
|
||||
export function consumeBlockReference(
|
||||
container: HTMLElement | null | undefined,
|
||||
viewScope: ViewScope | null | undefined
|
||||
) {
|
||||
if (!viewScope?.block || !container) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { start, end } = resolveBlockReference<HTMLElement>(container, viewScope.block);
|
||||
viewScope.block = undefined;
|
||||
|
||||
const first = start ?? end;
|
||||
if (first) {
|
||||
expandAncestorDetails(first);
|
||||
first.scrollIntoView({ behavior: "smooth", block: "center" });
|
||||
flashBlocks(start && end ? getBlockRangeElements(start, end) : [ first ]);
|
||||
}
|
||||
if (!start || !end) {
|
||||
toast.showError(t("block_reference.not_found"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Highlights the blocks that `value`, a `block` link parameter, points at in `container`, and opens
|
||||
* the collapsed blocks around its first and last block. Of a broken range, the block found is
|
||||
* highlighted.
|
||||
*/
|
||||
export function highlightBlockReference(container: HTMLElement, value: string) {
|
||||
const { start, end } = resolveBlockReference<HTMLElement>(container, value);
|
||||
const first = start ?? end;
|
||||
if (!first) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const block of [ start, end ]) {
|
||||
if (block) {
|
||||
expandAncestorDetails(block);
|
||||
}
|
||||
}
|
||||
const elements = start && end ? getBlockRangeElements(start, end) : [ first ];
|
||||
for (const element of elements) {
|
||||
element.classList.add(HIGHLIGHT_CLASS);
|
||||
}
|
||||
}
|
||||
|
||||
/** Scrolls `container` to center its highlighted blocks, or to their top if they do not fit. */
|
||||
export function revealHighlightedBlocks(container: HTMLElement) {
|
||||
const blocks = Array.from(container.querySelectorAll(`.${HIGHLIGHT_CLASS}`));
|
||||
const first = blocks.at(0);
|
||||
const last = blocks.at(-1);
|
||||
if (!first || !last) {
|
||||
return;
|
||||
}
|
||||
|
||||
const top = first.getBoundingClientRect().top;
|
||||
const height = last.getBoundingClientRect().bottom - top;
|
||||
const viewportTop = container.getBoundingClientRect().top + container.clientTop;
|
||||
const margin = Math.max(0, (container.clientHeight - height) / 2);
|
||||
container.scrollTop += top - viewportTop - margin;
|
||||
}
|
||||
|
||||
/** The outermost elements inside the range from `start` to `end`, both included. */
|
||||
export function getBlockRangeElements(start: Element, end: Element) {
|
||||
const range = start.ownerDocument.createRange();
|
||||
range.setStartBefore(start);
|
||||
range.setEndAfter(end);
|
||||
return getElementsInRange(range, range.commonAncestorContainer);
|
||||
}
|
||||
|
||||
function getElementsInRange(range: Range, parent: Node): Element[] {
|
||||
const elements: Element[] = [];
|
||||
for (const child of Array.from(parent.childNodes)) {
|
||||
if (!(child instanceof Element) || !range.intersectsNode(child)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isInRange(range, child)) {
|
||||
elements.push(child);
|
||||
} else {
|
||||
elements.push(...getElementsInRange(range, child));
|
||||
}
|
||||
}
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
function isInRange(range: Range, node: Node) {
|
||||
const nodeRange = range.cloneRange();
|
||||
nodeRange.selectNode(node);
|
||||
return range.compareBoundaryPoints(Range.START_TO_START, nodeRange) <= 0
|
||||
&& range.compareBoundaryPoints(Range.END_TO_END, nodeRange) >= 0;
|
||||
}
|
||||
|
||||
function getCopyItem(count: number, copyReference: () => void): MenuItem<CommandNames> {
|
||||
return {
|
||||
title: t("block_reference.copy", { count }),
|
||||
uiIcon: "bx bx-link",
|
||||
handler: copyReference
|
||||
};
|
||||
}
|
||||
|
||||
function getCopyMenuItem(editor: CKTextEditor) {
|
||||
const command = editor.commands.get("assignBlockReference");
|
||||
const root = editor.editing.view.getDomRoot();
|
||||
const host: BlockReferenceHost | undefined = root && glob.getComponentByEl(root);
|
||||
if (!command?.isEnabled || !host?.copyBlockReference) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return getCopyItem(command.value, () => void host.copyBlockReference?.());
|
||||
}
|
||||
|
||||
function getPasteMenuItems(
|
||||
editor: CKTextEditor,
|
||||
clipboard: ClipboardAccess
|
||||
): MenuItem<CommandNames>[] {
|
||||
const canEmbed = editor.commands.get("insertContentEmbed")?.isEnabled === true;
|
||||
return [
|
||||
{
|
||||
title: t("block_reference.paste_as_link"),
|
||||
uiIcon: "bx bx-link",
|
||||
enabled: clipboard.enabled,
|
||||
handler: () => void pasteBlockReference(editor, clipboard, getLinkHtml)
|
||||
},
|
||||
{
|
||||
title: t("block_reference.paste_as_excerpt"),
|
||||
uiIcon: "bx bx-window-alt",
|
||||
enabled: clipboard.enabled && canEmbed,
|
||||
handler: () => void pasteBlockReference(editor, clipboard, getExcerptHtml)
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the clipboard and pastes the HTML that `toHtml` makes of the block reference on it, at
|
||||
* the selection the menu was opened on. The selection is pinned before the read, which can wait
|
||||
* on a permission prompt. Pastes nothing for a reference to a note that `froca` cannot find, as
|
||||
* one copied from another Trilium instance.
|
||||
*/
|
||||
async function pasteBlockReference(
|
||||
editor: CKTextEditor,
|
||||
clipboard: ClipboardAccess,
|
||||
toHtml: (reference: ClipboardBlockReference) => string | Promise<string>
|
||||
) {
|
||||
const target = editor.capturePasteTarget();
|
||||
try {
|
||||
const reference = getClipboardBlockReference(await clipboard.read());
|
||||
if (!reference) {
|
||||
toast.showMessage(t("block_reference.no_reference_on_clipboard"), 3000,
|
||||
"bx bx-info-circle");
|
||||
return;
|
||||
}
|
||||
if (!await froca.getNote(reference.noteId, true)) {
|
||||
toast.showError(t("block_reference.not_found"));
|
||||
return;
|
||||
}
|
||||
|
||||
target.paste(await toHtml(reference), reference.href);
|
||||
} catch (error) {
|
||||
console.warn("Failed to paste a block reference:", error);
|
||||
} finally {
|
||||
target.release();
|
||||
}
|
||||
}
|
||||
|
||||
function getLinkHtml({ href }: ClipboardBlockReference) {
|
||||
const link = document.createElement("a");
|
||||
link.className = "reference-link";
|
||||
link.setAttribute("href", href);
|
||||
link.textContent = href;
|
||||
return link.outerHTML;
|
||||
}
|
||||
|
||||
/** The HTML of an embed of the referenced blocks. */
|
||||
async function getExcerptHtml({ noteId, block }: ClipboardBlockReference) {
|
||||
// Imported on demand: `content_renderer` imports `content_renderer_text`, which imports this
|
||||
// module.
|
||||
const { EXCERPT_BOX_SIZE } = await import("./content_renderer.js");
|
||||
const embed = document.createElement("figure");
|
||||
embed.className = "include-note";
|
||||
embed.dataset.noteId = noteId;
|
||||
embed.dataset.block = block;
|
||||
embed.dataset.boxSize = EXCERPT_BOX_SIZE;
|
||||
return embed.outerHTML;
|
||||
}
|
||||
|
||||
/** The note and the blocks that `href` links to, or `null` for a link to anything else. */
|
||||
function parseBlockReferenceHref(href: string): ClipboardBlockReference | null {
|
||||
let state: ReturnType<typeof parseNavigationStateFromUrl>;
|
||||
try {
|
||||
state = parseNavigationStateFromUrl(href);
|
||||
} catch {
|
||||
// A malformed percent escape.
|
||||
return null;
|
||||
}
|
||||
|
||||
const { notePath, noteId } = state;
|
||||
const block = state.viewScope?.block;
|
||||
if (!notePath || !noteId || !block || !parseBlockRange(block)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return { noteId, block, href: calculateHash({ notePath, viewScope: { block } }) };
|
||||
}
|
||||
|
||||
function flashBlocks(elements: Element[]) {
|
||||
for (const element of elements) {
|
||||
element.classList.add(FLASH_CLASS);
|
||||
setTimeout(() => element.classList.remove(FLASH_CLASS), FLASH_DURATION_MS);
|
||||
}
|
||||
}
|
||||
@@ -488,6 +488,33 @@ describe("getRenderedContent editable code", () => {
|
||||
expect(rendered(again)).toBe("<p>Edited</p>");
|
||||
});
|
||||
|
||||
it("mounts TextEmbed for blocks, with an editor where they can be edited apart", async () => {
|
||||
const content = "<ul><li><p>Intro</p><p data-trilium-block-id=\"a\">A</p></li></ul>"
|
||||
+ "<p data-trilium-block-id=\"b\">B</p>";
|
||||
const note = buildNote({ title: "Doc", type: "text", content });
|
||||
const onBlockChange = vi.fn();
|
||||
const renderBlocks = (block: string) => getRenderedContent(note, {
|
||||
interactive: true,
|
||||
noteEditor: buildEditor(),
|
||||
block,
|
||||
onBlockChange
|
||||
});
|
||||
|
||||
await renderBlocks("b");
|
||||
const props = textEmbedComponent.mock.lastCall?.[0];
|
||||
expect(props).toMatchObject({ content, block: "b", onBlockChange });
|
||||
expect(props.editor.canEdit()).toBe(true);
|
||||
expect(renderTextContent).toHaveBeenLastCalledWith(
|
||||
note, content, expect.anything(), expect.objectContaining({ block: "b" }));
|
||||
|
||||
await props.renderPreview("<p>New</p>", "b:n");
|
||||
expect(renderTextContent).toHaveBeenLastCalledWith(
|
||||
note, "<p>New</p>", expect.anything(), expect.objectContaining({ block: "b:n" }));
|
||||
|
||||
await renderBlocks("a:b");
|
||||
expect(textEmbedComponent.mock.lastCall?.[0].editor).toBeUndefined();
|
||||
});
|
||||
|
||||
it("edits only code and text notes", async () => {
|
||||
const json = buildNote({
|
||||
title: "Data", type: "file", mime: "application/json", content: "{}"
|
||||
|
||||
@@ -3,6 +3,7 @@ import "./content_renderer.css";
|
||||
import {
|
||||
attachmentIcon,
|
||||
CANVAS_ATTACHMENT_MIME,
|
||||
getEditableBlockRun,
|
||||
getMimeTypeFromFileName,
|
||||
isAcceptedImageMime,
|
||||
isImageAttachmentRole,
|
||||
@@ -62,6 +63,15 @@ export interface RenderOptions {
|
||||
includeArchivedNotes?: boolean;
|
||||
/** Set of note IDs that have already been seen during rendering to prevent infinite recursion. */
|
||||
seenNoteIds?: Set<string>;
|
||||
/**
|
||||
* The blocks of a text note to render, a `block` link parameter. The rest of the note is left
|
||||
* out, and a missing block renders as a broken reference.
|
||||
*/
|
||||
block?: string;
|
||||
/** Points the embed of `block` at the blocks that its editor holds, once they change. */
|
||||
onBlockChange?: (block: string) => void;
|
||||
/** The blocks of a text note to highlight, a `block` link parameter. Embeds are left out. */
|
||||
highlightBlock?: string;
|
||||
showTextRepresentation?: boolean;
|
||||
/**
|
||||
* If enabled, note types that have a richer live representation (currently only web views) are
|
||||
@@ -151,6 +161,9 @@ const PREVIEWED_TYPES = new Set([
|
||||
"llmChat"
|
||||
]);
|
||||
|
||||
/** The box size a new embed of blocks of a note, an excerpt, starts with. */
|
||||
export const EXCERPT_BOX_SIZE: BoxSize = "full";
|
||||
|
||||
export async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FAttachment, options: RenderOptions = {}) {
|
||||
|
||||
options = Object.assign(
|
||||
@@ -258,17 +271,18 @@ export async function getRenderedContent(this: {} | { ctx: string }, entity: FNo
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a text note that `TextEmbed` edits in place while the Editable toggle of its embed is
|
||||
* on.
|
||||
* Renders a text note, or the blocks of it that `options.block` points at, which `TextEmbed`
|
||||
* edits in place while the Editable toggle of its embed is on. Blocks that cannot be edited apart
|
||||
* from the rest of the note stay read-only.
|
||||
*/
|
||||
async function renderEditableText(
|
||||
note: FNote,
|
||||
$renderedContent: JQuery<HTMLElement>,
|
||||
options: RenderOptions
|
||||
) {
|
||||
const renderPreview = async (content: string) => {
|
||||
const renderPreview = async (content: string, block = options.block) => {
|
||||
const $preview = $("<div>");
|
||||
await renderTextContent(note, content, $preview, options);
|
||||
await renderTextContent(note, content, $preview, { ...options, block });
|
||||
return $preview[0];
|
||||
};
|
||||
const [ blob, { default: TextEmbed } ] = await Promise.all([
|
||||
@@ -277,21 +291,29 @@ async function renderEditableText(
|
||||
]);
|
||||
const content = blob?.content ?? "";
|
||||
const preview = await renderPreview(content);
|
||||
const canEditBlocks = !options.block || isEditableBlockRange(content, options.block);
|
||||
|
||||
const $container = $('<div class="text-embed">');
|
||||
const container = $container.get(0);
|
||||
if (container) {
|
||||
await mountInteractiveWidget(h(TextEmbed, {
|
||||
note,
|
||||
editor: getContentEditor(note, options),
|
||||
editor: canEditBlocks ? getContentEditor(note, options) : undefined,
|
||||
content,
|
||||
block: options.block,
|
||||
preview,
|
||||
renderPreview
|
||||
renderPreview,
|
||||
onBlockChange: options.onBlockChange
|
||||
}), container);
|
||||
}
|
||||
$renderedContent.append($container);
|
||||
}
|
||||
|
||||
function isEditableBlockRange(content: string, block: string) {
|
||||
const root = new DOMParser().parseFromString(content, "text/html").body;
|
||||
return !!getEditableBlockRun(root, block);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a markdown note by converting its source to CKEditor-compatible HTML,
|
||||
* then running the same post-render pipeline as text notes (embedded notes,
|
||||
|
||||
@@ -317,6 +317,20 @@ describe("Text content renderer", () => {
|
||||
expect(refLink?.textContent).toContain("Referenced Title");
|
||||
});
|
||||
|
||||
it("labels a reference to a block of the rendered note by the text of the block", async () => {
|
||||
const contentEl = document.createElement("div");
|
||||
const note = buildNote({
|
||||
id: "selfRef1",
|
||||
title: "Self",
|
||||
content: "<p data-trilium-block-id=\"b1\">Opening words</p>"
|
||||
+ "<p><a class=\"reference-link\" href=\"#root/selfRef1?block=b1\">stale</a></p>"
|
||||
});
|
||||
await renderText(note, $(contentEl));
|
||||
const refLink = contentEl.querySelector("a.reference-link");
|
||||
expect(refLink).not.toBeNull();
|
||||
expect(refLink?.textContent).toBe("Opening words");
|
||||
});
|
||||
|
||||
it("tolerates reference links without an href", async () => {
|
||||
const contentEl = document.createElement("div");
|
||||
const note = buildNote({
|
||||
@@ -758,3 +772,88 @@ describe("applyInlineMermaid", () => {
|
||||
error.mockRestore();
|
||||
});
|
||||
});
|
||||
|
||||
describe("Block embeds", () => {
|
||||
const blockEmbed = (noteId: string, block: string, boxSize = "medium", blockId?: string) =>
|
||||
`<figure class="include-note"${blockId ? ` data-trilium-block-id="${blockId}"` : ""}`
|
||||
+ ` data-note-id="${noteId}" data-block="${block}" data-box-size="${boxSize}"></figure>`;
|
||||
|
||||
it("renders only the referenced blocks, or a broken reference for a missing one", async () => {
|
||||
buildNote({
|
||||
id: "blkSource",
|
||||
title: "Source",
|
||||
content: "<p>Intro</p><blockquote><p>Skipped</p>"
|
||||
+ "<p data-trilium-block-id=\"b1\">Quoted</p></blockquote>"
|
||||
+ "<p data-trilium-block-id=\"b2\">Last</p><p>Outro</p>"
|
||||
});
|
||||
const host = buildNote({
|
||||
title: "Host",
|
||||
content: blockEmbed("blkSource", "b1:b2") + blockEmbed("blkSource", "b1:gone")
|
||||
});
|
||||
const contentEl = document.createElement("div");
|
||||
|
||||
await renderText(host, $(contentEl));
|
||||
|
||||
const [ embed, brokenEmbed ] = contentEl.querySelectorAll(".ck-content > .include-note");
|
||||
expect(embed.querySelector("blockquote")?.textContent).toBe("Quoted");
|
||||
expect(embed.textContent).toContain("Last");
|
||||
expect(embed.textContent).not.toMatch(/Intro|Skipped|Outro/);
|
||||
expect(brokenEmbed.querySelector(".block-reference-broken")?.textContent)
|
||||
.toBe("block_reference.broken");
|
||||
});
|
||||
|
||||
it("renders a broken reference for the blocks of an empty note", async () => {
|
||||
const note = buildNote({ title: "Empty", content: "" });
|
||||
const contentEl = document.createElement("div");
|
||||
|
||||
await renderTextContent(note, "", $(contentEl), { block: "b1" });
|
||||
|
||||
expect(contentEl.querySelector(".block-reference-broken")).not.toBeNull();
|
||||
});
|
||||
|
||||
it("embeds blocks of the note itself, and stops at a block that embeds itself", async () => {
|
||||
const note = buildNote({
|
||||
id: "blkSelf",
|
||||
title: "Self",
|
||||
content: "<p data-trilium-block-id=\"top\">Top</p>"
|
||||
+ blockEmbed("blkSelf", "top")
|
||||
+ blockEmbed("blkSelf", "loop", "medium", "loop")
|
||||
});
|
||||
const contentEl = document.createElement("div");
|
||||
|
||||
await renderText(note, $(contentEl), { expandNestedEmbeds: true });
|
||||
|
||||
expect(contentEl.textContent?.match(/Top/g)).toHaveLength(2);
|
||||
expect(contentEl.querySelectorAll(".include-note[data-block='loop']")).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("highlights the referenced blocks of the note, not those of its embeds", async () => {
|
||||
buildNote({
|
||||
id: "hlSource",
|
||||
title: "Source",
|
||||
content: "<p data-trilium-block-id=\"b1\">Embedded</p>"
|
||||
});
|
||||
const note = buildNote({
|
||||
title: "Host",
|
||||
content: blockEmbed("hlSource", "b1")
|
||||
+ "<p data-trilium-block-id=\"b1\">Own</p><p data-trilium-block-id=\"b2\">Next</p>"
|
||||
+ "<p>Outro</p>"
|
||||
});
|
||||
const contentEl = document.createElement("div");
|
||||
|
||||
await renderText(note, $(contentEl), { highlightBlock: "b1:b2" });
|
||||
|
||||
expect([ ...contentEl.querySelectorAll(".block-reference-highlight") ]
|
||||
.map((element) => element.textContent)).toEqual([ "Own", "Next" ]);
|
||||
});
|
||||
|
||||
it("links to the blocks of an embed one level down", async () => {
|
||||
const note = buildNote({ title: "Host", content: blockEmbed("blkSource", "b1:b 2") });
|
||||
const contentEl = document.createElement("div");
|
||||
|
||||
await renderText(note, $(contentEl), { embedsAsReferenceLinks: true });
|
||||
|
||||
expect(contentEl.querySelector("a.reference-link")?.getAttribute("href"))
|
||||
.toBe("#root/blkSource?block=b1:b%202");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { KATEX_MACROS } from "@triliumnext/commons";
|
||||
import { encodeBlockParameter, KATEX_MACROS, sliceToBlockReference } from "@triliumnext/commons";
|
||||
|
||||
import FAttachment from "../entities/fattachment.js";
|
||||
import FNote from "../entities/fnote.js";
|
||||
import { highlightBlockReference } from "./block_reference.js";
|
||||
import { default as content_renderer, type RenderOptions } from "./content_renderer.js";
|
||||
import froca from "./froca.js";
|
||||
import { t } from "./i18n.js";
|
||||
@@ -21,7 +22,8 @@ export default async function renderText(note: FNote | FAttachment, $renderedCon
|
||||
|
||||
/**
|
||||
* Renders `content`, the HTML of `note`, which can differ from the saved content, as while the
|
||||
* note is edited. An empty note shows the list of its children instead.
|
||||
* note is edited. An empty note shows the list of its children instead. With `options.block`,
|
||||
* only those blocks render.
|
||||
*/
|
||||
export async function renderTextContent(
|
||||
note: FNote | FAttachment,
|
||||
@@ -29,8 +31,20 @@ export async function renderTextContent(
|
||||
$renderedContent: JQuery<HTMLElement>,
|
||||
options: RenderOptions = {}
|
||||
) {
|
||||
if (content !== undefined && !isHtmlEmpty(content)) {
|
||||
$renderedContent.append($('<div class="ck-content">').html(sanitizeNoteContentHtml(content)));
|
||||
const hasContent = content !== undefined && !isHtmlEmpty(content);
|
||||
const $content = $('<div class="ck-content">')
|
||||
.html(hasContent ? sanitizeNoteContentHtml(content) : "");
|
||||
|
||||
if (options.block !== undefined && !sliceToBlockReference($content[0], options.block)) {
|
||||
$renderedContent.append($("<p>")
|
||||
.addClass("block-reference-broken")
|
||||
.text(t("block_reference.broken")));
|
||||
} else if (hasContent) {
|
||||
// Runs before `postProcessRichContent()` renders embeds, so their blocks are not searched.
|
||||
if (options.highlightBlock) {
|
||||
highlightBlockReference($content[0], options.highlightBlock);
|
||||
}
|
||||
$renderedContent.append($content);
|
||||
await postProcessRichContent(note, $renderedContent, options);
|
||||
} else if (note instanceof FNote && !options.noChildrenList) {
|
||||
await renderChildrenList($renderedContent, note, options.includeArchivedNotes ?? false);
|
||||
@@ -46,7 +60,7 @@ export async function renderTextContent(
|
||||
*/
|
||||
export async function postProcessRichContent(note: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>, options: RenderOptions = {}) {
|
||||
const seenNoteIds = options.seenNoteIds ?? new Set<string>();
|
||||
seenNoteIds.add("noteId" in note ? note.noteId : note.attachmentId);
|
||||
seenNoteIds.add(getEmbedKey("noteId" in note ? note.noteId : note.attachmentId, options.block));
|
||||
if (options.noContentEmbeds) {
|
||||
$renderedContent.find(".include-note").remove();
|
||||
} else if (options.embedsAsReferenceLinks) {
|
||||
@@ -72,9 +86,10 @@ export async function postProcessRichContent(note: FNote | FAttachment, $rendere
|
||||
const noteIdsToPrefetch = referenceLinks.map((i, el) => getNoteIdFromLink(el));
|
||||
await froca.getNotes(noteIdsToPrefetch);
|
||||
|
||||
const hostNoteId = note instanceof FNote ? note.noteId : undefined;
|
||||
await Promise.all(referenceLinks.toArray().map(async (el) => {
|
||||
const innerSpan = document.createElement("span");
|
||||
await link.loadReferenceLinkTitle($(innerSpan), el.getAttribute("href"));
|
||||
await link.loadReferenceLinkTitle($(innerSpan), el.getAttribute("href"), hostNoteId);
|
||||
el.replaceChildren(innerSpan);
|
||||
}));
|
||||
|
||||
@@ -120,6 +135,7 @@ async function renderContentEmbeds(contentEl: HTMLElement, seenNoteIds: Set<stri
|
||||
|
||||
const noteId = embedEl.getAttribute("data-note-id");
|
||||
if (!noteId) continue;
|
||||
const block = embedEl.getAttribute("data-block") ?? undefined;
|
||||
|
||||
const note = froca.getNoteFromCache(noteId);
|
||||
if (!note) {
|
||||
@@ -127,7 +143,7 @@ async function renderContentEmbeds(contentEl: HTMLElement, seenNoteIds: Set<stri
|
||||
continue;
|
||||
}
|
||||
|
||||
if (seenNoteIds.has(noteId)) {
|
||||
if (seenNoteIds.has(getEmbedKey(noteId, block))) {
|
||||
console.warn(`Skipping embedding of ${noteId} to avoid circular reference.`);
|
||||
embedEl.remove();
|
||||
continue;
|
||||
@@ -138,13 +154,18 @@ async function renderContentEmbeds(contentEl: HTMLElement, seenNoteIds: Set<stri
|
||||
// Clone seenNoteIds per descent so it tracks the current ancestor path only — sibling
|
||||
// branches must not pollute each other (a note embedded in two sub-trees is not a cycle).
|
||||
const renderedContent = (await content_renderer.getRenderedContent(note, expandNested
|
||||
? { seenNoteIds: new Set(seenNoteIds), expandNestedEmbeds: true }
|
||||
: { seenNoteIds: new Set(seenNoteIds), embedsAsReferenceLinks: true }
|
||||
? { seenNoteIds: new Set(seenNoteIds), expandNestedEmbeds: true, block }
|
||||
: { seenNoteIds: new Set(seenNoteIds), embedsAsReferenceLinks: true, block }
|
||||
)).$renderedContent;
|
||||
replaceEmbedContent(embedEl, renderedContent.toArray());
|
||||
}
|
||||
}
|
||||
|
||||
/** The key of an embed in `seenNoteIds`. A note can embed blocks of itself. */
|
||||
function getEmbedKey(noteId: string, block: string | undefined) {
|
||||
return block ? `${noteId}:${block}` : noteId;
|
||||
}
|
||||
|
||||
/** Puts `content` in an embed, followed by the embed's caption. */
|
||||
function replaceEmbedContent(embedEl: Element, content: Node[]) {
|
||||
const caption = getEmbedCaption(embedEl);
|
||||
@@ -191,9 +212,12 @@ async function replaceEmbedWithReferenceLink(embedEl: Element) {
|
||||
// comes from note HTML, and the reference-link pass later reinterprets that href.
|
||||
if (!noteId || !/^[a-zA-Z0-9_]+$/.test(noteId)) return;
|
||||
|
||||
const block = embedEl.getAttribute("data-block");
|
||||
const referenceLink = document.createElement("a");
|
||||
referenceLink.className = "reference-link";
|
||||
referenceLink.setAttribute("href", `#root/${noteId}`);
|
||||
referenceLink.setAttribute("href", block
|
||||
? `#root/${noteId}?block=${encodeBlockParameter(block)}`
|
||||
: `#root/${noteId}`);
|
||||
embedEl.replaceWith(referenceLink);
|
||||
}
|
||||
|
||||
|
||||
@@ -1169,3 +1169,67 @@ describe("module-level click handlers", () => {
|
||||
$a.remove();
|
||||
});
|
||||
});
|
||||
|
||||
describe("block references", () => {
|
||||
const content = "<p data-trilium-block-id=\"b1\">First block</p>"
|
||||
+ "<p data-trilium-block-id=\"b2\">Second</p>";
|
||||
|
||||
it("parses and writes the block parameter, keeping the colon of a range", () => {
|
||||
expect(parseNavigationStateFromUrl("#root/a1b2/c3d4?block=b1:b%202").viewScope)
|
||||
.toMatchObject({ block: "b1:b 2" });
|
||||
expect(calculateHash({ notePath: "root/c3d4", viewScope: { block: "b1:b 2" } }))
|
||||
.toBe("#root/c3d4?block=b1:b%202");
|
||||
});
|
||||
|
||||
it("labels a reference by the text of its blocks, or as broken", async () => {
|
||||
const note = buildNote({ title: "Source", content });
|
||||
const $el = $("<span>");
|
||||
const $broken = $("<span>");
|
||||
|
||||
const href = `#root/${note.noteId}?block=b1:b2`;
|
||||
const brokenHref = `#root/${note.noteId}?block=gone`;
|
||||
|
||||
expect(linkService.getReferenceLinkTitleSync(href)).toBe("Source");
|
||||
await linkService.loadReferenceLinkTitle($el, href);
|
||||
await linkService.loadReferenceLinkTitle($broken, brokenHref);
|
||||
|
||||
expect($el.find("small span.bx.bx-paragraph")).toHaveLength(1);
|
||||
expect($el.find("small").text()).toBe("First block … Second");
|
||||
expect($el.find("small").hasClass("block-reference-broken")).toBe(false);
|
||||
expect($broken.find("small").text()).toBe("block_reference.broken");
|
||||
expect($broken.find("small").hasClass("block-reference-broken")).toBe(true);
|
||||
expect(linkService.getReferenceLinkTitleSync(href)).toBe("Source - First block … Second");
|
||||
expect(linkService.getReferenceLinkTitleSync(brokenHref)).toBe("Source");
|
||||
});
|
||||
|
||||
it("labels a reference to the blocks of the note it is in by their text alone", async () => {
|
||||
const note = buildNote({ title: "Source", content });
|
||||
const $own = $("<span>");
|
||||
const $broken = $("<span>");
|
||||
const $elsewhere = $("<span>");
|
||||
|
||||
const href = `#root/${note.noteId}?block=b1`;
|
||||
const brokenHref = `#root/${note.noteId}?block=gone`;
|
||||
await linkService.loadReferenceLinkTitle($own, href, note.noteId);
|
||||
await linkService.loadReferenceLinkTitle($broken, brokenHref, note.noteId);
|
||||
await linkService.loadReferenceLinkTitle($elsewhere, href, "otherNote");
|
||||
|
||||
expect($own.text()).toBe("First block");
|
||||
expect($own.children("span.tn-icon.bx.bx-paragraph")).toHaveLength(1);
|
||||
expect($own.find("small")).toHaveLength(0);
|
||||
expect($own.hasClass("block-reference-broken")).toBe(false);
|
||||
expect($broken.text()).toBe("block_reference.broken");
|
||||
expect($broken.hasClass("block-reference-broken")).toBe(true);
|
||||
expect($elsewhere.text()).toBe("SourceFirst block");
|
||||
expect($elsewhere.find("small").text()).toBe("First block");
|
||||
});
|
||||
|
||||
it("adds no label to a reference to the blocks of a note that cannot be read", async () => {
|
||||
const note = buildNote({ title: "Code", type: "code", content });
|
||||
const $el = $("<span>");
|
||||
|
||||
await linkService.loadReferenceLinkTitle($el, `#root/${note.noteId}?block=b1`);
|
||||
|
||||
expect($el.find("small")).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { ALLOWED_PROTOCOLS } from "@triliumnext/commons";
|
||||
import { ALLOWED_PROTOCOLS, encodeBlockParameter } from "@triliumnext/commons";
|
||||
|
||||
import appContext, { type NoteCommandData } from "../components/app_context.js";
|
||||
import { openInCurrentNoteContext } from "../components/note_context.js";
|
||||
import linkContextMenuService from "../menus/link_context_menu.js";
|
||||
import { getCachedBlockReferenceLabel, loadBlockReferenceLabel } from "./block_excerpts.js";
|
||||
import cssClassManager from "./css_class_manager.js";
|
||||
import froca from "./froca.js";
|
||||
import { t } from "./i18n.js";
|
||||
@@ -63,6 +64,11 @@ export interface ViewScope {
|
||||
floatingToolbar?: boolean;
|
||||
/** When set, scrolls to a bookmark anchor within the note after navigation. */
|
||||
bookmark?: string;
|
||||
/**
|
||||
* The blocks of a text note a reference points at, `id` or `startId:endId`, which the note
|
||||
* scrolls to and flashes once it renders. Consumed once, as `bookmark` is.
|
||||
*/
|
||||
block?: string;
|
||||
/**
|
||||
* Search terms to highlight and jump to after navigating from search results; consumed once
|
||||
* by the destination type widget (mirrors `bookmark` semantics).
|
||||
@@ -119,8 +125,8 @@ const NOTE_PATH_PATTERN = /^[_a-z0-9]{4,}(\/[_a-z0-9]{4,})*$/i;
|
||||
const MAX_SPLIT_PANES_IN_HASH = 8;
|
||||
|
||||
/** Hash parameters that belong to a pane's view scope rather than to the window as a whole. */
|
||||
const VIEW_SCOPE_PARAMS = ["viewMode", "attachmentId", "bookmark", "column", "columnTitle",
|
||||
"columnIcon", "columnColor", "card", "page", "annotation"];
|
||||
const VIEW_SCOPE_PARAMS = ["viewMode", "attachmentId", "bookmark", "block", "column",
|
||||
"columnTitle", "columnIcon", "columnColor", "card", "page", "annotation"];
|
||||
|
||||
interface CreateLinkOptions {
|
||||
title?: string;
|
||||
@@ -257,6 +263,7 @@ export function calculateHash(
|
||||
hoistedNoteId && hoistedNoteId !== "root" ? { hoistedNoteId } : null,
|
||||
viewScope.viewMode && viewScope.viewMode !== "default" ? { viewMode: viewScope.viewMode } : null,
|
||||
viewScope.attachmentId ? { attachmentId: viewScope.attachmentId } : null,
|
||||
viewScope.block ? { block: viewScope.block } : null,
|
||||
viewScope.column ? { column: viewScope.column } : null,
|
||||
viewScope.columnTitle ? { columnTitle: viewScope.columnTitle } : null,
|
||||
viewScope.columnIcon ? { columnIcon: viewScope.columnIcon } : null,
|
||||
@@ -278,7 +285,10 @@ export function calculateHash(
|
||||
|
||||
/* v8 ignore next -- `value` is never undefined: every retained pair holds a string. It
|
||||
can be empty, but only for a `splits` list whose panes are all empty. */
|
||||
return `${encodeURIComponent(name)}=${encodeURIComponent(value || "")}`;
|
||||
const encodedValue = name === "block"
|
||||
? encodeBlockParameter(value || "")
|
||||
: encodeURIComponent(value || "");
|
||||
return `${encodeURIComponent(name)}=${encodedValue}`;
|
||||
})
|
||||
.join("&");
|
||||
|
||||
@@ -649,7 +659,15 @@ function linkContextMenu(e: PointerEvent) {
|
||||
linkContextMenuService.openContextMenu(notePath, e, viewScope, null);
|
||||
}
|
||||
|
||||
async function loadReferenceLinkTitle($el: JQuery<HTMLElement>, href: string | null | undefined = null) {
|
||||
/**
|
||||
* Fills `$el` with the label of the reference link to `href`. A link to blocks of `hostNoteId`, the
|
||||
* note the link is in, shows only the text of the blocks.
|
||||
*/
|
||||
async function loadReferenceLinkTitle(
|
||||
$el: JQuery<HTMLElement>,
|
||||
href: string | null | undefined = null,
|
||||
hostNoteId?: string
|
||||
) {
|
||||
const $link = $el[0].tagName === "A" ? $el : $el.find("a");
|
||||
|
||||
href = href || $link.attr("href");
|
||||
@@ -674,6 +692,16 @@ async function loadReferenceLinkTitle($el: JQuery<HTMLElement>, href: string | n
|
||||
const subjectId = viewScope?.card || noteId;
|
||||
const note = subjectId ? await froca.getNote(subjectId, true) : null;
|
||||
|
||||
if (viewScope?.block && note && noteId === hostNoteId) {
|
||||
const label = await loadBlockReferenceLabel(note, viewScope.block);
|
||||
if (label) {
|
||||
$el.text(label.text)
|
||||
.toggleClass("block-reference-broken", label.isBroken)
|
||||
.prepend($("<span>").addClass("tn-icon bx bx-paragraph"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (note) {
|
||||
$el.addClass(note.getColorClass());
|
||||
}
|
||||
@@ -689,6 +717,18 @@ async function loadReferenceLinkTitle($el: JQuery<HTMLElement>, href: string | n
|
||||
));
|
||||
}
|
||||
|
||||
if (viewScope?.block && note) {
|
||||
const label = await loadBlockReferenceLabel(note, viewScope.block);
|
||||
if (label) {
|
||||
$el.append($("<small>")
|
||||
.toggleClass("block-reference-broken", label.isBroken)
|
||||
.append(
|
||||
$("<span>").addClass("bx bx-paragraph"),
|
||||
document.createTextNode(label.text)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
if (viewScope?.page) {
|
||||
$el.append($("<small>").append(
|
||||
$("<span>").addClass(viewScope.annotation ? "bx bx-comment-detail" : "bx bx-file"),
|
||||
@@ -765,6 +805,13 @@ function getReferenceLinkTitleSync(href: string) {
|
||||
return `${note.title} - ${viewScope.bookmark}`;
|
||||
}
|
||||
|
||||
const blockLabel = viewScope?.block
|
||||
? getCachedBlockReferenceLabel(note, viewScope.block)
|
||||
: null;
|
||||
if (blockLabel && !blockLabel.isBroken) {
|
||||
return `${note.title} - ${blockLabel.text}`;
|
||||
}
|
||||
|
||||
if (viewScope?.page) {
|
||||
return `${note.title} - ${getPdfReferenceLabel(viewScope.page, viewScope.annotation)}`;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ const {
|
||||
getRenderedContent,
|
||||
getNoteTitleWithPathAsSuffix,
|
||||
getActiveContext,
|
||||
revealHighlightedBlocks,
|
||||
t
|
||||
} = vi.hoisted(() => ({
|
||||
parseNavigationStateFromUrl: vi.fn(),
|
||||
@@ -16,6 +17,7 @@ const {
|
||||
getRenderedContent: vi.fn(),
|
||||
getNoteTitleWithPathAsSuffix: vi.fn(),
|
||||
getActiveContext: vi.fn(),
|
||||
revealHighlightedBlocks: vi.fn(),
|
||||
t: vi.fn((key: string) => key)
|
||||
}));
|
||||
|
||||
@@ -41,6 +43,8 @@ vi.mock("../components/app_context.js", () => ({
|
||||
|
||||
vi.mock("./i18n.js", () => ({ t }));
|
||||
|
||||
vi.mock("./block_reference.js", () => ({ revealHighlightedBlocks }));
|
||||
|
||||
// Imports AFTER vi.mock calls.
|
||||
import DeletedFNote from "../entities/deleted_fnote.js";
|
||||
import froca from "./froca.js";
|
||||
@@ -638,6 +642,7 @@ describe("mouseEnterHandler", () => {
|
||||
// color class folded into the tooltip template
|
||||
expect(initCall?.[0].template).toContain("color-blue");
|
||||
expect(tooltipMock).toHaveBeenCalledWith("show");
|
||||
expect(revealHighlightedBlocks).not.toHaveBeenCalled();
|
||||
|
||||
// the watchdog re-arms while still hovering...
|
||||
await vi.advanceTimersByTimeAsync(1000);
|
||||
@@ -648,6 +653,40 @@ describe("mouseEnterHandler", () => {
|
||||
const disposeAfter = tooltipMock.mock.calls.filter((c) => c[0] === "dispose").length;
|
||||
expect(disposeAfter).toBeGreaterThan(disposeBefore);
|
||||
});
|
||||
|
||||
it("highlights the blocks of a block link and scrolls its tooltip to them", async () => {
|
||||
vi.useFakeTimers();
|
||||
const $link = makeLink('<a href="#root/abc?block=b1">x</a>');
|
||||
parseNavigationStateFromUrl.mockReturnValue({
|
||||
notePath: "root/abc",
|
||||
noteId: "abc",
|
||||
viewScope: { viewMode: "default", block: "b1" }
|
||||
});
|
||||
const note = fakeNote({ noteId: "abc", bestPath: "root/abc" });
|
||||
froca.getNote = vi.fn(async () => note) as any;
|
||||
hoverActive = true;
|
||||
// Insert the tooltip on show, as Bootstrap does.
|
||||
const $tooltip = $("<div>");
|
||||
($.fn as any).tooltip = vi.fn(function (this: unknown, arg: unknown) {
|
||||
if (arg && typeof arg === "object" && "title" in arg) {
|
||||
$tooltip.html(String(arg.title));
|
||||
} else if (arg === "show") {
|
||||
$("body").append($tooltip.addClass(String($link.attr("data-link-id"))));
|
||||
}
|
||||
return this;
|
||||
});
|
||||
|
||||
const promise = mouseEnterHandler.call($link[0], eventFor($link));
|
||||
await vi.advanceTimersByTimeAsync(600);
|
||||
await promise;
|
||||
|
||||
expect(getRenderedContent)
|
||||
.toHaveBeenCalledWith(note, expect.objectContaining({ highlightBlock: "b1" }));
|
||||
const tooltipContent = $tooltip.find(".note-tooltip-content")[0];
|
||||
expect(tooltipContent).toBeDefined();
|
||||
expect(revealHighlightedBlocks).toHaveBeenCalledWith(tooltipContent);
|
||||
$tooltip.remove();
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,6 +2,7 @@ import appContext from "../components/app_context.js";
|
||||
import type FAttachment from "../entities/fattachment.js";
|
||||
import type FNote from "../entities/fnote.js";
|
||||
import attributeRenderer from "./attribute_renderer.js";
|
||||
import { revealHighlightedBlocks } from "./block_reference.js";
|
||||
import contentRenderer from "./content_renderer.js";
|
||||
import froca from "./froca.js";
|
||||
import { t } from "./i18n.js";
|
||||
@@ -114,7 +115,7 @@ export async function mouseEnterHandler<T>(this: HTMLElement, e: JQuery.Triggere
|
||||
// Default route: a live note. A missing note (deleted/erased) renders the "note has been
|
||||
// deleted" placeholder — content previews of deleted notes are opt-in via `data-note-deleted`.
|
||||
note = await froca.getNote(noteId);
|
||||
renderPromise = renderTooltip(note, detail);
|
||||
renderPromise = renderTooltip(note, detail, viewScope?.block);
|
||||
}
|
||||
|
||||
const [content] = await Promise.all([
|
||||
@@ -164,6 +165,11 @@ export async function mouseEnterHandler<T>(this: HTMLElement, e: JQuery.Triggere
|
||||
|
||||
openTooltipElements.push($link);
|
||||
|
||||
const tooltipContent = $(`.${linkId} .note-tooltip-content`).get(0);
|
||||
if (viewScope?.block && tooltipContent) {
|
||||
revealHighlightedBlocks(tooltipContent);
|
||||
}
|
||||
|
||||
// Dismiss the tooltip immediately if a link was clicked inside the tooltip.
|
||||
$(`.${tooltipClass} a`).on("click", (e) => {
|
||||
dismissAllTooltips();
|
||||
@@ -192,8 +198,13 @@ export async function mouseEnterHandler<T>(this: HTMLElement, e: JQuery.Triggere
|
||||
* @param detail plain text the trigger element contributed about this note (see the `data-tooltip-detail`
|
||||
* attribute), shown under the title. Absent on the vast majority of links, which say
|
||||
* nothing beyond the note itself.
|
||||
* @param block the blocks of the note to highlight, a `block` link parameter.
|
||||
*/
|
||||
export async function renderTooltip(entity: FNote | FAttachment | null, detail?: string) {
|
||||
export async function renderTooltip(
|
||||
entity: FNote | FAttachment | null,
|
||||
detail?: string,
|
||||
block?: string
|
||||
) {
|
||||
const attachment = entity && "attachmentId" in entity ? entity : null;
|
||||
const note = attachment ? attachment.getNote() : entity as FNote | null;
|
||||
if (!entity || !note) {
|
||||
@@ -223,7 +234,8 @@ export async function renderTooltip(entity: FNote | FAttachment | null, detail?:
|
||||
|
||||
const { $renderedContent } = await contentRenderer.getRenderedContent(entity, {
|
||||
tooltip: true,
|
||||
trim: true
|
||||
trim: true,
|
||||
highlightBlock: block
|
||||
});
|
||||
const isContentEmpty = $renderedContent[0].innerHTML.length === 0;
|
||||
|
||||
|
||||
@@ -123,7 +123,6 @@
|
||||
"date_time": "التاريخ والوقت",
|
||||
"close_button_title": "الغاء التغييرات و اغلاق",
|
||||
"workspace_calendar_root": "تحديد جذر التقويم لكل مساحة عمل",
|
||||
"hide_highlight_widget": "اخفاء عنصر واجهة قائمة التمييزات",
|
||||
"is_owned_by_note": "تخص الملاحظة",
|
||||
"related_notes_title": "ملاحظات اخرى بنفس التسمية",
|
||||
"target_note_title": "العلاقة هي اتصال مُسمّى بين ملاحظة مصدر وملاحظة هدف.",
|
||||
@@ -178,7 +177,6 @@
|
||||
"display_relations": "أسماء العلاقات مفصولة بفواصل والتي يجب عرضها. سيتم إخفاء جميع العلاقات الأخرى.",
|
||||
"hide_relations": "أسماء العلاقات مفصولة بفواصل والتي يجب إخفاؤها. سيتم عرض جميع العلاقات الأخرى.",
|
||||
"template": "ستظهر هذه الملاحظة ضمن قائمة القوالب المتاحة عند إنشاء ملاحظة جديدة",
|
||||
"toc": "<code>#toc</code> أو <code>#toc=show</code> سيجبر عرض جدول المحتويات، بينما <code>#toc=hide</code> سيجبر إخفاءه. إذا لم يكن الوسم موجودًا، سيتم اتباع الإعداد العام",
|
||||
"color": "يحدد لون الملاحظة في شجرة الملاحظات والروابط وغيرها. يمكن استخدام أي قيمة لون CSS صالحة مثل 'red' أو #a13d5f",
|
||||
"keyboard_shortcut": "يحدد اختصار لوحة مفاتيح يؤدي مباشرة إلى الانتقال إلى هذه الملاحظة. مثال: 'ctrl+alt+e'. يتطلب إعادة تحميل الواجهة الأمامية لتطبيق التغيير.",
|
||||
"keep_current_hoisting": "لن يؤدي فتح هذا الرابط إلى تغيير حالة التركيز (hoisting)، حتى إذا كانت الملاحظة غير قابلة للعرض ضمن الشجرة الحالية المُركّز عليها.",
|
||||
@@ -343,15 +341,6 @@
|
||||
"search_notes": "بحث في الملاحظات",
|
||||
"reload_hint": "يمكن أن يساعد إعادة التحميل في إصلاح بعض مشاكل العرض البصري دون الحاجة لإعادة تشغيل التطبيق بالكامل."
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "العلاقة",
|
||||
"backlink_zero": "",
|
||||
"backlink_one": "{{count}} رابط راجع",
|
||||
"backlink_two": "",
|
||||
"backlink_few": "",
|
||||
"backlink_many": "{{count}} روابط راجعة",
|
||||
"backlink_other": ""
|
||||
},
|
||||
"note_icon": {
|
||||
"search": "بحث:",
|
||||
"change_note_icon": "تغيير ايقونة الملاحظة",
|
||||
@@ -370,10 +359,8 @@
|
||||
"search_placeholder_other": "البحث عن {{number}} من الأيقونات عبر {{count}} حزمة."
|
||||
},
|
||||
"basic_properties": {
|
||||
"language": "اللغة",
|
||||
"editable": "قابل للتعديل",
|
||||
"note_type": "نوع الملاحظة",
|
||||
"basic_properties": "الخصائص الاساسية",
|
||||
"configure_code_notes": "اعداد ملاحظات الكود..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -408,22 +395,11 @@
|
||||
"file_properties": {
|
||||
"download": "تنزيل",
|
||||
"open": "فتح خارجيًا.",
|
||||
"title": "ملف",
|
||||
"note_id": "معرف الملاحظة",
|
||||
"file_type": "نوع الملف",
|
||||
"file_size": "حجم الملف",
|
||||
"original_file_name": "اسم الملف الاصلي",
|
||||
"upload_new_revision": "رفع مراجعة جديدة",
|
||||
"upload_success": "تم رفع نسخة جديدة من الملف.",
|
||||
"upload_failed": "فشل رفع نسخة جديدة من الملف."
|
||||
},
|
||||
"image_properties": {
|
||||
"download": "تنزيل",
|
||||
"open": "فتح",
|
||||
"title": "صورة",
|
||||
"file_type": "نوع الملف",
|
||||
"file_size": "حجم الملف",
|
||||
"original_file_name": "اسم الملف الاصلي",
|
||||
"upload_new_revision": "رفع مراجعة جديدة",
|
||||
"copy_reference_to_clipboard": "نسخ المرجع الى الحافظة",
|
||||
"upload_success": "تم رفع نسخة جديدة من الصورة.",
|
||||
@@ -453,15 +429,8 @@
|
||||
"title": "مسارات الملاحظة",
|
||||
"clone_button": "جار نسخ الملاحظة الى مكان جديد...",
|
||||
"intro_not_placed": "هذه الملاحظة لم يتم وضعها بعد في شجرة الملاحظات.",
|
||||
"intro_placed": "تم وضع هذه الملاحظة في المسارات التالية:",
|
||||
"outside_hoisted": "هذا المسار يقع خارج الملاحظة المُثبّتة، وستحتاج إلى إلغاء التثبيت للوصول إليه."
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "استعلام",
|
||||
"script": "برنامج نصي",
|
||||
"execute_query": "تنفيذ الاستعلام",
|
||||
"execute_script": "تنفيذ السكربت"
|
||||
},
|
||||
"search_definition": {
|
||||
"ancestor": "السلف",
|
||||
"limit": "الحد الاقصى",
|
||||
@@ -766,14 +735,8 @@
|
||||
"confirm_undelete": "هل تريد استعادة هذه الملاحظة وجميع الملاحظات الفرعية التابعة لها؟"
|
||||
},
|
||||
"edited_notes": {
|
||||
"deleted": "(حذف)",
|
||||
"title": "الملاحظات المعدلة",
|
||||
"no_edited_notes_found": "لا توجد ملاحظات تم تعديلها في هذا اليوم حتى الآن..."
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "معلومات",
|
||||
"this_note_was_originally_taken_from": "تم أخذ هذه الملاحظة في الأصل من:"
|
||||
},
|
||||
"backend_log": {
|
||||
"refresh": "تحديث"
|
||||
},
|
||||
@@ -1003,9 +966,7 @@
|
||||
"close": "أغلاق"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "علامة مرجعية",
|
||||
"remove_bookmark": "ازالة الاشارة المرجعية",
|
||||
"bookmark_this_note": "إضافة إشارة مرجعية لهذه الملاحظة إلى اللوحة الجانبية اليسرى"
|
||||
"bookmark": "علامة مرجعية"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "تلقائي",
|
||||
@@ -1028,7 +989,6 @@
|
||||
"copy_tab_to_new_window": "نسخ هذا التبويب إلى نافذة جديدة"
|
||||
},
|
||||
"toc": {
|
||||
"options": "خيارات",
|
||||
"table_of_contents": "جدول المحتويات",
|
||||
"no_headings": "بدون عناوين."
|
||||
},
|
||||
@@ -1077,13 +1037,10 @@
|
||||
"dismiss": "تجاهل",
|
||||
"background_effects_button": "تفعيل مؤثرات الخلفية",
|
||||
"next_theme_button": "جرب النسق الجديد",
|
||||
"new_layout_title": "تخطيط جديد",
|
||||
"new_layout_button": "مزيد من المعلومات",
|
||||
"next_theme_title": "جرّب سمة Trilium الجديدة",
|
||||
"background_effects_title": "أصبحت تأثيرات الخلفية الآن مستقرة",
|
||||
"next_theme_message": "أنت تستخدم حاليًا السمة القديمة، هل ترغب في تجربة السمة الجديدة؟",
|
||||
"background_effects_message": "على أجهزة Windows وmacOS، أصبحت تأثيرات الخلفية الآن مستقرة. تضيف هذه التأثيرات لمسة من اللون إلى واجهة المستخدم من خلال تشويش الخلفية خلفها.",
|
||||
"new_layout_message": "لقد قدمنا تخطيطًا مُحدَّثًا لـ Trilium Notes. تمت إزالة الشريط (Ribbon) ودمجه بسلاسة داخل الواجهة الرئيسية، مع شريط حالة جديد وأقسام قابلة للتوسيع (مثل السمات المروّجة) لتولي الوظائف الأساسية.\n\nيتم تمكين التخطيط الجديد افتراضيًا، ويمكن تعطيله مؤقتًا من خلال: الخيارات → المظهر."
|
||||
"background_effects_message": "على أجهزة Windows وmacOS، أصبحت تأثيرات الخلفية الآن مستقرة. تضيف هذه التأثيرات لمسة من اللون إلى واجهة المستخدم من خلال تشويش الخلفية خلفها."
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
@@ -1100,13 +1057,6 @@
|
||||
"cloned_note_prefix_title": "سيتم عرض الملاحظة المستنسخة في شجرة الملاحظات مع البادئة المحددة",
|
||||
"note_cloned": "تم استنساخ الملاحظة \"{{clonedTitle}}\" إلى \"{{targetTitle}}\""
|
||||
},
|
||||
"table_of_contents": {
|
||||
"unit": "عناوين",
|
||||
"title": "جدول المحتويات",
|
||||
"disable_info": "يمكنك أيضًا استخدام هذا الخيار لتعطيل جدول المحتويات (TOC) بشكل فعّال عبر تعيين قيمة كبيرة جدًا.",
|
||||
"shortcut_info": "يمكنك إعداد اختصار لوحة مفاتيح للتبديل السريع للوحة اليمنى (بما في ذلك جدول المحتويات TOC) من خلال: الخيارات → الاختصارات (بالاسم 'toggleRightPane').",
|
||||
"description": "سيظهر جدول المحتويات في الملاحظات النصية عندما يتجاوز عدد العناوين حدًا محددًا. يمكنك تخصيص هذا الرقم:"
|
||||
},
|
||||
"tree-context-menu": {
|
||||
"archive": "أرشفة",
|
||||
"unarchive": "الغاء الارشفة",
|
||||
@@ -1178,15 +1128,11 @@
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "مشترك",
|
||||
"toggle-on-title": "مشاركة الملاحظة",
|
||||
"toggle-off-title": "إلغاء مشاركة الملاحظة",
|
||||
"shared-branch": "هذه الملاحظة موجودة فقط كملاحظة مشتركة، وإلغاء المشاركة سيؤدي إلى حذفها. هل تريد المتابعة وبالتالي حذف هذه الملاحظة؟",
|
||||
"inherited": "لا يمكن إلغاء مشاركة هذه الملاحظة هنا لأنها تتم مشاركتها عبر الوراثة من ملاحظة أصل."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "قالب",
|
||||
"toggle-on-hint": "جعل الملاحظة قالبًا",
|
||||
"toggle-off-hint": "إزالة الملاحظة كقالب"
|
||||
"template": "قالب"
|
||||
},
|
||||
"find": {
|
||||
"replace": "استبدال",
|
||||
@@ -1197,8 +1143,6 @@
|
||||
"find_placeholder": "البحث في النص..."
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"options": "خيارات",
|
||||
"title": "قائمة التضليلات",
|
||||
"menu_configure": "تهيئة قائمة التمييزات...",
|
||||
"no_highlights": "لا توجد عناصر مميزة.",
|
||||
"title_with_count_zero": "{{count}} تمييز",
|
||||
@@ -1269,21 +1213,16 @@
|
||||
"editor_crashed_details_title": "معلومات تقنية",
|
||||
"keeps-crashing": "مكوّن التحرير يتعطّل باستمرار. يُرجى محاولة إعادة تشغيل Trilium. إذا استمرت المشكلة، ففكّر في إنشاء تقرير خطأ."
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "تنسيق"
|
||||
},
|
||||
"editor": {
|
||||
"title": "محرر"
|
||||
},
|
||||
"editing": {
|
||||
"editor_type": {
|
||||
"floating": {
|
||||
"title": "عائم",
|
||||
"description": "تظهر أدوات التحرير بالقرب من المؤشر؛"
|
||||
"title": "عائم"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "مثبت",
|
||||
"description": "تظهر أدوات التحرير في تبويب \"التنسيق\" ضمن الشريط."
|
||||
"title": "مثبت"
|
||||
},
|
||||
"label": "شريط ادوات التنسيق",
|
||||
"toolbar_style": "نمط شريط الأدوات",
|
||||
@@ -1457,26 +1396,17 @@
|
||||
"electron_api_docs_button_title": "فتح توثيق واجهة برمجة تطبيقات Electron",
|
||||
"sql_console_saved_message": "تم حفظ ملاحظة وحدة تحكم SQL في {{note_path}}"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "اخفاء الازرار"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "عرض الازرار"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "إنشاء ملاحظة فرعية وإضافتها إلى الخريطة"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "السمات الموروثة",
|
||||
"no_inherited_attributes": "لاتوجد سمات موروثة.",
|
||||
"none": "لاشيء"
|
||||
},
|
||||
"note_map": {
|
||||
"title": "خريطة الملاحظة",
|
||||
"fix-nodes": "اصلاح العقد",
|
||||
"link-distance": "مسافة الرابط",
|
||||
"open_full": "توسيع للعرض الكامل",
|
||||
"collapse": "طي الى الحجم الطبيعي",
|
||||
"show-anyway": "عرض الخريطة",
|
||||
"too-many-notes_zero": "يوجد {{count}} ملاحظة هنا. عرضها جميعًا قد يؤدي إلى بطء الأداء.",
|
||||
"too-many-notes_one": "",
|
||||
@@ -1485,9 +1415,6 @@
|
||||
"too-many-notes_many": "",
|
||||
"too-many-notes_other": ""
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "السمات المملوكة"
|
||||
},
|
||||
"similar_notes": {
|
||||
"title": "ملاحظات مشابهة",
|
||||
"no_similar_notes_found": "لاتوجد ملاحظة مشابهة."
|
||||
@@ -1581,9 +1508,6 @@
|
||||
"description": "سيؤدي هذا إلى إعادة بناء قاعدة البيانات، مما يؤدي عادةً إلى تقليل حجم ملف قاعدة البيانات. لن يتم تغيير أي بيانات فعليًا.",
|
||||
"vacuum_description": "إعادة بناء قاعدة البيانات لتقليل حجم الملف. لن يتم تغيير أي بيانات."
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "سيتم فتح تبويب الشريط \"الملاحظات المعدلة\" تلقائيًا عند ملاحظات اليوم"
|
||||
},
|
||||
"vim_key_bindings": {
|
||||
"use_vim_keybindings_in_code_notes": "اختصارات لوحة المفاتيح باسلوب Vim",
|
||||
"enable_vim_keybindings": "تفعيل اختصارات Vim في ملاحظات الكود (بدون وضع ex)"
|
||||
@@ -1604,14 +1528,8 @@
|
||||
"italic": "نص مائل",
|
||||
"underline": "خط تحت النص",
|
||||
"color": "نص ملون",
|
||||
"visibility_title": "اظهار قائمة التضليلات",
|
||||
"bg_color": "نص مع لون خلفية",
|
||||
"description": "يمكنك تخصيص قائمة التمييزات المعروضة في اللوحة اليمنى:",
|
||||
"shortcut_info": "يمكنك إعداد اختصار لوحة مفاتيح للتبديل السريع للوحة اليمنى (بما في ذلك التمييزات) من خلال: الخيارات → الاختصارات (باسم 'toggleRightPane').",
|
||||
"visibility_description": "يمكنك إخفاء أداة التمييز (Highlights widget) لكل ملاحظة على حدة عبر إضافة الوسم #hideHighlightWidget."
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "مراجعات الملاحظة"
|
||||
"description": "يمكنك تخصيص قائمة التمييزات المعروضة في اللوحة اليمنى:"
|
||||
},
|
||||
"custom_date_time_format": {
|
||||
"format_string": "سلسلة التنسيق",
|
||||
@@ -1715,10 +1633,6 @@
|
||||
"title": "لغات المحتوى",
|
||||
"description": "اختر لغة واحدة أو أكثر لعرضها في قائمة اختيار اللغة ضمن قسم الخصائص الأساسية في الملاحظة النصية (سواء كانت للقراءة فقط أو قابلة للتعديل). سيسمح ذلك بتفعيل ميزات مثل التدقيق الإملائي، ودعم الكتابة من اليمين إلى اليسار، واستخراج النص (OCR)."
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "الغاء قفل التحرير",
|
||||
"lock-editing": "قفل التحرير"
|
||||
},
|
||||
"cpu_arch_warning": {
|
||||
"continue_anyway": "المتابعة على اي حال",
|
||||
"download_link": "تنزيل النسخة الاصلية",
|
||||
@@ -1806,9 +1720,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "انشاء تقسيم جديد"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "تعديل هذه الملاحظة"
|
||||
},
|
||||
"include_archived_notes": {
|
||||
"include_archived_notes": "تضمين الملاحظات المؤرشفة"
|
||||
},
|
||||
@@ -1843,10 +1754,7 @@
|
||||
"create-note": "إنشاء ملاحظة فرعية وربطها \"{{term}}\""
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-off": "إزالة الحماية عن الملاحظة",
|
||||
"toggle-on": "حماية الملاحظة",
|
||||
"toggle-on-hint": "الملاحظة غير محمة، انقر لحمايتها",
|
||||
"toggle-off-hint": "الملاحظة محمية، انقر لإزالة الحماية منها"
|
||||
"toggle-on": "حماية الملاحظة"
|
||||
},
|
||||
"open-help-page": "فتح صفحة المساعدة",
|
||||
"empty": {
|
||||
@@ -1893,9 +1801,6 @@
|
||||
"consistency-checks-failed": "فشل التحقق من الاتساق! راجع السجلات للتفاصيل.",
|
||||
"encountered-error": "تمت مواجهة خطأ \"{{message}}\"، تحقق من وحدة التحكم."
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "عرض قائمة التضليلات"
|
||||
},
|
||||
"presentation_view": {
|
||||
"start-presentation": "بدء العرض التقديمي",
|
||||
"edit-slide": "تعديل هذه الشريحة",
|
||||
@@ -1913,12 +1818,6 @@
|
||||
"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": "حذف خيار البحث هذا",
|
||||
"failed_rendering": "فشل عرض خيار البحث: {{dto}} مع خطأ: {{error}} {{stack}}"
|
||||
@@ -1974,9 +1873,6 @@
|
||||
"content_widget": {
|
||||
"unknown_widget": "عنصر واجهة غير معروف للمعرف \"{{id}}\"."
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "تصدير المخطط كملف PNG"
|
||||
},
|
||||
"protected_session_status": {
|
||||
"inactive": "انقر للدخول الى جلسة محمية",
|
||||
"active": "الجلسة المحمية نشطة. انقر لمغادرة الجلسة المحمية."
|
||||
@@ -2433,9 +2329,7 @@
|
||||
"delete_note": "جار حذف الملاحظة..."
|
||||
},
|
||||
"read-only-info": {
|
||||
"edit-note": "تحرير الملاحظة",
|
||||
"read-only-note": "أنت حاليًا تعرض ملاحظة للقراءة فقط.",
|
||||
"auto-read-only-note": "هذه الملاحظة معروضة في وضع القراءة فقط لتحميل أسرع."
|
||||
"edit-note": "تحرير الملاحظة"
|
||||
},
|
||||
"code_mime_types": {
|
||||
"tooltip_syntax_highlighting": "تلوين بناء الجمل",
|
||||
@@ -2445,18 +2339,13 @@
|
||||
},
|
||||
"experimental_features": {
|
||||
"title": "الخيارات التجريبية",
|
||||
"new_layout_name": "تخطيط جديد",
|
||||
"llm_name": "دردشة الذكاء الاصطناعي / نموذج اللغة الكبير",
|
||||
"new_layout_description": "جرّب التخطيط الجديد للحصول على مظهر أكثر حداثة وتحسين في سهولة الاستخدام. قد يخضع لتغييرات كبيرة في الإصدارات القادمة.",
|
||||
"disclaimer": "هذه الخيارات تجريبية وقد تسبب عدم استقرار. استخدمها بحذر.",
|
||||
"llm_description": "تفعيل الشريط الجانبي للدردشة بالذكاء الاصطناعي وملاحظات الدردشة المعتمدة على نماذج اللغة الكبيرة (LLMs)."
|
||||
},
|
||||
"settings_appearance": {
|
||||
"ui": "واجهة المستخدم",
|
||||
"ui_old_layout": "التخطيط القديم",
|
||||
"ui_new_layout": "التخطيط الجديد",
|
||||
"ui_layout_orientation": "اتجاه شريط الإطلاق",
|
||||
"ui_layout_style": "نمط التخطيط",
|
||||
"related_code_notes": "نظام ألوان لملاحظات الكود",
|
||||
"related_code_blocks": "نظام الألوان لمقاطع الشيفرة في الملاحظات النصية"
|
||||
},
|
||||
@@ -2614,14 +2503,6 @@
|
||||
"onclick_button": {
|
||||
"no_click_handler": "أداة الزر \"{{componentId}}\" لا تحتوي على معالج نقر (click handler) محدد."
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "نسخ مرجع الصورة إلى الحافظة، ويمكن لصقه في ملاحظة نصية."
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "هذه الملاحظة مُشارَكة بشكل عام على {{- link}}.",
|
||||
"help_link": "للمساعدة، قم بزيارة <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">الويكي</a>.",
|
||||
"shared_locally": "هذه الملاحظة مشتركة محليًا على {{- link}}."
|
||||
},
|
||||
"switch_layout_button": {
|
||||
"title_vertical": "نقل لوحة التحرير إلى الأسفل",
|
||||
"title_horizontal": "نقل لوحة التحرير إلى اليسار"
|
||||
|
||||
@@ -163,15 +163,11 @@
|
||||
"advanced": "Avançat",
|
||||
"logout": "Tanca la sessió"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "relació"
|
||||
},
|
||||
"note_icon": {
|
||||
"search": "Cerca:"
|
||||
},
|
||||
"basic_properties": {
|
||||
"editable": "Editable",
|
||||
"language": "Llengua"
|
||||
"editable": "Editable"
|
||||
},
|
||||
"book_properties": {
|
||||
"grid": "Graella",
|
||||
@@ -182,18 +178,9 @@
|
||||
"table": "Taula",
|
||||
"board": "Tauler"
|
||||
},
|
||||
"edited_notes": {
|
||||
"deleted": "(suprimit)"
|
||||
},
|
||||
"file_properties": {
|
||||
"download": "Descarrega",
|
||||
"open": "Obre",
|
||||
"title": "Fitxer"
|
||||
},
|
||||
"image_properties": {
|
||||
"download": "Descarrega",
|
||||
"open": "Obre",
|
||||
"title": "Imatge"
|
||||
"open": "Obre"
|
||||
},
|
||||
"note_info_widget": {
|
||||
"created": "Creat",
|
||||
|
||||
@@ -450,7 +450,6 @@
|
||||
"hide_relations": "应隐藏的关系名称,以逗号分隔。其余关系将显示。",
|
||||
"title_template": "作为此笔记子笔记创建的笔记的默认标题。该值将作为 JavaScript 字符串来解析\n 并因此可以通过注入的 <code>now</code> 和 <code>parentNote</code> 变量来丰富动态内容。示例:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')} 的文学作品s</code></li>\n <li><code>Log ${now.format('YYYY-MM-DD HH:mm:ss')} 的日志}</code></li>\n </ul>\n \n 详情请参阅 <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki with details</a>, <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> 的 API 文档以及 <a href=\"https://day.js.org/docs/en/display/format\">now</a> 的 API 文档。",
|
||||
"template": "此笔记将出现在新建笔记时的可用模板列表中。",
|
||||
"toc": "<code>#toc</code> 或 <code>#toc=show</code> 将强制显示目录。<code>#toc=hide</code> 将强制隐藏它。如果标签不存在,则遵守全局设置。",
|
||||
"color": "定义笔记在笔记树、链接等处的颜色。可使用任何有效的 CSS 颜色值,例如 'red' 或 #a13d5f。",
|
||||
"keyboard_shortcut": "定义立即跳转到此笔记的键盘快捷键。示例:'ctrl+alt+e'。需要前端重载才能生效。",
|
||||
"keep_current_hoisting": "即使笔记不在当前聚焦的子树中显示,打开此链接也不会改变聚焦。",
|
||||
@@ -458,7 +457,6 @@
|
||||
"execute_description": "当前代码笔记的详细说明,与执行按钮一同显示。",
|
||||
"exclude_from_note_map": "含有此标签的笔记将从笔记地图中隐藏。",
|
||||
"new_notes_on_top": "新笔记将创建在父笔记的顶部,而不是底部。",
|
||||
"hide_highlight_widget": "隐藏此笔记的高亮列表,其他笔记的高亮列表仍保持显示。",
|
||||
"run_on_note_creation": "在后端创建笔记时执行。如果要为在特定子树下创建的所有笔记运行脚本,请使用此关系。在这种情况下,在子树根笔记上创建它并使其可继承。在子树中的任何深度创建新笔记都会触发脚本。",
|
||||
"run_on_child_note_creation": "在此关系所定义的笔记下创建新笔记时执行。",
|
||||
"run_on_note_title_change": "当笔记标题修改时执行(包括笔记创建)。",
|
||||
@@ -501,7 +499,6 @@
|
||||
"add_option": "添加此选项",
|
||||
"remove_option": "移除此选项",
|
||||
"versioning_limit": "限制此笔记保留的版本数量,覆盖全局设置。",
|
||||
"similar_notes_widget_disabled": "禁用此笔记的「相似笔记」功能区选项卡。仅限旧版布局。",
|
||||
"llm_chat_home": "新建的 AI 对话将创建为此笔记的子笔记。",
|
||||
"workspace_llm_chat_home": "当视图聚焦到此工作区的某个祖先笔记时,新建的 AI 对话会成为此笔记的子笔记。",
|
||||
"date_pattern": "此日历根节点下生成的日记笔记的标题格式,例如 <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -860,15 +857,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "拆分面板"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "编辑此笔记"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "显示目录"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "显示高亮列表"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "菜单",
|
||||
"options": "选项",
|
||||
@@ -969,9 +957,6 @@
|
||||
"active": "受保护的会话已激活。点击退出受保护的会话。",
|
||||
"inactive": "点击进入受保护的会话"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "笔记修订版本"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "有更新可用"
|
||||
},
|
||||
@@ -986,25 +971,11 @@
|
||||
"sql_console_saved_message": "SQL 控制台已保存到 {{note_path}}",
|
||||
"electron_api_docs_button_title": "打开 Electron API 文档"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "复制图片引用到剪贴板,可粘贴到文本笔记中。"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "隐藏按钮"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "显示按钮"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "导出SVG格式图片"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "创建子笔记并添加到图",
|
||||
"create_child_note_text": "添加笔记"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "关系",
|
||||
"backlink_other": "{{count}} 个反链",
|
||||
"no_backlinks": "没有笔记链接到这篇笔记。"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1032,8 +1003,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "笔记类型",
|
||||
"editable": "可编辑",
|
||||
"basic_properties": "基本属性",
|
||||
"language": "语言",
|
||||
"configure_code_notes": "配置代码笔记…"
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1063,37 +1032,23 @@
|
||||
"open_all_limit_exceeded": "一次性打开的笔记过多({{count}} 个)。上限为 {{max}} 个,请先缩小结果范围。"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "今天还没有编辑过的笔记...",
|
||||
"title": "编辑过的笔记",
|
||||
"deleted": "(已删除)"
|
||||
"no_edited_notes_found": "今天还没有编辑过的笔记..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "笔记 ID",
|
||||
"original_file_name": "原始文件名",
|
||||
"file_type": "文件类型",
|
||||
"file_size": "文件大小",
|
||||
"download": "下载",
|
||||
"open": "用外部程序打开",
|
||||
"upload_new_revision": "上传新修订版本",
|
||||
"upload_success": "新文件修订版本已上传。",
|
||||
"upload_failed": "新文件修订版本上传失败。",
|
||||
"title": "文件"
|
||||
"upload_failed": "新文件修订版本上传失败。"
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "原始文件名",
|
||||
"file_type": "文件类型",
|
||||
"file_size": "文件大小",
|
||||
"download": "下载",
|
||||
"open": "打开",
|
||||
"copy_reference_to_clipboard": "复制引用到剪贴板",
|
||||
"upload_new_revision": "上传新修订版本",
|
||||
"upload_success": "新图像修订版本已上传。",
|
||||
"upload_failed": "新图像修订版本上传失败:{{message}}",
|
||||
"title": "图像"
|
||||
"upload_failed": "新图像修订版本上传失败:{{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "继承的属性",
|
||||
"no_inherited_attributes": "没有继承的属性。",
|
||||
"none": "无"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1110,8 +1065,6 @@
|
||||
"mime": "文件类型"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "展开显示",
|
||||
"collapse": "折叠到正常大小",
|
||||
"title": "笔记地图",
|
||||
"fix-nodes": "固定节点",
|
||||
"link-distance": "链接距离",
|
||||
@@ -1122,19 +1075,11 @@
|
||||
"note_paths": {
|
||||
"title": "笔记路径",
|
||||
"clone_button": "克隆笔记到新位置...",
|
||||
"intro_placed": "此笔记放置在以下路径中:",
|
||||
"intro_not_placed": "此笔记尚未放入笔记树中。",
|
||||
"outside_hoisted": "此路径在已聚焦笔记的范围之外,你需要取消聚焦才能访问。",
|
||||
"archived": "已归档",
|
||||
"search": "搜索"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "笔记来源:",
|
||||
"info": "信息"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "拥有的属性"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "升级属性",
|
||||
"unset-field-placeholder": "未设置",
|
||||
@@ -1163,12 +1108,6 @@
|
||||
"conflicting": "多个定义",
|
||||
"conflicting_tooltip": "这些条目以多种方式定义该属性,因此它按文本排序,且无法从条目菜单中设置。"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "查询",
|
||||
"script": "脚本",
|
||||
"execute_query": "执行查询",
|
||||
"execute_script": "执行脚本"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "添加搜索选项:",
|
||||
"search_string": "搜索字符串",
|
||||
@@ -1468,9 +1407,6 @@
|
||||
"enabled": "启用",
|
||||
"disabled": "禁用"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "日记笔记自动打开编辑过的笔记功能区标签页"
|
||||
},
|
||||
"theme": {
|
||||
"title": "用户界面",
|
||||
"theme_label": "应用主题",
|
||||
@@ -1632,17 +1568,7 @@
|
||||
"italic": "斜体",
|
||||
"underline": "下划线",
|
||||
"color": "字体颜色",
|
||||
"bg_color": "背景颜色",
|
||||
"visibility_title": "高亮列表可见性",
|
||||
"visibility_description": "你可以通过添加 #hideHighlightWidget 标签来隐藏单个笔记的高亮小部件。",
|
||||
"shortcut_info": "你可以在选项 -> 快捷键中为快速切换右侧面板(包括高亮列表)配置键盘快捷键(名称为 'toggleRightPane')。"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "目录",
|
||||
"description": "当笔记中有超过一定数量的标题时,显示目录。你可以自定义此数量:",
|
||||
"disable_info": "你可以设置一个非常大的数来禁用目录。",
|
||||
"shortcut_info": "你可以在 “选项” -> “快捷键” 中配置一个键盘快捷键,以便快速切换右侧面板(包括目录)(名称为 'toggleRightPane')。",
|
||||
"unit": "标题"
|
||||
"bg_color": "背景颜色"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "自动只读大小",
|
||||
@@ -1931,9 +1857,7 @@
|
||||
"kind_and_size": "{{role}} · {{size}}"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "书签",
|
||||
"bookmark_this_note": "将此笔记添加到左侧面板的书签",
|
||||
"remove_bookmark": "移除书签"
|
||||
"bookmark": "书签"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "自动",
|
||||
@@ -1988,13 +1912,6 @@
|
||||
"clone": "克隆",
|
||||
"clone-tooltip": "克隆,让同一条笔记同时出现在两处"
|
||||
},
|
||||
"shared_info": {
|
||||
"help_link": "访问 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a> 获取帮助。",
|
||||
"shared_publicly": "该笔记已在 {{- link}} 上公开分享。",
|
||||
"shared_locally": "此笔记在本地通过 {{- link}} 进行共享。",
|
||||
"shared_preview": "此笔记分享在 {{- link}},但只有此浏览器能打开该页面,且仅在 Trilium 处于打开状态时可访问。如需将其发布给他人,需要 Trilium 服务器。",
|
||||
"shared_export_only": "此笔记已分享,但移动端应用无法打开分享页面。如需发布,请将子树导出为「{{format}}」并将文件托管在任意 Web 服务器上,或使用 Trilium 服务器。"
|
||||
},
|
||||
"note_types": {
|
||||
"text": "文本",
|
||||
"code": "代码",
|
||||
@@ -2027,22 +1944,15 @@
|
||||
"widget-preset-sample": "来自小组件的问候"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "保护笔记",
|
||||
"toggle-off": "取消保护笔记",
|
||||
"toggle-on-hint": "笔记未受保护,点击以保护",
|
||||
"toggle-off-hint": "笔记已受保护,点击以取消保护"
|
||||
"toggle-on": "保护笔记"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "已分享",
|
||||
"toggle-on-title": "分享笔记",
|
||||
"toggle-off-title": "取消分享笔记",
|
||||
"shared-branch": "此笔记仅作为共享笔记存在,取消共享将删除它。你确定要继续并删除此笔记吗?",
|
||||
"inherited": "此笔记无法在此处取消共享,因为它通过继承自上级笔记共享。"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "模板",
|
||||
"toggle-on-hint": "将此笔记设为模板",
|
||||
"toggle-off-hint": "取消笔记模板设置"
|
||||
"template": "模板"
|
||||
},
|
||||
"open-help-page": "打开帮助页面",
|
||||
"find": {
|
||||
@@ -2054,8 +1964,6 @@
|
||||
"replace_all": "全部替换"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "高亮列表",
|
||||
"options": "选项",
|
||||
"title_with_count_other": "{{count}} 处高亮",
|
||||
"menu_configure": "配置高亮列表...",
|
||||
"no_highlights": "未找到高亮内容。"
|
||||
@@ -2163,7 +2071,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "目录",
|
||||
"options": "选项",
|
||||
"no_headings": "无标题。"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2254,9 +2161,6 @@
|
||||
"tab_width": "Tab 宽度",
|
||||
"tab_width_unit": "空格"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "格式"
|
||||
},
|
||||
"editor": {
|
||||
"title": "编辑器"
|
||||
},
|
||||
@@ -2264,12 +2168,10 @@
|
||||
"editor_type": {
|
||||
"label": "格式工具栏",
|
||||
"floating": {
|
||||
"title": "浮动",
|
||||
"description": "编辑工具出现在光标附近;"
|
||||
"title": "浮动"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "固定",
|
||||
"description": "编辑工具出现在 \"格式\" 功能区标签中。"
|
||||
"title": "固定"
|
||||
},
|
||||
"multiline-toolbar": "如果工具栏无法完全显示,则分多行显示",
|
||||
"toolbar_style": "工具栏样式"
|
||||
@@ -2468,13 +2370,6 @@
|
||||
"title_vertical": "将编辑面板移至底部",
|
||||
"title_horizontal": "将编辑面板移至左侧"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "解锁编辑",
|
||||
"lock-editing": "锁定编辑"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "将图表导出为PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "无法将图表导出为PNG。",
|
||||
"export_to_svg": "此图像无法导出为SVG。",
|
||||
@@ -2757,9 +2652,6 @@
|
||||
"next_theme_message": "当前使用旧版主题,要试用新主题吗?",
|
||||
"next_theme_button": "试用新主题",
|
||||
"dismiss": "关闭",
|
||||
"new_layout_message": "我们为 Trilium 引入了现代化的布局。Ribbon 界面已被移除并无缝集成到主界面中,新的状态栏和可展开部分(例如“已提升属性”)取代了其主要功能。\n\n新布局默认启用,你可以通过“选项”→“外观”暂时禁用它。",
|
||||
"new_layout_button": "更多信息",
|
||||
"new_layout_title": "新布局",
|
||||
"scripting_disabled_title": "后端脚本已被禁用",
|
||||
"scripting_disabled_message": "出于安全考虑,后端脚本现在默认情况下已禁用。你的笔记里有一些后端脚本(带有 #run 标签的笔记),它们将不再自动运行。\n\n如果你需要使用这些脚本,可以到安全设置中重新启用后端脚本。",
|
||||
"scripting_disabled_button": "打开安全设置"
|
||||
@@ -2772,9 +2664,6 @@
|
||||
"related_code_blocks": "文本笔记中代码块的色彩方案",
|
||||
"related_code_notes": "代码笔记的色彩方案",
|
||||
"ui": "用户界面",
|
||||
"ui_old_layout": "旧布局",
|
||||
"ui_new_layout": "新布局",
|
||||
"ui_layout_style": "版面样式",
|
||||
"ui_layout_orientation": "启动栏方向"
|
||||
},
|
||||
"units": {
|
||||
@@ -2818,8 +2707,6 @@
|
||||
"create_event": "创建"
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "当前正在查看一个只读笔记。",
|
||||
"auto-read-only-note": "这条笔记以只读模式显示便于快速加载。",
|
||||
"edit-note": "编辑笔记"
|
||||
},
|
||||
"note-color": {
|
||||
@@ -2838,8 +2725,6 @@
|
||||
"experimental_features": {
|
||||
"title": "实验选项",
|
||||
"disclaimer": "这些选项处于实验阶段,可能导致系统不稳定。请谨慎使用。",
|
||||
"new_layout_name": "新布局",
|
||||
"new_layout_description": "尝试全新布局,呈现更现代的外观并提升易用性。后续版本将进行重大调整。",
|
||||
"llm_name": "AI/大语言模型对话",
|
||||
"llm_description": "启用由大语言模型驱动的 AI对话侧边栏和大语言模型对话笔记。"
|
||||
},
|
||||
|
||||
@@ -139,12 +139,6 @@
|
||||
"no_path_to_clone_to": "Žádná cest pro klonování.",
|
||||
"note_cloned": "Poznámka „{{clonedTitle}}“ bylo naklonována do „{{targetTitle}}“"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_one": "{{count}} Zpětný odkaz",
|
||||
"backlink_few": "{{count}} Zpětné odkazy",
|
||||
"backlink_other": "{{count}} Zpětných odkazů",
|
||||
"relation": "vazba"
|
||||
},
|
||||
"help": {
|
||||
"title": "Rychlý přehled",
|
||||
"editShortcuts": "Upravit klávesové zkratky",
|
||||
@@ -405,7 +399,6 @@
|
||||
"hide_relations": "Seznam jmen vazeb oddělených čárkami, které se mají skrýt. Všechny ostatní budou zobrazeny.",
|
||||
"title_template": "výchozí název poznámek vytvořených jako podřízené této poznámce. Hodnota je vyhodnocena jako řetězec v JavaScriptu \n a lze ji tedy obohatit o dynamický obsah pomocí vložených proměnných <code>now</code> a <code>parentNote</code>. Příklady:\n \n <ul>\n <li><code>${parentNote.getLabelValue(‚authorName‘)}ova literární díla</code></li>\n <li><code>Záznam pro ${now.format(‚YYYY-MM-DD HH:mm:ss‘)}</code></li>\n </ul>\n \n Viz <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html \">wiki s podrobnostmi</a>, dokumentaci API pro <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> a <a href=\"https://day.js.org/docs/en/display/format\">now</a> pro podrobnosti.",
|
||||
"template": "Tato poznámka se zobrazí ve výběru dostupných šablon při vytváření nové poznámky",
|
||||
"toc": "<code>#toc</code> nebo <code>#toc=show</code> vynutí zobrazení Obsahu, <code>#toc=hide</code> vynutí jeho skrytí. Pokud štítek neexistuje, je respektováno globální nastavení",
|
||||
"color": "Definuje barvu poznámky ve stromu poznámek, odkazech atd. Použijte jakoukoli platnou hodnotu CSS barvy, například 'red' nebo #a13d5f",
|
||||
"keyboard_shortcut": "Definuje klávesovou zkratku, která okamžitě skočí na tuto poznámku. Příklad: 'ctrl+alt+e'. Pro projev změny je vyžadováno obnovení frontendu.",
|
||||
"keep_current_hoisting": "Otevření tohoto odkazu nezmění zúžení zobrazení, i když poznámka není zobrazitelná v aktuálním zúženém podstromu.",
|
||||
@@ -413,7 +406,6 @@
|
||||
"execute_description": "Delší popis aktuální poznámky s kódem zobrazený spolu s tlačítkem pro spuštění",
|
||||
"exclude_from_note_map": "Poznámky s tímto štítkem budou skryté v Mapě poznámek",
|
||||
"new_notes_on_top": "Nové poznámky budou vytvářeny nahoře nadřazené poznámky, nikoli dole.",
|
||||
"hide_highlight_widget": "Skrýt Widget Seznam zvýraznění",
|
||||
"run_on_note_creation": "spustí se při vytvoření poznámky na serveru. Tuto relaci použijte, pokud chcete skript spustit pro všechny poznámky vytvořené v rámci konkrétního podstromu. V takovém případě ji vytvořte na kořenové poznámce podstromu a nastavte ji jako dědičnou. Skript se spustí při vytvoření nové poznámky v rámci podstromu (v jakékoli úrovni).",
|
||||
"run_on_child_note_creation": "provede se, když je pod poznámkou, ve které je tento vztah definován, vytvořena nová poznámka",
|
||||
"run_on_note_title_change": "spustí se při změně názvu poznámky (včetně vytvoření poznámky)",
|
||||
@@ -616,15 +608,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Vytvořit nové rozdělení"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Upravit tuto poznámku"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Zobrazit Obsah"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Zobrazit Seznam zvýraznění"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menu",
|
||||
"options": "Nastavení",
|
||||
@@ -709,9 +692,6 @@
|
||||
"active": "Chráněná relace je aktivní. Klikněte pro ukončení chráněné relace.",
|
||||
"inactive": "Klikněte pro vstup do chráněné relace"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Revize poznámek"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Dostupná aktualizace"
|
||||
},
|
||||
@@ -725,18 +705,6 @@
|
||||
"opening_api_docs_message": "Otevírám API dokumentaci...",
|
||||
"sql_console_saved_message": "Poznámka SQL konzole byla uložena do {{note_path}}"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Kopírovat odkaz na obrázek do schránky, lze vložit do textové poznámky."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Skrýt tlačítka"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Zobrazit tlačítka"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Exportovat diagram jako SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Vytvořit dceřinou poznámku a přidat ji na mapu"
|
||||
},
|
||||
@@ -766,8 +734,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Typ poznámky",
|
||||
"editable": "Upravitelné",
|
||||
"basic_properties": "Základní vlastnosti",
|
||||
"language": "Jazyk",
|
||||
"configure_code_notes": "Konfigurovat poznámky s kódem..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -792,37 +758,23 @@
|
||||
"hide_child_notes": "Skrýt dceřiné Poznámky ve Stromu"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Zatím nebyly upraveny žádné Poznámky v tento den...",
|
||||
"title": "Upravené Poznámky",
|
||||
"deleted": "(smazáno)"
|
||||
"no_edited_notes_found": "Zatím nebyly upraveny žádné Poznámky v tento den..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "ID Poznámky",
|
||||
"original_file_name": "Původní název souboru",
|
||||
"file_type": "Typ souboru",
|
||||
"file_size": "Velikost souboru",
|
||||
"download": "Stáhnout",
|
||||
"open": "Otevřít externě",
|
||||
"upload_new_revision": "Nahrát novou revizi",
|
||||
"upload_success": "Nová revize souboru byla nahrána.",
|
||||
"upload_failed": "Nahrání nové revize souboru selhalo.",
|
||||
"title": "Soubor"
|
||||
"upload_failed": "Nahrání nové revize souboru selhalo."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Původní název souboru",
|
||||
"file_type": "Typ souboru",
|
||||
"file_size": "Velikost souboru",
|
||||
"download": "Stáhnout",
|
||||
"open": "Otevřít",
|
||||
"copy_reference_to_clipboard": "Kopírovat referenci do schránky",
|
||||
"upload_new_revision": "Nahrát novou revizi",
|
||||
"upload_success": "Nová revize obrázku byla nahrána.",
|
||||
"upload_failed": "Nahrání nové revize obrázku selhalo: {{message}}",
|
||||
"title": "Obrázek"
|
||||
"upload_failed": "Nahrání nové revize obrázku selhalo: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Zděděné atributy",
|
||||
"no_inherited_attributes": "Žádné zděděné atributy.",
|
||||
"none": "žádný"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -841,8 +793,6 @@
|
||||
"show_similar_notes": "Zobrazit podobné Poznámky"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Rozbalit na plnou velikost",
|
||||
"collapse": "Sbalit na normální velikost",
|
||||
"title": "Mapa poznámek",
|
||||
"fix-nodes": "Opravit uzly",
|
||||
"link-distance": "Vzdálenost propojení"
|
||||
@@ -850,19 +800,11 @@
|
||||
"note_paths": {
|
||||
"title": "Cesty k poznámkám",
|
||||
"clone_button": "Klonovat poznámku na nové místo...",
|
||||
"intro_placed": "Tato poznámka je umístěna v následujících cestách:",
|
||||
"intro_not_placed": "Tato poznámka ještě nebyla umístěna do stromu poznámek.",
|
||||
"outside_hoisted": "Tato cesta je mimo nadřazenou poznámku a bude nutné ji odnadřazit.",
|
||||
"archived": "Archivováno",
|
||||
"search": "Hledání"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Tato poznámka byla původně pořízena z:",
|
||||
"info": "Info"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Vlastní atributy"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Propagované atributy",
|
||||
"unset-field-placeholder": "není nastaveno",
|
||||
@@ -874,12 +816,6 @@
|
||||
"remove_this_attribute": "Odebrat tento atribut",
|
||||
"remove_color": "Odebrat barevný štítek"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Dotaz",
|
||||
"script": "Skript",
|
||||
"execute_query": "Spustit dotaz",
|
||||
"execute_script": "Spustit skript"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Přidat možnost hledání:",
|
||||
"search_string": "vyhledávací řetězec",
|
||||
@@ -1133,8 +1069,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Experimentální Nastavení",
|
||||
"disclaimer": "Tato nastavení jsou experimentální a mohou způsobit nestabilitu. Používejte s opatrností.",
|
||||
"new_layout_name": "Nové Rozložení",
|
||||
"new_layout_description": "Vyzkoušejte nové rozložení pro modernější vzhled a lepší použitelnost. Podléhá velkým změnám v nadcházejících verzích.",
|
||||
"llm_name": "AI / LLM Chat",
|
||||
"llm_description": "Povolte postranní panel AI chatu a poznámky LLM chatu poháněné velkými jazykovými modely."
|
||||
},
|
||||
@@ -1169,9 +1103,6 @@
|
||||
"enabled": "zapnuto",
|
||||
"disabled": "vypnuto"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Záložka Upravené poznámky na pásu karet se automaticky otevře u denních poznámek"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Vzhled aplikace",
|
||||
"theme_label": "Vzhled",
|
||||
@@ -1309,17 +1240,7 @@
|
||||
"italic": "Kurzíva",
|
||||
"underline": "Podtržený text",
|
||||
"color": "Barevný text",
|
||||
"bg_color": "Text s barvou pozadí",
|
||||
"visibility_title": "Viditelnost seznamu zvýraznění",
|
||||
"visibility_description": "Widget zvýraznění můžete pro jednotlivé poznámky skrýt přidáním štítku #hideHighlightWidget.",
|
||||
"shortcut_info": "Můžete nakonfigurovat klávesovou zkratku pro rychlé přepínání pravého panelu (včetně zvýraznění) v Nastavení -> Zkratky (název 'toggleRightPane')."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Obsah",
|
||||
"description": "Obsah se zobrazí v textových Poznámkách, pokud Poznámka obsahuje více než definovaný počet nadpisů. Můžete si přizpůsobit tento počet:",
|
||||
"unit": "nadpisů",
|
||||
"disable_info": "Můžete také použít tuto možnost pro efektivní vypnutí TOC nastavením velmi vysokého čísla.",
|
||||
"shortcut_info": "Můžete nakonfigurovat klávesovou zkratku pro rychlé přepínání pravého panelu (včetně TOC) v Nastavení -> Zkratky (název 'toggleRightPane')."
|
||||
"bg_color": "Text s barvou pozadí"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Automatická velikost pro Pouze pro čtení",
|
||||
@@ -1458,9 +1379,7 @@
|
||||
"unrecognized_role": "Nerozpoznaná role přílohy '{{role}}'."
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Záložka (oblíbená)",
|
||||
"bookmark_this_note": "Přidejte tuto poznámku do záložek na levém panelu",
|
||||
"remove_bookmark": "Odebrat záložku"
|
||||
"bookmark": "Záložka (oblíbená)"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Automaticky",
|
||||
@@ -1513,14 +1432,7 @@
|
||||
"convert-to-attachment-confirm": "Jste si jisti, že chcete převést vybrané Poznámky na Přílohy jejich nadřazených Poznámek? Tato operace se vztahuje pouze na Poznámky typu Obrázek, ostatní Poznámky budou přeskočeny.",
|
||||
"open-in-popup": "Rychlá úprava"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Tato Poznámka je veřejně Sdílena na {{- link}}.",
|
||||
"shared_locally": "Tato Poznámka je lokálně Sdílena na {{- link}}.",
|
||||
"help_link": "Pro pomoc navštivte <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Zobrazujete Poznámku pouze pro čtení.",
|
||||
"auto-read-only-note": "Tato Poznámka je zobrazena v režimu Pouze pro čtení pro rychlejší načítání.",
|
||||
"edit-note": "Upravit Poznámku"
|
||||
},
|
||||
"note_types": {
|
||||
@@ -1550,10 +1462,7 @@
|
||||
"spreadsheet": "Tabulka"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Zabezpečit poznámku",
|
||||
"toggle-off": "Zrušit zabezpečení poznámky",
|
||||
"toggle-on-hint": "Poznámka není zabezpečená, klikněte pro její zabezpečení",
|
||||
"toggle-off-hint": "Poznámka je zabezpečená, klikněte pro zrušení zabezpečení"
|
||||
"toggle-on": "Zabezpečit poznámku"
|
||||
},
|
||||
"llm_chat": {
|
||||
"placeholder": "Napište zprávu...",
|
||||
@@ -1597,15 +1506,11 @@
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Sdíleno",
|
||||
"toggle-on-title": "Sdílet poznámku",
|
||||
"toggle-off-title": "Zrušit sdílení poznámky",
|
||||
"shared-branch": "Tato poznámka existuje pouze jako sdílená poznámka, zrušení sdílení by ji smazalo. Chcete pokračovat a tímto poznámku smazat?",
|
||||
"inherited": "Poznámku nelze zde zrušit sdílení, protože je sdílena dědičně z nadřazené poznámky."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Šablona",
|
||||
"toggle-on-hint": "Udělat z poznámky šablonu",
|
||||
"toggle-off-hint": "Odstranit poznámku jako šablonu"
|
||||
"template": "Šablona"
|
||||
},
|
||||
"open-help-page": "Otevřít stránku nápovědy",
|
||||
"find": {
|
||||
@@ -1617,8 +1522,6 @@
|
||||
"replace_all": "Nahradit vše"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Seznam zvýraznění",
|
||||
"options": "Nastavení",
|
||||
"menu_configure": "Konfigurovat seznam zvýraznění...",
|
||||
"no_highlights": "Nebyla nalezena žádná zvýraznění.",
|
||||
"title_with_count_one": "{{count}} zvýraznění",
|
||||
@@ -1713,7 +1616,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Obsah",
|
||||
"options": "Nastavení",
|
||||
"no_headings": "Žádné nadpisy."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -1786,9 +1688,6 @@
|
||||
"theme_group_dark": "Tmavé motivy",
|
||||
"copy_title": "Kopírovat do schránky"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formátování"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Editor"
|
||||
},
|
||||
@@ -1796,12 +1695,10 @@
|
||||
"editor_type": {
|
||||
"label": "Lišta pro formátování",
|
||||
"floating": {
|
||||
"title": "Plovoucí",
|
||||
"description": "nástroje pro úpravy se zobrazí u kurzoru;"
|
||||
"title": "Plovoucí"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Fixní",
|
||||
"description": "nástroje pro úpravu se zobrazují na záložce „Formátování“ v pásu karet."
|
||||
"title": "Fixní"
|
||||
},
|
||||
"multiline-toolbar": "Zobrazit panel nástrojů v několika řádcích, pokud se nevejde."
|
||||
}
|
||||
@@ -1903,13 +1800,6 @@
|
||||
"title_vertical": "Přesunout panel úprav na dolní část",
|
||||
"title_horizontal": "Přesunout panel úpráv nalevo"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Odemknout úpravy",
|
||||
"lock-editing": "Uzamknout úpravy"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Exportovat diagram jako PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Diagram nebylo možné exportovat do PNG.",
|
||||
"export_to_svg": "Diagram nebylo možné exportovat do SVG."
|
||||
@@ -2040,9 +1930,6 @@
|
||||
"background_effects_title": "Efekty pozadí jsou nyní stabilní",
|
||||
"background_effects_message": "Na zařízeních Windows a macOS jsou efekty pozadí nyní stabilní. Efekty pozadí přidávají uživatelskému rozhraní nádech barvy rozostřením pozadí za ním.",
|
||||
"background_effects_button": "Povolit efekty pozadí",
|
||||
"new_layout_title": "Nové rozvržení",
|
||||
"new_layout_message": "Pro Trilium jsme zavedli modernizované rozvržení. Pás karet byl odstraněn a plynule integrovan do hlavního rozhraní, přičemž nové stavové řádky a rozšiřitelné sekce (jako jsou propagované atributy) převzaly klíčové funkce. \n\nNové rozvržení je padrãoně zapnuté a lze jej dočasně vypnout přes Nastavení → Vzhled.",
|
||||
"new_layout_button": "Více informací",
|
||||
"dismiss": "Zavřít"
|
||||
},
|
||||
"settings": {
|
||||
@@ -2051,9 +1938,7 @@
|
||||
"settings_appearance": {
|
||||
"related_code_blocks": "Barevné schéma pro bloky kódu v textových poznámkách",
|
||||
"related_code_notes": "Barevné schéma pro poznámky kódu",
|
||||
"ui": "Uživatelské rozhraní",
|
||||
"ui_old_layout": "Staré rozvržení",
|
||||
"ui_new_layout": "Nové rozvržení"
|
||||
"ui": "Uživatelské rozhraní"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
|
||||
@@ -269,7 +269,8 @@
|
||||
"box_size_medium": "mittel (~ 30 Zeilen)",
|
||||
"box_size_full": "vollständig (Box zeigt vollständigen Text)",
|
||||
"button_include": "Notiz einbinden",
|
||||
"box_size_expandable": "ausklappbar (standardmäßig eingeklappt)"
|
||||
"box_size_expandable": "ausklappbar (standardmäßig eingeklappt)",
|
||||
"box_size_tiny": "winzig (einzelne Zeile mit Titel und Aktionen)"
|
||||
},
|
||||
"info": {
|
||||
"modalTitle": "Infonachricht",
|
||||
@@ -444,7 +445,6 @@
|
||||
"hide_relations": "Durch Kommas getrennte Namen von Relationen, die ausgeblendet werden sollen. Alle anderen werden angezeigt.",
|
||||
"title_template": "Standardtitel von Notizen, die als untergeordnete Notizen dieser Notiz erstellt werden. Der Wert wird als JavaScript-String ausgewertet \n und kann daher mit dynamischen Inhalten über die injizierten <code>now</code> und <code>parentNote</code>-Variablen angereichert werden. Beispiele:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literarische Werke</code></li>\n <li><code>Logbuch für ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Siehe <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">Wiki mit Details</a>, API-Dokumentation für <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> und <a href=\"https://day.js.org/docs/en/display/format\">now</a> für Details.",
|
||||
"template": "Diese Notiz wird beim Erstellen einer neuen Notiz in der Auswahl der verfügbaren Vorlagen angezeigt.",
|
||||
"toc": "<code>#toc</code> oder <code>#toc=show</code> erzwingen die Anzeige des Inhaltsverzeichnisses, <code>#toc=hide</code> erzwingt das Ausblenden. Wenn das Label nicht vorhanden ist, wird die globale Einstellung beachtet",
|
||||
"color": "Definiert die Farbe der Notiz im Notizbaum, in Links usw. Verwenden Sie einen beliebigen gültigen CSS-Farbwert wie 'red' oder #a13d5f",
|
||||
"keyboard_shortcut": "Definiert eine Tastenkombination, die sofort zu dieser Notiz springt. Beispiel: 'ctrl+alt+e'. Erfordert ein Neuladen des Frontends, damit die Änderung wirksam wird.",
|
||||
"keep_current_hoisting": "Das Öffnen dieses Links ändert den Fokus nicht, selbst wenn die Notiz im aktuell fokussierten Zweig nicht angezeigt werden kann.",
|
||||
@@ -452,7 +452,6 @@
|
||||
"execute_description": "Längere Beschreibung der aktuellen Codenotiz, die zusammen mit der Schaltfläche „Ausführen“ angezeigt wird",
|
||||
"exclude_from_note_map": "Notizen mit diesem Label werden in der Notizkarte ausgeblendet",
|
||||
"new_notes_on_top": "Neue Notizen werden oben in der übergeordneten Notiz erstellt, nicht unten.",
|
||||
"hide_highlight_widget": "Widget „Markierungsliste“ ausblenden",
|
||||
"run_on_note_creation": "Wird ausgeführt, wenn eine Notiz im Backend erstellt wird. Verwenden Sie diese Relation, wenn Sie das Skript für alle Notizen ausführen möchten, die unter einem bestimmten Zweig erstellt wurden. Erstellen Sie es in diesem Fall auf der Stammnotiz und machen Sie es vererbbar. Eine neue Notiz, die innerhalb des Zweigs (beliebige Tiefe) erstellt wird, löst das Skript aus.",
|
||||
"run_on_child_note_creation": "Wird ausgeführt, wenn eine neue Notiz unter der Notiz erstellt wird, in der diese Relation definiert ist",
|
||||
"run_on_note_title_change": "Wird ausgeführt, wenn der Notiztitel geändert wird (einschließlich der Notizerstellung)",
|
||||
@@ -498,7 +497,6 @@
|
||||
"show_all_in_search": "Zeige alle in der Suche an",
|
||||
"relation_type": "Beziehung",
|
||||
"versioning_limit": "Begrenzt die Anzahl der Versionen, die für diese Notiz gespeichert werden, und überschreibt dabei die globale Einstellung.",
|
||||
"similar_notes_widget_disabled": "Deaktiviert für diese Notiz den Reiter „Ähnliche Notizen“ im Menüband. Nur im alten Layout verfügbar.",
|
||||
"llm_chat_home": "Neue KI-Chats werden als untergeordnete Notizen dieser Notiz erstellt.",
|
||||
"workspace_llm_chat_home": "Neue KI-Chats werden als untergeordnete Notizen dieser Notiz erstellt, während ein übergeordneter Knoten dieses Arbeitsbereichs als Wurzel festgelegt ist.",
|
||||
"date_pattern": "Muster für die Titel der unter diesem Kalender-Stamm erstellten Tagesnotizen, z. B. <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -848,15 +846,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Neuen Split erstellen"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Diese Notiz bearbeiten"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Inhaltsverzeichnis anzeigen"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Markierungsliste anzeigen"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menü",
|
||||
"options": "Optionen",
|
||||
@@ -954,9 +943,6 @@
|
||||
"active": "Die geschützte Sitzung ist aktiv. Klicken Sie hier, um die geschützte Sitzung zu verlassen.",
|
||||
"inactive": "Klicken Sie hier, um die geschützte Sitzung aufzurufen"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Revisionsverlauf"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Update verfügbar"
|
||||
},
|
||||
@@ -971,26 +957,11 @@
|
||||
"sql_console_saved_message": "SQL-Konsolennotiz wurde in {{note_path}} gespeichert",
|
||||
"electron_api_docs_button_title": "Electron-API-Dokumentation öffnen"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Bildreferenz in die Zwischenablage kopieren, kann in eine Textnotiz eingefügt werden."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Schaltflächen ausblenden"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Schaltflächen einblenden"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Diagramm als SVG exportieren"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Untergeordnete Notiz erstellen und zur Karte hinzufügen",
|
||||
"create_child_note_text": "Notiz hinzufügen"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "Relation",
|
||||
"backlink_one": "{{count}} Rücklink",
|
||||
"backlink_other": "{{count}} Rücklinks",
|
||||
"no_backlinks": "Keine Notizen verlinken auf diese Notiz."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1018,8 +989,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Notiztyp",
|
||||
"editable": "Bearbeitbar",
|
||||
"basic_properties": "Grundlegende Eigenschaften",
|
||||
"language": "Sprache",
|
||||
"configure_code_notes": "Code-Notizen konfigurieren..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1050,37 +1019,23 @@
|
||||
"open_all_limit_exceeded": "Zu viele Notizen, um sie gleichzeitig zu öffnen ({{count}}). Das Maximum beträgt {{max}} – bitte grenzen Sie die Ergebnisse zuerst weiter ein."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...",
|
||||
"title": "Bearbeitete Notizen",
|
||||
"deleted": "(gelöscht)"
|
||||
"no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "Notiz-ID",
|
||||
"original_file_name": "Ursprünglicher Dateiname",
|
||||
"file_type": "Dateityp",
|
||||
"file_size": "Dateigröße",
|
||||
"download": "Herunterladen",
|
||||
"open": "Extern öffnen",
|
||||
"upload_new_revision": "Neue Revision hochladen",
|
||||
"upload_success": "Neue Dateirevision wurde hochgeladen.",
|
||||
"upload_failed": "Das Hochladen einer neuen Dateirevision ist fehlgeschlagen.",
|
||||
"title": "Datei"
|
||||
"upload_failed": "Das Hochladen einer neuen Dateirevision ist fehlgeschlagen."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Ursprünglicher Dateiname",
|
||||
"file_type": "Dateityp",
|
||||
"file_size": "Dateigröße",
|
||||
"download": "Herunterladen",
|
||||
"open": "Öffnen",
|
||||
"copy_reference_to_clipboard": "Verweis in die Zwischenablage kopieren",
|
||||
"upload_new_revision": "Neue Revision hochladen",
|
||||
"upload_success": "Neue Bildrevision wurde hochgeladen.",
|
||||
"upload_failed": "Das Hochladen einer neuen Bildrevision ist fehlgeschlagen: {{message}}",
|
||||
"title": "Bild"
|
||||
"upload_failed": "Das Hochladen einer neuen Bildrevision ist fehlgeschlagen: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Geerbte Attribute",
|
||||
"no_inherited_attributes": "Keine geerbten Attribute.",
|
||||
"none": "Keine"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1098,8 +1053,6 @@
|
||||
"show_similar_notes": "Ähnliche Notizen anzeigen"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Vollständig erweitern",
|
||||
"collapse": "Auf normale Größe reduzieren",
|
||||
"title": "Notizkarte",
|
||||
"fix-nodes": "Knoten fixieren",
|
||||
"link-distance": "Verbindungslänge",
|
||||
@@ -1111,19 +1064,11 @@
|
||||
"note_paths": {
|
||||
"title": "Notizpfade",
|
||||
"clone_button": "Notiz an neuen Speicherort klonen...",
|
||||
"intro_placed": "Diese Notiz wird in den folgenden Pfaden abgelegt:",
|
||||
"intro_not_placed": "Diese Notiz ist noch nicht im Notizbaum platziert.",
|
||||
"outside_hoisted": "Dieser Pfad liegt außerhalb der fokussierten Notiz. Sie müssten den Fokus aufheben.",
|
||||
"archived": "Archiviert",
|
||||
"search": "Suchen"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Diese Notiz stammt ursprünglich aus:",
|
||||
"info": "Info"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Eigene Attribute"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Hervorgehobene Attribute",
|
||||
"url_placeholder": "http://website...",
|
||||
@@ -1142,12 +1087,6 @@
|
||||
"values_placeholder": "Wert eingeben und Eingabetaste drücken",
|
||||
"add_value": "Diesen Wert hinzufügen"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Abfrage",
|
||||
"script": "Skript",
|
||||
"execute_query": "Abfrage ausführen",
|
||||
"execute_script": "Skript ausführen"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Suchoption hinzufügen:",
|
||||
"search_string": "Suchzeichenfolge",
|
||||
@@ -1419,9 +1358,6 @@
|
||||
"enabled": "aktiviert",
|
||||
"disabled": "deaktiviert"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Die Multifunktionsleisten-Registerkarte „Bearbeitete Notizen“ wird bei Tagesnotizen automatisch geöffnet"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Benutzeroberfläche",
|
||||
"theme_label": "Design",
|
||||
@@ -1580,17 +1516,7 @@
|
||||
"italic": "Kursiver Text",
|
||||
"underline": "Unterstrichener Text",
|
||||
"color": "Farbiger Text",
|
||||
"bg_color": "Text mit Hintergrundfarbe",
|
||||
"visibility_title": "Sichtbarkeit der Markierungsliste",
|
||||
"visibility_description": "Sie können das Markierungs-Widget pro Notiz ausblenden, indem Sie das Label #hideHighlightWidget hinzufügen.",
|
||||
"shortcut_info": "Sie können eine Tastenkombination zum schnellen Umschalten des rechten Bereichs (einschließlich Markierungen) in den Optionen -> Tastenkombinationen konfigurieren (Name „toggleRightPane“)."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Inhaltsverzeichnis",
|
||||
"description": "Das Inhaltsverzeichnis wird in Textnotizen angezeigt, wenn die Notiz mehr als eine definierte Anzahl von Überschriften enthält. Sie können diese Zahl anpassen:",
|
||||
"disable_info": "Sie können diese Option auch verwenden, um TOC effektiv zu deaktivieren, indem Sie eine sehr hohe Zahl festlegen.",
|
||||
"shortcut_info": "Sie können eine Tastenkombination zum schnellen Umschalten des rechten Bereichs (einschließlich Inhaltsverzeichnis) unter Optionen -> Tastenkombinationen konfigurieren (Name „toggleRightPane“).",
|
||||
"unit": "Überschriften"
|
||||
"bg_color": "Text mit Hintergrundfarbe"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Automatische schreibgeschützte Größe",
|
||||
@@ -1752,9 +1678,7 @@
|
||||
"unrecognized_role": "Unbekannte Anhangsrolle „{{role}}“."
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Lesezeichen",
|
||||
"bookmark_this_note": "Diese Notiz im linken Seitenbereich als Lesezeichen speichern",
|
||||
"remove_bookmark": "Lesezeichen entfernen"
|
||||
"bookmark": "Lesezeichen"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Automatisch",
|
||||
@@ -1806,11 +1730,6 @@
|
||||
"hide-subtree": "Zweig ausblenden",
|
||||
"show-subtree": "Zweig anzeigen"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Diese Notiz ist öffentlich freigegeben über {{- link}}.",
|
||||
"shared_locally": "Diese Notiz ist lokal freigegeben über {{- link}}.",
|
||||
"help_link": "Für Hilfe <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">Wiki</a> besuchen."
|
||||
},
|
||||
"note_types": {
|
||||
"text": "Text",
|
||||
"code": "Code",
|
||||
@@ -1839,22 +1758,15 @@
|
||||
"markdown": "Markdown"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Notiz schützen",
|
||||
"toggle-off": "Notizschutz aufheben",
|
||||
"toggle-on-hint": "Notiz ist ungeschützt, klicken, um sie zu schützen",
|
||||
"toggle-off-hint": "Notiz ist geschützt, klicken, um den Schutz aufzuheben"
|
||||
"toggle-on": "Notiz schützen"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Freigegeben",
|
||||
"toggle-on-title": "Notiz freigeben",
|
||||
"toggle-off-title": "Notiz-Freigabe aufheben",
|
||||
"shared-branch": "Diese Notiz existiert nur als freigegebene Notiz, das Aufheben der Freigabe würde sie löschen. Möchten Sie fortfahren und die Notiz damit löschen?",
|
||||
"inherited": "Die Notiz kann hier nicht von der Freigabe entfernt werden, da sie über Vererbung von einer übergeordneten Notiz geteilt wird."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Vorlage",
|
||||
"toggle-on-hint": "Notiz zu einer Vorlage machen",
|
||||
"toggle-off-hint": "Die Notiz als Vorlage entfernen"
|
||||
"template": "Vorlage"
|
||||
},
|
||||
"open-help-page": "Hilfeseite öffnen",
|
||||
"find": {
|
||||
@@ -1866,8 +1778,6 @@
|
||||
"replace_all": "Alle ersetzen"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Markierungsliste",
|
||||
"options": "Optionen",
|
||||
"title_with_count_one": "{{count}} Markierung",
|
||||
"title_with_count_other": "{{count}} Markierungen",
|
||||
"menu_configure": "Markierungsliste konfigurieren...",
|
||||
@@ -1967,7 +1877,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Inhaltsverzeichnis",
|
||||
"options": "Optionen",
|
||||
"no_headings": "Keine Überschriften."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2053,9 +1962,6 @@
|
||||
"tab_width_unit": "Leerzeichen",
|
||||
"tab_width": "Tab-Breite"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Format"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Editor"
|
||||
},
|
||||
@@ -2063,12 +1969,10 @@
|
||||
"editor_type": {
|
||||
"label": "Format Toolbar",
|
||||
"floating": {
|
||||
"title": "Schwebend",
|
||||
"description": "Werkzeuge erscheinen in Cursornähe;"
|
||||
"title": "Schwebend"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Fixiert",
|
||||
"description": "Werkzeuge erscheinen im „Format“-Tab."
|
||||
"title": "Fixiert"
|
||||
},
|
||||
"multiline-toolbar": "Toolbar wenn nötig in mehreren Zeilen darstellen",
|
||||
"toolbar_style": "Symbolleistenstil"
|
||||
@@ -2287,13 +2191,6 @@
|
||||
"title_vertical": "Bearbeitungsbereich nach unten verschieben",
|
||||
"title_horizontal": "Bearbeitungsbereich nach links verschieben"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Bearbeitung freischalten",
|
||||
"lock-editing": "Bearbeitung sperren"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Diagramm als PNG exportieren"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Das Diagramm konnte als PNG nicht exportiert werden.",
|
||||
"export_to_svg": "Das Diagramm konnte nicht als SVG exportiert werden."
|
||||
@@ -2411,9 +2308,6 @@
|
||||
"background_effects_message": "Auf Windows- und macOS-Geräten sind die Hintergrundeffekte nun stabil. Die Hintergrundeffekte verleihen der Benutzeroberfläche einen Farbakzent, indem der Hintergrund dahinter weichgezeichnet wird.",
|
||||
"background_effects_button": "Hintergrundeffekte aktivieren",
|
||||
"dismiss": "Ablehnen",
|
||||
"new_layout_title": "Neues Layout",
|
||||
"new_layout_message": "Wir haben ein modernisiertes Layout für Trilium eingeführt. Die Multifunktionsleiste wurde entfernt und nahtlos in die Hauptoberfläche integriert – eine neue Statusleiste und ausklappbare Bereiche (wie hervorgehobene Attribute) übernehmen nun die wichtigsten Funktionen.\n\nDas neue Layout ist standardmäßig aktiviert und kann temporär über Optionen → Anzeige deaktiviert werden.",
|
||||
"new_layout_button": "Weitere Informationen",
|
||||
"scripting_disabled_title": "Backend-Skripting wurde deaktiviert",
|
||||
"scripting_disabled_button": "Sicherheitseinstellungen öffnen",
|
||||
"scripting_disabled_message": "Backend-Skripting ist aus Sicherheitsgründen jetzt standardmäßig deaktiviert. Ihre Notizen enthalten Backend-Skripte (Notizen mit dem Label #run), die nicht mehr automatisch ausgeführt werden.\n\nWenn Sie auf diese Skripte angewiesen sind, können Sie Backend-Skripting in den Sicherheitseinstellungen wieder aktivieren."
|
||||
@@ -2425,10 +2319,7 @@
|
||||
"related_code_blocks": "Farbschema für Code-Blöcke in Textnotizen",
|
||||
"related_code_notes": "Farbschema für Code-Notizen",
|
||||
"ui": "Benutzeroberfläche",
|
||||
"ui_old_layout": "Altes Layout",
|
||||
"ui_new_layout": "Neues Layout",
|
||||
"ui_layout_orientation": "Ausrichtung der Startleiste",
|
||||
"ui_layout_style": "Layout-Stil"
|
||||
"ui_layout_orientation": "Ausrichtung der Startleiste"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
@@ -2448,8 +2339,6 @@
|
||||
"slide-overview": "Übersicht der Folien ein-/ausblenden"
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Aktuelle Notiz wird im Lese-Modus angezeigt.",
|
||||
"auto-read-only-note": "Diese Notiz wird im Nur-Lesen-Modus angezeigt, um ein schnelleres Laden zu ermöglichen.",
|
||||
"edit-note": "Notiz bearbeiten"
|
||||
},
|
||||
"calendar_view": {
|
||||
@@ -2473,8 +2362,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Experimentelle Optionen",
|
||||
"disclaimer": "Diese Optionen sind experimentell und können Instabilitäten verursachen. Mit Vorsicht verwenden.",
|
||||
"new_layout_name": "Neues Layout",
|
||||
"new_layout_description": "Das neue Layout für eine modernere Darstellung und verbesserte Benutzbarkeit ausprobieren. Kann sich in Zukunft stark ändern.",
|
||||
"llm_name": "KI- / LLM-Chat",
|
||||
"llm_description": "Aktiviert die KI-Chat Seitenleiste sowie LLM-Chat Notizen die von einem Sprachmodell betrieben werden."
|
||||
},
|
||||
@@ -2999,7 +2886,11 @@
|
||||
"table_column": "Spalte {{number}}"
|
||||
},
|
||||
"page_break": "Seitenumbruch einfügen (zum Drucken)",
|
||||
"table": "Tabelle einfügen"
|
||||
"table": "Tabelle einfügen",
|
||||
"titles": {
|
||||
"date": "Datum/Zeit einfügen",
|
||||
"include": "Notiz einfügen"
|
||||
}
|
||||
},
|
||||
"revisions_snapshot": {
|
||||
"title": "Revisionsverlauf"
|
||||
|
||||
@@ -37,9 +37,6 @@
|
||||
"color": "Coloured text",
|
||||
"bg_color": "Text with background colour"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"description": "Table of contents will appear in text notes when the note has more than a defined number of headings. You can customise this number:"
|
||||
},
|
||||
"custom_date_time_format": {
|
||||
"description": "Customise the format of the date and time inserted via <shortcut /> or the toolbar. See <doc>Day.js docs</doc> for available format tokens."
|
||||
},
|
||||
|
||||
@@ -3007,6 +3007,7 @@
|
||||
"open_note_in_popup": "Quick edit",
|
||||
"convert_link_to_embed": "Convert link to an embed",
|
||||
"convert_link_to_included_note": "Convert link to an included note",
|
||||
"convert_link_to_note_excerpt": "Convert link to note excerpt",
|
||||
"convert_embed_to_link": "Convert to link",
|
||||
"include_size": "Size",
|
||||
"show_title": "Show title",
|
||||
@@ -4493,5 +4494,18 @@
|
||||
"filter": "Filter",
|
||||
"filter_placeholder": "Type to filter…",
|
||||
"back": "Back"
|
||||
},
|
||||
"block_reference": {
|
||||
"copy_one": "Copy reference to this block",
|
||||
"copy_other": "Copy reference to these {{count}} blocks",
|
||||
"paste_as_link": "Paste reference as a link",
|
||||
"paste_as_excerpt": "Paste reference as an excerpt",
|
||||
"no_reference_on_clipboard": "The clipboard does not contain a block reference.",
|
||||
"broken": "Broken reference",
|
||||
"not_found": "A referenced block could not be found. It might have been deleted.",
|
||||
"untitled": "Block",
|
||||
"excerpt": "Excerpt",
|
||||
"excerpt_description": "You are currently seeing just a fragment of this note. Press the {{icon}} button to open the entire note in a new tab.",
|
||||
"edit_excerpt": "Edit excerpt"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,7 +453,6 @@
|
||||
"hide_relations": "nombres de relaciones delimitados por comas que deben ocultarse. Se mostrarán todos los demás.",
|
||||
"title_template": "título por defecto de notas creadas como subnota de esta nota. El valor es evaluado como una cadena de JavaScript \n y por lo tanto puede ser enriquecida con contenido dinámico vía las variables inyectadas <code>now</code> y <code>parentNote</code>. Ejemplos:\n \n <ul>\n <li><code>trabajos literarios de ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Registro para ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Consulte la <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki para obtener más detalles</a>, documentación de la API para <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> y <a href=\"https://day.js.org/docs/en/display/format\">now</a> para más detalles.",
|
||||
"template": "Esta nota aparecerá en la selección de plantillas disponibles al crear una nueva nota.",
|
||||
"toc": "<code>#toc</code> o <code>#toc=show</code> forzará que se muestre la tabla de contenido, <code>#toc=hide</code> forzará a ocultarla. Si la etiqueta no existe, se observa la configuración global.",
|
||||
"color": "define el color de la nota en el árbol de notas, enlaces, etc. Utilice cualquier valor de color CSS válido como 'red' o #a13d5f.",
|
||||
"keyboard_shortcut": "Define un atajo de teclado que saltará inmediatamente a esta nota. Ejemplo: 'ctrl+alt+e'. Es necesario recargar la interfaz para que el cambio surta efecto.",
|
||||
"keep_current_hoisting": "Abrir este enlace no cambiará el anclaje incluso si la nota no se puede mostrar en el subárbol anclado actualmente.",
|
||||
@@ -461,7 +460,6 @@
|
||||
"execute_description": "Descripción más larga de la nota de código actual que se muestra junto con el botón de ejecución.",
|
||||
"exclude_from_note_map": "Las notas con esta etiqueta se ocultarán del Mapa de notas.",
|
||||
"new_notes_on_top": "Las notas nuevas se crearán en la parte superior de la nota principal, no en la parte inferior.",
|
||||
"hide_highlight_widget": "Ocultar widget de lista destacada.",
|
||||
"run_on_note_creation": "se ejecuta cuando se crea la nota en el backend. Utilice esta relación si desea ejecutar el script para todas las notas creadas en un subárbol específico. En ese caso, créela en la nota raíz del subárbol y hágala heredable. Una nueva nota creada dentro del subárbol (cualquier profundidad) activará el script.",
|
||||
"run_on_child_note_creation": "se ejecuta cuando se crea una nueva nota bajo la nota donde se define esta relación.",
|
||||
"run_on_note_title_change": "se ejecuta cuando se cambia el título de la nota (también incluye la creación de notas).",
|
||||
@@ -507,7 +505,6 @@
|
||||
"show_all_in_search": "Mostrar todo en la búsqueda",
|
||||
"relation_type": "Relación",
|
||||
"versioning_limit": "Limita el número de revisiones que conserva esta nota, sustituyendo la configuración global.",
|
||||
"similar_notes_widget_disabled": "Desactiva la pestaña de la cinta «Notas similares» para esta nota. Solo en el diseño antiguo.",
|
||||
"llm_chat_home": "Los nuevos chats de IA se crean como notas hijas de esta nota.",
|
||||
"workspace_llm_chat_home": "Los nuevos chats de IA se crean como notas hijas de esta nota cuando se eleva la vista a una nota antecesora de este espacio de trabajo.",
|
||||
"date_pattern": "Patrón para los títulos de las notas diarias generadas bajo esta raíz del calendario; por ejemplo, <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -861,15 +858,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Crear nueva división"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Editar esta nota"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Mostrar tabla de contenido"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Mostrar lista de destacados"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menú",
|
||||
"options": "Opciones",
|
||||
@@ -970,9 +958,6 @@
|
||||
"active": "La sesión protegida está activa. Dé clic para salir de la sesión protegida.",
|
||||
"inactive": "Dé clic para ingresar a la sesión protegida"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Revisiones de nota"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Actualización disponible"
|
||||
},
|
||||
@@ -987,27 +972,11 @@
|
||||
"sql_console_saved_message": "La nota de la consola SQL se ha guardado en {{note_path}}",
|
||||
"electron_api_docs_button_title": "Abrir la documentación de la API de Electron"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Copiar la referencia de la imagen al portapapeles; se puede pegar en una nota de texto."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Ocultar botones"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Mostrar botones"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Exportar diagrama como SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Crear una subnota y agregarla al mapa",
|
||||
"create_child_note_text": "Agregar nota"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "relación",
|
||||
"backlink_one": "{{count}} Vínculo de retroceso",
|
||||
"backlink_many": "",
|
||||
"backlink_other": "{{count}} Vínculos de retroceso",
|
||||
"no_backlinks": "No hay notas asociadas a este elemento."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1037,8 +1006,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Tipo de nota",
|
||||
"editable": "Editable",
|
||||
"basic_properties": "Propiedades básicas",
|
||||
"language": "Idioma",
|
||||
"configure_code_notes": "Configurar notas de código..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1070,37 +1037,23 @@
|
||||
"dashboard": "Panel"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aún no hay notas editadas en este día...",
|
||||
"title": "Notas editadas",
|
||||
"deleted": "(eliminado)"
|
||||
"no_edited_notes_found": "Aún no hay notas editadas en este día..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "ID de nota",
|
||||
"original_file_name": "Nombre del archivo original",
|
||||
"file_type": "Tipo de archivo",
|
||||
"file_size": "Tamaño del archivo",
|
||||
"download": "Descargar",
|
||||
"open": "Abrir externamente",
|
||||
"upload_new_revision": "Subir nueva revisión",
|
||||
"upload_success": "Se ha subido una nueva revisión de archivo.",
|
||||
"upload_failed": "Error al cargar una nueva revisión de archivo.",
|
||||
"title": "Archivo"
|
||||
"upload_failed": "Error al cargar una nueva revisión de archivo."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Nombre del archivo original",
|
||||
"file_type": "Tipo de archivo",
|
||||
"file_size": "Tamaño del archivo",
|
||||
"download": "Descargar",
|
||||
"open": "Abrir",
|
||||
"copy_reference_to_clipboard": "Copiar referencia al portapapeles",
|
||||
"upload_new_revision": "Subir nueva revisión",
|
||||
"upload_success": "Se ha subido una nueva revisión de imagen.",
|
||||
"upload_failed": "Error al cargar una nueva revisión de imagen: {{message}}",
|
||||
"title": "Imagen"
|
||||
"upload_failed": "Error al cargar una nueva revisión de imagen: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Atributos heredados",
|
||||
"no_inherited_attributes": "Sin atributos heredados.",
|
||||
"none": "ninguno"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1119,8 +1072,6 @@
|
||||
"show_similar_notes": "Mostrar notas similares"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Ampliar al máximo",
|
||||
"collapse": "Contraer al tamaño normal",
|
||||
"title": "Mapa de notas",
|
||||
"fix-nodes": "Fijar nodos",
|
||||
"link-distance": "Distancia de enlace",
|
||||
@@ -1133,19 +1084,11 @@
|
||||
"note_paths": {
|
||||
"title": "Rutas de nota",
|
||||
"clone_button": "Clonar nota a nueva ubicación...",
|
||||
"intro_placed": "Esta nota está colocada en las siguientes rutas:",
|
||||
"intro_not_placed": "Esta nota aún no se ha colocado en el árbol de notas.",
|
||||
"outside_hoisted": "Esta ruta está fuera de la nota anclada y habría que bajarla.",
|
||||
"archived": "Archivado",
|
||||
"search": "Buscar"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Esta nota fue tomada originalmente de:",
|
||||
"info": "Información"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Atributos propios"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Atributos promovidos",
|
||||
"unset-field-placeholder": "no establecido",
|
||||
@@ -1172,12 +1115,6 @@
|
||||
"drawn_by_collection": "La colección se organiza por esto, por lo que sus elementos no lo repiten",
|
||||
"display_on_items": "Mostrar el atributo en los elementos de la colección"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Consulta",
|
||||
"script": "Script",
|
||||
"execute_query": "Ejecutar consulta",
|
||||
"execute_script": "Ejecutar script"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Agregar opción de búsqueda:",
|
||||
"search_string": "cadena de búsqueda",
|
||||
@@ -1473,9 +1410,6 @@
|
||||
"enabled": "activado",
|
||||
"disabled": "desactivado"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "La pestaña de la cinta Notas editadas se abrirá automáticamente en las notas del día"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Interfaz de usuario",
|
||||
"theme_label": "Tema de aplicación",
|
||||
@@ -1642,17 +1576,7 @@
|
||||
"italic": "Texto en cursiva",
|
||||
"underline": "Texto subrayado",
|
||||
"color": "Texto con color",
|
||||
"bg_color": "Texto con color de fondo",
|
||||
"visibility_title": "Visibilidad de la lista de puntos destacados",
|
||||
"visibility_description": "Puede ocultar el widget de puntos destacados por nota agregando la etiqueta #hideHighlightWidget.",
|
||||
"shortcut_info": "Puede configurar un método abreviado de teclado para alternar rápidamente el panel derecho (incluidos los puntos destacados) en Opciones -> Atajos (nombre 'toggleRightPane')."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Tabla de contenido",
|
||||
"description": "La tabla de contenido aparecerá en las notas de texto cuando la nota tenga más de un número definido de títulos. Puede personalizar este número:",
|
||||
"unit": "títulos",
|
||||
"disable_info": "También puede utilizar esta opción para desactivar la TDC (TOC) de forma efectiva estableciendo un número muy alto.",
|
||||
"shortcut_info": "Puede configurar un atajo de teclado para alternar rápidamente el panel derecho (incluido el TDC) en Opciones -> Atajos (nombre 'toggleRightPane')."
|
||||
"bg_color": "Texto con color de fondo"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Tamaño para modo de solo lectura automático",
|
||||
@@ -1953,9 +1877,7 @@
|
||||
"kind_and_size": "{{role}} · {{size}}"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Marcador",
|
||||
"bookmark_this_note": "Agregar esta nota a marcadores en el panel lateral izquierdo",
|
||||
"remove_bookmark": "Eliminar marcador"
|
||||
"bookmark": "Marcador"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Automático",
|
||||
@@ -2008,13 +1930,6 @@
|
||||
"hide-subtree": "Ocultar subárbol",
|
||||
"show-subtree": "Mostrar subárbol"
|
||||
},
|
||||
"shared_info": {
|
||||
"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 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>.",
|
||||
"shared_preview": "Esta nota está compartida en {{- link}}, pero solo este navegador puede abrir esa página, y solo mientras Trilium esté abierto en él. Publicarla para otros requiere un servidor Trilium.",
|
||||
"shared_export_only": "Esta nota está compartida, pero la aplicación móvil no puede abrir páginas compartidas. Para publicarla, exporte el subárbol como \"{{format}}\" y aloje los archivos en cualquier servidor web, o utilice un servidor Trilium."
|
||||
},
|
||||
"note_types": {
|
||||
"text": "Texto",
|
||||
"code": "Código",
|
||||
@@ -2045,22 +1960,15 @@
|
||||
"built-in-templates": "Plantillas integradas"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Proteger la nota",
|
||||
"toggle-off": "Desproteger la nota",
|
||||
"toggle-on-hint": "La nota no está protegida, dé clic para protegerla",
|
||||
"toggle-off-hint": "La nota está protegida, dé clic para desprotegerla"
|
||||
"toggle-on": "Proteger la nota"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Compartida",
|
||||
"toggle-on-title": "Compartir la nota",
|
||||
"toggle-off-title": "Descompartir la nota",
|
||||
"shared-branch": "Esta nota sólo existe como una nota compartida, si la deja de compartir será eliminada. ¿Quiere continuar y eliminar esta nota?",
|
||||
"inherited": "No puede dejar de compartir la nota aquí porque es compartida a través de la herencia de un ancestro."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Plantilla",
|
||||
"toggle-on-hint": "Hacer de la nota una plantilla",
|
||||
"toggle-off-hint": "Eliminar la nota como una plantilla"
|
||||
"template": "Plantilla"
|
||||
},
|
||||
"open-help-page": "Abrir página de ayuda",
|
||||
"find": {
|
||||
@@ -2072,8 +1980,6 @@
|
||||
"replace_all": "Reemplazar todo"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Lista de destacados",
|
||||
"options": "Opciones",
|
||||
"title_with_count_one": "{{count}} punto destacado",
|
||||
"title_with_count_many": "",
|
||||
"title_with_count_other": "{{count}} puntos destacados",
|
||||
@@ -2181,7 +2087,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Tabla de contenido",
|
||||
"options": "Opciones",
|
||||
"no_headings": "Sin encabezados."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2272,9 +2177,6 @@
|
||||
"tab_width_unit": "espacios",
|
||||
"click_to_copy": "Haga clic para copiar"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formato"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Editor"
|
||||
},
|
||||
@@ -2282,12 +2184,10 @@
|
||||
"editor_type": {
|
||||
"label": "Barra de herramientas de formato",
|
||||
"floating": {
|
||||
"title": "Flotante",
|
||||
"description": "las herramientas de edición aparecen cerca del cursor;"
|
||||
"title": "Flotante"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Fijo",
|
||||
"description": "las herramientas de edición aparecen en la pestaña de la cinta \"Formato\")."
|
||||
"title": "Fijo"
|
||||
},
|
||||
"multiline-toolbar": "Mostrar la barra de herramientas en múltiples líneas si no cabe",
|
||||
"toolbar_style": "Estilo de barra de herramientas"
|
||||
@@ -2450,13 +2350,6 @@
|
||||
"title_vertical": "Mover el panel de edición hacia abajo",
|
||||
"title_horizontal": "Mover el panel de edición a la izquierda"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Desbloquear la edición",
|
||||
"lock-editing": "Bloquear la edición"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Exportar diagrama como PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "El diagrama no pudo ser exportado a PNG.",
|
||||
"export_to_svg": "El diagrama no pudo ser exportado a SVG.",
|
||||
@@ -2718,9 +2611,6 @@
|
||||
"background_effects_message": "En los dispositivos Windows y macOS, los efectos de fondo ya son estables. Los efectos de fondo añaden un toque de color a la interfaz de usuario difuminando el fondo que hay detrás.",
|
||||
"background_effects_button": "Activar efectos de fondo",
|
||||
"dismiss": "Desestimar",
|
||||
"new_layout_title": "Nuevo diseño",
|
||||
"new_layout_message": "Hemos introducido un diseño modernizado para Trilium. La cinta se ha eliminado y se ha integrado perfectamente en la interfaz principal, con una nueva barra de estado y secciones ampliables (como los atributos promovidos) que tienen funciones clave.\n\nEl nuevo diseño está habilitado por defecto, y puede ser deshabilitado temporalmente a través de Opciones → Apariencia.",
|
||||
"new_layout_button": "Más información",
|
||||
"scripting_disabled_title": "Se han deshabilitado los scripts de backend",
|
||||
"scripting_disabled_message": "Los scripts de backend están ahora deshabilitados de forma predeterminada por seguridad. Sus notas contienen scripts de backend (notas con una etiqueta #run) que ya no se ejecutarán automáticamente.\n\nSi depende de estos scripts, puede volver a habilitar los scripts de backend en los ajustes de seguridad.",
|
||||
"scripting_disabled_button": "Abrir ajustes de seguridad"
|
||||
@@ -2743,9 +2633,6 @@
|
||||
"related_code_blocks": "Esquema de colores para bloques de código en notas de texto",
|
||||
"related_code_notes": "Esquema de colores para notas de código",
|
||||
"ui": "Interfaz de usuario",
|
||||
"ui_old_layout": "Antiguo diseño",
|
||||
"ui_new_layout": "Nuevo diseño",
|
||||
"ui_layout_style": "Estilo de diseño",
|
||||
"ui_layout_orientation": "Orientación de la barra de lanzamiento"
|
||||
},
|
||||
"units": {
|
||||
@@ -2767,8 +2654,6 @@
|
||||
"rendering_error": "No se puede mostrar contenido debido a un error."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Actualmente, está viendo una nota de solo lectura.",
|
||||
"auto-read-only-note": "Esta nota se muestra en modo de solo lectura para una carga más rápida.",
|
||||
"edit-note": "Editar nota"
|
||||
},
|
||||
"calendar_view": {
|
||||
@@ -2856,8 +2741,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Opciones experimentales",
|
||||
"disclaimer": "Estas opciones son experimentales y pueden causar inestabilidad. Úselas con precaución.",
|
||||
"new_layout_name": "Nuevo diseño",
|
||||
"new_layout_description": "Pruebe el nuevo diseño para tener un aspecto más moderno y usabilidad mejorada. Sujeto a grandes cambios en las próximas versiones.",
|
||||
"llm_name": "Chat de IA / LLM",
|
||||
"llm_description": "Habilitar la barra lateral de chat de IA y las notas de chat LLM alimentadas por grandes modelos de lenguaje."
|
||||
},
|
||||
|
||||
@@ -418,7 +418,6 @@
|
||||
"hide_relations": "noms de relations délimités par des virgules qui doivent être masqués. Tous les autres seront affichés.",
|
||||
"title_template": "titre par défaut des notes créées en tant qu'enfants de cette note. La valeur est évaluée sous forme de chaîne JavaScript \n et peut ainsi être enrichi de contenu dynamique via les variables injectées <code>now</code> et <code>parentNote</code>. Exemples :\n \n <ul>\n <li><code>Œuvres littéraires de ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Connectez-vous pour ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki avec plus de détails</a>, la documentation sur l'API pour <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> et <a href=\"https://day.js.org/docs/en/display/format\">maintenant</a> pour plus de détails.",
|
||||
"template": "Cette note apparaîtra parmi les modèles disponibles lors de la création d'une nouvelle note",
|
||||
"toc": "<code>#toc</code> ou <code>#toc=show</code> forcera l'affichage de la table des matières, <code>#toc=hide</code> force qu'elle soit masquée. Si le label n'existe pas, le paramètre global est utilisé",
|
||||
"color": "définit la couleur de la note dans l'arborescence des notes, les liens, etc. Utilisez n'importe quelle valeur de couleur CSS valide comme « rouge » ou #a13d5f",
|
||||
"keyboard_shortcut": "Définit un raccourci clavier qui ouvrira immédiatement cette note. Exemple : 'ctrl+alt+e'. Nécessite un rechargement du frontend pour que la modification prenne effet.",
|
||||
"keep_current_hoisting": "L'ouverture de ce lien ne modifiera pas le focus même si la note n'est pas affichable dans le sous-arbre actuellement focus.",
|
||||
@@ -426,7 +425,6 @@
|
||||
"execute_description": "Description plus longue de la note de code actuelle affichée avec le bouton d'exécution",
|
||||
"exclude_from_note_map": "Les notes avec ce label seront masquées de la carte des notes",
|
||||
"new_notes_on_top": "Les nouvelles notes seront créées en haut de la note parent, et non en bas.",
|
||||
"hide_highlight_widget": "Masquer le widget Important",
|
||||
"run_on_note_creation": "s'exécute lorsque la note est créée dans le backend. Utilisez cette relation si vous souhaitez exécuter le script pour toutes les notes créées sous un sous-arbre spécifique. Dans ce cas, créez-le sur la note racine du sous-arbre et rendez-la héritable. Une nouvelle note créée dans le sous-arbre (peu importe la profondeur) déclenchera le script.",
|
||||
"run_on_child_note_creation": "s'exécute lorsqu'une nouvelle note est créée sous la note où cette relation est définie",
|
||||
"run_on_note_title_change": "s'exécute lorsque le titre de la note est modifié (inclut également la création de notes)",
|
||||
@@ -634,15 +632,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Créer une nouvelle division"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Modifier cette note"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Afficher la Table des matières"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Afficher la liste des Mises en évidence"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menu",
|
||||
"options": "Paramètres",
|
||||
@@ -734,9 +723,6 @@
|
||||
"active": "La session protégée est active. Cliquez pour quitter la session protégée.",
|
||||
"inactive": "Cliquez pour accéder à une session protégée"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Versions des Notes"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Mise à jour disponible"
|
||||
},
|
||||
@@ -751,27 +737,9 @@
|
||||
"sql_console_saved_message": "La note de la console SQL a été enregistrée dans {{note_path}}",
|
||||
"electron_api_docs_button_title": "Ouvrir la documentation de l'API Electron"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Copier la référence de l'image dans le presse-papiers, peut être collée dans une note textuelle."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Masquer les boutons"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Afficher les boutons"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Exporter le diagramme au format SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Créer une note enfant et l'ajouter à la carte"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "relation",
|
||||
"backlink_one": "{{count}} Rétrolien",
|
||||
"backlink_many": "{{count}} Rétroliens",
|
||||
"backlink_other": "{{count}} Rétrolien"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "Insérer une note enfant",
|
||||
"delete_this_note": "Supprimer cette note",
|
||||
@@ -798,8 +766,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Type de note",
|
||||
"editable": "Modifiable",
|
||||
"basic_properties": "Propriétés de base",
|
||||
"language": "Langage",
|
||||
"configure_code_notes": "Configurer les notes de code..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -830,37 +796,23 @@
|
||||
"dashboard": "Tableau de bord"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
|
||||
"title": "Notes modifiées",
|
||||
"deleted": "(supprimé)"
|
||||
"no_edited_notes_found": "Aucune note modifiée ce jour-là..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "Identifiant de la note",
|
||||
"original_file_name": "Nom du fichier d'origine",
|
||||
"file_type": "Type de fichier",
|
||||
"file_size": "Taille du fichier",
|
||||
"download": "Télécharger",
|
||||
"open": "Ouvrir dans une nouvelle fenêtre",
|
||||
"upload_new_revision": "Téléverser une nouvelle version",
|
||||
"upload_success": "Une nouvelle version de fichier a été téléversée.",
|
||||
"upload_failed": "Le téléversement d'une nouvelle version de fichier a échoué.",
|
||||
"title": "Fichier"
|
||||
"upload_failed": "Le téléversement d'une nouvelle version de fichier a échoué."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Nom du fichier d'origine",
|
||||
"file_type": "Type de fichier",
|
||||
"file_size": "Taille du fichier",
|
||||
"download": "Télécharger",
|
||||
"open": "Ouvrir",
|
||||
"copy_reference_to_clipboard": "Copier la référence dans le presse-papiers",
|
||||
"upload_new_revision": "Téléverser une nouvelle version",
|
||||
"upload_success": "Une nouvelle version d'image a été téléversée.",
|
||||
"upload_failed": "Échec de l'importation d'une nouvelle version d'image : {{message}}",
|
||||
"title": "Image"
|
||||
"upload_failed": "Échec de l'importation d'une nouvelle version d'image : {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Attributs hérités",
|
||||
"no_inherited_attributes": "Aucun attribut hérité.",
|
||||
"none": "aucun"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -879,8 +831,6 @@
|
||||
"show_similar_notes": "Afficher des notes similaires"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Développer au maximum",
|
||||
"collapse": "Réduire à la taille normale",
|
||||
"title": "Carte des notes",
|
||||
"fix-nodes": "Réparer les nœuds",
|
||||
"link-distance": "Longueur des liens",
|
||||
@@ -892,19 +842,11 @@
|
||||
"note_paths": {
|
||||
"title": "Chemins de la Note",
|
||||
"clone_button": "Cloner la note vers un nouvel emplacement...",
|
||||
"intro_placed": "Cette note est située dans les chemins suivants :",
|
||||
"intro_not_placed": "Cette note n'est pas encore située dans l'arbre des notes.",
|
||||
"outside_hoisted": "Ce chemin est en dehors de la note focus et vous devrez désactiver le focus.",
|
||||
"archived": "Archivé",
|
||||
"search": "Recherche"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Cette note est initialement extraite de :",
|
||||
"info": "Infos"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Attributs propres"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Attributs promus",
|
||||
"unset-field-placeholder": "non défini",
|
||||
@@ -916,12 +858,6 @@
|
||||
"remove_this_attribute": "Supprimer cet attribut",
|
||||
"remove_color": "Supprimer l’étiquette de couleur"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Requête",
|
||||
"script": "Script",
|
||||
"execute_query": "Exécuter la requête",
|
||||
"execute_script": "Exécuter le script"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Ajouter une option de recherche :",
|
||||
"search_string": "chaîne de caractères à rechercher",
|
||||
@@ -1194,9 +1130,6 @@
|
||||
"enabled": "activé",
|
||||
"disabled": "désactivé"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "L’onglet du ruban \"Notes modifiées\" s’ouvrira automatiquement sur les notes du jour"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Interface utilisateur",
|
||||
"theme_label": "Thème de l'application",
|
||||
@@ -1348,17 +1281,7 @@
|
||||
"italic": "Texte en italique",
|
||||
"underline": "Texte souligné",
|
||||
"color": "Texte en couleur",
|
||||
"bg_color": "Texte avec couleur de fond",
|
||||
"visibility_title": "Visibilité de la Liste des Mises en évidence",
|
||||
"visibility_description": "Vous pouvez masquer le widget des mises en évidence par note en ajoutant un label #hideHighlightWidget.",
|
||||
"shortcut_info": "Vous pouvez configurer un raccourci clavier pour basculer rapidement vers le volet droit (comprenant les Mises en évidence) dans Paramètres -> Raccourcis (nom « toggleRightPane »)."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"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 Paramètres -> Raccourcis (nom « toggleRightPane »).",
|
||||
"unit": "titres"
|
||||
"bg_color": "Texte avec couleur de fond"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Taille pour la lecture seule automatique",
|
||||
@@ -1521,9 +1444,7 @@
|
||||
"unrecognized_role": "Rôle de pièce jointe « {{role}} » non reconnu."
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Favori",
|
||||
"bookmark_this_note": "Ajouter cette note à vos favoris dans le panneau latéral gauche",
|
||||
"remove_bookmark": "Supprimer le favori"
|
||||
"bookmark": "Favori"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Auto",
|
||||
@@ -1576,11 +1497,6 @@
|
||||
"hide-subtree": "Masquer le sous-arbre",
|
||||
"show-subtree": "Afficher le sous-arbre"
|
||||
},
|
||||
"shared_info": {
|
||||
"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 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||
},
|
||||
"note_types": {
|
||||
"text": "Texte",
|
||||
"code": "Code",
|
||||
@@ -1609,22 +1525,15 @@
|
||||
"markdown": "Markdown"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Protéger la note",
|
||||
"toggle-off": "Déprotéger la note",
|
||||
"toggle-on-hint": "La note n'est pas protégée, cliquez pour la protéger",
|
||||
"toggle-off-hint": "La note est protégée, cliquez pour ne plus la protéger"
|
||||
"toggle-on": "Protéger la note"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Partagé",
|
||||
"toggle-on-title": "Partager la note",
|
||||
"toggle-off-title": "Ne plus partager de la note",
|
||||
"shared-branch": "Cette note existe uniquement en tant que note partagée, l'annulation du partage la supprimerait. Voulez-vous continuer et ainsi supprimer cette note ?",
|
||||
"inherited": "Il n'est pas possible de ne plus partager cette note, car son partage est défini par héritage d'une note ancêtre."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Modèle",
|
||||
"toggle-on-hint": "Faire de la note un modèle",
|
||||
"toggle-off-hint": "Supprimer la note comme modèle"
|
||||
"template": "Modèle"
|
||||
},
|
||||
"open-help-page": "Ouvrir la page d'aide",
|
||||
"find": {
|
||||
@@ -1636,8 +1545,6 @@
|
||||
"replace_all": "Tout remplacer"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Mises en évidence",
|
||||
"options": "Options",
|
||||
"title_with_count_one": "{{count}} mise en évidence",
|
||||
"title_with_count_many": "{{count}} mises en évidence",
|
||||
"title_with_count_other": "{{count}} mises en évidence",
|
||||
@@ -1740,7 +1647,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Table des matières",
|
||||
"options": "Options",
|
||||
"no_headings": "Aucun titre défini."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -1821,9 +1727,6 @@
|
||||
"tab_width": "Largeur de tabulation",
|
||||
"tab_width_unit": "espaces"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Mise en forme"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Éditeur"
|
||||
},
|
||||
@@ -1831,12 +1734,10 @@
|
||||
"editor_type": {
|
||||
"label": "Barre d'outils d'édition",
|
||||
"floating": {
|
||||
"title": "Flottante",
|
||||
"description": "les outils d'édition apparaissent près du curseur ;"
|
||||
"title": "Flottante"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Fixe",
|
||||
"description": "les outils d'édition apparaissent dans l'onglet \"Mise en forme\"."
|
||||
"title": "Fixe"
|
||||
},
|
||||
"multiline-toolbar": "Afficher la barre d'outils sur plusieurs lignes si elle est trop grande",
|
||||
"toolbar_style": "Style de la barre d’outils"
|
||||
@@ -2106,9 +2007,6 @@
|
||||
"background_effects_message": "Sur les appareils Windows et macOS les effets d'arrière-plan sont désormais stables. Ils ajoutent une touche de couleur à l'interface utilisateur en floutant l'arrière-plan.",
|
||||
"background_effects_button": "Activer les effets d'arrière-plan",
|
||||
"dismiss": "Rejeter",
|
||||
"new_layout_title": "Nouvelle mise en page",
|
||||
"new_layout_message": "Nous avons introduit une mise en page modernisée pour Trilium. Le ruban a été supprimé et intégré de manière transparente dans l'interface principale, avec une nouvelle barre d'état et des sections extensibles (telles que les attributs promus) reprenant les fonctions clés.\n\nLa nouvelle mise en page est activée par défaut et peut être temporairement désactivée via Paramètres → Apparence.",
|
||||
"new_layout_button": "Plus d'infos",
|
||||
"scripting_disabled_title": "Le scripting backend a été désactivé",
|
||||
"scripting_disabled_message": "Le scripting backend est désormais désactivé par défaut pour des raisons de sécurité. Vos notes contiennent des scripts backend (notes avec un label #run) qui ne s'exécuteront plus automatiquement.\n\nSi vous dépendez de ces scripts, vous pouvez réactiver le scripting backend dans les paramètres de sécurité.",
|
||||
"scripting_disabled_button": "Ouvrir les paramètres de sécurité"
|
||||
@@ -2120,9 +2018,6 @@
|
||||
"related_code_blocks": "Schéma de couleurs des blocs de code dans les notes de texte",
|
||||
"related_code_notes": "Schéma de couleurs pour les notes de code",
|
||||
"ui": "Interface utilisateur",
|
||||
"ui_old_layout": "Ancien",
|
||||
"ui_new_layout": "Nouveau",
|
||||
"ui_layout_style": "Style de disposition",
|
||||
"ui_layout_orientation": "Orientation de la barre de raccourcis"
|
||||
},
|
||||
"units": {
|
||||
@@ -2166,13 +2061,6 @@
|
||||
"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.",
|
||||
"export_to_svg": "Le diagramme n'a pas pu être exporté en SVG."
|
||||
@@ -2208,14 +2096,10 @@
|
||||
"experimental_features": {
|
||||
"title": "Fonctionnalités expérimentales",
|
||||
"disclaimer": "Ces fonctionnalités sont expérimentales et peuvent provoquer une instabilité. Utilisez les avec prudence.",
|
||||
"new_layout_name": "Nouvelle mise en page",
|
||||
"new_layout_description": "Essayez la nouvelle mise en page pour un look plus moderne et un usage améliorée. Sous réserve de changements importants dans les prochaines versions.",
|
||||
"llm_name": "AI / LLM Chat",
|
||||
"llm_description": "Activer la barre de chat AI et les notes de chat LLM alimentées par de grands modèles de langage."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Vous consultez actuellement une note en lecture seule.",
|
||||
"auto-read-only-note": "Cette note s'affiche en mode lecture seule pour un chargement plus rapide.",
|
||||
"edit-note": "Modifier la note"
|
||||
},
|
||||
"calendar_view": {
|
||||
|
||||
@@ -490,7 +490,6 @@
|
||||
"hide_relations": "Ainmneacha caidrimh atá scartha le camóga agus ba chóir iad a cheilt. Taispeánfar na cinn eile go léir.",
|
||||
"title_template": "Teideal réamhshocraithe nótaí a cruthaíodh mar leanaí an nóta seo. Déantar an luach a mheas mar theaghrán JavaScript\n agus dá bhrí sin is féidir é a shaibhriú le hábhar dinimiciúil trí na hathróga <code>now</code> agus <code>parentNote</code> insteallta. Samplaí:\n \n <ul>\n <li><code>Saothair liteartha ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Log le haghaidh ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n\n Féach <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">vicí le sonraí</a>, doiciméid API le haghaidh <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> agus <a href=\"https://day.js.org/docs/en/display/format\">now</a> le haghaidh sonraí.",
|
||||
"template": "Beidh an nóta seo le feiceáil i rogha na dteimpléad atá ar fáil agus nóta nua á chruthú.",
|
||||
"toc": "Cuirfidh <code>#toc</code> nó <code>#toc=show</code> iallach ar an gClár Ábhair a bheith le feiceáil, cuirfidh <code>#toc=hide</code> iallach air é a cheilt. Mura bhfuil an lipéad ann, breathnaítear ar an socrú domhanda.",
|
||||
"color": "Sainmhíníonn sé dath an nóta sa chrann nótaí, snaisc srl. Bain úsáid as aon luach datha CSS bailí cosúil le 'dearg' nó #a13d5f.",
|
||||
"keyboard_shortcut": "Sainmhíníonn sé seo aicearra méarchláir a léimfidh láithreach chuig an nóta seo. Sampla: 'ctrl+alt+e'. Éilítear athlódáil an tosaigh chun go dtiocfaidh an t-athrú i bhfeidhm.",
|
||||
"keep_current_hoisting": "Ní athróidh oscailt an naisc seo an t-ardú fiú mura bhfuil an nóta inléite sa fho-chrann ardaithe reatha.",
|
||||
@@ -498,7 +497,6 @@
|
||||
"execute_description": "Cur síos níos faide ar an nóta cóid reatha a thaispeántar in éineacht leis an gcnaipe forghníomhaithe.",
|
||||
"exclude_from_note_map": "Beidh nótaí leis an lipéad seo i bhfolach ón Léarscáil Nótaí.",
|
||||
"new_notes_on_top": "Cruthófar nótaí nua ag barr an nóta tuismitheora, ní ag an mbun.",
|
||||
"hide_highlight_widget": "Folaíonn sé seo an Liosta Buaicphointí don nóta seo, agus fágann sé le feiceáil ar gach ceann eile é.",
|
||||
"run_on_note_creation": "Ritheann sé seo nuair a chruthaítear nóta ar an gcúltaca. Úsáid an gaol seo más mian leat an script a rith do gach nóta a cruthaíodh faoi fho-chrann ar leith. Sa chás sin, cruthaigh é ar fhréamhnóta an fho-chrainn agus déan é inoidhreachta. Cuirfidh nóta nua a chruthaítear laistigh den fho-chrann (aon doimhneacht) an script i ngníomh.",
|
||||
"run_on_child_note_creation": "Déantar é a fhorghníomhú nuair a chruthaítear nóta nua faoin nóta ina bhfuil an gaol seo sainmhínithe.",
|
||||
"run_on_note_title_change": "Déantar é a fhorghníomhú nuair a athraítear teideal an nóta (lena n-áirítear cruthú nótaí chomh maith).",
|
||||
@@ -546,7 +544,6 @@
|
||||
"show_all_in_search": "Taispeáin gach rud sa chuardach",
|
||||
"relation_type": "Gaol",
|
||||
"versioning_limit": "Cuireann sé teorainn le líon na n-athbhreithnithe a choinníonn an nóta seo, ag sárú an socraithe dhomhanda.",
|
||||
"similar_notes_widget_disabled": "Díchumasaíonn sé seo an cluaisín ribín Nótaí Cosúla don nóta seo. Seanleagan amach amháin.",
|
||||
"llm_chat_home": "Cruthaítear comhráite nua AI mar leanaí den nóta seo.",
|
||||
"workspace_llm_chat_home": "Cruthaítear comhráite nua AI mar leanaí den nóta seo agus iad ardaithe chuig sinsear den spás oibre seo.",
|
||||
"date_pattern": "Patrún do theidil na nótaí lae a ghintear faoin bhfréamh féilire seo, m.sh. <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -900,15 +897,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Cruthaigh scoilt nua"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Cuir an nóta seo in eagar"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Taispeáin Clár Ábhair"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Taispeáin Liosta Buaicphointí"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Scoir Mód Zen"
|
||||
},
|
||||
@@ -976,9 +964,6 @@
|
||||
"active": "Tá an seisiún cosanta gníomhach. Cliceáil chun an seisiún cosanta a fhágáil.",
|
||||
"inactive": "Cliceáil chun dul isteach i seisiún faoi chosaint"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Athbhreithnithe Nótaí"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Nuashonrú ar fáil"
|
||||
},
|
||||
@@ -993,29 +978,11 @@
|
||||
"sql_console_saved_message": "Tá nóta Consól SQL sábháilte i {{note_path}}",
|
||||
"electron_api_docs_button_title": "Doiciméid API Open Electron"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Cóipeáil tagairt íomhá chuig an ghearrthaisce, is féidir é a ghreamú i nóta téacs."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Folaigh cnaipí"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Taispeáin cnaipí"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Easpórtáil léaráid mar SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Cruthaigh nóta linbh agus cuir leis an léarscáil é",
|
||||
"create_child_note_text": "Cuir nóta leis"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_one": "{{count}} Nasc siar",
|
||||
"backlink_two": "{{count}} Naisc siar",
|
||||
"backlink_few": "{{count}} Naisc siar",
|
||||
"backlink_many": "{{count}} Naisc siar",
|
||||
"backlink_other": "{{count}} Naisc siar",
|
||||
"relation": "gaol",
|
||||
"no_backlinks": "Níl aon nasc nótaí leis an gceann seo."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1047,8 +1014,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Cineál nóta",
|
||||
"editable": "In-eagarthóireacht",
|
||||
"basic_properties": "Airíonna Bunúsacha",
|
||||
"language": "Teanga",
|
||||
"configure_code_notes": "Cumraigh nótaí cóid..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1082,37 +1047,23 @@
|
||||
"open_all_limit_exceeded": "An iomarca nótaí le hoscailt ag an am céanna ({{count}}). Is é {{max}} an t-uasmhéid, déan iarracht na torthaí a chúngú ar dtús."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Gan aon nótaí eagarthóireachta ar an lá seo go fóill...",
|
||||
"title": "Nótaí Eagarthóireachta",
|
||||
"deleted": "(scriosta)"
|
||||
"no_edited_notes_found": "Gan aon nótaí eagarthóireachta ar an lá seo go fóill..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "Aitheantas Nóta",
|
||||
"original_file_name": "Ainm comhaid bunaidh",
|
||||
"file_type": "Cineál comhaid",
|
||||
"file_size": "Méid comhaid",
|
||||
"download": "Íoslódáil",
|
||||
"open": "Oscail go seachtrach",
|
||||
"upload_new_revision": "Uaslódáil athbhreithniú nua",
|
||||
"upload_success": "Tá athbhreithniú comhaid nua uaslódáilte.",
|
||||
"upload_failed": "Theip ar uaslódáil athbhreithniú comhaid nua.",
|
||||
"title": "Comhad"
|
||||
"upload_failed": "Theip ar uaslódáil athbhreithniú comhaid nua."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Ainm comhaid bunaidh",
|
||||
"file_type": "Cineál comhaid",
|
||||
"file_size": "Méid comhaid",
|
||||
"download": "Íoslódáil",
|
||||
"open": "Oscail",
|
||||
"copy_reference_to_clipboard": "Cóipeáil tagairt chuig an ghearrthaisce",
|
||||
"upload_new_revision": "Uaslódáil athbhreithniú nua",
|
||||
"upload_success": "Tá athbhreithniú nua íomhá uaslódáilte.",
|
||||
"upload_failed": "Theip ar uaslódáil athbhreithniú íomhá nua: {{message}}",
|
||||
"title": "Íomhá"
|
||||
"upload_failed": "Theip ar uaslódáil athbhreithniú íomhá nua: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Tréithe Oidhreachta",
|
||||
"no_inherited_attributes": "Gan aon tréithe oidhreachta.",
|
||||
"none": "aon cheann"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1133,8 +1084,6 @@
|
||||
"show_similar_notes": "Taispeáin nótaí comhchosúla"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Leathnaigh go hiomlán",
|
||||
"collapse": "Laghdaigh go dtí an gnáthmhéid",
|
||||
"title": "Léarscáil Nótaí",
|
||||
"fix-nodes": "Deisigh nóid",
|
||||
"link-distance": "Fad naisc",
|
||||
@@ -1149,19 +1098,11 @@
|
||||
"note_paths": {
|
||||
"title": "Cosáin Nótaí",
|
||||
"clone_button": "Nóta clónáilte chuig suíomh nua...",
|
||||
"intro_placed": "Cuirtear an nóta seo sna cosáin seo a leanas:",
|
||||
"intro_not_placed": "Níl an nóta seo curtha sa chrann nótaí go fóill.",
|
||||
"outside_hoisted": "Tá an cosán seo lasmuigh den nóta ardaithe agus bheadh ort é a dhíardú.",
|
||||
"archived": "Cartlannaithe",
|
||||
"search": "Cuardaigh"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Tógadh an nóta seo ar dtús ó:",
|
||||
"info": "Eolas"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Tréithe faoi Úinéireacht"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Tréithe Curtha Chun Cinn",
|
||||
"unset-field-placeholder": "gan socrú",
|
||||
@@ -1188,12 +1129,6 @@
|
||||
"drawn_by_collection": "Tá an bailiúchán eagraithe de réir an méid sin, agus mar sin ní dhéantar é a athrá sna míreanna ann",
|
||||
"display_on_items": "Taispeáin an tréith ar mhíreanna an bhailiúcháin"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Iarratas",
|
||||
"script": "Script",
|
||||
"execute_query": "Cuir Iarratas i bhFeidhm",
|
||||
"execute_script": "Rith an Script"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Cuir rogha cuardaigh leis:",
|
||||
"search_string": "teaghrán cuardaigh",
|
||||
@@ -1445,8 +1380,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Roghanna Turgnamhacha",
|
||||
"disclaimer": "Is roghanna turgnamhacha iad seo agus d’fhéadfadh éagobhsaíocht a bheith mar thoradh orthu. Bain úsáid astu go cúramach.",
|
||||
"new_layout_name": "Leagan Amach Nua",
|
||||
"new_layout_description": "Bain triail as an leagan amach nua le haghaidh cuma níos nua-aimseartha agus inúsáidteachta feabhsaithe. Tá sé faoi réir athruithe móra sna heisiúintí atá le teacht.",
|
||||
"llm_name": "Comhrá AI / LLM",
|
||||
"llm_description": "Cumasaigh an taobhbharra comhrá AI agus nótaí comhrá LLM faoi thiomáint ag samhlacha teanga móra."
|
||||
},
|
||||
@@ -1499,9 +1432,6 @@
|
||||
"enabled": "cumasaithe",
|
||||
"disabled": "díchumasaithe"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Osclófar an cluaisín ribín Nótaí Eagarthóireachta go huathoibríoch ar nótaí lae"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Comhéadan Úsáideora",
|
||||
"theme_label": "Téama an iarratais",
|
||||
@@ -1678,17 +1608,7 @@
|
||||
"italic": "Téacs iodálach",
|
||||
"underline": "Téacs faoi líne",
|
||||
"color": "Téacs daite",
|
||||
"bg_color": "Téacs le dath cúlra",
|
||||
"visibility_title": "Infheictheacht an Liosta Buaicphointí",
|
||||
"visibility_description": "Is féidir leat an giuirléid buaicphointí a cheilt in aghaidh an nóta trí lipéad #hideHighlightWidget a chur leis.",
|
||||
"shortcut_info": "Is féidir leat aicearra méarchláir a chumrú chun an painéal ar dheis (lena n-áirítear Buaicphointí) a athrú go tapa sna Roghanna -> Aicearraí (ainm 'toggleRightPane')."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Clár Ábhair",
|
||||
"description": "Beidh clár ábhair le feiceáil i nótaí téacs nuair a bhíonn níos mó ná líon sainithe ceannteidil sa nóta. Is féidir leat an líon seo a shaincheapadh:",
|
||||
"unit": "ceannteidil",
|
||||
"disable_info": "Is féidir leat an rogha seo a úsáid freisin chun TOC a dhíchumasú go héifeachtach trí uimhir an-ard a shocrú.",
|
||||
"shortcut_info": "Is féidir leat aicearra méarchláir a chumrú chun an painéal ar dheis (lena n-áirítear an tÁbhar Ábhar) a athrú go tapa sna Roghanna -> Aicearraí (ainm 'toggleRightPane')."
|
||||
"bg_color": "Téacs le dath cúlra"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Méid Uathoibríoch Léite Amháin",
|
||||
@@ -1993,9 +1913,7 @@
|
||||
"kind_and_size": "{{role}} · {{size}}"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Leabharmharc",
|
||||
"bookmark_this_note": "Cuir an nóta seo i leabharmharcanna ar an bpainéal taobh clé",
|
||||
"remove_bookmark": "Bain leabharmharc"
|
||||
"bookmark": "Leabharmharc"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Uathoibríoch",
|
||||
@@ -2050,16 +1968,7 @@
|
||||
"convert-to-attachment-confirm": "An bhfuil tú cinnte gur mian leat na nótaí roghnaithe a thiontú ina gceangaltáin dá nótaí tuismitheora? Ní bhaineann an oibríocht seo ach le nótaí Íomhá, scipeálfar nótaí eile.",
|
||||
"open-in-popup": "Eagarthóireacht thapa"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Tá an nóta seo roinnte go poiblí ar {{- link}}.",
|
||||
"shared_locally": "Tá an nóta seo roinnte go háitiúil ar {{- link}}.",
|
||||
"help_link": "Chun cabhair a fháil, tabhair cuairt ar <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>.",
|
||||
"shared_preview": "Tá an nóta seo á roinnt ag {{- link}}, ach ní féidir an leathanach sin a oscailt ach leis an mbrabhsálaí seo, agus gan ach Trilium a bheith ar oscailt ann. Teastaíonn freastalaí Trilium chun é a fhoilsiú do dhaoine eile.",
|
||||
"shared_export_only": "Tá an nóta seo á roinnt, ach ní féidir leis an aip mhóibíleach leathanaigh roinnte a oscailt. Chun é a fhoilsiú, easpórtáil an fho-chrann mar \"{{format}}\" agus óstaigh na comhaid ar fhreastalaí gréasáin ar bith, nó bain úsáid as freastalaí Trilium."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Ag féachaint ar nóta inléite amháin faoi láthair.",
|
||||
"auto-read-only-note": "Taispeántar an nóta seo i mód léite amháin le haghaidh luchtú níos tapúla.",
|
||||
"edit-note": "Cuir nóta in eagar"
|
||||
},
|
||||
"note_types": {
|
||||
@@ -2092,22 +2001,15 @@
|
||||
"built-in-templates": "Teimpléid ionsuite"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Cosain an nóta",
|
||||
"toggle-off": "Díchosaint an nóta",
|
||||
"toggle-on-hint": "Níl an nóta cosanta, cliceáil chun é a chosaint",
|
||||
"toggle-off-hint": "Tá an nóta cosanta, cliceáil chun é a dhéanamh neamhchosanta"
|
||||
"toggle-on": "Cosain an nóta"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Roinnte",
|
||||
"toggle-on-title": "Roinn an nóta",
|
||||
"toggle-off-title": "Díroinn an nóta",
|
||||
"shared-branch": "Níl an nóta seo ann ach mar nóta comhroinnte, scriosfar é má dhíroinntear é. Ar mhaith leat leanúint ar aghaidh agus an nóta seo a scriosadh dá bharr?",
|
||||
"inherited": "Ní féidir an nóta a dhíroinnt anseo mar go roinntear é trí oidhreacht ó shinsear."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Teimpléad",
|
||||
"toggle-on-hint": "Déan teimpléad den nóta",
|
||||
"toggle-off-hint": "Bain an nóta mar theimpléad"
|
||||
"template": "Teimpléad"
|
||||
},
|
||||
"open-help-page": "Oscail leathanach cabhrach",
|
||||
"find": {
|
||||
@@ -2119,13 +2021,11 @@
|
||||
"replace_all": "Cuir gach rud in ionad"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Liosta Buaicphointí",
|
||||
"title_with_count_one": "{{count}} buaicphointe",
|
||||
"title_with_count_two": "{{count}} buaicphointí",
|
||||
"title_with_count_few": "{{count}} buaicphointí",
|
||||
"title_with_count_many": "{{count}} buaicphointí",
|
||||
"title_with_count_other": "{{count}} buaicphointí",
|
||||
"options": "Roghanna",
|
||||
"menu_configure": "Cumraigh liosta buaicphointí...",
|
||||
"no_highlights": "Níor aimsíodh aon bhuaicphointí."
|
||||
},
|
||||
@@ -2236,7 +2136,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Clár Ábhair",
|
||||
"options": "Roghanna",
|
||||
"no_headings": "Gan ceannteidil."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2327,9 +2226,6 @@
|
||||
"tab_width": "Leithead an chluaisín",
|
||||
"tab_width_unit": "spásanna"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formáidiú"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Eagarthóir"
|
||||
},
|
||||
@@ -2337,12 +2233,10 @@
|
||||
"editor_type": {
|
||||
"label": "Barra uirlisí formáidithe",
|
||||
"floating": {
|
||||
"title": "Ar snámh",
|
||||
"description": "feictear uirlisí eagarthóireachta in aice leis an gcúrsóir;"
|
||||
"title": "Ar snámh"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Seasta",
|
||||
"description": "Feictear uirlisí eagarthóireachta sa chluaisín ribín \"Formáidiú\"."
|
||||
"title": "Seasta"
|
||||
},
|
||||
"multiline-toolbar": "Taispeáin an barra uirlisí ar illínte mura n-oireann sé",
|
||||
"toolbar_style": "Stíl an bharra uirlisí"
|
||||
@@ -2505,13 +2399,6 @@
|
||||
"title_vertical": "Bog an painéal eagarthóireachta go dtí an bun",
|
||||
"title_horizontal": "Bog an painéal eagarthóireachta ar chlé"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Díghlasáil eagarthóireacht",
|
||||
"lock-editing": "Eagarthóireacht glasála"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Easpórtáil léaráid mar PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Níorbh fhéidir an léaráid a easpórtáil go PNG.",
|
||||
"export_to_svg": "Níorbh fhéidir an léaráid a easpórtáil chuig SVG.",
|
||||
@@ -2807,9 +2694,6 @@
|
||||
"background_effects_title": "Tá éifeachtaí cúlra cobhsaí anois",
|
||||
"background_effects_message": "Ar fheistí Windows agus macOS, tá éifeachtaí cúlra cobhsaí anois. Cuireann na héifeachtaí cúlra teagmháil datha leis an gcomhéadan úsáideora tríd an gcúlra taobh thiar de a dhéanamh doiléir.",
|
||||
"background_effects_button": "Cumasaigh éifeachtaí cúlra",
|
||||
"new_layout_title": "Leagan amach nua",
|
||||
"new_layout_message": "Thugamar leagan amach nuachóirithe isteach do Trilium. Baineadh an ribín agus comhtháthaíodh go gan uaim é sa phríomh-chomhéadan, le barra stádais nua agus rannóga inleathnaithe (amhail tréithe cur chun cinn) ag glacadh seilbhe ar phríomhfheidhmeanna.\n\nTá an leagan amach nua cumasaithe de réir réamhshocraithe, agus is féidir é a dhíchumasú go sealadach trí Roghanna → Dealramh.",
|
||||
"new_layout_button": "Tuilleadh eolais",
|
||||
"dismiss": "Díbhe",
|
||||
"scripting_disabled_title": "Tá scriptiú cúil díchumasaithe",
|
||||
"scripting_disabled_message": "Tá scriptiú cúil díchumasaithe anois de réir réamhshocraithe ar mhaithe le slándáil. Tá scripteanna cúil (nótaí le lipéad #run) i do nótaí nach mbeidh á bhforghníomhú go huathoibríoch a thuilleadh.\n\nMá bhraitheann tú ar na scripteanna seo, is féidir leat scriptiú cúil a athchumasú sna socruithe slándála.",
|
||||
@@ -2823,9 +2707,6 @@
|
||||
"related_code_blocks": "Scéim dathanna do bhloic chóid i nótaí téacs",
|
||||
"related_code_notes": "Scéim dathanna le haghaidh nótaí cóid",
|
||||
"ui": "Comhéadan úsáideora",
|
||||
"ui_old_layout": "Leagan amach sean",
|
||||
"ui_new_layout": "Leagan amach nua",
|
||||
"ui_layout_style": "Stíl leagan amach",
|
||||
"ui_layout_orientation": "Treoshuíomh an bharra lainseálaí"
|
||||
},
|
||||
"units": {
|
||||
|
||||
@@ -62,12 +62,6 @@
|
||||
"sql_console_saved_message": "SQL कंसोल नोट {{note_path}} में सेव कर दिया गया है",
|
||||
"electron_api_docs_button_title": "इलेक्ट्रॉन API डॉक्यूमेंटेशन खोलें"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "बटन छुपाएं"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "बटन दिखाएं"
|
||||
},
|
||||
"add_link": {
|
||||
"note": "नोट",
|
||||
"add_link": "लिंक ऐड करें",
|
||||
@@ -414,7 +408,6 @@
|
||||
"hide_relations": "उन रिलेशंस के नाम जिन्हें छुपाना है",
|
||||
"title_template": "इस नोट के नीचे बनने वाले नोट्स का डिफ़ॉल्ट टाइटल।",
|
||||
"template": "नया नोट बनाते समय यह उपलब्ध टेम्पलेट्स में दिखेगा",
|
||||
"toc": "<code>#toc</code> या <code>#toc=show</code> से Table of Contents दिखेगा, <code>#toc=hide</code> से छुप जाएगा।",
|
||||
"color": "नोट का रंग तय करता है (जैसे 'red' या #a13d5f)",
|
||||
"keyboard_shortcut": "एक कीबोर्ड शॉर्टकट तय करता है जिससे सीधे इस नोट पर जाया जा सकेगा (जैसे 'ctrl+alt+e')",
|
||||
"keep_current_hoisting": "इस लिंक को खोलने से मौजूदा 'hoisting' नहीं बदलेगी।",
|
||||
@@ -422,7 +415,6 @@
|
||||
"execute_description": "बटन के साथ दिखने वाला विवरण",
|
||||
"exclude_from_note_map": "इस लेबल वाले नोट्स 'Note Map' से छुपा दिए जाएंगे",
|
||||
"new_notes_on_top": "नए नोट्स पेरेंट के सबसे ऊपर बनेंगे, न कि नीचे।",
|
||||
"hide_highlight_widget": "हाइलाइट लिस्ट विजेट छुपाएं",
|
||||
"run_on_note_creation": "बैकएंड पर नोट बनने पर चलता है",
|
||||
"run_on_child_note_creation": "इस नोट के नीचे नया नोट बनने पर चलता है",
|
||||
"run_on_note_title_change": "नोट टाइटल बदलने पर चलता है",
|
||||
@@ -628,15 +620,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "नया स्प्लिट बनाएं"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "इस नोट को एडिट करें"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Table of Contents दिखाएं"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "हाइलाइट्स लिस्ट दिखाएं"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "मेन्यू",
|
||||
"options": "विकल्प",
|
||||
@@ -728,26 +711,12 @@
|
||||
"active": "प्रोटेक्टेड सेशन सक्रिय है। बाहर निकलने के लिए क्लिक करें।",
|
||||
"inactive": "प्रोटेक्टेड सेशन शुरू करने के लिए क्लिक करें"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "नोट रिविज़न"
|
||||
},
|
||||
"note_launcher": {
|
||||
"this_launcher_doesnt_define_target_note": "यह लॉन्चर टारगेट नोट को परिभाषित नहीं करता।"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "इमेज रेफरेंस क्लिपबोर्ड पर कॉपी करें, इसे टेक्स्ट नोट में पेस्ट किया जा सकता है।"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "डायग्राम को SVG की तरह एक्सपोर्ट करें"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "सब-नोट बनाएं और मैप में जोड़ें"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_one": "{{count}} बैकलिंक",
|
||||
"backlink_other": "",
|
||||
"relation": "रिलेशन"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "सब-नोट डालें",
|
||||
"delete_this_note": "यह नोट डिलीट करें",
|
||||
@@ -773,8 +742,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "नोट टाइप",
|
||||
"editable": "एडिट करने योग्य",
|
||||
"basic_properties": "बुनियादी गुण",
|
||||
"language": "भाषा",
|
||||
"configure_code_notes": "कोड नोट्स कॉन्फ़िगर करें..।"
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -804,37 +771,23 @@
|
||||
"open_all_confirm_other": "यह नए टैब में {{count}} नोट्स खोलेगा। जारी रखें?"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "इस दिन अभी तक कोई एडिट किया गया नोट नहीं है..।",
|
||||
"title": "एडिट किए गए नोट्स",
|
||||
"deleted": "(डिलीट किया गया)"
|
||||
"no_edited_notes_found": "इस दिन अभी तक कोई एडिट किया गया नोट नहीं है..।"
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "नोट ID",
|
||||
"original_file_name": "असली फ़ाइल का नाम",
|
||||
"file_type": "फ़ाइल टाइप",
|
||||
"file_size": "फ़ाइल साइज़",
|
||||
"download": "डाउनलोड करें",
|
||||
"open": "बाहर खोलें",
|
||||
"upload_new_revision": "नया रिविज़न अपलोड करें",
|
||||
"upload_success": "नई फ़ाइल रिविज़न अपलोड कर दी गई है।",
|
||||
"upload_failed": "नई फ़ाइल रिविज़न का अपलोड फ़ेल हो गया।",
|
||||
"title": "फ़ाइल"
|
||||
"upload_failed": "नई फ़ाइल रिविज़न का अपलोड फ़ेल हो गया।"
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "असली फ़ाइल का नाम",
|
||||
"file_type": "फ़ाइल टाइप",
|
||||
"file_size": "फ़ाइल साइज़",
|
||||
"download": "डाउनलोड करें",
|
||||
"open": "खोलें",
|
||||
"copy_reference_to_clipboard": "रेफरेंस क्लिपबोर्ड पर कॉपी करें",
|
||||
"upload_new_revision": "नया रिविज़न अपलोड करें",
|
||||
"upload_success": "नई इमेज रिविज़न अपलोड कर दी गई है।",
|
||||
"upload_failed": "नई इमेज रिविज़न का अपलोड फ़ेल हो गया: {{message}}",
|
||||
"title": "इमेज"
|
||||
"upload_failed": "नई इमेज रिविज़न का अपलोड फ़ेल हो गया: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "विरासत में मिले एट्रिब्यूट्स",
|
||||
"no_inherited_attributes": "विरासत में मिला कोई एट्रिब्यूट नहीं है।",
|
||||
"none": "कोई नहीं"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -852,8 +805,6 @@
|
||||
"show_similar_notes": "मिलते-जुलते नोट्स दिखाएं"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "पूरा फैलाएं",
|
||||
"collapse": "नॉर्मल साइज़ में समेटें",
|
||||
"title": "नोट मैप",
|
||||
"fix-nodes": "नोड्स फिक्स करें",
|
||||
"link-distance": "लिंक की दूरी",
|
||||
@@ -864,19 +815,11 @@
|
||||
"note_paths": {
|
||||
"title": "नोट पाथ",
|
||||
"clone_button": "नोट को नई जगह क्लोन करें..।",
|
||||
"intro_placed": "यह नोट इन पाथ्स पर रखा गया है:",
|
||||
"intro_not_placed": "यह नोट अभी तक ट्री में नहीं रखा गया है।",
|
||||
"outside_hoisted": "यह पाथ 'hoisted' नोट के बाहर है, आपको उसे 'unhoist' करना होगा।",
|
||||
"archived": "आर्काइव किया गया",
|
||||
"search": "खोजें"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "यह नोट मूल रूप से यहाँ से लिया गया था:",
|
||||
"info": "सूचना"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "खुद के एट्रिब्यूट्स"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "प्रमोटेड एट्रिब्यूट्स",
|
||||
"unset-field-placeholder": "सेट नहीं है",
|
||||
@@ -888,12 +831,6 @@
|
||||
"remove_this_attribute": "यह एट्रिब्यूट हटाएं",
|
||||
"remove_color": "रंग वाला लेबल हटाएं"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "क्वेरी (Query)",
|
||||
"script": "स्क्रिप्ट",
|
||||
"execute_query": "क्वेरी चलाएं",
|
||||
"execute_script": "स्क्रिप्ट चलाएं"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "सर्च विकल्प जोड़ें:",
|
||||
"search_string": "सर्च स्ट्रिंग",
|
||||
@@ -1149,8 +1086,6 @@
|
||||
"experimental_features": {
|
||||
"title": "प्रायोगिक विकल्प (Experimental Options)",
|
||||
"disclaimer": "ये विकल्प अभी टेस्टिंग में (experimental) हैं और इनसे अस्थिरता आ सकती है। सावधानी से इस्तेमाल करें।",
|
||||
"new_layout_name": "नया लेआउट",
|
||||
"new_layout_description": "आधुनिक लुक और बेहतर उपयोग के लिए नया लेआउट आज़माएं। आने वाले वर्ज़न्स में इसमें काफी बदलाव हो सकते हैं।",
|
||||
"llm_name": "AI / LLM चैट",
|
||||
"llm_description": "बड़े भाषा मॉडल (LLMs) द्वारा संचालित एआई चैट साइडबार और एलएलएम चैट नोट्स इनेबल करें।"
|
||||
},
|
||||
@@ -1190,9 +1125,6 @@
|
||||
"enabled": "चालू",
|
||||
"disabled": "बंद"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "दिन वाले नोट्स (day notes) पर 'एडिट किए गए नोट्स' वाला टैब अपने-आप खुल जाएगा"
|
||||
},
|
||||
"theme": {
|
||||
"title": "एप्लिकेशन थीम",
|
||||
"theme_label": "थीम",
|
||||
@@ -1357,17 +1289,7 @@
|
||||
"italic": "इटैलिक (Italic) टेक्स्ट",
|
||||
"underline": "अंडरलाइन टेक्स्ट",
|
||||
"color": "रंगीन टेक्स्ट",
|
||||
"bg_color": "बैकग्राउंड रंग वाला टेक्स्ट",
|
||||
"visibility_title": "हाइलाइट्स लिस्ट दिखाना (Visibility)",
|
||||
"visibility_description": "आप हर नोट के लिए #hideHighlightWidget लेबल लगाकर हाइलाइट्स विजेट छुपा सकते हैं।",
|
||||
"shortcut_info": "आप दाएं पैनल (हाइलाइट्स के साथ) को तुरंत खोलने/बंद करने के लिए शॉर्टकट सेट कर सकते हैं (Options -> Shortcuts में 'toggleRightPane' नाम से)।"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "विषय-सूची (Table of Contents)",
|
||||
"description": "जब नोट में तय संख्या से ज़्यादा हेडिंग्स होंगी, तो विषय-सूची अपने-आप दिखने लगेगी। आप इस संख्या को बदल सकते हैं:",
|
||||
"unit": "हेडिंग्स",
|
||||
"disable_info": "आप इसे बंद करने के लिए कोई बहुत बड़ी संख्या भी सेट कर सकते हैं।",
|
||||
"shortcut_info": "आप दाएं पैनल (TOC के साथ) को तुरंत खोलने/बंद करने के लिए शॉर्टकट सेट कर सकते हैं (Options -> Shortcuts में 'toggleRightPane' नाम से)।"
|
||||
"bg_color": "बैकग्राउंड रंग वाला टेक्स्ट"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "ऑटोमैटिक रीड-ओनली साइज़",
|
||||
@@ -1620,9 +1542,7 @@
|
||||
"unrecognized_role": "अटैचमेंट रोल '{{role}}' की पहचान नहीं हुई।"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "बुकमार्क",
|
||||
"bookmark_this_note": "इस नोट को बाएं पैनल में बुकमार्क करें",
|
||||
"remove_bookmark": "बुकमार्क हटाएं"
|
||||
"bookmark": "बुकमार्क"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "ऑटो (Auto)",
|
||||
@@ -1674,14 +1594,7 @@
|
||||
"convert-to-attachment-confirm": "क्या आप वाकई चुने हुए नोट्स को अटैचमेंट में बदलना चाहते हैं? यह सिर्फ़ इमेज नोट्स पर काम करेगा।",
|
||||
"open-in-popup": "तुरंत एडिट करें"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "यह नोट सार्वजनिक रूप से {{- link}} पर शेयर किया गया है।",
|
||||
"shared_locally": "यह नोट लोकल नेटवर्क पर {{- link}} पर शेयर किया गया है।",
|
||||
"help_link": "मदद के लिए <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a> देखें।"
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "आप सिर्फ़ पढ़ने वाला (Read-only) नोट देख रहे हैं।",
|
||||
"auto-read-only-note": "तेज़ी से लोड करने के लिए यह नोट 'रीड-ओनली' मोड में दिखाया जा रहा है।",
|
||||
"edit-note": "नोट एडिट करें"
|
||||
},
|
||||
"note_types": {
|
||||
@@ -1712,22 +1625,15 @@
|
||||
"spreadsheet": "स्प्रेडशीट (Spreadsheet)"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "नोट सुरक्षित (Protect) करें",
|
||||
"toggle-off": "नोट की सुरक्षा हटाएं",
|
||||
"toggle-on-hint": "नोट सुरक्षित नहीं है, सुरक्षित करने के लिए क्लिक करें",
|
||||
"toggle-off-hint": "नोट सुरक्षित है, सुरक्षा हटाने के लिए क्लिक करें"
|
||||
"toggle-on": "नोट सुरक्षित (Protect) करें"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "शेयर किया गया",
|
||||
"toggle-on-title": "नोट शेयर करें",
|
||||
"toggle-off-title": "नोट को अनशेयर (Unshare) करें",
|
||||
"shared-branch": "यह नोट सिर्फ़ शेयर फ़ोल्डर में है, अनशेयर करने से यह डिलीट हो जाएगा। क्या आप जारी रखना चाहते हैं?",
|
||||
"inherited": "इस नोट को यहाँ से अनशेयर नहीं किया जा सकता क्योंकि यह ऊपर वाले फ़ोल्डर से शेयर हो रहा है।"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "टेम्पलेट (Template)",
|
||||
"toggle-on-hint": "नोट को टेम्पलेट बनाएं",
|
||||
"toggle-off-hint": "टेम्पलेट हटाएं"
|
||||
"template": "टेम्पलेट (Template)"
|
||||
},
|
||||
"open-help-page": "मदद का पेज खोलें",
|
||||
"find": {
|
||||
@@ -1739,10 +1645,8 @@
|
||||
"replace_all": "सभी बदलें"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "हाइलाइट्स लिस्ट",
|
||||
"title_with_count_one": "{{count}} हाइलाइट",
|
||||
"title_with_count_other": "",
|
||||
"options": "विकल्प",
|
||||
"menu_configure": "हाइलाइट्स लिस्ट सेट करें..।",
|
||||
"no_highlights": "कोई हाइलाइट नहीं मिली।"
|
||||
},
|
||||
@@ -1838,7 +1742,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "विषय-सूची (TOC)",
|
||||
"options": "विकल्प",
|
||||
"no_headings": "कोई हेडिंग नहीं मिली।"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -1919,9 +1822,6 @@
|
||||
"tab_width": "टैब चौड़ाई",
|
||||
"tab_width_unit": "स्पेस"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "फॉर्मेटिंग (Formatting)"
|
||||
},
|
||||
"editor": {
|
||||
"title": "एडिटर (Editor)"
|
||||
},
|
||||
@@ -1929,12 +1829,10 @@
|
||||
"editor_type": {
|
||||
"label": "फॉर्मेटिंग टूलबार",
|
||||
"floating": {
|
||||
"title": "तैरता हुआ (Floating)",
|
||||
"description": "टूल्स कर्सर के पास दिखेंगे;"
|
||||
"title": "तैरता हुआ (Floating)"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "स्थायी (Fixed)",
|
||||
"description": "टूल्स ऊपर 'Formatting' टैब में दिखेंगे।"
|
||||
"title": "स्थायी (Fixed)"
|
||||
},
|
||||
"multiline-toolbar": "जगह न होने पर टूलबार को कई लाइन्स में दिखाएं।",
|
||||
"toolbar_style": "टूलबार स्टाइल"
|
||||
@@ -2037,13 +1935,6 @@
|
||||
"title_vertical": "एडिटर पैनल नीचे ले जाएं",
|
||||
"title_horizontal": "एडिटर पैनल बाईं ओर ले जाएं"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "एडिटिंग अनलॉक करें",
|
||||
"lock-editing": "एडिटिंग लॉक करें"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "डायग्राम को PNG में एक्सपोर्ट करें"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "डायग्राम PNG में एक्सपोर्ट नहीं हो सका।",
|
||||
"export_to_svg": "डायग्राम SVG में एक्सपोर्ट नहीं हो सका।"
|
||||
@@ -2168,9 +2059,6 @@
|
||||
"background_effects_title": "बैकग्राउंड इफेक्ट्स अब तैयार हैं",
|
||||
"background_effects_message": "विंडोज़ और मैक के लिए बैकग्राउंड इफेक्ट्स अब उपलब्ध हैं। ये ऐप को और भी सुंदर बनाते हैं।",
|
||||
"background_effects_button": "बैकग्राउंड इफेक्ट्स चालू करें",
|
||||
"new_layout_title": "नया लेआउट",
|
||||
"new_layout_message": "हमने ट्रिलियम के लिए एक नया और आधुनिक लेआउट बनाया है। इसे आप 'Appearance' सेटिंग्स से बदल भी सकते हैं।",
|
||||
"new_layout_button": "और जानकारी",
|
||||
"dismiss": "हटाएँ",
|
||||
"scripting_disabled_title": "बैकएंड स्क्रिप्टिंग अक्षम कर दी गई है",
|
||||
"scripting_disabled_message": "सुरक्षा के लिए अब बैकएंड स्क्रिप्टिंग डिफ़ॉल्ट रूप से अक्षम है। आपके नोट्स में बैकएंड स्क्रिप्ट हैं (#run लेबल वाले नोट्स) जो अब स्वचालित रूप से निष्पादित नहीं होंगे।\n\nयदि आप इन स्क्रिप्ट्स पर निर्भर हैं, तो आप सुरक्षा सेटिंग्स में बैकएंड स्क्रिप्टिंग को फिर से इनेबल कर सकते हैं।",
|
||||
@@ -2183,9 +2071,6 @@
|
||||
"related_code_blocks": "टेक्स्ट नोट्स में कोड ब्लॉक्स के लिए कलर स्कीम",
|
||||
"related_code_notes": "कोड नोट्स के लिए कलर स्कीम",
|
||||
"ui": "यूजर इंटरफ़ेस (UI)",
|
||||
"ui_old_layout": "पुराना लेआउट",
|
||||
"ui_new_layout": "नया लेआउट",
|
||||
"ui_layout_style": "लेआउट स्टाइल",
|
||||
"ui_layout_orientation": "लॉन्च बार ओरिएंटेशन"
|
||||
},
|
||||
"units": {
|
||||
|
||||
@@ -540,7 +540,6 @@
|
||||
"hide_relations": "Nama-nama relasi yang dipisahkan dengan koma dan akan disembunyikan. Semua relasi lainnya akan ditampilkan.",
|
||||
"title_template": "Judul bawaan untuk catatan yang dibuat sebagai anak dari catatan ini. Nilainya dievaluasi sebagai string JavaScript sehingga dapat diperkaya dengan konten dinamis melalui variabel <code>now</code> dan <code>parentNote</code> yang disuntikkan. Contoh:\n\n<ul>\n<li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n<li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n</ul>\n\nLihat <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki untuk detailnya</a>, dokumentasi API untuk <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a>, dan <a href=\"https://day.js.org/docs/en/display/format\">now</a> untuk informasi lebih lanjut.",
|
||||
"template": "Catatan ini akan muncul dalam daftar templat yang tersedia saat membuat catatan baru.",
|
||||
"toc": "<code>#toc</code> atau <code>#toc=show</code> akan memaksa Daftar Isi untuk ditampilkan, <code>#toc=hide</code> akan memaksanya untuk disembunyikan. Jika label tidak ada, pengaturan global akan diterapkan.",
|
||||
"color": "Menentukan warna catatan di pohon catatan, tautan, dan sebagainya. Gunakan nilai warna CSS yang valid seperti `red` atau `#a13d5f`.",
|
||||
"keyboard_shortcut": "Mendefinisikan pintasan keyboard yang akan langsung berpindah ke catatan ini. Contoh: 'ctrl+alt+e'. Memerlukan pemuatan ulang frontend agar perubahan berlaku.",
|
||||
"keep_current_hoisting": "Membuka tautan ini tidak akan mengubah hoisting meskipun catatan tidak dapat ditampilkan dalam subtree hoisted saat ini.",
|
||||
@@ -548,7 +547,6 @@
|
||||
"execute_description": "Deskripsi yang lebih panjang untuk catatan kode saat ini yang ditampilkan bersama tombol jalankan.",
|
||||
"exclude_from_note_map": "Catatan dengan label ini akan disembunyikan dari Peta Catatan.",
|
||||
"new_notes_on_top": "Catatan baru akan dibuat di bagian atas catatan induk, bukan di bagian bawah.",
|
||||
"hide_highlight_widget": "Menyembunyikan Daftar Sorotan untuk catatan ini, tetapi tetap menampilkannya pada semua catatan lainnya.",
|
||||
"run_on_note_creation": "Dijalankan saat catatan dibuat di backend. Gunakan relasi ini jika Anda ingin menjalankan skrip untuk semua catatan yang dibuat di bawah subpohon tertentu. Dalam hal ini, buat relasi pada catatan akar subpohon dan jadikan dapat diwariskan. Setiap catatan baru yang dibuat di dalam subpohon (pada kedalaman apa pun) akan memicu skrip.",
|
||||
"run_on_child_note_creation": "Dijalankan saat catatan baru dibuat di bawah catatan tempat relasi ini didefinisikan.",
|
||||
"run_on_note_title_change": "Dijalankan saat judul catatan diubah (termasuk saat catatan dibuat).",
|
||||
@@ -591,7 +589,6 @@
|
||||
"show_all_in_search": "Tampilkan semua dalam pencarian",
|
||||
"relation_type": "Relasi",
|
||||
"versioning_limit": "Membatasi jumlah revisi yang disimpan untuk catatan ini, menggantikan pengaturan global.",
|
||||
"similar_notes_widget_disabled": "Menonaktifkan tab pita Catatan Serupa untuk catatan ini. Hanya untuk tata letak lama.",
|
||||
"llm_chat_home": "Obrolan AI baru dibuat sebagai catatan anak dari catatan ini.",
|
||||
"workspace_llm_chat_home": "Obrolan AI baru dibuat sebagai catatan anak dari catatan ini saat di-hoist ke salah satu leluhur workspace ini.",
|
||||
"date_pattern": "Pola untuk judul catatan harian yang dibuat di bawah akar kalender ini, misalnya <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -949,15 +946,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Buat split baru"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Edit catatan ini"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Tampilkan Daftar Isi"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Tampilkan Daftar Sorotan"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menu",
|
||||
"options": "Opsi",
|
||||
@@ -1058,9 +1046,6 @@
|
||||
"active": "Sesi terlindungi aktif. Klik untuk keluar dari sesi terlindungi.",
|
||||
"inactive": "Klik untuk masuk ke sesi terlindungi"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Revisi Catatan"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Pembaruan tersedia"
|
||||
},
|
||||
@@ -1075,25 +1060,11 @@
|
||||
"opening_api_docs_message": "Membuka dokumentasi API...",
|
||||
"sql_console_saved_message": "Catatan Konsol SQL telah disimpan ke {{note_path}}"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Salin referensi gambar ke clipboard, dapat ditempelkan ke catatan teks."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Sembunyikan tombol"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Tampilkan tombol"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Ekspor diagram sebagai SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Buat catatan anak dan tambahkan ke peta",
|
||||
"create_child_note_text": "Tambahkan catatan"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_other": "{{count}} Backlink",
|
||||
"relation": "relasi",
|
||||
"no_backlinks": "Tidak ada catatan yang menaut ke catatan ini."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1121,8 +1092,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Jenis catatan",
|
||||
"editable": "Dapat diedit",
|
||||
"basic_properties": "Properti Dasar",
|
||||
"language": "Bahasa",
|
||||
"configure_code_notes": "Konfigurasikan catatan kode..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1152,37 +1121,23 @@
|
||||
"open_all_limit_exceeded": "Terlalu banyak catatan untuk dibuka sekaligus ({{count}}). Maksimal adalah {{max}}, coba persempit hasil terlebih dahulu."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Belum ada catatan yang diedit pada hari ini...",
|
||||
"title": "Catatan yang Diedit",
|
||||
"deleted": "(dihapus)"
|
||||
"no_edited_notes_found": "Belum ada catatan yang diedit pada hari ini..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "ID Catatan",
|
||||
"original_file_name": "Nama file asli",
|
||||
"file_type": "Jenis file",
|
||||
"file_size": "Ukuran file",
|
||||
"download": "Unduh",
|
||||
"open": "Buka secara eksternal",
|
||||
"upload_new_revision": "Unggah revisi baru",
|
||||
"upload_success": "Revisi file baru telah diunggah.",
|
||||
"upload_failed": "Pengunggahan revisi file baru gagal.",
|
||||
"title": "File"
|
||||
"upload_failed": "Pengunggahan revisi file baru gagal."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Nama file asli",
|
||||
"file_type": "Jenis file",
|
||||
"file_size": "Ukuran file",
|
||||
"download": "Unduh",
|
||||
"open": "Buka",
|
||||
"copy_reference_to_clipboard": "Salin referensi ke clipboard",
|
||||
"upload_new_revision": "Unggah revisi baru",
|
||||
"upload_success": "Revisi gambar baru telah diunggah.",
|
||||
"upload_failed": "Pengunggahan revisi gambar baru gagal: {{message}}",
|
||||
"title": "Gambar"
|
||||
"upload_failed": "Pengunggahan revisi gambar baru gagal: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Atribut Turunan",
|
||||
"no_inherited_attributes": "Tidak ada atribut turunan.",
|
||||
"none": "tidak ada"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1199,8 +1154,6 @@
|
||||
"show_similar_notes": "Tampilkan catatan serupa"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Bentangkan penuh",
|
||||
"collapse": "Lipat ke ukuran normal",
|
||||
"title": "Peta Catatan",
|
||||
"fix-nodes": "Perbaiki node",
|
||||
"link-distance": "Jarak tautan",
|
||||
@@ -1211,19 +1164,11 @@
|
||||
"note_paths": {
|
||||
"title": "Jalur Catatan",
|
||||
"clone_button": "Kloning catatan ke lokasi baru...",
|
||||
"intro_placed": "Catatan ini ditempatkan pada jalur berikut:",
|
||||
"intro_not_placed": "Catatan ini belum ditempatkan di tree catatan.",
|
||||
"outside_hoisted": "Jalur ini berada di luar catatan yang di-hoist dan Anda harus membatalkan hoist.",
|
||||
"archived": "Diarsipkan",
|
||||
"search": "Cari"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Catatan ini awalnya diambil dari:",
|
||||
"info": "Info"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Atribut Milik Sendiri"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Atribut yang Dipromosikan",
|
||||
"unset-field-placeholder": "belum diatur",
|
||||
@@ -1250,12 +1195,6 @@
|
||||
"drawn_by_collection": "Koleksi diatur berdasarkan atribut ini, sehingga itemnya tidak mengulanginya",
|
||||
"display_on_items": "Tampilkan atribut pada item koleksi"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Kueri",
|
||||
"script": "Skrip",
|
||||
"execute_query": "Jalankan Kueri",
|
||||
"execute_script": "Jalankan Skrip"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Tambahkan opsi pencarian:",
|
||||
"search_string": "string pencarian",
|
||||
@@ -1592,8 +1531,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Opsi Eksperimental",
|
||||
"disclaimer": "Opsi ini bersifat eksperimental dan dapat menyebabkan ketidakstabilan. Gunakan dengan hati-hati.",
|
||||
"new_layout_name": "Tata Letak Baru",
|
||||
"new_layout_description": "Coba tata letak baru untuk tampilan yang lebih modern dan kemudahan penggunaan yang lebih baik. Dapat berubah besar pada rilis mendatang.",
|
||||
"llm_name": "Chat AI / LLM",
|
||||
"llm_description": "Aktifkan panel samping chat AI dan catatan chat LLM yang didukung oleh large language model."
|
||||
},
|
||||
@@ -1646,9 +1583,6 @@
|
||||
"enabled": "diaktifkan",
|
||||
"disabled": "dinonaktifkan"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Tab ribbon Catatan yang Diedit akan terbuka otomatis pada catatan harian"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Antarmuka Pengguna",
|
||||
"theme_label": "Tema aplikasi",
|
||||
@@ -1839,17 +1773,7 @@
|
||||
"italic": "Teks miring",
|
||||
"underline": "Teks bergaris bawah",
|
||||
"color": "Teks berwarna",
|
||||
"bg_color": "Teks dengan warna latar belakang",
|
||||
"visibility_title": "Visibilitas Daftar Sorotan",
|
||||
"visibility_description": "Anda dapat menyembunyikan widget sorotan per catatan dengan menambahkan label #hideHighlightWidget.",
|
||||
"shortcut_info": "Anda dapat mengatur pintasan keyboard untuk menampilkan/menyembunyikan panel kanan (termasuk Sorotan) dengan cepat di Opsi -> Pintasan (nama: 'toggleRightPane')."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Daftar Isi",
|
||||
"description": "Daftar isi akan muncul di catatan teks ketika catatan memiliki lebih dari jumlah heading yang ditentukan. Anda dapat menyesuaikan jumlah ini:",
|
||||
"unit": "heading",
|
||||
"disable_info": "Anda juga dapat menggunakan opsi ini untuk menonaktifkan TOC secara efektif dengan menetapkan angka yang sangat tinggi.",
|
||||
"shortcut_info": "Anda dapat mengatur pintasan keyboard untuk menampilkan/menyembunyikan panel kanan (termasuk TOC) dengan cepat di Opsi -> Pintasan (nama: 'toggleRightPane')."
|
||||
"bg_color": "Teks dengan warna latar belakang"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Ukuran Otomatis Hanya-Baca",
|
||||
@@ -2175,9 +2099,7 @@
|
||||
"kind_and_size": "{{role}} · {{size}}"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Bookmark",
|
||||
"bookmark_this_note": "Tambahkan catatan ini ke bookmark di panel sisi kiri",
|
||||
"remove_bookmark": "Hapus bookmark"
|
||||
"bookmark": "Bookmark"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Otomatis",
|
||||
@@ -2228,16 +2150,7 @@
|
||||
"convert-to-attachment-confirm": "Apakah Anda yakin ingin mengubah catatan yang dipilih menjadi lampiran dari catatan induknya? Operasi ini hanya berlaku untuk catatan Gambar, catatan lain akan dilewati.",
|
||||
"open-in-popup": "Edit cepat"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Catatan ini dibagikan secara publik di {{- link}}.",
|
||||
"shared_locally": "Catatan ini dibagikan secara lokal di {{- link}}.",
|
||||
"help_link": "Untuk bantuan, kunjungi <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>.",
|
||||
"shared_preview": "Catatan ini dibagikan di {{- link}}, tetapi hanya browser ini yang dapat membuka halaman tersebut, dan hanya selama Trilium tetap terbuka di dalamnya. Mempublikasikannya untuk orang lain memerlukan server Trilium.",
|
||||
"shared_export_only": "Catatan ini dibagikan, tetapi aplikasi seluler tidak dapat membuka halaman yang dibagikan. Untuk mempublikasikannya, ekspor subpohon sebagai \"{{format}}\" dan hos berkasnya pada server web apa pun, atau gunakan server Trilium."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Saat ini sedang melihat catatan hanya-baca.",
|
||||
"auto-read-only-note": "Catatan ini ditampilkan dalam mode hanya-baca agar pemuatan lebih cepat.",
|
||||
"edit-note": "Edit catatan"
|
||||
},
|
||||
"note_types": {
|
||||
@@ -2270,10 +2183,7 @@
|
||||
"built-in-templates": "Templat bawaan"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Lindungi catatan",
|
||||
"toggle-off": "Batalkan perlindungan catatan",
|
||||
"toggle-on-hint": "Catatan tidak dilindungi, klik untuk menjadikannya terlindungi",
|
||||
"toggle-off-hint": "Catatan dilindungi, klik untuk membatalkan perlindungannya"
|
||||
"toggle-on": "Lindungi catatan"
|
||||
},
|
||||
"llm_chat": {
|
||||
"placeholder": "Ketik pesan...",
|
||||
@@ -2402,15 +2312,11 @@
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Dibagikan",
|
||||
"toggle-on-title": "Bagikan catatan",
|
||||
"toggle-off-title": "Batalkan pembagian catatan",
|
||||
"shared-branch": "Catatan ini hanya ada sebagai catatan yang dibagikan, sehingga pembatalan pembagian akan menghapusnya. Apakah Anda ingin melanjutkan dan dengan demikian menghapus catatan ini?",
|
||||
"inherited": "Pembagian catatan tidak dapat dibatalkan di sini karena dibagikan melalui pewarisan dari ancestor."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Template",
|
||||
"toggle-on-hint": "Jadikan catatan ini template",
|
||||
"toggle-off-hint": "Hapus catatan ini sebagai template"
|
||||
"template": "Template"
|
||||
},
|
||||
"open-help-page": "Buka halaman bantuan",
|
||||
"find": {
|
||||
@@ -2422,9 +2328,7 @@
|
||||
"replace_all": "Ganti semua"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Daftar Sorotan",
|
||||
"title_with_count_other": "{{count}} sorotan",
|
||||
"options": "Opsi",
|
||||
"menu_configure": "Konfigurasikan daftar sorotan...",
|
||||
"no_highlights": "Tidak ada sorotan yang ditemukan."
|
||||
},
|
||||
@@ -2523,7 +2427,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Daftar Isi",
|
||||
"options": "Opsi",
|
||||
"no_headings": "Tidak ada heading."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2620,9 +2523,6 @@
|
||||
"tab_width": "Lebar tab",
|
||||
"tab_width_unit": "spasi"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Pemformatan"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Editor"
|
||||
},
|
||||
@@ -2631,12 +2531,10 @@
|
||||
"label": "Toolbar pemformatan",
|
||||
"toolbar_style": "Gaya toolbar",
|
||||
"floating": {
|
||||
"title": "Mengambang",
|
||||
"description": "alat pengeditan muncul di dekat kursor;"
|
||||
"title": "Mengambang"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Tetap",
|
||||
"description": "alat pengeditan muncul di tab ribbon \"Pemformatan\"."
|
||||
"title": "Tetap"
|
||||
},
|
||||
"multiline-toolbar": "Tampilkan toolbar dalam beberapa baris jika tidak muat"
|
||||
}
|
||||
@@ -2801,18 +2699,11 @@
|
||||
"title_vertical": "Pindahkan panel pengeditan ke bawah",
|
||||
"title_horizontal": "Pindahkan panel pengeditan ke kiri"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Buka kunci pengeditan",
|
||||
"lock-editing": "Kunci pengeditan"
|
||||
},
|
||||
"display_mode": {
|
||||
"source": "Tampilan source",
|
||||
"split": "Tampilan split",
|
||||
"preview": "Pratinjau"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Ekspor diagram sebagai PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Diagram tidak dapat diekspor ke PNG.",
|
||||
"export_to_svg": "Diagram tidak dapat diekspor ke SVG.",
|
||||
@@ -3106,9 +2997,6 @@
|
||||
"background_effects_title": "Efek latar belakang kini stabil",
|
||||
"background_effects_message": "Pada perangkat Windows dan macOS, efek latar belakang kini stabil. Efek latar belakang menambah sedikit warna pada antarmuka pengguna dengan membelakkan latar belakang di belakangnya.",
|
||||
"background_effects_button": "Aktifkan efek latar belakang",
|
||||
"new_layout_title": "Tata letak baru",
|
||||
"new_layout_message": "Kami telah memperkenalkan tata letak yang modern untuk Trilium. Ribbon telah dihapus dan secara mulus terintegrasi ke antarmuka utama, dengan status bar baru dan bagian yang dapat diperluas (seperti atribut yang dipromosikan) yang mengambil fungsi utama.\n\nTata letak baru diaktifkan secara default, dan dapat sementara dinonaktifkan melalui Opsi → Tampilan.",
|
||||
"new_layout_button": "Info lebih lanjut",
|
||||
"scripting_disabled_title": "Scripting backend telah dinonaktifkan",
|
||||
"scripting_disabled_message": "Scripting backend kini dinonaktifkan secara default untuk keamanan. Catatan Anda berisi script backend (catatan dengan label #run) yang tidak akan dieksekusi secara otomatis lagi.\n\nJika Anda bergantung pada script ini, Anda dapat mengaktifkan kembali scripting backend di pengaturan keamanan.",
|
||||
"scripting_disabled_button": "Buka pengaturan keamanan",
|
||||
@@ -3122,10 +3010,7 @@
|
||||
"related_code_blocks": "Skema warna untuk blok kode di catatan teks",
|
||||
"related_code_notes": "Skema warna untuk catatan kode",
|
||||
"ui": "Antarmuka pengguna",
|
||||
"ui_layout_style": "Gaya tata letak",
|
||||
"ui_layout_orientation": "Orientasi launch bar",
|
||||
"ui_old_layout": "Tata letak lama",
|
||||
"ui_new_layout": "Tata letak baru"
|
||||
"ui_layout_orientation": "Orientasi launch bar"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
|
||||
@@ -464,19 +464,14 @@
|
||||
"multiline-toolbar": "Visualizza la barra degli strumenti su più righe se non entra",
|
||||
"label": "Barra degli strumenti di formattazione",
|
||||
"floating": {
|
||||
"title": "Galleggiante",
|
||||
"description": "gli strumenti di modifica appaiono vicino al cursore;"
|
||||
"title": "Galleggiante"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Fisso",
|
||||
"description": "gli strumenti di modifica vengono visualizzati nella scheda \"Formattazione\" della barra multifunzione."
|
||||
"title": "Fisso"
|
||||
},
|
||||
"toolbar_style": "Stile della barra degli strumenti"
|
||||
}
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Modifica questa nota"
|
||||
},
|
||||
"shortcuts": {
|
||||
"keyboard_shortcuts": "Scorciatoie da tastiera",
|
||||
"type_text_to_filter": "Digita il testo per filtrare le scorciatoie...",
|
||||
@@ -508,8 +503,6 @@
|
||||
"conflicts_badge_tooltip": "Alcune scorciatoie sono assegnate a più di un'azione. Fai clic per visualizzare solo le scorciatoie in conflitto."
|
||||
},
|
||||
"shared_switch": {
|
||||
"toggle-on-title": "Condividi 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."
|
||||
@@ -860,16 +853,8 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Tabella dei Contenuti",
|
||||
"options": "Opzioni",
|
||||
"no_headings": "Nessun titolo."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Tabella dei Contenuti",
|
||||
"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",
|
||||
"enable_tray": "Icona nella barra delle applicazioni",
|
||||
@@ -891,14 +876,9 @@
|
||||
"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')."
|
||||
"bg_color": "Testo con colore di sfondo"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Punti salienti",
|
||||
"options": "Opzioni",
|
||||
"title_with_count_one": "{{count}} evidenza",
|
||||
"title_with_count_many": "{{count}} evidenze",
|
||||
"title_with_count_other": "{{count}} evidenze",
|
||||
@@ -1208,14 +1188,12 @@
|
||||
"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 <code>now</code> e <code>parentNote</code> inserite. Esempi:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s opere letterarie</code></li>\n <li><code>Log per ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Per ulteriori dettagli, consultare <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki con i dettagli</a>, la documentazione API per <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> e <a href=\"https://day.js.org/docs/en/display/format\">now</a>.",
|
||||
"template": "Questa nota apparirà nella selezione dei modelli disponibili durante la creazione di una nuova nota.",
|
||||
"toc": "<code>#toc</code> o <code>#toc=show</code> forzeranno la visualizzazione del sommario, mentre <code>#toc=hide</code> 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": "Nasconde l'elenco dei punti salienti di questa nota, lasciandolo visibile in tutte le altre.",
|
||||
"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).",
|
||||
@@ -1261,7 +1239,6 @@
|
||||
"show_all_in_search": "Mostra tutti i risultati della ricerca",
|
||||
"relation_type": "Relazione",
|
||||
"versioning_limit": "Limita il numero di revisioni conservate per questa nota, sovrascrivendo l'impostazione globale.",
|
||||
"similar_notes_widget_disabled": "Disattiva la scheda \"Note simili\" della barra multifunzione per questa nota. Solo nel layout precedente.",
|
||||
"llm_chat_home": "Le nuove chat basate sull'intelligenza artificiale vengono create come elementi secondari di questa nota.",
|
||||
"workspace_llm_chat_home": "Le nuove chat basate sull'intelligenza artificiale vengono create come elementi secondari di questa nota quando vengono associate a un elemento di livello superiore di questo spazio di lavoro.",
|
||||
"date_pattern": "Modello per i titoli delle note giornaliere generate in questa radice del calendario, ad esempio: <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -1592,12 +1569,6 @@
|
||||
"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",
|
||||
@@ -1698,9 +1669,6 @@
|
||||
"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"
|
||||
},
|
||||
@@ -1715,27 +1683,11 @@
|
||||
"sql_console_saved_message": "La nota della console SQL è stata salvata in {{note_path}}",
|
||||
"electron_api_docs_button_title": "Documentazione dell'API di Open Electron"
|
||||
},
|
||||
"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 nota secondaria e aggiungila alla mappa",
|
||||
"create_child_note_text": "Aggiungi una nota"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "relazione",
|
||||
"backlink_one": "{{count}} Backlink",
|
||||
"backlink_many": "{{count}} Backlinks",
|
||||
"backlink_other": "{{count}} Backlinks",
|
||||
"no_backlinks": "A questo elemento non è associato alcun collegamento con delle note."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1765,8 +1717,6 @@
|
||||
"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": {
|
||||
@@ -1798,37 +1748,23 @@
|
||||
"open_all_limit_exceeded": "Ci sono troppe note da aprire contemporaneamente ({{count}}). Il limite massimo è {{max}}; prova prima a restringere i risultati."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Nessuna nota modificata per questo giorno...",
|
||||
"title": "Note modificate",
|
||||
"deleted": "(eliminato)"
|
||||
"no_edited_notes_found": "Nessuna nota modificata per questo giorno..."
|
||||
},
|
||||
"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 esternamente",
|
||||
"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"
|
||||
"upload_failed": "Caricamento di una nuova revisione del file non riuscito."
|
||||
},
|
||||
"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"
|
||||
"upload_failed": "Caricamento di una nuova revisione dell'immagine non riuscito: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Attributi ereditati",
|
||||
"no_inherited_attributes": "Nessun attributo ereditato.",
|
||||
"none": "nessuno"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1847,8 +1783,6 @@
|
||||
"mime": "Tipo MIME"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Espandi completamente",
|
||||
"collapse": "Ritorna alle dimensioni normali",
|
||||
"title": "Nota Mappa",
|
||||
"fix-nodes": "Fissare i nodi",
|
||||
"link-distance": "Distanza del collegamento",
|
||||
@@ -1861,19 +1795,11 @@
|
||||
"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",
|
||||
@@ -1902,12 +1828,6 @@
|
||||
"conflicting": "Definizioni multiple",
|
||||
"conflicting_tooltip": "Gli elementi definiscono questo attributo in più di un modo, quindi viene ordinato come testo e non può essere impostato dal menu dell'elemento."
|
||||
},
|
||||
"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."
|
||||
@@ -2077,9 +1997,6 @@
|
||||
"enabled": "abilitato",
|
||||
"disabled": "disabile"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "La scheda della barra multifunzione Note modificate si aprirà automaticamente nelle note giornaliere"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Interfaccia utente",
|
||||
"theme_label": "Tema dell'applicazione",
|
||||
@@ -2374,9 +2291,7 @@
|
||||
"kind_and_size": "{{role}} · {{size}}"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Segnalibro",
|
||||
"bookmark_this_note": "Aggiungi questa nota ai segnalibri nel pannello laterale sinistro",
|
||||
"remove_bookmark": "Rimuovi segnalibro"
|
||||
"bookmark": "Segnalibro"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Auto",
|
||||
@@ -2390,13 +2305,6 @@
|
||||
"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 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>.",
|
||||
"shared_preview": "Questa nota è condivisa su {{- link}}, ma solo questo browser può aprire quella pagina e solo mentre Trilium è aperto al suo interno. Per pubblicarla per altri è necessario un server Trilium.",
|
||||
"shared_export_only": "Questa nota è condivisa, ma l'app mobile non può aprire le pagine condivise. Per pubblicarla, esporta il sottostruttura come \"{{format}}\" e ospita i file su un qualsiasi server web oppure utilizza un server Trilium."
|
||||
},
|
||||
"note_types": {
|
||||
"text": "Testo",
|
||||
"code": "Codice",
|
||||
@@ -2427,15 +2335,10 @@
|
||||
"built-in-templates": "Modello predefinito"
|
||||
},
|
||||
"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"
|
||||
"toggle-on": "Proteggi la nota"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Modello",
|
||||
"toggle-on-hint": "Trasforma la nota in un modello",
|
||||
"toggle-off-hint": "Rimuovi la nota come modello"
|
||||
"template": "Modello"
|
||||
},
|
||||
"open-help-page": "Apri la pagina di aiuto",
|
||||
"find": {
|
||||
@@ -2609,9 +2512,6 @@
|
||||
"tab_width": "Larghezza della scheda",
|
||||
"tab_width_unit": "spazi"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formattazione"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Redattore"
|
||||
},
|
||||
@@ -2681,13 +2581,6 @@
|
||||
"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.",
|
||||
"export_to_svg": "Il diagramma non può essere esportato in formato SVG.",
|
||||
@@ -2784,9 +2677,6 @@
|
||||
"background_effects_message": "Su dispositivi Windows e macOS, gli effetti di sfondo sono ora stabili. Gli effetti di sfondo aggiungono un tocco di colore all'interfaccia utente sfocando lo sfondo dietro di essa.",
|
||||
"background_effects_button": "Abilita gli effetti di sfondo",
|
||||
"dismiss": "Ignora",
|
||||
"new_layout_title": "Nuovo layout",
|
||||
"new_layout_message": "Abbiamo introdotto un layout modernizzato per Trilium. La barra multifunzione è stata rimossa e integrata perfettamente nell'interfaccia principale, con una nuova barra di stato e sezioni espandibili (come gli attributi promossi) che assumono le funzioni chiave.\n\nIl nuovo layout è abilitato di default e può essere temporaneamente disabilitato tramite Opzioni → Aspetto.",
|
||||
"new_layout_button": "Maggiori informazioni",
|
||||
"scripting_disabled_title": "Lo scripting sul backend è stato disabilitato",
|
||||
"scripting_disabled_message": "Per motivi di sicurezza, l'esecuzione degli script sul backend è ora disabilitata per impostazione predefinita. Le tue note contengono script sul backend (note contrassegnate con l'etichetta #run) che non verranno più eseguiti automaticamente.\n\nSe utilizzi questi script, puoi riattivarli nelle impostazioni di sicurezza.",
|
||||
"scripting_disabled_button": "Apri le impostazioni di sicurezza"
|
||||
@@ -2799,9 +2689,6 @@
|
||||
"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",
|
||||
"ui": "Interfaccia utente",
|
||||
"ui_old_layout": "Vecchio layout",
|
||||
"ui_new_layout": "Nuovo layout",
|
||||
"ui_layout_style": "Stile di impaginazione",
|
||||
"ui_layout_orientation": "Orientamento della barra di avvio"
|
||||
},
|
||||
"units": {
|
||||
@@ -2818,8 +2705,6 @@
|
||||
"rendering_error": "Impossibile mostrare il contenuto a causa di un errore."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Stai visualizzando una nota di sola lettura.",
|
||||
"auto-read-only-note": "Questa nota viene visualizzata in modalità di sola lettura per un caricamento più rapido.",
|
||||
"edit-note": "Modifica nota"
|
||||
},
|
||||
"calendar_view": {
|
||||
@@ -2852,8 +2737,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Opzioni sperimentali",
|
||||
"disclaimer": "Queste opzioni sono sperimentali e potrebbero causare instabilità. Usare con cautela.",
|
||||
"new_layout_name": "Nuovo layout",
|
||||
"new_layout_description": "Prova il nuovo layout per un look più moderno e una maggiore usabilità. Soggetto a modifiche significative nelle prossime versioni.",
|
||||
"llm_name": "Chat con IA / LLM",
|
||||
"llm_description": "Attiva la barra laterale della chat con IA e le note della chat LLM basate su modelli linguistici di grandi dimensioni."
|
||||
},
|
||||
|
||||
@@ -242,8 +242,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "ノートタイプ",
|
||||
"editable": "編集可能",
|
||||
"basic_properties": "基本プロパティ",
|
||||
"language": "言語",
|
||||
"configure_code_notes": "コードノートを設定..."
|
||||
},
|
||||
"i18n": {
|
||||
@@ -292,9 +290,6 @@
|
||||
"yesterday": "昨日"
|
||||
}
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "書式設定"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "検索オプションを追加:",
|
||||
"search_string": "文字列検索",
|
||||
@@ -534,15 +529,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "新しく分割する"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "このノートを編集"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "目次を表示"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "ハイライトリストを表示"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "子ノートを作成し、マップに追加",
|
||||
"create_child_note_text": "ノートを追加"
|
||||
@@ -820,21 +806,6 @@
|
||||
"example_2": "より複雑な例としては、一致したノートの属性をすべて削除することが挙げられます:",
|
||||
"example_1": "例えば、ノートのタイトルに文字列を追加するには、この小さなスクリプトを使用します:"
|
||||
},
|
||||
"script_executor": {
|
||||
"execute_script": "スクリプトを実行",
|
||||
"query": "クエリ",
|
||||
"script": "スクリプト",
|
||||
"execute_query": "クエリを実行"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "ボタンを非表示"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "ボタンを表示"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "図をSVG形式でエクスポート"
|
||||
},
|
||||
"book_properties": {
|
||||
"grid": "グリッド",
|
||||
"list": "リスト",
|
||||
@@ -893,18 +864,11 @@
|
||||
"widget-preset-sample": "ウィジェットからのメッセージ"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "この日の編集されたノートはまだありません...",
|
||||
"title": "編集されたノート",
|
||||
"deleted": "(削除済み)"
|
||||
"no_edited_notes_found": "この日の編集されたノートはまだありません..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "ノート ID",
|
||||
"file_type": "ファイルタイプ",
|
||||
"file_size": "ファイルサイズ",
|
||||
"download": "ダウンロード",
|
||||
"open": "外部で開く",
|
||||
"title": "ファイル",
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"original_file_name": "元のファイル名",
|
||||
"upload_success": "新しいファイルの変更がアップロードされました。",
|
||||
"upload_failed": "新しいファイルの変更のアップロードに失敗しました。"
|
||||
@@ -923,13 +887,7 @@
|
||||
"mime": "MIME タイプ"
|
||||
},
|
||||
"image_properties": {
|
||||
"file_type": "ファイルタイプ",
|
||||
"file_size": "ファイルサイズ",
|
||||
"download": "ダウンロード",
|
||||
"open": "開く",
|
||||
"title": "画像",
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"original_file_name": "元のファイル名",
|
||||
"copy_reference_to_clipboard": "参照をクリップボードにコピー",
|
||||
"upload_success": "新しい画像の変更がアップロードされました。",
|
||||
"upload_failed": "新しい画像の変更のアップロードに失敗しました: {{message}}"
|
||||
@@ -979,16 +937,11 @@
|
||||
"note_paths": {
|
||||
"title": "ノートパス",
|
||||
"clone_button": "ノートを新しい場所にクローン...",
|
||||
"intro_placed": "このノートは以下のパスに置かれています:",
|
||||
"intro_not_placed": "このノートはまだノートツリーに配置されていません。",
|
||||
"archived": "アーカイブされた",
|
||||
"search": "検索",
|
||||
"outside_hoisted": "このパスはホイストされたノートの外側にあるため、ホイストを解除する必要があります。"
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "情報",
|
||||
"this_note_was_originally_taken_from": "このノートは元々以下から引用したものです:"
|
||||
},
|
||||
"similar_notes": {
|
||||
"title": "類似ノート",
|
||||
"no_similar_notes_found": "類似したノートが見つかりません。"
|
||||
@@ -1253,21 +1206,10 @@
|
||||
"italic": "イタリック体",
|
||||
"underline": "下線",
|
||||
"color": "カラーテキスト",
|
||||
"bg_color": "背景色付きテキスト",
|
||||
"visibility_title": "ハイライトリストの表示",
|
||||
"visibility_description": "#hideHighlightWidget ラベルを追加することで、ノートごとにハイライトウィジェットを非表示にできます。",
|
||||
"shortcut_info": "設定 -> ショートカット(右ペイン切り替え)で、右ペイン(ハイライトを含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "目次",
|
||||
"description": "ノートに定義された数以上の見出しがある場合、テキストノートに目次が表示されます。この数はカスタマイズできます:",
|
||||
"unit": "見出し",
|
||||
"disable_info": "このオプションに非常に大きな数値を設定することで、目次を効果的に無効にすることもできます。",
|
||||
"shortcut_info": "設定 -> ショートカット(右ペイン切り替え)で、右ペイン(目次を含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
"bg_color": "背景色付きテキスト"
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "目次",
|
||||
"options": "オプション",
|
||||
"no_headings": "見出しはありません。"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
@@ -1420,9 +1362,7 @@
|
||||
"cancel": "キャンセル"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "ブックマーク",
|
||||
"bookmark_this_note": "このノートを左サイドパネルにブックマークする",
|
||||
"remove_bookmark": "ブックマークを削除"
|
||||
"bookmark": "ブックマーク"
|
||||
},
|
||||
"attribute_detail": {
|
||||
"delete": "削除",
|
||||
@@ -1504,7 +1444,6 @@
|
||||
"display_relations": "表示するリレーション名をカンマで区切って指定します。それ以外のリレーション名は非表示になります。",
|
||||
"hide_relations": "非表示にするリレーション名をカンマで区切って指定します。それ以外のリレーションは表示されます。",
|
||||
"template": "このノートは、新しいノートを作成するときに利用可能なテンプレートの選択肢に表示されます。",
|
||||
"toc": "<code>#toc</code> または <code>#toc=show</code> は目次を強制的に表示し、<code>#toc=hide</code> は目次を強制的に非表示にします。ラベルが存在しない場合は、グローバル設定が適用されます。",
|
||||
"color": "ノートツリー、リンクなどのノートの色を定義します。 'red' や #a13d5f などの有効な CSS カラー値を使用します。",
|
||||
"keyboard_shortcut": "このノートにすぐにジャンプするキーボードショートカットを定義します。例: 「ctrl+alt+e」。変更を有効にするには、フロントエンドをリロードする必要があります。",
|
||||
"keep_current_hoisting": "このリンクを開いても、ノートが現在のホイストされたサブツリーに表示できない場合でも、ホイストは変更されません。",
|
||||
@@ -1512,7 +1451,6 @@
|
||||
"execute_description": "実行ボタンと一緒に表示される現在のコードノートの詳細な説明。",
|
||||
"exclude_from_note_map": "このラベルの付いたノートはノートマップから非表示になります。",
|
||||
"new_notes_on_top": "新しいノートは親ノートの下部ではなく上部に作成されます。",
|
||||
"hide_highlight_widget": "このノートのハイライトリストを非表示にし、それ以外のノートでは表示したままにします。",
|
||||
"run_on_note_creation": "バックエンドでノートが作成された際に実行されます。特定のサブツリー配下に作成されたすべてのノートに対してスクリプトを実行したい場合は、このリレーションを使用してください。その場合は、サブツリーのルートノートにスクリプトを作成し、継承可能にしてください。サブツリー内(任意の深さ)に新しいノートが作成されると、スクリプトが実行されます。",
|
||||
"run_on_child_note_creation": "このリレーションが定義されているノートの下に新しいノートが作成されたときに実行されます。",
|
||||
"render_note": "\"HTML ノートをレンダリング\" タイプのノートは、コードノート(HTML またはスクリプト)を使用してレンダリングされます。このリレーションを使用して、どのノートをレンダリングするかを指定する必要があります。",
|
||||
@@ -1558,7 +1496,6 @@
|
||||
"add_option": "オプションを追加",
|
||||
"remove_option": "このオプションを削除",
|
||||
"versioning_limit": "このノートで保持する変更履歴数を制限し、グローバル設定を上書きします。",
|
||||
"similar_notes_widget_disabled": "このノートの類似のノートリボンタブを無効にします。旧レイアウトのみ。",
|
||||
"llm_chat_home": "新しい AI チャットは、このノートの子として作成されます。",
|
||||
"workspace_llm_chat_home": "新しい AI チャットは、このノートの子として作成されると同時に、このワークスペースの祖先要素にホイストされます。",
|
||||
"date_pattern": "このカレンダーのルート配下で生成される日ノートのタイトルのパターン、例: <code>{dateNumberPadded} - {weekDay}</code>。",
|
||||
@@ -1719,34 +1656,18 @@
|
||||
"attachment-info": "添付ファイル • {{size}}"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "ノートを保護",
|
||||
"toggle-off": "ノートの保護を解除",
|
||||
"toggle-on-hint": "ノートは保護されていません。クリックして保護してください",
|
||||
"toggle-off-hint": "ノートは保護されています。クリックして保護を解除してください"
|
||||
"toggle-on": "ノートを保護"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "共有",
|
||||
"toggle-on-title": "ノートを共有",
|
||||
"toggle-off-title": "ノートの共有を解除",
|
||||
"shared-branch": "このノートは共有ノートとしてのみ存在し、共有を解除すると削除されます。続行してこのノートを削除しますか?",
|
||||
"inherited": "このノートは、親から継承された共有方法のため、ここでは共有解除できません。"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "テンプレート",
|
||||
"toggle-on-hint": "ノートをテンプレート化する",
|
||||
"toggle-off-hint": "テンプレートとしてのノートを削除する"
|
||||
"template": "テンプレート"
|
||||
},
|
||||
"open-help-page": "ヘルプページを開く",
|
||||
"shared_info": {
|
||||
"help_link": "ヘルプについては、 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a> をご覧ください。",
|
||||
"shared_locally": "このノートは {{- link}} でローカルに共有されています。",
|
||||
"shared_publicly": "このノートは {{- link}} で一般公開されています。",
|
||||
"shared_preview": "このノートは {{- link}} で共有されていますが、そのページを開けるのはこのブラウザのみであり、かつ Trilium がそのブラウザで開かれている間だけです。他の人に公開するには、Trilium サーバーが必要です。",
|
||||
"shared_export_only": "このノートは共有されていますが、モバイルアプリでは共有ページを開くことができません。公開するには、サブツリーを \"{{format}}\" としてエクスポートし、任意の Web サーバーでファイルをホストするか、Trilium サーバーを使用してください。"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "ハイライトリスト",
|
||||
"options": "オプション",
|
||||
"title_with_count_other": "{{count}} ハイライト",
|
||||
"menu_configure": "ハイライトリストの設定...",
|
||||
"no_highlights": "ハイライトが見つかりません。"
|
||||
@@ -1881,12 +1802,10 @@
|
||||
"editor_type": {
|
||||
"label": "書式設定ツールバー",
|
||||
"floating": {
|
||||
"description": "編集ツールがカーソル付近に表示されます。",
|
||||
"title": "フローティング"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "固定",
|
||||
"description": "編集ツールは「書式設定」のリボンタブに表示されます。"
|
||||
"title": "固定"
|
||||
},
|
||||
"multiline-toolbar": "ツールバーが収まりきらない場合は複数行で表示",
|
||||
"toolbar_style": "ツールバーのスタイル"
|
||||
@@ -1934,9 +1853,6 @@
|
||||
"title": "コンテンツの言語",
|
||||
"description": "読み取り専用または編集可能なテキストノートの基本プロパティセクションの言語選択に表示する言語を 1 つ以上選択してください。これにより、スペルチェック、右から左へのサポート、引用符、テキスト抽出(OCR)などの機能が利用できるようになります。"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "図をPNG形式でエクスポート"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "図をPNG形式でエクスポートできませんでした。",
|
||||
"export_to_svg": "図をSVG形式でエクスポートできませんでした。",
|
||||
@@ -2075,15 +1991,10 @@
|
||||
"update_relation_target": "リレーション対象の更新",
|
||||
"to": "を"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "ノートの変更履歴"
|
||||
},
|
||||
"note_launcher": {
|
||||
"this_launcher_doesnt_define_target_note": "このランチャーにはターゲットとなるノートが設定されていないため、開く対象がありません。\"ターゲット\" リレーションを設定して、特定のノートを指すようにしてください。"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "リレーション",
|
||||
"backlink_other": "{{count}} 個のバックリンク",
|
||||
"no_backlinks": "このノートには、リンクされているノートはありません。"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -2097,12 +2008,9 @@
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "継承属性",
|
||||
"no_inherited_attributes": "継承属性はありません。",
|
||||
"none": "なし"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "拡大表示",
|
||||
"collapse": "通常サイズに折りたたむ",
|
||||
"title": "ノートマップ",
|
||||
"link-distance": "リンク距離",
|
||||
"fix-nodes": "ノードを修正",
|
||||
@@ -2110,9 +2018,6 @@
|
||||
"show-anyway": "マップを表示",
|
||||
"expand": "マップを展開"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "所有属性"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"unset-field-placeholder": "未設定",
|
||||
"open_external_link": "外部でリンクを開く",
|
||||
@@ -2357,9 +2262,6 @@
|
||||
"vacuum_label": "データベースの最適化(Vacuum)",
|
||||
"vacuum_description": "データベースを再構築してファイルサイズを削減します。データは変更されません。"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "編集したノートのリボンタブは、日ノートで自動的に開きます"
|
||||
},
|
||||
"ui-performance": {
|
||||
"enable-motion": "画面遷移とアニメーション",
|
||||
"enable-shadows": "影",
|
||||
@@ -2604,10 +2506,6 @@
|
||||
"title_vertical": "編集パネルを下に移動",
|
||||
"title_horizontal": "編集パネルを左に移動"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "編集のロックを解除",
|
||||
"lock-editing": "編集をロック"
|
||||
},
|
||||
"book_properties_config": {
|
||||
"hide-weekends": "週末を非表示",
|
||||
"display-week-numbers": "週番号を表示",
|
||||
@@ -2632,9 +2530,6 @@
|
||||
"background_effects_message": "WindowsおよびmacOSデバイスで、背景効果が安定しました。背景効果は、背景をぼかすことでユーザーインターフェースに彩りを添えます。",
|
||||
"background_effects_button": "背景効果を有効にする",
|
||||
"dismiss": "却下",
|
||||
"new_layout_title": "新しいレイアウト",
|
||||
"new_layout_message": "Trilium のレイアウトを刷新しました。リボンは廃止され、メインインターフェースにシームレスに統合されました。主要な機能は、新しいステータスバーと展開可能なセクション(プロモート属性など)に集約されています。\n\n新しいレイアウトはデフォルトで有効になっていますが、「オプション」→「外観」から一時的に無効にすることもできます。",
|
||||
"new_layout_button": "詳細情報",
|
||||
"scripting_disabled_title": "バックエンドスクリプトは無効になっています",
|
||||
"scripting_disabled_message": "セキュリティ上の理由から、バックエンドスクリプトはデフォルトで無効になっています。ノートにはバックエンドスクリプト(#run ラベルが付いているノート)が含まれていますが、これらは自動的に実行されなくなります。\n\nこれらのスクリプトに依存している場合は、セキュリティ設定でバックエンドスクリプトを再度有効にできます。",
|
||||
"scripting_disabled_button": "セキュリティ設定を開く"
|
||||
@@ -2647,9 +2542,6 @@
|
||||
"related_code_blocks": "テキストノート内のコードブロックの配色",
|
||||
"related_code_notes": "コードノートの配色",
|
||||
"ui": "ユーザーインターフェース",
|
||||
"ui_old_layout": "旧レイアウト",
|
||||
"ui_new_layout": "新しいレイアウト",
|
||||
"ui_layout_style": "レイアウトスタイル",
|
||||
"ui_layout_orientation": "ランチャーバーの方向"
|
||||
},
|
||||
"units": {
|
||||
@@ -2669,9 +2561,6 @@
|
||||
"update_available": {
|
||||
"update_available": "アップデートが利用可能"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "画像参照をクリップボードにコピーし、テキストノートに貼り付けることができます。"
|
||||
},
|
||||
"attachment_detail": {
|
||||
"open_help_page": "添付ファイルのヘルプページを開く",
|
||||
"owning_note": "所有ノート: ",
|
||||
@@ -2818,8 +2707,6 @@
|
||||
"create_event": "作成"
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "現在、読み取り専用のノートを表示しています。",
|
||||
"auto-read-only-note": "このノートは読み込みを高速化するために読み取り専用モードで表示されています。",
|
||||
"edit-note": "ノートを編集"
|
||||
},
|
||||
"note-color": {
|
||||
@@ -2842,8 +2729,6 @@
|
||||
"experimental_features": {
|
||||
"title": "実験オプション",
|
||||
"disclaimer": "これらのオプションは試験的なもので、動作が不安定になる可能性があります。注意してご使用ください。",
|
||||
"new_layout_name": "新しいレイアウト",
|
||||
"new_layout_description": "よりモダンな外観と使いやすさが向上した新しいレイアウトをお試しください。今後のリリースで大幅な変更が加えられる可能性があります。",
|
||||
"llm_name": "AI / LLM チャット",
|
||||
"llm_description": "大規模言語モデルを活用した AI チャットサイドバーと LLM チャットノートを有効にします。"
|
||||
},
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"hide_relations": "숨길 관계 이름을 쉼표로 구분하여 입력합니다. 그 밖의 관계는 모두 표시됩니다.",
|
||||
"title_template": "이 노트의 하위 노트로 생성될 때 기본으로 사용되는 제목입니다. 이 값은 JavaScript 문자열로 평가되므로 \n동적인 내용을 넣을 수 있습니다. 주입된 <code>now</code> 및 <code>parentNote</code> 변수를 통해 가능합니다. 예시:\n\n<ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n</ul>\n\n자세한 내용은 <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki with details</a>, API 문서는 <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> 및 <a href=\"https://day.js.org/docs/en/display/format\">now</a> 를 참고해 주세요.",
|
||||
"template": "이 노트는 새 노트를 생성할 때 사용 가능한 템플릿 선택에 나타납니다.",
|
||||
"toc": "<code>#toc</code> 또는 <code>#toc=show</code> 값을 사용하면 목차가 강제로 표시되고, <code>#toc=hide</code> 값을 사용하면 목차가 강제로 숨겨집니다. 해당 레이블이 없으면 전역 설정을 따릅니다.",
|
||||
"color": "노트 트리와 링크 등에서 노트의 색상을 정의합니다. 'red' 또는 '#a13d5f'처럼 유효한 CSS 색상 값을 사용합니다.",
|
||||
"keyboard_shortcut": "이 노트로 바로 전환되는 키보드 단축키를 정의합니다. 예시: 'ctrl+alt+e'. 변경 사항이 적용되려면 프론트엔드 재로드가 필요합니다.",
|
||||
"keep_current_hoisting": "현재 루트로 보는 하위 트리에 노트를 표시할 수 없어도 이 링크를 열 때 루트 보기 상태를 변경하지 않습니다.",
|
||||
@@ -665,7 +664,6 @@
|
||||
"execute_description": "실행 버튼과 함께 현재 코드 노트에 대한 더 긴 설명이 표시됩니다.",
|
||||
"exclude_from_note_map": "이 라벨이 붙은 노트는 노트 맵에서 숨겨집니다.",
|
||||
"new_notes_on_top": "새로운 노트는 상위 노트의 상단에 생성되며, 하단에 생성되지 않습니다.",
|
||||
"hide_highlight_widget": "이 노트에서만 하이라이트 목록을 숨기고 다른 노트에는 계속 표시합니다.",
|
||||
"run_on_note_creation": "백엔드에서 노트가 생성될 때 실행됩니다. 특정 하위 트리에서 생성되는 모든 노트에 스크립트를 실행하려면 이 관계를 하위 트리의 루트 노트에 만들고 상속 가능하게 설정합니다. 그러면 하위 트리 안의 어느 깊이에서 새 노트가 생성되어도 스크립트가 실행됩니다.",
|
||||
"run_on_child_note_creation": "이 관계가 정의된 노트 아래에서 새 노트가 생성될 때 실행됩니다.",
|
||||
"run_on_note_title_change": "노트 제목이 변경되면 실행됩니다(노트 생성도 포함).",
|
||||
@@ -698,7 +696,6 @@
|
||||
"color_type": "색상",
|
||||
"relation_type": "관계",
|
||||
"versioning_limit": "이 노트가 유지할 수 있는 수정본 횟수를 제한하여 전역 설정을 덮어줍니다.",
|
||||
"similar_notes_widget_disabled": "이 노트의 유사 노트 리본 탭을 비활성화합니다. 이전 레이아웃에서만 적용됩니다.",
|
||||
"llm_chat_home": "새 AI 채팅을 이 노트의 하위 노트로 만듭니다.",
|
||||
"workspace_llm_chat_home": "이 작업 공간의 상위 노트를 루트로 볼 때 새 AI 채팅을 이 노트의 하위 노트로 만듭니다.",
|
||||
"date_pattern": "이 달력 루트 아래에서 생성되는 일별 노트의 제목 패턴입니다. 예: <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -1099,15 +1096,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "새 분할 생성"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "이 노트 편집"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "목차 보기"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "하이라이트 목록 보기"
|
||||
},
|
||||
"options": {
|
||||
"title": "옵션",
|
||||
"back": "모든 옵션으로 돌아가기",
|
||||
@@ -1217,9 +1205,6 @@
|
||||
"active": "보호된 세션이 활성화되어 있습니다. 보호된 세션을 떠나려면 클릭하세요.",
|
||||
"inactive": "보호된 세션을 시작하려면 클릭"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "노트 수정본"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "업데이트 가능"
|
||||
},
|
||||
@@ -1234,18 +1219,6 @@
|
||||
"opening_api_docs_message": "API 문서를 여는 중...",
|
||||
"sql_console_saved_message": "SQL 콘솔 노트가 {{note_path}}에 저장되었습니다"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "클립보드에 이미지 참조를 복사해 텍스트 노트에 붙여넣을 수 있습니다."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "버튼 숨기기"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "버튼 표시"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "다이어그램을 SVG로 내보내기"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "하위 노트를 만들어 맵에 추가",
|
||||
"create_child_note_text": "노트 추가"
|
||||
@@ -1270,8 +1243,6 @@
|
||||
"esc_hint": "닫기"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_other": "백링크 {{count}}개",
|
||||
"relation": "관계",
|
||||
"no_backlinks": "이 노트로 연결되는 노트가 없습니다."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1299,8 +1270,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "노트 유형",
|
||||
"editable": "편집 가능",
|
||||
"basic_properties": "기본 속성",
|
||||
"language": "언어",
|
||||
"configure_code_notes": "코드 노트 설정하기..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1330,37 +1299,23 @@
|
||||
"open_all_limit_exceeded": "한 번에 열 수 있는 노트가 너무 많습니다({{count}}). 최대 {{max}}개까지 열 수 있으므로 먼저 결과 범위를 좁혀보세요."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "아직 이날 편집한 노트가 없습니다...",
|
||||
"title": "편집된 노트",
|
||||
"deleted": "(삭제됨)"
|
||||
"no_edited_notes_found": "아직 이날 편집한 노트가 없습니다..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "노트 ID",
|
||||
"original_file_name": "원본 파일 이름",
|
||||
"file_type": "파일 형식",
|
||||
"file_size": "파일 크기",
|
||||
"download": "다운로드",
|
||||
"open": "외부에서 열기",
|
||||
"upload_new_revision": "새 수정본 업로드",
|
||||
"upload_success": "새 파일 수정본이 업로드되었습니다.",
|
||||
"upload_failed": "새 파일 수정본 업로드에 실패했습니다.",
|
||||
"title": "파일"
|
||||
"upload_failed": "새 파일 수정본 업로드에 실패했습니다."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "원본 파일 이름",
|
||||
"file_type": "파일 형식",
|
||||
"file_size": "파일 크기",
|
||||
"download": "다운로드",
|
||||
"open": "열기",
|
||||
"copy_reference_to_clipboard": "참조를 클립보드에 복사",
|
||||
"upload_new_revision": "새 수정본 업로드",
|
||||
"upload_success": "새 이미지 수정본이 업로드되었습니다.",
|
||||
"upload_failed": "새 이미지 수정본을 업로드하지 못했습니다: {{message}}",
|
||||
"title": "이미지"
|
||||
"upload_failed": "새 이미지 수정본을 업로드하지 못했습니다: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "상속 속성",
|
||||
"no_inherited_attributes": "상속된 속성이 없습니다.",
|
||||
"none": "없음"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1377,8 +1332,6 @@
|
||||
"show_similar_notes": "유사한 노트 표시"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "완전 확장하기",
|
||||
"collapse": "일반 크기로 접기",
|
||||
"title": "노트 맵",
|
||||
"fix-nodes": "고정 노드",
|
||||
"link-distance": "링크 거리",
|
||||
@@ -1389,19 +1342,11 @@
|
||||
"note_paths": {
|
||||
"title": "노트 경로",
|
||||
"clone_button": "노트를 새 위치로 복제...",
|
||||
"intro_placed": "이 노트는 다음 경로에 배치되어 있습니다:",
|
||||
"intro_not_placed": "이 노트는 아직 노트 트리에 배치되지 않았습니다.",
|
||||
"outside_hoisted": "이 경로는 현재 루트로 보는 노트 밖에 있으므로 루트 보기를 해제해야 합니다.",
|
||||
"archived": "보관됨",
|
||||
"search": "검색"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "이 노트는 원래 다음 출처에서 가져온 것입니다:",
|
||||
"info": "정보"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "직접 속성"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "표시 속성",
|
||||
"unset-field-placeholder": "미설정",
|
||||
@@ -1430,12 +1375,6 @@
|
||||
"conflicting": "여러 정의",
|
||||
"conflicting_tooltip": "항목마다 이 속성을 서로 다른 방식으로 정의하고 있어 텍스트로 정렬되며, 항목 메뉴에서는 값을 설정할 수 없습니다."
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "쿼리",
|
||||
"script": "스크립트",
|
||||
"execute_query": "쿼리 실행",
|
||||
"execute_script": "스크립트 실행"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "검색 옵션 추가:",
|
||||
"search_string": "검색 문자열",
|
||||
@@ -1794,8 +1733,6 @@
|
||||
"experimental_features": {
|
||||
"title": "실험적 옵션",
|
||||
"disclaimer": "이러한 선택지는 실험적이며 불안정성을 초래할 수 있습니다. 조심해서 사용하세요.",
|
||||
"new_layout_name": "새 레이아웃",
|
||||
"new_layout_description": "더 현대적인 디자인과 향상된 사용성을 위해 새로운 레이아웃을 사용해 보세요. 향후 릴리스에서 크게 변경될 수 있습니다.",
|
||||
"llm_name": "AI / LLM 채팅",
|
||||
"llm_description": "AI 채팅 사이드바와 대형 언어 모델이 지원하는 LLM 채팅 노트를 활성화하세요."
|
||||
},
|
||||
@@ -1848,9 +1785,6 @@
|
||||
"enabled": "활성화",
|
||||
"disabled": "비활성화"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "편집된 노트 리본 탭은 하루 노트에 자동으로 열립니다"
|
||||
},
|
||||
"theme": {
|
||||
"title": "사용자 인터페이스",
|
||||
"theme_label": "애플리케이션 테마",
|
||||
@@ -2051,17 +1985,7 @@
|
||||
"italic": "이탤릭 텍스트",
|
||||
"underline": "밑줄 그린 텍스트",
|
||||
"color": "컬러 텍스트",
|
||||
"bg_color": "배경색이 있는 텍스트",
|
||||
"visibility_title": "하이라이트 목록 가시성",
|
||||
"visibility_description": "#hideHighlightWidget 라벨을 추가하면 노트별로 하이라이트 위젯을 숨길 수 있습니다.",
|
||||
"shortcut_info": "옵션 -> 단축키(이름 'toggleRightPane')에서 오른쪽 창(하이라이트 포함)을 빠르게 토글할 수 있는 단축키를 설정할 수 있습니다."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "목차",
|
||||
"description": "목차는 노트에 정해진 제목 수가 많을 때 텍스트 노트에 나타납니다. 이 번호는 다음과 같이 맞춤 설정할 수 있습니다:",
|
||||
"unit": "개",
|
||||
"disable_info": "이 옵션을 사용해 매우 높은 수치를 설정해 TOC를 효과적으로 비활성화할 수도 있습니다.",
|
||||
"shortcut_info": "옵션 -> 단축키(이름 'toggleRightPane')에서 오른쪽 창(TOC 포함)을 빠르게 토글할 수 있는 단축키를 설정할 수 있습니다."
|
||||
"bg_color": "배경색이 있는 텍스트"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "자동 읽기 전용 크기",
|
||||
@@ -2380,9 +2304,7 @@
|
||||
"kind_and_size": "{{role}} · {{size}}"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "북마크",
|
||||
"bookmark_this_note": "이 노트를 왼쪽 패널에 북마크로 추가",
|
||||
"remove_bookmark": "북마크 제거"
|
||||
"bookmark": "북마크"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "자동",
|
||||
@@ -2437,16 +2359,7 @@
|
||||
"clone": "복제",
|
||||
"clone-tooltip": "같은 노트를 두 위치에서 동시에 사용할 수 있도록 복제"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "이 노트는 {{- link}}에서 공개적으로 공유됩니다.",
|
||||
"shared_locally": "이 노트는 {{- link}}에서 로컬로 공유되고 있습니다.",
|
||||
"help_link": "도움이 필요하시면 방문하세요 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">위키</a>.",
|
||||
"shared_preview": "이 노트는 {{- link}}에서 공유되고 있지만, 이 페이지는 이 브라우저에서만 열 수 있으며 Trilium이 이 브라우저에서 실행 중일 때만 사용할 수 있습니다. 다른 사람이 볼 수 있도록 게시하려면 Trilium 서버가 필요합니다.",
|
||||
"shared_export_only": "이 노트는 공유되어 있지만 모바일 앱에서는 공유 페이지를 열 수 없습니다. 게시하려면 하위 트리를 \"{{format}}\" 형식으로 내보낸 뒤 아무 웹 서버에나 파일을 호스팅하거나 Trilium 서버를 사용하세요."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "현재 읽기 전용 노트를 보고 있습니다.",
|
||||
"auto-read-only-note": "이 노트는 더 빠른 로딩을 위해 읽기 전용 모드로 표시됩니다.",
|
||||
"edit-note": "노트 편집"
|
||||
},
|
||||
"note_types": {
|
||||
@@ -2481,10 +2394,7 @@
|
||||
"widget-preset-sample": "위젯에서 보내는 인사"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "노트 보호",
|
||||
"toggle-off": "노트 보호 해제",
|
||||
"toggle-on-hint": "노트가 보호되지 않았습니다. 클릭하면 보호할 수 있습니다",
|
||||
"toggle-off-hint": "노트가 보호되어 있습니다. 클릭하면 보호를 해제할 수 있습니다"
|
||||
"toggle-on": "노트 보호"
|
||||
},
|
||||
"llm_chat": {
|
||||
"placeholder": "메시지를 입력하세요...",
|
||||
@@ -2621,15 +2531,11 @@
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "공유",
|
||||
"toggle-on-title": "노트 공유",
|
||||
"toggle-off-title": "노트 공유 취소",
|
||||
"shared-branch": "이 노트는 공유 노트로만 존재하므로 공유를 해제하면 삭제됩니다. 계속하여 이 노트를 삭제하시겠습니까?",
|
||||
"inherited": "노트는 조상으로부터 상속받아 공유되기 때문에 여기서 해제할 수 없습니다."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "템플릿",
|
||||
"toggle-on-hint": "노트를 템플릿으로 만드세요",
|
||||
"toggle-off-hint": "노트를 템플릿에서 해제"
|
||||
"template": "템플릿"
|
||||
},
|
||||
"full_content_width_switch": {
|
||||
"title": "전체 너비"
|
||||
@@ -2645,9 +2551,7 @@
|
||||
"replace_all": "모두 바꾸기"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "하이라이트 목록",
|
||||
"title_with_count_other": "하이라이트 {{count}}개",
|
||||
"options": "옵션",
|
||||
"menu_configure": "하이라이트 리스트 설정하기...",
|
||||
"no_highlights": "하이라이트는 찾지 못했습니다."
|
||||
},
|
||||
@@ -2762,7 +2666,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "목차",
|
||||
"options": "옵션",
|
||||
"no_headings": "제목이 없습니다."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2859,9 +2762,6 @@
|
||||
"tab_width": "탭 폭",
|
||||
"tab_width_unit": "칸"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "포맷팅"
|
||||
},
|
||||
"editor": {
|
||||
"title": "편집기"
|
||||
},
|
||||
@@ -2870,12 +2770,10 @@
|
||||
"label": "서식 도구 모음",
|
||||
"toolbar_style": "툴바 스타일",
|
||||
"floating": {
|
||||
"title": "플로팅",
|
||||
"description": "편집 도구는 커서 근처에 나타납니다;"
|
||||
"title": "플로팅"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "고정",
|
||||
"description": "편집 도구는 \"서식\" 리본 탭에 나타납니다."
|
||||
"title": "고정"
|
||||
},
|
||||
"multiline-toolbar": "툴바가 한 줄에 맞지 않으면 여러 줄로 표시"
|
||||
}
|
||||
@@ -3241,18 +3139,11 @@
|
||||
"title_vertical": "편집 창을 맨 아래로 이동",
|
||||
"title_horizontal": "편집 창을 왼쪽으로 이동"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "편집 잠금 해제",
|
||||
"lock-editing": "편집 잠금"
|
||||
},
|
||||
"display_mode": {
|
||||
"source": "소스 보기",
|
||||
"split": "분할 보기",
|
||||
"preview": "미리보기"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "다이어그램을 PNG로 내보내기"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "이 다이어그램은 PNG로 내보낼 수 없었습니다.",
|
||||
"export_to_svg": "다이어그램을 SVG로 내보낼 수 없습니다.",
|
||||
@@ -3580,9 +3471,6 @@
|
||||
"background_effects_title": "배경 효과가 이제 안정적으로 변했습니다",
|
||||
"background_effects_message": "Windows와 macOS 기기에서는 배경 효과가 이제 안정적입니다. 배경 효과는 배경을 흐리게 하여 사용자 인터페이스에 색감을 더합니다.",
|
||||
"background_effects_button": "배경 효과 활성화",
|
||||
"new_layout_title": "새 레이아웃",
|
||||
"new_layout_message": "Trilium에 현대적인 새 레이아웃을 도입했습니다. 리본을 제거하고 기본 인터페이스에 자연스럽게 통합했으며, 새 상태 표시줄과 확장 가능한 섹션(예: 표시 속성)이 주요 기능을 담당합니다.\n\n새 레이아웃은 기본적으로 활성화됩니다. 옵션 → 모양에서 일시적으로 비활성화할 수 있습니다.",
|
||||
"new_layout_button": "추가 정보",
|
||||
"scripting_disabled_title": "백엔드 스크립팅이 비활성화되었습니다",
|
||||
"scripting_disabled_message": "보안상 백엔드 스크립팅은 기본적으로 비활성화되어 있습니다. 노트에는 백엔드 스크립트(#run 라벨이 붙은 노트)가 포함되어 있는데, 이들은 더 이상 자동으로 실행되지 않습니다.\n\n이 스크립트에 의존한다면 보안 설정에서 백엔드 스크립팅을 다시 활성화할 수 있습니다.",
|
||||
"scripting_disabled_button": "보안 설정 열기",
|
||||
@@ -3596,10 +3484,7 @@
|
||||
"related_code_blocks": "텍스트 노트 내 코드 블록의 색상 체계",
|
||||
"related_code_notes": "코드 노트의 색상 체계",
|
||||
"ui": "사용자 인터페이스",
|
||||
"ui_layout_style": "레이아웃 스타일",
|
||||
"ui_layout_orientation": "실행 표시줄 방향",
|
||||
"ui_old_layout": "이전 레이아웃",
|
||||
"ui_new_layout": "새 레이아웃"
|
||||
"ui_layout_orientation": "실행 표시줄 방향"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
|
||||
@@ -2,16 +2,9 @@
|
||||
"about": {
|
||||
"data_directory": "Datamappe:"
|
||||
},
|
||||
"experimental_features": {
|
||||
"new_layout_description": "Prøv det nye grensesnittet for et mer moderne utseende og forbedret brukervenlighet. Det må påregnes betydelige endringer i kommende versjoner."
|
||||
},
|
||||
"cpu_arch_warning": {
|
||||
"recommendation": "For den beste brukeropplevelsen, vennligst last ned den tilpassede ARM64-versjonen av TriliumNext fra siden for utgivelser."
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_one": "{{count}} Tilbakelenke",
|
||||
"backlink_other": "{{count}} Tilbakelenker"
|
||||
},
|
||||
"add_link": {
|
||||
"note": "Notat"
|
||||
},
|
||||
|
||||
@@ -111,12 +111,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Maak nieuwe split"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Notitie bewerken"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Laat Inhoudsopgave zien"
|
||||
},
|
||||
"status_bar": {
|
||||
"note_paths_one": "{{count}} pad",
|
||||
"note_paths_other": "{{count}} paden",
|
||||
|
||||
@@ -263,10 +263,7 @@
|
||||
"background_effects_title": "Efekty tła są teraz stabilne",
|
||||
"dismiss": "Odrzuć",
|
||||
"background_effects_button": "Włącz efekty tła",
|
||||
"background_effects_message": "Na urządzeniach z systemem Windows i macOS efekty tła są stabilne. Efekty tła dodają odrobinę koloru do interfejsu użytkownika poprzez rozmycie tła za nim.",
|
||||
"new_layout_title": "Nowy układ",
|
||||
"new_layout_message": "Wprowadziliśmy zmodernizowany układ interfejsu dla Trilium. Wstążka została usunięta i płynnie zintegrowana z głównym interfejsem, a jej kluczowe funkcje przejęły nowy pasek stanu i rozwijane sekcje (takie jak promowane atrybuty).\n\nNowy układ jest domyślnie włączony i można go tymczasowo wyłączyć w Ustawienia → Wygląd.",
|
||||
"new_layout_button": "Szczegóły"
|
||||
"background_effects_message": "Na urządzeniach z systemem Windows i macOS efekty tła są stabilne. Efekty tła dodają odrobinę koloru do interfejsu użytkownika poprzez rozmycie tła za nim."
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "Powiązane ustawienia"
|
||||
@@ -274,9 +271,7 @@
|
||||
"settings_appearance": {
|
||||
"related_code_blocks": "Schemat kolorów dla bloków kodu w notatkach tekstowych",
|
||||
"related_code_notes": "Schemat kolorów dla notatek kodu",
|
||||
"ui": "Interfejs użytkownika",
|
||||
"ui_old_layout": "Stary układ",
|
||||
"ui_new_layout": "Nowy układ"
|
||||
"ui": "Interfejs użytkownika"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
@@ -384,7 +379,6 @@
|
||||
"hide_relations": "oddzielone przecinkami nazwy relacji, które powinny być ukryte. Wszystkie inne zostaną wyświetlone.",
|
||||
"title_template": "domyślny tytuł notatek utworzonych jako dzieci tej notatki. Wartość jest ewaluowana jako ciąg JavaScript \n i dzięki temu może być wzbogacona o dynamiczną zawartość za pomocą wstrzykniętych zmiennych <code>now</code> i <code>parentNote</code>. Przykłady:\n \n <ul>\n <li><code>Dzieła literackie ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Log z ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Zobacz <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki ze szczegółami</a>, dokumentację API dla <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> oraz <a href=\"https://day.js.org/docs/en/display/format\">now</a> po więcej szczegółów.",
|
||||
"template": "Ta notatka pojawi się w wyborze dostępnych szablonów podczas tworzenia nowej notatki",
|
||||
"toc": "<code>#toc</code> lub <code>#toc=show</code> wymusi pokazanie spisu treści, <code>#toc=hide</code> wymusi jego ukrycie. Jeśli etykieta nie istnieje, przestrzegane jest ustawienie globalne",
|
||||
"color": "definiuje kolor notatki w drzewie notatek, linkach itp. Użyj dowolnej poprawnej wartości koloru CSS, np. 'red' lub #a13d5f",
|
||||
"keyboard_shortcut": "Definiuje skrót klawiszowy, który natychmiast przeskoczy do tej notatki. Przykład: 'ctrl+alt+e'. Wymaga przeładowania frontendu, aby zmiana weszła w życie.",
|
||||
"keep_current_hoisting": "Otwarcie tego linku nie zmieni zawężenia widoku (hoisting), nawet jeśli notatka nie jest widoczna w obecnie zawężonym poddrzewie.",
|
||||
@@ -392,7 +386,6 @@
|
||||
"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 go w notatce korzenia poddrzewa i uczyń go dziedziczonym. Nowa notatka utworzona w poddrzewie (na dowolnej głębokości) wyzwoli skrypt.",
|
||||
"run_on_child_note_creation": "wykonuje się, gdy nowa notatka jest tworzona pod notatką, w której zdefiniowana jest ta relacja",
|
||||
"run_on_note_title_change": "wykonuje się, gdy tytuł notatki zostanie zmieniony (obejmuje również utworzenie notatki)",
|
||||
@@ -445,12 +438,6 @@
|
||||
"importZipRecommendation": "Podczas importowania pliku ZIP hierarchia notatek będzie odzwierciedlać strukturę podkatalogów w archiwum."
|
||||
},
|
||||
"image_properties": {
|
||||
"title": "Obraz",
|
||||
"original_file_name": "Oryginalna nazwa pliku",
|
||||
"file_type": "Typ pliku",
|
||||
"file_size": "Rozmiar pliku",
|
||||
"download": "Pobierz",
|
||||
"open": "Otwórz",
|
||||
"copy_reference_to_clipboard": "Kopiuj odniesienie do schowka",
|
||||
"upload_new_revision": "Prześlij nową wersję",
|
||||
"upload_success": "Nowa wersja obrazu została przesłana.",
|
||||
@@ -458,7 +445,6 @@
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Dziedziczone atrybuty",
|
||||
"no_inherited_attributes": "Brak dziedziczonych atrybutów.",
|
||||
"none": "brak"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -477,8 +463,6 @@
|
||||
"mime": "Typ MIME"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Rozwiń do pełnego",
|
||||
"collapse": "Zwiń do normalnego rozmiaru",
|
||||
"title": "Mapa notatek",
|
||||
"fix-nodes": "Zablokuj węzły",
|
||||
"link-distance": "Dystans łączy"
|
||||
@@ -486,19 +470,11 @@
|
||||
"note_paths": {
|
||||
"title": "Ścieżki notatki",
|
||||
"clone_button": "Sklonuj notatkę do nowej lokalizacji...",
|
||||
"intro_placed": "Ta notatka jest umieszczona w następujących ścieżkach:",
|
||||
"intro_not_placed": "Ta notatka nie jest jeszcze umieszczona w drzewie notatek.",
|
||||
"outside_hoisted": "Ta ścieżka znajduje się poza zawężonym widokiem (hoisted note) i musisz cofnąć zawężenie.",
|
||||
"archived": "Zarchiwizowana",
|
||||
"search": "Szukaj"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Ta notatka została pierwotnie pobrana z:",
|
||||
"info": "Info"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Posiadane atrybuty"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Wyróżnione atrybuty",
|
||||
"unset-field-placeholder": "nie ustawiono",
|
||||
@@ -510,12 +486,6 @@
|
||||
"remove_this_attribute": "Usuń ten atrybut",
|
||||
"remove_color": "Usuń etykietę koloru"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Zapytanie",
|
||||
"script": "Skrypt",
|
||||
"execute_query": "Wykonaj zapytanie",
|
||||
"execute_script": "Wykonaj skrypt"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Dodaj opcję wyszukiwania:",
|
||||
"search_string": "ciąg wyszukiwania",
|
||||
@@ -571,14 +541,9 @@
|
||||
"file_properties": {
|
||||
"download": "Pobierz",
|
||||
"open": "Otwórz zewnętrznie",
|
||||
"upload_new_revision": "Prześlij nową wersję",
|
||||
"upload_success": "Nowa wersja pliku została przesłana.",
|
||||
"upload_failed": "Przesłanie nowej wersji pliku nie powiodło się.",
|
||||
"title": "Plik",
|
||||
"note_id": "ID notatki",
|
||||
"original_file_name": "Oryginalna nazwa pliku",
|
||||
"file_type": "Typ pliku",
|
||||
"file_size": "Rozmiar pliku"
|
||||
"original_file_name": "Oryginalna nazwa pliku"
|
||||
},
|
||||
"include_note": {
|
||||
"label_note": "Notatka",
|
||||
@@ -689,13 +654,6 @@
|
||||
"title_vertical": "Przenieś panel edycji na dół",
|
||||
"title_horizontal": "Przenieś panel edycji na lewo"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Odblokuj edycję",
|
||||
"lock-editing": "Zablokuj edycję"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Eksportuj diagram jako PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Diagram nie mógł zostać wyeksportowany do PNG.",
|
||||
"export_to_svg": "Diagram nie mógł zostać wyeksportowany do SVG."
|
||||
@@ -989,15 +947,6 @@
|
||||
"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",
|
||||
@@ -1081,9 +1030,6 @@
|
||||
"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"
|
||||
},
|
||||
@@ -1097,27 +1043,9 @@
|
||||
"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": "Skopiuj odniesienie do obrazu do schowka, można je wkleić w notatce 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 notatkę podrzędną i dodaj ją do mapy"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "relacja",
|
||||
"backlink_one": "{{count}} Link zwrotny",
|
||||
"backlink_few": "{{count}} Linki zwrotne",
|
||||
"backlink_many": "{{count}} Linki zwrotne"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "Wstaw notatkę podrzędną",
|
||||
"delete_this_note": "Usuń tę notatkę",
|
||||
@@ -1144,14 +1072,10 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Typ notatki",
|
||||
"editable": "Edytowalna",
|
||||
"basic_properties": "Właściwości podstawowe",
|
||||
"language": "Język",
|
||||
"configure_code_notes": "Konfiguruj notatki kodu..."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Brak edytowanych notatek w tym dniu...",
|
||||
"title": "Edytowane notatki",
|
||||
"deleted": "(usunięta)"
|
||||
"no_edited_notes_found": "Brak edytowanych notatek w tym dniu..."
|
||||
},
|
||||
"include_archived_notes": {
|
||||
"include_archived_notes": "Uwzględnij zarchiwizowane notatki"
|
||||
@@ -1347,9 +1271,6 @@
|
||||
"enabled": "włączony",
|
||||
"disabled": "wyłączony"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Karta wstążki Edytowane Notatki otworzy się automatycznie na notatkach dziennych"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Motyw aplikacji",
|
||||
"theme_label": "Motyw",
|
||||
@@ -1471,17 +1392,7 @@
|
||||
"italic": "Tekst pochylony",
|
||||
"underline": "Tekst podkreślony",
|
||||
"color": "Tekst kolorowy",
|
||||
"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 klawiszowy 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łówków",
|
||||
"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 klawiszowy do szybkiego przełączania prawego panelu (w tym Spisu treści) w Opcje -> Skróty (nazwa 'toggleRightPane')."
|
||||
"bg_color": "Tekst z kolorem tła"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Automatyczny rozmiar tylko do odczytu",
|
||||
@@ -1620,9 +1531,7 @@
|
||||
"unrecognized_role": "Nierozpoznana rola załącznika '{{role}}'."
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Zakładka",
|
||||
"bookmark_this_note": "Dodaj tę notatkę do zakładek w lewym panelu",
|
||||
"remove_bookmark": "Usuń zakładkę"
|
||||
"bookmark": "Zakładka"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Auto",
|
||||
@@ -1675,11 +1584,6 @@
|
||||
"hide-subtree": "Ukryj gałąź",
|
||||
"show-subtree": "Rozwiń gałąź"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Ta notatka jest udostępniona publicznie pod adresem {{- link}}.",
|
||||
"shared_locally": "Ta notatka jest udostępniona lokalnie pod adresem {{- link}}.",
|
||||
"help_link": "Aby uzyskać pomoc, odwiedź <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||
},
|
||||
"note_types": {
|
||||
"text": "Tekst",
|
||||
"code": "Kod",
|
||||
@@ -1706,22 +1610,15 @@
|
||||
"spreadsheet": "Arkusz"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Chroń notatkę",
|
||||
"toggle-off": "Zdejmij ochronę z notatki",
|
||||
"toggle-on-hint": "Notatka nie jest chroniona, kliknij, aby włączyć ochronę",
|
||||
"toggle-off-hint": "Notatka jest chroniona, kliknij, aby zdjąć ochronę"
|
||||
"toggle-on": "Chroń notatkę"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Udostępniona",
|
||||
"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 usunąć tę notatkę?",
|
||||
"inherited": "Nie można przestać udostępniać notatki w tym miejscu, ponieważ jest ona udostępniona poprzez dziedziczenie od przodka."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Szablon",
|
||||
"toggle-on-hint": "Uczyń notatkę szablonem",
|
||||
"toggle-off-hint": "Usuń notatkę z szablonów"
|
||||
"template": "Szablon"
|
||||
},
|
||||
"open-help-page": "Otwórz stronę pomocy",
|
||||
"find": {
|
||||
@@ -1733,8 +1630,6 @@
|
||||
"replace_all": "Zamień wszystko"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Lista wyróżnień",
|
||||
"options": "Opcje",
|
||||
"menu_configure": "Konfiguracja listy wyróżnień...",
|
||||
"no_highlights": "Nie znaleziono wyróżnień.",
|
||||
"title_with_count_one": "{{count}} wyróżnienie",
|
||||
@@ -1829,7 +1724,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Spis treści",
|
||||
"options": "Opcje",
|
||||
"no_headings": "Brak nagłówków."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -1902,9 +1796,6 @@
|
||||
"theme_group_dark": "Ciemne motywy",
|
||||
"copy_title": "Kopiuj do schowka"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formatowanie"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Edytor"
|
||||
},
|
||||
@@ -1912,12 +1803,10 @@
|
||||
"editor_type": {
|
||||
"label": "Pasek narzędzi formatowania",
|
||||
"floating": {
|
||||
"title": "Pływający",
|
||||
"description": "narzędzia edycji pojawiają się w pobliżu kursora;"
|
||||
"title": "Pływający"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Stały",
|
||||
"description": "narzędzia edycji pojawiają się w karcie wstążki \"Formatowanie\"."
|
||||
"title": "Stały"
|
||||
},
|
||||
"multiline-toolbar": "Wyświetl pasek narzędzi w wielu wierszach, jeśli się nie mieści."
|
||||
}
|
||||
@@ -1946,13 +1835,9 @@
|
||||
},
|
||||
"experimental_features": {
|
||||
"title": "Opcje eksperymentalne",
|
||||
"disclaimer": "Te opcje są eksperymentalne i mogą powodować niestabilność. Używaj z ostrożnością.",
|
||||
"new_layout_name": "Nowy układ",
|
||||
"new_layout_description": "Wypróbuj nowy układ dla nowocześniejszego wyglądu i lepszej użyteczności. Podlega znacznym zmianom w nadchodzących wydaniach."
|
||||
"disclaimer": "Te opcje są eksperymentalne i mogą powodować niestabilność. Używaj z ostrożnością."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Obecnie przeglądasz notatkę tylko do odczytu.",
|
||||
"auto-read-only-note": "Ta notatka jest wyświetlana w trybie tylko do odczytu dla szybszego ładowania.",
|
||||
"edit-note": "Edytuj notatkę"
|
||||
},
|
||||
"calendar_view": {
|
||||
|
||||
@@ -365,7 +365,6 @@
|
||||
"hide_relations": "nomes das relações separados por vírgula que devem ser ocultados. Todas as outras serão exibidas.",
|
||||
"title_template": "título padrão das notas criadas como filhas desta nota. O valor é avaliado como uma cadeia JavaScript \n e pode ser enriquecido com conteúdo dinâmico usando as variáveis injetadas <code>now</code> e <code>parentNote</code>. Exemplos:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Veja a <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki com pormenores</a>, a documentação da API para <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> e para <a href=\"https://day.js.org/docs/en/display/format\">now</a> para mais informações.",
|
||||
"template": "Esta nota aparecerá na seleção de modelos disponíveis ao criar uma nova nota",
|
||||
"toc": "<code>#toc</code> ou <code>#toc=show</code> irá forçar a exibição do Sumário, <code>#toc=hide</code> irá forçar que ele fique oculto. Se o rótulo não existir, será considerado o ajuste global",
|
||||
"color": "define a cor da nota na árvore de notas, ligações etc. Use qualquer valor de cor CSS válido, como 'red' ou #a13d5f",
|
||||
"keyboard_shortcut": "Define um atalho de teclado que irá pular imediatamente para esta nota. Exemplo: 'ctrl+alt+e'. É necessário recarregar o frontend para que a alteração tenha efeito.",
|
||||
"keep_current_hoisting": "Abrir este ligação não alterará o destaque, mesmo que a nota não seja exibível na subárvore destacada atual.",
|
||||
@@ -373,7 +372,6 @@
|
||||
"execute_description": "Descrição longa da nota de código atualmente exibida junto ao botão executar",
|
||||
"exclude_from_note_map": "Notas com este rótulo ficarão ocultas no Mapa de Notas",
|
||||
"new_notes_on_top": "Novas notas serão criadas no topo da nota raiz, não na parte inferior.",
|
||||
"hide_highlight_widget": "Ocultar o widget da lista de destaques",
|
||||
"run_on_note_creation": "executa quando a nota é criada no backend. Use esta relação se quiser executar o script para todas as notas criadas numa subárvore específica. Neste caso, crie-a na nota raiz da subárvore e fazê-la herdável. Uma nova nota criada dentro da subárvore (qualquer profundidade) irá acionar o script.",
|
||||
"run_on_child_note_creation": "executa quando uma nova nota é criada sob a nota onde esta relação está definida",
|
||||
"run_on_note_title_change": "executa quando o título da nota é alterado (inclusive na criação de nota)",
|
||||
@@ -576,15 +574,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Criar divisão"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Editar esta nota"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Mostrar Tabela de Conteúdo"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Mostrar Lista de Destaques"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menu",
|
||||
"options": "Opções",
|
||||
@@ -667,9 +656,6 @@
|
||||
"active": "Sessão protegida está ativada. Clique para deixar a sessão protegida.",
|
||||
"inactive": "Clique para entrar na sessão protegida"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Revisões da Nota"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Atualização disponível"
|
||||
},
|
||||
@@ -683,27 +669,9 @@
|
||||
"opening_api_docs_message": "A abrir documentação da API…",
|
||||
"sql_console_saved_message": "Nota do Console SQL foi gravada no caminho {{note_path}}"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Copiar referência da imagem para a área de transferência, pode ser colado numa nota de texto."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Esconder botões"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Exibir botões"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Exportar diagrama como SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Criar nota filha e adicione neste mapa de relação"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "relação",
|
||||
"backlink_one": "{{count}} Ligação Reversa",
|
||||
"backlink_many": "{{count}} Ligações Reversas",
|
||||
"backlink_other": "{{count}} Ligações Reversas"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "Inserir nota filha",
|
||||
"delete_this_note": "Apagar esta nota",
|
||||
@@ -728,8 +696,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Tipo da nota",
|
||||
"editable": "Editável",
|
||||
"basic_properties": "Propriedades Básicas",
|
||||
"language": "Idioma",
|
||||
"configure_code_notes": "Configurar notas de código..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -754,37 +720,23 @@
|
||||
"hide_child_notes": "Esconder notas descendentes na árvore"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…",
|
||||
"title": "Notas Editadas",
|
||||
"deleted": "(apagado)"
|
||||
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…"
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "ID da Nota",
|
||||
"original_file_name": "Nome original do ficheiro",
|
||||
"file_type": "Tipo do ficheiro",
|
||||
"file_size": "Tamanho do ficheiro",
|
||||
"download": "Descarregar",
|
||||
"open": "Abrir",
|
||||
"upload_new_revision": "Enviar nova revisão",
|
||||
"upload_success": "Uma nova revisão de ficheiro foi enviada.",
|
||||
"upload_failed": "O envio de uma nova revisão de ficheiro falhou.",
|
||||
"title": "Ficheiro"
|
||||
"upload_failed": "O envio de uma nova revisão de ficheiro falhou."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Nome original do ficheiro",
|
||||
"file_type": "Tipo do ficheiro",
|
||||
"file_size": "Tamanho do ficheiro",
|
||||
"download": "Descarregar",
|
||||
"open": "Abrir",
|
||||
"copy_reference_to_clipboard": "Copiar referência para a área de transferência",
|
||||
"upload_new_revision": "Enviar nova revisão",
|
||||
"upload_success": "Uma nova revisão de imagem foi enviado.",
|
||||
"upload_failed": "O envio de uma nova revisão de imagem falhou: {{message}}",
|
||||
"title": "Imagem"
|
||||
"upload_failed": "O envio de uma nova revisão de imagem falhou: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Atributos Herdados",
|
||||
"no_inherited_attributes": "Nenhum atributo herdado.",
|
||||
"none": "Nenhum"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -803,8 +755,6 @@
|
||||
"show_similar_notes": "Mostrar notas semelhantes"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Expandir completamente",
|
||||
"collapse": "Recolher para tamanho normal",
|
||||
"title": "Mapa de Notas",
|
||||
"fix-nodes": "Fixar nós",
|
||||
"link-distance": "Distância da Ligação"
|
||||
@@ -812,19 +762,11 @@
|
||||
"note_paths": {
|
||||
"title": "Caminho das Notas",
|
||||
"clone_button": "Clonar nota para novo local…",
|
||||
"intro_placed": "Esta nova está localizada nos caminhos:",
|
||||
"intro_not_placed": "Esta nota ainda não está em nenhuma árvore de notas.",
|
||||
"outside_hoisted": "Este caminho está fora de uma nota fixada e teria que desafixar.",
|
||||
"archived": "Arquivado",
|
||||
"search": "Pesquisar"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:",
|
||||
"info": "Informações"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Atributos próprios"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Atributos Promovidos",
|
||||
"unset-field-placeholder": "não atribuído",
|
||||
@@ -836,12 +778,6 @@
|
||||
"remove_this_attribute": "Remover este atributo",
|
||||
"remove_color": "Remover a etiqueta de cor"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Consulta",
|
||||
"script": "Script",
|
||||
"execute_query": "Executar Consulta",
|
||||
"execute_script": "Executar Script"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Adicionar opção de pesquisa:",
|
||||
"search_string": "pesquisar cadeia",
|
||||
@@ -1091,9 +1027,6 @@
|
||||
"enabled": "ativada",
|
||||
"disabled": "desativada"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "A guia de Notas Editadas será aberta automaticamente nas notas do dia"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Tema da Aplicação",
|
||||
"theme_label": "Tema",
|
||||
@@ -1215,17 +1148,7 @@
|
||||
"italic": "Texto em itálico",
|
||||
"underline": "Texto sublinhado",
|
||||
"color": "Texto colorido",
|
||||
"bg_color": "Texto com cor de fundo",
|
||||
"visibility_title": "Visibilidade da Lista de Destaques",
|
||||
"visibility_description": "Pode esconder o componente de destaques por nota adicionado a etiqueta #hideHighlightWidget.",
|
||||
"shortcut_info": "Pode configurar um atalhe de teclado para alternar rapidamente o painel da direita (incluindo os Destaques) em Opções -> Atalhos (nome 'toggleRightPane')."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Tabela de Conteúdos",
|
||||
"description": "A tabela de conteúdos irá aparecer em notas de texto que possuam mais que um número definido de títulos. Pode personalizar este número:",
|
||||
"unit": "títulos",
|
||||
"disable_info": "Também pode usar esta opção para desativar a Tabela de Conteúdos por configurar um número muito alto.",
|
||||
"shortcut_info": "Pode configurar um atalhe de teclado para alternar rapidamente o painel da direita (incluindo a Tabela de Conteúdos) em Opções -> Atalhos (nome 'toggleRightPane')."
|
||||
"bg_color": "Texto com cor de fundo"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Tamanho para Somente Leitura Automático",
|
||||
@@ -1363,9 +1286,7 @@
|
||||
"unrecognized_role": "Regra desconhecida de anexo '{{role}}'."
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Favorito",
|
||||
"bookmark_this_note": "Favoritar esta nota no painel da esquerda",
|
||||
"remove_bookmark": "Remover favorito"
|
||||
"bookmark": "Favorito"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Auto",
|
||||
@@ -1418,11 +1339,6 @@
|
||||
"hide-subtree": "Esconder sub-árvore",
|
||||
"show-subtree": "Mostrar sub-árvore"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Esta nota é partilhada publicamente em {{- link}}.",
|
||||
"shared_locally": "Esta nota é partilhada localmente em {{- link}}.",
|
||||
"help_link": "Para ajuda, visite a <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||
},
|
||||
"note_types": {
|
||||
"text": "Texto",
|
||||
"code": "Código",
|
||||
@@ -1447,22 +1363,15 @@
|
||||
"new-feature": "Novo"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Proteger a nota",
|
||||
"toggle-off": "Desproteger a nota",
|
||||
"toggle-on-hint": "A nota não está protegida, clique para protegê-la",
|
||||
"toggle-off-hint": "A nota está protegida, clique para desprotegê-la"
|
||||
"toggle-on": "Proteger a nota"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Partilhado",
|
||||
"toggle-on-title": "Partilhar a nota",
|
||||
"toggle-off-title": "Parar de partilhar a nota",
|
||||
"shared-branch": "Esta nota só existe como uma nota partilhada, depois parar de partilhar irá apagá-la. Deseja continuar e apagar esta nota?",
|
||||
"inherited": "Não foi possível deixar de partilhar a nota porque ela é partilhada através da herança de uma nota superior."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Modelo",
|
||||
"toggle-on-hint": "Transformar a nota num modelo",
|
||||
"toggle-off-hint": "Deixar de usar a nota como um modelo"
|
||||
"template": "Modelo"
|
||||
},
|
||||
"open-help-page": "Abrir página de ajuda",
|
||||
"find": {
|
||||
@@ -1474,8 +1383,6 @@
|
||||
"replace_all": "Substituir tudo"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Lista de Destaques",
|
||||
"options": "Opções",
|
||||
"no_highlights": "Sem destaques encontrados.",
|
||||
"menu_configure": "Configurar lista de destaques...",
|
||||
"title_with_count_one": "{{count}} destaque",
|
||||
@@ -1563,7 +1470,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Tabela de Conteúdos",
|
||||
"options": "Opções",
|
||||
"no_headings": "Sem cabeçalhos."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -1636,9 +1542,6 @@
|
||||
"theme_group_dark": "Temas escuros",
|
||||
"copy_title": "Copiar para a área de transferência"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formatação"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Editor"
|
||||
},
|
||||
@@ -1646,12 +1549,10 @@
|
||||
"editor_type": {
|
||||
"label": "Barra de formatação",
|
||||
"floating": {
|
||||
"title": "A flutuar",
|
||||
"description": "ferramentas de edição aparecem perto do cursor;"
|
||||
"title": "A flutuar"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Fixado",
|
||||
"description": "ferramentas de edição aparecem na guia de faixa \"Formatação\"."
|
||||
"title": "Fixado"
|
||||
},
|
||||
"multiline-toolbar": "Exibir a barra de ferramentas em múltiplas linhas se não couber."
|
||||
}
|
||||
@@ -1753,13 +1654,6 @@
|
||||
"title_vertical": "Mover painel de edição para baixo",
|
||||
"title_horizontal": "Mover painel de edição para a esquerda"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Desbloquear edição",
|
||||
"lock-editing": "Bloquear edição"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Exportar diagrama como PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "O diagrama não pôde ser exportado como PNG.",
|
||||
"export_to_svg": "O diagrama não pode ser exportado para SVG."
|
||||
@@ -1865,10 +1759,7 @@
|
||||
"background_effects_title": "Efeitos de fundo estão estáveis agora",
|
||||
"background_effects_message": "Em dispositivos Windows, efeitos de fundo estão estáveis agora. Os efeitos de fundo adicionam um toque de cor à interface do utilizador borrando o plano de fundo atrás dela. Esta técnica também é usada noutras aplicações como o Windows Explorer.",
|
||||
"background_effects_button": "Ativar os efeitos de fundo",
|
||||
"dismiss": "Dispensar",
|
||||
"new_layout_title": "Novo titulo do layout",
|
||||
"new_layout_button": "Mais informação",
|
||||
"new_layout_message": "Estamos a introduzir um layout modernizado para o Trilium. A faixa foi removida e está integrada na interface principal, com uma nota barra de estado e secções expansíveis (como as propriedades próprias) a tomar papéis principais.\n\nO novo layout está activo por defeito, e pode ser temporáriamente disabilidade em Opções → Aparência."
|
||||
"dismiss": "Dispensar"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "Configurações relacionadas"
|
||||
@@ -1876,23 +1767,17 @@
|
||||
"settings_appearance": {
|
||||
"related_code_blocks": "Esquema de cores para blocos de código em notas de texto",
|
||||
"related_code_notes": "Esquema de cores para notas de código",
|
||||
"ui": "Interface do utilizador",
|
||||
"ui_old_layout": "Layout antigo",
|
||||
"ui_new_layout": "Nova aparência"
|
||||
"ui": "Interface do utilizador"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
},
|
||||
"experimental_features": {
|
||||
"title": "Opções experimentais",
|
||||
"new_layout_name": "Novo layout",
|
||||
"new_layout_description": "Experimente o novo layout para um aspecto moderno e melhor estabilidade. Sujeito a grandes alterações nas próximas publicações.",
|
||||
"disclaimer": "Estas opções são experimentais e podem causar instabilidade. Usar com cuidado."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Actualmente a ver em modo de leitura.",
|
||||
"edit-note": "Editar nota",
|
||||
"auto-read-only-note": "Esta nota está a ser mostrada em modo de leitura para um carregamento mais rápido."
|
||||
"edit-note": "Editar nota"
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "Editar este slide",
|
||||
|
||||
@@ -463,10 +463,8 @@
|
||||
"hide_relations": "nomes das relações separados por vírgula que devem ser ocultados. Todas as outras serão exibidas.",
|
||||
"title_template": "título padrão das notas criadas como filhas desta nota. O valor é avaliado como uma string JavaScript \n e pode ser enriquecido com conteúdo dinâmico usando as variáveis injetadas <code>now</code> e <code>parentNote</code>. Exemplos:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Veja a <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki com detalhes</a>, a documentação da API para <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> e para <a href=\"https://day.js.org/docs/en/display/format\">now</a> para mais informações.",
|
||||
"template": "Esta nota aparecerá na seleção de modelos disponíveis ao criar uma nova nota",
|
||||
"toc": "<code>#toc</code> ou <code>#toc=show</code> irá forçar a exibição do Sumário, <code>#toc=hide</code> irá forçar que ele fique oculto. Se o rótulo não existir, será considerado o ajuste global",
|
||||
"color": "define a cor da nota na árvore de notas, links etc. Use qualquer valor de cor CSS válido, como 'red' ou #a13d5f",
|
||||
"keyboard_shortcut": "Define um atalho de teclado que irá pular imediatamente para esta nota. Exemplo: 'ctrl+alt+e'. É necessário recarregar o frontend para que a alteração tenha efeito.",
|
||||
"hide_highlight_widget": "Ocultar o widget da lista de destaques",
|
||||
"keep_current_hoisting": "Abrir este link não alterará o destaque, mesmo que a nota não seja exibível na subárvore destacada atual.",
|
||||
"execute_button": "Titulo do botão que executará a nota de código atual",
|
||||
"exclude_from_note_map": "Notas com este rótulo ficarão ocultas no Mapa de Notas",
|
||||
@@ -517,7 +515,6 @@
|
||||
"print_margins": "Ao exportar para PDF, define as margens da página. Use <code>default</code>, <code>none</code>, <code>minimum</code>, ou valores personalizados como <code>topo,direita,base,esquerda</code> em milímetros.",
|
||||
"relation_type": "Relação",
|
||||
"versioning_limit": "Limita quantas revisões esta nota mantém, sobrepondo a configuração global.",
|
||||
"similar_notes_widget_disabled": "Desativa a aba de faixa Notas Semelhantes para esta nota. Somente no layout antigo.",
|
||||
"llm_chat_home": "Novos chats de IA são criados como filhos desta nota.",
|
||||
"workspace_llm_chat_home": "Novos chats de IA são criados como filhos desta nota enquanto se está içado a um ancestral deste workspace.",
|
||||
"date_pattern": "Padrão para os títulos das notas de dia geradas sob esta raiz de calendário, por exemplo <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -795,9 +792,7 @@
|
||||
"kind_and_size": "{{role}} · {{size}}"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Favorito",
|
||||
"bookmark_this_note": "Favoritar esta nota no painel da esquerda",
|
||||
"remove_bookmark": "Remover favorito"
|
||||
"bookmark": "Favorito"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Auto",
|
||||
@@ -981,15 +976,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Criar nova divisão"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Editar esta nota"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Mostrar Tabela de Conteúdo"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Mostrar Lista de Destaques"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menu",
|
||||
"options": "Opções",
|
||||
@@ -1086,9 +1072,6 @@
|
||||
"inactive": "Clique para entrar na sessão protegida",
|
||||
"active": "Sessão protegida está ativada. Clique para deixar a sessão protegida."
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Revisões da Nota"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Atualização disponível"
|
||||
},
|
||||
@@ -1100,23 +1083,10 @@
|
||||
"sql_console_saved_message": "Nota do Console SQL foi salva no caminho {{note_path}}",
|
||||
"electron_api_docs_button_title": "Abrir a documentação da API do Electron"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Esconder botões"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Exibir botões"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Exportar diagrama como SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Criar nova nota filha e adicione neste mapa de relação"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "relação",
|
||||
"backlink_one": "{{count}} Links Reverso",
|
||||
"backlink_many": "{{count}} Links Reversos",
|
||||
"backlink_other": "—{{count}} Links Reversos",
|
||||
"no_backlinks": "Nenhuma nota vincula a esta."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1145,8 +1115,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Tipo da nota",
|
||||
"editable": "Editável",
|
||||
"basic_properties": "Propriedades Básicas",
|
||||
"language": "Idioma",
|
||||
"configure_code_notes": "Configurar notas de código..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1178,37 +1146,23 @@
|
||||
"open_all_limit_exceeded": "Notas demais para abrir de uma vez ({{count}}). O máximo é {{max}}, tente estreitar os resultados primeiro."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…",
|
||||
"title": "Notas Editadas",
|
||||
"deleted": "(excluído)"
|
||||
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…"
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "ID da Nota",
|
||||
"original_file_name": "Nome original do arquivo",
|
||||
"file_type": "Tipo do arquivo",
|
||||
"file_size": "Tamanho do arquivo",
|
||||
"download": "Baixar",
|
||||
"open": "Abrir externamente",
|
||||
"upload_new_revision": "Enviar nova revisão",
|
||||
"upload_success": "Uma nova revisão de arquivo foi enviada.",
|
||||
"upload_failed": "O envio de uma nova revisão de arquivo falhou.",
|
||||
"title": "Arquivo"
|
||||
"upload_failed": "O envio de uma nova revisão de arquivo falhou."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Nome original do arquivo",
|
||||
"file_type": "Tipo do arquivo",
|
||||
"file_size": "Tamanho do arquivo",
|
||||
"download": "Baixar",
|
||||
"open": "Abrir",
|
||||
"copy_reference_to_clipboard": "Copiar referência para a área de transferência",
|
||||
"upload_new_revision": "Enviar nova revisão",
|
||||
"upload_success": "Uma nova revisão de imagem foi enviado.",
|
||||
"upload_failed": "O envio de uma nova revisão de imagem falhou: {{message}}",
|
||||
"title": "Imagem"
|
||||
"upload_failed": "O envio de uma nova revisão de imagem falhou: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Atributos Herdados",
|
||||
"no_inherited_attributes": "Nenhum atributo herdado.",
|
||||
"none": "nenhum"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1227,8 +1181,6 @@
|
||||
"show_similar_notes": "Mostrar notas semelhantes"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Expandir completamente",
|
||||
"collapse": "Recolher para tamanho normal",
|
||||
"title": "Mapa de Notas",
|
||||
"fix-nodes": "Fixar nós",
|
||||
"link-distance": "Distância do Link",
|
||||
@@ -1241,16 +1193,11 @@
|
||||
"note_paths": {
|
||||
"title": "Caminho das Notas",
|
||||
"clone_button": "Clonar nota para novo local…",
|
||||
"intro_placed": "Esta nova está localizada nos caminhos:",
|
||||
"intro_not_placed": "Esta nota ainda não está em nenhuma árvore de notas.",
|
||||
"archived": "Arquivado",
|
||||
"search": "Pesquisar",
|
||||
"outside_hoisted": "Este caminho está fora de uma nota fixada e você teria que desafixar."
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:",
|
||||
"info": "Informações"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Atributos Promovidos",
|
||||
"unset-field-placeholder": "não atribuído",
|
||||
@@ -1269,12 +1216,6 @@
|
||||
"values_placeholder": "Digite um valor e pressione Enter",
|
||||
"add_value": "Adicionar este valor"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Consulta",
|
||||
"script": "Script",
|
||||
"execute_query": "Executar Consulta",
|
||||
"execute_script": "Executar Script"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Adicionar opção de pesquisa:",
|
||||
"search_string": "pesquisa de texto",
|
||||
@@ -1544,15 +1485,9 @@
|
||||
"note_launcher": {
|
||||
"this_launcher_doesnt_define_target_note": "Este atalho não define uma nota destino."
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Copiar referência da imagem para a área de transferência, pode ser colado em uma nota de texto."
|
||||
},
|
||||
"onclick_button": {
|
||||
"no_click_handler": "Componente de botão '{{componentId}}' não possui manipulador de clique definido"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Atributos próprios"
|
||||
},
|
||||
"database_anonymization": {
|
||||
"no_anonymized_database_yet": "Nenhuma base de dados anonimizada no momento.",
|
||||
"title": "Anonimização do Banco de Dados",
|
||||
@@ -1573,9 +1508,6 @@
|
||||
"anonymized_databases_location": "Bancos de dados anonimizados são armazenados em {{- anonymizedFolder}}.",
|
||||
"download": "Baixar"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "A aba de Notas Editadas será aberta automaticamente nas notas do dia"
|
||||
},
|
||||
"ui-performance": {
|
||||
"title": "Desempenho",
|
||||
"enable-motion": "Habilitar transições e animações",
|
||||
@@ -1722,17 +1654,7 @@
|
||||
"italic": "Texto em itálico",
|
||||
"underline": "Texto sublinhado",
|
||||
"color": "Texto colorido",
|
||||
"bg_color": "Texto com cor de fundo",
|
||||
"visibility_title": "Visibilidade da Lista de Destaques",
|
||||
"visibility_description": "Você pode esconder o componente de destaques por nota adicionado a etiqueta #hideHighlightWidget.",
|
||||
"shortcut_info": "Você pode configurar um atalhe de teclado para alternar rapidamente o painel da direita (incluindo os Destaques) em Opções -> Atalhos (nome 'toggleRightPane')."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Tabela de Conteúdos",
|
||||
"description": "A tabela de conteúdos irá aparecer em notas de texto que possuam mais que um número definido de títulos. Você pode personalizar este número:",
|
||||
"unit": "títulos",
|
||||
"disable_info": "Você também pode usar essa opção para desabilitar a Tabela de Conteúdos configurando um número muito alto.",
|
||||
"shortcut_info": "Você pode configurar um atalhe de teclado para alternar rapidamente o painel da direita (incluindo a Tabela de Conteúdos) em Opções -> Atalhos (nome 'toggleRightPane')."
|
||||
"bg_color": "Texto com cor de fundo"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Tamanho para Somente Leitura Automático",
|
||||
@@ -1851,22 +1773,15 @@
|
||||
"llm-chat": "Chat com IA"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Proteger a nota",
|
||||
"toggle-off": "Desproteger a nota",
|
||||
"toggle-on-hint": "A nota não está protegida, clique para protegê-la",
|
||||
"toggle-off-hint": "A nota está protegida, clique para desprotegê-la"
|
||||
"toggle-on": "Proteger a nota"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Compartilhado",
|
||||
"toggle-on-title": "Compartilhar a nota",
|
||||
"toggle-off-title": "Parar de compartilhar a nota",
|
||||
"shared-branch": "Esta nota só existe como uma nota compartilhada, então parar de compartilhar irá excluí-la. Deseja continuar e excluir esta nota?",
|
||||
"inherited": "Não foi possível deixar de compartilhar a nota porque ela é compartilhada através da herança de uma nota superior."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Modelo",
|
||||
"toggle-on-hint": "Transformar a nota em um modelo",
|
||||
"toggle-off-hint": "Deixar de usar a nota como um modelo"
|
||||
"template": "Modelo"
|
||||
},
|
||||
"open-help-page": "Abrir página de ajuda",
|
||||
"find": {
|
||||
@@ -1878,8 +1793,6 @@
|
||||
"replace_all": "Substituir tudo"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Lista de Destaques",
|
||||
"options": "Opções",
|
||||
"title_with_count_one": "{{count}} destaque",
|
||||
"title_with_count_many": "{{count}} destaques",
|
||||
"title_with_count_other": "{{count}} destaques",
|
||||
@@ -1982,7 +1895,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Tabela de Conteúdos",
|
||||
"options": "Opções",
|
||||
"no_headings": "Nenhum título."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2060,9 +1972,6 @@
|
||||
"description": "Controla o destaque de sintaxe para blocos de código dentro de notas de texto, notas de código não serão afetadas.",
|
||||
"color-scheme": "Esquema de Cor"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formatação"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Editor"
|
||||
},
|
||||
@@ -2070,12 +1979,10 @@
|
||||
"editor_type": {
|
||||
"label": "Barra de formatação",
|
||||
"floating": {
|
||||
"title": "Flutuando",
|
||||
"description": "ferramentas de edição aparecem perto do cursor;"
|
||||
"title": "Flutuando"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Fixado",
|
||||
"description": "ferramentas de edição aparecem na aba de faixa \"Formatação\"."
|
||||
"title": "Fixado"
|
||||
},
|
||||
"multiline-toolbar": "Exibir a barra de ferramentas em múltiplas linhas se não couber",
|
||||
"toolbar_style": "Estilo da barra de ferramentas"
|
||||
@@ -2198,13 +2105,6 @@
|
||||
"title_vertical": "Mover painel de edição para baixo",
|
||||
"title_horizontal": "Mover painel de edição para a esquerda"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Desbloquear edição",
|
||||
"lock-editing": "Bloquear edição"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Exportar diagrama como PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "O diagrama não pôde ser exportado como PNG.",
|
||||
"export_to_svg": "O diagrama não pôde ser exportado para SVG."
|
||||
@@ -2302,9 +2202,6 @@
|
||||
"background_effects_message": "Em dispositivos Windows, efeitos de fundo estão estáveis agora. Os efeitos de fundo adicionam um toque de cor à interface do usuário borrando o plano de fundo atrás dela. Esta técnica também é usada em outras aplicações como o Windows Explorer.",
|
||||
"background_effects_button": "Habilitar os efeitos de fundo",
|
||||
"dismiss": "Dispensar",
|
||||
"new_layout_title": "Novo layout",
|
||||
"new_layout_message": "Introduzimos um layout modernizado para o Trilium. A faixa de opções foi removida e integrada de forma contínua à interface principal, com uma nova barra de status e seções expansíveis (como atributos promovidos) assumindo funções importantes.\n\nO novo layout vem ativado por padrão e pode ser desativado temporariamente em Opções → Aparência.",
|
||||
"new_layout_button": "Mais informações",
|
||||
"scripting_disabled_title": "Os scripts de backend foram desativados",
|
||||
"scripting_disabled_message": "Os scripts de backend agora estão desativados por padrão por segurança. Suas notas contêm scripts de backend (notas com um rótulo #run) que não serão mais executados automaticamente.\n\nSe você depende desses scripts, pode reativar os scripts de backend nas configurações de segurança.",
|
||||
"scripting_disabled_button": "Abrir configurações de segurança"
|
||||
@@ -2317,9 +2214,6 @@
|
||||
"related_code_blocks": "Esquema de cores para blocos de código em notas de texto",
|
||||
"related_code_notes": "Esquema de cores para notas de código",
|
||||
"ui": "Interface do usuário",
|
||||
"ui_old_layout": "Layout antigo",
|
||||
"ui_new_layout": "Novo Layout",
|
||||
"ui_layout_style": "Estilo de layout",
|
||||
"ui_layout_orientation": "Orientação da barra de lançamento"
|
||||
},
|
||||
"units": {
|
||||
@@ -2526,11 +2420,6 @@
|
||||
"timeout_description": "Tempo a aguardar antes de desistir de uma conexão lenta.",
|
||||
"proxy_description": "Deixe em branco para usar o proxy do sistema (apenas desktop). Use \"noproxy\" para ignorar todos os proxies."
|
||||
},
|
||||
"shared_info": {
|
||||
"help_link": "Para ajuda, visite a <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>.",
|
||||
"shared_publicly": "Esta nota é compartilhada publicamente em {{- link}}.",
|
||||
"shared_locally": "Esta nota é compartilhada localmente em {{- link}}."
|
||||
},
|
||||
"pagination": {
|
||||
"total_notes_one": "{{count}} nota",
|
||||
"total_notes_many": "",
|
||||
@@ -2544,14 +2433,10 @@
|
||||
"experimental_features": {
|
||||
"title": "Opções experimentais",
|
||||
"disclaimer": "Essas opções são experimentais e podem causar instabilidade. Use com cautela.",
|
||||
"new_layout_name": "Novo Layout",
|
||||
"new_layout_description": "Experimente o novo layout para um visual mais moderno e melhor usabilidade. Pode sofrer alterações significativas nas próximas versões.",
|
||||
"llm_name": "Chat com IA / LLM",
|
||||
"llm_description": "Ativa a barra lateral de chat de IA e as notas de chat LLM movidas por grandes modelos de linguagem."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Você está visualizando uma nota somente leitura.",
|
||||
"auto-read-only-note": "Esta nota é exibida em modo somente leitura para carregamento mais rápido.",
|
||||
"edit-note": "Editar nota"
|
||||
},
|
||||
"presentation_view": {
|
||||
|
||||
@@ -155,7 +155,6 @@
|
||||
"exclude_from_note_map": "Notițele cu această etichetă vor fi ascunse din Harta notițelor",
|
||||
"execute_button": "Titlul butonului ce va executa notița curentă de tip cod",
|
||||
"execute_description": "O descriere mai lungă a notiței curente de tip cod afișată împreună cu butonul de executare",
|
||||
"hide_highlight_widget": "Ascunde lista de evidențieri",
|
||||
"hide_promoted_attributes": "Ascunde lista atributelor promovate pentru această notiță",
|
||||
"hide_relations": "lista denumirilor relațiilor ce trebuie ascunse, delimitate prin virgulă. Toate celelalte vor fi afișate.",
|
||||
"icon_class": "valoarea acestei etichete este adăugată ca o clasă CSS la iconița notiței din ierarhia notițelor, fapt ce poate ajuta la identificarea vizuală mai rapidă a notițelor. Un exemplu ar fi „bx bx-home” pentru iconițe preluate din boxicons. Poate fi folosită în notițe de tip șablon.",
|
||||
@@ -228,7 +227,6 @@
|
||||
"template": "Șablon",
|
||||
"text": "Text",
|
||||
"title_template": "titlul implicit al notițelor create în interiorul acestei notițe. Valoarea este evaluată ca un șir de caractere JavaScript\n și poate fi astfel îmbogățită cu un conținut dinamic prin intermediul variabilelor <code>now</code> și <code>parentNote</code>. Exemple:\n \n <ul>\n <li><code>Lucrările lui ${parentNote.getLabelValue('autor')}</code></li>\n <li><code>Jurnal pentru ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n A se vedea <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki-ul pentru detalii</a>, documentația API pentru <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> și <a href=\"https://day.js.org/docs/en/display/format\">now</a> pentru mai multe informații.",
|
||||
"toc": "<code>#toc</code> sau <code>#toc=show</code> forțează afișarea tabelei de conținut, <code>#toc=hide</code> forțează ascunderea ei. Dacă eticheta nu există, se utilizează setările globale",
|
||||
"top": "păstrează notița la începutul listei (se aplică doar pentru notițe sortate automat)",
|
||||
"url": "URL",
|
||||
"value": "Valoare",
|
||||
@@ -266,7 +264,6 @@
|
||||
"show_all_in_search": "Afișează toate în căutare",
|
||||
"relation_type": "Relație",
|
||||
"versioning_limit": "Limitează numărul de revizii păstrate de această notiță, înlocuind setarea globală.",
|
||||
"similar_notes_widget_disabled": "Dezactivează fila „Notițe similare” din panglică pentru această notiță. Doar pentru aspectul vechi.",
|
||||
"llm_chat_home": "Conversațiile AI noi sunt create ca subnotițe ale acestei notițe.",
|
||||
"workspace_llm_chat_home": "Conversațiile AI noi sunt create ca subnotițe ale acestei notițe cât timp este focalizat un strămoș al acestui spațiu de lucru.",
|
||||
"date_pattern": "Tiparul titlurilor notițelor zilnice generate sub această rădăcină de calendar, de exemplu <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -465,10 +462,8 @@
|
||||
"encrypted": "Criptată"
|
||||
},
|
||||
"basic_properties": {
|
||||
"basic_properties": "Proprietăți de bază",
|
||||
"editable": "Editabil",
|
||||
"note_type": "Tipul notiței",
|
||||
"language": "Limbă",
|
||||
"configure_code_notes": "Configurează notițele de tip cod..."
|
||||
},
|
||||
"book": {
|
||||
@@ -508,9 +503,7 @@
|
||||
"open_all_limit_exceeded": "Prea multe notițe pentru a fi deschise deodată ({{count}}). Maximul este {{max}}; încercați mai întâi să restrângeți rezultatele."
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Semn de carte",
|
||||
"bookmark_this_note": "Crează un semn de carte către această notiță în panoul din stânga",
|
||||
"remove_bookmark": "Șterge semnul de carte"
|
||||
"bookmark": "Semn de carte"
|
||||
},
|
||||
"branch_prefix": {
|
||||
"branch_prefix_saved": "Prefixul ramurii a fost salvat.",
|
||||
@@ -671,9 +664,6 @@
|
||||
"find_and_fix_label": "Găsește și repară problemele de consistență",
|
||||
"find_and_fix_description": "Scanează și repară automat orice probleme de consistență a datelor din baza de date."
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Copiază o referință către imagine în clipboard, poate fi inserată într-o notiță text."
|
||||
},
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Crează o nouă diviziune"
|
||||
},
|
||||
@@ -752,9 +742,6 @@
|
||||
"all_past_note_revisions": "Toate reviziile anterioare ale notițelor găsite vor fi șterse. Notița propriu-zisă va fi intactă. În alte cuvinte, istoricul notiței va fi șters.",
|
||||
"delete_note_revisions": "Șterge toate reviziile notițelor"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Editează această notiță"
|
||||
},
|
||||
"editability_select": {
|
||||
"always_editable": "Întotdeauna editabil",
|
||||
"auto": "Automat",
|
||||
@@ -778,9 +765,7 @@
|
||||
"nothing_selected_to_cut": "Selectați mai întâi un text pentru a-l decupa într-o subnotiță."
|
||||
},
|
||||
"edited_notes": {
|
||||
"deleted": "(șters)",
|
||||
"no_edited_notes_found": "Nu sunt încă notițe editate pentru această zi...",
|
||||
"title": "Notițe editate"
|
||||
"no_edited_notes_found": "Nu sunt încă notițe editate pentru această zi..."
|
||||
},
|
||||
"empty": {
|
||||
"enter_workspace": "Intrare spațiu de lucru „{{title}}”",
|
||||
@@ -853,14 +838,9 @@
|
||||
},
|
||||
"file_properties": {
|
||||
"download": "Descarcă",
|
||||
"file_size": "Dimensiunea fișierului",
|
||||
"file_type": "Tipul fișierului",
|
||||
"note_id": "ID-ul notiței",
|
||||
"open": "Deschide în exterior",
|
||||
"original_file_name": "Denumirea originală a fișierului",
|
||||
"title": "Fișier",
|
||||
"upload_failed": "Încărcarea a unei noi revizii ale fișierului a eșuat.",
|
||||
"upload_new_revision": "Încarcă o nouă revizie",
|
||||
"upload_success": "Noua revizie a fișierului a fost încărcată cu succes."
|
||||
},
|
||||
"fonts": {
|
||||
@@ -984,20 +964,14 @@
|
||||
"title": "Ghid rapid",
|
||||
"editShortcuts": "Editează scurtăturile de la tastatură"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Ascunde butoanele"
|
||||
},
|
||||
"highlights_list": {
|
||||
"bg_color": "Text cu o culoare de fundal",
|
||||
"bold": "Text îngroșat",
|
||||
"color": "Text colorat",
|
||||
"description": "Se pot personaliza elementele ce vor fi afișate în lista de evidențieri din panoul din dreapta:",
|
||||
"italic": "Text italic (înclinat)",
|
||||
"shortcut_info": "Se poate configura o scurtatură la tastatură pentru comutarea rapidă a panoului din dreapta (inclusiv lista de evidențieri) în Opțiuni -> Scurtături (denumirea „toggleRightPane”).",
|
||||
"title": "Lista de evidențieri",
|
||||
"underline": "Text subliniat",
|
||||
"visibility_description": "Se poate ascunde lista de evidențieri la nivel de notiță prin adăugarea etichetei #hideHighlightWidget.",
|
||||
"visibility_title": "Vizibilitatea listei de evidențieri"
|
||||
"underline": "Text subliniat"
|
||||
},
|
||||
"i18n": {
|
||||
"first-day-of-the-week": "Prima zi a săptămânii",
|
||||
@@ -1024,12 +998,6 @@
|
||||
},
|
||||
"image_properties": {
|
||||
"copy_reference_to_clipboard": "Copiază referință în clipboard",
|
||||
"download": "Descarcă",
|
||||
"file_size": "Dimensiune fișier",
|
||||
"file_type": "Tip fișier",
|
||||
"open": "Deschide",
|
||||
"original_file_name": "Denumirea originală a fișierului",
|
||||
"title": "Imagine",
|
||||
"upload_failed": "Încărcarea a unei noi revizii ale imaginii a eșuat: {{message}}",
|
||||
"upload_new_revision": "Încarcă o nouă revizie",
|
||||
"upload_success": "O nouă revizie a fost încărcată cu succes."
|
||||
@@ -1118,7 +1086,6 @@
|
||||
"copy_to_clipboard": "Copiază în clipboard"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"no_inherited_attributes": "Niciun atribut moștenit.",
|
||||
"title": "Atribute moștenite",
|
||||
"none": "niciunul"
|
||||
},
|
||||
@@ -1257,8 +1224,6 @@
|
||||
"this_launcher_doesnt_define_target_note": "Acesată scurtătură nu definește o notiță-destinație."
|
||||
},
|
||||
"note_map": {
|
||||
"collapse": "Micșorează la dimensiunea normală",
|
||||
"open_full": "Expandează la maximum",
|
||||
"title": "Harta notițelor",
|
||||
"fix-nodes": "Fixează nodurile",
|
||||
"link-distance": "Distanța dintre legături",
|
||||
@@ -1272,15 +1237,10 @@
|
||||
"archived": "Arhivat",
|
||||
"clone_button": "Clonează notița într-o nouă locație...",
|
||||
"intro_not_placed": "Notița n-a fost plasată încă în arborele de notițe.",
|
||||
"intro_placed": "Notița este plasată în următoarele căi:",
|
||||
"outside_hoisted": "Această cale se află în afara notiței focalizate și este necesară defocalizarea.",
|
||||
"search": "Caută",
|
||||
"title": "Căile notiței"
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "Informații",
|
||||
"this_note_was_originally_taken_from": "Această notiță a fost preluată original de la:"
|
||||
},
|
||||
"note_type_chooser": {
|
||||
"modal_body": "Selectați tipul notiței/șablonul pentru noua notiță:",
|
||||
"modal_title": "Selectați tipul notiței",
|
||||
@@ -1314,9 +1274,6 @@
|
||||
"target_relation_count": "Numărul de relații către notiță",
|
||||
"title": "Titlu"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Atribute proprii"
|
||||
},
|
||||
"password": {
|
||||
"alert_message": "Aveți grijă să nu uitați parola. Parola este utilizată pentru a accesa interfața web și pentru a cripta notițele protejate. Dacă uitați parola, toate notițele protejate se vor pierde pentru totdeauna.",
|
||||
"change_password": "Schimbă parola",
|
||||
@@ -1459,24 +1416,12 @@
|
||||
"rename_relation_from": "Redenumește relația din",
|
||||
"to": "În"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Revizii ale notiței"
|
||||
},
|
||||
"revisions_snapshot_interval": {
|
||||
"note_revisions_snapshot_description": "Intervalul de salvare a reviziilor este timpul după care se crează o nouă revizie a unei notițe. Vedeți <doc>wiki-ul</doc> pentru mai multe informații.",
|
||||
"note_revisions_snapshot_interval_title": "Intervalul de salvare a reviziilor",
|
||||
"snapshot_time_interval_label": "Intervalul de salvare a reviziilor:",
|
||||
"note_revisions_snapshot_description_short": "Timpul după care va fi creată o nouă revizie a notiței."
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Tab-ul panglicii „Notițe editate” se va deschide automat pentru notițele zilnice"
|
||||
},
|
||||
"script_executor": {
|
||||
"execute_query": "Execută interogarea",
|
||||
"execute_script": "Execută scriptul",
|
||||
"query": "Interogare",
|
||||
"script": "Script"
|
||||
},
|
||||
"search_definition": {
|
||||
"action": "acțiune",
|
||||
"actions_executed": "Acțiunile au fost executate.",
|
||||
@@ -1640,13 +1585,6 @@
|
||||
"timeout_description": "Timpul de așteptare înainte de a renunța la o conexiune lentă.",
|
||||
"proxy_description": "Lăsați gol pentru a folosi proxy-ul sistemului (doar desktop). Folosiți „noproxy” pentru a ocoli toate proxy-urile."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"description": "Cuprinsul va apărea în notițele de tip text atunci când notița are un număr de titluri mai mare decât cel definit. Acest număr se poate personaliza:",
|
||||
"unit": "titluri",
|
||||
"disable_info": "De asemenea se poate dezactiva cuprinsul setând o valoare foarte mare.",
|
||||
"shortcut_info": "Se poate configura și o scurtatură pentru a comuta rapid vizibilitatea panoului din dreapta (inclusiv cuprinsul) în Opțiuni -> Scurtături (denumirea „toggleRightPane”).",
|
||||
"title": "Cuprins"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"description": "Marchează pragul în care o notiță de o anumită dimensiune va fi afișată în mod de citire (pentru motive de performanță).",
|
||||
"label": "Pragul de dimensiune pentru setarea modului de citire automat (la notițe text)",
|
||||
@@ -1773,15 +1711,8 @@
|
||||
"title": "Factorul de zoom (doar pentru versiunea desktop)"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_one": "{{count}} legătură de retur",
|
||||
"backlink_few": "{{count}} legături de retur",
|
||||
"backlink_other": "{{count}} de legături de retur",
|
||||
"relation": "relație",
|
||||
"no_backlinks": "Nicio notiță nu are legături către aceasta."
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Exportă diagrama ca SVG"
|
||||
},
|
||||
"note-map": {
|
||||
"button-link-map": "Harta legăturilor",
|
||||
"button-tree-map": "Harta ierarhiei"
|
||||
@@ -1825,11 +1756,6 @@
|
||||
"hide-subtree": "Ascunde subnotițele",
|
||||
"show-subtree": "Afișează subnotițele"
|
||||
},
|
||||
"shared_info": {
|
||||
"help_link": "Pentru informații vizitați <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki-ul</a>.",
|
||||
"shared_locally": "Această notiță este partajată local la {{- link}}.",
|
||||
"shared_publicly": "Această notiță este partajată public la {{- link}}."
|
||||
},
|
||||
"note_types": {
|
||||
"book": "Colecție",
|
||||
"canvas": "Schiță",
|
||||
@@ -1858,22 +1784,15 @@
|
||||
"spreadsheet": "Foaie de calcul"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-off": "Deprotejează notița",
|
||||
"toggle-off-hint": "Notița este protejată, click pentru a o deproteja",
|
||||
"toggle-on": "Protejează notița",
|
||||
"toggle-on-hint": "Notița nu este protejată, clic pentru a o proteja"
|
||||
"toggle-on": "Protejează notița"
|
||||
},
|
||||
"shared_switch": {
|
||||
"inherited": "Nu se poate înlătura partajarea deoarece notița este partajată prin moștenirea de la o notiță părinte.",
|
||||
"shared": "Partajată",
|
||||
"shared-branch": "Această notiță există doar ca o notiță partajată, anularea partajării ar cauza ștergerea ei. Sigur doriți ștergerea notiței?",
|
||||
"toggle-off-title": "Anulează partajarea notițeii",
|
||||
"toggle-on-title": "Partajează notița"
|
||||
"shared-branch": "Această notiță există doar ca o notiță partajată, anularea partajării ar cauza ștergerea ei. Sigur doriți ștergerea notiței?"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Șablon",
|
||||
"toggle-off-hint": "Înlătură notița ca șablon",
|
||||
"toggle-on-hint": "Marchează notița drept șablon"
|
||||
"template": "Șablon"
|
||||
},
|
||||
"open-help-page": "Deschide pagina de informații",
|
||||
"find": {
|
||||
@@ -1885,8 +1804,6 @@
|
||||
"find_placeholder": "Căutați în text..."
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"options": "Setări",
|
||||
"title": "Listă de evidențieri",
|
||||
"title_with_count_one": "{{count}} evidențiere",
|
||||
"title_with_count_few": "{{count}} evidențieri",
|
||||
"title_with_count_other": "{{count}} de evidențieri",
|
||||
@@ -1907,12 +1824,6 @@
|
||||
"icon_tooltip": "{{name}}\nPachet iconițe: {{iconPack}}",
|
||||
"no_results": "Nu s-a găsit nicio iconiță."
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Afișează lista de evidențieri"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Afișează cuprinsul"
|
||||
},
|
||||
"sync_status": {
|
||||
"connected_no_changes": "<p>Conectat la server-ul de sincronizare.<br>Toate modificările au fost deja sincronizate.</p><p>Clic pentru a forța o sincronizare.</p>",
|
||||
"connected_with_changes": "<p>Conectat la server-ul de sincronizare. <br>Există modificări nesincronizate.</p><p>Clic pentru a rula o sincronizare.</p>",
|
||||
@@ -2003,9 +1914,6 @@
|
||||
"search_not_executed": "Căutarea n-a fost rulată încă. Clic pe butonul „Căutare” de deasupra pentru a vedea rezultatele.",
|
||||
"search_now": "Caută acum"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Afișează butoanele"
|
||||
},
|
||||
"sql_result": {
|
||||
"no_rows": "Nu s-a găsit niciun rând pentru această interogare",
|
||||
"not_executed": "Această interogare nu a fost executată încă.",
|
||||
@@ -2035,7 +1943,6 @@
|
||||
"pinned_prefix": "Fixat: "
|
||||
},
|
||||
"toc": {
|
||||
"options": "Setări",
|
||||
"table_of_contents": "Cuprins",
|
||||
"no_headings": "Niciun titlu."
|
||||
},
|
||||
@@ -2121,19 +2028,14 @@
|
||||
"tab_width": "Lățimea tab-ului",
|
||||
"tab_width_unit": "spații"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formatare"
|
||||
},
|
||||
"editing": {
|
||||
"editor_type": {
|
||||
"label": "Bară de formatare",
|
||||
"floating": {
|
||||
"title": "Editor cu bară flotantă",
|
||||
"description": "uneltele de editare vor apărea lângă cursor;"
|
||||
"title": "Editor cu bară flotantă"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Editor cu bară fixă",
|
||||
"description": "uneltele de editare vor apărea în tab-ul „Formatare” din panglică."
|
||||
"title": "Editor cu bară fixă"
|
||||
},
|
||||
"multiline-toolbar": "Afișează bara de unelte pe mai multe rânduri dacă nu încape.",
|
||||
"toolbar_style": "Stilul barei de instrumente"
|
||||
@@ -2263,17 +2165,10 @@
|
||||
"help-on-languages": "Informații despre limba conținutului...",
|
||||
"not_set_with_default": "Nicio limbă stabilită — {{- language}}"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Exportă diagrama ca PNG"
|
||||
},
|
||||
"switch_layout_button": {
|
||||
"title_horizontal": "Mută panoul de editare la stânga",
|
||||
"title_vertical": "Mută panoul de editare în jos"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"lock-editing": "Blochează editarea",
|
||||
"unlock-editing": "Deblochează editarea"
|
||||
},
|
||||
"custom_date_time_format": {
|
||||
"title": "Format dată/timp personalizat",
|
||||
"description": "Personalizați formatul de dată și timp inserat prin <shortcut /> sau din bara de unelte. Vedeți <doc>Documentația Day.js</doc> pentru câmpurile de formatare disponibile.",
|
||||
@@ -2495,9 +2390,6 @@
|
||||
"next_theme_message": "Utilizați tema clasică, doriți să încercați noua temă?",
|
||||
"next_theme_button": "Testează noua temă",
|
||||
"dismiss": "Treci peste",
|
||||
"new_layout_title": "Aspect nou",
|
||||
"new_layout_message": "Am introdus un aspect modernizat pentru Trilium. Panglică a fost integrată în restul interfeței, cu o bară de stare nouă și secțiuni expandabile (precum atributele promovate) ce preiau funcționalitatea de bază.\n\nNoul aspect este activat în mod implicit, și se poate dezactiva momentan din Opțiuni → Aspect.",
|
||||
"new_layout_button": "Mai multe informații",
|
||||
"scripting_disabled_title": "Scripturile backend au fost dezactivate",
|
||||
"scripting_disabled_message": "Scripturile backend sunt acum dezactivate implicit din motive de securitate. Notițele dvs. conțin scripturi backend (notițe cu o etichetă #run) care nu se vor mai executa automat.\n\nDacă vă bazați pe aceste scripturi, le puteți reactiva în setările de securitate.",
|
||||
"scripting_disabled_button": "Deschide setările de securitate"
|
||||
@@ -2520,9 +2412,6 @@
|
||||
"related_code_blocks": "Tema de culori pentru blocuri de cod în notițe de tip text",
|
||||
"related_code_notes": "Tema de culori pentru notițele de tip cod",
|
||||
"ui": "Interfață grafică",
|
||||
"ui_old_layout": "Aspect vechi",
|
||||
"ui_new_layout": "Aspect nou",
|
||||
"ui_layout_style": "Stilul aranjamentului",
|
||||
"ui_layout_orientation": "Orientarea barei de lansare"
|
||||
},
|
||||
"units": {
|
||||
@@ -2544,8 +2433,6 @@
|
||||
"slide-overview": "Afișați o imagine de ansamblu a slide-urilor"
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Vizualizați o notiță în modul doar în citire.",
|
||||
"auto-read-only-note": "Această notiță este afișată în modul doar în citire din motive de performanță.",
|
||||
"edit-note": "Editează notița"
|
||||
},
|
||||
"calendar_view": {
|
||||
@@ -2578,8 +2465,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Opțiuni experimentale",
|
||||
"disclaimer": "Aceste opțiuni sunt experimentale și pot cauza instabilitate. Folosiți cu prudență.",
|
||||
"new_layout_name": "Aspect nou",
|
||||
"new_layout_description": "Încercați noul aspect pentru un design mai modern și mai ușor de utilizat. Poate surveni modificări semnificative în următoarele release-uri.",
|
||||
"llm_name": "Chat AI / LLM",
|
||||
"llm_description": "Activează bara laterală de chat AI și notițele de chat LLM bazate pe modele lingvistice mari."
|
||||
},
|
||||
|
||||
@@ -564,7 +564,6 @@
|
||||
"workspace_template": "Эта заметка появится в списке доступных шаблонов при создании новой заметки, но только если будет установлен фокус на рабочую область с этим шаблоном.",
|
||||
"workspace_search_home": "Новые заметки поиска будут созданы как дочерние записи этой заметки, когда установлен фокус на какую-либо родительскую заметку этого рабочего пространства.",
|
||||
"workspace_calendar_root": "Определяет корень календаря для каждого рабочего пространства.",
|
||||
"hide_highlight_widget": "Скрывает список акцентов для этой заметки, оставляя его видимым на всех остальных.",
|
||||
"is_owned_by_note": "принадлежит заметке",
|
||||
"app_theme": "Отмечает заметки CSS, которые являются полноценными темами Trilium и, таким образом, доступны в опциях Trilium.",
|
||||
"title_template": "Название по умолчанию для заметок, создаваемых как дочерние элементы текущей. Значение вычисляется как строка JavaScript \n и может быть дополнено динамическим контентом с помощью внедренных переменных <code>now</code> и <code>parentNote</code>. Например:\n \n <ul>\n <li><code>Литературные произведения ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Лог для ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">вики</a>, документации API для <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> и <a href=\"https://day.js.org/docs/en/display/format\">now</a>.",
|
||||
@@ -602,7 +601,6 @@
|
||||
"share_disallow_robot_indexing": "Запретит индексацию этой заметки роботами через заголовок <code>X-Robots-Tag: noindex</code>.",
|
||||
"share_credentials": "Требовать учётные данные для доступа к этой общедоступной заметке. Значение должно быть в формате 'имя пользователя:пароль'. Не забудьте сделать этот атрибут наследуемым для применения к дочерним заметкам/изображениям.",
|
||||
"share_index": "Заметка с этой меткой будет содержать список всех корневых узлов общедоступных заметок.",
|
||||
"toc": "<code>#toc</code> или <code>#toc=show</code> принудительно отобразят оглавление, <code>#toc=hide</code> — скроют его. Если метка отсутствует, применяется глобальная настройка.",
|
||||
"color": "Определяет цвет заметки в дереве заметок, ссылках и т. д. Используйте любое допустимое значение цвета CSS, например «red» или #a13d5f.",
|
||||
"keep_current_hoisting": "Открытие этой ссылки не изменит фокус, даже если заметка не отображается в текущем сфокусированном поддереве.",
|
||||
"execute_description": "Более подробное описание текущей заметки типа \"Код\", отображаемое вместе с кнопкой \"Выполнить\".",
|
||||
@@ -664,7 +662,6 @@
|
||||
"end_time": "Время окончания мероприятия, связанно с <code>#endDate</code>, если она есть, иначе с <code>#startDate</code>.",
|
||||
"recurrence": "Строка CalDAV <code>RRULE</code>, обеспечивающая повторение мероприятия. Начало отсчитывается от <code>#startDate</code> и <code>#startTime</code>, поэтому правило не учитывает <code>DTSTART</code>.",
|
||||
"versioning_limit": "Ограничивает количество сохраняемых версий этой заметки, переопределяя глобальную настройку.",
|
||||
"similar_notes_widget_disabled": "Отключает вкладку \"Похожие заметки\" на для этой заметки. Только для старого варианта оформления.",
|
||||
"llm_chat_home": "Новые чаты с ИИ создаются как дочерние элементы этой заметки.",
|
||||
"workspace_llm_chat_home": "Новые чаты с ИИ создаются как дочерние элементы этой заметки и перемещаются к родителю этого рабочего пространства.",
|
||||
"date_pattern": "Шаблон для наименования заметок дня, создаваемых в календаре, например: <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -1033,13 +1030,6 @@
|
||||
"export_to_svg": "Не удалось экспортировать диаграмму в SVG.",
|
||||
"preview": "Предпросмотр диаграммы"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Экспортировать диаграмму как PNG"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Разблокировать редактирование",
|
||||
"lock-editing": "Заблокировать редактирование"
|
||||
},
|
||||
"switch_layout_button": {
|
||||
"title_horizontal": "Переместить панель редактирования влево",
|
||||
"title_vertical": "Переместить панель редактирования вниз"
|
||||
@@ -1206,12 +1196,10 @@
|
||||
"editing": {
|
||||
"editor_type": {
|
||||
"fixed": {
|
||||
"title": "Закрепленная",
|
||||
"description": "инструменты редактирования отображаются на вкладке ленты «Форматирование»."
|
||||
"title": "Закрепленная"
|
||||
},
|
||||
"floating": {
|
||||
"title": "Плавающая",
|
||||
"description": "инструменты редактирования появляются рядом с курсором;"
|
||||
"title": "Плавающая"
|
||||
},
|
||||
"label": "Панель форматирования",
|
||||
"multiline-toolbar": "Отображать панель инструментов на нескольких строках, если она не помещается",
|
||||
@@ -1221,9 +1209,6 @@
|
||||
"editor": {
|
||||
"title": "Редактор"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Форматирование"
|
||||
},
|
||||
"code_block": {
|
||||
"copy_title": "Копировать в буфер обмена",
|
||||
"theme_group_dark": "Темные темы",
|
||||
@@ -1253,7 +1238,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Оглавление",
|
||||
"options": "Параметры",
|
||||
"no_headings": "Заголовки не найдены."
|
||||
},
|
||||
"note_tree": {
|
||||
@@ -1306,9 +1290,7 @@
|
||||
"match_words": "По словам"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Шаблон",
|
||||
"toggle-off-hint": "Удалить заметку как шаблон",
|
||||
"toggle-on-hint": "Сделать заметку шаблоном"
|
||||
"template": "Шаблон"
|
||||
},
|
||||
"note_types": {
|
||||
"new-feature": "Новое",
|
||||
@@ -1572,10 +1554,6 @@
|
||||
"show_space_usage": "Показать использование места"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "отношение",
|
||||
"backlink_one": "{{count}} обратная ссылка",
|
||||
"backlink_few": "{{count}} обратные ссылки",
|
||||
"backlink_many": "{{count}} обратных ссылок",
|
||||
"no_backlinks": "Нет заметок с ссылкой на эту."
|
||||
},
|
||||
"note_icon": {
|
||||
@@ -1595,9 +1573,7 @@
|
||||
},
|
||||
"basic_properties": {
|
||||
"editable": "Режим редактирования",
|
||||
"language": "Язык",
|
||||
"note_type": "Тип заметки",
|
||||
"basic_properties": "Общее",
|
||||
"configure_code_notes": "Настроить заметки типа \"Код\"..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1629,33 +1605,20 @@
|
||||
"dashboard": "Панель"
|
||||
},
|
||||
"edited_notes": {
|
||||
"deleted": "(удалено)",
|
||||
"title": "Измененные заметки",
|
||||
"no_edited_notes_found": "Пока нет измененных заметок за этот день..."
|
||||
},
|
||||
"file_properties": {
|
||||
"download": "Скачать",
|
||||
"open": "Открыть во внешнем",
|
||||
"title": "Файл",
|
||||
"upload_success": "Новая версия файла успешно загружена.",
|
||||
"upload_new_revision": "Загрузить новую версию",
|
||||
"file_size": "Размер файла",
|
||||
"file_type": "Тип файла",
|
||||
"original_file_name": "Исходное имя файла",
|
||||
"note_id": "ID заметки",
|
||||
"upload_failed": "Загрузка новой версии файла не удалась."
|
||||
},
|
||||
"image_properties": {
|
||||
"download": "Скачать",
|
||||
"open": "Открыть",
|
||||
"title": "Изображение",
|
||||
"file_size": "Размер файла",
|
||||
"file_type": "Тип файла",
|
||||
"upload_failed": "Не удалось загрузить новую версию изображения: {{message}}",
|
||||
"upload_success": "Загружена новая версия изображения.",
|
||||
"upload_new_revision": "Загрузить новую версию",
|
||||
"copy_reference_to_clipboard": "Копировать ссылку в буфер обмена",
|
||||
"original_file_name": "Исходное имя файла"
|
||||
"copy_reference_to_clipboard": "Копировать ссылку в буфер обмена"
|
||||
},
|
||||
"note_info_widget": {
|
||||
"created": "Создано",
|
||||
@@ -1676,15 +1639,10 @@
|
||||
"search": "Поиск",
|
||||
"title": "Пути к заметке",
|
||||
"clone_button": "Клонировать заметку в новое место...",
|
||||
"intro_placed": "Эта заметка размещена по следующим путям:",
|
||||
"intro_not_placed": "Эта заметка еще не помещена в дерево заметок.",
|
||||
"outside_hoisted": "Этот путь находится за пределами сфокусированной заметки, и вам придется снять фокус.",
|
||||
"archived": "Архивировано"
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "Информация",
|
||||
"this_note_was_originally_taken_from": "Эта заметка была первоначально взята из:"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"url_placeholder": "http://website...",
|
||||
"unset-field-placeholder": "не установлено",
|
||||
@@ -1713,12 +1671,6 @@
|
||||
"conflicting_tooltip": "Элементы определяют этот атрибут несколькими способами, поэтому он сортируется как текст и не может быть задан через меню элемента.",
|
||||
"conflicting": "Несколько определений"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Запрос",
|
||||
"execute_query": "Выполнить запрос",
|
||||
"execute_script": "Выполнить скрипт",
|
||||
"script": "Скрипт"
|
||||
},
|
||||
"search_definition": {
|
||||
"limit": "ограничение",
|
||||
"search_string": "строка поиска",
|
||||
@@ -1923,13 +1875,6 @@
|
||||
"title": "Стиль заголовка",
|
||||
"description": "Визуальный стиль заголовков в текстовых заметках."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"unit": "заголовков",
|
||||
"description": "Оглавление будет отображаться в текстовых заметках, если в заметке больше заголовков, чем указано в таблице. Вы можете настроить это количество:",
|
||||
"title": "Оглавление",
|
||||
"disable_info": "Эту опцию также можно использовать для отключения оглавления, установив очень большое число.",
|
||||
"shortcut_info": "Вы можете настроить сочетание клавиш для быстрого переключения правой панели (включая оглавление) в «Настройки → Сочетания клавиш» (название — 'toggleRightPane')."
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"unit": "символов",
|
||||
"title": "Максимальный размер заметки до переключения в режим только для чтения",
|
||||
@@ -2169,9 +2114,7 @@
|
||||
"close": "Закрыть"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "В закладки",
|
||||
"remove_bookmark": "Удалить закладку",
|
||||
"bookmark_this_note": "Добавить эту заметку в закладки на левой боковой панели"
|
||||
"bookmark": "В закладки"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Авто",
|
||||
@@ -2183,14 +2126,10 @@
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Общий доступ",
|
||||
"toggle-on-title": "Сделать заметку общедоступной",
|
||||
"toggle-off-title": "Отменить общий доступ к заметке",
|
||||
"shared-branch": "Эта заметка существует только как общая, и если отменить общий доступ, она будет удалена. Хотите продолжить и удалить эту заметку?",
|
||||
"inherited": "Заметка не может быть убрана из общего доступа в данном случае, поскольку общий доступ передан по наследству от предка."
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"options": "Параметры",
|
||||
"title": "Акценты",
|
||||
"menu_configure": "Настроить акценты...",
|
||||
"no_highlights": "Акценты в тексте не найдены.",
|
||||
"title_with_count_one": "{{count}} акцент",
|
||||
@@ -2296,9 +2235,6 @@
|
||||
"convert_to_text_successful": "Заметка конвертирована в текстовую заметку.",
|
||||
"note_attributes": "Атрибуты заметки"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Версии заметки"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Доступно обновление"
|
||||
},
|
||||
@@ -2310,12 +2246,6 @@
|
||||
"trilium_api_docs_button_title": "Документация по Open Trilium API",
|
||||
"electron_api_docs_button_title": "Открыть документацию по API Electron"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Скрыть кнопки"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Показать кнопки"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Создать дочернюю заметку и добавить её в карту",
|
||||
"create_child_note_text": "Добавить заметку"
|
||||
@@ -2328,24 +2258,18 @@
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Унаследованные атрибуты",
|
||||
"no_inherited_attributes": "Нет унаследованных атрибутов.",
|
||||
"none": "нет"
|
||||
},
|
||||
"note_map": {
|
||||
"title": "Карта заметок",
|
||||
"fix-nodes": "Закрепить узлы",
|
||||
"collapse": "Свернуть к нормальному размеру",
|
||||
"link-distance": "Расстояние связи",
|
||||
"open_full": "Развернуть полностью",
|
||||
"too-many-notes_one": "Здесь {{count}} заметка. Отображение всех может замедлить работу.",
|
||||
"too-many-notes_few": "Здесь {{count}} заметки. Отображение всех может замедлить работу.",
|
||||
"too-many-notes_many": "Здесь {{count}} заметок. Отображение всех может замедлить работу.",
|
||||
"show-anyway": "Показать карту",
|
||||
"expand": "Развернуть карту"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Атрибуты"
|
||||
},
|
||||
"similar_notes": {
|
||||
"title": "Похожие заметки",
|
||||
"no_similar_notes_found": "Похожие заметки не найдены."
|
||||
@@ -2426,10 +2350,7 @@
|
||||
"underline": "Подчеркнутый текст",
|
||||
"color": "Цветной текст",
|
||||
"description": "Вы можете настроить список акцентов, отображаемый на правой панели:",
|
||||
"bg_color": "Текст с заливкой фона",
|
||||
"visibility_title": "Видимость списка акцентов",
|
||||
"visibility_description": "Вы можете скрыть виджет списка акцентов, добавив атрибут #hideHighlightWidget к заметке.",
|
||||
"shortcut_info": "Вы можете настроить сочетание клавиш для быстрого переключения правой панели (включая список акцентов) в «Настройки → Сочетания клавиш» (название — 'toggleRightPane')."
|
||||
"bg_color": "Текст с заливкой фона"
|
||||
},
|
||||
"custom_date_time_format": {
|
||||
"format_string": "Строка форматирования",
|
||||
@@ -2474,12 +2395,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Разделить окно"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Редактировать заметку"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Показать список акцентов"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Покинуть режим \"дзен\""
|
||||
},
|
||||
@@ -2498,12 +2413,6 @@
|
||||
"content_language_switcher": "Язык содержимого: {{language}}",
|
||||
"backlinks": "Обратные ссылки"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Экспортировать диаграмму как SVG"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Скопировать ссылку на изображение в буфер обмена, может быть вставлена в текстовую заметку."
|
||||
},
|
||||
"note_launcher": {
|
||||
"this_launcher_doesnt_define_target_note": "У этого средство запуска не настроена целевая заметка, поэтому открывать нечего. Установите отношение \"target\", указывающую на заметку."
|
||||
},
|
||||
@@ -2523,10 +2432,7 @@
|
||||
"unknown": "<p>Состояние синхронизации станет известно после начала следующей попытки синхронизации.</p><p>Нажмите, чтобы запустить синхронизацию сейчас.</p>"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Защитить заметку",
|
||||
"toggle-off": "Снять защиту с заметки",
|
||||
"toggle-off-hint": "Заметка защищена. Щелкните, чтобы снять защиту",
|
||||
"toggle-on-hint": "Заметка не защищена. Щелкните, чтобы установить защиту"
|
||||
"toggle-on": "Защитить заметку"
|
||||
},
|
||||
"note-map": {
|
||||
"button-link-map": "Карта связей",
|
||||
@@ -2557,9 +2463,6 @@
|
||||
"background_effects_message": "На устройствах с ОС Windows или macOS, фоновые эффекты теперь полностью стабильны. Они добавляют цвета в пользовательский интерфейс, размывая фон за ним.",
|
||||
"background_effects_title": "Фоновые эффекты теперь стабильны",
|
||||
"next_theme_title": "Попробуйте новую тему Trilium",
|
||||
"new_layout_button": "Подробнее",
|
||||
"new_layout_message": "Мы обновили интерфейс Trilium. Старая лента инструментов была удалена и органично интегрирована в основной интерфейс, а ключевые функции теперь выполняет новая строка состояния и разворачиваемые разделы.\n\nНовый интерфейс включен по умолчанию и может быть временно отключен через «Настройки → Оформление».",
|
||||
"new_layout_title": "Новый дизайн",
|
||||
"scripting_disabled_message": "В целях безопасности серверные скрипты по умолчанию отключены. В ваших заметках есть серверные скрипты (заметки с тегом #run), которые больше не будут выполняться автоматически.\n\nЕсли вы полагаетесь на эти скрипты, вы можете снова включить серверные скрипты в настройках безопасности.",
|
||||
"scripting_disabled_button": "Открыть настройки безопасности",
|
||||
"scripting_disabled_title": "Серверные скрипты были отключены"
|
||||
@@ -2568,9 +2471,6 @@
|
||||
"description": "Масштабированием также можно управлять с помощью сочетаний клавиш CTRL+- и CTRL+=.",
|
||||
"title": "Коэффициент масштабирования (только для настольной версии)"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Показать оглавление"
|
||||
},
|
||||
"code_mime_types": {
|
||||
"title": "Доступные типы в выпадающем списке",
|
||||
"tooltip_syntax_highlighting": "Подсветка синтаксиса",
|
||||
@@ -2662,9 +2562,6 @@
|
||||
"attachment_deleted": "Это вложение было удалено.",
|
||||
"you_can_also_open": ", вы также можете открыть "
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Вкладка ленты «Измененные заметки» будет автоматически открываться в заметках дня"
|
||||
},
|
||||
"options_widget": {
|
||||
"options_status": "Статус опций",
|
||||
"options_change_saved": "Изменения параметров сохранены."
|
||||
@@ -2733,13 +2630,6 @@
|
||||
"wrap_lines_in_code_notes": "Переносить строки в заметках типа \"Код\"",
|
||||
"enable_line_wrap": "Включить перенос строк (для вступления изменений в силу может потребоваться перезагрузка интерфейса)"
|
||||
},
|
||||
"shared_info": {
|
||||
"help_link": "Для получения справки посетите <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">вики</a>.",
|
||||
"shared_locally": "Заметка общедоступна локально в {{- link}}.",
|
||||
"shared_publicly": "Заметка общедоступна публично в {{- link}}.",
|
||||
"shared_preview": "Эта заметка опубликована по адресу {{- link}}, но открыть эту страницу может только этот браузер и только при условии, что в нём открыт Trilium. Для публикации этой заметки для других пользователей необходим сервер Trilium.",
|
||||
"shared_export_only": "Эта заметка общедоступна, но мобильное приложение не может открывать общедоступные страницы. Чтобы опубликовать её, экспортируйте поддерево в формате \"{{format}}\" и разместите файлы на любом веб-сервере или используйте сервере Trilium."
|
||||
},
|
||||
"note_create": {
|
||||
"duplicated": "Создан дубль заметки \"{{title}}\"."
|
||||
},
|
||||
@@ -2756,10 +2646,7 @@
|
||||
"settings_appearance": {
|
||||
"related_code_blocks": "Цветовая схема для блоков кода в текстовых заметках",
|
||||
"related_code_notes": "Цветовая схема для заметок типа \"Код\"",
|
||||
"ui_new_layout": "Новый дизайн",
|
||||
"ui_old_layout": "Старый дизайн",
|
||||
"ui": "Пользовательский интерфейс",
|
||||
"ui_layout_style": "Стиль макета",
|
||||
"ui_layout_orientation": "Ориентация панели запуска"
|
||||
},
|
||||
"sql_result": {
|
||||
@@ -2958,13 +2845,9 @@
|
||||
"slide-overview": "Переключить общий просмотр слайдов"
|
||||
},
|
||||
"read-only-info": {
|
||||
"edit-note": "Изменить заметку",
|
||||
"auto-read-only-note": "Заметка отображена в режиме \"только для чтения\" для быстрой загрузки.",
|
||||
"read-only-note": "Заметка отображается в режиме \"только для чтения\"."
|
||||
"edit-note": "Изменить заметку"
|
||||
},
|
||||
"experimental_features": {
|
||||
"new_layout_description": "Попробуйте новый современный и удобный дизайн. В будущих обновлениях возможны его существенные изменения.",
|
||||
"new_layout_name": "Новый дизайн",
|
||||
"title": "Экспериментальные параметры",
|
||||
"disclaimer": "Эти параметры экспериментальные и могут повлиять на стабильность. Используйте с осторожностью.",
|
||||
"llm_name": "ИИ / LLM чат",
|
||||
|
||||
@@ -331,7 +331,6 @@
|
||||
"hide_relations": "imena relacija razdvojenih zarezima koja treba da budu skrivena. Sva ostala će biti prikazana.",
|
||||
"title_template": "podrazumevani naslov beleški kreiranih kao deca ove beleške. Vrednost se procenjuje kao JavaScript string \n i stoga se može obogatiti dinamičkim sadržajem putem ubrizganih promenljivih <code>now</code> and <code>parentNote</code>. Primeri:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Pogledati <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki sa detaljima</a>, API dokumentacija za <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> i <a href=\"https://day.js.org/docs/en/display/format\">now</a> za detalje.",
|
||||
"template": "Ova beleška će biti prikazana u izboru dostupnih šablona prilikom pravljenja nove beleške",
|
||||
"toc": "<code>#toc</code> ili <code>#toc=show</code> će pristiliti Sadržaj (Table of Contents) da bude prikazan, <code>#toc=hide</code> prisiliti njegovo sakrivanje. Ako oznaka ne postoji, ponašanje će biti usklađeno sa globalnim podešavanjem",
|
||||
"color": "definiše boju beleške u stablu beleški, linkovima itd. Koristite bilo koju važeću CSS vrednost boje kao što je „crvena“ ili #a13d5f",
|
||||
"keyboard_shortcut": "Definiše prečicu na tastaturi koja će odmah preći na ovu belešku. Primer: „ctrl+alt+e“. Potrebno je ponovno učitavanje frontenda da bi promena stupila na snagu.",
|
||||
"keep_current_hoisting": "Otvaranje ove veze neće promeniti podizanje čak i ako beleška nije prikazana u trenutno podignutom podstablu.",
|
||||
@@ -339,7 +338,6 @@
|
||||
"execute_description": "Duži opis trenutne beleške sa kodom prikazan je zajedno sa dugmetom za izvršavanje",
|
||||
"exclude_from_note_map": "Beleške sa ovom oznakom biće skrivene sa mape beleški",
|
||||
"new_notes_on_top": "Nove beleške će biti napravljene na vrhu matične beleške, a ne na dnu.",
|
||||
"hide_highlight_widget": "Sakrij vidžet sa listom istaknutih",
|
||||
"run_on_note_creation": "izvršava se kada se beleška napravi na serverskoj strani. Koristite ovu relaciju ako želite da pokrenete skriptu za sve beleške napravljene u okviru određenog podstabla. U tom slučaju, kreirajte je na korenu beleške podstabla i učinite je naslednom. Nova beleška napravljena unutar podstabla (bilo koje dubine) pokrenuće skriptu.",
|
||||
"run_on_child_note_creation": "izvršava se kada se napravi nova beleška ispod beleške gde je ova relacija definisana",
|
||||
"run_on_note_title_change": "izvršava se kada se promeni naslov beleške (uključuje i pravljenje beleške)",
|
||||
|
||||
@@ -288,7 +288,6 @@
|
||||
"note_paths": {
|
||||
"clone_button": "Notu yeni bir konuma klonla...",
|
||||
"title": "Not Yolları",
|
||||
"intro_placed": "Bu not aşağıdaki yollara yerleştirilmiştir:",
|
||||
"intro_not_placed": "Bu not henüz not ağacına yerleştirilmemiş.",
|
||||
"outside_hoisted": "Bu yol yükseltilmiş notun dışında ve yükseltmeyi kaldırmanız gerekir.",
|
||||
"archived": "Arşivlendi",
|
||||
@@ -884,7 +883,6 @@
|
||||
"hide_relations": "Gizlenmesi gereken ilişki adlarının virgülle ayrılmış listesi. Diğer tümü görüntülenir.",
|
||||
"title_template": "Bu notun alt notu olarak oluşturulan notların varsayılan başlığı. Değer bir JavaScript dizesi olarak değerlendirilir\n ve bu nedenle enjekte edilen <code>now</code> ve <code>parentNote</code> değişkenleriyle dinamik içerikle zenginleştirilebilir. Örnekler:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Ayrıntılar için <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki sayfasına</a>, <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> ve <a href=\"https://day.js.org/docs/en/display/format\">now</a> için API belgelerine bakın.",
|
||||
"template": "Bu not, yeni not oluştururken kullanılabilir şablonlar seçiminde görünür.",
|
||||
"toc": "<code>#toc</code> veya <code>#toc=show</code> İçindekiler'in gösterilmesini zorlar, <code>#toc=hide</code> gizlenmesini zorlar. Etiket yoksa genel ayar geçerlidir.",
|
||||
"color": "Not ağacında, bağlantılarda vb. notun rengini tanımlar. 'red' veya #a13d5f gibi geçerli herhangi bir CSS renk değeri kullanın.",
|
||||
"keyboard_shortcut": "Doğrudan bu nota atlayacak bir klavye kısayolu tanımlar. Örnek: 'ctrl+alt+e'. Değişikliğin etkili olması için önyüzün yeniden yüklenmesi gerekir.",
|
||||
"keep_current_hoisting": "Bu bağlantıyı açmak, not geçerli yükseltilmiş alt ağaçta görüntülenemese bile yükseltmeyi değiştirmez.",
|
||||
@@ -892,7 +890,6 @@
|
||||
"execute_description": "Geçerli kod notunun çalıştır düğmesiyle birlikte gösterilen daha uzun açıklaması.",
|
||||
"exclude_from_note_map": "Bu etikete sahip notlar Not Haritası'ndan gizlenir.",
|
||||
"new_notes_on_top": "Yeni notlar üst notun altına değil, üstüne oluşturulur.",
|
||||
"hide_highlight_widget": "Bu not için Vurgular Listesi'ni gizler, diğer tüm notlarda gösterilmeye devam eder.",
|
||||
"run_on_note_creation": "Not arka uçta oluşturulduğunda çalışır. Belirli bir alt ağaç altında oluşturulan tüm notlar için betiği çalıştırmak istiyorsanız bu ilişkiyi kullanın. Bu durumda, alt ağaç kök notunda oluşturun ve kalıtımlı yapın. Alt ağaç içinde (herhangi bir derinlikte) oluşturulan yeni bir not betiği tetikler.",
|
||||
"run_on_child_note_creation": "Bu ilişkinin tanımlandığı notun altında yeni bir not oluşturulduğunda çalışır.",
|
||||
"run_on_note_title_change": "Not başlığı değiştiğinde çalışır (not oluşturmayı da içerir).",
|
||||
@@ -926,7 +923,6 @@
|
||||
"color_type": "Renk",
|
||||
"relation_type": "İlişki",
|
||||
"versioning_limit": "Bu notun sakladığı revizyon sayısını sınırlar, genel ayarı geçersiz kılar.",
|
||||
"similar_notes_widget_disabled": "Bu not için Benzer Notlar şerit sekmesini devre dışı bırakır. Yalnızca eski düzen.",
|
||||
"llm_chat_home": "Yeni yapay zeka sohbetleri bu notun alt notu olarak oluşturulur.",
|
||||
"workspace_llm_chat_home": "Bu çalışma alanının bir üst notuna yükseltildiğinde, yeni yapay zeka sohbetleri bu notun alt notu olarak oluşturulur.",
|
||||
"date_pattern": "Bu takvim kökü altında oluşturulan gün notlarının başlıkları için kalıp, örn. <code>{dateNumberPadded} - {weekDay}</code>.",
|
||||
@@ -1384,15 +1380,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Yeni bölme oluştur"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Bu notu düzenle"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "İçindekiler'i göster"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Vurgular Listesi'ni göster"
|
||||
},
|
||||
"options": {
|
||||
"title": "Seçenekler",
|
||||
"back": "Tüm seçeneklere geri dön"
|
||||
@@ -1496,9 +1483,6 @@
|
||||
"active": "Güvenli oturum etkin. Güvenli oturumdan çıkmak için tıklayın.",
|
||||
"inactive": "Güvenli oturuma girmek için tıklayın"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Not Revizyonları"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Güncelleme mevcut"
|
||||
},
|
||||
@@ -1513,18 +1497,6 @@
|
||||
"opening_api_docs_message": "API belgeleri açılıyor...",
|
||||
"sql_console_saved_message": "SQL Konsolu notu {{note_path}} içine kaydedildi"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Resim başvurusunu panoya kopyala, bir metin notuna yapıştırılabilir."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Düğmeleri gizle"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Düğmeleri göster"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Diyagramı SVG olarak dışa aktar"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Alt not oluştur ve haritaya ekle"
|
||||
},
|
||||
@@ -1547,9 +1519,6 @@
|
||||
"esc_hint": "kapatmak için"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_one": "{{count}} Geri Bağlantı",
|
||||
"backlink_other": "{{count}} Geri Bağlantı",
|
||||
"relation": "ilişki",
|
||||
"no_backlinks": "Buna bağlantı veren bir not yok."
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
@@ -1577,8 +1546,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Not türü",
|
||||
"editable": "Düzenlenebilir",
|
||||
"basic_properties": "Temel Özellikler",
|
||||
"language": "Dil",
|
||||
"configure_code_notes": "Kod notlarını yapılandır..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -1608,37 +1575,23 @@
|
||||
"open_all_confirm_other": "Bu, {{count}} notu yeni sekmelerde açacak. Devam edilsin mi?"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Bu günde henüz düzenlenmiş not yok...",
|
||||
"title": "Düzenlenmiş Notlar",
|
||||
"deleted": "(silindi)"
|
||||
"no_edited_notes_found": "Bu günde henüz düzenlenmiş not yok..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "Not Kimliği",
|
||||
"original_file_name": "Özgün dosya adı",
|
||||
"file_type": "Dosya türü",
|
||||
"file_size": "Dosya boyutu",
|
||||
"download": "İndir",
|
||||
"open": "Harici olarak aç",
|
||||
"upload_new_revision": "Yeni revizyon yükle",
|
||||
"upload_success": "Yeni dosya revizyonu yüklendi.",
|
||||
"upload_failed": "Yeni dosya revizyonu yüklenemedi.",
|
||||
"title": "Dosya"
|
||||
"upload_failed": "Yeni dosya revizyonu yüklenemedi."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Özgün dosya adı",
|
||||
"file_type": "Dosya türü",
|
||||
"file_size": "Dosya boyutu",
|
||||
"download": "İndir",
|
||||
"open": "Aç",
|
||||
"copy_reference_to_clipboard": "Başvuruyu panoya kopyala",
|
||||
"upload_new_revision": "Yeni revizyon yükle",
|
||||
"upload_success": "Yeni resim revizyonu yüklendi.",
|
||||
"upload_failed": "Yeni resim revizyonu yüklenemedi: {{message}}",
|
||||
"title": "Resim"
|
||||
"upload_failed": "Yeni resim revizyonu yüklenemedi: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Kalıtımlı Özellikler",
|
||||
"no_inherited_attributes": "Kalıtımlı özellik yok.",
|
||||
"none": "yok"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -1656,9 +1609,7 @@
|
||||
"show_similar_notes": "Benzer notları göster"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Tam boyuta genişlet",
|
||||
"expand": "Haritayı genişlet",
|
||||
"collapse": "Normal boyuta daralt",
|
||||
"title": "Not Haritası",
|
||||
"fix-nodes": "Düğümleri sabitle",
|
||||
"link-distance": "Bağlantı uzaklığı",
|
||||
@@ -1666,13 +1617,6 @@
|
||||
"too-many-notes_other": "Burada {{count}} not var. Hepsinin gösterilmesi işleri yavaşlatabilir.",
|
||||
"show-anyway": "Haritayı göster"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Bu not özgün olarak şuradan alınmıştır:",
|
||||
"info": "Bilgi"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Sahip Olunan Özellikler"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Öne Çıkarılmış Özellikler",
|
||||
"unset-field-placeholder": "ayarlanmadı",
|
||||
@@ -1691,12 +1635,6 @@
|
||||
"values_placeholder": "Bir değer yazın ve Enter'a basın",
|
||||
"add_value": "Bu değeri ekle"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Sorgu",
|
||||
"script": "Betik",
|
||||
"execute_query": "Sorguyu Çalıştır",
|
||||
"execute_script": "Betiği Çalıştır"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Arama seçeneği ekle:",
|
||||
"search_string": "arama dizesi",
|
||||
@@ -2041,8 +1979,6 @@
|
||||
"experimental_features": {
|
||||
"title": "Deneysel Seçenekler",
|
||||
"disclaimer": "Bu seçenekler deneyseldir ve kararsızlığa neden olabilir. Dikkatli kullanın.",
|
||||
"new_layout_name": "Yeni Düzen",
|
||||
"new_layout_description": "Daha modern bir görünüm ve gelişmiş kullanılabilirlik için yeni düzeni deneyin. Gelecek sürümlerde büyük değişikliklere tabidir.",
|
||||
"llm_name": "Yapay Zeka / LLM Sohbeti",
|
||||
"llm_description": "Büyük dil modelleri tarafından desteklenen yapay zeka sohbet kenar çubuğunu ve LLM sohbet notlarını etkinleştirir."
|
||||
},
|
||||
@@ -2084,9 +2020,6 @@
|
||||
"enabled": "etkin",
|
||||
"disabled": "devre dışı"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Düzenlenmiş Notlar şerit sekmesi gün notlarında otomatik olarak açılacaktır"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Kullanıcı Arayüzü",
|
||||
"theme_label": "Uygulama teması",
|
||||
@@ -2287,17 +2220,7 @@
|
||||
"italic": "İtalik metin",
|
||||
"underline": "Altı çizili metin",
|
||||
"color": "Renkli metin",
|
||||
"bg_color": "Arka plan renkli metin",
|
||||
"visibility_title": "Vurgular Listesi görünürlüğü",
|
||||
"visibility_description": "#hideHighlightWidget etiketi ekleyerek vurgular widget'ını not bazında gizleyebilirsiniz.",
|
||||
"shortcut_info": "Sağ bölmeyi (Vurgular dahil) hızlıca açıp kapatmak için Seçenekler -> Kısayollar'da bir klavye kısayolu yapılandırabilirsiniz ('toggleRightPane' adıyla)."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "İçindekiler",
|
||||
"description": "İçindekiler, not belirlenen sayıdan fazla başlığa sahip olduğunda metin notlarında görünür. Bu sayıyı özelleştirebilirsiniz:",
|
||||
"unit": "başlık",
|
||||
"disable_info": "Bu seçeneği çok yüksek bir sayı ayarlayarak İçindekiler'i etkin bir şekilde devre dışı bırakmak için de kullanabilirsiniz.",
|
||||
"shortcut_info": "Sağ bölmeyi (İçindekiler dahil) hızlıca açıp kapatmak için Seçenekler -> Kısayollar'da bir klavye kısayolu yapılandırabilirsiniz ('toggleRightPane' adıyla)."
|
||||
"bg_color": "Arka plan renkli metin"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Otomatik Salt Okunur Boyut",
|
||||
@@ -2638,9 +2561,7 @@
|
||||
"importSource": "İçe aktarma kaynağı"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Yer imi",
|
||||
"bookmark_this_note": "Bu notu sol yan panele yer imi olarak ekle",
|
||||
"remove_bookmark": "Yer imini kaldır"
|
||||
"bookmark": "Yer imi"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Otomatik",
|
||||
@@ -2654,14 +2575,7 @@
|
||||
"button-link-map": "Bağlantı Haritası",
|
||||
"button-tree-map": "Ağaç haritası"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Bu not {{- link}} üzerinde herkese açık olarak paylaşılıyor.",
|
||||
"shared_locally": "Bu not {{- link}} üzerinde yerel olarak paylaşılıyor.",
|
||||
"help_link": "Yardım için <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki'yi</a> ziyaret edin."
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "Şu anda salt okunur bir not görüntüleniyor.",
|
||||
"auto-read-only-note": "Bu not, daha hızlı yükleme için salt okunur modda gösteriliyor.",
|
||||
"edit-note": "Notu düzenle"
|
||||
},
|
||||
"note_types": {
|
||||
@@ -2692,10 +2606,7 @@
|
||||
"spreadsheet": "E-tablo"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Notu koru",
|
||||
"toggle-off": "Not korumasını kaldır",
|
||||
"toggle-on-hint": "Not korunmuyor, korumak için tıklayın",
|
||||
"toggle-off-hint": "Not korunuyor, korumayı kaldırmak için tıklayın"
|
||||
"toggle-on": "Notu koru"
|
||||
},
|
||||
"llm_chat": {
|
||||
"placeholder": "Bir mesaj yazın...",
|
||||
@@ -2784,15 +2695,11 @@
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Paylaşıldı",
|
||||
"toggle-on-title": "Notu paylaş",
|
||||
"toggle-off-title": "Not paylaşımını kaldır",
|
||||
"shared-branch": "Bu not yalnızca paylaşılan bir not olarak var, paylaşımı kaldırmak onu silecek. Devam etmek ve bu notu silmek istiyor musunuz?",
|
||||
"inherited": "Not, bir üst notundan kalıtım yoluyla paylaşıldığı için burada paylaşımı kaldırılamaz."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Şablon",
|
||||
"toggle-on-hint": "Notu şablon yap",
|
||||
"toggle-off-hint": "Notun şablon olma özelliğini kaldır"
|
||||
"template": "Şablon"
|
||||
},
|
||||
"full_content_width_switch": {
|
||||
"title": "Tam genişlik"
|
||||
@@ -2810,10 +2717,8 @@
|
||||
"replace_all": "Tümünü değiştir"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Vurgular Listesi",
|
||||
"title_with_count_one": "{{count}} vurgu",
|
||||
"title_with_count_other": "{{count}} vurgu",
|
||||
"options": "Seçenekler",
|
||||
"menu_configure": "Vurgular listesini yapılandır...",
|
||||
"no_highlights": "Vurgu bulunamadı."
|
||||
},
|
||||
@@ -2892,7 +2797,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "İçindekiler",
|
||||
"options": "Seçenekler",
|
||||
"no_headings": "Başlık yok."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -2984,9 +2888,6 @@
|
||||
"tab_width": "Sekme genişliği",
|
||||
"tab_width_unit": "boşluk"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Biçimlendirme"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Düzenleyici"
|
||||
},
|
||||
@@ -2995,12 +2896,10 @@
|
||||
"label": "Biçimlendirme araç çubuğu",
|
||||
"toolbar_style": "Araç çubuğu stili",
|
||||
"floating": {
|
||||
"title": "Kayan",
|
||||
"description": "düzenleme araçları imlecin yakınında görünür;"
|
||||
"title": "Kayan"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Sabit",
|
||||
"description": "düzenleme araçları \"Biçimlendirme\" şerit sekmesinde görünür."
|
||||
"title": "Sabit"
|
||||
},
|
||||
"multiline-toolbar": "Sığmıyorsa araç çubuğunu birden çok satırda göster"
|
||||
}
|
||||
@@ -3320,18 +3219,11 @@
|
||||
"title_vertical": "Düzenleme bölmesini alta taşı",
|
||||
"title_horizontal": "Düzenleme bölmesini sola taşı"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Düzenlemenin kilidini aç",
|
||||
"lock-editing": "Düzenlemeyi kilitle"
|
||||
},
|
||||
"display_mode": {
|
||||
"source": "Kaynak görünümü",
|
||||
"split": "Bölünmüş görünüm",
|
||||
"preview": "Önizleme"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Diyagramı PNG olarak dışa aktar"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Diyagram PNG olarak dışa aktarılamadı.",
|
||||
"export_to_svg": "Diyagram SVG olarak dışa aktarılamadı."
|
||||
@@ -3528,9 +3420,6 @@
|
||||
"background_effects_title": "Arka plan efektleri artık kararlı",
|
||||
"background_effects_message": "Windows ve macOS cihazlarda, arka plan efektleri artık kararlı. Arka plan efektleri, arkasındaki arka planı bulanıklaştırarak kullanıcı arayüzüne bir renk dokunuşu ekler.",
|
||||
"background_effects_button": "Arka plan efektlerini etkinleştir",
|
||||
"new_layout_title": "Yeni düzen",
|
||||
"new_layout_message": "Trilium için modernleştirilmiş bir düzen sunduk. Şerit kaldırıldı ve ana arayüze sorunsuz bir şekilde entegre edildi; yeni bir durum çubuğu ve genişletilebilir bölümler (öne çıkarılmış özellikler gibi) temel işlevleri devraldı.\n\nYeni düzen varsayılan olarak etkindir ve Seçenekler → Görünüm üzerinden geçici olarak devre dışı bırakılabilir.",
|
||||
"new_layout_button": "Daha fazla bilgi",
|
||||
"scripting_disabled_title": "Arka uç betiklemesi devre dışı bırakıldı",
|
||||
"scripting_disabled_message": "Arka uç betiklemesi artık güvenlik nedeniyle varsayılan olarak devre dışı. Notlarınız artık otomatik olarak çalışmayacak arka uç betikleri içeriyor (bir #run etiketine sahip notlar).\n\nBu betiklere ihtiyacınız varsa, güvenlik ayarlarından arka uç betiklemesini tekrar etkinleştirebilirsiniz.",
|
||||
"scripting_disabled_button": "Güvenlik ayarlarını aç",
|
||||
@@ -3548,10 +3437,7 @@
|
||||
"related_code_blocks": "Metin notlarındaki kod blokları için renk düzeni",
|
||||
"related_code_notes": "Kod notları için renk düzeni",
|
||||
"ui": "Kullanıcı arayüzü",
|
||||
"ui_layout_style": "Düzen stili",
|
||||
"ui_layout_orientation": "Başlatma çubuğu yönü",
|
||||
"ui_old_layout": "Eski düzen",
|
||||
"ui_new_layout": "Yeni düzen"
|
||||
"ui_layout_orientation": "Başlatma çubuğu yönü"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
|
||||
@@ -442,7 +442,6 @@
|
||||
"hide_relations": "應隱藏的逗號分隔關聯名稱。將顯示所有其他關聯。",
|
||||
"title_template": "新增為此筆記的子筆記時的預設標題。該值將作為 JavaScript 字串評估\n 並因此可以透過注入的 <code>now</code> 和 <code>parentNote</code> 變數豐富動態內容。範例:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}的文學作品</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n 有關詳細資訊,請參見<a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">詳細資訊 wiki</a>,API 文件<a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a>和<a href=\"https://day.js.org/docs/en/display/format\">now</a>。",
|
||||
"template": "新增新筆記時將出現在可用模板的選擇中的筆記",
|
||||
"toc": "<code>#toc</code>或<code>#toc=show</code>將強制顯示目錄。 <code>#toc=hide</code>將強制隱藏它。如果標籤不存在,則依照全域設定",
|
||||
"color": "定義筆記樹、連結等中筆記的顏色。使用任何有效的CSS顏色值,如'red'或#a13d5f",
|
||||
"keyboard_shortcut": "定義立即跳轉至此筆記的鍵盤快捷鍵。示例:'ctrl+alt+e'。需要前端重新載入才能生效。",
|
||||
"keep_current_hoisting": "即使筆記不在目前聚焦的子階層中顯示,打開此連結也不會修改聚焦。",
|
||||
@@ -450,7 +449,6 @@
|
||||
"execute_description": "目前程式碼筆記更長的描述與執行按鈕一同顯示",
|
||||
"exclude_from_note_map": "含有此標籤的筆記將從筆記地圖中隱藏",
|
||||
"new_notes_on_top": "新筆記將新增在父級筆記的頂部,而不是底部。",
|
||||
"hide_highlight_widget": "隱藏高亮列表元件",
|
||||
"run_on_note_creation": "在後端新增筆記時執行。如果要為在特定子階層下新增的所有筆記運行腳本,請使用此關聯。在這種情況下,在子階層根筆記上新增它並使其可繼承。在子階層中的任何深度新增新筆記都會觸發腳本。",
|
||||
"run_on_child_note_creation": "當新增新的子筆記時執行",
|
||||
"run_on_note_title_change": "當筆記標題修改時執行(包括筆記新增)",
|
||||
@@ -672,15 +670,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "分割頁面"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "編輯此筆記"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "顯示目錄"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "顯示高亮列表"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "選單",
|
||||
"options": "選項",
|
||||
@@ -776,9 +765,6 @@
|
||||
"active": "已進入受保護的作業階段。點擊退出受保護的作業階段。",
|
||||
"inactive": "點擊進入受保護的作業階段"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "筆記歷史版本"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "有更新可用"
|
||||
},
|
||||
@@ -793,26 +779,9 @@
|
||||
"sql_console_saved_message": "SQL 控制台已儲存至 {{note_path}}",
|
||||
"electron_api_docs_button_title": "開啟 Electron API 文件"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "複製圖片引用至剪貼簿,可貼上至文字筆記中。"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "隱藏按鈕"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "顯示按鈕"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "匯出 SVG 格式圖片"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "新增子筆記並添加至關聯圖"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "關聯",
|
||||
"backlink_one": "{{count}} 個反連結",
|
||||
"backlink_other": "{{count}} 個反連結"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "插入子筆記",
|
||||
"delete_this_note": "刪除此筆記",
|
||||
@@ -838,8 +807,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "筆記類型",
|
||||
"editable": "可編輯",
|
||||
"basic_properties": "基本屬性",
|
||||
"language": "語言",
|
||||
"configure_code_notes": "設定程式碼筆記…"
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -869,37 +836,23 @@
|
||||
"dashboard": "控制台"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "今天還沒有編輯過的筆記...",
|
||||
"title": "編輯過的筆記",
|
||||
"deleted": "(已刪除)"
|
||||
"no_edited_notes_found": "今天還沒有編輯過的筆記..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "筆記 ID",
|
||||
"original_file_name": "原始檔案名稱",
|
||||
"file_type": "檔案類型",
|
||||
"file_size": "檔案大小",
|
||||
"download": "下載",
|
||||
"open": "以外部程式打開",
|
||||
"upload_new_revision": "上傳新版本",
|
||||
"upload_success": "已上傳新檔案版本。",
|
||||
"upload_failed": "新檔案版本上傳失敗。",
|
||||
"title": "檔案"
|
||||
"upload_failed": "新檔案版本上傳失敗。"
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "原始檔案名稱",
|
||||
"file_type": "檔案類型",
|
||||
"file_size": "檔案大小",
|
||||
"download": "下載",
|
||||
"open": "打開",
|
||||
"copy_reference_to_clipboard": "複製引用至剪貼簿",
|
||||
"upload_new_revision": "上傳新版本",
|
||||
"upload_success": "已上傳新圖片版本。",
|
||||
"upload_failed": "新圖片版本上傳失敗:{{message}}",
|
||||
"title": "圖片"
|
||||
"upload_failed": "新圖片版本上傳失敗:{{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "繼承的屬性",
|
||||
"no_inherited_attributes": "沒有繼承的屬性。",
|
||||
"none": "無"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -917,8 +870,6 @@
|
||||
"show_similar_notes": "顯示相似筆記"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "展開顯示",
|
||||
"collapse": "收摺到正常大小",
|
||||
"title": "筆記地圖",
|
||||
"fix-nodes": "固定節點",
|
||||
"link-distance": "連結距離",
|
||||
@@ -929,19 +880,11 @@
|
||||
"note_paths": {
|
||||
"title": "筆記路徑",
|
||||
"clone_button": "克隆筆記至新位置...",
|
||||
"intro_placed": "此筆記放置在以下路徑中:",
|
||||
"intro_not_placed": "此筆記尚未放入筆記樹中。",
|
||||
"outside_hoisted": "此路徑在聚焦的筆記之外,您需要取消聚焦。",
|
||||
"archived": "已封存",
|
||||
"search": "搜尋"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "筆記來源:",
|
||||
"info": "資訊"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "自有屬性"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "升級屬性",
|
||||
"url_placeholder": "http://網站連結...",
|
||||
@@ -953,12 +896,6 @@
|
||||
"unset-field-placeholder": "未設定",
|
||||
"remove_color": "移除此顏色標籤"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "查詢",
|
||||
"script": "腳本",
|
||||
"execute_query": "執行查詢",
|
||||
"execute_script": "執行腳本"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "新增搜尋選項:",
|
||||
"search_string": "搜尋字串",
|
||||
@@ -1230,9 +1167,6 @@
|
||||
"enabled": "啟用",
|
||||
"disabled": "禁用"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "日記筆記中自動打開編輯過的筆記功能區分頁"
|
||||
},
|
||||
"theme": {
|
||||
"title": "使用者介面",
|
||||
"theme_label": "應用程式主題",
|
||||
@@ -1373,17 +1307,7 @@
|
||||
"italic": "斜體",
|
||||
"underline": "下劃線",
|
||||
"color": "字體顏色",
|
||||
"bg_color": "背景顏色",
|
||||
"visibility_title": "高亮列表可見性",
|
||||
"visibility_description": "您可以透過添加 #hideHighlightWidget 標籤來隱藏每個筆記的高亮元件。",
|
||||
"shortcut_info": "您可以在「選項」→「快捷鍵」中設定鍵盤快捷鍵快速切換右側面板(包括高亮列表)(名稱為 'toggleRightPane')。"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "目錄",
|
||||
"description": "當筆記中有超過一定數量的標題時,顯示目錄。您可以自訂此數量:",
|
||||
"disable_info": "您可以設定一個非常大的數來禁用目錄。",
|
||||
"shortcut_info": "您可以在「選項」→「快捷鍵」中設定一個鍵盤快捷鍵快速切換右側面板(包括目錄)(名稱為 'toggleRightPane')。",
|
||||
"unit": "標題"
|
||||
"bg_color": "背景顏色"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "自動唯讀大小",
|
||||
@@ -1521,9 +1445,7 @@
|
||||
"unrecognized_role": "無法識別的附件角色 '{{role}}'。"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "書籤",
|
||||
"bookmark_this_note": "將此筆記添加至左側面板的書籤",
|
||||
"remove_bookmark": "移除書籤"
|
||||
"bookmark": "書籤"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "自動",
|
||||
@@ -1575,11 +1497,6 @@
|
||||
"hide-subtree": "隱藏子階層",
|
||||
"show-subtree": "顯示子階層"
|
||||
},
|
||||
"shared_info": {
|
||||
"help_link": "如需幫助,請訪問 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>。",
|
||||
"shared_publicly": "此筆記已公開分享於 {{- link}}。",
|
||||
"shared_locally": "此筆記已於本地分享至 {{- link}}。"
|
||||
},
|
||||
"note_types": {
|
||||
"text": "文字",
|
||||
"code": "程式碼",
|
||||
@@ -1608,22 +1525,15 @@
|
||||
"markdown": "Markdown"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "保護筆記",
|
||||
"toggle-off": "取消保護筆記",
|
||||
"toggle-on-hint": "筆記未受保護,點擊以保護",
|
||||
"toggle-off-hint": "筆記已受保護,點擊以取消保護"
|
||||
"toggle-on": "保護筆記"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "已分享",
|
||||
"toggle-on-title": "分享筆記",
|
||||
"toggle-off-title": "取消分享筆記",
|
||||
"shared-branch": "此筆記僅作為分享筆記存在,取消分享將刪除它。您確定要繼續並刪除此筆記嗎?",
|
||||
"inherited": "此筆記無法在此處取消分享,因為它透過繼承自父級筆記分享。"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "模板",
|
||||
"toggle-on-hint": "將此筆記設為模板",
|
||||
"toggle-off-hint": "取消筆記模板設定"
|
||||
"template": "模板"
|
||||
},
|
||||
"open-help-page": "打開說明頁面",
|
||||
"find": {
|
||||
@@ -1635,8 +1545,6 @@
|
||||
"replace_all": "全部取代"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "高亮列表",
|
||||
"options": "選項",
|
||||
"title_with_count_one": "{{count}} 處高亮",
|
||||
"title_with_count_other": "{{count}} 處高亮",
|
||||
"menu_configure": "設定高亮列表…",
|
||||
@@ -1728,7 +1636,6 @@
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "目錄",
|
||||
"options": "選項",
|
||||
"no_headings": "無標題。"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
@@ -1806,9 +1713,6 @@
|
||||
"tab_width": "制表符寬度",
|
||||
"tab_width_unit": "空格"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "格式"
|
||||
},
|
||||
"editor": {
|
||||
"title": "編輯器"
|
||||
},
|
||||
@@ -1816,12 +1720,10 @@
|
||||
"editor_type": {
|
||||
"label": "格式工具欄",
|
||||
"floating": {
|
||||
"title": "浮動",
|
||||
"description": "編輯工具出現在游標附近;"
|
||||
"title": "浮動"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "固定",
|
||||
"description": "編輯工具出現在「格式」功能區分頁中。"
|
||||
"title": "固定"
|
||||
},
|
||||
"multiline-toolbar": "如果工具列無法完全顯示,則分多行顯示",
|
||||
"toolbar_style": "工具列樣式"
|
||||
@@ -2029,13 +1931,6 @@
|
||||
"title_vertical": "將編輯面板移至底部",
|
||||
"title_horizontal": "將編輯面板移至左側"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "解鎖編輯",
|
||||
"lock-editing": "鎖定編輯"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "將圖表匯出為 PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "無法將圖表匯出為 PNG。",
|
||||
"export_to_svg": "此绘图无法导出为SVG格式。"
|
||||
@@ -2142,10 +2037,7 @@
|
||||
"next_theme_title": "試用新 Trilium 主題",
|
||||
"next_theme_message": "您正在使用舊版主題,要試用新主題嗎?",
|
||||
"next_theme_button": "試用新主題",
|
||||
"dismiss": "關閉",
|
||||
"new_layout_title": "新版面配置",
|
||||
"new_layout_button": "更多資訊",
|
||||
"new_layout_message": "我們為 Trilium 推出了現代化版面配置。功能區分頁已移除並無縫整合至主介面,取而代之的是全新狀態列與可擴展區塊(例如提升屬性)承擔其主要功能。\n\n新版面配置預設為啟用狀態,您可透過「選項 → 外觀」暫時停用。"
|
||||
"dismiss": "關閉"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "相關設定"
|
||||
@@ -2154,9 +2046,6 @@
|
||||
"related_code_blocks": "文字筆記中程式碼區塊的配色方案",
|
||||
"related_code_notes": "程式碼筆記的配色方案",
|
||||
"ui": "使用者介面",
|
||||
"ui_old_layout": "舊版面配置",
|
||||
"ui_new_layout": "新版面配置",
|
||||
"ui_layout_style": "版面樣式",
|
||||
"ui_layout_orientation": "啟動列的方向"
|
||||
},
|
||||
"units": {
|
||||
@@ -2188,8 +2077,6 @@
|
||||
"delete_note": "刪除筆記…"
|
||||
},
|
||||
"read-only-info": {
|
||||
"read-only-note": "目前正在檢視唯讀筆記。",
|
||||
"auto-read-only-note": "此筆記以唯讀模式顯示以加快載入速度。",
|
||||
"edit-note": "編輯筆記"
|
||||
},
|
||||
"note-color": {
|
||||
@@ -2203,8 +2090,6 @@
|
||||
"experimental_features": {
|
||||
"title": "實驗性選項",
|
||||
"disclaimer": "這些選項屬實驗性質,可能導致系統不穩定。請謹慎使用。",
|
||||
"new_layout_name": "新版面配置",
|
||||
"new_layout_description": "體驗全新版面配置,呈現更現代的外觀與更佳的使用體驗。在未來版本將進行大幅調整。",
|
||||
"llm_name": "AI / LLM 對話",
|
||||
"llm_description": "啟用由大語言模型驅動的 AI 聊天側邊欄及 LLM 聊天筆記。"
|
||||
},
|
||||
|
||||
@@ -434,7 +434,6 @@
|
||||
"display_relations": "كۆرسىتىلىدىغان مۇناسىۋەت ناملىرىنى پەش بىلەن ئاجرىتىپ كىرگۈزۈڭ. تىزىملىكتە بولمىغان باشقا بارلىق مۇناسىۋەتلەر يوشۇرۇلىدۇ.",
|
||||
"hide_relations": "يوشۇرۇلىدىغان مۇناسىۋەت ناملىرىنى پەش بىلەن ئاجرىتىپ كىرگۈزۈڭ. تىزىملىكتە بولمىغان باشقا بارلىق مۇناسىۋەتلەر كۆرسىتىلىدۇ.",
|
||||
"template": "يېڭى خاتىرە قۇرغاندا، مەزكۇر خاتىرە ئىشلەتكىلى بولىدىغان template تىزىملىكىدە كۆرۈنىدۇ",
|
||||
"toc": "<code>#toc</code> ياكى <code>#toc=show</code> قويۇلسا، مۇندەرىجە مەجبۇرىي كۆرسىتىلىدۇ؛ <code>#toc=hide</code> قويۇلسا، مەجبۇرىي يوشۇرۇلىدۇ. ئەگەر بۇ بەلگە بولمىسا، ئومۇمىي تەڭشەك كۈچكە ئىگە بولىدۇ",
|
||||
"color": "خاتىرە دەرىخى ۋە ئۇلىنىشلاردا كۆرسىتىلىدىغان خاتىرە رەڭگىنى بېكىتىدۇ. «red» ياكى «#a13d5f» غا ئوخشاش ھەر قانداق كۈچكە ئىگە CSS رەڭ قىممىتىنى ئىشلىتىشكە بولىدۇ",
|
||||
"keyboard_shortcut": "بۇ خاتىرىگە تېز يوللانما كۇنۇپكىسى بېكىتىدۇ، كۇنۇپكىنى باسقاندا بىۋاسىتە مۇشۇ خاتىرىگە سەكىرەيدۇ. مىسال: «ctrl+alt+e». ئۆزگىرىشنى كۈچكە ئىگە قىلىش ئۈچۈن ئالدى يۈزنى (frontend) قايتا يۈكلەش تەلەپ قىلىنىدۇ.",
|
||||
"keep_current_hoisting": "بۇ ئۇلىنىشنى ئاچسىڭىز، نۆۋەتتىكى فوكۇسلانغان (hoisted) مۇندەرىجە دەرىخى ئۆزگەرمەيدۇ؛ مەيلى مەزكۇر خاتىرە نۆۋەتتىكى دەرىخىدە كۆرۈنمىسىمۇ شۇنداق بولىدۇ.",
|
||||
@@ -442,7 +441,6 @@
|
||||
"execute_description": "ئىجرا قىلىش كۇنۇپكىسى بىلەن بىرگە كۆرسىتىلىدىغان مەزكۇر كود خاتىرىسىنىڭ تەپسىلىي چۈشەندۈرۈشى",
|
||||
"exclude_from_note_map": "بۇ بەلگە قويۇلغان خاتىرىلەر «خاتىرە خەرىتىسى»دە (Note Map) كۆرسىتىلمەيدۇ",
|
||||
"new_notes_on_top": "يېڭى خاتىرىلەر ئاساسىي خاتىرىنىڭ ئاستى تەرىپىدە ئەمەس، بەلكى ئەڭ ئۈستى تەرىپىدە قۇرۇلىدۇ.",
|
||||
"hide_highlight_widget": "«يارقىن نۇقتىلار تىزىملىكى» (Highlight List) زاپچاسلارنى يوشۇرۇش",
|
||||
"run_on_note_creation": "خاتىرە ئارقا سۇپىدا (backend) قۇرۇلغاندا ئىجرا قىلىنىدۇ. ئەگەر script مەلۇم بىر تارماق دەرەخ ئاستىدا قۇرۇلغان بارلىق خاتىرىلەرگە قوللانماقچى بولسىڭىز، بۇ مۇناسىۋەتنى ئىشلىتىڭ. بۇنداق ئەھۋالدا، ئۇنى تارماق دەرەخنىڭ تۈپ خاتىرىسىدە قۇرۇڭ ھەمدە «ۋارىسلىق قىلىدىغان» (inheritable) قىلىپ بېكىتىڭ. شۇنداق بولغاندا، شۇ تارماق دەرەخ ئاستىدا (خالىغان چوڭقۇرلۇقتا) قۇرۇلغان ھەر قانداق يېڭى خاتىرە مەزكۇر scriptنى قوزغىتىدۇ.",
|
||||
"run_on_child_note_creation": "يېڭى خاتىرە مەزكۇر مۇناسىۋەت بېكىتىلگەن خاتىرىنىڭ ئاستىدا قۇرۇلغاندا ئىجرا قىلىنىدۇ",
|
||||
"run_on_note_title_change": "خاتىرە ماۋزۇسى ئۆزگەرگەندە (خاتىرە قۇرۇلغان ۋاقىتنىمۇ ئۆز ئىچىگە ئالىدۇ) ئىجرا قىلىنىدۇ",
|
||||
@@ -647,15 +645,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "يېڭى بۆلەك قۇرۇش"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "بۇ خاتىرىنى تەھرىرلەش"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "مەزمۇن مۇندەرىجە كۆرسىتىش"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "يارقىن نۇقتىلار تىزىملىكىنى كۆرسىتىش"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "Menu",
|
||||
"options": "تاللانمىلار",
|
||||
@@ -724,9 +713,6 @@
|
||||
"export_as_image_svg": "SVG (ۋېكتورلۇق)",
|
||||
"note_map": "خاتىرە خەرىتىسى"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "خاتىرە نۇسخىلىرى"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "يېڭىلانما بار"
|
||||
},
|
||||
@@ -740,26 +726,9 @@
|
||||
"opening_api_docs_message": "API ھۆججەتلىرى ئېچىلىۋاتىدۇ...",
|
||||
"sql_console_saved_message": "SQL كونسول خاتىرىسى {{note_path}} غا ساقلاندى"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "رەسىم نەقىل ئۇلىنىشىنى چاپلاش تاختىسىغا كۆچۈرۈش، تېكىستلىك خاتىرىگە چاپلاشقا بولىدۇ."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "كۇنۇپكىلارنى يوشۇرۇش"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "كۇنۇپكىلارنى كۆرسىتىش"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "دىئاگراممىنى SVG قىلىپ چىقىرىش"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "تارماق خاتىرە قۇرۇش ۋە خەرىتىگە قوشۇش"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"backlink_one": "{{count}} تەتۈر ئۇلانما",
|
||||
"backlink_other": "{{count}} تەتۈر ئۇلانمالار",
|
||||
"relation": "مۇناسىۋەت"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "تارماق خاتىرە قىستۇرۇش",
|
||||
"delete_this_note": "بۇ خاتىرىنى ئۆچۈرۈش",
|
||||
@@ -784,8 +753,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "خاتىرە تىپى",
|
||||
"editable": "تەھرىرلىگىلى بولىدۇ",
|
||||
"basic_properties": "ئاساسىي خۇسۇسىيەتلەر",
|
||||
"language": "تىل",
|
||||
"configure_code_notes": "كود خاتىرىسىنى سەپلەش..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -812,36 +779,22 @@
|
||||
"open_all_confirm_other": ""
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "بۇ كۈندە تېخى تەھرىرلەنگەن خاتىرە يوق...",
|
||||
"title": "تەھرىرلەنگەن خاتىرىلەر",
|
||||
"deleted": "(ئۆچۈرۈلگەن)"
|
||||
"no_edited_notes_found": "بۇ كۈندە تېخى تەھرىرلەنگەن خاتىرە يوق..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "خاتىرە ID",
|
||||
"original_file_name": "ئەسلى ھۆججەت نامى",
|
||||
"file_type": "ھۆججەت تىپى",
|
||||
"file_size": "ھۆججەت چوڭلۇقى",
|
||||
"download": "چۈشۈرۈش",
|
||||
"open": "سىرتقى پروگراممىدا ئېچىش",
|
||||
"upload_new_revision": "يېڭى نۇسخىسىنى يۈكلەش",
|
||||
"upload_success": "ھۆججەتنىڭ يېڭى نۇسخىسى يۈكلەندى.",
|
||||
"upload_failed": "ھۆججەتنىڭ يېڭى نۇسخىسىنى يۈكلەش مەغلۇپ بولدى.",
|
||||
"title": "ھۆججەت"
|
||||
"upload_failed": "ھۆججەتنىڭ يېڭى نۇسخىسىنى يۈكلەش مەغلۇپ بولدى."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "ئەسلى ھۆججەت نامى",
|
||||
"file_type": "ھۆججەت تىپى",
|
||||
"file_size": "ھۆججەت چوڭلۇقى",
|
||||
"download": "چۈشۈرۈش",
|
||||
"open": "ئېچىش",
|
||||
"upload_new_revision": "يېڭى نۇسخىسىنى يۈكلەش",
|
||||
"upload_success": "رەسىمنىڭ يېڭى نۇسخىسى يۈكلەندى.",
|
||||
"upload_failed": "رەسىمنىڭ يېڭى نۇسخىسىنى يۈكلەش مەغلۇپ بولدى: {{message}}",
|
||||
"title": "رەسىم"
|
||||
"upload_failed": "رەسىمنىڭ يېڭى نۇسخىسىنى يۈكلەش مەغلۇپ بولدى: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "ۋارىسلىق قىلىنغان خاسلىقلار",
|
||||
"no_inherited_attributes": "ۋارىسلىق قىلىنغان خاسلىق يوق.",
|
||||
"none": "يوق"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -859,8 +812,6 @@
|
||||
"show_similar_notes": "ئوخشاش خاتىرىلەرنى كۆرسىتىش"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "تولۇق يېيىش",
|
||||
"collapse": "نورمال چوڭلۇقتا يىغىش",
|
||||
"title": "خاتىرە خەرىتىسى",
|
||||
"fix-nodes": "خاتىرە نۇقتىلىرى",
|
||||
"link-distance": "ئۇلانما ئارىلىقى",
|
||||
@@ -870,19 +821,11 @@
|
||||
"note_paths": {
|
||||
"title": "خاتىرە يوللىرى",
|
||||
"clone_button": "خاتىرىنى يېڭى ئورۇنغا كۆپەيتىش...",
|
||||
"intro_placed": "بۇ خاتىرە تۆۋەندىكى يوللارغا قويۇلغان:",
|
||||
"intro_not_placed": "بۇ خاتىرە تېخى خاتىرە دەرىخىگە قويۇلمىغان.",
|
||||
"outside_hoisted": "بۇ يول يۇقىرى كۆتۈرۈلگەن خاتىرە دائىرىسىنىڭ سىرتىدا، كۆرۈنۈشنى ئەسلىگە كەلتۈرۈشىڭىزگە توغرا كېلىدۇ.",
|
||||
"archived": "ئارخىپلاندى",
|
||||
"search": "ئىزدەش"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "بۇ خاتىرىنىڭ ئەسلى مەنبەسى:",
|
||||
"info": "ئۇچۇر"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "ئۆزىگە تەۋە خاسلىقلار"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "ئۆستۈرۈلگەن خاسلىقلار",
|
||||
"unset-field-placeholder": "بېكىتىلمىگەن",
|
||||
@@ -893,12 +836,6 @@
|
||||
"remove_this_attribute": "خاسلىقنى ئۆچۈرۈش",
|
||||
"remove_color": "رەڭ بەلگىسىنى ئۆچۈرۈش"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "سۈرۈشتۈرۈش",
|
||||
"script": "Script",
|
||||
"execute_query": "سۈرۈشتۈرۈشنى ئىجرا قىلىش",
|
||||
"execute_script": "Scriptنى ئىجرا قىلىش"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "ئىزدەش تاللانمىسى قوشۇش:",
|
||||
"search_string": "ئىزدەش تېكىستى",
|
||||
|
||||
@@ -155,9 +155,6 @@
|
||||
"theme_group_light": "Світлі теми",
|
||||
"theme_group_dark": "Темні теми"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Форматування"
|
||||
},
|
||||
"editor": {
|
||||
"title": "Редактор"
|
||||
},
|
||||
@@ -165,12 +162,10 @@
|
||||
"editor_type": {
|
||||
"label": "Панель інструментів форматування",
|
||||
"floating": {
|
||||
"title": "Плаваюче",
|
||||
"description": "інструменти редагування з’являються поруч із курсором;"
|
||||
"title": "Плаваюче"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "Фіксоване",
|
||||
"description": "інструменти редагування відображаються на вкладці стрічки Форматування."
|
||||
"title": "Фіксоване"
|
||||
},
|
||||
"multiline-toolbar": "Відображати панель інструментів на кількох рядках, якщо вона не поміщається."
|
||||
}
|
||||
@@ -460,7 +455,6 @@
|
||||
"hide_relations": "назви зв'язків, розділені комами, які слід приховати. Усі інші будуть відображені.",
|
||||
"title_template": "заголовок нотаток за замовчуванням, створених як дочірні елементи цієї нотатки. Значення оцінюється як рядок JavaScript\nі таким чином може бути збагачене динамічним контентом за допомогою вставлених змінних <code>now</code> та <code>parentNote</code>. Приклади:\n\n<ul>\nЛітературні твори <li><code>${parentNote.getLabelValue('authorName')}</code></li>\n<li><code>Журнал для ${now.format('РРРР-ММ-ДД ГГ:мм:сс')</code></li>\n</ul>\n\nДив. <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">вікі з деталями</a>, документацію API для <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> та <a href=\"https://day.js.org/docs/en/display/format\">now</a> для отримання детальної інформації.",
|
||||
"template": "Ця нотатка з'явиться у списку доступних шаблонів під час створення нової нотатки",
|
||||
"toc": "<code>#toc</code> або <code>#toc=show</code> примусово покаже Зміст, <code>#toc=hide</code> примусово приховає його. Якщо мітка не існує, дотримується глобального налаштування",
|
||||
"color": "визначає колір нотатки в дереві нотаток, посиланнях тощо. Використовуйте будь-яке дійсне значення кольору CSS, наприклад, 'red' або #a13d5f",
|
||||
"keyboard_shortcut": "Визначає комбінацію клавіш, щоб негайно перейти до цієї нотатки. Приклад: «ctrl+alt+e». Щоб зміни набули чинності, потрібне перезавантаження інтерфейсу.",
|
||||
"keep_current_hoisting": "Відкриття цього посилання не змінить хостинг, навіть якщо нотатка не відображається в поточному піддереві хостінгу.",
|
||||
@@ -468,7 +462,6 @@
|
||||
"execute_description": "Більш детальний опис поточного коду, що відображається разом із кнопкою виконання",
|
||||
"exclude_from_note_map": "Нотатки з цією міткою будуть приховані на Карті Нотатки",
|
||||
"new_notes_on_top": "Нові нотатки будуть створені зверху батьківської нотатки, а не знизу.",
|
||||
"hide_highlight_widget": "Приховати віджет Основні моменти",
|
||||
"run_on_note_creation": "виконується, коли нотатка створюється на серверній частині. Використовуйте цей зв'язок, якщо потрібно запустити скрипт для всіх нотаток, створених у певному піддереві. У такому випадку створіть його на батьківській нотатці піддерева та зробіть його успадковуваним. Нова нотатка, створена в піддереві (будь-якої глибини), запустить скрипт.",
|
||||
"run_on_child_note_creation": "виконується, коли створюється нова нотатка під нотаткою, де визначено цей зв'язок",
|
||||
"run_on_note_title_change": "виконується, коли змінюється заголовок нотатки (включає також створення нотатки)",
|
||||
@@ -693,15 +686,6 @@
|
||||
"create_pane_button": {
|
||||
"create_new_split": "Створити новий розділ"
|
||||
},
|
||||
"edit_button": {
|
||||
"edit_this_note": "Редагувати цю нотатку"
|
||||
},
|
||||
"show_toc_widget_button": {
|
||||
"show_toc": "Показати Зміст"
|
||||
},
|
||||
"show_highlights_list_widget_button": {
|
||||
"show_highlights_list": "Показати Список Основних моментів"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Вихід з Дзен-режиму"
|
||||
},
|
||||
@@ -754,9 +738,6 @@
|
||||
"active": "Захищений сеанс активний. Натисніть, щоб вийти з захищеного сеансу.",
|
||||
"inactive": "Натисніть, щоб увійти до захищеного сеансу"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "Версії Нотатки"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "Доступне оновлення"
|
||||
},
|
||||
@@ -770,27 +751,9 @@
|
||||
"opening_api_docs_message": "Відкриття документації API...",
|
||||
"sql_console_saved_message": "Нотатку консолі SQL збережено в {{note_path}}"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Копіювати посилання на зображення в буфер обміну, можна вставити в текстову нотатку."
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "Приховати кнопки"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "Показати кнопки"
|
||||
},
|
||||
"svg_export_button": {
|
||||
"button_title": "Експорт діаграми у форматі SVG"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"create_child_note_title": "Створити нову дочірню нотатку та додати її до цієї Карти зв'язків"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "зв'язок",
|
||||
"backlink_one": "{{count}} Зворотне посилання",
|
||||
"backlink_few": "{{count}} Зворотні посилання",
|
||||
"backlink_many": "{{count}} Зворотні посилання"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "Вставити дочірню нотатку",
|
||||
"delete_this_note": "Видалити цю нотатку",
|
||||
@@ -817,8 +780,6 @@
|
||||
"basic_properties": {
|
||||
"note_type": "Тип нотатки",
|
||||
"editable": "Редагув.",
|
||||
"basic_properties": "Основні Властивості",
|
||||
"language": "Мова",
|
||||
"configure_code_notes": "Конфігурація нотатки з кодом..."
|
||||
},
|
||||
"book_properties": {
|
||||
@@ -843,37 +804,23 @@
|
||||
"hide_child_notes": "Приховати дочірні нотатки в дереві"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Цього дня ще немає редагованих нотаток...",
|
||||
"title": "Редаговані нотатки",
|
||||
"deleted": "(видалено)"
|
||||
"no_edited_notes_found": "Цього дня ще немає редагованих нотаток..."
|
||||
},
|
||||
"file_properties": {
|
||||
"note_id": "ID Нотатки",
|
||||
"original_file_name": "Оригінальне ім'я файлу",
|
||||
"file_type": "Тип файлу",
|
||||
"file_size": "Розмір файлу",
|
||||
"download": "Завантажити",
|
||||
"open": "Відкрити зовні",
|
||||
"upload_new_revision": "Завантажити нову версію",
|
||||
"upload_success": "Завантажено нову версію файлу.",
|
||||
"upload_failed": "Не вдалося завантажити нову версію файлу.",
|
||||
"title": "Файл"
|
||||
"upload_failed": "Не вдалося завантажити нову версію файлу."
|
||||
},
|
||||
"image_properties": {
|
||||
"original_file_name": "Оригінальне ім'я файлу",
|
||||
"file_type": "Тип файлу",
|
||||
"file_size": "Розмір файлу",
|
||||
"download": "Завантажити",
|
||||
"open": "Відкрити",
|
||||
"copy_reference_to_clipboard": "Копіювати посилання в буфер обміну",
|
||||
"upload_new_revision": "Завантажити нову версію",
|
||||
"upload_success": "Нову версію зображення завантажено.",
|
||||
"upload_failed": "Не вдалося завантажити нову версію зображення: {{message}}",
|
||||
"title": "Зображення"
|
||||
"upload_failed": "Не вдалося завантажити нову версію зображення: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Успадковані Атрибути",
|
||||
"no_inherited_attributes": "Немає успадкованих атрибутів.",
|
||||
"none": "пусто"
|
||||
},
|
||||
"note_info_widget": {
|
||||
@@ -892,8 +839,6 @@
|
||||
"show_similar_notes": "Показати схожі нотатки"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Розгорнути на повний розмір",
|
||||
"collapse": "Згорнути до звичайного розміру",
|
||||
"title": "Карта Нотатки",
|
||||
"fix-nodes": "Виправити вузли",
|
||||
"link-distance": "Відстань зв'язку"
|
||||
@@ -901,19 +846,11 @@
|
||||
"note_paths": {
|
||||
"title": "Шляхи Нотатки",
|
||||
"clone_button": "Клонувати нотатку в нове місце...",
|
||||
"intro_placed": "Цю нотатку розміщено за такими шляхами:",
|
||||
"intro_not_placed": "Цю нотатку ще не розміщено в дереві нотаток.",
|
||||
"archived": "Архівовано",
|
||||
"search": "Пошук",
|
||||
"outside_hoisted": "Цей шлях знаходиться поза межами закріпленої нотатки і вам доведеться відкріпити."
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Цю нотатку було спочатку взято з:",
|
||||
"info": "Інформація"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Власні Атрибути"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Просунуті Атрибути",
|
||||
"unset-field-placeholder": "не встановлено",
|
||||
@@ -925,12 +862,6 @@
|
||||
"remove_this_attribute": "Видалити цей атрибут",
|
||||
"remove_color": "Видалити кольорову мітку"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Запит",
|
||||
"script": "Скрипт",
|
||||
"execute_query": "Виконати запит",
|
||||
"execute_script": "Виконати скрипт"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Додати опцію пошуку:",
|
||||
"search_string": "рядок пошуку",
|
||||
@@ -1171,9 +1102,6 @@
|
||||
"enabled": "увімкнено",
|
||||
"disabled": "вимкнено"
|
||||
},
|
||||
"ribbon": {
|
||||
"edited_notes_message": "Вкладка стрічки Редаговані нотатки автоматично відкриватиметься для денних нотаток"
|
||||
},
|
||||
"theme": {
|
||||
"title": "Тема програми",
|
||||
"theme_label": "Тема",
|
||||
@@ -1350,17 +1278,7 @@
|
||||
"italic": "Курсив",
|
||||
"underline": "Підкреслений текст",
|
||||
"color": "Кольоровий текст",
|
||||
"bg_color": "Текст із кольором фону",
|
||||
"visibility_title": "Видимість Списку основних моментів",
|
||||
"visibility_description": "Ви можете приховати віджет основних моментів для кожної нотатки окремо, додавши мітку #hideHighlightWidget.",
|
||||
"shortcut_info": "Ви можете налаштувати комбінацію клавіш для швидкого перемикання правої панелі (включно з основними моментами) у меню Параметри -> Комбінації клавіш (назва «toggleRightPane»)."
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "Зміст",
|
||||
"description": "Зміст відображатиметься в текстових нотатках, якщо нотатка містить більше заголовків, ніж визначено. Ви можете налаштувати цю кількість:",
|
||||
"unit": "заголовки",
|
||||
"disable_info": "Ви також можете скористатися цим параметром, щоб ефективно вимкнути зміст, встановивши дуже велике число.",
|
||||
"shortcut_info": "Ви можете налаштувати комбінацію клавіш для швидкого перемикання правої панелі (включно зі змістом) у меню Параметри -> Комбінації клавіш (назва «toggleRightPane»)."
|
||||
"bg_color": "Текст із кольором фону"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Автоматичний розмір лише для читання",
|
||||
@@ -1459,8 +1377,7 @@
|
||||
"new_tab": "Нова вкладка"
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "Зміст",
|
||||
"options": "Параметри"
|
||||
"table_of_contents": "Зміст"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
"file_last_modified": "Файл <code class=\"file-path\"></code> востаннє змінювався <span class=\"file-last-modified\"></span>.",
|
||||
@@ -1585,13 +1502,6 @@
|
||||
"title_vertical": "Перемістити панель редагування вниз",
|
||||
"title_horizontal": "Перемістити панель редагування ліворуч"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Розблокувати редагування",
|
||||
"lock-editing": "Заблокувати редагування"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Експорт діаграми у форматі PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Не вдалося експортувати діаграму у формат PNG."
|
||||
},
|
||||
@@ -1681,9 +1591,7 @@
|
||||
"unrecognized_role": "Нерозпізнана роль вкладення '{{role}}'."
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Закладка",
|
||||
"bookmark_this_note": "Додати цю нотатку до закладок на лівій бічній панелі",
|
||||
"remove_bookmark": "Видалити закладку"
|
||||
"bookmark": "Закладка"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "Авто",
|
||||
@@ -1736,11 +1644,6 @@
|
||||
"open-in-a-new-window": "Відкрити у новому вікні",
|
||||
"show-subtree": "Показати піддерево"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Ця нотатка опублікована на {{- link}}.",
|
||||
"shared_locally": "Цю нотатку опубліковано локально на {{- link}}.",
|
||||
"help_link": "Щоб отримати допомогу, відвідайте <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">вікі</a>."
|
||||
},
|
||||
"note_types": {
|
||||
"text": "Текст",
|
||||
"code": "Код",
|
||||
@@ -1765,22 +1668,15 @@
|
||||
"render-note": "Рендерінг Нотатки"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Захист нотатки",
|
||||
"toggle-off": "Зняти захист нотатки",
|
||||
"toggle-on-hint": "Нотатку не захищено, натисніть, щоб захистити її",
|
||||
"toggle-off-hint": "Нотатку захищено, натисніть, щоб зняти захист"
|
||||
"toggle-on": "Захист нотатки"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "Спільне",
|
||||
"toggle-on-title": "Поділитися нотаткою",
|
||||
"toggle-off-title": "Скасувати спільний доступ до нотатки",
|
||||
"shared-branch": "Ця нотатка існує лише як спільна нотатка, скасування спільного доступу призведе до її видалення. Ви хочете продовжити та таким чином видалити цю нотатку?",
|
||||
"inherited": "Спільний доступ до нотатки тут не можна скасувати, оскільки вона успадкована від предка."
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "Шаблон",
|
||||
"toggle-on-hint": "Зробити нотатку шаблоном",
|
||||
"toggle-off-hint": "Видалити нотатку як шаблон"
|
||||
"template": "Шаблон"
|
||||
},
|
||||
"open-help-page": "Відкрити сторінку довідки",
|
||||
"find": {
|
||||
@@ -1792,8 +1688,6 @@
|
||||
"replace_all": "Замінити все"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "Список основних моментів",
|
||||
"options": "Параметри",
|
||||
"title_with_count_one": "{{count}} виділення",
|
||||
"title_with_count_few": "{{count}} виділення",
|
||||
"title_with_count_many": "{{count}} виділень"
|
||||
@@ -1943,7 +1837,6 @@
|
||||
}
|
||||
},
|
||||
"read-only-info": {
|
||||
"auto-read-only-note": "Для швидшого завантаження ця нотатка відображається в режимі \"лише для читання\".",
|
||||
"edit-note": "Редагувати нотатку"
|
||||
},
|
||||
"note-color": {
|
||||
|
||||
@@ -1 +1,165 @@
|
||||
{}
|
||||
{
|
||||
"login": {
|
||||
"heading": "Đăng nhập vào Trilium Notes",
|
||||
"password": "Mật khẩu",
|
||||
"totp-token": "Mật khẩu dùng một lần hoặc mã khôi phục",
|
||||
"button": "Đăng nhập",
|
||||
"remember-me": "Ghi nhớ đăng nhập",
|
||||
"incorrect-password": "Mật khẩu không chính xác. Vui lòng thử lại.",
|
||||
"incorrect-totp": "Mật khẩu dùng một lần không chính xác. Vui lòng thử lại.",
|
||||
"incorrect-recovery-code": "Mã khôi phục không chính xác hoặc đã được sử dụng.",
|
||||
"too-many-attempts": "Quá nhiều lần thử đăng nhập. Vui lòng đợi vài phút rồi thử lại.",
|
||||
"connection-error": "Không thể kết nối đến server. Kiểm tra kết nối và thử lại.",
|
||||
"sign_in_with_sso": "Đăng nhập bằng {{ssoIssuerName}}",
|
||||
"sso-wrong-account": "Tài khoản đó không phải là tài khoản được liên kết với phiên bản Trilium này. Hãy đăng nhập bằng tài khoản đã liên kết.",
|
||||
"sso-not-enrolled": "Chưa thiết lập đăng nhập đơn. Hãy đăng nhập bằng mật khẩu trước, sau đó liên kết tài khoản từ cài đặt.",
|
||||
"sso-connection-failed": "Không thể kết nối đến nhà cung cấp xác thực. Thử lại hoặc kiểm tra nhật ký server để biết chi tiết."
|
||||
},
|
||||
"set_password": {
|
||||
"heading": "Đặt mật khẩu",
|
||||
"description": "Trước khi có thể bắt đầu sử dụng Trilium từ web, bạn cần đặt mật khẩu trước. Sau đó, bạn sẽ sử dụng mật khẩu này để đăng nhập.",
|
||||
"password": "Mật khẩu",
|
||||
"password-confirmation": "Xác nhận mật khẩu",
|
||||
"button": "Đặt mật khẩu",
|
||||
"password-too-short": "Mật khẩu phải có ít nhất {{length}} ký tự.",
|
||||
"passwords-dont-match": "Mật khẩu nhập vào không khớp."
|
||||
},
|
||||
"setup": {
|
||||
"heading": "Bắt đầu với Trilium",
|
||||
"new-document": "Cơ sở dữ liệu tri thức mới",
|
||||
"new-document-description": "Bắt đầu với cơ sở dữ liệu tri thức trống và khởi động ngay lập tức.",
|
||||
"sync-from-desktop": "Kết nối ứng dụng desktop",
|
||||
"sync-from-desktop-description": "Bạn chỉ có ứng dụng Trilium desktop đang chạy trên một thiết bị khác. Thiết bị này sẽ đồng bộ dữ liệu từ ứng dụng desktop đó.",
|
||||
"sync-from-server": "Kết nối với server hiện có",
|
||||
"sync-from-server-description": "Bạn có một server Trilium đang chạy ở nơi khác (tự lưu trữ hoặc trên đám mây). Thiết bị này sẽ đồng bộ dữ liệu từ server đó.",
|
||||
"next": "Tiếp theo",
|
||||
"init-in-progress": "Đang khởi tạo tài liệu",
|
||||
"redirecting": "Bạn sẽ được chuyển hướng đến ứng dụng ngay sau đây.",
|
||||
"title": "Cài đặt",
|
||||
"sync-from-server-page-description": "Nhập thông tin server của bạn bên dưới để kết nối không gian làm việc hiện có.",
|
||||
"sync-in-progress-title": "Đang đồng bộ",
|
||||
"sync-in-progress-description": "Thiết bị của bạn đã được kết nối và các mục đang được đồng bộ hóa.",
|
||||
"sync-in-progress-banner": "Quá trình này có thể mất một lúc tùy thuộc vào kích thước các ghi chú của bạn. Vui lòng không chuyển sang ứng dụng khác cho đến khi đồng bộ hoàn tất.",
|
||||
"button-back": "Quay lại",
|
||||
"button-finish-setup": "Hoàn tất cài đat",
|
||||
"sync-step-connecting": "Đang kết nối với server",
|
||||
"sync-step-syncing": "Đang đồng bộ dữ liệu",
|
||||
"sync-step-finalizing": "Đang thiết lập tùy chọn",
|
||||
"create-new-document-options-title": "Bạn muốn bắt đầu như thế nào?",
|
||||
"create-new-document-options-with-demo": "Với nội dung demo",
|
||||
"create-new-document-options-with-demo-description": "Khám phá Trilium với nội dung mẫu.",
|
||||
"create-new-document-options-empty": "Trống",
|
||||
"create-new-document-options-empty-description": "Bắt đầu với cơ sở dữ liệu tri thức trống. Bạn có thể nhập các ghi chú demo sau.",
|
||||
"create-new-document-title": "Đang chuẩn bị cơ sở dữ liệu tri thức của bạn",
|
||||
"create-new-document-description": "Quá trình này chỉ mất một khoảnh khắc.",
|
||||
"create-new-document-failed": "Không thể tạo cơ sở dữ liệu tri thức của bạn",
|
||||
"sync-illustration-this-device": "Thiết bị này",
|
||||
"sync-illustration-desktop-app": "Phần mềm desktop của bạn",
|
||||
"sync-illustration-server": "Server của bạn",
|
||||
"sync-from-desktop-step1": "Mở phiên bản desktop của Trilium Notes.",
|
||||
"sync-from-desktop-step2": "Từ menu Trilium, nhấp vào Options.",
|
||||
"sync-from-desktop-step3": "Nhấp vào danh mục Sync trong cây ghi chú.",
|
||||
"sync-from-desktop-step4": "Thay đổi địa chỉ server instance để trỏ đến một trong các địa chỉ bên phải (hoặc bên dưới trên màn hình hẹp) và nhấp vào Save.",
|
||||
"sync-from-desktop-step5": "Nhấp vào nút \"Test sync\" để xác minh kết nối thành công.",
|
||||
"sync-from-desktop-warning": "Đảm bảo cả hai thiết bị đều ở cùng một mạng.",
|
||||
"sync-from-desktop-waiting": "Đang chờ kết nối...",
|
||||
"sync-from-desktop-unreachable-title": "Thiết bị này không thể được truy cập bởi các thiết bị khác",
|
||||
"sync-from-desktop-unreachable-description": "Để đồng bộ hóa, máy desktop khác phải kết nối đến máy này qua mạng. Vì lý do bảo mật, ứng dụng desktop này chỉ chấp nhận kết nối từ máy tính này, do đó máy desktop khác chưa thể truy cập được. Cho phép truy cập mạng bên dưới — Trilium sẽ khởi động lại để áp dụng.",
|
||||
"sync-from-desktop-allow-access": "Cho phép truy cập mạng & khởi động lại",
|
||||
"advanced-options": "Tùy chọn nâng cao",
|
||||
"sync-failed": "Đồng bộ hóa thất bại: {{- message}}",
|
||||
"sync-failed-title": "Đồng bộ hóa thất bại",
|
||||
"sync-failed-description": "Không thể hoàn tất quá trình đồng bộ hóa ban đầu. Bạn có thể thử lại hoặc quay lại để kiểm tra địa chỉ server và thông tin xác thực.",
|
||||
"sync-failed-admonition-title": "Lần thử đồng bộ hóa cuối cùng đã thất bại",
|
||||
"sync-failed-hint": "Điều này có thể do địa chỉ server không chính xác, proxy can thiệp vào kết nối hoặc server tạm thời không thể truy cập được.",
|
||||
"button-retry": "Thử lại",
|
||||
"server-host": "Địa chỉ server Trilium",
|
||||
"server-host-placeholder": "https://<hostname>:<port>",
|
||||
"server-password": "Mật khẩu",
|
||||
"proxy-server": "Proxy server (tùy chọn)",
|
||||
"proxy-server-placeholder": "https://<hostname>:<port>",
|
||||
"proxy-instruction": "Nếu bạn để trống cài đặt proxy, proxy của hệ thống sẽ được sử dụng.",
|
||||
"dismiss-error": "Bỏ qua lỗi",
|
||||
"wrong-password": "Mật khẩu không chính xác. Vui lòng thử lại.",
|
||||
"language": "Ngôn ngữ",
|
||||
"continue": "Tiếp tục",
|
||||
"your-ip-addresses": "Địa chỉ cho thiết bị này",
|
||||
"existing-data": "Lưu dữ liệu hiện có của bạn?",
|
||||
"existing-data-back-up": "Có, tạo bản sao lưu",
|
||||
"existing-data-skip": "Không, tiếp tục mà không có bản sao lưu",
|
||||
"existing-data-skip-warning": "Chưa có gì bị xóa. Cơ sở dữ liệu tri thức của bạn chỉ bị thay thế khi bạn chọn tạo một cơ sở dữ liệu mới, khôi phục bản sao lưu hoặc đồng bộ hóa từ thiết bị khác.",
|
||||
"existing-data-cancel": "Huỷ",
|
||||
"existing-data-backing-up": "Đang sao lưu",
|
||||
"existing-data-backing-up-message": "Đang tạo bản sao lưu...",
|
||||
"existing-data-backed-up": "Đã tạo bản sao lưu",
|
||||
"existing-data-backed-up-description": "Cơ sở dữ liệu tri thức hiện có của bạn đã được lưu vào tệp bản sao lưu.",
|
||||
"existing-data-file-name": "Tên tệp bản sao lưu",
|
||||
"existing-data-file-path": "Vị trí",
|
||||
"existing-data-open-folder": "Mở thư mục này",
|
||||
"existing-data-save-as": "Lưu bản sao...",
|
||||
"existing-data-download": "Tải xuống",
|
||||
"existing-data-file-size": "Kích thước",
|
||||
"existing-data-backup-failed": "Không thể tạo bản sao lưu.",
|
||||
"backup-data": "Sao lưu dữ liệu Trilium của bạn",
|
||||
"backup-password-repeat": "Nhập lại mật khẩu",
|
||||
"backup-password-description": "Nếu bạn chỉ định mật khẩu, tệp sao lưu sẽ được mã hóa. Hãy giữ mật khẩu ở nơi an toàn: nếu không có nó, không thể khôi phục tệp sao lưu.",
|
||||
"backup-use-stored-password": "Sử dụng mật khẩu bạn đã cấu hình",
|
||||
"backup-use-stored-password-description": "Sử dụng cùng mật khẩu mã hóa mà bạn đã thiết lập trước đó trong Tùy chọn → Sao lưu.",
|
||||
"backup-compress": "Nén tệp sao lưu",
|
||||
"backup-compress-description": "Giúp tệp nhỏ hơn, với chi phí là mất thêm một chút thời gian khi ghi.",
|
||||
"backup-data-description": "Trong phiên bản Standalone của Trilium Notes, các tệp sao lưu được tạo tại chỗ và tải xuống trực tiếp về thiết bị của bạn. Chúng không được lưu ở nơi nào khác, vì vậy hãy đảm bảo bạn đã lưu tệp.",
|
||||
"backup-file": "Tệp sao lưu sẽ được lưu dưới dạng",
|
||||
"backup-download": "Tạo và tải xuống tệp sao lưu",
|
||||
"backup-downloading": "Đang tải xuống...",
|
||||
"backup-downloading-percent": "{{percent}}%",
|
||||
"backup-downloading-size": "({{done}} Của {{total}})",
|
||||
"backup-do-not-close": "Vui lòng không chuyển sang ứng dụng khác hoặc đóng màn hình này cho đến khi quá trình tải xuống hoàn tất.",
|
||||
"backup-downloaded": "Quá trình tải xuống đã hoàn tất. Nhấn \"Hoàn tất\" để quay lại ứng dụng.",
|
||||
"backup-download-failed": "Quá trình tải xuống không hoàn tất.",
|
||||
"backup-finish": "Hoàn tất",
|
||||
"existing-data-erase-confirm": "Cơ sở tri thức hiện có của bạn sẽ bị xóa vĩnh viễn để thiết bị này có thể nhận một cơ sở tri thức từ ứng dụng desktop của bạn. Hãy đảm bảo bạn có một bản sao lưu ở nơi an toàn. Tiếp tục?",
|
||||
"unlock-refused": "Chi tiết đó không được chấp nhận. Vui lòng thử lại.",
|
||||
"keep-existing": "Quay lại ứng dụng",
|
||||
"keep-existing-description": "Tiếp tục sử dụng cơ sở tri thức hiện có và quay lại ứng dụng.",
|
||||
"existing-data-keep-failed": "Không thể mở lại cơ sở tri thức hiện có.",
|
||||
"restore-from-backup": "Khôi phục từ tệp sao lưu",
|
||||
"restore-from-backup-description": "Bắt đầu sử dụng cơ sở tri thức được khôi phục từ tệp sao lưu.",
|
||||
"restore-from-backup-page-description": "Chọn tệp sao lưu để khôi phục.",
|
||||
"restore-existing-backups": "Các bản sao lưu hiện có",
|
||||
"restore-looking-for-backups": "Đang tìm tệp sao lưu...",
|
||||
"restore-choose-file": "Chọn tệp sao lưu",
|
||||
"restore-choose-file-description": "Chọn tệp sao lưu cơ sở dữ liệu (.db, .tnbackup) từ thiết bị của bạn",
|
||||
"restore-uploading": "Đang tải lên tệp sao lưu...",
|
||||
"restore-uploaded-so-far": "{{sent}} Trong số {{total}}",
|
||||
"restore-upload-speed": "{{speed}}/s",
|
||||
"restore-upload-reconnecting": "Đang chờ thiết lập lại kết nối...",
|
||||
"restore-error-unusable": "Sao lưu Trilium không được hỗ trợ hoặc bị hỏng.",
|
||||
"restore-error-too-new": "Sao lưu này từ phiên bản Trilium mới hơn. Hãy cập nhật Trilium và thử lại.",
|
||||
"restore-error-too-old": "Sao lưu này từ phiên bản Trilium quá cũ để khôi phục.",
|
||||
"restore-error-unfinished": "Sao lưu này được tạo từ một cài đặt chưa hoàn tất, do đó không có gì để khôi phục.",
|
||||
"restore-error-swap-failed": "Không thể thay thế cơ sở dữ liệu. Cơ sở dữ liệu trước đó của bạn đã được khôi phục.",
|
||||
"restore-error-swap-failed-reload": "Không thể thay thế cơ sở dữ liệu. Cơ sở dữ liệu trước đó của bạn đã được khôi phục, nhưng Trilium không thể mở lại nó. Hãy tải lại trang này để tiếp tục.",
|
||||
"restore-error-check-failed": "Không thể kiểm tra tệp sao lưu. Đây có thể là vấn đề với thiết bị này chứ không phải với bản thân tệp sao lưu, vì vậy hãy thử lại.",
|
||||
"restore-error-failed": "Việc khôi phục không thể hoàn tất. Không có gì bị thay thế, vì vậy cơ sở tri thức của bạn vẫn nguyên vẹn.",
|
||||
"restore-error-incomplete": "Tệp sao lưu này không đầy đủ. Có thể nó chưa được sao chép hoặc tải xuống hoàn chỉnh, hãy thử chuyển tệp lại.",
|
||||
"restore-error-would-not-open": "Không thể mở cơ sở dữ liệu đã khôi phục. Cơ sở dữ liệu trước đó của bạn đã được khôi phục.",
|
||||
"restore-error-refused": "Một bước cài đặt khác đang chạy.",
|
||||
"restore-error-already-initialized": "Thư mục này đã có cơ sở tri thức, vì vậy không thể khôi phục đè lên. Hãy tải lại trang.",
|
||||
"restore-error-could-not-start": "Không thể bắt đầu khôi phục.",
|
||||
"restore-error-upload-failed": "Không thể tải lên tệp sao lưu.",
|
||||
"restore-error-upload-interrupted": "Việc tải lên bị gián đoạn và không thể tiếp tục. Hãy chọn tệp sao lưu một lần nữa để bắt đầu lại.",
|
||||
"restore-passphrase": "Mật khẩu mã hóa",
|
||||
"restore-passphrase-description": "Tệp sao lưu này đã được mã hóa. Hãy nhập mật khẩu được sử dụng để tạo tệp sao lưu này.",
|
||||
"restore-wrong-passphrase": "Mật khẩu đó không mở được tệp sao lưu này. Vui lòng thử lại.",
|
||||
"restore-continue": "Khôi phục",
|
||||
"restore-stage-staging": "Đang chuẩn bị tệp sao lưu",
|
||||
"restore-stage-validating": "Đang kiểm tra cơ sở dữ liệu",
|
||||
"restore-stage-swapping": "Đang đặt vào vị trí",
|
||||
"restore-stage-migrating": "Đang mở cơ sở dữ liệu",
|
||||
"restore-do-not-close": "Đừng đóng cửa sổ này.",
|
||||
"backup-saved-to": "Tệp sao lưu đã được lưu vào {{- location}}. Nhấn \"Hoàn tất\" để quay lại ứng dụng.",
|
||||
"backup-name-description": "Đặt tên cho bản sao lưu này để bạn dễ nhận ra sau này, hoặc giữ lại tên được gợi ý.",
|
||||
"backup-password": "Mật khẩu (không bắt buộc)",
|
||||
"backup-name": "Tên bản sao lưu"
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -169,7 +169,7 @@ export function SelectTitleOnFirstOpen() {
|
||||
* calendar turns to its date) — instead of navigating the whole tab away from the view. Every
|
||||
* other link keeps meaning what it means anywhere else, as does every way of asking for more than
|
||||
* a plain navigation: a modified click wanting a new tab or window, a link saying how it wants to
|
||||
* be opened — in a popup, at an attachment, at a bookmark, in a named tab.
|
||||
* be opened — in a popup, at an attachment, at a bookmark or a block, in a named tab.
|
||||
*
|
||||
* `onFollowLink` is offered the link's note and answers whether the host took the navigation
|
||||
* over; only then is the link stopped. Captured on the pane's own element, so it goes ahead of
|
||||
@@ -193,7 +193,8 @@ export function useFollowLinksWithin(paneRef: RefObject<HTMLElement | null>, onF
|
||||
// this note" is the pane's to take, and only for a note the host can go to.
|
||||
const { noteId, ntxId, viewScope, openInPopup } = link.parseNavigationStateFromUrl(href);
|
||||
if (!noteId || ntxId || openInPopup || viewScope?.viewMode !== "default"
|
||||
|| viewScope.attachmentId || viewScope.bookmark || !onFollowLink(noteId)) return;
|
||||
|| viewScope.attachmentId || viewScope.bookmark || viewScope.block
|
||||
|| !onFollowLink(noteId)) return;
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
@@ -20,8 +20,8 @@ vi.mock("../../services/i18n", () => ({ t: (key: string) => key }));
|
||||
*/
|
||||
|
||||
/** Renders revision HTML and lets the reference-link lookups (froca, then the icon) settle. */
|
||||
async function renderRevision(content: string) {
|
||||
const container = renderInto(<RevisionContentText content={content} />);
|
||||
async function renderRevision(content: string, noteId = "revisedNote") {
|
||||
const container = renderInto(<RevisionContentText content={content} noteId={noteId} />);
|
||||
await vi.waitFor(() => expect(container.querySelector(".ck-content")).toBeTruthy());
|
||||
return container;
|
||||
}
|
||||
@@ -67,6 +67,22 @@ describe("RevisionContentText", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("labels a reference to a block of the revised note by the text of the block", async () => {
|
||||
const note = buildNote({
|
||||
title: "Revised note",
|
||||
content: "<p data-trilium-block-id=\"b1\">Opening words</p>"
|
||||
});
|
||||
const href = `#root/${note.noteId}?block=b1`;
|
||||
const container = await renderRevision(
|
||||
`<p>before</p><p><a class="reference-link" href="${href}">x</a></p>`,
|
||||
note.noteId
|
||||
);
|
||||
|
||||
const link = container.querySelector("a.reference-link");
|
||||
expect(link).not.toBeNull();
|
||||
await vi.waitFor(() => expect(link?.textContent).toBe("Opening words"));
|
||||
});
|
||||
|
||||
it("leaves a preview without a URL alone rather than rendering an empty card", async () => {
|
||||
const container = await renderRevision('<p>before</p><p><span class="link-mention" data-title="No URL"></span></p>');
|
||||
|
||||
|
||||
@@ -633,7 +633,7 @@ function RevisionContent({ noteContent, revisionItem, fullRevision, showDiff }:
|
||||
}
|
||||
switch (revisionItem.type) {
|
||||
case "text":
|
||||
return <RevisionContentText content={content} />;
|
||||
return <RevisionContentText content={content} noteId={revisionItem.noteId} />;
|
||||
case "code":
|
||||
return <div className="revision-diff-code">{content}</div>;
|
||||
case "image":
|
||||
@@ -669,7 +669,10 @@ function RevisionContent({ noteContent, revisionItem, fullRevision, showDiff }:
|
||||
}
|
||||
}
|
||||
|
||||
export function RevisionContentText({ content }: { content: string | Uint8Array | undefined }) {
|
||||
export function RevisionContentText({ content, noteId }: {
|
||||
content: string | Uint8Array | undefined;
|
||||
noteId: string;
|
||||
}) {
|
||||
const contentRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
// A revision stores what CKEditor's data downcast produced, and two of those constructs carry
|
||||
@@ -682,8 +685,8 @@ export function RevisionContentText({ content }: { content: string | Uint8Array
|
||||
if (!container) return;
|
||||
|
||||
applyLinkEmbeds(container);
|
||||
void applyReferenceLinks(container);
|
||||
}, [content]);
|
||||
void applyReferenceLinks(container, noteId);
|
||||
}, [content, noteId]);
|
||||
|
||||
useEffect(() => {
|
||||
if (contentRef.current?.querySelector("span.math-tex")) {
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
&.doc-url-badge {--color: var(--badge-doc-url-background-color);}
|
||||
&.execute-badge {--color: var(--badge-execute-background-color);}
|
||||
&.snippet-badge {--color: var(--badge-snippet-background-color);}
|
||||
&.excerpt-badge {
|
||||
--color: var(--main-border-color);
|
||||
color: var(--main-text-color);
|
||||
}
|
||||
&.save-status-badge {
|
||||
--default-opacity: 0.4;
|
||||
opacity: var(--default-opacity);
|
||||
|
||||
@@ -28,6 +28,7 @@ import server from "../../services/server";
|
||||
import type SpacedUpdate from "../../services/spaced_update";
|
||||
import { buildNote } from "../../test/easy-froca";
|
||||
import { type SavedData, useEditorSpacedUpdate } from "./hooks";
|
||||
import { noteSavedDataStore } from "./NoteStore";
|
||||
import { ParentComponent } from "./react_utils";
|
||||
|
||||
vi.stubGlobal("logError", vi.fn());
|
||||
@@ -255,3 +256,103 @@ describe("note switch save race (#9614)", () => {
|
||||
expect(flushed).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("editing some blocks of a note", () => {
|
||||
beforeEach(() => {
|
||||
vi.useFakeTimers();
|
||||
currentSpacedUpdate = undefined;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.restoreAllMocks();
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it("reads and replaces the blocks, then the blocks that the last save held", async () => {
|
||||
const note = buildNote({ title: "Blocks", type: "text", content: "<p>Whole</p>" });
|
||||
const read = vi.spyOn(server, "getWithSilentNotFound")
|
||||
.mockImplementation(async (url: string) => ({ content: `<p>${url}</p>` }));
|
||||
const put = vi.spyOn(server, "put").mockResolvedValue({});
|
||||
const { editor, parent, cleanup } = await showBlockEditor(note, "a:b");
|
||||
const url = `notes/${note.noteId}/blocks`;
|
||||
|
||||
expect(editor.content).toBe(`<p>${url}?block=a%3Ab</p>`);
|
||||
expect(noteSavedDataStore.get(note.noteId)).toBeUndefined();
|
||||
|
||||
editor.content = "<p>Edited</p>";
|
||||
editor.block = "a:n";
|
||||
getSpacedUpdate().scheduleUpdate();
|
||||
await vi.advanceTimersByTimeAsync(1500);
|
||||
expect(put).toHaveBeenLastCalledWith(
|
||||
`${url}?block=a%3Ab`, { content: "<p>Edited</p>" }, parent.componentId
|
||||
);
|
||||
expect(noteSavedDataStore.get(note.noteId)).toBeUndefined();
|
||||
|
||||
const loadResults = new LoadResults([]);
|
||||
loadResults.addNoteContent(note.noteId, "another-editor");
|
||||
await act(async () => {
|
||||
await parent.handleEvent("entitiesReloaded", { loadResults });
|
||||
});
|
||||
await vi.advanceTimersByTimeAsync(20);
|
||||
expect(read).toHaveBeenLastCalledWith(`${url}?block=a%3An`);
|
||||
expect(editor.content).toBe(`<p>${url}?block=a%3An</p>`);
|
||||
|
||||
editor.content = "<p>Edited again</p>";
|
||||
editor.block = undefined;
|
||||
getSpacedUpdate().scheduleUpdate();
|
||||
await vi.advanceTimersByTimeAsync(1500);
|
||||
expect(put).toHaveBeenLastCalledWith(
|
||||
`${url}?block=a%3An`, { content: "<p>Edited again</p>" }, parent.componentId
|
||||
);
|
||||
cleanup();
|
||||
});
|
||||
|
||||
it("saves nothing when the blocks cannot be read", async () => {
|
||||
const note = buildNote({ title: "Missing blocks", type: "text", content: "<p>Whole</p>" });
|
||||
vi.spyOn(server, "getWithSilentNotFound").mockRejectedValue(new Error("Not found"));
|
||||
const put = vi.spyOn(server, "put").mockResolvedValue({});
|
||||
const { editor, cleanup } = await showBlockEditor(note, "a:b");
|
||||
|
||||
editor.content = "<p>Typed</p>";
|
||||
getSpacedUpdate().scheduleUpdate();
|
||||
await vi.advanceTimersByTimeAsync(1500);
|
||||
expect(put).not.toHaveBeenCalled();
|
||||
cleanup();
|
||||
});
|
||||
});
|
||||
|
||||
/** Renders an editor of the blocks of `note` that `block` points at. */
|
||||
async function showBlockEditor(note: FNote, block: string) {
|
||||
const editor: { content: string; block: string | undefined } = { content: "", block };
|
||||
const parent = new Component();
|
||||
const container = document.createElement("div");
|
||||
document.body.appendChild(container);
|
||||
|
||||
function BlockEditor() {
|
||||
currentSpacedUpdate = useEditorSpacedUpdate({
|
||||
note,
|
||||
noteContext: null,
|
||||
noteType: "text",
|
||||
block,
|
||||
getData: () => ({ content: editor.content, block: editor.block }),
|
||||
onContentChange(newContent) {
|
||||
editor.content = newContent;
|
||||
}
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
await act(async () => {
|
||||
render(
|
||||
<ParentComponent.Provider value={parent}><BlockEditor /></ParentComponent.Provider>,
|
||||
container
|
||||
);
|
||||
});
|
||||
await vi.advanceTimersByTimeAsync(20);
|
||||
|
||||
const cleanup = () => {
|
||||
render(null, container);
|
||||
container.remove();
|
||||
};
|
||||
return { editor, parent, cleanup };
|
||||
}
|
||||
|
||||
@@ -99,6 +99,8 @@ export function useSpacedUpdate(callback: () => void | Promise<void>, interval =
|
||||
|
||||
export interface SavedData {
|
||||
content: string;
|
||||
/** The blocks that `content` holds, a `block` link parameter, for an editor of some blocks. */
|
||||
block?: string;
|
||||
attachments?: {
|
||||
/** The attachment to update. Without it, the attachment is matched by its title. */
|
||||
attachmentId?: string;
|
||||
@@ -111,7 +113,7 @@ export interface SavedData {
|
||||
}[];
|
||||
}
|
||||
|
||||
export function useEditorSpacedUpdate({ note, noteType, noteContext, getData, onContentChange, dataSaved, updateInterval }: {
|
||||
export function useEditorSpacedUpdate({ note, noteType, noteContext, getData, onContentChange, dataSaved, updateInterval, block }: {
|
||||
noteType: NoteType;
|
||||
note: FNote | null | undefined,
|
||||
noteContext: NoteContext | null | undefined,
|
||||
@@ -119,9 +121,21 @@ export function useEditorSpacedUpdate({ note, noteType, noteContext, getData, on
|
||||
onContentChange: (newContent: string) => void,
|
||||
dataSaved?: (savedData: SavedData) => void,
|
||||
updateInterval?: number;
|
||||
/**
|
||||
* The blocks of the note to edit instead of the whole note, a `block` link parameter. Each
|
||||
* save replaces them, and the blocks that `getData()` reports are the ones the next save
|
||||
* replaces.
|
||||
*/
|
||||
block?: string;
|
||||
}) {
|
||||
const parentComponent = useContext(ParentComponent);
|
||||
const blob = useNoteBlob(note, parentComponent?.componentId, { reportLoadStateTo: noteContext });
|
||||
const blockRef = useRef(block ?? "");
|
||||
const blob = useNoteBlob(note, parentComponent?.componentId, {
|
||||
reportLoadStateTo: noteContext,
|
||||
load: block === undefined
|
||||
? undefined
|
||||
: (loadedNote) => loadBlocks(loadedNote, blockRef.current)
|
||||
});
|
||||
|
||||
// The note whose content is currently loaded in the editor. Editor instances are reused
|
||||
// across note switches, so until the new note's blob arrives the editor still holds the
|
||||
@@ -139,11 +153,17 @@ export function useEditorSpacedUpdate({ note, noteType, noteContext, getData, on
|
||||
|
||||
protected_session_holder.touchProtectedSessionIfNecessary(note);
|
||||
|
||||
await server.put(`notes/${note.noteId}/data`, data, parentComponent?.componentId);
|
||||
|
||||
noteSavedDataStore.set(note.noteId, data.content);
|
||||
if (block === undefined) {
|
||||
await server.put(`notes/${note.noteId}/data`, data, parentComponent?.componentId);
|
||||
noteSavedDataStore.set(note.noteId, data.content);
|
||||
} else {
|
||||
const { block: savedBlock, ...blocks } = data;
|
||||
const url = `notes/${note.noteId}/blocks?block=${encodeURIComponent(blockRef.current)}`;
|
||||
await server.put(url, blocks, parentComponent?.componentId);
|
||||
blockRef.current = savedBlock ?? blockRef.current;
|
||||
}
|
||||
dataSaved?.(data);
|
||||
}, [ note, dataSaved, noteType, parentComponent ]);
|
||||
}, [ note, dataSaved, noteType, parentComponent, block ]);
|
||||
|
||||
const stateCallback = useCallback<StateCallback>((state) => {
|
||||
noteContext?.setContextData("saveState", {
|
||||
@@ -177,7 +197,9 @@ export function useEditorSpacedUpdate({ note, noteType, noteContext, getData, on
|
||||
if (!blob || !note) return;
|
||||
// Changes not saved here yet stay when another editor saves the note, and replace it.
|
||||
if (loadedNoteIdRef.current === note.noteId && spacedUpdate.hasUnsavedChanges()) return;
|
||||
noteSavedDataStore.set(note.noteId, blob.content);
|
||||
if (block === undefined) {
|
||||
noteSavedDataStore.set(note.noteId, blob.content);
|
||||
}
|
||||
spacedUpdate.allowUpdateWithoutChange(() => onContentChange(blob.content));
|
||||
loadedNoteIdRef.current = note.noteId;
|
||||
}, [ blob ]);
|
||||
@@ -218,6 +240,17 @@ export function useSaveBeforeLeaving<T>(
|
||||
}, [ spacedUpdate ]);
|
||||
}
|
||||
|
||||
/** The blocks of `note` that `block` points at, or `null` when they cannot be read. */
|
||||
async function loadBlocks(note: FNote, block: string) {
|
||||
try {
|
||||
return await server.getWithSilentNotFound<{ content: string }>(
|
||||
`notes/${note.noteId}/blocks?block=${encodeURIComponent(block)}`
|
||||
);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function useBlobEditorSpacedUpdate({ note, noteType, noteContext, getData, onContentChange, dataSaved, updateInterval, replaceWithoutRevision }: {
|
||||
noteType: NoteType;
|
||||
note: FNote,
|
||||
@@ -826,7 +859,7 @@ export function useNoteLabelInt(note: FNote | undefined | null, labelName: Filte
|
||||
];
|
||||
}
|
||||
|
||||
export function useNoteBlob(note: FNote | null | undefined, componentId?: string, opts?: {
|
||||
export function useNoteBlob<T extends { content: string } = FBlob>(note: FNote | null | undefined, componentId?: string, opts?: {
|
||||
/** Publish the fetch progress as `contentLoad` context data on the given note context, so
|
||||
* the note detail can show a loading state instead of the previous note's content. Should
|
||||
* only be set by widgets whose main content display is gated on this blob. (Passed
|
||||
@@ -842,8 +875,10 @@ export function useNoteBlob(note: FNote | null | undefined, componentId?: string
|
||||
* produced by a sibling under the same parent component (e.g. the read-only text view behind
|
||||
* the editor), own-component changes are somebody else's edits that must eventually show. */
|
||||
refreshOnShow?: boolean;
|
||||
}): FBlob | null | undefined {
|
||||
const [ blob, setBlob ] = useState<FBlob | null>();
|
||||
/** Reads the content instead of the blob of the note, resolving to `null` when it fails. */
|
||||
load?: (note: FNote) => Promise<T | null>;
|
||||
}): T | null | undefined {
|
||||
const [ blob, setBlob ] = useState<T | null>();
|
||||
const requestIdRef = useRef(0);
|
||||
const missedContentChangeRef = useRef(false);
|
||||
|
||||
@@ -859,7 +894,9 @@ export function useNoteBlob(note: FNote | null | undefined, componentId?: string
|
||||
if (note) {
|
||||
reportLoadState("loading");
|
||||
}
|
||||
const newBlob = await note?.getBlob();
|
||||
const newBlob = note && opts?.load
|
||||
? await opts.load(note)
|
||||
: await note?.getBlob() as T | null | undefined;
|
||||
|
||||
// Only update if this is the latest request.
|
||||
if (requestId === requestIdRef.current) {
|
||||
@@ -917,6 +954,22 @@ export function useSearchTermsConsumer(note: FNote | null | undefined, noteConte
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls `callback` when the note context `ntxId` switches to `note`, the note the widget shows
|
||||
* already, as when a link to a part of the open note is followed.
|
||||
*/
|
||||
export function useSameNoteSwitch(
|
||||
note: FNote | null | undefined,
|
||||
ntxId: string | null | undefined,
|
||||
callback: () => void
|
||||
) {
|
||||
useTriliumEvent("noteSwitched", ({ noteContext }) => {
|
||||
if (noteContext.ntxId === ntxId && noteContext.note?.noteId === note?.noteId) {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function useLegacyWidget<T extends BasicWidget>(widgetFactory: () => T, { noteContext, containerClassName, containerStyle }: {
|
||||
noteContext?: NoteContext;
|
||||
containerClassName?: string;
|
||||
|
||||
@@ -4,12 +4,15 @@ import { useRef } from "preact/hooks";
|
||||
import { act } from "preact/test-utils";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import link from "../../../services/link";
|
||||
import CKEditorWithWatchdog, { type CKEditorApi } from "./CKEditorWithWatchdog";
|
||||
|
||||
const mocks = vi.hoisted(() => ({
|
||||
options: {} as Record<string, string | boolean>,
|
||||
create: vi.fn(async () => {}),
|
||||
destroy: vi.fn(async () => {})
|
||||
destroy: vi.fn(async () => {}),
|
||||
note: undefined as { noteId: string; title: string } | undefined,
|
||||
handlers: {} as Record<string, (...args: unknown[]) => unknown>
|
||||
}));
|
||||
|
||||
vi.mock("@triliumnext/ckeditor5", () => {
|
||||
@@ -34,11 +37,13 @@ vi.mock("@triliumnext/ckeditor5", () => {
|
||||
|
||||
vi.mock("../../react/hooks", () => ({
|
||||
useKeyboardShortcuts: () => {},
|
||||
useLegacyImperativeHandlers: () => {},
|
||||
useLegacyImperativeHandlers: (handlers: typeof mocks.handlers) => {
|
||||
mocks.handlers = handlers;
|
||||
},
|
||||
useNoteContext: () => ({
|
||||
parentComponent: undefined,
|
||||
ntxId: undefined,
|
||||
note: undefined,
|
||||
note: mocks.note,
|
||||
notePath: undefined
|
||||
}),
|
||||
useSyncedRef: (_externalRef: unknown, initialValue: unknown) => useRef(initialValue),
|
||||
@@ -57,6 +62,7 @@ let host: HTMLElement;
|
||||
|
||||
beforeEach(() => {
|
||||
mocks.options = { locale: "en", mathFieldEnabled: true };
|
||||
mocks.note = undefined;
|
||||
mocks.create.mockClear();
|
||||
mocks.destroy.mockClear();
|
||||
host = document.body.appendChild(document.createElement("div"));
|
||||
@@ -110,4 +116,26 @@ describe("CKEditorWithWatchdog", () => {
|
||||
await vi.waitFor(() => expect(mocks.destroy).toHaveBeenCalledOnce());
|
||||
expect(props.watchdogRef.current).toBeNull();
|
||||
});
|
||||
|
||||
it("labels its reference links as links in the note it edits", async () => {
|
||||
mocks.note = { noteId: "host1", title: "Host" };
|
||||
const loadReferenceLinkTitle = vi.spyOn(link, "loadReferenceLinkTitle")
|
||||
.mockResolvedValue(undefined);
|
||||
const props = {
|
||||
contentLanguage: null,
|
||||
watchdogRef: createRef<EditorWatchdog>(),
|
||||
onChange: vi.fn(),
|
||||
editorApi: createRef<CKEditorApi>(),
|
||||
templates: []
|
||||
};
|
||||
await act(async () => {
|
||||
render(<CKEditorWithWatchdog {...props} />, host);
|
||||
});
|
||||
|
||||
const $el = $("<span>");
|
||||
await mocks.handlers.loadReferenceLinkTitle($el, "#root/host1?block=b1");
|
||||
|
||||
expect(loadReferenceLinkTitle).toHaveBeenCalledWith($el, "#root/host1?block=b1", "host1");
|
||||
loadReferenceLinkTitle.mockRestore();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -224,7 +224,7 @@ export default function CKEditorWithWatchdog({ containerRef: externalContainerRe
|
||||
|
||||
useLegacyImperativeHandlers({
|
||||
async loadReferenceLinkTitle($el: JQuery<HTMLElement>, href: string | null = null) {
|
||||
await link.loadReferenceLinkTitle($el, href);
|
||||
await link.loadReferenceLinkTitle($el, href, note?.noteId);
|
||||
},
|
||||
async fetchLinkMetadata(url: string) {
|
||||
// The preview's pictures are stored as attachments of the note being edited, so there
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Tooltip } from "bootstrap";
|
||||
import { render } from "preact";
|
||||
import { act } from "preact/test-utils";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { afterEach, beforeEach, describe, expect, it, onTestFinished, vi } from "vitest";
|
||||
|
||||
const {
|
||||
openTabWithNoteWithHoisting,
|
||||
@@ -21,7 +21,9 @@ const {
|
||||
removeIndividualBinding: vi.fn()
|
||||
}));
|
||||
|
||||
vi.mock("../../../services/i18n", () => ({ t: (key: string) => key }));
|
||||
vi.mock("../../../services/i18n", () => ({
|
||||
t: (key: string, options?: { icon?: string }) => (options?.icon ? `${key} ${options.icon}` : key)
|
||||
}));
|
||||
vi.mock("../../../components/app_context", () => ({
|
||||
default: { tabManager: { openTabWithNoteWithHoisting }, triggerCommand }
|
||||
}));
|
||||
@@ -37,6 +39,7 @@ vi.mock("../../../services/shortcuts", async (importOriginal) => ({
|
||||
removeIndividualBinding
|
||||
}));
|
||||
|
||||
import { registerContentEmbedTools } from "./content_embed_tools";
|
||||
import ContentEmbed, {
|
||||
getNoteActions,
|
||||
type ContentEmbedProps,
|
||||
@@ -156,6 +159,41 @@ function rightClick(target: Element | null) {
|
||||
return { opened, isTaken: event.defaultPrevented && stopPropagation.mock.calls.length > 0 };
|
||||
}
|
||||
|
||||
/** Tools of content with an editable mode, which adds the Editable toggle to its embed. */
|
||||
const EDITABLE_TOOLS = {
|
||||
hasEditableFlag: true,
|
||||
getTools: () => [],
|
||||
execute: () => {},
|
||||
subscribe: () => () => {}
|
||||
};
|
||||
|
||||
/**
|
||||
* Moves the box into an embed of a text editor, whose `ContentEmbed` plugin selects the embed for
|
||||
* the commands it runs.
|
||||
*/
|
||||
function placeInHostEditor() {
|
||||
const selectEmbedAt = vi.fn((_element: Element) => true);
|
||||
const execute = vi.fn();
|
||||
const focus = vi.fn();
|
||||
const editable = document.createElement("div");
|
||||
editable.className = "ck-editor__editable";
|
||||
Object.assign(editable, {
|
||||
ckeditorInstance: {
|
||||
plugins: { get: () => ({ selectEmbedAt }) },
|
||||
execute,
|
||||
editing: { view: { focus } }
|
||||
}
|
||||
});
|
||||
const embed = document.createElement("figure");
|
||||
embed.className = "include-note";
|
||||
editable.append(embed);
|
||||
embed.append(container);
|
||||
document.body.append(editable);
|
||||
onTestFinished(() => editable.remove());
|
||||
|
||||
return { editor: { selectEmbedAt, execute, focus }, embed };
|
||||
}
|
||||
|
||||
/** Clicks `target` and tells whether the click was kept from what surrounds the box. */
|
||||
function click(target: HTMLElement) {
|
||||
const event = new MouseEvent("click", { bubbles: true, cancelable: true });
|
||||
@@ -185,6 +223,23 @@ describe("ContentEmbed", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("lays out an excerpt with an edit button in place of fullscreen", () => {
|
||||
const excerpt = [ "title", "badges", "open", "edit", "menu" ];
|
||||
const layouts: [ string, string[] ][] = [
|
||||
[ "small", excerpt ],
|
||||
[ "medium", excerpt ],
|
||||
[ "full", excerpt ],
|
||||
[ "expandable", [ "toggle", ...excerpt ] ]
|
||||
];
|
||||
|
||||
for (const [ boxSize, expected ] of layouts) {
|
||||
act(() => render(null, container));
|
||||
renderBox({ boxSize, isExcerpt: true });
|
||||
expect(titleRow(), boxSize).toEqual(expected.map((name) => `include-note-${name}`));
|
||||
expect(container.querySelector(".include-note-fullscreen-controls")).toBeNull();
|
||||
}
|
||||
});
|
||||
|
||||
it("shows its title and content, and swaps them on a new render", () => {
|
||||
const titleChildren = () => [
|
||||
...container.querySelector("h4.include-note-title")?.childNodes ?? []
|
||||
@@ -257,6 +312,87 @@ describe("ContentEmbed", () => {
|
||||
.toHaveBeenCalledWith("owner", { below: menu }, ATTACHMENT_SCOPE);
|
||||
});
|
||||
|
||||
it("marks an excerpt, with the icon of the button that opens the whole note", () => {
|
||||
renderBox({ viewScope: { block: "blockA:blockB" }, isExcerpt: true });
|
||||
const badge = container.querySelector<HTMLElement>(".include-note-badges > .excerpt-badge");
|
||||
expect(badge?.textContent).toBe("block_reference.excerpt");
|
||||
expect(titleRow()).toContain("include-note-badges");
|
||||
|
||||
const tooltip = badge ? Tooltip.getInstance(badge) : null;
|
||||
act(() => tooltip?.show());
|
||||
const tooltipText = document.querySelector(".tooltip-inner");
|
||||
expect(tooltipText?.textContent?.trim()).toBe("block_reference.excerpt_description");
|
||||
expect(tooltipText?.querySelector(".bx.bx-link-external")).not.toBeNull();
|
||||
expect(button("include-note-open").className).toContain("bx-link-external");
|
||||
act(() => tooltip?.hide());
|
||||
|
||||
for (const viewScope of [ undefined, ATTACHMENT_SCOPE ]) {
|
||||
act(() => render(null, container));
|
||||
renderBox({ viewScope });
|
||||
expect(container.querySelector(".excerpt-badge")).toBeNull();
|
||||
}
|
||||
});
|
||||
|
||||
it("turns the editing of an excerpt on and off through the editor around it", async () => {
|
||||
const { editor, embed } = placeInHostEditor();
|
||||
const { content } = renderBox({ boxSize: "medium", isExcerpt: true });
|
||||
const edit = button("include-note-edit");
|
||||
expect(edit.className).toContain("bx-pencil");
|
||||
expect(tooltipOf(edit)).toBe("block_reference.edit_excerpt");
|
||||
expect(edit.disabled).toBe(true);
|
||||
|
||||
let unregister = () => {};
|
||||
act(() => {
|
||||
unregister = registerContentEmbedTools(content, EDITABLE_TOOLS);
|
||||
});
|
||||
expect(edit.disabled).toBe(false);
|
||||
expect(edit.classList.contains("active")).toBe(false);
|
||||
|
||||
expect(click(edit).isStopped).toBe(true);
|
||||
expect(editor.selectEmbedAt).toHaveBeenCalledWith(contentBox());
|
||||
expect(editor.execute).toHaveBeenCalledWith("toggleContentEmbedEditable");
|
||||
expect(document.activeElement).toBe(contentBox());
|
||||
|
||||
await act(async () => {
|
||||
embed.dataset.editable = "true";
|
||||
});
|
||||
expect(edit.classList.contains("active")).toBe(true);
|
||||
click(edit);
|
||||
expect(editor.execute).toHaveBeenCalledTimes(2);
|
||||
expect(editor.focus).toHaveBeenCalledOnce();
|
||||
|
||||
act(() => unregister());
|
||||
expect(edit.disabled).toBe(true);
|
||||
expect(edit.classList.contains("active")).toBe(false);
|
||||
});
|
||||
|
||||
it("keeps the edit button of an excerpt disabled without an editor around it", () => {
|
||||
const { content } = renderBox({ boxSize: "medium", isExcerpt: true });
|
||||
act(() => {
|
||||
onTestFinished(registerContentEmbedTools(content, EDITABLE_TOOLS));
|
||||
});
|
||||
|
||||
expect(button("include-note-edit").disabled).toBe(true);
|
||||
});
|
||||
|
||||
it("opens an expandable excerpt to edit it, and focuses it once shown", () => {
|
||||
placeInHostEditor();
|
||||
const { content } = renderBox({ boxSize: "expandable", isExcerpt: true });
|
||||
act(() => {
|
||||
onTestFinished(registerContentEmbedTools(content, EDITABLE_TOOLS));
|
||||
});
|
||||
const box = contentBox();
|
||||
const isHiddenOnFocus: boolean[] = [];
|
||||
box.addEventListener("focus", () => isHiddenOnFocus.push(box.hasAttribute("hidden")));
|
||||
expect(box.hidden).toBe(true);
|
||||
|
||||
click(button("include-note-edit"));
|
||||
|
||||
expect(box.hidden).toBe(false);
|
||||
expect(document.activeElement).toBe(box);
|
||||
expect(isHiddenOnFocus).toEqual([ false ]);
|
||||
});
|
||||
|
||||
it("gives its content the screen, and takes it back from the overlay button", async () => {
|
||||
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
|
||||
const exitFullscreen = vi.fn<() => Promise<void>>(async () => {});
|
||||
|
||||
@@ -10,10 +10,15 @@ import { t } from "../../../services/i18n";
|
||||
import type { ViewScope } from "../../../services/link";
|
||||
import { removeIndividualBinding } from "../../../services/shortcuts";
|
||||
import ActionButton from "../../react/ActionButton";
|
||||
import { Badge } from "../../react/Badge";
|
||||
import { useFocusWithin } from "../../react/hooks";
|
||||
import Icon from "../../react/Icon";
|
||||
import OverlayControlGroup, { OverlayControlButton } from "../../react/OverlayControlGroup";
|
||||
import { type ContentEmbedEvent, showContentEmbedFullscreen } from "./content_embed_tools";
|
||||
import {
|
||||
type ContentEmbedEvent, getContentEmbedTools, showContentEmbedFullscreen,
|
||||
useIsContentEmbedEditable, watchContentEmbedTools
|
||||
} from "./content_embed_tools";
|
||||
import { findTextEditorAround } from "./editable_embed";
|
||||
|
||||
/** An action on the embedded note or attachment, offered as a button in the title row. */
|
||||
export interface ContentEmbedAction {
|
||||
@@ -32,6 +37,8 @@ export interface ContentEmbedProps {
|
||||
/** The note opened by the buttons in the title row. */
|
||||
notePath: string;
|
||||
viewScope?: ViewScope;
|
||||
/** Whether the embed shows only some blocks of its note, from a block reference. */
|
||||
isExcerpt?: boolean;
|
||||
/** Gives the focus to the content once mounted, as for a canvas drawing just added. */
|
||||
isFocusedOnMount?: boolean;
|
||||
}
|
||||
@@ -51,7 +58,7 @@ export interface TinyContentEmbedProps {
|
||||
|
||||
/** The title row and the content of an embedded note or attachment. */
|
||||
export default function ContentEmbed({
|
||||
boxSize, title, content, contentType, notePath, viewScope, isFocusedOnMount
|
||||
boxSize, title, content, contentType, notePath, viewScope, isExcerpt, isFocusedOnMount
|
||||
}: ContentEmbedProps) {
|
||||
const contentRef = useRef<HTMLDivElement>(null);
|
||||
const bodyRef = useRef<HTMLDivElement>(null);
|
||||
@@ -60,8 +67,9 @@ export default function ContentEmbed({
|
||||
useFullscreenEvents(contentRef);
|
||||
useWindowShortcuts(contentRef);
|
||||
const [ isExpanded, setIsExpanded ] = useState(false);
|
||||
const focusContentAfterRender = useFocusAfterRender(contentRef);
|
||||
const isExpandable = boxSize === "expandable";
|
||||
const hasFullscreen = boxSize === "medium" || boxSize === "full";
|
||||
const hasFullscreen = !isExcerpt && (boxSize === "medium" || boxSize === "full");
|
||||
|
||||
useLayoutEffect(() => {
|
||||
contentRef.current?.append(content);
|
||||
@@ -99,11 +107,24 @@ export default function ContentEmbed({
|
||||
)}
|
||||
<ContentEmbedTitle title={title} />
|
||||
{/* The content of the embed puts badges here, such as its save status. */}
|
||||
<div className="note-badges include-note-badges" />
|
||||
<div className="note-badges include-note-badges">
|
||||
{isExcerpt && <ExcerptBadge />}
|
||||
</div>
|
||||
<ContentEmbedActionButton
|
||||
className="include-note-open"
|
||||
action={getOpenInNewTabAction(notePath, viewScope)}
|
||||
/>
|
||||
{isExcerpt && (
|
||||
<ExcerptEditButton
|
||||
contentRef={contentRef}
|
||||
content={content}
|
||||
onEdit={() => {
|
||||
setIsExpanded(true);
|
||||
// `useEditableEmbed()` focuses the editor once it renders.
|
||||
focusContentAfterRender();
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
{hasFullscreen && (
|
||||
<ActionButton
|
||||
className="include-note-fullscreen"
|
||||
@@ -206,7 +227,7 @@ export function getNoteActions(notePath: string): ContentEmbedAction[] {
|
||||
function getOpenInNewTabAction(notePath: string, viewScope?: ViewScope): ContentEmbedAction {
|
||||
return {
|
||||
title: t("common.open_in_new_tab"),
|
||||
icon: "bx bx-link-external",
|
||||
icon: OPEN_IN_NEW_TAB_ICON,
|
||||
run: async () => {
|
||||
await appContext.tabManager.openTabWithNoteWithHoisting(notePath, {
|
||||
viewScope,
|
||||
@@ -217,6 +238,97 @@ function getOpenInNewTabAction(notePath: string, viewScope?: ViewScope): Content
|
||||
};
|
||||
}
|
||||
|
||||
const OPEN_IN_NEW_TAB_ICON = "bx bx-link-external";
|
||||
|
||||
/** Marks an embed that shows only some blocks of its note, a block reference. */
|
||||
function ExcerptBadge() {
|
||||
return (
|
||||
<Badge
|
||||
className="excerpt-badge"
|
||||
icon="bx bx-crop"
|
||||
text={t("block_reference.excerpt")}
|
||||
tooltip={t("block_reference.excerpt_description", {
|
||||
icon: `<span class="${OPEN_IN_NEW_TAB_ICON}"></span>`
|
||||
})}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns the editing of an excerpt on and off, as the Editable toggle of its embed does. Disabled
|
||||
* while the content has no editable mode, as in a read-only note or for blocks that cannot be
|
||||
* edited in place. Turning editing on runs `onEdit`, and turning it off focuses the editor around.
|
||||
*/
|
||||
function ExcerptEditButton({ contentRef, content, onEdit }: {
|
||||
contentRef: RefObject<HTMLDivElement | null>;
|
||||
content: HTMLElement;
|
||||
onEdit: () => void;
|
||||
}) {
|
||||
const isEditing = useIsContentEmbedEditable(contentRef);
|
||||
const hasEditableMode = useHasEditableMode(contentRef, content);
|
||||
|
||||
return (
|
||||
<ActionButton
|
||||
className="include-note-edit"
|
||||
icon="bx bx-pencil"
|
||||
text={t("block_reference.edit_excerpt")}
|
||||
active={hasEditableMode && isEditing}
|
||||
disabled={!hasEditableMode}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
const box = contentRef.current;
|
||||
const editor = findTextEditorAround(box);
|
||||
if (!box || !editor?.plugins.get("ContentEmbed").selectEmbedAt(box)) return;
|
||||
|
||||
editor.execute("toggleContentEmbedEditable");
|
||||
if (isEditing) {
|
||||
editor.editing.view.focus();
|
||||
} else {
|
||||
onEdit();
|
||||
}
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the content in `contentRef` has an editable mode, which it tells by adding the Editable
|
||||
* toggle to its embed, and a text editor holds the embed to turn it on. Checked again for new
|
||||
* `content`, which can add the toggle before it is in the box.
|
||||
*/
|
||||
function useHasEditableMode(contentRef: RefObject<HTMLElement | null>, content: HTMLElement) {
|
||||
const [ hasEditableMode, setHasEditableMode ] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const box = contentRef.current;
|
||||
if (!box) return;
|
||||
|
||||
const update = () => setHasEditableMode(
|
||||
!!getContentEmbedTools(box)?.hasEditableFlag && !!findTextEditorAround(box)
|
||||
);
|
||||
update();
|
||||
return watchContentEmbedTools(box, update);
|
||||
}, [ contentRef, content ]);
|
||||
|
||||
return hasEditableMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a function that focuses the element in `ref` once the render it schedules is committed,
|
||||
* so that a state change made with it, such as one that shows the element, applies first.
|
||||
*/
|
||||
function useFocusAfterRender(ref: RefObject<HTMLElement | null>) {
|
||||
const [ requestCount, setRequestCount ] = useState(0);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
if (requestCount) {
|
||||
ref.current?.focus({ preventScroll: true });
|
||||
}
|
||||
}, [ ref, requestCount ]);
|
||||
|
||||
return () => setRequestCount((count) => count + 1);
|
||||
}
|
||||
|
||||
const FOCUSABLE_SELECTOR = "[tabindex], a[href], iframe, webview, "
|
||||
+ ":is(button, input, select, textarea):not(:disabled)";
|
||||
|
||||
@@ -256,10 +368,6 @@ function ContentEmbedActionButton({ className, action }: {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the menu of the embed for a right click on its title row. The title link is left to the
|
||||
* handler of every link, which opens the same menu, or a quick edit with Ctrl.
|
||||
*/
|
||||
/**
|
||||
* Runs the window shortcuts, such as switching tabs, from inside the content. The text editor
|
||||
* keeps the keys pressed in an embed from the document, where these shortcuts listen.
|
||||
@@ -351,6 +459,10 @@ function useFullscreenEvents(contentRef: RefObject<HTMLElement | null>) {
|
||||
}, [ contentRef ]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the menu of the embed for a right click on its title row. The title link is left to the
|
||||
* handler of every link, which opens the same menu, or a quick edit with Ctrl.
|
||||
*/
|
||||
function openMenuOnRightClick(e: MouseEvent, notePath: string, viewScope?: ViewScope) {
|
||||
if (e.target instanceof Element && e.target.closest("a")) {
|
||||
return;
|
||||
|
||||
@@ -29,10 +29,13 @@ vi.mock("@triliumnext/ckeditor5", () => ({}));
|
||||
|
||||
const {
|
||||
applyPendingAttachmentChanges,
|
||||
getBlockData,
|
||||
notifyAttachmentChanges,
|
||||
onNotificationInfo,
|
||||
onNotificationWarning,
|
||||
showFileUploadProgress
|
||||
revealLinkTargetWhenReady,
|
||||
showFileUploadProgress,
|
||||
watchEditorBlocks
|
||||
} = await import("./EditableText");
|
||||
|
||||
describe("onNotificationWarning", () => {
|
||||
@@ -208,3 +211,72 @@ describe("notifyAttachmentChanges", () => {
|
||||
expect(updateAttachmentLinks).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe("getBlockData", () => {
|
||||
it("reads all of the content, with the blocks at its edges", () => {
|
||||
const getRange = vi.fn()
|
||||
.mockReturnValueOnce({ startId: "a", endId: "n" })
|
||||
.mockReturnValueOnce(null);
|
||||
const getData = vi.fn(() => "<p data-trilium-block-id=\"a\"> </p>");
|
||||
const editor = {
|
||||
getData,
|
||||
plugins: { get: () => ({ getRange }) }
|
||||
} as unknown as CKTextEditor;
|
||||
|
||||
expect(getBlockData(editor, "a:b")).toEqual({
|
||||
content: "<p data-trilium-block-id=\"a\"> </p>",
|
||||
block: "a:n"
|
||||
});
|
||||
expect(getData).toHaveBeenCalledWith({ trim: "none" });
|
||||
expect(getRange).toHaveBeenCalledWith({ startId: "a", endId: "b" });
|
||||
expect(getBlockData(editor, "a").block).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe("watchEditorBlocks", () => {
|
||||
it("reports the blocks of the editor each time they change", () => {
|
||||
const getRange = vi.fn();
|
||||
const editor = { plugins: { get: () => ({ getRange }) } } as unknown as CKTextEditor;
|
||||
const onBlockChange = vi.fn();
|
||||
const report = watchEditorBlocks("a:b", onBlockChange);
|
||||
|
||||
for (const range of [
|
||||
{ startId: "a", endId: "b" },
|
||||
{ startId: "a", endId: "n" },
|
||||
{ startId: "a", endId: "n" },
|
||||
null,
|
||||
{ startId: "a", endId: "b" }
|
||||
]) {
|
||||
getRange.mockReturnValueOnce(range);
|
||||
report(editor);
|
||||
}
|
||||
|
||||
expect(onBlockChange.mock.calls).toEqual([ [ "a:n" ], [ "a:b" ] ]);
|
||||
expect(getRange).toHaveBeenCalledWith({ startId: "a", endId: "b" });
|
||||
});
|
||||
});
|
||||
|
||||
describe("revealLinkTargetWhenReady", () => {
|
||||
it("reveals a bookmark or blocks once the editor is ready, as in a new tab", async () => {
|
||||
vi.spyOn(window, "requestAnimationFrame").mockImplementation((callback) => {
|
||||
callback(0);
|
||||
return 0;
|
||||
});
|
||||
const reveal = vi.fn();
|
||||
let markReady = () => {};
|
||||
const ready = new Promise<void>((resolve) => {
|
||||
markReady = resolve;
|
||||
});
|
||||
|
||||
revealLinkTargetWhenReady({ block: "a:b" }, ready, reveal);
|
||||
revealLinkTargetWhenReady({ bookmark: "intro" }, ready, reveal);
|
||||
revealLinkTargetWhenReady({ viewMode: "default" }, ready, reveal);
|
||||
await Promise.resolve();
|
||||
expect(reveal).not.toHaveBeenCalled();
|
||||
|
||||
markReady();
|
||||
await ready;
|
||||
await Promise.resolve();
|
||||
expect(reveal).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -9,16 +9,19 @@ import {
|
||||
type FileUploadEvent,
|
||||
SnippetDefinition
|
||||
} from "@triliumnext/ckeditor5";
|
||||
import { deferred } from "@triliumnext/commons";
|
||||
import { deferred, formatBlockRange, parseBlockRange } from "@triliumnext/commons";
|
||||
import { createPortal } from "preact";
|
||||
import { useCallback, useEffect, useRef, useState } from "preact/hooks";
|
||||
|
||||
import appContext from "../../../components/app_context";
|
||||
import {
|
||||
consumeBlockReference, copyBlockReference, openBlockHandleMenu
|
||||
} from "../../../services/block_reference";
|
||||
import { consumeBookmark } from "../../../services/bookmark_jump";
|
||||
import { getUploadBoxSize } from "../../../services/content_renderer";
|
||||
import dialog from "../../../services/dialog";
|
||||
import { t } from "../../../services/i18n";
|
||||
import link, { parseNavigationStateFromUrl } from "../../../services/link";
|
||||
import link, { parseNavigationStateFromUrl, type ViewScope } from "../../../services/link";
|
||||
import type LoadResults from "../../../services/load_results";
|
||||
import note_create from "../../../services/note_create";
|
||||
import options from "../../../services/options";
|
||||
@@ -26,7 +29,10 @@ import { consumeSearchTerms } from "../../../services/search_jump";
|
||||
import toast from "../../../services/toast";
|
||||
import utils, { isMobile } from "../../../services/utils";
|
||||
import type { IconPickerOpts } from "../../dialogs/icon_picker";
|
||||
import { useEditorSpacedUpdate, useLegacyImperativeHandlers, useNoteLabel, useSearchTermsConsumer, useTriliumEvent, useTriliumOption, useTriliumOptionBool } from "../../react/hooks";
|
||||
import {
|
||||
useEditorSpacedUpdate, useLegacyImperativeHandlers, useNoteLabel, useSameNoteSwitch,
|
||||
useSearchTermsConsumer, useTriliumEvent, useTriliumOption, useTriliumOptionBool
|
||||
} from "../../react/hooks";
|
||||
import IconPicker from "../../react/IconPicker";
|
||||
import { setEditorNoteId } from "../../react/NoteStore";
|
||||
import { TypeWidgetProps } from "../type_widget";
|
||||
@@ -53,7 +59,16 @@ import {
|
||||
* - Ballon block mode, in which there is a floating toolbar for the selected text, but another floating button for the entire block (i.e. paragraph).
|
||||
* - Decoupled mode, in which the editing toolbar is actually added on the client side (in {@link ClassicEditorToolbar}), see https://ckeditor.com/docs/ckeditor5/latest/examples/framework/bottom-toolbar-editor.html for an example on how the decoupled editor works.
|
||||
*/
|
||||
export default function EditableText({ note, parentComponent, ntxId, noteContext }: TypeWidgetProps) {
|
||||
interface EditableTextProps extends TypeWidgetProps {
|
||||
/** The blocks of the note to edit instead of the whole note, a `block` link parameter. */
|
||||
block?: string;
|
||||
/** Receives the blocks that the editor of `block` holds, each time they change. */
|
||||
onBlockChange?: (block: string) => void;
|
||||
}
|
||||
|
||||
export default function EditableText({
|
||||
note, parentComponent, ntxId, noteContext, isVisible, block, onBlockChange
|
||||
}: EditableTextProps) {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const contentRef = useRef<string>("");
|
||||
/** The note `contentRef` holds the content of, so a restarted editor can be marked as holding it. */
|
||||
@@ -76,6 +91,9 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
textNoteEditorType
|
||||
});
|
||||
const initialized = useRef(deferred<void>());
|
||||
const [ reportBlocks ] = useState(() => (block !== undefined && onBlockChange
|
||||
? watchEditorBlocks(block, onBlockChange)
|
||||
: undefined));
|
||||
const [ attachmentSaves ] = useState(() =>
|
||||
new AttachmentSaves(() => spacedUpdate.scheduleUpdate()));
|
||||
const noteEditor = useNoteEditor(noteContext);
|
||||
@@ -85,6 +103,7 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
note,
|
||||
noteContext,
|
||||
noteType: "text",
|
||||
block,
|
||||
getData() {
|
||||
const editor = watchdogRef.current?.editor;
|
||||
if (!editor) {
|
||||
@@ -92,14 +111,18 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
return;
|
||||
}
|
||||
|
||||
const content = editor.getData() ?? "";
|
||||
const attachments = attachmentSaves.collect();
|
||||
const savedAttachments = attachments.length ? { attachments } : {};
|
||||
if (block !== undefined) {
|
||||
return { ...getBlockData(editor as CKTextEditor, block), ...savedAttachments };
|
||||
}
|
||||
|
||||
const content = editor.getData() ?? "";
|
||||
// if content is only tags/whitespace (typically <p> </p>), then just make it empty,
|
||||
// this is important when setting a new note to code
|
||||
return {
|
||||
content: utils.isHtmlEmpty(content) ? "" : content,
|
||||
...(attachments.length ? { attachments } : {})
|
||||
...savedAttachments
|
||||
};
|
||||
},
|
||||
onContentChange(newContent) {
|
||||
@@ -119,13 +142,10 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
// Jump to the first search match when navigated from search results.
|
||||
consumeSearchTerms(noteContext, ntxId, initialized.current);
|
||||
|
||||
// Scroll to bookmark anchor if navigated with ?bookmark=...
|
||||
const viewScope = noteContext?.viewScope;
|
||||
if (viewScope?.bookmark) {
|
||||
requestAnimationFrame(() => {
|
||||
consumeBookmark(watchdogRef.current?.editor?.editing.view.getDomRoot(), viewScope);
|
||||
});
|
||||
}
|
||||
// Scroll to the bookmark or the blocks a link points at.
|
||||
revealLinkTargetWhenReady(
|
||||
noteContext?.viewScope, initialized.current, revealLinkTarget
|
||||
);
|
||||
},
|
||||
dataSaved(savedData) {
|
||||
// Store back the saved data in order to retrieve it in case the CKEditor crashes.
|
||||
@@ -137,6 +157,28 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
const templates = useTemplates();
|
||||
|
||||
useSearchTermsConsumer(note, noteContext, ntxId);
|
||||
// A hidden widget leaves the link target to the one on display.
|
||||
useSameNoteSwitch(note, ntxId, () => {
|
||||
if (isVisible !== false && contentNoteIdRef.current === note?.noteId) {
|
||||
revealLinkTarget();
|
||||
}
|
||||
});
|
||||
|
||||
function revealLinkTarget() {
|
||||
const root = watchdogRef.current?.editor?.editing.view.getDomRoot();
|
||||
consumeBookmark(root, noteContext?.viewScope);
|
||||
consumeBlockReference(root, noteContext?.viewScope);
|
||||
}
|
||||
|
||||
async function copyReference() {
|
||||
const editor = watchdogRef.current?.editor as CKTextEditor | undefined;
|
||||
if (!editor) return;
|
||||
|
||||
const notePath = noteContext?.notePath ?? `root/${note.noteId}`;
|
||||
await copyBlockReference(editor, notePath, note.title);
|
||||
// Saved now, so that the link resolves in other notes at once.
|
||||
spacedUpdate.updateNowIfNecessary();
|
||||
}
|
||||
|
||||
useTriliumEvent("scrollToEnd", () => {
|
||||
const editor = watchdogRef.current?.editor;
|
||||
@@ -205,8 +247,18 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
editorApi: editorApiRef.current,
|
||||
});
|
||||
},
|
||||
loadEmbeddedNote(noteId: string, $el: JQuery<HTMLElement>, boxSize?: string) {
|
||||
return loadEmbeddedNote(noteId, $el, boxSize, { noteEditor: embedNoteEditor });
|
||||
loadEmbeddedNote(
|
||||
noteId: string,
|
||||
$el: JQuery<HTMLElement>,
|
||||
boxSize?: string,
|
||||
embedBlock?: string,
|
||||
onBlockChange?: (block: string) => void
|
||||
) {
|
||||
return loadEmbeddedNote(noteId, $el, boxSize, {
|
||||
noteEditor: embedNoteEditor,
|
||||
block: embedBlock,
|
||||
onBlockChange
|
||||
});
|
||||
},
|
||||
loadEmbeddedAttachment(attachmentId: string, $el: JQuery<HTMLElement>, boxSize?: string) {
|
||||
const isFocused = focusedAttachmentIdRef.current === attachmentId;
|
||||
@@ -227,6 +279,10 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
},
|
||||
getEmbedBoxSize: getUploadBoxSize,
|
||||
openContentEmbedMenu,
|
||||
openBlockHandleMenu(event: MouseEvent, count: number) {
|
||||
openBlockHandleMenu(event, count, () => void copyReference());
|
||||
},
|
||||
copyBlockReference: copyReference,
|
||||
getContentEmbedTools,
|
||||
// Link preview functionality. The insert flow itself lives in the editor (a balloon form),
|
||||
// so the host only has to supply the metadata and the rendering.
|
||||
@@ -546,7 +602,13 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
onNotificationWarning={onNotificationWarning}
|
||||
onNotificationInfo={onNotificationInfo}
|
||||
onWatchdogStateChange={onWatchdogStateChange}
|
||||
onChange={() => spacedUpdate.scheduleUpdate()}
|
||||
onChange={() => {
|
||||
spacedUpdate.scheduleUpdate();
|
||||
const editor = watchdogRef.current?.editor;
|
||||
if (editor) {
|
||||
reportBlocks?.(editor as CKTextEditor);
|
||||
}
|
||||
}}
|
||||
onEditorInitialized={(editor) => {
|
||||
if (containerRef.current) {
|
||||
setupImageOpening(containerRef.current, false);
|
||||
@@ -560,6 +622,9 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
editor.plugins.get("FileUploadEditing")
|
||||
.on<FileUploadEvent>("upload", showFileUploadProgress);
|
||||
|
||||
if (block !== undefined) {
|
||||
editor.plugins.get("BlockReferenceEditing").editRange();
|
||||
}
|
||||
initialized.current.resolve();
|
||||
// Restore the data, either on the first render or if the editor crashes.
|
||||
// We are not using CKEditor's built-in watch dog content, instead we are using the data we store regularly in the spaced update (see `dataSaved`).
|
||||
@@ -584,6 +649,56 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The content of an editor of the blocks of a note that `block` points at, and the blocks it holds
|
||||
* now. An empty editor still holds a block, whose id keeps the place of the blocks in the note.
|
||||
*/
|
||||
export function getBlockData(editor: CKTextEditor, block: string) {
|
||||
return {
|
||||
content: editor.getData({ trim: "none" }),
|
||||
block: getEditorBlocks(editor, block)
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls `onBlockChange()` with the blocks that an editor of the blocks `block` holds, each time
|
||||
* they differ from the blocks it reported last.
|
||||
*
|
||||
* Exported for testing.
|
||||
*/
|
||||
export function watchEditorBlocks(block: string, onBlockChange: (block: string) => void) {
|
||||
let reportedBlock = block;
|
||||
return (editor: CKTextEditor) => {
|
||||
const editorBlock = getEditorBlocks(editor, block);
|
||||
if (editorBlock && editorBlock !== reportedBlock) {
|
||||
reportedBlock = editorBlock;
|
||||
onBlockChange(editorBlock);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls `reveal()` to scroll to the bookmark or the blocks that `viewScope` points at, once
|
||||
* `ready` resolves. The editor of a new tab can still be starting when the content arrives.
|
||||
*
|
||||
* Exported for testing.
|
||||
*/
|
||||
export function revealLinkTargetWhenReady(
|
||||
viewScope: ViewScope | undefined,
|
||||
ready: Promise<unknown>,
|
||||
reveal: () => void
|
||||
) {
|
||||
if (viewScope?.bookmark || viewScope?.block) {
|
||||
void ready.then(() => requestAnimationFrame(reveal));
|
||||
}
|
||||
}
|
||||
|
||||
/** The blocks that an editor of the blocks `block` holds, preferring the ids of `block`. */
|
||||
function getEditorBlocks(editor: CKTextEditor, block: string) {
|
||||
const range = editor.plugins.get("BlockReferenceEditing").getRange(parseBlockRange(block));
|
||||
return range ? formatBlockRange(range) : undefined;
|
||||
}
|
||||
|
||||
/** The number of icons per row of the picker in the editor's balloon. */
|
||||
const ICON_PICKER_COLUMNS = 9;
|
||||
|
||||
|
||||
@@ -33,13 +33,18 @@ import ReadOnlyText from "./ReadOnlyText";
|
||||
// Imported by ReadOnlyText only for its content styles; irrelevant (and heavy) in happy-dom.
|
||||
vi.mock("@triliumnext/ckeditor5", () => ({}));
|
||||
|
||||
const { watchContentEmbeds, stopWatchingEmbeds } = vi.hoisted(() => {
|
||||
const { watchContentEmbeds, stopWatchingEmbeds, loadEmbeddedNote } = vi.hoisted(() => {
|
||||
const stop = vi.fn();
|
||||
return { watchContentEmbeds: vi.fn(() => stop), stopWatchingEmbeds: stop };
|
||||
return {
|
||||
watchContentEmbeds: vi.fn(() => stop),
|
||||
stopWatchingEmbeds: stop,
|
||||
loadEmbeddedNote: vi.fn(async () => {})
|
||||
};
|
||||
});
|
||||
vi.mock("./utils", async (importOriginal) => ({
|
||||
...await importOriginal<typeof import("./utils")>(),
|
||||
watchContentEmbeds
|
||||
watchContentEmbeds,
|
||||
loadEmbeddedNote
|
||||
}));
|
||||
|
||||
vi.stubGlobal("logError", vi.fn());
|
||||
@@ -247,6 +252,114 @@ describe("ReadOnlyText ?bookmark= handling", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("ReadOnlyText ?block= handling", () => {
|
||||
let cleanupContainer: HTMLElement | undefined;
|
||||
|
||||
afterEach(() => {
|
||||
const mounted = cleanupContainer;
|
||||
if (mounted) {
|
||||
act(() => render(null, mounted));
|
||||
mounted.remove();
|
||||
cleanupContainer = undefined;
|
||||
}
|
||||
});
|
||||
|
||||
async function mountWithBlock(block: string | undefined, isVisible = true) {
|
||||
const scrollIntoView = vi.fn();
|
||||
Element.prototype.scrollIntoView = scrollIntoView;
|
||||
const note = buildNote({
|
||||
title: "Blocks",
|
||||
type: "text",
|
||||
content: "<p data-trilium-block-id=\"b1\">One</p>"
|
||||
+ "<p data-trilium-block-id=\"b2\">Two</p>"
|
||||
});
|
||||
const parent = new Component();
|
||||
const noteContext = new NoteContext("block-ntx");
|
||||
noteContext.noteId = note.noteId;
|
||||
noteContext.viewScope = { block };
|
||||
|
||||
const container = document.createElement("div");
|
||||
document.body.appendChild(container);
|
||||
cleanupContainer = container;
|
||||
await act(async () => {
|
||||
render(
|
||||
<ParentComponent.Provider value={parent}>
|
||||
<ReadOnlyText
|
||||
note={note}
|
||||
noteContext={noteContext}
|
||||
ntxId={noteContext.ntxId}
|
||||
parentComponent={parent}
|
||||
viewScope={noteContext.viewScope}
|
||||
isVisible={isVisible}
|
||||
/>
|
||||
</ParentComponent.Provider>,
|
||||
container
|
||||
);
|
||||
});
|
||||
const isBlockKept = noteContext.viewScope?.block === block;
|
||||
await act(async () => {});
|
||||
|
||||
return { parent, noteContext, container, scrollIntoView, isBlockKept };
|
||||
}
|
||||
|
||||
it("reveals the referenced block once the content renders", async () => {
|
||||
const { noteContext, container, scrollIntoView, isBlockKept } = await mountWithBlock("b2");
|
||||
|
||||
expect(isBlockKept).toBe(true);
|
||||
expect(noteContext.viewScope?.block).toBeUndefined();
|
||||
expect(scrollIntoView.mock.contexts)
|
||||
.toEqual([ container.querySelector("[data-trilium-block-id='b2']") ]);
|
||||
});
|
||||
|
||||
it("reveals a block of the open note when a link to it is followed", async () => {
|
||||
const { parent, noteContext, container, scrollIntoView } = await mountWithBlock("b2");
|
||||
const otherContext = new NoteContext("other-ntx");
|
||||
otherContext.noteId = noteContext.noteId;
|
||||
|
||||
noteContext.viewScope = { block: "b1" };
|
||||
await act(async () => {
|
||||
await parent.handleEvent("noteSwitched", { noteContext: otherContext, notePath: "" });
|
||||
});
|
||||
expect(noteContext.viewScope?.block).toBe("b1");
|
||||
|
||||
await act(async () => {
|
||||
await parent.handleEvent("noteSwitched", { noteContext, notePath: "" });
|
||||
});
|
||||
expect(noteContext.viewScope?.block).toBeUndefined();
|
||||
expect(scrollIntoView.mock.contexts.at(-1))
|
||||
.toBe(container.querySelector("[data-trilium-block-id='b1']"));
|
||||
});
|
||||
|
||||
it("labels a link to a block of its note by the text of the block", async () => {
|
||||
const harness = setupHarness({ isVisible: true });
|
||||
cleanupContainer = harness.container;
|
||||
const content = "<p data-trilium-block-id=\"b1\">Opening words</p>"
|
||||
+ `<p><a class="reference-link" href="#root/${harness.note.noteId}?block=b1">x</a></p>`;
|
||||
harness.note.getBlob = async () => ({ content }) as never;
|
||||
|
||||
await harness.mount();
|
||||
|
||||
const link = harness.container.querySelector("a.reference-link");
|
||||
expect(link).not.toBeNull();
|
||||
await vi.waitFor(() => expect(link?.textContent).toBe("Opening words"));
|
||||
});
|
||||
|
||||
it("leaves a link to a block of its note to the editor while hidden", async () => {
|
||||
const { parent, noteContext, container, scrollIntoView } = await mountWithBlock(
|
||||
undefined,
|
||||
false
|
||||
);
|
||||
expect(container.querySelector("[data-trilium-block-id='b1']")).not.toBeNull();
|
||||
|
||||
noteContext.viewScope = { block: "b1" };
|
||||
await act(async () => {
|
||||
await parent.handleEvent("noteSwitched", { noteContext, notePath: "" });
|
||||
});
|
||||
expect(noteContext.viewScope?.block).toBe("b1");
|
||||
expect(scrollIntoView).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* The direction is resolved from the note's `#language` label and handed to the content
|
||||
* element as `dir`, which is what the RTL rules in the content stylesheets key off (they
|
||||
@@ -300,4 +413,20 @@ describe("ReadOnlyText embedded notes", () => {
|
||||
harness.container.remove();
|
||||
expect(stopWatchingEmbeds).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it("loads an embed with the blocks it shows", async () => {
|
||||
loadEmbeddedNote.mockClear();
|
||||
const harness = setupHarness({ isVisible: true });
|
||||
harness.note.getBlob = async () => ({
|
||||
content: "<figure class=\"include-note\" data-note-id=\"src1\""
|
||||
+ " data-block=\"b1:b2\"></figure>"
|
||||
}) as never;
|
||||
|
||||
await harness.mount();
|
||||
|
||||
expect(loadEmbeddedNote)
|
||||
.toHaveBeenCalledWith("src1", expect.anything(), undefined, { block: "b1:b2" });
|
||||
await act(async () => render(null, harness.container));
|
||||
harness.container.remove();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -10,6 +10,7 @@ import { useEffect, useLayoutEffect, useMemo, useRef as usePreactRef } from "pre
|
||||
|
||||
import appContext from "../../../components/app_context";
|
||||
import FNote from "../../../entities/fnote";
|
||||
import { consumeBlockReference } from "../../../services/block_reference";
|
||||
import { consumeBookmark } from "../../../services/bookmark_jump";
|
||||
import { applyInlineMermaid, rewriteMermaidDiagramsInContainer } from "../../../services/content_renderer_text";
|
||||
import { applyLinkEmbeds } from "../../../services/link_embed";
|
||||
@@ -18,7 +19,10 @@ import { trackPendingRender } from "../../../services/pending_renders";
|
||||
import { consumeSearchTerms } from "../../../services/search_jump";
|
||||
import { formatCodeBlocks } from "../../../services/syntax_highlight";
|
||||
import { isContentRightToLeft } from "../../../utils/formatters";
|
||||
import { useNoteBlob, useNoteLabel, useSearchTermsConsumer, useSyncedRef, useTriliumEvent, useTriliumOption, useTriliumOptionBool } from "../../react/hooks";
|
||||
import {
|
||||
useNoteBlob, useNoteLabel, useSameNoteSwitch, useSearchTermsConsumer, useSyncedRef,
|
||||
useTriliumEvent, useTriliumOption, useTriliumOptionBool
|
||||
} from "../../react/hooks";
|
||||
import { RawHtmlBlock } from "../../react/RawHtml";
|
||||
import { TypeWidgetProps } from "../type_widget";
|
||||
import { applyReferenceLinks } from "./read_only_helper";
|
||||
@@ -43,13 +47,26 @@ export default function ReadOnlyText({ note, noteContext, ntxId, parentComponent
|
||||
});
|
||||
const { isRtl } = useNoteLanguage(note);
|
||||
const readOnlyContentRef = usePreactRef<HTMLDivElement>(null);
|
||||
const renderedNoteIdRef = usePreactRef<string | undefined>(undefined);
|
||||
|
||||
// Scroll to bookmark anchor if navigated with ?bookmark=... The blob gate skips the mount run,
|
||||
// Scroll to the bookmark or the blocks a link points at. The blob gate skips the mount run,
|
||||
// which fires against an empty container while the content is still loading.
|
||||
useEffect(() => {
|
||||
if (!blob) return;
|
||||
consumeBookmark(readOnlyContentRef.current, noteContext?.viewScope);
|
||||
renderedNoteIdRef.current = note.noteId;
|
||||
revealLinkTarget();
|
||||
}, [blob]);
|
||||
// A hidden widget leaves the link target to the one on display.
|
||||
useSameNoteSwitch(note, ntxId, () => {
|
||||
if (isVisible !== false && renderedNoteIdRef.current === note.noteId) {
|
||||
revealLinkTarget();
|
||||
}
|
||||
});
|
||||
|
||||
function revealLinkTarget() {
|
||||
consumeBookmark(readOnlyContentRef.current, noteContext?.viewScope);
|
||||
consumeBlockReference(readOnlyContentRef.current, noteContext?.viewScope);
|
||||
}
|
||||
|
||||
// Jump to the first search match when navigated from search results.
|
||||
useEffect(() => {
|
||||
@@ -61,6 +78,7 @@ export default function ReadOnlyText({ note, noteContext, ntxId, parentComponent
|
||||
<>
|
||||
<ReadOnlyTextContent
|
||||
html={blob?.content ?? ""}
|
||||
noteId={note.noteId}
|
||||
ntxId={ntxId}
|
||||
dir={isRtl ? "rtl" : "ltr"}
|
||||
contentRef={readOnlyContentRef}
|
||||
@@ -72,6 +90,8 @@ export default function ReadOnlyText({ note, noteContext, ntxId, parentComponent
|
||||
interface ReadOnlyTextContentProps {
|
||||
/** CKEditor-compatible HTML to render. */
|
||||
html: string;
|
||||
/** The note `html` belongs to. Reference links to its own blocks show only their text. */
|
||||
noteId?: string;
|
||||
/** Note context id — enables `contentElRefreshed` / `executeWithContentElement` integrations when provided. */
|
||||
ntxId?: string | null;
|
||||
dir?: "ltr" | "rtl";
|
||||
@@ -87,7 +107,9 @@ interface ReadOnlyTextContentProps {
|
||||
* titles, code-block syntax highlighting, and image click handling. Transforms re-run
|
||||
* whenever `html` changes.
|
||||
*/
|
||||
export function ReadOnlyTextContent({ html, ntxId, dir, className, contentRef: externalContentRef }: ReadOnlyTextContentProps) {
|
||||
export function ReadOnlyTextContent({
|
||||
html, noteId, ntxId, dir, className, contentRef: externalContentRef
|
||||
}: ReadOnlyTextContentProps) {
|
||||
const contentRef = useSyncedRef(externalContentRef);
|
||||
const [ codeBlockWordWrap ] = useTriliumOptionBool("codeBlockWordWrap");
|
||||
const [ codeBlockTabWidth ] = useTriliumOption("codeBlockTabWidth");
|
||||
@@ -117,13 +139,13 @@ export function ReadOnlyTextContent({ html, ntxId, dir, className, contentRef: e
|
||||
applyInlineMermaid(container),
|
||||
applyContentEmbeds(container),
|
||||
applyLinkEmbeds(container),
|
||||
applyReferenceLinks(container),
|
||||
applyReferenceLinks(container, noteId),
|
||||
formatCodeBlocks($(container))
|
||||
]));
|
||||
|
||||
applyMath(container);
|
||||
setupImageOpening(container, true);
|
||||
}, [ html, ntxId, contentRef ]);
|
||||
}, [ html, noteId, ntxId, contentRef ]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!contentRef.current) return;
|
||||
@@ -168,11 +190,11 @@ function applyContentEmbeds(container: HTMLDivElement) {
|
||||
const loaded: Promise<unknown>[] = [];
|
||||
const embeddedNotes = container.querySelectorAll<HTMLElement>(".include-note");
|
||||
for (const embeddedNote of embeddedNotes) {
|
||||
const { attachmentId, noteId } = embeddedNote.dataset;
|
||||
const { attachmentId, noteId, block } = embeddedNote.dataset;
|
||||
if (attachmentId) {
|
||||
loaded.push(loadEmbeddedAttachment(attachmentId, $(embeddedNote)));
|
||||
} else if (noteId) {
|
||||
loaded.push(loadEmbeddedNote(noteId, $(embeddedNote)));
|
||||
loaded.push(loadEmbeddedNote(noteId, $(embeddedNote), undefined, { block }));
|
||||
}
|
||||
}
|
||||
return Promise.all(loaded);
|
||||
|
||||
@@ -25,6 +25,7 @@ let editorData = "";
|
||||
|
||||
/** The text editor, which has a spec of its own. It listens for what a real editor listens for. */
|
||||
vi.mock("./EditableText", () => ({
|
||||
getBlockData: () => ({ content: editorData }),
|
||||
default: (props: TypeWidgetProps) => {
|
||||
const isNested = useContext(NestedEmbedContext);
|
||||
editorProps({ ...props, isNested });
|
||||
@@ -157,7 +158,8 @@ describe("TextEmbed", () => {
|
||||
await new Promise((resolve) => setTimeout(resolve, 50));
|
||||
});
|
||||
expect(shownPreview()).toBe("<div><p>Typed just now</p></div>");
|
||||
expect(renderPreview).toHaveBeenCalledExactlyOnceWith("<p>Typed just now</p>");
|
||||
expect(renderPreview)
|
||||
.toHaveBeenCalledExactlyOnceWith("<p>Typed just now</p>", undefined);
|
||||
|
||||
// Once the last save lands, the preview follows what the note holds.
|
||||
note.getBlob = async () => buildBlob("<p>Saved</p>");
|
||||
@@ -272,6 +274,35 @@ describe("TextEmbed", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("edits the blocks it shows, and follows the blocks that its editor holds", async () => {
|
||||
const note = buildTextNote("blocks");
|
||||
const renderPreview = vi.fn(async (content: string) => buildPreview(content));
|
||||
const onBlockChange = vi.fn();
|
||||
const { figure } = await mount(note, buildEditor(), {
|
||||
isEditable: true, renderPreview, block: "a:b", onBlockChange
|
||||
});
|
||||
const lastEditorProps = () => editorProps.mock.lastCall?.[0] as {
|
||||
block?: string;
|
||||
onBlockChange?: (block: string) => void;
|
||||
};
|
||||
await vi.waitFor(() => expect(editorProps).toHaveBeenCalled(), { timeout: 5000 });
|
||||
expect(lastEditorProps().block).toBe("a:b");
|
||||
|
||||
// The embed follows new blocks at the edges of the editor while it is open.
|
||||
act(() => lastEditorProps().onBlockChange?.("a:n"));
|
||||
expect(onBlockChange).toHaveBeenCalledExactlyOnceWith("a:n");
|
||||
expect(lastEditorProps().block).toBe("a:n");
|
||||
|
||||
editorData = "<p>Blocks and a new one</p>";
|
||||
await act(async () => {
|
||||
delete figure.dataset.editable;
|
||||
await Promise.resolve();
|
||||
});
|
||||
await vi.waitFor(() => {
|
||||
expect(renderPreview).toHaveBeenLastCalledWith("<p>Blocks and a new one</p>", "a:n");
|
||||
});
|
||||
});
|
||||
|
||||
it("loads the note once the save of the editor it replaces lands", async () => {
|
||||
const note = buildTextNote("redrawn");
|
||||
const countEditors = () =>
|
||||
@@ -313,9 +344,11 @@ interface MountOptions {
|
||||
isEditable?: boolean;
|
||||
/** Whether the editor around the embed has a fixed toolbar, rather than a floating one. */
|
||||
hasFixedToolbar?: boolean;
|
||||
renderPreview?: (content: string) => Promise<HTMLElement>;
|
||||
renderPreview?: (content: string, block?: string) => Promise<HTMLElement>;
|
||||
/** The content that the host read for the embed, instead of the content of the note. */
|
||||
content?: string;
|
||||
block?: string;
|
||||
onBlockChange?: (block: string) => void;
|
||||
}
|
||||
|
||||
/** Renders `TextEmbed` in the markup of an embed, as the host does. */
|
||||
@@ -351,8 +384,10 @@ async function mount(note: FNote, editor: ContentEditor | undefined, options: Mo
|
||||
note={note}
|
||||
editor={editor}
|
||||
content={content}
|
||||
block={options.block}
|
||||
preview={options.preview ?? buildPreview(content)}
|
||||
renderPreview={options.renderPreview ?? (async (html) => buildPreview(html))}
|
||||
onBlockChange={options.onBlockChange}
|
||||
/>
|
||||
</ParentComponent.Provider>,
|
||||
box
|
||||
|
||||
@@ -17,10 +17,14 @@ interface TextEmbedProps {
|
||||
editor: ContentEditor | undefined;
|
||||
/** The content of the note that `preview` shows. */
|
||||
content: string;
|
||||
/** The blocks of the note that the embed shows, a `block` link parameter. */
|
||||
block?: string;
|
||||
/** The rendered note. */
|
||||
preview: HTMLElement;
|
||||
/** Renders the note with `content`, after a change. */
|
||||
renderPreview: (content: string) => Promise<HTMLElement>;
|
||||
/** Renders `content`, or its blocks that `block` points at, after a change. */
|
||||
renderPreview: (content: string, block?: string) => Promise<HTMLElement>;
|
||||
/** Points the embed at the blocks that its editor holds, each time they change. */
|
||||
onBlockChange?: (block: string) => void;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -28,7 +32,8 @@ interface TextEmbedProps {
|
||||
* Editable toggle of its embed is on.
|
||||
*/
|
||||
export default function TextEmbed({
|
||||
note, editor, content: initialContent, preview, renderPreview
|
||||
note, editor, content: initialContent, block: initialBlock, preview, renderPreview,
|
||||
onBlockChange
|
||||
}: TextEmbedProps) {
|
||||
const rootRef = useRef<HTMLDivElement>(null);
|
||||
const { isEditing } = useEditableEmbed(rootRef, {
|
||||
@@ -37,8 +42,13 @@ export default function TextEmbed({
|
||||
focusTarget: ".ck-editor__editable"
|
||||
});
|
||||
const [ content, onEditorClose ] = useShownContent(note, initialContent);
|
||||
const [ block, setBlock ] = useState(initialBlock);
|
||||
const onEditorBlockChange = useCallback((editorBlock: string) => {
|
||||
setBlock(editorBlock);
|
||||
onBlockChange?.(editorBlock);
|
||||
}, [ onBlockChange ]);
|
||||
const shownPreview =
|
||||
useEmbedPreview(preview, content, () => renderPreview(content), isEditing);
|
||||
useEmbedPreview(preview, content, () => renderPreview(content, block), isEditing);
|
||||
|
||||
return (
|
||||
<EditableEmbedContent
|
||||
@@ -49,6 +59,8 @@ export default function TextEmbed({
|
||||
>
|
||||
<TextEmbedEditor
|
||||
note={note}
|
||||
block={block}
|
||||
onBlockChange={onEditorBlockChange}
|
||||
hasFixedToolbar={isEditing && hasFixedToolbarAround(rootRef.current)}
|
||||
onClose={onEditorClose}
|
||||
/>
|
||||
|
||||
@@ -11,12 +11,16 @@ import {
|
||||
} from "../../EmbeddedNotePane";
|
||||
import { SaveStatusBadge } from "../../layout/NoteBadges";
|
||||
import { useLegacyComponentElement, useNoteContext } from "../../react/hooks";
|
||||
import EditableText from "./EditableText";
|
||||
import EditableText, { getBlockData } from "./EditableText";
|
||||
import { findTextEditorIn, NestedEmbedContext, useEmbedBadgeSlot } from "./editable_embed";
|
||||
import { getClosingSave, trackClosingSave } from "./TextEmbed";
|
||||
|
||||
interface TextEmbedEditorProps {
|
||||
note: FNote;
|
||||
/** The blocks of the note to edit, a `block` link parameter. The whole note when left out. */
|
||||
block?: string;
|
||||
/** Receives the blocks that the editor of `block` holds, each time they change. */
|
||||
onBlockChange?: (block: string) => void;
|
||||
/** Whether the editor around the embed has a fixed toolbar, rather than a floating one. */
|
||||
hasFixedToolbar: boolean;
|
||||
/**
|
||||
@@ -30,7 +34,9 @@ interface TextEmbedEditorProps {
|
||||
* The text editor of a text note in an embed. It has a note context and a component of its own,
|
||||
* as the note pane of a geo map does, and saves the note as a note tab does.
|
||||
*/
|
||||
export default function TextEmbedEditor({ note, hasFixedToolbar, onClose }: TextEmbedEditorProps) {
|
||||
export default function TextEmbedEditor({
|
||||
note, block, onBlockChange, hasFixedToolbar, onClose
|
||||
}: TextEmbedEditorProps) {
|
||||
// The embed shows its preview until the editor that it replaces has saved the note.
|
||||
const closingSave = getClosingSave(note.noteId);
|
||||
if (closingSave) throw closingSave;
|
||||
@@ -48,16 +54,24 @@ export default function TextEmbedEditor({ note, hasFixedToolbar, onClose }: Text
|
||||
// A layout cleanup runs while the editor is still mounted, so it saves what is left.
|
||||
useLayoutEffect(() => () => {
|
||||
const save = trackClosingSave(note.noteId, saveWhatIsLeft(component, noteContext, ntxId));
|
||||
const content = findTextEditorIn(rootRef.current)?.getData();
|
||||
if (content !== undefined) {
|
||||
onCloseRef.current(content, save);
|
||||
}
|
||||
const editor = findTextEditorIn(rootRef.current);
|
||||
if (!editor) return;
|
||||
|
||||
const content = block === undefined
|
||||
? editor.getData()
|
||||
: getBlockData(editor, block).content;
|
||||
onCloseRef.current(content, save);
|
||||
}, [ component, noteContext, ntxId ]);
|
||||
|
||||
return (
|
||||
<EmbeddedNoteScope component={component} noteContext={noteContext}>
|
||||
<NestedEmbedContext.Provider value={true}>
|
||||
<ScopedEditor rootRef={rootRef} note={note} />
|
||||
<ScopedEditor
|
||||
rootRef={rootRef}
|
||||
note={note}
|
||||
block={block}
|
||||
onBlockChange={onBlockChange}
|
||||
/>
|
||||
</NestedEmbedContext.Provider>
|
||||
</EmbeddedNoteScope>
|
||||
);
|
||||
@@ -66,10 +80,12 @@ export default function TextEmbedEditor({ note, hasFixedToolbar, onClose }: Text
|
||||
interface ScopedEditorProps {
|
||||
rootRef: RefObject<HTMLDivElement | null>;
|
||||
note: FNote;
|
||||
block: string | undefined;
|
||||
onBlockChange: ((block: string) => void) | undefined;
|
||||
}
|
||||
|
||||
/** The editor, once the note context of the embed holds `note`. */
|
||||
function ScopedEditor({ rootRef, note }: ScopedEditorProps) {
|
||||
function ScopedEditor({ rootRef, note, block, onBlockChange }: ScopedEditorProps) {
|
||||
const { note: contextNote, noteContext, ntxId, parentComponent } = useNoteContext();
|
||||
// The plugins of the editor find their host by the element of its component.
|
||||
useLegacyComponentElement(rootRef);
|
||||
@@ -84,6 +100,8 @@ function ScopedEditor({ rootRef, note }: ScopedEditorProps) {
|
||||
ntxId={ntxId ?? null}
|
||||
parentComponent={parentComponent}
|
||||
viewScope={noteContext.viewScope}
|
||||
block={block}
|
||||
onBlockChange={onBlockChange}
|
||||
/>
|
||||
)}
|
||||
{badgeSlot && createPortal(<SaveStatusBadge />, badgeSlot)}
|
||||
|
||||
@@ -617,4 +617,17 @@ describe("CK config - disabled plugins", () => {
|
||||
expect(enabled.removePlugins).not.toContain("TriliumEmojiMention");
|
||||
expect(enabled.removePlugins).not.toContain("TriliumSlashCommands");
|
||||
});
|
||||
|
||||
it("removes the block drag handle in the mobile layout", async () => {
|
||||
const originalDevice = window.glob.device;
|
||||
try {
|
||||
window.glob.device = "desktop";
|
||||
expect((await buildConfig(baseOpts())).removePlugins).not.toContain("BlockDragHandle");
|
||||
|
||||
window.glob.device = "mobile";
|
||||
expect((await buildConfig(baseOpts())).removePlugins).toContain("BlockDragHandle");
|
||||
} finally {
|
||||
window.glob.device = originalDevice;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -12,7 +12,7 @@ import options from "../../../services/options.js";
|
||||
import { sanitizeNoteContentHtml } from "../../../services/sanitize_content.js";
|
||||
import { ensureMimeTypesForHighlighting, isSyntaxHighlightEnabled } from "../../../services/syntax_highlight.js";
|
||||
import { getTaskStateDefinitions, openCustomTaskStateConfig } from "../../../services/task_states.js";
|
||||
import { isMac, openInAppHelpFromUrl } from "../../../services/utils.js";
|
||||
import { isMac, isMobile, openInAppHelpFromUrl } from "../../../services/utils.js";
|
||||
import { resolveContentLanguage } from "../../../utils/formatters.js";
|
||||
import SAMPLE_DIAGRAMS from "../mermaid/sample_diagrams.js";
|
||||
import buildAiAssistantStream, { type AiNoteLocationProvider, buildAiAssistantQuickActions } from "./ai_assistant_stream.js";
|
||||
@@ -463,5 +463,10 @@ function getDisabledPlugins() {
|
||||
disabledPlugins.push("TriliumSlashCommands");
|
||||
}
|
||||
|
||||
// The mobile layout leaves no margin beside the blocks for the drag handle.
|
||||
if (isMobile()) {
|
||||
disabledPlugins.push("BlockDragHandle");
|
||||
}
|
||||
|
||||
return disabledPlugins;
|
||||
}
|
||||
|
||||
@@ -60,19 +60,17 @@ export function registerContentEmbedTools(
|
||||
provider: ContentEmbedToolProvider
|
||||
) {
|
||||
providers.set(element, provider);
|
||||
for (const { container, callback } of watchers) {
|
||||
if (container.contains(element)) {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
notifyWatchers(element);
|
||||
return () => {
|
||||
providers.delete(element);
|
||||
notifyWatchers(element);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls `callback` when content inside `container` adds its buttons, as a canvas drawing does
|
||||
* once it renders after its embed was selected. Stops when the returned function is called.
|
||||
* Calls `callback` when content inside `container` adds or removes its buttons, as a canvas
|
||||
* drawing adds them once it renders after its embed was selected. Stops when the returned function
|
||||
* is called.
|
||||
*/
|
||||
export function watchContentEmbedTools(container: HTMLElement, callback: () => void) {
|
||||
const watcher = { container, callback };
|
||||
@@ -92,6 +90,14 @@ export function getContentEmbedTools(embed: HTMLElement) {
|
||||
return null;
|
||||
}
|
||||
|
||||
function notifyWatchers(element: HTMLElement) {
|
||||
for (const { container, callback } of watchers) {
|
||||
if (container.contains(element)) {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Shows the content box of the embed that contains `element` in fullscreen. */
|
||||
export function showContentEmbedFullscreen(element: Element | null) {
|
||||
element?.closest(".include-note-content")?.requestFullscreen().catch((error: unknown) => {
|
||||
|
||||
@@ -193,8 +193,12 @@ export function useEmbedBadgeSlot(rootRef: RefObject<HTMLElement | null>, isShow
|
||||
* rather than in a floating one.
|
||||
*/
|
||||
export function hasFixedToolbarAround(element: HTMLElement | null) {
|
||||
const editable = element?.closest<EditorRootElement>(EDITOR_ROOT_SELECTOR);
|
||||
return !!editable?.ckeditorInstance?.ui.view.toolbar;
|
||||
return !!findTextEditorAround(element)?.ui.view.toolbar;
|
||||
}
|
||||
|
||||
/** The text editor whose editable root contains `element`, as the editor around an embed. */
|
||||
export function findTextEditorAround(element: HTMLElement | null) {
|
||||
return element?.closest<EditorRootElement>(EDITOR_ROOT_SELECTOR)?.ckeditorInstance;
|
||||
}
|
||||
|
||||
/** The text editor whose editable root is in `element`, as the editor of an included note. */
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
import link from "../../../services/link";
|
||||
|
||||
export async function applyReferenceLinks(container: HTMLDivElement | HTMLElement) {
|
||||
/** Fills the reference links in `container`, which shows content of `hostNoteId` if given. */
|
||||
export async function applyReferenceLinks(
|
||||
container: HTMLDivElement | HTMLElement,
|
||||
hostNoteId?: string
|
||||
) {
|
||||
const referenceLinks = container.querySelectorAll<HTMLDivElement>("a.reference-link");
|
||||
for (const referenceLink of referenceLinks) {
|
||||
await link.loadReferenceLinkTitle($(referenceLink));
|
||||
await link.loadReferenceLinkTitle($(referenceLink), null, hostNoteId);
|
||||
|
||||
// Wrap in a <span> to match the design while in CKEditor.
|
||||
const spanEl = document.createElement("span");
|
||||
|
||||
@@ -134,7 +134,8 @@ describe("loadEmbeddedNote", () => {
|
||||
title,
|
||||
content,
|
||||
contentType: "pdf",
|
||||
notePath: "noteY"
|
||||
notePath: "noteY",
|
||||
isExcerpt: false
|
||||
});
|
||||
});
|
||||
|
||||
@@ -175,6 +176,42 @@ describe("loadEmbeddedNote", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("loadEmbeddedNote of blocks", () => {
|
||||
it("shows only the blocks, and opens the note at them", async () => {
|
||||
const wrapper = createWrapper();
|
||||
const figure = inPage(document.createElement("figure"));
|
||||
figure.className = "include-note";
|
||||
figure.dataset.boxSize = "tiny";
|
||||
|
||||
const onBlockChange = vi.fn();
|
||||
await loadEmbeddedNote("noteY", $(wrapper), "medium", { block: "b1:b2", onBlockChange });
|
||||
|
||||
const viewScope = { block: "b1:b2" };
|
||||
expect(link.createLink)
|
||||
.toHaveBeenCalledWith("noteY", expect.objectContaining({ viewScope }));
|
||||
expect(content_renderer.getRenderedContent).toHaveBeenCalledWith(note,
|
||||
expect.objectContaining({ block: "b1:b2", onBlockChange }));
|
||||
expect(lastMount().props).toMatchObject({ viewScope, isExcerpt: true });
|
||||
|
||||
await loadEmbeddedNote("noteY", $(figure), undefined, { block: "b1" });
|
||||
|
||||
expect(lastMount().type).toBe(TinyContentEmbed);
|
||||
expect(lastMount().props.viewScope).toEqual({ block: "b1" });
|
||||
expect(lastMount().container.classList.contains("excerpt")).toBe(true);
|
||||
});
|
||||
|
||||
it("marks the wrapper of an excerpt, and unmarks it for a whole note", async () => {
|
||||
const wrapper = createWrapper();
|
||||
|
||||
await loadEmbeddedNote("noteY", $(wrapper), "medium", { block: "b1" });
|
||||
expect(wrapper.className).toBe("include-note-wrapper excerpt");
|
||||
|
||||
await loadEmbeddedNote("noteY", $(wrapper), "medium");
|
||||
expect(wrapper.className).toBe("include-note-wrapper");
|
||||
expect(lastMount().props.isExcerpt).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("loadEmbeddedAttachment", () => {
|
||||
it("mounts a box with the attachment, opened in its note", async () => {
|
||||
const wrapper = createWrapper();
|
||||
@@ -337,7 +374,7 @@ describe("refreshEmbeddedNote", () => {
|
||||
it("reloads every embed of the note, of either element", async () => {
|
||||
const container = inPage(document.createElement("div"));
|
||||
container.innerHTML = `<figure class="include-note" data-note-id="noteY"></figure>`
|
||||
+ `<section class="include-note" data-note-id="noteY"></section>`
|
||||
+ `<section class="include-note" data-note-id="noteY" data-block="b1"></section>`
|
||||
+ `<figure class="include-note" data-note-id="other"></figure>`;
|
||||
const [ figure, section ] = [ ...container.children ];
|
||||
|
||||
@@ -349,6 +386,8 @@ describe("refreshEmbeddedNote", () => {
|
||||
const mountedIn = vi.mocked(content_renderer.mountInteractiveWidget).mock.calls
|
||||
.map(([ , wrapper ]) => wrapper.parentElement);
|
||||
expect(mountedIn).toEqual([ figure, section ]);
|
||||
expect(vi.mocked(content_renderer.getRenderedContent).mock.calls
|
||||
.map(([ , options ]) => options?.block)).toEqual([ undefined, "b1" ]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -404,7 +443,7 @@ describe("watchContentEmbeds", () => {
|
||||
expect(disposed()).toHaveLength(2);
|
||||
});
|
||||
|
||||
it("updates the editor when content in an embed adds buttons to its toolbar", () => {
|
||||
it("updates the editor when content in an embed adds or removes toolbar buttons", () => {
|
||||
const provider = { getTools: () => [], execute: vi.fn(), subscribe: () => () => {} };
|
||||
const [ inside, outside ] = [ container, document.body ].map((parent) => {
|
||||
const element = document.createElement("div");
|
||||
@@ -414,16 +453,16 @@ describe("watchContentEmbeds", () => {
|
||||
update.mockClear();
|
||||
const stop = watchContentEmbeds(container, editor);
|
||||
|
||||
const unregister = [ registerContentEmbedTools(inside, provider) ];
|
||||
const unregisterInside = registerContentEmbedTools(inside, provider);
|
||||
expect(update).toHaveBeenCalledTimes(1);
|
||||
unregister.push(registerContentEmbedTools(outside, provider));
|
||||
stop();
|
||||
unregister.push(registerContentEmbedTools(inside, provider));
|
||||
registerContentEmbedTools(outside, provider)();
|
||||
expect(update).toHaveBeenCalledTimes(1);
|
||||
unregisterInside();
|
||||
expect(update).toHaveBeenCalledTimes(2);
|
||||
|
||||
for (const stopRegistration of unregister) {
|
||||
stopRegistration();
|
||||
}
|
||||
stop();
|
||||
registerContentEmbedTools(inside, provider)();
|
||||
expect(update).toHaveBeenCalledTimes(2);
|
||||
outside.remove();
|
||||
});
|
||||
});
|
||||
@@ -433,14 +472,19 @@ describe("openContentEmbedMenu", () => {
|
||||
const anchor = document.createElement("button");
|
||||
const noteEmbed = inPage(document.createElement("figure"));
|
||||
noteEmbed.dataset.noteId = "noteY";
|
||||
const blockEmbed = inPage(document.createElement("figure"));
|
||||
blockEmbed.dataset.noteId = "noteY";
|
||||
blockEmbed.dataset.block = "b1";
|
||||
const embed = inPage(document.createElement("figure"));
|
||||
embed.dataset.attachmentId = "att1";
|
||||
|
||||
await openContentEmbedMenu(noteEmbed, anchor);
|
||||
await openContentEmbedMenu(blockEmbed, anchor);
|
||||
await openContentEmbedMenu(embed, anchor);
|
||||
|
||||
expect(vi.mocked(linkContextMenu.openContextMenu).mock.calls).toEqual([
|
||||
[ "noteY", { anchor, target: noteEmbed }, {} ],
|
||||
[ "noteY", { anchor, target: blockEmbed }, { block: "b1" } ],
|
||||
[ "owner", { anchor, target: embed }, ATTACHMENT_SCOPE ]
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -17,6 +17,10 @@ import ContentEmbed, { getNoteActions, TinyContentEmbed } from "./ContentEmbed";
|
||||
interface EmbeddedNoteOptions {
|
||||
/** Saves the changes that the content makes to the note, such as a code note. */
|
||||
noteEditor?: NoteEditor;
|
||||
/** The blocks of the note to show, a `block` link parameter. The whole note when left out. */
|
||||
block?: string;
|
||||
/** Points the embed at the blocks that its editor holds, once they change. */
|
||||
onBlockChange?: (block: string) => void;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -27,31 +31,36 @@ export async function loadEmbeddedNote(
|
||||
noteId: string,
|
||||
$el: JQuery<HTMLElement>,
|
||||
boxSize?: string,
|
||||
{ noteEditor }: EmbeddedNoteOptions = {}
|
||||
{ noteEditor, block, onBlockChange }: EmbeddedNoteOptions = {}
|
||||
) {
|
||||
const note = await froca.getNote(noteId);
|
||||
if (!note) return;
|
||||
|
||||
const el = $el[0];
|
||||
const size = boxSize ?? getEmbedBoxSize(el);
|
||||
const viewScope: ViewScope | undefined = block ? { block } : undefined;
|
||||
const isExcerpt = !!block;
|
||||
if (size === "tiny") {
|
||||
const $link = await link.createLink(note.noteId, {
|
||||
showTooltip: false,
|
||||
showNotePath: true
|
||||
showNotePath: true,
|
||||
viewScope
|
||||
});
|
||||
const box = h(TinyContentEmbed, {
|
||||
icon: note.getIcon(),
|
||||
title: $link[0],
|
||||
notePath: note.noteId,
|
||||
viewScope,
|
||||
actions: getNoteActions(note.noteId)
|
||||
});
|
||||
await mountEmbedBox(el, box);
|
||||
await mountEmbedBox(el, box, undefined, isExcerpt);
|
||||
return;
|
||||
}
|
||||
|
||||
const $link = await link.createLink(note.noteId, {
|
||||
showTooltip: false,
|
||||
showNoteIcon: true
|
||||
showNoteIcon: true,
|
||||
viewScope
|
||||
});
|
||||
|
||||
// The embed widget itself is the first level of embedding, so the embedded note's own
|
||||
@@ -60,7 +69,9 @@ export async function loadEmbeddedNote(
|
||||
interactive: true,
|
||||
embedsAsReferenceLinks: true,
|
||||
mediaEnvironment: "embedded",
|
||||
noteEditor
|
||||
noteEditor,
|
||||
block,
|
||||
onBlockChange
|
||||
});
|
||||
|
||||
const box = h(ContentEmbed, {
|
||||
@@ -68,9 +79,11 @@ export async function loadEmbeddedNote(
|
||||
title: $link[0],
|
||||
content: $renderedContent[0],
|
||||
contentType: type,
|
||||
notePath: note.noteId
|
||||
notePath: note.noteId,
|
||||
viewScope,
|
||||
isExcerpt
|
||||
});
|
||||
await mountEmbedBox(el, box, $renderedContent);
|
||||
await mountEmbedBox(el, box, $renderedContent, isExcerpt);
|
||||
}
|
||||
|
||||
interface EmbeddedAttachmentOptions {
|
||||
@@ -140,7 +153,16 @@ export async function loadEmbeddedAttachment(
|
||||
* Mounts `box` in the embed `el`. An embed that left the page while it loaded gets no box,
|
||||
* and `content` rendered for it is disposed: `watchContentEmbeds()` has already passed it.
|
||||
*/
|
||||
async function mountEmbedBox(el: HTMLElement, box: JSX.Element, content?: JQuery<HTMLElement>) {
|
||||
/**
|
||||
* Mounts `box` in the wrapper of the embed `el`, which carries the `excerpt` class while
|
||||
* `isExcerpt`. The class is not saved with the note.
|
||||
*/
|
||||
async function mountEmbedBox(
|
||||
el: HTMLElement,
|
||||
box: JSX.Element,
|
||||
content?: JQuery<HTMLElement>,
|
||||
isExcerpt = false
|
||||
) {
|
||||
if (!el.isConnected) {
|
||||
if (content) {
|
||||
content_renderer.disposeInteractiveContent(content);
|
||||
@@ -148,7 +170,9 @@ async function mountEmbedBox(el: HTMLElement, box: JSX.Element, content?: JQuery
|
||||
return;
|
||||
}
|
||||
|
||||
await content_renderer.mountInteractiveWidget(box, getWrapper(el));
|
||||
const wrapper = getWrapper(el);
|
||||
wrapper.classList.toggle("excerpt", isExcerpt);
|
||||
await content_renderer.mountInteractiveWidget(box, wrapper);
|
||||
}
|
||||
|
||||
function getEmbedBoxSize(el: HTMLElement) {
|
||||
@@ -182,7 +206,7 @@ function getWrapper(el: HTMLElement) {
|
||||
* opens from the embed, so that the text editor that contains it stays focused.
|
||||
*/
|
||||
export async function openContentEmbedMenu(embed: HTMLElement, anchor: HTMLElement) {
|
||||
const { noteId, attachmentId } = embed.dataset;
|
||||
const { noteId, attachmentId, block } = embed.dataset;
|
||||
const origin = linkContextMenu.getOriginBelow(anchor, embed);
|
||||
|
||||
if (attachmentId) {
|
||||
@@ -194,7 +218,7 @@ export async function openContentEmbedMenu(embed: HTMLElement, anchor: HTMLEleme
|
||||
});
|
||||
}
|
||||
} else if (noteId) {
|
||||
await linkContextMenu.openContextMenu(noteId, origin, {});
|
||||
await linkContextMenu.openContextMenu(noteId, origin, block ? { block } : {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,9 +266,13 @@ export function refreshEmbeddedNote(
|
||||
noteId: string,
|
||||
options?: EmbeddedNoteOptions
|
||||
) {
|
||||
const embeddedNotes = container.querySelectorAll(`.include-note[data-note-id="${noteId}"]`);
|
||||
const embeddedNotes =
|
||||
container.querySelectorAll<HTMLElement>(`.include-note[data-note-id="${noteId}"]`);
|
||||
for (const embeddedNote of embeddedNotes) {
|
||||
loadEmbeddedNote(noteId, $(embeddedNote as HTMLElement), undefined, options);
|
||||
loadEmbeddedNote(noteId, $(embeddedNote), undefined, {
|
||||
...options,
|
||||
block: embeddedNote.dataset.block
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+10
@@ -123,6 +123,16 @@ class="table">
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a class="reference-link" href="#root/_help_klC3ilXa9kUE">Block references</a>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Links to blocks of a note</li>
|
||||
<li>Including blocks of a note</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a class="reference-link" href="#root/_help_CohkqWQC1iBv">Insert buttons</a>
|
||||
</td>
|
||||
|
||||
Generated
Vendored
+62
@@ -0,0 +1,62 @@
|
||||
<p>Block references are <a href="#root/_help_QEAPj01N5f7w">links</a> to a block
|
||||
of a text note, such as a paragraph, a heading, a list item or a table,
|
||||
or to a range of consecutive blocks. A block reference can be pasted in
|
||||
another note as a link, or turned into an <a class="reference-link" href="#root/_help_nBAXQFj20hS1">Include Note</a> that
|
||||
shows only the referenced blocks.</p>
|
||||
<h2>Copying a reference</h2>
|
||||
<ol>
|
||||
<li>Place the cursor in the block to reference. To reference several consecutive
|
||||
blocks, select them.</li>
|
||||
<li>Right-click the block handle, the sequence of dots to the left of the
|
||||
block (see <a class="reference-link" href="#root/_help_nRhnJkTT8cPs">Formatting toolbar</a>).
|
||||
Alternatively, right-click the text and open the <em>Copy</em> submenu.</li>
|
||||
<li>Select <em>Copy reference to this block</em>, or <em>Copy reference to these blocks</em> for
|
||||
a selection. The referenced blocks flash briefly.</li>
|
||||
<li>Go to the note where to insert the link and press <kbd>Ctrl</kbd>+<kbd>V</kbd>.</li>
|
||||
</ol>
|
||||
<p>The link shows the title of the note, followed by the beginning of the
|
||||
referenced text. A link to blocks of the same note shows only the beginning
|
||||
of the referenced text.</p>
|
||||
<p>The <em>Paste</em> submenu of the context menu offers two more ways to insert
|
||||
a copied reference:</p>
|
||||
<ul>
|
||||
<li><em>Paste reference as a link</em> inserts only the link, even when the
|
||||
reference was copied as plain text or along with other content.</li>
|
||||
<li><em>Paste reference as an excerpt</em> inserts an include of the referenced
|
||||
blocks, as described below.</li>
|
||||
</ul>
|
||||
<p>In a browser, the context menu of the text editor opens only when right-clicking
|
||||
selected text. Elsewhere the browser shows its own menu.</p>
|
||||
<h2>Following a reference</h2>
|
||||
<p>Clicking a block reference opens the note, scrolls to the referenced blocks
|
||||
and flashes them. If a referenced block was deleted, an error message is
|
||||
shown instead, along with the blocks of the range that still exist.</p>
|
||||
<h2>Including the referenced blocks</h2>
|
||||
<p>To show the referenced blocks inside another note, right-click the link
|
||||
in a note being edited and select <em>Convert link to note excerpt</em>,
|
||||
or paste the copied reference with <em>Paste</em> → <em>Paste reference as an excerpt</em>.
|
||||
The include shows only the referenced blocks, not the rest of the note,
|
||||
and marks them with an <em>Excerpt</em> badge in its title. It starts at
|
||||
the <em>Full</em> box size, so all the referenced blocks are visible. To
|
||||
see the whole note, press the <span class="tn-icon bx bx-link-external"></span> button
|
||||
in the same title, which opens the note in a new tab. Converting the include
|
||||
back to a link keeps the reference.</p>
|
||||
<p>To edit the referenced blocks without leaving the note, press the <span
|
||||
class="tn-icon bx bx-pencil"></span> <em>Edit excerpt</em> button in the
|
||||
title of the include, or turn on <em>Editable</em> in its toolbar, as for
|
||||
any <a class="reference-link" href="#root/_help_nBAXQFj20hS1">Include Note</a>.
|
||||
Press the button again to stop editing. The changes are saved to the referenced
|
||||
blocks, and the rest of the note stays as it is. The button is grayed out
|
||||
where the blocks cannot be edited, such as in a read-only note. An excerpt
|
||||
has no <em>Fullscreen</em> button.</p>
|
||||
<p>If a referenced block was deleted, the include shows <em>Broken reference</em>.</p>
|
||||
<h2>Limitations</h2>
|
||||
<ul>
|
||||
<li>References can be copied only from a note being edited, and not in the
|
||||
mobile layout.</li>
|
||||
<li>An include of a range that covers only part of a list or a quote, such
|
||||
as from its second item to a paragraph after it, cannot be edited in place.</li>
|
||||
<li>Deleting a block breaks the references to it.</li>
|
||||
<li>Block references are not kept when exporting to Markdown. On a <a href="#root/_help_R9pX4DGra2Vt">shared page</a>,
|
||||
a block reference opens the whole note.</li>
|
||||
</ul>
|
||||
Generated
Vendored
+12
@@ -15,6 +15,11 @@
|
||||
</p>
|
||||
<p>Clicking this popup will reveal the formatting options that are specific
|
||||
to the entire paragraph, such as setting a heading, lists, tables, etc.</p>
|
||||
<p>The dots are also a drag handle: drag them to move the paragraph, all
|
||||
the selected paragraphs, or a selected element such as an image, a table
|
||||
or an included note to another place in the note. Right-clicking them copies
|
||||
a reference to the paragraph or to the selected paragraphs, see <a class="reference-link"
|
||||
href="#root/_help_klC3ilXa9kUE">Block references</a>.</p>
|
||||
<p>
|
||||
<img src="3_Formatting toolbar_image.png">
|
||||
</p>
|
||||
@@ -30,6 +35,13 @@
|
||||
useful if a lot of formatting is needed.</p>
|
||||
<p>All the options are combined into a single toolbar that will appear as
|
||||
part of the <a href="#root/_help_BlN9DFI679QC">Ribbon</a>.</p>
|
||||
<p>The sequence of dots to the left of the current paragraph is still shown,
|
||||
but only as a drag handle: drag it to move the paragraph, all the selected
|
||||
paragraphs, or a selected element such as an image, a table or an included
|
||||
note to another place in the note. Clicking it does not open a popup, and
|
||||
right-clicking it copies a reference to the block, see <a class="reference-link"
|
||||
href="#root/_help_klC3ilXa9kUE">Block references</a>. The drag handle is
|
||||
not shown in the mobile layout.</p>
|
||||
<p>
|
||||
<img src="2_Formatting toolbar_image.png">
|
||||
</p>
|
||||
|
||||
Generated
Vendored
+11
-2
@@ -13,6 +13,9 @@
|
||||
as one added from the button does.</p>
|
||||
<p>An <a href="#root/_help_0vhv7lsOLy82">attachment</a> can be included the
|
||||
same way, from the context menu of a link to it (see <em>Embedding an attachment</em> there).</p>
|
||||
<p>A link to blocks of a text note is converted the same way, with <em>Convert link to note excerpt</em>,
|
||||
and the include then shows only those blocks. See <a class="reference-link"
|
||||
href="#root/_help_klC3ilXa9kUE">Block references</a>.</p>
|
||||
<h2>Box sizes</h2>
|
||||
<p>The box size sets how much of the included note is shown.</p>
|
||||
<ul>
|
||||
@@ -33,7 +36,8 @@
|
||||
<li><em>Tiny</em> for a note or an attachment that has no preview, such as
|
||||
a relation map or an archive.</li>
|
||||
<li><em>Small</em> for audio.</li>
|
||||
<li><em>Full</em> for a code note or a code file, such as a <code>.js</code>, <code>.py</code> or <code>.txt</code> attachment.</li>
|
||||
<li><em>Full</em> for a code note or a code file, such as a <code>.js</code>, <code>.py</code> or <code>.txt</code> attachment,
|
||||
and for an excerpt of the blocks of a text note.</li>
|
||||
<li><em>Medium</em> for anything else.</li>
|
||||
</ul>
|
||||
<p>The dialog that includes a note selects that size once the note is picked,
|
||||
@@ -106,7 +110,10 @@
|
||||
menu.</p>
|
||||
<p>To show an include of size <em>Medium</em> or <em>Full</em> on the whole screen,
|
||||
press the <span class="tn-icon bx bx-fullscreen"></span> <em>Fullscreen</em> button
|
||||
at the end of its title. To return, press <span class="tn-icon bx bx-exit"></span> <em>Exit fullscreen</em> in
|
||||
at the end of its title. An excerpt of the blocks of a note has an <span
|
||||
class="tn-icon bx bx-pencil"></span> <em>Edit excerpt</em> button there instead;
|
||||
see <a class="reference-link" href="#root/_help_klC3ilXa9kUE">Block references</a>.
|
||||
To return, press <span class="tn-icon bx bx-exit"></span> <em>Exit fullscreen</em> in
|
||||
the top-right corner, or <kbd>Esc</kbd>.</p>
|
||||
<p>A <em>Tiny</em> include has these buttons instead, followed by the same <em>More actions</em> button:</p>
|
||||
<ul>
|
||||
@@ -175,6 +182,8 @@
|
||||
with its theme, indentation and line wrapping settings.</li>
|
||||
<li>The changes are saved as you type, to the included note or to the attachment,
|
||||
as they would be in its own tab.</li>
|
||||
<li>An include of <a class="reference-link" href="#root/_help_klC3ilXa9kUE">Block references</a> edits
|
||||
only the referenced blocks.</li>
|
||||
<li>Editing is not available in a <a href="#root/_help_CoFPLs3dRlXc">read-only note</a>,
|
||||
for an included note marked <code>#readOnly</code>, or for an attachment
|
||||
of another note.</li>
|
||||
|
||||
@@ -30,16 +30,13 @@
|
||||
"open-new-window": "فتح نافذة جديدة فارغة",
|
||||
"other": "أخرى",
|
||||
"dialogs": "مربعات الحوار",
|
||||
"ribbon-tabs": "علامات التبويب في الشريط",
|
||||
"note-navigation": "التنقل بين الملاحظات",
|
||||
"show-options": "افتح صفحة \"الخيارات\"",
|
||||
"text-note-operations": "عمليات الملاحظة النصية",
|
||||
"add-new-label": "انشاء تسمية جديدة",
|
||||
"create-new-relation": "انشاء علاقة جديدة",
|
||||
"toggle-link-map": "اظهار/اخفاء خريطة الرابط",
|
||||
"unhoist": "الغاء التركيز من اي مكان",
|
||||
"find-in-text": "اظهار/اخفاء لوحة الفتح",
|
||||
"toggle-book-properties": "اظهار/اخفاء خصائص المجموعة",
|
||||
"show-note-source": "عرض مربع حوار \"مصدر الملاحظات\"",
|
||||
"show-revisions": "عرض مربع حوار \" مراجعات الملاحظة\"",
|
||||
"show-recent-changes": "عرض مربع حوار \" التغيرات الأخيرة\"",
|
||||
@@ -59,7 +56,6 @@
|
||||
"cut-into-note": "قصّ التحديد من الملاحظة الحالية وإنشاء ملاحظة فرعية بالنص المحدد",
|
||||
"add-include-note-to-text": "فتح نافذة لإدراج ملاحظة",
|
||||
"save-named-revision": "حفظ نسخة مُعنونة من الملاحظة النشطة",
|
||||
"toggle-classic-editor-toolbar": "تبديل تبويب التنسيق لمحرر النص مع شريط أدوات ثابت",
|
||||
"toggle-zen-mode": "تفعيل/تعطيل وضع التركيز (Zen Mode) الذي يوفر واجهة مبسطة للكتابة المركّزة",
|
||||
"toggle-right-pane": "تبديل عرض اللوحة اليمنى، والتي تتضمن جدول المحتويات والإبرازات",
|
||||
"force-save-revision": "فرض إنشاء / حفظ نسخة مراجعة جديدة للملاحظة النشطة",
|
||||
@@ -328,21 +324,9 @@
|
||||
"add-note-above-to-selection": "اضافة ملاحظة فوق الملاحظة المحددة",
|
||||
"add-note-below-to-selection": "اصافة ملاحظة اسفل الملاحظة المحددة",
|
||||
"add-include-note-to-text": "اضافة الملاحظة الى النص",
|
||||
"toggle-ribbon-tab-image-properties": "اظهار/ اخفاء صورة علامة التبويب في الشريط.",
|
||||
"toggle-ribbon-tab-classic-editor": "عرض/اخفاء تبويب المحور الكلاسيكي",
|
||||
"toggle-ribbon-tab-basic-properties": "عرض/اخفاء تبويب الخصائص الاساسية",
|
||||
"toggle-ribbon-tab-book-properties": "عرض/اخفاء تبويب خصائص الدفتر",
|
||||
"toggle-ribbon-tab-file-properties": "عرض/ادخفاء تبويب خصائص الملف",
|
||||
"toggle-ribbon-tab-owned-attributes": "عرض/اخفاء تبويب المميزات المملوكة",
|
||||
"toggle-ribbon-tab-inherited-attributes": "عرض/اخفاء تبويب السمات الموروثة",
|
||||
"toggle-ribbon-tab-promoted-attributes": "عرض/ اخفاء تبويب السمات المعززة",
|
||||
"toggle-ribbon-tab-note-map": "عرض/اخفاء تبويب خريطة الملاحظات",
|
||||
"toggle-ribbon-tab-similar-notes": "عرض/اخفاء شريط الملاحظات المشابهة",
|
||||
"export-active-note-as-pdf": "تصدير الملاحظة النشطة كملفPDF",
|
||||
"toggle-archived-notes": "تبديل عرض الملاحظات المؤرشفة",
|
||||
"insert-date-and-time-to-text": "إدراج التاريخ والوقت في النص",
|
||||
"toggle-ribbon-tab-note-info": "تبديل تبويب الشريط: معلومات الملاحظة",
|
||||
"toggle-ribbon-tab-note-paths": "تبديل تبويب الشريط: مسارات الملاحظة",
|
||||
"save-named-revision": "حفظ نسخة مُسمّاة"
|
||||
},
|
||||
"share_404": {
|
||||
|
||||
@@ -38,8 +38,6 @@
|
||||
"attributes-labels-and-relations": "属性(标签和关系)",
|
||||
"add-new-label": "创建新标签",
|
||||
"create-new-relation": "创建新关系",
|
||||
"ribbon-tabs": "功能区标签页",
|
||||
"toggle-link-map": "切换链接地图",
|
||||
"other": "其他",
|
||||
"toggle-right-pane": "切换右侧面板的显示,包括目录和高亮",
|
||||
"open-note-externally": "以默认应用打开笔记文件",
|
||||
@@ -52,8 +50,6 @@
|
||||
"copy-without-formatting": "无格式复制选定文本",
|
||||
"force-save-revision": "强制创建/保存当前笔记的新修订版本",
|
||||
"show-help": "显示帮助",
|
||||
"toggle-book-properties": "切换书籍属性",
|
||||
"toggle-classic-editor-toolbar": "为编辑器切换格式标签页的固定工具栏",
|
||||
"show-cheatsheet": "显示快捷键指南",
|
||||
"toggle-zen-mode": "启用/禁用禅模式(为专注编辑而精简界面)",
|
||||
"quick-search": "激活快速搜索栏",
|
||||
@@ -332,18 +328,6 @@
|
||||
"edit-read-only-note": "编辑只读笔记",
|
||||
"add-new-label": "添加新标签",
|
||||
"add-new-relation": "添加新关系",
|
||||
"toggle-ribbon-tab-classic-editor": "切换功能区标签:经典编辑器",
|
||||
"toggle-ribbon-tab-basic-properties": "切换功能区标签:基本属性",
|
||||
"toggle-ribbon-tab-book-properties": "切换功能区标签:书籍属性",
|
||||
"toggle-ribbon-tab-file-properties": "切换功能区标签:文件属性",
|
||||
"toggle-ribbon-tab-image-properties": "切换功能区标签:图片属性",
|
||||
"toggle-ribbon-tab-owned-attributes": "切换功能区标签:自有属性",
|
||||
"toggle-ribbon-tab-inherited-attributes": "切换功能区标签:继承属性",
|
||||
"toggle-ribbon-tab-promoted-attributes": "切换功能区标签:提升属性",
|
||||
"toggle-ribbon-tab-note-map": "切换功能区标签:笔记地图",
|
||||
"toggle-ribbon-tab-note-info": "切换功能区标签:笔记信息",
|
||||
"toggle-ribbon-tab-note-paths": "切换功能区标签:笔记路径",
|
||||
"toggle-ribbon-tab-similar-notes": "切换功能区标签:相似笔记",
|
||||
"toggle-right-pane": "切换右侧面板",
|
||||
"print-active-note": "打印当前笔记",
|
||||
"export-active-note-as-pdf": "导出当前笔记为 PDF",
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
"add-include-note-to-text": "Otevřít dialog pro vložení poznámky",
|
||||
"attributes-labels-and-relations": "Atributy (štítky a vazby)",
|
||||
"create-new-relation": "Vytvořit novou vazbu",
|
||||
"ribbon-tabs": "Karty pásu záložek",
|
||||
"render-active-note": "Vykreslit (znovu vykreslit) aktivní poznámku",
|
||||
"open-note-externally": "Otevřít poznámku jako soubor ve výchozí aplikaci",
|
||||
"unhoist": "Odpojit všude",
|
||||
@@ -58,13 +57,10 @@
|
||||
"copy-without-formatting": "Kopírovat vybraný text bez formátování",
|
||||
"force-save-revision": "Vynutit vytvoření / uložení nové revize aktivní poznámky",
|
||||
"toggle-zen-mode": "Zapnout/vypnout režim zen (minimalistické uživatelské rozhraní pro soustředěnější úpravy)",
|
||||
"toggle-link-map": "Přepnout mapu odkazů",
|
||||
"toggle-right-pane": "Přepnout zobrazení pravého panelu, který obsahuje obsah a zvýraznění",
|
||||
"toggle-note-hoisting": "Přepnout zúžení zobrazení aktivní poznámky",
|
||||
"find-in-text": "Přepnout panel hledání",
|
||||
"toggle-left-note-tree-panel": "Přepnout levý panel (strom poznámek)",
|
||||
"toggle-book-properties": "Přepnout vlastnosti kolekce",
|
||||
"toggle-classic-editor-toolbar": "Přepnout záložku formátování pro editor s fixní páskou"
|
||||
"toggle-left-note-tree-panel": "Přepnout levý panel (strom poznámek)"
|
||||
},
|
||||
"keyboard_action_names": {
|
||||
"jump-to-note": "Přejít na...",
|
||||
@@ -132,18 +128,6 @@
|
||||
"edit-read-only-note": "Upravit poznámku pouze pro čtení",
|
||||
"add-new-label": "Přidat nový štítek",
|
||||
"add-new-relation": "Přidat novou vazbu",
|
||||
"toggle-ribbon-tab-classic-editor": "Přepínat záložku pásu karet Klasický editor",
|
||||
"toggle-ribbon-tab-basic-properties": "Přepínat záložku pásu karet Základní vlastnosti",
|
||||
"toggle-ribbon-tab-book-properties": "Přepínat záložku pásu karet Vlastnosti knihy",
|
||||
"toggle-ribbon-tab-file-properties": "Přepínat záložku pásu karet Vlastnosti souboru",
|
||||
"toggle-ribbon-tab-image-properties": "Přepínat záložku pásu karet Vlastnosti obrázku",
|
||||
"toggle-ribbon-tab-owned-attributes": "Přepínat záložku pásu karet Vlastní atributy",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Přepínat záložku pásu karrét Zděděné atributy",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Přepínat záložku pásu karet Propagované atributy",
|
||||
"toggle-ribbon-tab-note-map": "Přepínat záložku pásu karet Mapa poznámky",
|
||||
"toggle-ribbon-tab-note-info": "Přepínat záložku pásu karet Informace o poznámce",
|
||||
"toggle-ribbon-tab-note-paths": "Přepínat záložku pásu karet Cesty k poznámce",
|
||||
"toggle-ribbon-tab-similar-notes": "Přepínat záložku pásu karet Podobné poznámky",
|
||||
"toggle-right-pane": "Přepnout pravý panel",
|
||||
"print-active-note": "Tisknout aktivní poznámku",
|
||||
"export-active-note-as-pdf": "Exportovat aktivní poznámku jako PDF",
|
||||
|
||||
@@ -38,8 +38,6 @@
|
||||
"attributes-labels-and-relations": "Attribute (Labels & Verknüpfungen)",
|
||||
"add-new-label": "Neues Label erstellen",
|
||||
"create-new-relation": "Neue Verknüpfung erstellen",
|
||||
"ribbon-tabs": "Ribbon-Tabs",
|
||||
"toggle-link-map": "Link-Karte umschalten",
|
||||
"other": "Andere",
|
||||
"toggle-right-pane": "Rechte Leiste umschalten (enthält Inhaltsverzeichnis und Markierungen)",
|
||||
"open-note-externally": "Notiz als Datei mit Standardanwendung öffnen",
|
||||
@@ -52,7 +50,6 @@
|
||||
"copy-without-formatting": "Ausgewählten Text ohne Formatierung kopieren",
|
||||
"force-save-revision": "Erstellen / Speichern einer neuen Notizrevision der aktiven Notiz erzwingen",
|
||||
"show-help": "Eingebautes Nutzerhandbuch öffnen",
|
||||
"toggle-book-properties": "Buch-Eigenschaften umschalten",
|
||||
"clone-notes-to": "Ausgewählte Notizen duplizieren",
|
||||
"back-in-note-history": "Zur vorherigen Notiz im Verlauf navigieren",
|
||||
"forward-in-note-history": "Zur nächsten Notiz im Verlauf navigieren",
|
||||
@@ -63,7 +60,6 @@
|
||||
"move-notes-to": "Ausgewählte Notizen verschieben",
|
||||
"show-cheatsheet": "Übersicht der Tastenkombinationen anzeigen",
|
||||
"find-in-text": "Suchleiste umschalten",
|
||||
"toggle-classic-editor-toolbar": "Formatierungs-Tab für den Editor mit fester Werkzeugleiste umschalten",
|
||||
"toggle-zen-mode": "Zen-Modus ein-/ausschalten (reduzierte Benutzeroberfläche für ablenkungsfreies Arbeiten)",
|
||||
"save-named-revision": "Eine benannte Revision der aktuellen Notiz speichern",
|
||||
"toggle-archived-notes": "Archivierte Notizen im Notizbaum anzeigen/ausblenden",
|
||||
@@ -346,18 +342,6 @@
|
||||
"paste-markdown-into-text": "Markdown in Text einfügen",
|
||||
"add-include-note-to-text": "Notiz in Text einfügen",
|
||||
"edit-read-only-note": "Schreibgeschützte Notiz bearbeiten",
|
||||
"toggle-ribbon-tab-classic-editor": "Registerkarte Klassischer Editor umschalten",
|
||||
"toggle-ribbon-tab-basic-properties": "Registerkarte Grundlegende Eigenschaften umschalten",
|
||||
"toggle-ribbon-tab-book-properties": "Registerkarte Buch-Eigenschaften umschalten",
|
||||
"toggle-ribbon-tab-file-properties": "Registerkarte Datei-Eigenschaften umschalten",
|
||||
"toggle-ribbon-tab-image-properties": "Registerkarte Bilder-Eigenschaften umschalten",
|
||||
"toggle-ribbon-tab-owned-attributes": "Registerkarte Besitzerattribute umschalten",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Registerkarte geerbte Attribute umschalten",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Registerkarte hervorgehobene Attribute umschalten",
|
||||
"toggle-ribbon-tab-note-map": "Registerkarte Notizkarte umschalten",
|
||||
"toggle-ribbon-tab-note-info": "Registerkarte Notiz-Info umschalten",
|
||||
"toggle-ribbon-tab-note-paths": "Registerkarte Notiz-Pfad umschalten",
|
||||
"toggle-ribbon-tab-similar-notes": "Registerkarte ähnliche Notizen umschalten",
|
||||
"toggle-right-pane": "Rechten Bereich ein-/ausblenden",
|
||||
"open-note-externally": "Notiz extern öffnen",
|
||||
"render-active-note": "Aktive Notiz rendern",
|
||||
|
||||
@@ -48,8 +48,6 @@
|
||||
"attributes-labels-and-relations": "Attributes (labels & relations)",
|
||||
"add-new-label": "Create new label",
|
||||
"create-new-relation": "Create new relation",
|
||||
"ribbon-tabs": "Ribbon tabs",
|
||||
"toggle-link-map": "Toggle Link Map",
|
||||
"other": "Other",
|
||||
"toggle-right-pane": "Toggle the display of the right pane, which includes Table of Contents and Highlights",
|
||||
"open-note-externally": "Open note as a file with default application",
|
||||
@@ -63,8 +61,6 @@
|
||||
"save-named-revision": "Save a named revision of the active note",
|
||||
"copy-without-formatting": "Copy selected text without formatting",
|
||||
"force-save-revision": "Force creating / saving new note revision of the active note",
|
||||
"toggle-book-properties": "Toggle Collection Properties",
|
||||
"toggle-classic-editor-toolbar": "Toggle the Formatting tab for the editor with fixed toolbar",
|
||||
"toggle-zen-mode": "Enables/disables the zen mode (minimal UI for more focused editing)"
|
||||
},
|
||||
"keyboard_action_names": {
|
||||
|
||||
@@ -348,7 +348,8 @@
|
||||
},
|
||||
"content_renderer": {
|
||||
"note-cannot-be-displayed": "This note type cannot be displayed.",
|
||||
"included-note-requires-credentials": "This included note is password-protected and cannot be displayed here."
|
||||
"included-note-requires-credentials": "This included note is password-protected and cannot be displayed here.",
|
||||
"broken-block-reference": "Broken reference"
|
||||
},
|
||||
"onenote_import": {
|
||||
"root-title": "OneNote import",
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
"attributes-labels-and-relations": "Atributos (etiquetas y relaciones)",
|
||||
"add-new-label": "Crear nueva etiqueta",
|
||||
"create-new-relation": "Crear nueva relación",
|
||||
"ribbon-tabs": "Pestañas de cinta",
|
||||
"toggle-link-map": "Alternar mapa de enlaces",
|
||||
"other": "Otro",
|
||||
"toggle-right-pane": "Alternar la visualización del panel derecho, que incluye la tabla de contenidos y aspectos destacados",
|
||||
"open-note-externally": "Abrir nota como un archivo con la aplicación predeterminada",
|
||||
@@ -60,8 +58,6 @@
|
||||
"note-navigation": "Navegación de notas",
|
||||
"copy-without-formatting": "Copiar el texto seleccionado sin formatear",
|
||||
"force-save-revision": "Forzar la creación/guardado de una nueva revisión de nota de la nota activa",
|
||||
"toggle-book-properties": "Alternar propiedades del libro",
|
||||
"toggle-classic-editor-toolbar": "Alternar la pestaña de formato por el editor con barra de herramientas fija",
|
||||
"toggle-zen-mode": "Habilita/Deshabilita el modo Zen (IU mínima para edición sin distracciones)",
|
||||
"clone-notes-to": "Clonar notas seleccionadas",
|
||||
"move-notes-to": "Mover notas seleccionadas",
|
||||
@@ -356,18 +352,6 @@
|
||||
"cut-into-note": "Cortar en la nota",
|
||||
"add-include-note-to-text": "Agregar nota incluida al texto",
|
||||
"force-save-revision": "Forzar guardado de revisión",
|
||||
"toggle-ribbon-tab-classic-editor": "Mostrar pestaña de la cinta de opciones: Editor clásico",
|
||||
"toggle-ribbon-tab-basic-properties": "Mostrar pestaña de la cinta de opciones: Propiedades básicas",
|
||||
"toggle-ribbon-tab-book-properties": "Mostrar pestaña de la cinta de opciones: Propiedades de libro",
|
||||
"toggle-ribbon-tab-file-properties": "Mostrar pestaña de la cinta de opciones: Propiedades de archivo",
|
||||
"toggle-ribbon-tab-image-properties": "Mostrar pestaña de la cinta de opciones: Propiedades de imagen",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Mostrar pestaña de la cinta de opciones: Atributos heredados",
|
||||
"toggle-ribbon-tab-note-map": "Mostrar pestaña de la cinta de opciones: Mapa de notas",
|
||||
"toggle-ribbon-tab-note-info": "Mostrar pestaña de la cinta de opciones: Información de nota",
|
||||
"toggle-ribbon-tab-note-paths": "Mostrar pestaña de la cinta de opciones: Rutas de nota",
|
||||
"toggle-ribbon-tab-similar-notes": "Mostrar pestaña de la cinta de opciones: Notas similares",
|
||||
"toggle-ribbon-tab-owned-attributes": "Mostrar pestaña de la cinta de opciones: Propiedades asignadas",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Mostrar pestaña de la cinta de opciones: Atributos destacados",
|
||||
"save-named-revision": "Guardar revisión nombrada",
|
||||
"toggle-archived-notes": "Alternar visibilidad de notas archivadas",
|
||||
"show-deleted-notes": "Mostrar notas eliminadas",
|
||||
|
||||
@@ -38,8 +38,6 @@
|
||||
"attributes-labels-and-relations": "Attributs (labels et relations)",
|
||||
"add-new-label": "Créer un nouveau label",
|
||||
"create-new-relation": "Créer une nouvelle relation",
|
||||
"ribbon-tabs": "Onglets du ruban",
|
||||
"toggle-link-map": "Afficher/masquer la carte des liens",
|
||||
"other": "Autre",
|
||||
"toggle-right-pane": "Afficher/masquer le volet droit, qui inclut la Table des matières et les Mises en évidence",
|
||||
"open-note-externally": "Ouvrir la note comme fichier avec l'application par défaut",
|
||||
@@ -52,8 +50,6 @@
|
||||
"copy-without-formatting": "Copier le texte sélectionné sans mise en forme",
|
||||
"force-save-revision": "Forcer la création / sauvegarde d'une nouvelle version de la note active",
|
||||
"show-help": "Affiche le guide de l'utilisateur intégré",
|
||||
"toggle-book-properties": "Afficher/masquer les Propriétés du Livre",
|
||||
"toggle-classic-editor-toolbar": "Activer/désactiver l'onglet Mise en forme de l'éditeur avec la barre d'outils fixe",
|
||||
"show-cheatsheet": "Affiche une fenêtre modale avec des opérations de clavier courantes",
|
||||
"toggle-zen-mode": "Active/désactive le mode zen (interface réduite pour favoriser la concentration)",
|
||||
"back-in-note-history": "Naviguer à la note précédente dans l'historique",
|
||||
@@ -306,13 +302,6 @@
|
||||
"edit-read-only-note": "Modifier une note en lecture seule",
|
||||
"add-new-label": "Ajouter une nouvelle étiquette",
|
||||
"add-new-relation": "Ajouter une nouvelle relation",
|
||||
"toggle-ribbon-tab-classic-editor": "Basculer l'onglet Mise en forme de l'éditeur avec la barre d'outils fixe",
|
||||
"toggle-ribbon-tab-basic-properties": "Afficher/masquer les Propriétés de base de la note",
|
||||
"toggle-ribbon-tab-book-properties": "Afficher/masquer les Propriétés du Livre",
|
||||
"toggle-ribbon-tab-file-properties": "Afficher/masquer les Propriétés du fichier",
|
||||
"toggle-ribbon-tab-image-properties": "Afficher/masquer les Propriétés de l'image",
|
||||
"toggle-ribbon-tab-owned-attributes": "Afficher/masquer les Attributs propres",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Afficher/masquer les Attributs hérités",
|
||||
"toggle-right-pane": "Afficher/Masquer le panneau de droite",
|
||||
"print-active-note": "Imprimer la note active",
|
||||
"export-active-note-as-pdf": "Exporter la note active en PDF",
|
||||
@@ -329,11 +318,6 @@
|
||||
"reset-zoom-level": "Réinitilaliser le zoom",
|
||||
"copy-without-formatting": "Copier sans mise en forme",
|
||||
"force-save-revision": "Forcer la sauvegarde de la révision",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Basculer les attributs promus de l'onglet du ruban",
|
||||
"toggle-ribbon-tab-note-map": "Afficher/masquer l’onglet “Carte des notes” du ruban",
|
||||
"toggle-ribbon-tab-note-info": "Basculer l'onglet du ruban Note Info",
|
||||
"toggle-ribbon-tab-note-paths": "Basculer les chemins de notes de l'onglet du ruban",
|
||||
"toggle-ribbon-tab-similar-notes": "Basculer l'onglet du ruban Notes similaires",
|
||||
"toggle-note-hoisting": "Activer la focalisation sur la note",
|
||||
"unhoist-note": "Désactiver la focalisation sur la note",
|
||||
"toggle-archived-notes": "Afficher/Masquer les notes archivées",
|
||||
|
||||
@@ -48,8 +48,6 @@
|
||||
"attributes-labels-and-relations": "Tréithe (lipéid & caidrimh)",
|
||||
"add-new-label": "Cruthaigh lipéad nua",
|
||||
"create-new-relation": "Cruthaigh caidreamh nua",
|
||||
"ribbon-tabs": "Cluaisíní ribín",
|
||||
"toggle-link-map": "Léarscáil Nasc a Athsholáthar",
|
||||
"other": "Eile",
|
||||
"toggle-right-pane": "Athraigh taispeáint an phainéil dheis, lena n-áirítear Clár Ábhair agus Buaicphointí",
|
||||
"open-note-externally": "Oscail nóta mar chomhad leis an bhfeidhmchlár réamhshocraithe",
|
||||
@@ -62,8 +60,6 @@
|
||||
"note-navigation": "Nascleanúint nótaí",
|
||||
"copy-without-formatting": "Cóipeáil téacs roghnaithe gan fhormáidiú",
|
||||
"force-save-revision": "Cruthú/sábháil nóta nua den nóta gníomhach i bhfeidhm",
|
||||
"toggle-book-properties": "Airíonna an Bhailiúcháin a Athrú",
|
||||
"toggle-classic-editor-toolbar": "Athraigh an cluaisín Formáidithe don eagarthóir leis an mbarra uirlisí socraithe",
|
||||
"toggle-zen-mode": "Cumasaíonn/díchumasaíonn sé an mód zen (comhad úsáideora íosta le haghaidh eagarthóireacht níos dírithe)",
|
||||
"save-named-revision": "Sábháil athbhreithniú ainmnithe den nóta gníomhach",
|
||||
"toggle-archived-notes": "Taispeáin/folaigh nótaí cartlannaithe sa chrann nótaí",
|
||||
@@ -145,18 +141,6 @@
|
||||
"edit-read-only-note": "Cuir Nóta Léite Amháin in Eagar",
|
||||
"add-new-label": "Cuir Lipéad Nua leis",
|
||||
"add-new-relation": "Cuir Gaol Nua leis",
|
||||
"toggle-ribbon-tab-classic-editor": "Eagarthóir Clasaiceach Cluaisín Ribín a Athrú",
|
||||
"toggle-ribbon-tab-basic-properties": "Airíonna Bunúsacha an Chluaisín Ribín a Athrú",
|
||||
"toggle-ribbon-tab-book-properties": "Airíonna Leabhar an Chluaisín Ribín a Athrú",
|
||||
"toggle-ribbon-tab-file-properties": "Airíonna Comhaid Tab Ribín a Athrú",
|
||||
"toggle-ribbon-tab-image-properties": "Airíonna Íomhá an Chluaisín Ribín a Athrú",
|
||||
"toggle-ribbon-tab-owned-attributes": "Tréithe atá faoi úinéireacht ag an gcluaisín ribín",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Tréithe Oidhreachta Cluaisín Ribín a Scor",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Tréithe Curtha Chun Cinn sa Chluaisín Ribín",
|
||||
"toggle-ribbon-tab-note-map": "Léarscáil Nótaí Tab Ribín a Athrú",
|
||||
"toggle-ribbon-tab-note-info": "Eolas Nóta Cluaisín Ribín a Athrú",
|
||||
"toggle-ribbon-tab-note-paths": "Cosáin Nóta Cluaisín Ribín a Athrú",
|
||||
"toggle-ribbon-tab-similar-notes": "Nótaí Cosúla a Athraigh an Cluaisín Ribín",
|
||||
"toggle-right-pane": "Scoránaigh an Phána Ar Dheis",
|
||||
"print-active-note": "Priontáil Nóta Gníomhach",
|
||||
"export-active-note-as-pdf": "Easpórtáil Nóta Gníomhach mar PDF",
|
||||
|
||||
@@ -49,8 +49,6 @@
|
||||
"attributes-labels-and-relations": "एट्रिब्यूट्स (लेबल्स और रिलेशन्स)",
|
||||
"add-new-label": "नया लेबल बनाएं",
|
||||
"create-new-relation": "नया रिलेशन बनाएं",
|
||||
"ribbon-tabs": "रिबन टैब्स",
|
||||
"toggle-link-map": "लिंक मैप टॉगल करें",
|
||||
"other": "अन्य",
|
||||
"toggle-right-pane": "दाएं पैनल को दिखाना टॉगल करें, जिसमें टेबल ऑफ कंटेंट और हाइलाइट्स शामिल हैं",
|
||||
"open-note-externally": "डिफ़ॉल्ट एप्लिकेशन के साथ नोट को फ़ाइल के रूप में खोलें",
|
||||
@@ -64,8 +62,6 @@
|
||||
"copy-without-formatting": "बिना फॉर्मेटिंग के चुने गए टेक्स्ट को कॉपी करें",
|
||||
"force-save-revision": "एक्टिव नोट का नया नोट रिवीजन बनाने / सेव करने के लिए बाध्य करें",
|
||||
"save-named-revision": "एक्टिव नोट का नाम वाला रिवीजन सेव करें",
|
||||
"toggle-book-properties": "कलेक्शन प्रॉपर्टीज टॉगल करें",
|
||||
"toggle-classic-editor-toolbar": "फिक्स्ड टूलबार वाले एडिटर के लिए फॉर्मेटिंग टैब टॉगल करें",
|
||||
"toggle-zen-mode": "ज़ेन मोड को इनेबल/डिसेबल करता है (अधिक केंद्रित संपादन के लिए न्यूनतम UI)"
|
||||
},
|
||||
"keyboard_action_names": {
|
||||
@@ -135,18 +131,6 @@
|
||||
"edit-read-only-note": "रीड-ओनली नोट एडिट करें",
|
||||
"add-new-label": "नया लेबल जोड़ें",
|
||||
"add-new-relation": "नया रिलेशन जोड़ें",
|
||||
"toggle-ribbon-tab-classic-editor": "क्लासिक एडिटर रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-basic-properties": "बेसिक प्रॉपर्टीज रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-book-properties": "बुक प्रॉपर्टीज रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-file-properties": "फ़ाइल प्रॉपर्टीज रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-image-properties": "इमेज प्रॉपर्टीज रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-owned-attributes": "ओन्ड एट्रिब्यूट्स रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-inherited-attributes": "इनहेरिटेड एट्रिब्यूट्स रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-promoted-attributes": "प्रमोटेड एट्रिब्यूट्स रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-note-map": "नोट मैप रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-note-info": "नोट इन्फो रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-note-paths": "नोट पाथ्स रिबन टैब टॉगल करें",
|
||||
"toggle-ribbon-tab-similar-notes": "समान नोट्स रिबन टैब टॉगल करें",
|
||||
"toggle-right-pane": "दायां पैनल टॉगल करें",
|
||||
"print-active-note": "एक्टिव नोट प्रिंट करें",
|
||||
"export-active-note-as-pdf": "एक्टिव नोट को PDF के रूप में एक्सपोर्ट करें",
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
"attributes-labels-and-relations": "Atributi (oznake i relacije)",
|
||||
"add-new-label": "Stvori novu oznaku",
|
||||
"create-new-relation": "Stvori novu relaciju",
|
||||
"ribbon-tabs": "Vrpčane kartice",
|
||||
"toggle-link-map": "Uključi/Isključi Kartu Poveznica",
|
||||
"other": "Ostalo",
|
||||
"toggle-right-pane": "Uključi/isključi prikaz desnog okna, koje uključuje Sadržaj i Istaknuto",
|
||||
"open-note-externally": "Otvori bilješku kao datoteku u zadanoj aplikaciji",
|
||||
|
||||
@@ -48,8 +48,6 @@
|
||||
"attributes-labels-and-relations": "Atribut (label & relasi)",
|
||||
"add-new-label": "Buat label baru",
|
||||
"create-new-relation": "Buat relasi baru",
|
||||
"ribbon-tabs": "Tab pita",
|
||||
"toggle-link-map": "Alihkan Peta Tautan",
|
||||
"other": "Yang lain",
|
||||
"toggle-right-pane": "Alihkan tampilan panel kanan, yang mencakup Daftar Isi dan Sorotan"
|
||||
},
|
||||
|
||||
@@ -81,20 +81,8 @@
|
||||
"edit-read-only-note": "Modifica nota in sola lettura",
|
||||
"add-new-label": "Aggiungi una nuova etichetta",
|
||||
"add-new-relation": "Aggiungi una nuova relazione",
|
||||
"toggle-ribbon-tab-classic-editor": "Mostra/Nascondi il nastro delle schede nell'editor classico",
|
||||
"copy-without-formatting": "Copia senza formattazione",
|
||||
"force-save-revision": "Forza il salvataggio della revisione",
|
||||
"toggle-ribbon-tab-basic-properties": "Mostra/Nascondi le proprietà di base",
|
||||
"toggle-ribbon-tab-book-properties": "Mostra/Nascondi le proprietà del libro",
|
||||
"toggle-ribbon-tab-file-properties": "Mostra/Nascondi le proprietà del file",
|
||||
"toggle-ribbon-tab-image-properties": "Mostra/Nascondi le proprietà dell'immagine",
|
||||
"toggle-ribbon-tab-owned-attributes": "Mostra/Nascondi le proprietà proprie",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Mostra/Nascondi le proprietà ereditate",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Mostra/Nascondi le proprietà promosse",
|
||||
"toggle-ribbon-tab-note-map": "Mostra/Nascondi la mappa delle note",
|
||||
"toggle-ribbon-tab-note-info": "Mostra/Nascondi le informazioni sulla nota",
|
||||
"toggle-ribbon-tab-note-paths": "Mostra/Nascondi i percorsi della nota",
|
||||
"toggle-ribbon-tab-similar-notes": "Mostra/Nascondi le note simili",
|
||||
"save-named-revision": "Salva Revisione con Nome",
|
||||
"toggle-archived-notes": "Attiva/disattiva la visualizzazione delle note archiviate",
|
||||
"show-deleted-notes": "Mostra le note eliminate",
|
||||
@@ -289,8 +277,6 @@
|
||||
"attributes-labels-and-relations": "Attributi (etichette e relazioni)",
|
||||
"add-new-label": "Crea una nuova etichetta",
|
||||
"create-new-relation": "Crea una nuova relazione",
|
||||
"ribbon-tabs": "Barra delle schede",
|
||||
"toggle-link-map": "Mostra/Nascondi la mappa dei collegamenti",
|
||||
"other": "Altro",
|
||||
"toggle-right-pane": "Attiva/Disattiva la visualizzazione del riquadro destro, che include l'indice e gli elementi evidenziati",
|
||||
"open-note-externally": "Apri nota come file con l'applicazione predefinita",
|
||||
@@ -301,10 +287,8 @@
|
||||
"note-navigation": "Navigazione note",
|
||||
"copy-without-formatting": "Copia il testo selezionato senza formattazione",
|
||||
"force-save-revision": "Forza la creazione o il salvataggio di una nuova revisione della nota corrente",
|
||||
"toggle-book-properties": "Mostra/Nascondi le proprietà della collezione",
|
||||
"toggle-zen-mode": "Abilita/disabilita la modalità Zen (Interfaccia minimale per una scrittura senza distrazioni)",
|
||||
"toggle-left-note-tree-panel": "Mostra/Nascondi il pannello di sinistra (albero delle note)",
|
||||
"toggle-classic-editor-toolbar": "Mostra/Nascondi il pannello della formattazione per l'editor con la barra degli strumenti fissa",
|
||||
"unhoist": "Rimuovi qualsiasi ancoraggio",
|
||||
"save-named-revision": "Salva una revisione con nome della nota attiva",
|
||||
"toggle-archived-notes": "Mostra/nascondi le note archiviate nell'albero delle note",
|
||||
|
||||
@@ -38,8 +38,6 @@
|
||||
"insert-date-and-time-to-text": "現在の日時を挿入する",
|
||||
"paste-markdown-into-text": "クリップボードからマークダウンをテキストノートに貼り付けます",
|
||||
"cut-into-note": "現在のノートから選択範囲を切り取り、サブノートを作成",
|
||||
"ribbon-tabs": "リボンタブ",
|
||||
"toggle-link-map": "リンクマップ切り替え",
|
||||
"other": "その他",
|
||||
"toggle-right-pane": "目次とハイライトを含む右ペインの表示を切り替え",
|
||||
"open-note-externally": "デフォルトのアプリケーションでノートをファイルとして開く",
|
||||
@@ -60,11 +58,9 @@
|
||||
"create-new-relation": "新しいリレーションを作成する",
|
||||
"toggle-note-hoisting": "ノートホイスト切り替え",
|
||||
"unhoist": "すべてのホイストを無効にする",
|
||||
"toggle-book-properties": "コレクションプロパティ切り替え",
|
||||
"toggle-zen-mode": "禅モード(集中した編集のための最小限のUI)を有効/無効にする",
|
||||
"add-include-note-to-text": "ノートを埋め込むダイアログを開く",
|
||||
"force-save-revision": "アクティブノートの新しいノートリヴィジョンを強制する",
|
||||
"toggle-classic-editor-toolbar": "固定ツールバーエディターの書式設定タブ切り替え",
|
||||
"save-named-revision": "アクティブなノートの変更履歴を名前を付けて保存",
|
||||
"toggle-archived-notes": "ノートツリーでアーカイブされたノートを表示 / 非表示にする",
|
||||
"peek-right-pane": "右ペインを、コンテンツの上にフローティング表示し、フォーカスが外れると閉じる一時的なパネルとしてプレビューします",
|
||||
@@ -159,22 +155,10 @@
|
||||
"show-revisions": "変更履歴を表示",
|
||||
"add-new-label": "ラベルを追加",
|
||||
"add-new-relation": "リレーションを追加",
|
||||
"toggle-ribbon-tab-basic-properties": "リボンタブ切り替え:基本属性",
|
||||
"toggle-ribbon-tab-book-properties": "リボンタブ切り替え:書籍属性",
|
||||
"toggle-ribbon-tab-file-properties": "リボンタブ切り替え:ファイル属性",
|
||||
"toggle-ribbon-tab-image-properties": "リボンタブ切り替え:画像属性",
|
||||
"toggle-ribbon-tab-owned-attributes": "リボンタブ切り替え:所有属性",
|
||||
"toggle-ribbon-tab-inherited-attributes": "リボンタブ切り替え:継承属性",
|
||||
"toggle-ribbon-tab-note-map": "リボンタブ切り替え:ノートマップ",
|
||||
"toggle-ribbon-tab-note-info": "リボンタブ切り替え:ノート情報",
|
||||
"toggle-ribbon-tab-note-paths": "リボンタブ切り替え:ノートパス",
|
||||
"toggle-ribbon-tab-similar-notes": "リボンタブ切り替え:類似ノート",
|
||||
"toggle-note-hoisting": "ノートホイスト切り替え",
|
||||
"unhoist-note": "ノートホイストを無効にする",
|
||||
"force-save-revision": "強制保存リビジョン",
|
||||
"add-include-note-to-text": "埋め込みノートを追加",
|
||||
"toggle-ribbon-tab-classic-editor": "リボンタブのクラシックエディターに切り替える",
|
||||
"toggle-ribbon-tab-promoted-attributes": "リボンタブ切り替え:プロモート属性",
|
||||
"save-named-revision": "変更履歴を名前を付けて保存",
|
||||
"toggle-archived-notes": "アーカイブ済みノートの表示の切り替え",
|
||||
"peek-right-pane": "右ペインをピーク表示",
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
"attributes-labels-and-relations": "속성(라벨 및 관계)",
|
||||
"add-new-label": "새 라벨 만들기",
|
||||
"create-new-relation": "새 관계 만들기",
|
||||
"ribbon-tabs": "리본 탭",
|
||||
"render-active-note": "활성 노트를 렌더링(다시 렌더링)",
|
||||
"run-active-note": "활성 JavaScript(프런트엔드/백엔드) 코드 노트 실행",
|
||||
"toggle-note-hoisting": "활성 노트 루트 보기 전환",
|
||||
@@ -55,15 +54,12 @@
|
||||
"paste-markdown-into-text": "클립보드의 Markdown을 텍스트 노트에 붙여넣기",
|
||||
"cut-into-note": "현재 노트의 선택 영역을 잘라 하위 노트로 만들기",
|
||||
"add-include-note-to-text": "노트 포함 대화 상자 열기",
|
||||
"toggle-link-map": "링크 지도 전환",
|
||||
"other": "기타",
|
||||
"toggle-right-pane": "오른쪽 창(목차와 하이라이트) 표시 여부 전환",
|
||||
"open-note-externally": "기본 애플리케이션에서 노트를 파일로 열기",
|
||||
"note-navigation": "노트 탐색",
|
||||
"copy-without-formatting": "선택한 텍스트를 서식 없이 복사",
|
||||
"force-save-revision": "활성 노트의 새 수정본 강제 생성/저장",
|
||||
"toggle-book-properties": "컬렉션 속성 전환",
|
||||
"toggle-classic-editor-toolbar": "고정 도구 모음 편집기의 서식 탭 전환",
|
||||
"toggle-zen-mode": "젠 모드 전환(집중 편집을 위한 최소 UI)",
|
||||
"toggle-archived-notes": "노트 트리에서 보관된 노트 표시/숨기기",
|
||||
"peek-right-pane": "오른쪽 창을 콘텐츠 위의 임시 패널로 표시하고 포커스를 잃으면 닫기",
|
||||
@@ -201,8 +197,6 @@
|
||||
"edit-read-only-note": "읽기 전용 노트 편집",
|
||||
"add-new-label": "새 라벨 추가",
|
||||
"add-new-relation": "새 관계 추가",
|
||||
"toggle-ribbon-tab-classic-editor": "클래식 편집기 리본 탭 전환",
|
||||
"toggle-ribbon-tab-basic-properties": "기본 속성 리본 탭 전환",
|
||||
"print-active-note": "활성 노트 인쇄",
|
||||
"export-active-note-as-pdf": "활성 노트를 PDF로 내보내기",
|
||||
"reload-frontend-app": "프런트엔드 앱 다시 로드",
|
||||
@@ -237,16 +231,6 @@
|
||||
"add-link-to-text": "텍스트에 링크 추가",
|
||||
"cut-into-note": "선택 영역을 노트로 만들기",
|
||||
"add-include-note-to-text": "텍스트에 노트 포함",
|
||||
"toggle-ribbon-tab-book-properties": "책 속성 리본 탭 전환",
|
||||
"toggle-ribbon-tab-file-properties": "파일 속성 리본 탭 전환",
|
||||
"toggle-ribbon-tab-image-properties": "이미지 속성 리본 탭 전환",
|
||||
"toggle-ribbon-tab-owned-attributes": "직접 속성 리본 탭 전환",
|
||||
"toggle-ribbon-tab-inherited-attributes": "상속 속성 리본 탭 전환",
|
||||
"toggle-ribbon-tab-promoted-attributes": "표시 속성 리본 탭 전환",
|
||||
"toggle-ribbon-tab-note-map": "노트 지도 리본 탭 전환",
|
||||
"toggle-ribbon-tab-note-info": "노트 정보 리본 탭 전환",
|
||||
"toggle-ribbon-tab-note-paths": "노트 경로 리본 탭 전환",
|
||||
"toggle-ribbon-tab-similar-notes": "유사한 노트 리본 탭 전환",
|
||||
"toggle-right-pane": "오른쪽 창 전환",
|
||||
"peek-right-pane": "오른쪽 창 미리보기",
|
||||
"open-note-externally": "외부 애플리케이션에서 노트 열기",
|
||||
|
||||
@@ -41,8 +41,6 @@
|
||||
"attributes-labels-and-relations": "Attributen (labels & relaties)",
|
||||
"add-new-label": "Maak een nieuw label",
|
||||
"create-new-relation": "Maak een nieuwe relatie",
|
||||
"ribbon-tabs": "Lint tabbladen",
|
||||
"toggle-link-map": "Toon/verberg Verbindingen Overzicht",
|
||||
"other": "Andere",
|
||||
"toggle-right-pane": "Toon/verberg het rechter paneel met de Inhoudstafel en Hoogtepunten",
|
||||
"open-note-externally": "Open de notitie als een bestand met de standaard toepassing",
|
||||
@@ -56,8 +54,6 @@
|
||||
"copy-without-formatting": "Kopieer de geselecteerde tekst zonder opmaak",
|
||||
"force-save-revision": "Forceer aanmaak / opslaan van een nieuwe notitie revisie van de actieve notitie",
|
||||
"save-named-revision": "Sla een revisie met naam op van de actieve notitie",
|
||||
"toggle-book-properties": "Toon/verberg Verzameling Eigenschappen",
|
||||
"toggle-classic-editor-toolbar": "Toon/verberg de Opmaak tab voor de editor met vaste knoppenbalk",
|
||||
"toggle-zen-mode": "Schakel zen modus in of uit (minimale interface voor bewerken met meer focus)",
|
||||
"show-cheatsheet": "Toon een venster met veelgebruikte toetsenbord handelingen",
|
||||
"text-note-operations": "Tekst Notitie handelingen",
|
||||
@@ -134,18 +130,6 @@
|
||||
"edit-read-only-note": "Bewerk Alleen-Lezen Notitie",
|
||||
"add-new-label": "Voeg een nieuw Label toe",
|
||||
"add-new-relation": "Voeg een nieuwe Relatie toe",
|
||||
"toggle-ribbon-tab-classic-editor": "Toon / Verberg de Klassieke Editor op de Lint Tab",
|
||||
"toggle-ribbon-tab-basic-properties": "Toon / Verberg de Basis Eigenschappen op de Lint Tab",
|
||||
"toggle-ribbon-tab-book-properties": "Toon / Verberg de Boek Eigenschappen op de Lint Tab",
|
||||
"toggle-ribbon-tab-file-properties": "Toon / Verberg de Bestandseigenschappen op de Lint Tab",
|
||||
"toggle-ribbon-tab-image-properties": "Toon / Verberg de Afbeelding Eigenschappen op de Lint Tab",
|
||||
"toggle-ribbon-tab-owned-attributes": "Toon / Verberg de Eigen Attributen op de Lint Tab",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Toon / Verberg de Geërfde Attributen op de Lint Tab",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Toon / Verberg de Gepromoveerde Attributen op de Lint Tab",
|
||||
"toggle-ribbon-tab-note-map": "Toon / Verberg het Notitie Overzicht op de Lint Tab",
|
||||
"toggle-ribbon-tab-note-info": "Toon / Verberg de Notitie Informatie op de Lint Tab",
|
||||
"toggle-ribbon-tab-note-paths": "Toon / Verberg de Notitie Paden op de Lint Tab",
|
||||
"toggle-ribbon-tab-similar-notes": "Toon / Verberg de Gelijkaardige Notities op de Lint Tab",
|
||||
"toggle-right-pane": "Toon / Verberg het rechter Paneel",
|
||||
"print-active-note": "Druk de Actieve Notitie af",
|
||||
"export-active-note-as-pdf": "Exporteer de Actieve Notitie als PDF",
|
||||
|
||||
@@ -54,12 +54,8 @@
|
||||
"note-navigation": "Nawigacja notatek",
|
||||
"copy-without-formatting": "Kopiuj bez formatowania",
|
||||
"force-save-revision": "Wymuś utworzenie/zapisanie nowej rewizji aktywnej notatki",
|
||||
"toggle-book-properties": "Przełącz właściwości kolekcji",
|
||||
"toggle-left-note-tree-panel": "Przełącz lewy panel (drzewo notatek)",
|
||||
"toggle-classic-editor-toolbar": "Przełącz pasek narzędzi formatowania edytora",
|
||||
"add-include-note-to-text": "Otwórz okno dołączania (include) notatki",
|
||||
"ribbon-tabs": "Karty wstążki",
|
||||
"toggle-link-map": "Przełącz mapę linków",
|
||||
"toggle-right-pane": "Przełącz prawy panel (spis treści i wyróżnienia)",
|
||||
"run-active-note": "Uruchom aktywny kod JavaScript (frontend/backend)",
|
||||
"toggle-note-hoisting": "Włącz/wyłącz skupienie na bieżącej notatce",
|
||||
@@ -146,18 +142,6 @@
|
||||
"follow-link-under-cursor": "Podążaj za linkiem",
|
||||
"insert-date-and-time-to-text": "Wstaw datę i czas",
|
||||
"add-include-note-to-text": "Dołącz notatkę do tekstu",
|
||||
"toggle-ribbon-tab-classic-editor": "Przełącz kartę edytora klasycznego",
|
||||
"toggle-ribbon-tab-basic-properties": "Przełącz kartę właściwości podstawowych",
|
||||
"toggle-ribbon-tab-book-properties": "Przełącz kartę właściwości kolekcji",
|
||||
"toggle-ribbon-tab-file-properties": "Przełącz kartę właściwości pliku",
|
||||
"toggle-ribbon-tab-image-properties": "Przełącz kartę właściwości obrazu",
|
||||
"toggle-ribbon-tab-owned-attributes": "Przełącz kartę atrybutów własnych",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Przełącz kartę atrybutów odziedziczonych",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Przełącz kartę atrybutów promowanych",
|
||||
"toggle-ribbon-tab-note-map": "Przełącz kartę mapy notatek",
|
||||
"toggle-ribbon-tab-note-info": "Przełącz kartę informacji o notatce",
|
||||
"toggle-ribbon-tab-note-paths": "Przełącz kartę ścieżek notatki",
|
||||
"toggle-ribbon-tab-similar-notes": "Przełącz kartę podobnych notatek",
|
||||
"toggle-right-pane": "Przełącz prawy panel",
|
||||
"toggle-note-hoisting": "Przełącz windowanie notatki",
|
||||
"unhoist-note": "Cofnij windowanie",
|
||||
|
||||
@@ -48,8 +48,6 @@
|
||||
"attributes-labels-and-relations": "Atributos (rótulos e relações)",
|
||||
"add-new-label": "Criar rótulo",
|
||||
"create-new-relation": "Criar relação",
|
||||
"ribbon-tabs": "Guias da faixa",
|
||||
"toggle-link-map": "Alternar Mapa de Ligações",
|
||||
"other": "Outros",
|
||||
"toggle-right-pane": "Alternar a exibição do painel direito, que inclui Sumário e Destaques",
|
||||
"open-note-externally": "Abrir nota como ficheiro na aplicação predefiinida",
|
||||
@@ -62,8 +60,6 @@
|
||||
"note-navigation": "Navegação de notas",
|
||||
"copy-without-formatting": "Copiar texto selecionado sem formatação",
|
||||
"force-save-revision": "Forçar a criação/gravação de uma nova revisão da nota atual",
|
||||
"toggle-book-properties": "Alternar propriedades do book",
|
||||
"toggle-classic-editor-toolbar": "Alternar a guia de Formatação no editor com barra de ferramentas fixa",
|
||||
"toggle-zen-mode": "Ativa/desativa o modo zen (interface mínima para uma edição mais focada)"
|
||||
},
|
||||
"keyboard_action_names": {
|
||||
@@ -132,18 +128,6 @@
|
||||
"edit-read-only-note": "Editar Nota Somente-Leitura",
|
||||
"add-new-label": "Adicionar Nova Etiqueta",
|
||||
"add-new-relation": "Adicionar Nova Relação",
|
||||
"toggle-ribbon-tab-classic-editor": "Alternar Guia da Faixa de Opções Editor Clássico",
|
||||
"toggle-ribbon-tab-basic-properties": "Alternar Guia da Faixa de Opções Propriedades Básicas",
|
||||
"toggle-ribbon-tab-book-properties": "Alternar Guia da Faixa de Opções Propriedades do Livro",
|
||||
"toggle-ribbon-tab-file-properties": "Alternar Guia da Faixa de Opções Propriedades do Ficheiro",
|
||||
"toggle-ribbon-tab-image-properties": "Alternar Guia da Faixa de Opções Propriedades da Imagem",
|
||||
"toggle-ribbon-tab-owned-attributes": "Alternar Guia da Faixa de Opções Atributos Possuídos",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Alternar Guia da Faixa de Opções Atributos Herdados",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Alternar Guia da Faixa de Opções Atributos Promovidos",
|
||||
"toggle-ribbon-tab-note-map": "Alternar Guia da Faixa de Opções Mapa de Notas",
|
||||
"toggle-ribbon-tab-note-info": "Alternar Guia da Faixa de Opções Informações da Nota",
|
||||
"toggle-ribbon-tab-note-paths": "Alternar Guia da Faixa de Opções Caminhos de Nota",
|
||||
"toggle-ribbon-tab-similar-notes": "Alternar Guia da Faixa de Opções Notas Semelhantes",
|
||||
"toggle-right-pane": "Alternar Painel Direito",
|
||||
"print-active-note": "Imprimir Nota Atual",
|
||||
"export-active-note-as-pdf": "Exportar Nota Atual como PDF",
|
||||
|
||||
@@ -38,8 +38,6 @@
|
||||
"attributes-labels-and-relations": "Atributos (rótulos e relações)",
|
||||
"add-new-label": "Criar novo rótulo",
|
||||
"create-new-relation": "Criar nova relação",
|
||||
"ribbon-tabs": "Abas da faixa",
|
||||
"toggle-link-map": "Alternar Mapa de Links",
|
||||
"other": "Outros",
|
||||
"toggle-right-pane": "Alternar a exibição do painel direito, que inclui Sumário e Destaques",
|
||||
"open-note-externally": "Abrir nota como arquivo no aplicativo padrão",
|
||||
@@ -52,8 +50,6 @@
|
||||
"copy-without-formatting": "Copiar texto selecionado sem formatação",
|
||||
"force-save-revision": "Forçar a criação/salvamento de uma nova revisão da nota atual",
|
||||
"show-help": "Exibir Ajuda integrada / colinha",
|
||||
"toggle-book-properties": "Alternar propriedades do book",
|
||||
"toggle-classic-editor-toolbar": "Alternar a aba de Formatação no editor com barra de ferramentas fixa",
|
||||
"back-in-note-history": "Navegar para a nota anterior no histórico",
|
||||
"forward-in-note-history": "Navegar para a próxima nota no histórico",
|
||||
"scroll-to-active-note": "Rolar a árvore de notas até a nota atual",
|
||||
@@ -198,18 +194,6 @@
|
||||
"edit-read-only-note": "Editar Nota Somente-Leitura",
|
||||
"add-new-label": "Adicionar Nova Etiqueta",
|
||||
"add-new-relation": "Adicionar Nova Relação",
|
||||
"toggle-ribbon-tab-classic-editor": "Alternar Guia da Faixa de Opções Editor Clássico",
|
||||
"toggle-ribbon-tab-basic-properties": "Alternar Guia da Faixa de Opções Propriedades Básicas",
|
||||
"toggle-ribbon-tab-book-properties": "Alternar Guia da Faixa de Opções Propriedades do Livro",
|
||||
"toggle-ribbon-tab-file-properties": "Alternar Guia da Faixa de Opções Propriedades do Arquivo",
|
||||
"toggle-ribbon-tab-image-properties": "Alternar Guia da Faixa de Opções Propriedades da Imagem",
|
||||
"toggle-ribbon-tab-owned-attributes": "Alternar Guia da Faixa de Opções Atributos Possuídos",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Alternar Guia da Faixa de Opções Atributos Herdados",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Alternar Guia da Faixa de Opções Atributos Promovidos",
|
||||
"toggle-ribbon-tab-note-map": "Alternar Guia da Faixa de Opções Mapa de Notas",
|
||||
"toggle-ribbon-tab-note-info": "Alternar Guia da Faixa de Opções Informações da Nota",
|
||||
"toggle-ribbon-tab-note-paths": "Alternar Guia da Faixa de Opções Caminhos de Nota",
|
||||
"toggle-ribbon-tab-similar-notes": "Alternar Guia da Faixa de Opções Notas Semelhantes",
|
||||
"toggle-right-pane": "Alternar Painel Direito",
|
||||
"print-active-note": "Imprimir Nota Atual",
|
||||
"export-active-note-as-pdf": "Exportar Nota Atual como PDF",
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
"paste-notes-from-clipboard": "Lipește notițele din clipboard în notița activă",
|
||||
"render-active-note": "Reîmprospătează notița activă",
|
||||
"reopen-last-tab": "Deschide din nou ultimul tab închis",
|
||||
"ribbon-tabs": "Tab-urile din panglică",
|
||||
"run-active-note": "Rulează notița curentă de tip JavaScript (frontend sau backend)",
|
||||
"search-in-subtree": "Caută notițe în ierarhia notiței active",
|
||||
"select-all-notes-in-parent": "Selectează toate notițele din nivelul notiței curente",
|
||||
@@ -47,14 +46,11 @@
|
||||
"toggle-archived-notes": "Afișează/ascunde notițele arhivate din arborele de notițe",
|
||||
"tabs-and-windows": "Tab-uri și ferestre",
|
||||
"text-note-operations": "Operații asupra notițelor text",
|
||||
"toggle-book-properties": "Comută tab-ul „Proprietăți ale cărții”",
|
||||
"toggle-left-note-tree-panel": "Comută panoul din stânga (arborele notițelor)",
|
||||
"toggle-link-map": "Comută harta legăturilor",
|
||||
"toggle-note-hoisting": "Comută focalizarea pe notița curentă",
|
||||
"toggle-right-pane": "Comută afișarea panoului din dreapta, ce include tabela de conținut și evidențieri",
|
||||
"toggle-tray": "Afișează/ascunde aplicația din tray-ul de sistem",
|
||||
"unhoist": "Defocalizează complet",
|
||||
"toggle-classic-editor-toolbar": "Comută tab-ul „Formatare” pentru editorul cu bară fixă",
|
||||
"show-cheatsheet": "Afișează o fereastră cu scurtături de la tastatură comune",
|
||||
"toggle-zen-mode": "Activează/dezactivează modul zen (o interfață minimală, fără distrageri)",
|
||||
"back-in-note-history": "Mergi la notița anterioară din istoric",
|
||||
@@ -312,18 +308,6 @@
|
||||
"edit-read-only-note": "Editează notiță ce este în modul citire",
|
||||
"add-new-label": "Adaugă o nouă etichetă",
|
||||
"add-new-relation": "Adaugă o nouă relație",
|
||||
"toggle-ribbon-tab-classic-editor": "Comută la tab-ul de panglică pentru formatare text",
|
||||
"toggle-ribbon-tab-basic-properties": "Comută la tab-ul de panglică pentru proprietăți de bază",
|
||||
"toggle-ribbon-tab-book-properties": "Comută la tab-ul de panglică pentru proprietăți colecție",
|
||||
"toggle-ribbon-tab-file-properties": "Comută la tab-ul de panglică pentru proprietăți fișier",
|
||||
"toggle-ribbon-tab-image-properties": "Comută la tab-ul de panglică pentru proprietăți imagini",
|
||||
"toggle-ribbon-tab-owned-attributes": "Comută la tab-ul de panglică pentru atribute proprii",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Comută la tab-ul de panglică pentru atribute moștenite",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Comută la tab-ul de panglică pentru atribute promovate",
|
||||
"toggle-ribbon-tab-note-map": "Comută la tab-ul de panglică pentru harta notiței",
|
||||
"toggle-ribbon-tab-note-info": "Comută la tab-ul de panglică pentru informații despre notiță",
|
||||
"toggle-ribbon-tab-note-paths": "Comută la tab-ul de panglică pentru căile notiței",
|
||||
"toggle-ribbon-tab-similar-notes": "Comută la tab-ul de panglică pentru notițe similare",
|
||||
"toggle-right-pane": "Comută panoul din dreapta",
|
||||
"print-active-note": "Imprimă notița activă",
|
||||
"export-active-note-as-pdf": "Exportă notița activă ca PDF",
|
||||
|
||||
@@ -48,8 +48,6 @@
|
||||
"attributes-labels-and-relations": "Атрибуты (метки и отношения)",
|
||||
"add-new-label": "Создать новую заметку",
|
||||
"create-new-relation": "Создать новое отношение",
|
||||
"ribbon-tabs": "Вкладки ленты",
|
||||
"toggle-link-map": "Перейти к картуессылок",
|
||||
"other": "Прочее",
|
||||
"toggle-right-pane": "Переключить отображение правой панели, которая включает оглавление и акценты",
|
||||
"open-note-externally": "Открыть заметку как файл с помощью приложения по умолчанию",
|
||||
@@ -59,8 +57,6 @@
|
||||
"toggle-left-note-tree-panel": "Отобразить левую панель (дерево)",
|
||||
"note-navigation": "Навигация по заметке",
|
||||
"copy-without-formatting": "Скопировать выделенный текст без форматирования",
|
||||
"toggle-book-properties": "Перейти к свойствам коллекции",
|
||||
"toggle-classic-editor-toolbar": "Перейти на вкладку «Форматирование» для редактора с фиксированной панелью инструментов",
|
||||
"toggle-zen-mode": "Включает/отключает режим дзен (минимальный пользовательский интерфейс для фокусирования)",
|
||||
"toggle-note-hoisting": "Переключить фокус активной заметки",
|
||||
"unhoist": "Убрать фокус с любой заметки",
|
||||
@@ -230,7 +226,6 @@
|
||||
"edit-read-only-note": "Редактировать заметку только для чтения",
|
||||
"add-new-label": "Добавить новую метку",
|
||||
"add-new-relation": "Добавить новое отношение",
|
||||
"toggle-ribbon-tab-classic-editor": "Переключить Классический редактор",
|
||||
"zoom-out": "Уменьшить масштаб",
|
||||
"zoom-in": "Увеличить масштаб",
|
||||
"open-note-externally": "Открыть заметку вне приложения",
|
||||
@@ -248,17 +243,6 @@
|
||||
"render-active-note": "Рендеринг активной заметки",
|
||||
"run-active-note": "Запуск активной заметки",
|
||||
"add-include-note-to-text": "Добавить включение другой заметки в текст",
|
||||
"toggle-ribbon-tab-basic-properties": "Переключить на вкладку \"Общее\"",
|
||||
"toggle-ribbon-tab-book-properties": "Переключить на вкладку \"Свойства книги\"",
|
||||
"toggle-ribbon-tab-file-properties": "Переключить на вкладку \"Свойства файла\"",
|
||||
"toggle-ribbon-tab-image-properties": "Переключить на вкладку \"Свойства изображения\"",
|
||||
"toggle-ribbon-tab-owned-attributes": "Переключить на вкладку \"Атрибуты\"",
|
||||
"toggle-ribbon-tab-inherited-attributes": "Переключить на вкладку \"Унаследованные атрибуты\"",
|
||||
"toggle-ribbon-tab-promoted-attributes": "Переключить на вкладку \"Продвигаемые атрибуты\"",
|
||||
"toggle-ribbon-tab-note-map": "Переключить на вкладку \"Карта заметок\"",
|
||||
"toggle-ribbon-tab-note-info": "Переключить на вкладку \"Информация о заметке\"",
|
||||
"toggle-ribbon-tab-note-paths": "Переключить на вкладку \"Пути к заметке\"",
|
||||
"toggle-ribbon-tab-similar-notes": "Переключить на вкладку \"Похожие заметки\"",
|
||||
"export-active-note-as-pdf": "Экспортировать активную заметку в формате PDF",
|
||||
"toggle-note-hoisting": "Переключить закрепление заметки",
|
||||
"save-named-revision": "Сохранить именованную ревизию",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user