mirror of
https://github.com/zadam/trilium.git
synced 2025-12-23 00:29:59 +01:00
Merge remote-tracking branch 'origin/main' into react/type_widgets
This commit is contained in:
@@ -2,6 +2,7 @@ import { KeyboardActionNames } from "@triliumnext/commons";
|
||||
import keyboardActionService, { getActionSync } from "../services/keyboard_actions.js";
|
||||
import note_tooltip from "../services/note_tooltip.js";
|
||||
import utils from "../services/utils.js";
|
||||
import { should } from "vitest";
|
||||
|
||||
export interface ContextMenuOptions<T> {
|
||||
x: number;
|
||||
@@ -14,8 +15,13 @@ export interface ContextMenuOptions<T> {
|
||||
onHide?: () => void;
|
||||
}
|
||||
|
||||
interface MenuSeparatorItem {
|
||||
title: "----";
|
||||
export interface MenuSeparatorItem {
|
||||
kind: "separator";
|
||||
}
|
||||
|
||||
export interface MenuHeader {
|
||||
title: string;
|
||||
kind: "header";
|
||||
}
|
||||
|
||||
export interface MenuItemBadge {
|
||||
@@ -45,7 +51,7 @@ export interface MenuCommandItem<T> {
|
||||
columns?: number;
|
||||
}
|
||||
|
||||
export type MenuItem<T> = MenuCommandItem<T> | MenuSeparatorItem;
|
||||
export type MenuItem<T> = MenuCommandItem<T> | MenuSeparatorItem | MenuHeader;
|
||||
export type MenuHandler<T> = (item: MenuCommandItem<T>, e: JQuery.MouseDownEvent<HTMLElement, undefined, HTMLElement, HTMLElement>) => void;
|
||||
export type ContextMenuEvent = PointerEvent | MouseEvent | JQuery.ContextMenuEvent;
|
||||
|
||||
@@ -150,14 +156,51 @@ class ContextMenu {
|
||||
.addClass("show");
|
||||
}
|
||||
|
||||
addItems($parent: JQuery<HTMLElement>, items: MenuItem<any>[]) {
|
||||
for (const item of items) {
|
||||
addItems($parent: JQuery<HTMLElement>, items: MenuItem<any>[], multicolumn = false) {
|
||||
let $group = $parent; // The current group or parent element to which items are being appended
|
||||
let shouldStartNewGroup = false; // If true, the next item will start a new group
|
||||
let shouldResetGroup = false; // If true, the next item will be the last one from the group
|
||||
|
||||
for (let index = 0; index < items.length; index++) {
|
||||
const item = items[index];
|
||||
if (!item) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (item.title === "----") {
|
||||
$parent.append($("<div>").addClass("dropdown-divider"));
|
||||
// If the current item is a header, start a new group. This group will contain the
|
||||
// header and the next item that follows the header.
|
||||
if ("kind" in item && item.kind === "header") {
|
||||
if (multicolumn && !shouldResetGroup) {
|
||||
shouldStartNewGroup = true;
|
||||
}
|
||||
}
|
||||
|
||||
// If the next item is a separator, start a new group. This group will contain the
|
||||
// current item, the separator, and the next item after the separator.
|
||||
const nextItem = (index < items.length - 1) ? items[index + 1] : null;
|
||||
if (multicolumn && nextItem && "kind" in nextItem && nextItem.kind === "separator") {
|
||||
if (!shouldResetGroup) {
|
||||
shouldStartNewGroup = true;
|
||||
} else {
|
||||
shouldResetGroup = true; // Continue the current group
|
||||
}
|
||||
}
|
||||
|
||||
// Create a new group to avoid column breaks before and after the seaparator / header.
|
||||
// This is a workaround for Firefox not supporting break-before / break-after: avoid
|
||||
// for columns.
|
||||
if (shouldStartNewGroup) {
|
||||
$group = $("<div class='dropdown-no-break'>");
|
||||
$parent.append($group);
|
||||
shouldStartNewGroup = false;
|
||||
}
|
||||
|
||||
if ("kind" in item && item.kind === "separator") {
|
||||
$group.append($("<div>").addClass("dropdown-divider"));
|
||||
shouldResetGroup = true; // End the group after the next item
|
||||
} else if ("kind" in item && item.kind === "header") {
|
||||
$group.append($("<h6>").addClass("dropdown-header").text(item.title));
|
||||
shouldResetGroup = true;
|
||||
} else {
|
||||
const $icon = $("<span>");
|
||||
|
||||
@@ -259,16 +302,24 @@ class ContextMenu {
|
||||
$link.addClass("dropdown-toggle");
|
||||
|
||||
const $subMenu = $("<ul>").addClass("dropdown-menu");
|
||||
if (!this.isMobile && item.columns) {
|
||||
$subMenu.css("column-count", item.columns);
|
||||
const hasColumns = !!item.columns && item.columns > 1;
|
||||
if (!this.isMobile && hasColumns) {
|
||||
$subMenu.css("column-count", item.columns!);
|
||||
}
|
||||
|
||||
this.addItems($subMenu, item.items);
|
||||
this.addItems($subMenu, item.items, hasColumns);
|
||||
|
||||
$item.append($subMenu);
|
||||
}
|
||||
|
||||
$parent.append($item);
|
||||
$group.append($item);
|
||||
|
||||
// After adding a menu item, if the previous item was a separator or header,
|
||||
// reset the group so that the next item will be appended directly to the parent.
|
||||
if (shouldResetGroup) {
|
||||
$group = $parent;
|
||||
shouldResetGroup = false;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ function setupContextMenu() {
|
||||
handler: () => webContents.session.addWordToSpellCheckerDictionary(params.misspelledWord)
|
||||
});
|
||||
|
||||
items.push({ title: `----` });
|
||||
items.push({ kind: "separator" });
|
||||
}
|
||||
|
||||
if (params.isEditable) {
|
||||
@@ -112,7 +112,7 @@ function setupContextMenu() {
|
||||
// Replace the placeholder with the real search keyword.
|
||||
let searchUrl = searchEngineUrl.replace("{keyword}", encodeURIComponent(params.selectionText));
|
||||
|
||||
items.push({ title: "----" });
|
||||
items.push({ kind: "separator" });
|
||||
|
||||
items.push({
|
||||
title: t("electron_context_menu.search_online", { term: shortenedSelection, searchEngine: searchEngineName }),
|
||||
|
||||
@@ -45,16 +45,16 @@ export default class LauncherContextMenu implements SelectMenuItemEventListener<
|
||||
isVisibleRoot || isAvailableRoot ? { title: t("launcher_context_menu.add-script-launcher"), command: "addScriptLauncher", uiIcon: "bx bx-code-curly" } : null,
|
||||
isVisibleRoot || isAvailableRoot ? { title: t("launcher_context_menu.add-custom-widget"), command: "addWidgetLauncher", uiIcon: "bx bx-customize" } : null,
|
||||
isVisibleRoot || isAvailableRoot ? { title: t("launcher_context_menu.add-spacer"), command: "addSpacerLauncher", uiIcon: "bx bx-dots-horizontal" } : null,
|
||||
isVisibleRoot || isAvailableRoot ? { title: "----" } : null,
|
||||
isVisibleRoot || isAvailableRoot ? { kind: "separator" } : null,
|
||||
|
||||
isAvailableItem ? { title: t("launcher_context_menu.move-to-visible-launchers"), command: "moveLauncherToVisible", uiIcon: "bx bx-show", enabled: true } : null,
|
||||
isVisibleItem ? { title: t("launcher_context_menu.move-to-available-launchers"), command: "moveLauncherToAvailable", uiIcon: "bx bx-hide", enabled: true } : null,
|
||||
isVisibleItem || isAvailableItem ? { title: "----" } : null,
|
||||
isVisibleItem || isAvailableItem ? { kind: "separator" } : null,
|
||||
|
||||
{ title: `${t("launcher_context_menu.duplicate-launcher")}`, command: "duplicateSubtree", uiIcon: "bx bx-outline", enabled: isItem },
|
||||
{ title: `${t("launcher_context_menu.delete")}`, command: "deleteNotes", uiIcon: "bx bx-trash destructive-action-icon", enabled: canBeDeleted },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{ title: t("launcher_context_menu.reset"), command: "resetLauncher", uiIcon: "bx bx-reset destructive-action-icon", enabled: canBeReset }
|
||||
];
|
||||
|
||||
@@ -93,7 +93,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
|
||||
? null
|
||||
: { title: t("tree-context-menu.unhoist-note"), command: "toggleNoteHoisting", keyboardShortcut: "toggleNoteHoisting", uiIcon: "bx bx-door-open" },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{
|
||||
title: t("tree-context-menu.insert-note-after"),
|
||||
@@ -115,13 +115,13 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
|
||||
columns: 2
|
||||
},
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{ title: t("tree-context-menu.protect-subtree"), command: "protectSubtree", uiIcon: "bx bx-check-shield", enabled: noSelectedNotes },
|
||||
|
||||
{ title: t("tree-context-menu.unprotect-subtree"), command: "unprotectSubtree", uiIcon: "bx bx-shield", enabled: noSelectedNotes },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{
|
||||
title: t("tree-context-menu.advanced"),
|
||||
@@ -130,7 +130,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
|
||||
items: [
|
||||
{ title: t("tree-context-menu.apply-bulk-actions"), command: "openBulkActionsDialog", uiIcon: "bx bx-list-plus", enabled: true },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{
|
||||
title: t("tree-context-menu.edit-branch-prefix"),
|
||||
@@ -141,7 +141,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
|
||||
},
|
||||
{ title: t("tree-context-menu.convert-to-attachment"), command: "convertNoteToAttachment", uiIcon: "bx bx-paperclip", enabled: isNotRoot && !isHoisted && notOptionsOrHelp },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{ title: t("tree-context-menu.expand-subtree"), command: "expandSubtree", keyboardShortcut: "expandSubtree", uiIcon: "bx bx-expand", enabled: noSelectedNotes },
|
||||
{ title: t("tree-context-menu.collapse-subtree"), command: "collapseSubtree", keyboardShortcut: "collapseSubtree", uiIcon: "bx bx-collapse", enabled: noSelectedNotes },
|
||||
@@ -153,14 +153,14 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
|
||||
enabled: noSelectedNotes && notSearch
|
||||
},
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{ title: t("tree-context-menu.copy-note-path-to-clipboard"), command: "copyNotePathToClipboard", uiIcon: "bx bx-directions", enabled: true },
|
||||
{ title: t("tree-context-menu.recent-changes-in-subtree"), command: "recentChangesInSubtree", uiIcon: "bx bx-history", enabled: noSelectedNotes && notOptionsOrHelp }
|
||||
]
|
||||
},
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{
|
||||
title: t("tree-context-menu.cut"),
|
||||
@@ -241,13 +241,13 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
|
||||
enabled: isNotRoot && !isHoisted && parentNotSearch && notOptionsOrHelp
|
||||
},
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{ title: t("tree-context-menu.import-into-note"), command: "importIntoNote", uiIcon: "bx bx-import", enabled: notSearch && noSelectedNotes && notOptionsOrHelp },
|
||||
|
||||
{ title: t("tree-context-menu.export"), command: "exportNote", uiIcon: "bx bx-export", enabled: notSearch && noSelectedNotes && notOptionsOrHelp },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{
|
||||
title: t("tree-context-menu.search-in-subtree"),
|
||||
|
||||
@@ -8,6 +8,7 @@ import FAttribute, { type FAttributeRow } from "../entities/fattribute.js";
|
||||
import FAttachment, { type FAttachmentRow } from "../entities/fattachment.js";
|
||||
import type { default as FNote, FNoteRow } from "../entities/fnote.js";
|
||||
import type { EntityChange } from "../server_types.js";
|
||||
import type { OptionNames } from "@triliumnext/commons";
|
||||
|
||||
async function processEntityChanges(entityChanges: EntityChange[]) {
|
||||
const loadResults = new LoadResults(entityChanges);
|
||||
@@ -30,9 +31,8 @@ async function processEntityChanges(entityChanges: EntityChange[]) {
|
||||
continue; // only noise
|
||||
}
|
||||
|
||||
options.set(attributeEntity.name, attributeEntity.value);
|
||||
|
||||
loadResults.addOption(attributeEntity.name);
|
||||
options.set(attributeEntity.name as OptionNames, attributeEntity.value);
|
||||
loadResults.addOption(attributeEntity.name as OptionNames);
|
||||
} else if (ec.entityName === "attachments") {
|
||||
processAttachment(loadResults, ec);
|
||||
} else if (ec.entityName === "blobs") {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { AttachmentRow, EtapiTokenRow } from "@triliumnext/commons";
|
||||
import type { AttachmentRow, EtapiTokenRow, OptionNames } from "@triliumnext/commons";
|
||||
import type { AttributeType } from "../entities/fattribute.js";
|
||||
import type { EntityChange } from "../server_types.js";
|
||||
|
||||
@@ -67,7 +67,7 @@ export default class LoadResults {
|
||||
private revisionRows: RevisionRow[];
|
||||
private noteReorderings: string[];
|
||||
private contentNoteIdToComponentId: ContentNoteIdToComponentIdRow[];
|
||||
private optionNames: string[];
|
||||
private optionNames: OptionNames[];
|
||||
private attachmentRows: AttachmentRow[];
|
||||
public hasEtapiTokenChanges: boolean = false;
|
||||
|
||||
@@ -180,11 +180,11 @@ export default class LoadResults {
|
||||
return this.contentNoteIdToComponentId.find((l) => l.noteId === noteId && l.componentId !== componentId);
|
||||
}
|
||||
|
||||
addOption(name: string) {
|
||||
addOption(name: OptionNames) {
|
||||
this.optionNames.push(name);
|
||||
}
|
||||
|
||||
isOptionReloaded(name: string) {
|
||||
isOptionReloaded(name: OptionNames) {
|
||||
return this.optionNames.includes(name);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { t } from "./i18n.js";
|
||||
import froca from "./froca.js";
|
||||
import server from "./server.js";
|
||||
import type { MenuCommandItem, MenuItem, MenuItemBadge } from "../menus/context_menu.js";
|
||||
import type { MenuCommandItem, MenuItem, MenuItemBadge, MenuSeparatorItem } from "../menus/context_menu.js";
|
||||
import type { NoteType } from "../entities/fnote.js";
|
||||
import type { TreeCommandNames } from "../menus/tree_context_menu.js";
|
||||
|
||||
@@ -73,7 +73,7 @@ const BETA_BADGE = {
|
||||
title: t("note_types.beta-feature")
|
||||
};
|
||||
|
||||
const SEPARATOR = { title: "----" };
|
||||
const SEPARATOR: MenuSeparatorItem = { kind: "separator" };
|
||||
|
||||
const creationDateCache = new Map<string, Date>();
|
||||
let rootCreationDate: Date | undefined;
|
||||
@@ -81,8 +81,8 @@ let rootCreationDate: Date | undefined;
|
||||
async function getNoteTypeItems(command?: TreeCommandNames) {
|
||||
const items: MenuItem<TreeCommandNames>[] = [
|
||||
...getBlankNoteTypes(command),
|
||||
...await getBuiltInTemplates(t("note_types.collections"), command, true),
|
||||
...await getBuiltInTemplates(null, command, false),
|
||||
...await getBuiltInTemplates(t("note_types.collections"), command, true),
|
||||
...await getUserTemplates(command)
|
||||
];
|
||||
|
||||
@@ -121,7 +121,10 @@ async function getUserTemplates(command?: TreeCommandNames) {
|
||||
}
|
||||
|
||||
const items: MenuItem<TreeCommandNames>[] = [
|
||||
SEPARATOR
|
||||
{
|
||||
title: t("note_type_chooser.templates"),
|
||||
kind: "header"
|
||||
}
|
||||
];
|
||||
|
||||
for (const templateNote of templateNotes) {
|
||||
@@ -158,8 +161,7 @@ async function getBuiltInTemplates(title: string | null, command: TreeCommandNam
|
||||
if (title) {
|
||||
items.push({
|
||||
title: title,
|
||||
enabled: false,
|
||||
uiIcon: "bx bx-empty"
|
||||
kind: "header"
|
||||
});
|
||||
} else {
|
||||
items.push(SEPARATOR);
|
||||
|
||||
@@ -20,7 +20,7 @@ class Options {
|
||||
this.arr = arr;
|
||||
}
|
||||
|
||||
get(key: string) {
|
||||
get(key: OptionNames) {
|
||||
return this.arr?.[key] as string;
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ class Options {
|
||||
}
|
||||
}
|
||||
|
||||
getInt(key: string) {
|
||||
getInt(key: OptionNames) {
|
||||
const value = this.arr?.[key];
|
||||
if (typeof value === "number") {
|
||||
return value;
|
||||
@@ -52,7 +52,7 @@ class Options {
|
||||
return null;
|
||||
}
|
||||
|
||||
getFloat(key: string) {
|
||||
getFloat(key: OptionNames) {
|
||||
const value = this.arr?.[key];
|
||||
if (typeof value !== "string") {
|
||||
return null;
|
||||
@@ -60,15 +60,15 @@ class Options {
|
||||
return parseFloat(value);
|
||||
}
|
||||
|
||||
is(key: string) {
|
||||
is(key: OptionNames) {
|
||||
return this.arr[key] === "true";
|
||||
}
|
||||
|
||||
set(key: string, value: OptionValue) {
|
||||
set(key: OptionNames, value: OptionValue) {
|
||||
this.arr[key] = value;
|
||||
}
|
||||
|
||||
async save(key: string, value: OptionValue) {
|
||||
async save(key: OptionNames, value: OptionValue) {
|
||||
this.set(key, value);
|
||||
|
||||
const payload: Record<string, OptionValue> = {};
|
||||
@@ -85,7 +85,7 @@ class Options {
|
||||
await server.put<void>("options", newValues);
|
||||
}
|
||||
|
||||
async toggle(key: string) {
|
||||
async toggle(key: OptionNames) {
|
||||
await this.save(key, (!this.is(key)).toString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import ws from "./ws.js";
|
||||
import utils from "./utils.js";
|
||||
|
||||
export interface ToastOptions {
|
||||
id?: string;
|
||||
icon: string;
|
||||
title: string;
|
||||
title?: string;
|
||||
message: string;
|
||||
delay?: number;
|
||||
autohide?: boolean;
|
||||
@@ -12,20 +11,32 @@ export interface ToastOptions {
|
||||
}
|
||||
|
||||
function toast(options: ToastOptions) {
|
||||
const $toast = $(
|
||||
`<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-header">
|
||||
<strong class="me-auto">
|
||||
const $toast = $(options.title
|
||||
? `\
|
||||
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-header">
|
||||
<strong class="me-auto">
|
||||
<span class="bx bx-${options.icon}"></span>
|
||||
<span class="toast-title"></span>
|
||||
</strong>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
</div>`
|
||||
: `
|
||||
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-icon">
|
||||
<span class="bx bx-${options.icon}"></span>
|
||||
<span class="toast-title"></span>
|
||||
</strong>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
</div>`
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
<div class="toast-header">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
</div>`
|
||||
);
|
||||
|
||||
$toast.find(".toast-title").text(options.title);
|
||||
$toast.toggleClass("no-title", !options.title);
|
||||
$toast.find(".toast-title").text(options.title ?? "");
|
||||
$toast.find(".toast-body").html(options.message);
|
||||
|
||||
if (options.id) {
|
||||
@@ -70,7 +81,6 @@ function showMessage(message: string, delay = 2000) {
|
||||
console.debug(utils.now(), "message:", message);
|
||||
|
||||
toast({
|
||||
title: "Info",
|
||||
icon: "check",
|
||||
message: message,
|
||||
autohide: true,
|
||||
@@ -82,7 +92,6 @@ export function showError(message: string, delay = 10000) {
|
||||
console.log(utils.now(), "error: ", message);
|
||||
|
||||
toast({
|
||||
title: "Error",
|
||||
icon: "alert",
|
||||
message: message,
|
||||
autohide: true,
|
||||
|
||||
@@ -7,6 +7,7 @@ import appContext from "../components/app_context.js";
|
||||
import { t } from "./i18n.js";
|
||||
import type { EntityChange } from "../server_types.js";
|
||||
import { WebSocketMessage } from "@triliumnext/commons";
|
||||
import toast from "./toast.js";
|
||||
|
||||
type MessageHandler = (message: WebSocketMessage) => void;
|
||||
let messageHandlers: MessageHandler[] = [];
|
||||
@@ -278,13 +279,17 @@ function connectWebSocket() {
|
||||
|
||||
async function sendPing() {
|
||||
if (Date.now() - lastPingTs > 30000) {
|
||||
console.log(
|
||||
utils.now(),
|
||||
"Lost websocket connection to the backend. If you keep having this issue repeatedly, you might want to check your reverse proxy (nginx, apache) configuration and allow/unblock WebSocket."
|
||||
);
|
||||
console.warn(utils.now(), "Lost websocket connection to the backend");
|
||||
toast.showPersistent({
|
||||
id: "lost-websocket-connection",
|
||||
title: t("ws.lost-websocket-connection-title"),
|
||||
message: t("ws.lost-websocket-connection-message"),
|
||||
icon: "no-signal"
|
||||
});
|
||||
}
|
||||
|
||||
if (ws.readyState === ws.OPEN) {
|
||||
toast.closePersistent("lost-websocket-connection");
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
type: "ping",
|
||||
|
||||
@@ -363,21 +363,17 @@ button kbd {
|
||||
.tabulator-popup-container {
|
||||
color: var(--menu-text-color) !important;
|
||||
font-size: inherit;
|
||||
background-color: var(--menu-background-color) !important;
|
||||
background: var(--menu-background-color) !important;
|
||||
user-select: none;
|
||||
-webkit-user-select: none;
|
||||
--bs-dropdown-zindex: 999;
|
||||
--bs-dropdown-link-active-bg: var(--active-item-background-color) !important;
|
||||
}
|
||||
|
||||
.dropdown-menu .dropdown-divider {
|
||||
break-before: avoid;
|
||||
break-after: avoid;
|
||||
}
|
||||
|
||||
body.desktop .dropdown-menu,
|
||||
body.desktop .tabulator-popup-container {
|
||||
border: 1px solid var(--dropdown-border-color);
|
||||
column-rule: 1px solid var(--dropdown-border-color);
|
||||
box-shadow: 0px 10px 20px rgba(0, 0, 0, var(--dropdown-shadow-opacity));
|
||||
animation: dropdown-menu-opening 100ms ease-in;
|
||||
}
|
||||
@@ -419,7 +415,7 @@ body.desktop .tabulator-popup-container {
|
||||
}
|
||||
|
||||
.dropdown-menu a:hover:not(.disabled),
|
||||
.dropdown-item:hover:not(.disabled, .dropdown-item-container),
|
||||
.dropdown-item:hover:not(.disabled, .dropdown-container-item),
|
||||
.tabulator-menu-item:hover {
|
||||
color: var(--hover-item-text-color) !important;
|
||||
background-color: var(--hover-item-background-color) !important;
|
||||
@@ -427,9 +423,9 @@ body.desktop .tabulator-popup-container {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.dropdown-item-container,
|
||||
.dropdown-item-container:hover,
|
||||
.dropdown-item-container:active {
|
||||
.dropdown-container-item,
|
||||
.dropdown-item.dropdown-container-item:hover,
|
||||
.dropdown-container-item:active {
|
||||
background: transparent;
|
||||
cursor: default;
|
||||
}
|
||||
@@ -444,9 +440,11 @@ body #context-menu-container .dropdown-item > span {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.dropdown-item span.keyboard-shortcut {
|
||||
.dropdown-item span.keyboard-shortcut,
|
||||
.dropdown-item *:not(.keyboard-shortcut) > kbd {
|
||||
flex-grow: 1;
|
||||
text-align: right;
|
||||
padding-inline-start: 12px;
|
||||
}
|
||||
|
||||
.dropdown-menu kbd {
|
||||
@@ -456,8 +454,6 @@ body #context-menu-container .dropdown-item > span {
|
||||
box-shadow: none;
|
||||
padding-bottom: 0;
|
||||
padding: 0;
|
||||
flex-grow: 1;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.dropdown-item,
|
||||
@@ -466,6 +462,12 @@ body #context-menu-container .dropdown-item > span {
|
||||
border: 1px solid transparent !important;
|
||||
}
|
||||
|
||||
/* This is a workaround for Firefox not supporting break-before / break-after: avoid on columns.
|
||||
* It usually wraps a menu item followed by a separator / header and another menu item. */
|
||||
.dropdown-no-break {
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
.dropdown-item.disabled,
|
||||
.dropdown-item.disabled kbd {
|
||||
color: #aaa !important;
|
||||
@@ -473,9 +475,9 @@ body #context-menu-container .dropdown-item > span {
|
||||
|
||||
.dropdown-item.active,
|
||||
.dropdown-item:focus {
|
||||
color: var(--active-item-text-color) !important;
|
||||
background-color: var(--active-item-background-color) !important;
|
||||
border-color: var(--active-item-border-color) !important;
|
||||
color: var(--active-item-text-color);
|
||||
background-color: var(--active-item-background-color);
|
||||
border-color: var(--active-item-border-color);
|
||||
outline: none;
|
||||
}
|
||||
|
||||
@@ -1139,6 +1141,26 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.toast.no-title {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.toast.no-title .toast-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
|
||||
}
|
||||
|
||||
.toast.no-title .toast-body {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.toast.no-title .toast-header {
|
||||
background-color: unset !important;
|
||||
}
|
||||
|
||||
.ck-mentions .ck-button {
|
||||
font-size: var(--detail-font-size) !important;
|
||||
padding: 5px;
|
||||
@@ -1874,11 +1896,6 @@ textarea {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.jump-to-note-results .aa-dropdown-menu .aa-suggestion:hover,
|
||||
.jump-to-note-results .aa-dropdown-menu .aa-cursor {
|
||||
background-color: var(--hover-item-background-color, #f8f9fa);
|
||||
}
|
||||
|
||||
/* Command palette styling */
|
||||
.jump-to-note-dialog .command-suggestion {
|
||||
display: flex;
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
|
||||
--launcher-pane-horiz-border-color: rgb(22, 22, 22);
|
||||
--launcher-pane-horiz-background-color: #282828;
|
||||
--launcher-pane-horiz-text-color: #909090;
|
||||
--launcher-pane-horiz-text-color: #b8b8b8;
|
||||
--launcher-pane-horiz-button-hover-color: #ffffff;
|
||||
--launcher-pane-horiz-button-hover-background: #ffffff1c;
|
||||
--launcher-pane-horiz-button-hover-shadow: unset;
|
||||
@@ -172,9 +172,10 @@
|
||||
|
||||
--tab-close-button-hover-background: #a45353;
|
||||
--tab-close-button-hover-color: white;
|
||||
|
||||
|
||||
--active-tab-background-color: #ffffff1c;
|
||||
--active-tab-hover-background-color: var(--active-tab-background-color);
|
||||
--active-tab-icon-color: #a9a9a9;
|
||||
--active-tab-text-color: #ffffffcd;
|
||||
--active-tab-shadow: 3px 3px 6px rgba(0, 0, 0, 0.2), -1px -1px 3px rgba(0, 0, 0, 0.4);
|
||||
--active-tab-dragging-shadow: var(--active-tab-shadow), 0 0 20px rgba(0, 0, 0, 0.4);
|
||||
|
||||
@@ -165,9 +165,10 @@
|
||||
|
||||
--tab-close-button-hover-background: #c95a5a;
|
||||
--tab-close-button-hover-color: white;
|
||||
|
||||
|
||||
--active-tab-background-color: white;
|
||||
--active-tab-hover-background-color: var(--active-tab-background-color);
|
||||
--active-tab-icon-color: gray;
|
||||
--active-tab-text-color: black;
|
||||
--active-tab-shadow: 3px 3px 6px rgba(0, 0, 0, 0.1), -1px -1px 3px rgba(0, 0, 0, 0.05);
|
||||
--active-tab-dragging-shadow: var(--active-tab-shadow), 0 0 20px rgba(0, 0, 0, 0.1);
|
||||
|
||||
@@ -102,10 +102,6 @@ body.backdrop-effects-disabled {
|
||||
font-size: 0.9rem !important;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
--scrollbar-background-color: var(--menu-background-color);
|
||||
}
|
||||
|
||||
body.mobile .dropdown-menu {
|
||||
backdrop-filter: var(--dropdown-backdrop-filter);
|
||||
border-radius: var(--dropdown-border-radius);
|
||||
@@ -154,12 +150,22 @@ body.desktop .dropdown-submenu .dropdown-menu {
|
||||
.dropdown-item,
|
||||
body.mobile .dropdown-submenu .dropdown-toggle {
|
||||
padding: 2px 2px 2px 8px !important;
|
||||
padding-inline-end: 16px !important;
|
||||
padding-inline-end: 22px !important;
|
||||
/* Note: the right padding should also accommodate the submenu arrow. */
|
||||
border-radius: 6px;
|
||||
cursor: default !important;
|
||||
}
|
||||
|
||||
:root .dropdown-item:focus-visible {
|
||||
outline: 2px solid var(--input-focus-outline-color) !important;
|
||||
background-color: transparent;
|
||||
color: unset;
|
||||
}
|
||||
|
||||
:root .dropdown-item:active {
|
||||
background: unset;
|
||||
}
|
||||
|
||||
body.mobile .dropdown-submenu {
|
||||
padding: 0 !important;
|
||||
}
|
||||
@@ -289,6 +295,20 @@ body.mobile .dropdown-menu .dropdown-item.submenu-open .dropdown-toggle::after {
|
||||
transform: rotate(270deg);
|
||||
}
|
||||
|
||||
/* Dropdown item button (used in zoom buttons in global menu) */
|
||||
|
||||
li.dropdown-item a.dropdown-item-button {
|
||||
border: unset;
|
||||
}
|
||||
|
||||
li.dropdown-item a.dropdown-item-button.bx {
|
||||
color: var(--menu-text-color) !important;
|
||||
}
|
||||
|
||||
li.dropdown-item a.dropdown-item-button:focus-visible {
|
||||
outline: 2px solid var(--input-focus-outline-color) !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* TOASTS
|
||||
*/
|
||||
@@ -307,30 +327,48 @@ body.mobile .dropdown-menu .dropdown-item.submenu-open .dropdown-toggle::after {
|
||||
--modal-control-button-color: var(--bs-toast-color);
|
||||
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
flex-direction: column;
|
||||
backdrop-filter: blur(6px);
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header {
|
||||
padding: 0 !important;
|
||||
background: transparent !important;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header strong {
|
||||
/* The title of the toast is no longer displayed */
|
||||
display: none;
|
||||
#toast-container .toast .toast-header strong > * {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header .btn-close {
|
||||
margin: 0 var(--bs-toast-padding-x) 0 12px;
|
||||
margin: 0 0 0 12px;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-body {
|
||||
flex-grow: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding-top: 0;
|
||||
color: var(--muted-text-color);
|
||||
}
|
||||
|
||||
#toast-container .toast:not(.no-title) .bx {
|
||||
margin-right: 0.5em;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title .bx {
|
||||
margin-right: 0;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title .toast-body {
|
||||
padding-top: var(--bs-toast-padding-x);
|
||||
color: var(--toast-text-color);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -84,7 +84,7 @@ button.btn.btn-success kbd {
|
||||
*/
|
||||
|
||||
:root .icon-action:not(.global-menu-button),
|
||||
:root .btn.tn-tool-button,
|
||||
:root .tn-tool-button,
|
||||
:root .btn-group .tn-tool-button:not(:last-child),
|
||||
:root .btn-group .tn-tool-button:last-child {
|
||||
width: var(--icon-button-size);
|
||||
@@ -197,8 +197,8 @@ input[type="password"]:focus,
|
||||
input[type="date"]:focus,
|
||||
input[type="time"]:focus,
|
||||
input[type="datetime-local"]:focus,
|
||||
:root input.ck.ck-input-text:focus,
|
||||
:root input.ck.ck-input-number:focus,
|
||||
:root input.ck.ck-input-text:not([readonly="true"]):focus,
|
||||
:root input.ck.ck-input-number:not([readonly="true"]):focus,
|
||||
textarea.form-control:focus,
|
||||
textarea:focus,
|
||||
:root textarea.ck.ck-textarea:focus,
|
||||
|
||||
@@ -109,6 +109,11 @@
|
||||
* NOTE MAP
|
||||
*/
|
||||
|
||||
.note-detail-note-map .fixnodes-type-switcher .tn-tool-button,
|
||||
.note-map-widget .fixnodes-type-switcher .tn-tool-button {
|
||||
padding: unset;
|
||||
}
|
||||
|
||||
.note-detail-note-map .fixnodes-type-switcher .tn-tool-button.toggled {
|
||||
color: var(--tab-close-button-hover-background);
|
||||
}
|
||||
|
||||
@@ -94,18 +94,17 @@ div.promoted-attributes-container {
|
||||
|
||||
/* Note type dropdown */
|
||||
|
||||
div.note-type-dropdown .check {
|
||||
ul.note-type-dropdown .check {
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
ul.note-type-dropdown li.dropdown-item {
|
||||
--menu-item-icon-vert-offset: 0;
|
||||
}
|
||||
|
||||
/* Editability dropdown */
|
||||
|
||||
div.editability-dropdown a.dropdown-item {
|
||||
padding: 4px 16px 4px 0;
|
||||
align-items: start !important;
|
||||
}
|
||||
|
||||
.editability-dropdown .dropdown-item .check {
|
||||
ul.editability-dropdown li.dropdown-item > div {
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
|
||||
@@ -304,18 +304,6 @@ body.layout-horizontal > .horizontal {
|
||||
color: var(--tooltip-foreground-color) !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Global menu
|
||||
*/
|
||||
|
||||
.global-menu div.zoom-buttons a {
|
||||
border: unset;
|
||||
}
|
||||
|
||||
.global-menu div.zoom-buttons a.bx {
|
||||
color: var(--menu-text-color) !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calendar
|
||||
*/
|
||||
@@ -348,6 +336,21 @@ body.layout-horizontal > .horizontal {
|
||||
--select-arrow-svg: initial; /* Disable the dropdown arrow */
|
||||
}
|
||||
|
||||
/* Week number column */
|
||||
.calendar-dropdown-widget .calendar-week-number {
|
||||
transform: rotate(270deg);
|
||||
justify-content: center;
|
||||
padding: 0;
|
||||
opacity: 0.5;
|
||||
font-size: 1em;
|
||||
font-weight: 700;
|
||||
letter-spacing: .5pt;
|
||||
}
|
||||
|
||||
.calendar-dropdown-widget .calendar-week-number::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (max-width: 992px) {
|
||||
.calendar-dropdown-widget .calendar-header button {
|
||||
margin: 0 !important;
|
||||
@@ -562,15 +565,21 @@ div.quick-search .search-button.show {
|
||||
transition: background-color 100ms ease-out !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Quick search results
|
||||
*/
|
||||
|
||||
div.quick-search .dropdown-menu {
|
||||
--quick-search-item-delimiter-color: transparent;
|
||||
--menu-item-icon-vert-offset: -.065em;
|
||||
}
|
||||
|
||||
/*
|
||||
* TO FIX: The quick search results dropdown has a backdrop issue with the tree panel
|
||||
* when background effects are enabled in Electron.
|
||||
* As a temporary workaround, the backdrop and transparency are disabled for the
|
||||
* vertical layout.
|
||||
*/
|
||||
body.layout-vertical.background-effects div.quick-search .dropdown-menu {
|
||||
--menu-background-color: var(--menu-background-color-no-backdrop) !important;
|
||||
}
|
||||
|
||||
/* Item */
|
||||
.quick-search .dropdown-menu *.dropdown-item {
|
||||
padding: 8px 12px !important;
|
||||
@@ -866,7 +875,10 @@ body.mobile .fancytree-node > span {
|
||||
}
|
||||
|
||||
.tab-row-container .toggle-button {
|
||||
margin: 6px 10px !important;
|
||||
--icon-button-size: 30px;
|
||||
--icon-button-icon-ratio: .6;
|
||||
|
||||
margin: 3px 6px auto 8px !important;
|
||||
}
|
||||
|
||||
.tab-row-container {
|
||||
@@ -896,7 +908,7 @@ body.electron.background-effects.layout-horizontal .tab-row-container .toggle-bu
|
||||
bottom: 0;
|
||||
left: -10px;
|
||||
right: -10px;
|
||||
top: 29px;
|
||||
top: 32px;
|
||||
height: 1px;
|
||||
border-bottom: 1px solid var(--launcher-pane-horiz-border-color);
|
||||
}
|
||||
@@ -1043,6 +1055,14 @@ body.layout-horizontal .tab-row-widget .note-tab .note-tab-wrapper {
|
||||
transform: translate3d(var(--tab-first-item-horiz-offset), 0, 0);
|
||||
}
|
||||
|
||||
:root .tab-row-widget .note-tab .note-tab-icon {
|
||||
padding-right: 5px; /* The gap between the icon and the title */
|
||||
}
|
||||
|
||||
.tab-row-widget .note-tab[active] .note-tab-icon {
|
||||
color: var(--active-tab-icon-color);
|
||||
}
|
||||
|
||||
.tab-row-widget .note-tab .note-tab-title {
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
@@ -1390,6 +1410,13 @@ div.promoted-attribute-cell .multiplicity:has(span) {
|
||||
margin-left: 8px;
|
||||
margin-right: calc(var(--pa-card-padding-left) - var(--pa-card-padding-right));
|
||||
font-size: 0; /* Prevent whitespaces creating a gap between buttons */
|
||||
display: flex;
|
||||
}
|
||||
|
||||
div.promoted-attribute-cell .multiplicity:has(span) span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1353,7 +1353,7 @@
|
||||
"oauth_title": "OAuth/OpenID 认证",
|
||||
"oauth_description": "OpenID 是一种标准化方式,允许您使用其他服务(如 Google)的账号登录网站来验证您的身份。默认的身份提供者是 Google,但您可以更改为任何其他 OpenID 提供者。点击<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">这里</a>了解更多信息。请参阅这些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指南</a> 通过 Google 设置 OpenID 服务。",
|
||||
"oauth_description_warning": "要启用 OAuth/OpenID,您需要设置 config.ini 文件中的 OAuth/OpenID 基础 URL、客户端 ID 和客户端密钥,并重新启动应用程序。如果要从环境变量设置,请设置 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 环境变量。",
|
||||
"oauth_missing_vars": "缺少以下设置项:{{variables}}",
|
||||
"oauth_missing_vars": "缺少以下设置项:{{-variables}}",
|
||||
"oauth_user_account": "用户账号: ",
|
||||
"oauth_user_email": "用户邮箱: ",
|
||||
"oauth_user_not_logged_in": "未登录!"
|
||||
|
||||
@@ -1 +1,21 @@
|
||||
{}
|
||||
{
|
||||
"about": {
|
||||
"title": "O Trilium Notes",
|
||||
"homepage": "Domovská stránka:",
|
||||
"app_version": "Verze aplikace:",
|
||||
"db_version": "Verze DB:",
|
||||
"sync_version": "Verze sync:",
|
||||
"build_date": "Datum sestavení:",
|
||||
"build_revision": "Revize sestavení:",
|
||||
"data_directory": "Datový adresář:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Kritická chyba",
|
||||
"message": "Nastala kritická chyba která aplikaci brání ve spuštění:\n\n{{message}}\n\nPravděpodobně neočekávaným způsobem selhal skript. Pokuste se restartovat aplikaci v safe módu a problém napravit."
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Nepodařilo se inicializovat widget"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1901,7 +1901,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID ist ein standardisiertes Verfahren, mit dem Sie sich über ein Konto eines anderen Dienstes, beispielsweise Google, bei Websites anmelden können, um Ihre Identität zu bestätigen. Der Standardaussteller ist Google, Sie können jedoch jeden anderen OpenID-Anbieter auswählen. Weitere Informationen finden Sie <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">hier</a>. Befolgen Sie diese <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">Anweisungen</a>, um einen OpenID-Dienst über Google einzurichten.",
|
||||
"oauth_description_warning": "Um OAuth/OpenID zu aktivieren, müssen Sie die OAuth/OpenID-Basis-URL, die Client-ID und den Client-Secret in der Datei config.ini festlegen und die Anwendung neu starten. Wenn Sie die Einstellungen über Umgebungsvariablen vornehmen möchten, legen Sie bitte TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID und TRILIUM_OAUTH_CLIENT_SECRET fest.",
|
||||
"oauth_missing_vars": "Fehlende Einstellung: {{variables}}",
|
||||
"oauth_missing_vars": "Fehlende Einstellung: {{-variables}}",
|
||||
"oauth_user_account": "Benutzerkonto: ",
|
||||
"oauth_user_email": "Benutzer E-Mail: ",
|
||||
"oauth_user_not_logged_in": "Nicht eingeloggt!"
|
||||
|
||||
@@ -1517,7 +1517,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID is a standardized way to let you log into websites using an account from another service, like Google, to verify your identity. The default issuer is Google, but you can change it to any other OpenID provider. Check <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">here</a> for more information. Follow these <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">instructions</a> to setup an OpenID service through Google.",
|
||||
"oauth_description_warning": "To enable OAuth/OpenID, you need to set the OAuth/OpenID base URL, client ID and client secret in the config.ini file and restart the application. If you want to set from environment variables, please set TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID and TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Missing settings: {{variables}}",
|
||||
"oauth_missing_vars": "Missing settings: {{-variables}}",
|
||||
"oauth_user_account": "User Account: ",
|
||||
"oauth_user_email": "User Email: ",
|
||||
"oauth_user_not_logged_in": "Not logged in!"
|
||||
@@ -1787,7 +1787,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Sync check failed!",
|
||||
"consistency-checks-failed": "Consistency checks failed! See logs for details.",
|
||||
"encountered-error": "Encountered error \"{{message}}\", check out the console."
|
||||
"encountered-error": "Encountered error \"{{message}}\", check out the console.",
|
||||
"lost-websocket-connection-title": "Lost connection to the server",
|
||||
"lost-websocket-connection-message": "Check your reverse proxy (e.g. nginx or Apache) configuration to ensure WebSocket connections are properly allowed and not being blocked."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Requested note '{{requestedNote}}' is outside of hoisted note '{{hoistedNote}}' subtree and you must unhoist to access the note. Do you want to proceed with unhoisting?"
|
||||
@@ -1962,7 +1964,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "Features",
|
||||
"emoji_completion_enabled": "Enable Emoji auto-completion",
|
||||
"note_completion_enabled": "Enable note auto-completion"
|
||||
"emoji_completion_description": "If enabled, emojis can be easily inserted into text by typing `:`, followed by the name of an emoji.",
|
||||
"note_completion_enabled": "Enable note auto-completion",
|
||||
"note_completion_description": "If enabled, links to notes can be created by typing `@` followed by the title of a note.",
|
||||
"slash_commands_enabled": "Enable slash commands",
|
||||
"slash_commands_description": "If enabled, editing commands such as inserting line breaks or headings can be toggled by typing `/`."
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "New row",
|
||||
|
||||
@@ -1490,7 +1490,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID es una forma estandarizada de permitirle iniciar sesión en sitios web utilizando una cuenta de otro servicio, como Google, para verificar su identidad. Siga estas <a href = \"https://developers.google.com/identity/openid-connect/openid-connect\">instrucciones</a> para configurar un servicio OpenID a través de Google.",
|
||||
"oauth_description_warning": "Para habilitar OAuth/OpenID, necesita establecer la URL base de OAuth/OpenID, ID de cliente y secreto de cliente en el archivo config.ini y reiniciar la aplicación. Si desea establecerlas desde variables de ambiente, por favor establezca TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID y TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Ajustes faltantes: {{variables}}",
|
||||
"oauth_missing_vars": "Ajustes faltantes: {{-variables}}",
|
||||
"oauth_user_account": "Cuenta de usuario: ",
|
||||
"oauth_user_email": "Correo electrónico de usuario: ",
|
||||
"oauth_user_not_logged_in": "¡No ha iniciado sesión!"
|
||||
|
||||
@@ -66,7 +66,8 @@
|
||||
"toggle-zen-mode": "禅モード",
|
||||
"switch_to_mobile_version": "モバイル版に切り替え",
|
||||
"switch_to_desktop_version": "デスクトップ版に切り替え",
|
||||
"configure_launchbar": "ランチャーバーの設定"
|
||||
"configure_launchbar": "ランチャーバーの設定",
|
||||
"show_shared_notes_subtree": "共有ノートのサブツリーを表示"
|
||||
},
|
||||
"left_pane_toggle": {
|
||||
"show_panel": "パネルを表示",
|
||||
@@ -120,7 +121,9 @@
|
||||
"september": "9月",
|
||||
"october": "10月",
|
||||
"november": "11月",
|
||||
"december": "12月"
|
||||
"december": "12月",
|
||||
"cannot_find_day_note": "dayノートが見つかりません",
|
||||
"cannot_find_week_note": "weekノートが見つかりません"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "ノートアイコンの変更",
|
||||
@@ -191,7 +194,8 @@
|
||||
"search_parameters": "検索パラメータ",
|
||||
"unknown_search_option": "不明な検索オプション {{searchOptionName}}",
|
||||
"search_note_saved": "検索ノートが {{- notePathTitle}} に保存されました",
|
||||
"actions_executed": "アクションが実行されました。"
|
||||
"actions_executed": "アクションが実行されました。",
|
||||
"ancestor": "祖先:"
|
||||
},
|
||||
"shortcuts": {
|
||||
"multiple_shortcuts": "同じアクションに対して複数のショートカットを設定する場合、カンマで区切ることができます。",
|
||||
@@ -309,7 +313,8 @@
|
||||
},
|
||||
"import-status": "インポート状況",
|
||||
"in-progress": "インポート中: {{progress}}",
|
||||
"successful": "インポートは正常に終了しました。"
|
||||
"successful": "インポートは正常に終了しました。",
|
||||
"explodeArchives": "<code>.zip</code>, <code>.enex</code> および <code>.opml</code> アーカイブの内容を読み取ります。"
|
||||
},
|
||||
"password_not_set": {
|
||||
"title": "パスワードが設定されていない",
|
||||
@@ -391,7 +396,10 @@
|
||||
"converted-to-attachments": "{{count}}ノートが添付ファイルに変換されました。",
|
||||
"convert-to-attachment": "添付ファイルに変換",
|
||||
"convert-to-attachment-confirm": "選択したノートを親ノートの添付ファイルに変換しますか?",
|
||||
"open-in-popup": "クイックエディット"
|
||||
"open-in-popup": "クイックエディット",
|
||||
"hoist-note": "ホイストノート",
|
||||
"unhoist-note": "ノートをホイストしない",
|
||||
"edit-branch-prefix": "ブランチの接頭辞を編集"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "禅モードを退出"
|
||||
@@ -432,10 +440,16 @@
|
||||
"search_notes_description": "高度な検索を開く",
|
||||
"search_subtree_description": "現在のサブツリー内を検索",
|
||||
"search_history_title": "検索履歴を表示",
|
||||
"search_history_description": "過去の検索結果を見る"
|
||||
"search_history_description": "過去の検索結果を見る",
|
||||
"show_attachments_title": "添付ファイルを表示",
|
||||
"show_attachments_description": "ノートの添付ファイルを表示",
|
||||
"configure_launch_bar_title": "ランチャーバーの設定",
|
||||
"configure_launch_bar_description": "ランチャーバーの構成を開き、項目を追加または削除します。"
|
||||
},
|
||||
"delete_note": {
|
||||
"delete_note": "ノートを削除"
|
||||
"delete_note": "ノートを削除",
|
||||
"delete_matched_notes": "一致したノートを削除",
|
||||
"delete_matched_notes_description": "これにより、一致したノートが削除されます。"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "ノートを削除",
|
||||
@@ -444,7 +458,15 @@
|
||||
"delete-column": "列を削除",
|
||||
"delete-column-confirmation": "本当にこの列を削除しますか?対応する属性は、この列の下のノートでも削除されます。",
|
||||
"new-item": "新しいアイテム",
|
||||
"add-column": "列を追加"
|
||||
"add-column": "列を追加",
|
||||
"remove-from-board": "ボードから削除",
|
||||
"archive-note": "アーカイブノート",
|
||||
"unarchive-note": "ノートのアーカイブを解除",
|
||||
"move-to": "移動先",
|
||||
"new-item-placeholder": "ノートのタイトルを入力...",
|
||||
"add-column-placeholder": "列名を入力...",
|
||||
"edit-note-title": "クリックしてノートのタイトルを編集",
|
||||
"edit-column-title": "クリックして列のタイトルを編集"
|
||||
},
|
||||
"code_buttons": {
|
||||
"execute_button_title": "スクリプトを実行",
|
||||
@@ -454,7 +476,9 @@
|
||||
"sql_console_saved_message": "SQLコンソールが {{note_path}} に保存されました"
|
||||
},
|
||||
"execute_script": {
|
||||
"execute_script": "スクリプトを実行"
|
||||
"execute_script": "スクリプトを実行",
|
||||
"help_text": "一致したノートに対して簡単なスクリプトを実行できます。",
|
||||
"example_2": "より複雑な例としては、一致したノートの属性をすべて削除することが挙げられます:"
|
||||
},
|
||||
"script_executor": {
|
||||
"execute_script": "スクリプトを実行",
|
||||
@@ -484,7 +508,8 @@
|
||||
"calendar": "カレンダー",
|
||||
"table": "テーブル",
|
||||
"geo-map": "ジオマップ",
|
||||
"board": "ボード"
|
||||
"board": "ボード",
|
||||
"include_archived_notes": "アーカイブされたノートを表示"
|
||||
},
|
||||
"note_types": {
|
||||
"geo-map": "ジオマップ",
|
||||
@@ -493,7 +518,7 @@
|
||||
"text": "テキスト",
|
||||
"code": "コード",
|
||||
"saved-search": "検索の保存",
|
||||
"relation-map": "関係マップ",
|
||||
"relation-map": "リレーションマップ",
|
||||
"note-map": "ノートマップ",
|
||||
"render-note": "レンダリングノート",
|
||||
"book": "コレクション",
|
||||
@@ -563,7 +588,14 @@
|
||||
"settings": "ノートの変更履歴の設定",
|
||||
"file_size": "ファイルサイズ:",
|
||||
"preview": "プレビュー:",
|
||||
"preview_not_available": "このノートタイプではプレビューは利用できません。"
|
||||
"preview_not_available": "このノートタイプではプレビューは利用できません。",
|
||||
"diff_on": "差分を表示",
|
||||
"diff_off": "内容を表示",
|
||||
"diff_on_hint": "クリックしてノートソースとの差分を表示",
|
||||
"diff_off_hint": "クリックしてノートの内容を表示",
|
||||
"diff_not_available": "差分は利用できません。",
|
||||
"snapshot_interval": "ノートの変更履歴の記録間隔: {{seconds}} 秒。",
|
||||
"maximum_revisions": "ノートの変更履歴の記録制限: {{number}}."
|
||||
},
|
||||
"attachments_actions": {
|
||||
"download": "ダウンロード",
|
||||
@@ -613,7 +645,8 @@
|
||||
"intro_placed": "このノートは以下のパスに置かれる:",
|
||||
"intro_not_placed": "このノートはまだノートツリーに配置されていません。",
|
||||
"archived": "アーカイブされた",
|
||||
"search": "検索"
|
||||
"search": "検索",
|
||||
"outside_hoisted": "このパスはホイストされたノートの外側にあるため、ホイストを解除する必要があります。"
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "情報"
|
||||
@@ -693,13 +726,29 @@
|
||||
"dialog_title": "埋め込みノート",
|
||||
"box_size_prompt": "埋め込みノート枠のサイズ:",
|
||||
"button_include": "埋め込みノート",
|
||||
"label_note": "ノート"
|
||||
"label_note": "ノート",
|
||||
"box_size_small": "スモール (~ 10 行)",
|
||||
"box_size_medium": "ミディアム (~ 30 行)",
|
||||
"box_size_full": "フル (ボックスに全文が表示されます)"
|
||||
},
|
||||
"ancestor": {
|
||||
"placeholder": "ノート名で検索"
|
||||
"placeholder": "ノート名で検索",
|
||||
"label": "祖先",
|
||||
"depth_label": "深さ",
|
||||
"depth_doesnt_matter": "関係ない",
|
||||
"depth_eq": "ちょうど {{count}} つ下の階層",
|
||||
"direct_children": "直接の子",
|
||||
"depth_gt": "{{count}} より下の階層",
|
||||
"depth_lt": "{{count}} より上の階層"
|
||||
},
|
||||
"move_to": {
|
||||
"search_placeholder": "ノート名で検索"
|
||||
"search_placeholder": "ノート名で検索",
|
||||
"dialog_title": "ノートを移動...",
|
||||
"notes_to_move": "移動させるノート",
|
||||
"target_parent_note": "対象の親ノート",
|
||||
"move_button": "選択したノートに移動",
|
||||
"error_no_path": "移動するパスがありません。",
|
||||
"move_success_message": "選択したノートは以下に移動されました "
|
||||
},
|
||||
"web_view": {
|
||||
"web_view": "Web ビュー",
|
||||
@@ -740,7 +789,8 @@
|
||||
"default_description": "Triliumは、ワイドスクリーンで最大化された画面での可読性を向上させるために、デフォルトでコンテンツの最大幅を制限しています。",
|
||||
"max_width_label": "最大コンテンツ幅",
|
||||
"max_width_unit": "ピクセル",
|
||||
"apply_changes_description": "コンテンツ幅の変更を適用するには、クリックしてください"
|
||||
"apply_changes_description": "コンテンツ幅の変更を適用するには、クリックしてください",
|
||||
"reload_description": "外観オプションからの変更"
|
||||
},
|
||||
"theme": {
|
||||
"title": "アプリのテーマ",
|
||||
@@ -906,10 +956,16 @@
|
||||
"close": "閉じる"
|
||||
},
|
||||
"info": {
|
||||
"closeButton": "閉じる"
|
||||
"closeButton": "閉じる",
|
||||
"modalTitle": "情報メッセージ",
|
||||
"okButton": "OK"
|
||||
},
|
||||
"protected_session_password": {
|
||||
"close_label": "閉じる"
|
||||
"close_label": "閉じる",
|
||||
"modal_title": "保護されたセッション",
|
||||
"help_title": "保護されたノートに関するヘルプ",
|
||||
"form_label": "リクエストされたアクションを続行するには、パスワードを入力して保護されたセッションを開始する必要があります:",
|
||||
"start_button": "保護されたセッションを開始"
|
||||
},
|
||||
"modal": {
|
||||
"close": "閉じる",
|
||||
@@ -947,7 +1003,81 @@
|
||||
"digits": "桁",
|
||||
"inheritable_title": "継承属性は、このツリー配下のすべての子孫に継承されます。",
|
||||
"inheritable": "継承",
|
||||
"related_notes_title": "このラベルが付いた他のノート"
|
||||
"related_notes_title": "このラベルが付いた他のノート",
|
||||
"attr_detail_title": "属性の詳細なタイトル",
|
||||
"target_note_title": "リレーションは、ソースノートとターゲットノート間の名前付き接続です。",
|
||||
"target_note": "対象のノート",
|
||||
"promoted_title": "プロモート属性はノートに目立つように表示されます。",
|
||||
"promoted": "プロモート",
|
||||
"promoted_alias_title": "プロモート属性のUIに表示される名前。",
|
||||
"inverse_relation_title": "このリレーションがどのリレーションの反対であるかを定義するオプション設定。例:父と息子は互いに逆のリレーションです。",
|
||||
"inverse_relation": "逆リレーション",
|
||||
"more_notes": "その他のノート",
|
||||
"label": "ラベルの詳細",
|
||||
"label_definition": "ラベル定義の詳細",
|
||||
"relation": "リレーションの詳細",
|
||||
"relation_definition": "リレーション定義の詳細",
|
||||
"disable_versioning": "自動バージョン管理を無効にします。例えば、スクリプト用の大きなJSライブラリなど、重要ではない大きなノートに便利です",
|
||||
"calendar_root": "dayノートのルートとして使用するノートをマークします。このようにマークできるのは 1 つだけです。",
|
||||
"archived": "このラベルの付いたノートは、デフォルトでは検索結果に表示されません (ジャンプ先、リンクの追加ダイアログなどにも表示されません)。",
|
||||
"exclude_from_export": "ノート(サブツリーを含む)はノートのエクスポートには含まれません",
|
||||
"run": "どのイベントでスクリプトを実行するかを定義します。可能な値は次の通り:\n<ul>\n<li>frontendStartup - Trilium フロントエンドが起動(または更新)されたとき。モバイルは除く</li>\n<li>mobileStartup - モバイルで Trilium フロントエンドが起動(または更新)されたとき。</li>\n<li>backendStartup - Trilium バックエンドが起動したとき</li>\n<li>hourly - 1時間に1回実行します。 <code>runAtHour</code> というラベルを追加して、実行時刻を指定できます。</li>\n<li>daily - 1日に1回実行</li>\n</ul>",
|
||||
"run_on_instance": "どの Trilium インスタンスでこれを実行するかを定義します。デフォルトはすべてのインスタンスです。",
|
||||
"run_at_hour": "何時に実行するかを指定します。 <code>#run=hourly</code> と併用してください。1日に複数回実行したい場合は、複数回定義できます。",
|
||||
"disable_inclusion": "このラベルが付いたスクリプトは親スクリプトの実行には含まれません。",
|
||||
"sorted": "子ノートをアルファベット順に並べ替える",
|
||||
"sort_direction": "ASC(デフォルト)または DESC",
|
||||
"sort_folders_first": "フォルダ(子を持つノート)を上にして並べる",
|
||||
"top": "指定されたノートをその親ノートの一番上に表示します(ソートされた親ノートにのみ適用されます)",
|
||||
"hide_promoted_attributes": "このノートのプロモート属性を非表示にする",
|
||||
"read_only": "エディターは読み取り専用モードです。テキストとコードノートのみ機能します。",
|
||||
"auto_read_only_disabled": "テキスト/コードノートは、サイズが大きすぎる場合、自動的に読み取りモードに設定されます。このラベルをノートに追加することで、ノートごとにこの動作を無効にすることができます",
|
||||
"app_css": "Trilium アプリケーションに読み込まれ、Trilium の外観を変更するために使用できる CSS ノートをマークします。",
|
||||
"app_theme": "Trilium のフルテーマである CSS ノートをマークし、Trilium オプションで利用できるようにします。",
|
||||
"app_theme_base": "「next」、「next-light」、または「next-dark」に設定すると、従来のテーマではなく、対応する TriliumNext テーマ (auto、light、または dark) がカスタム テーマのベースとして使用されます。",
|
||||
"css_class": "このラベルの値は、ツリー内の特定のノートを表すノードにCSSクラスとして追加されます。これは高度なテーマ設定に役立ちます。テンプレートノートで使用できます。",
|
||||
"icon_class": "このラベルの値は、ツリー上のアイコンにCSSクラスとして追加され、ツリー内のノートを視覚的に区別するのに役立ちます。例えば、bx bx-home のように、アイコンは boxicons から取得されます。テンプレートノートで使用できます。",
|
||||
"page_size": "ノートリストの1ページあたりの項目数",
|
||||
"custom_request_handler": "<a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">カスタムリクエストハンドラー</a>を参照してください",
|
||||
"custom_resource_provider": "<a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">カスタムリクエストハンドラー</a>を参照してください",
|
||||
"widget": "このノートをカスタムウィジェットとしてマークし、Trilium コンポーネントツリーに追加します",
|
||||
"workspace": "このノートをワークスペースとしてマークし、簡単にホイストできるようにします",
|
||||
"workspace_icon_class": "このノートにホイストされたときにタブで使用されるボックスアイコンのCSSクラスを定義します",
|
||||
"workspace_tab_background_color": "このノートにホイストされたときにノートタブで使用されるCSSでの色",
|
||||
"workspace_calendar_root": "ワークスペースごとのカレンダールートを定義する",
|
||||
"workspace_template": "このノートは、新しいノートを作成するときに利用可能なテンプレートの選択肢に表示されますが、このテンプレートを含むワークスペースにホイストされた場合にのみ表示されます",
|
||||
"search_home": "新しい検索ノートはこのノートの子として作成されます",
|
||||
"workspace_search_home": "このワークスペースノートの祖先にホイストされた新しい検索ノートは、このノートの子として作成されます",
|
||||
"inbox": "新しいノートのデフォルトのinboxの場所 - サイドバーの「新しいノート」ボタンを使用してノートを作成すると、ノートは <code>#inbox</code> ラベルでマークされたノートの子ノートとして作成されます。",
|
||||
"workspace_inbox": "このワークスペースノートの祖先にホイストされた場合、新規ノートのデフォルトのinboxの場所",
|
||||
"sql_console_home": "SQLコンソールノートのデフォルトの場所",
|
||||
"bookmark_folder": "このラベルの付いたノートは、ブックマークにフォルダとして表示されます(子フォルダへのアクセスを許可します)",
|
||||
"share_hidden_from_tree": "このノートは左側のナビゲーションツリーには表示されていませんが、URL からアクセスできます",
|
||||
"share_external_link": "ノートは共有ツリー内で外部ウェブサイトへのリンクとして機能します",
|
||||
"share_alias": "https://your_trilium_host/share/[your_alias] でノートを利用できるようにエイリアスを定義します",
|
||||
"share_omit_default_css": "デフォルトの共有ページのCSSは省略されます。スタイルを大幅に変更する場合に使用してください。",
|
||||
"share_root": "/share root で提供されるノートをマークする。",
|
||||
"share_raw": "ノートはHTMLラッパーなしでそのままの形式で提供されます",
|
||||
"share_disallow_robot_indexing": "<code>X-Robots-Tag: noindex</code> ヘッダーにより、このノートのロボットによるインデックス作成を禁止します",
|
||||
"share_credentials": "この共有ノートにアクセスするには認証情報が必要です。値は「ユーザー名:パスワード」の形式である必要があります。子ノート/画像に適用するには、これを継承可能にすることを忘れないでください。",
|
||||
"share_index": "このラベルの付いたノートには、共有ノートのルートがすべてリストされます",
|
||||
"display_relations": "表示するリレーション名をカンマで区切って指定します。それ以外のリレーション名は非表示になります。",
|
||||
"hide_relations": "非表示にするリレーション名をカンマで区切って指定します。それ以外のリレーションは表示されます。",
|
||||
"template": "このノートは、新しいノートを作成するときに利用可能なテンプレートの選択肢に表示されます",
|
||||
"toc": "<code>#toc</code> または <code>#toc=show</code><code> は目次を強制的に表示し、<code>#toc=hide</code> は目次を強制的に非表示にします。ラベルが存在しない場合は、グローバル設定が適用されます",
|
||||
"color": "ノートツリー、リンクなどのノートの色を定義します。 'red' や #a13d5f などの有効な CSS カラー値を使用します",
|
||||
"keyboard_shortcut": "このノートにすぐにジャンプするキーボードショートカットを定義します。例: 「ctrl+alt+e」。変更を有効にするには、フロントエンドをリロードする必要があります。",
|
||||
"keep_current_hoisting": "このリンクを開いても、ノートが現在のホイストされたサブツリーに表示できない場合でも、ホイストは変更されません。",
|
||||
"execute_button": "現在のコードノートを実行するボタンのタイトル",
|
||||
"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またはスクリプト)を使用してレンダリングされます。このリレーションを使用して、どのノートをレンダリングするかを指定する必要があります",
|
||||
"other_notes_with_name": "{{attributeType}} の名前が「{{attributeName}}」であるその他のノート",
|
||||
"color_type": "色"
|
||||
},
|
||||
"link_context_menu": {
|
||||
"open_note_in_popup": "クイックエディット",
|
||||
@@ -956,7 +1086,8 @@
|
||||
"open_note_in_new_window": "新しいウィンドウでノートを開く"
|
||||
},
|
||||
"note_tooltip": {
|
||||
"quick-edit": "クイックエディット"
|
||||
"quick-edit": "クイックエディット",
|
||||
"note-has-been-deleted": "ノートは削除されました。"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "ノートを保護",
|
||||
@@ -999,7 +1130,9 @@
|
||||
"automatically-collapse-notes-title": "一定期間使用されないと、ツリーを整理するためにノートは折りたたまれます。",
|
||||
"save-changes": "変更を保存して適用",
|
||||
"auto-collapsing-notes-after-inactivity": "非アクティブ状態が続いたためノートが自動で折りたたまれます...",
|
||||
"create-child-note": "子ノートを作成"
|
||||
"create-child-note": "子ノートを作成",
|
||||
"hoist-this-note-workspace": "このノートをホイストする(ワークスペース)",
|
||||
"unhoist": "ホイスト解除"
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "一括操作",
|
||||
@@ -1049,7 +1182,8 @@
|
||||
"reset": "リセット",
|
||||
"move-to-visible-launchers": "可視ランチャーに移動",
|
||||
"move-to-available-launchers": "利用可能なランチャーに移動",
|
||||
"duplicate-launcher": "ランチャーの複製 <kbd data-command=\"duplicateSubtree\">"
|
||||
"duplicate-launcher": "ランチャーの複製 <kbd data-command=\"duplicateSubtree\">",
|
||||
"reset_launcher_confirm": "本当に「{{title}}」をリセットしますか? このノート(およびその子ノート)のすべてのデータと設定が失われ、ランチャーは元の場所に戻ります。"
|
||||
},
|
||||
"editable-text": {
|
||||
"auto-detect-language": "自動検出"
|
||||
@@ -1073,7 +1207,8 @@
|
||||
"editor_type": {
|
||||
"label": "書式設定ツールバー",
|
||||
"floating": {
|
||||
"description": "編集ツールがカーソル付近に表示されます;"
|
||||
"description": "編集ツールがカーソル付近に表示されます;",
|
||||
"title": "フローティング"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "固定",
|
||||
@@ -1104,7 +1239,9 @@
|
||||
"show_login_link_description": "共有ページの下部にログインリンクを追加",
|
||||
"share_root_found": "共有ルートノート '{{noteTitle}}' の準備が完了",
|
||||
"share_root_not_found": "#shareRoot のラベルが付いたノートが見つかりません",
|
||||
"share_root_not_shared": "ノート '{{noteTitle}}' は #shareRoot のラベルを持っていますが、共有されていません"
|
||||
"share_root_not_shared": "ノート '{{noteTitle}}' は #shareRoot のラベルを持っていますが、共有されていません",
|
||||
"show_login_link": "共有テーマにログインリンクを表示する",
|
||||
"check_share_root": "共有ルートのステータスを確認"
|
||||
},
|
||||
"time_selector": {
|
||||
"invalid_input": "入力された時間値が有効な数値ではありません。",
|
||||
@@ -1132,7 +1269,10 @@
|
||||
"cpu_arch_warning": {
|
||||
"title": "ARM64版をダウンロードしてください",
|
||||
"dont_show_again": "この警告を二度と表示しない",
|
||||
"continue_anyway": "とにかく続ける"
|
||||
"continue_anyway": "とにかく続ける",
|
||||
"message_windows": "TriliumNext は現在エミュレーションを実行しています。つまり、ARM版WindowsデバイスでIntel(x64)版を使用していることになります。これはパフォーマンスとバッテリー寿命に重大な影響を及ぼします。",
|
||||
"recommendation": "最適なエクスペリエンスを得るには、リリース ページから TriliumNext のネイティブ ARM64 バージョンをダウンロードしてください。",
|
||||
"download_link": "ネイティブ版をダウンロード"
|
||||
},
|
||||
"editorfeatures": {
|
||||
"emoji_completion_enabled": "絵文字のオートコンプリートを有効",
|
||||
@@ -1228,7 +1368,9 @@
|
||||
"add_label": "ラベルを追加",
|
||||
"label_name_placeholder": "ラベル名",
|
||||
"label_name_title": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"new_value_placeholder": "新しい値"
|
||||
"new_value_placeholder": "新しい値",
|
||||
"help_text": "一致したすべてのノートに:",
|
||||
"help_text_note": "このメソッドを値なしで呼び出すこともできます。その場合、ラベルは値なしでノートに割り当てられます。"
|
||||
},
|
||||
"delete_label": {
|
||||
"delete_label": "ラベルを削除",
|
||||
@@ -1248,12 +1390,14 @@
|
||||
"label_name_placeholder": "ラベル名",
|
||||
"label_name_title": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"new_value_placeholder": "新しい値",
|
||||
"help_text_note": "このメソッドは値なしで呼び出すこともできます。その場合、値なしでラベルがノートに割り当てられます。"
|
||||
"help_text_note": "このメソッドは値なしで呼び出すこともできます。その場合、値なしでラベルがノートに割り当てられます。",
|
||||
"help_text": "一致したすべてのノートで、既存のラベルの値を変更する。"
|
||||
},
|
||||
"add_relation": {
|
||||
"add_relation": "関係を追加",
|
||||
"relation_name": "関係の名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。"
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"create_relation_on_all_matched_notes": "一致したすべてのノートに対して、指定されたリレーションを作成します。"
|
||||
},
|
||||
"delete_relation": {
|
||||
"delete_relation": "関係を削除",
|
||||
@@ -1271,7 +1415,8 @@
|
||||
"update_relation_target": {
|
||||
"update_relation": "関係の更新",
|
||||
"relation_name": "関係の名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。"
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"on_all_matched_notes": "一致したすべてのノートに"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "ノートの変更履歴"
|
||||
@@ -1321,7 +1466,9 @@
|
||||
"specify_new_relation_name": "新しい関係の名前(使用可能な文字: 英数字、コロン、アンダースコア)を指定:",
|
||||
"note_not_found": "ノート {{noteId}} が見つかりません!",
|
||||
"enter_title_of_new_note": "新しいノートのタイトルを入力",
|
||||
"default_new_note_title": "新しいノート"
|
||||
"default_new_note_title": "新しいノート",
|
||||
"cannot_match_transform": "変換を一致させることができません: {{transform}}",
|
||||
"click_on_canvas_to_place_new_note": "キャンバスをクリックして新しいノートを配置"
|
||||
},
|
||||
"database_anonymization": {
|
||||
"title": "データベースの匿名化",
|
||||
@@ -1364,7 +1511,8 @@
|
||||
"label_year_comparison": "数値比較(>、>=、<も含む)。",
|
||||
"label_date_created": "過去1ヶ月以内に作成されたノート",
|
||||
"error": "検索エラー: {{error}}",
|
||||
"search_prefix": "検索:"
|
||||
"search_prefix": "検索:",
|
||||
"placeholder": "全文 キーワード、#tag = value..."
|
||||
},
|
||||
"delete_revisions": {
|
||||
"delete_note_revisions": "ノートの変更履歴を削除",
|
||||
@@ -1378,7 +1526,8 @@
|
||||
"example_new_title": "<code>NEW: ${note.title}</code> - 一致したノートの名前の前に 'NEW: ' を付ける",
|
||||
"example_date_prefix": "<code>${note.dateCreatedObj.format('MM-DD:')}: ${note.title}</code> - マッチしたノートの前にノートの作成月日を付ける",
|
||||
"api_docs": "詳細については、 <a href='https://zadam.github.io/trilium/backend_api/Note.html'>note</a> および <a href='https://day.js.org/docs/en/display/format'>dateCreatedObj / utcDateCreatedObj properties</a> の API ドキュメントを参照してください。",
|
||||
"evaluated_as_js_string": "与えられた値はJavaScript文字列として評価されるため、注入された<code>note</code>変数(noteは名前が変更されます)を介して動的なコンテンツで強化できます。例:"
|
||||
"evaluated_as_js_string": "与えられた値はJavaScript文字列として評価されるため、注入された<code>note</code>変数(noteは名前が変更されます)を介して動的なコンテンツで強化できます。例:",
|
||||
"click_help_icon": "右側のヘルプアイコンをクリックすると、すべてのオプションが表示されます"
|
||||
},
|
||||
"electron_integration": {
|
||||
"desktop-application": "デスクトップアプリケーション",
|
||||
@@ -1392,5 +1541,243 @@
|
||||
"zoom_factor": {
|
||||
"description": "ズームは CTRL+- と CTRL+= のショートカットでも操作可能。",
|
||||
"title": "ズーム倍率(デスクトップビルドのみ)"
|
||||
},
|
||||
"jump_to_note": {
|
||||
"search_placeholder": "名前またはタイプでノートを検索 > コマンドを検索...",
|
||||
"search_button": "全文検索"
|
||||
},
|
||||
"markdown_import": {
|
||||
"dialog_title": "Markdownをインポート",
|
||||
"modal_body_text": "ブラウザサンドボックスのため、JavaScriptからクリップボードの内容を直接読み込むことはできません。インポートするMarkdownを以下のテキストエリアに貼り付け、インポートボタンをクリックしてください",
|
||||
"import_button": "インポート",
|
||||
"import_success": "Markdown コンテンツがドキュメントにインポートされました。"
|
||||
},
|
||||
"note_type_chooser": {
|
||||
"change_path_prompt": "新しいノートを作成する場所を変更する:",
|
||||
"search_placeholder": "名前によるパスの検索 (空の場合はデフォルト)",
|
||||
"modal_title": "ノートタイプを選択",
|
||||
"modal_body": "新しいノートのノートタイプ / テンプレートを選択してください:",
|
||||
"templates": "テンプレート",
|
||||
"builtin_templates": "組み込みテンプレート"
|
||||
},
|
||||
"prompt": {
|
||||
"title": "プロンプト",
|
||||
"ok": "OK",
|
||||
"defaultTitle": "プロンプト"
|
||||
},
|
||||
"upload_attachments": {
|
||||
"upload_attachments_to_note": "ノートに添付ファイルをアップロード",
|
||||
"choose_files": "ファイルを選択",
|
||||
"files_will_be_uploaded": "ファイルは {{noteTitle}} に添付ファイルとしてアップロードされます",
|
||||
"options": "オプション",
|
||||
"shrink_images": "画像を縮小",
|
||||
"upload": "アップロード",
|
||||
"tooltip": "このオプションにチェックを入れると、Trilium はアップロードされた画像をスケーリングと最適化によって縮小しようとします。これにより、画質が多少変化する可能性があります。チェックを外すと、画像は変更されずにアップロードされます。"
|
||||
},
|
||||
"attribute_editor": {
|
||||
"help_text_body1": "ラベルを追加するには、例 <code>#rock</code> と入力します。値も追加したい場合は、例 <code>#year = 2020</code> と入力します",
|
||||
"help_text_body2": "リレーションについては、<code>~author = @</code> と入力すると、オートコンプリートが表示され、目的のノートを検索できるようになります。",
|
||||
"placeholder": "ここにラベルとリレーションを入力"
|
||||
},
|
||||
"move_note": {
|
||||
"on_all_matched_notes": "一致したすべてのノートに"
|
||||
},
|
||||
"onclick_button": {
|
||||
"no_click_handler": "ボタン ウィジェット '{{componentId}}' にはクリック ハンドラーが定義されていません"
|
||||
},
|
||||
"protected_session_status": {
|
||||
"active": "保護されたセッションが有効です。クリックして保護されたセッションを終了します。",
|
||||
"inactive": "クリックして保護されたセッションに入る"
|
||||
},
|
||||
"editable_code": {
|
||||
"placeholder": "ここにコードノートの内容を入力..."
|
||||
},
|
||||
"editable_text": {
|
||||
"placeholder": "ここにノートの内容を入力..."
|
||||
},
|
||||
"empty": {
|
||||
"open_note_instruction": "以下の入力欄にノートのタイトルを入力するか、ツリー内のノートを選択してノートを開きます。"
|
||||
},
|
||||
"file": {
|
||||
"too_big": "パフォーマンス上の理由により、プレビューではファイルの最初の {{maxNumChars}} 文字のみが表示されます。ファイル全体を表示するには、ファイルをダウンロードして外部で開いてください。"
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "保護されたノートを表示するにはパスワードを入力する必要があります:"
|
||||
},
|
||||
"render": {
|
||||
"note_detail_render_help_1": "このヘルプノートが表示されるのは、このノートの「HTML のレンダリング」タイプには、正常に機能するために必要なリレーションがないためです。"
|
||||
},
|
||||
"consistency_checks": {
|
||||
"find_and_fix_button": "一貫性の問題を見つけて修正する",
|
||||
"finding_and_fixing_message": "一貫性の問題を見つけて修正中…"
|
||||
},
|
||||
"vacuum_database": {
|
||||
"title": "データベースのバキューム",
|
||||
"description": "これによりデータベースが再構築され、通常はデータベースファイルのサイズが小さくなります。実際のデータは変更されません。",
|
||||
"button_text": "データベースをバキューム",
|
||||
"vacuuming_database": "データベースのバキュームを実行中...",
|
||||
"database_vacuumed": "データベースのバキューム処理が完了しました"
|
||||
},
|
||||
"ribbon": {
|
||||
"promoted_attributes_message": "プロモート属性がノートに存在する場合、プロモート属性のリボンタブが自動的に開きます",
|
||||
"edited_notes_message": "編集したノートのリボンタブは、dayノートで自動的に開きます"
|
||||
},
|
||||
"ui-performance": {
|
||||
"enable-motion": "トランジションとアニメーションを有効にする",
|
||||
"enable-shadows": "影を有効にする",
|
||||
"enable-backdrop-effects": "メニュー、ポップアップ、パネルの背景効果を有効にする"
|
||||
},
|
||||
"code_mime_types": {
|
||||
"title": "ドロップダウンで利用可能なMIMEタイプ"
|
||||
},
|
||||
"attachment_erasure_timeout": {
|
||||
"attachment_erasure_timeout": "添付ファイル消去のタイムアウト",
|
||||
"attachment_auto_deletion_description": "定義されたタイムアウト後にノートによって参照されなくなった場合、添付ファイルは自動的に削除 (および消去) されます。",
|
||||
"erase_attachments_after": "使用されていない添付ファイルを消去する期間:",
|
||||
"manual_erasing_description": "手動で消去をトリガーすることもできます (上記で定義したタイムアウトを考慮せずに):",
|
||||
"erase_unused_attachments_now": "使用されていない添付ノートを今すぐ消去",
|
||||
"unused_attachments_erased": "使用されていない添付ファイルは削除されました。"
|
||||
},
|
||||
"network_connections": {
|
||||
"network_connections_title": "ネットワーク接続",
|
||||
"check_for_updates": "アップデートを自動的に確認する"
|
||||
},
|
||||
"note_erasure_timeout": {
|
||||
"note_erasure_timeout_title": "ノート消去のタイムアウト",
|
||||
"note_erasure_description": "削除されたノート(および属性、変更履歴など)最初は削除済みとしてマークされるだけで、「最近の変更」ダイアログから復元できます。一定期間が経過すると、削除されたノートは「消去」され、内容は復元できなくなります。この設定では、ノートを削除してから消去するまでの期間を設定できます。",
|
||||
"erase_notes_after": "ノートを消去する間隔:",
|
||||
"manual_erasing_description": "手動で消去をトリガーすることもできます (上記で定義したタイムアウトを考慮せずに):",
|
||||
"erase_deleted_notes_now": "削除したノートを今すぐ消去",
|
||||
"deleted_notes_erased": "削除されたノートは消去されました。"
|
||||
},
|
||||
"revisions_snapshot_interval": {
|
||||
"note_revisions_snapshot_interval_title": "ノートの変更履歴の記録間隔",
|
||||
"note_revisions_snapshot_description": "ノートの変更履歴の記録間隔は、そのノートに対して新しい変更が作成されるまでの時間です。詳細については、<doc>wiki</doc> をご覧ください。",
|
||||
"snapshot_time_interval_label": "ノートの変更履歴が記憶される時間:"
|
||||
},
|
||||
"revisions_snapshot_limit": {
|
||||
"note_revisions_snapshot_limit_title": "ノートの変更履歴の記録制限",
|
||||
"note_revisions_snapshot_limit_description": "ノートの変更履歴の記録制限とは、各ノートに保存できる変更履歴の最大数を指します。-1 は制限なし、0 はすべての変更履歴を削除することを意味します。#versioningLimit ラベルを使用して、1 つのノートの最大変更数を設定できます。",
|
||||
"snapshot_number_limit_label": "ノートの変更履歴の記録数の制限:",
|
||||
"snapshot_number_limit_unit": "スナップショット",
|
||||
"erase_excess_revision_snapshots": "余分な変更履歴を今すぐ消去",
|
||||
"erase_excess_revision_snapshots_prompt": "余分な変更履歴が消去されました。"
|
||||
},
|
||||
"editability_select": {
|
||||
"note_is_read_only": "ノートは読み取り専用ですが、ボタンをクリックすると編集できます。"
|
||||
},
|
||||
"find": {
|
||||
"case_sensitive": "大文字と小文字を区別",
|
||||
"match_words": "単語が一致",
|
||||
"find_placeholder": "テキスト内を検索...",
|
||||
"replace_placeholder": "置換対象...",
|
||||
"replace": "置換",
|
||||
"replace_all": "すべて置換"
|
||||
},
|
||||
"title_bar_buttons": {
|
||||
"window-on-top": "ウィンドウを最前面に維持"
|
||||
},
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
"ignore_this_change": "この変更を無視する"
|
||||
},
|
||||
"image": {
|
||||
"copied-to-clipboard": "画像への参照がクリップボードにコピーされました。これは任意のテキストノートに貼り付けることができます。",
|
||||
"cannot-copy": "画像参照をクリップボードにコピーできませんでした。"
|
||||
},
|
||||
"entrypoints": {
|
||||
"note-revision-created": "ノートの改訂版が作成されました。",
|
||||
"sql-error": "SQL クエリの実行中にエラーが発生しました: {{message}}"
|
||||
},
|
||||
"branches": {
|
||||
"cannot-move-notes-here": "ここにノートを移動することはできません。",
|
||||
"delete-status": "ステータスを削除",
|
||||
"delete-notes-in-progress": "削除進行中のノート: {{count}}",
|
||||
"delete-finished-successfully": "削除が正常に完了しました。",
|
||||
"undeleting-notes-in-progress": "削除済みのノートを復元中: {{count}}",
|
||||
"undeleting-notes-finished-successfully": "ノートの復元が正常に完了しました。"
|
||||
},
|
||||
"frontend_script_api": {
|
||||
"async_warning": "`api.runOnBackend()` に非同期関数を渡していますが、これは意図したとおりに動作しない可能性があります。\\n関数を同期させる(`async` キーワードを削除する)か、`api.runAsyncOnBackendWithManualTransactionHandling()` を使用してください。",
|
||||
"sync_warning": "`api.runAsyncOnBackendWithManualTransactionHandling()` に同期関数を渡していますが、\\n代わりに `api.runOnBackend()` を使用する必要がある可能性があります。"
|
||||
},
|
||||
"ws": {
|
||||
"sync-check-failed": "同期チェックに失敗しました!",
|
||||
"consistency-checks-failed": "整合性チェックに失敗しました! 詳細はログを参照してください。",
|
||||
"encountered-error": "エラー「{{message}}」が発生しました。コンソールを確認してください。"
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "要求されたノート「{{requestedNote}}」は、ホイストされたノート「{{hoistedNote}}」サブツリーの外部にあるため、ノートにアクセスするにはホイストを解除する必要があります。ホイスト解除を続行しますか?"
|
||||
},
|
||||
"image_context_menu": {
|
||||
"copy_reference_to_clipboard": "参照をクリップボードにコピー",
|
||||
"copy_image_to_clipboard": "画像をクリップボードにコピー"
|
||||
},
|
||||
"note_autocomplete": {
|
||||
"search-for": "「{{term}}」を検索",
|
||||
"create-note": "子ノート「{{term}}」を作成してリンクする",
|
||||
"insert-external-link": "「{{term}}」への外部リンクを挿入",
|
||||
"clear-text-field": "テキストフィールドを消去",
|
||||
"show-recent-notes": "最近のノートを表示",
|
||||
"full-text-search": "全文検索"
|
||||
},
|
||||
"geo-map": {
|
||||
"create-child-note-title": "新しい子ノートを作成し、マップに追加する",
|
||||
"create-child-note-instruction": "地図をクリックしてその場所に新しいノートを作成するか、Esc キーを押して閉じます。",
|
||||
"unable-to-load-map": "マップを読み込めません。"
|
||||
},
|
||||
"geo-map-context": {
|
||||
"open-location": "現在位置を表示",
|
||||
"remove-from-map": "マップから削除",
|
||||
"add-note": "この場所にマーカーを追加"
|
||||
},
|
||||
"help-button": {
|
||||
"title": "関連するヘルプページを開く"
|
||||
},
|
||||
"content_widget": {
|
||||
"unknown_widget": "「{{id}}」のウィジェットは不明です。"
|
||||
},
|
||||
"switch_layout_button": {
|
||||
"title_vertical": "編集パネルを下に移動",
|
||||
"title_horizontal": "編集パネルを左に移動"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "編集のロックを解除",
|
||||
"lock-editing": "編集をロック"
|
||||
},
|
||||
"book_properties_config": {
|
||||
"hide-weekends": "週末を非表示",
|
||||
"display-week-numbers": "週番号を表示",
|
||||
"map-style": "マップスタイル:",
|
||||
"max-nesting-depth": "最大階層の深さ:",
|
||||
"show-scale": "スケールを表示"
|
||||
},
|
||||
"call_to_action": {
|
||||
"next_theme_title": "新しいTriliumテーマをお試しください",
|
||||
"next_theme_message": "現在、レガシーテーマを使用しています。新しいテーマを試してみませんか?",
|
||||
"next_theme_button": "新しいテーマを試す",
|
||||
"background_effects_title": "背景効果が安定しました",
|
||||
"background_effects_message": "Windowsデバイスでは、背景効果が完全に安定しました。背景効果は、背景をぼかすことでユーザーインターフェースに彩りを添えます。この技術は、Windowsエクスプローラーなどの他のアプリケーションでも使用されています。",
|
||||
"background_effects_button": "背景効果を有効にする",
|
||||
"dismiss": "却下"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "関連設定"
|
||||
},
|
||||
"settings_appearance": {
|
||||
"related_code_blocks": "テキストノート内のコードブロックの配色",
|
||||
"related_code_notes": "コードノートの配色"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
},
|
||||
"pagination": {
|
||||
"page_title": "{{startIndex}} - {{endIndex}} ページ",
|
||||
"total_notes": "{{count}} ノート"
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "エラーのためコンテンツを表示できません。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,8 @@
|
||||
"chosen_actions": "Wybrane działania",
|
||||
"execute_bulk_actions": "Wykonaj zbiór działań",
|
||||
"bulk_actions_executed": "Zbiór działań został wykonany prawidłowo.",
|
||||
"none_yet": "Brak zaznaczonych działań... dodaj działanie poprzez kliknięcie jednej z dostępnych opcji powyżej."
|
||||
"none_yet": "Brak zaznaczonych działań... dodaj działanie poprzez kliknięcie jednej z dostępnych opcji powyżej.",
|
||||
"affected_notes": "Dotyczy notatek"
|
||||
},
|
||||
"confirm": {
|
||||
"ok": "OK",
|
||||
@@ -102,7 +103,8 @@
|
||||
"clone_to_selected_note": "Sklonuj do wybranej notatki",
|
||||
"no_path_to_clone_to": "Brak ścieżki do sklonowania.",
|
||||
"note_cloned": "Notatka \"{{clonedTitle}}\" została sklonowana do \"{{targetTitle}}\"",
|
||||
"help_on_links": "Pomoc dotycząca linków"
|
||||
"help_on_links": "Pomoc dotycząca linków",
|
||||
"target_parent_note": "Docelowa główna notatka"
|
||||
},
|
||||
"help": {
|
||||
"title": "Ściągawka",
|
||||
@@ -138,6 +140,495 @@
|
||||
"cutNotes": "przytnij obecną notatkę (lub obecną sekcję) do schowka (zastosowanie dla przenoszenia notatek)",
|
||||
"pasteNotes": "wklej notatkę jako podnotatka w obecnej notatce (rozumiane jako przenieś lub skopiuj, w zależności czy notatka była skopiowana czy wycięta)",
|
||||
"deleteNotes": "usuń notatkę / gałąź",
|
||||
"editingNotes": "Edytowanie notatek"
|
||||
"editingNotes": "Edytowanie notatek",
|
||||
"other": "Inne",
|
||||
"editNoteTitle": "W panelu drzewa nastąpi przejście z panelu drzewa do tytułu notatki. Naciśnięcie klawisza Enter w tytule notatki spowoduje przejście do edytora tekstu. <kbd>Ctrl+.</kbd> spowoduje powrót z edytora do panelu drzewa.",
|
||||
"createEditLink": "stwórz / edytuj zewnętrzny link",
|
||||
"createInternalLink": "stwórz wewnętrzny link",
|
||||
"followLink": "kliknij link pod kursorem",
|
||||
"insertDateTime": "wstaw aktualną datę i godzinę w pozycji kursora",
|
||||
"markdownAutoformat": "Autoformatowanie w stylu Markdown",
|
||||
"headings": "<code>##</code>, <code>###</code>, <code>####</code> itd., po których następuje miejsce na nagłówki",
|
||||
"bulletList": "<code>*</code> lub <code>-</code>, a następnie spacja, aby utworzyć listę",
|
||||
"jumpToTreePane": "przejdź do panelu drzewa i przewiń do aktywnej notatki",
|
||||
"numberedList": "<code>1.</code> or <code>1)</code> po którym następuje miejsce na listę numerowaną",
|
||||
"blockQuote": "zacznij linijkę od <code></code> aby po kliknięciu spacji dodać blok cytatu",
|
||||
"troubleshooting": "Rozwiązywanie błędów",
|
||||
"reloadFrontend": "Załaduj ponownie Frontend Trilium",
|
||||
"showDevTools": "pokaż narzędzia deweloperskie",
|
||||
"showSQLConsole": "pokaż konsolę SQL",
|
||||
"quickSearch": "skup się na szybkim wyszukiwaniu",
|
||||
"inPageSearch": "wyszukiwanie wewnątrz strony"
|
||||
},
|
||||
"book_properties": {
|
||||
"list": "Lista"
|
||||
},
|
||||
"board_view": {
|
||||
"move-to": "Przenieś do",
|
||||
"insert-above": "Umieść nad",
|
||||
"insert-below": "Umieść pod",
|
||||
"delete-column": "Usuń kolumnę",
|
||||
"delete-column-confirmation": "Czy na pewno chcesz usunąć tę kolumnę? Odpowiedni atrybut zostanie również usunięty w notatkach pod tą kolumną.",
|
||||
"new-item": "Nowy element",
|
||||
"new-item-placeholder": "Wpisz tytuł notatki...",
|
||||
"add-column": "Dodaj kolumnę",
|
||||
"add-column-placeholder": "Wpisz tytuł kolumny...",
|
||||
"edit-note-title": "Naciśnij aby edytować tytuł notatki",
|
||||
"edit-column-title": "Naciśnij aby edytować tytuł kolumny",
|
||||
"delete-note": "Usuń notatkę...",
|
||||
"remove-from-board": "Usuń z tablicy",
|
||||
"archive-note": "Archiwalna notatka",
|
||||
"unarchive-note": "Usuń notatkę z archiwum"
|
||||
},
|
||||
"command_palette": {
|
||||
"tree-action-name": "Drzewo: {{name}}",
|
||||
"export_note_title": "Wyeksportuj notatkę",
|
||||
"export_note_description": "Wyeksportuj aktualną notatkę",
|
||||
"show_attachments_title": "Pokaż załączniki",
|
||||
"show_attachments_description": "Zobacz załączniki notatki",
|
||||
"search_notes_title": "Szukaj notatek",
|
||||
"search_notes_description": "Otwórz zaawansowane wyszukiwanie",
|
||||
"search_subtree_title": "Poszukaj w poddrzewie",
|
||||
"search_subtree_description": "poszukaj wewnątrz poddrzewa",
|
||||
"search_history_title": "Pokaż historię wyszukiwania",
|
||||
"search_history_description": "Pokaż poprzednie wyszukiwania",
|
||||
"configure_launch_bar_title": "Ustaw Launch Bar",
|
||||
"configure_launch_bar_description": "Otwórz konfigurację Launch Bar, aby dodać lub usunąć elementy."
|
||||
},
|
||||
"content_renderer": {
|
||||
"open_externally": "Otwórz zewnętrznie"
|
||||
},
|
||||
"modal": {
|
||||
"close": "Zamknij",
|
||||
"help_title": "Pokaż więcej informacji na temat tego ekranu"
|
||||
},
|
||||
"call_to_action": {
|
||||
"next_theme_title": "Spróbuj nowy motyw Trilium",
|
||||
"next_theme_message": "Obecnie używasz starszego motywu. Czy chcesz wypróbować nowy motyw?",
|
||||
"next_theme_button": "Spróbuj nowego motywu",
|
||||
"background_effects_title": "Efekty w tle są już stabilne",
|
||||
"dismiss": "Odrzuć",
|
||||
"background_effects_button": "Włącz efekty w tle"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "Powiązane ustawienia"
|
||||
},
|
||||
"settings_appearance": {
|
||||
"related_code_blocks": "Schemat kolorów dla bloków kodu w notatkach tekstowych",
|
||||
"related_code_notes": "Schemat kolorów dla kodu"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
},
|
||||
"pagination": {
|
||||
"page_title": "Strony:{{startIndex}}-{{endIndex}}",
|
||||
"total_notes": "{{count}}notatek"
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "Błąd - Nie można pokazać treści."
|
||||
},
|
||||
"add_label": {
|
||||
"add_label": "Dodaj etykietę",
|
||||
"label_name_placeholder": "Nazwa etykiety",
|
||||
"label_name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.",
|
||||
"to_value": "do wartości",
|
||||
"new_value_placeholder": "nowa wartość",
|
||||
"help_text": "We wszystkich dopasowanych notatkach:",
|
||||
"help_text_item2": "albo zmień wartość istniejącej etykiety"
|
||||
},
|
||||
"attribute_detail": {
|
||||
"delete": "Usuń",
|
||||
"related_notes_title": "Inne notatki z tą etykietą",
|
||||
"more_notes": "Więcej notatek",
|
||||
"label": "Szczegóły etykiety",
|
||||
"label_definition": "Szczegóły definicji etykiety",
|
||||
"relation": "Szczegóły powiązania",
|
||||
"relation_definition": "Szczegóły definicji powiązania",
|
||||
"disable_versioning": "Wyłącza automatyczne wersjonowanie. Przydatne np. w przypadku dużych, ale nieistotnych notatek – np. dużych bibliotek JS używanych do skryptów",
|
||||
"precision": "Prezycja",
|
||||
"digits": "znaki",
|
||||
"inverse_relation_title": "Opcjonalne ustawienie definiujące, do której relacji jest ta relacja przeciwna. Przykład: Główna - podnotatka są relacjami odwrotnymi do siebie.",
|
||||
"inverse_relation": "Odwrócone powiązanie"
|
||||
},
|
||||
"import": {
|
||||
"importIntoNote": "Importuj do notatki",
|
||||
"chooseImportFile": "Wybierz plik do zaimportowania",
|
||||
"importDescription": "Zawartość wybranego pliku(ów) zostanie zaimportowana jako notatka(i) podrzędna(e) do",
|
||||
"options": "Opcje",
|
||||
"shrinkImages": "Zmniejsz obrazy",
|
||||
"safeImport": "Bezpieczny import",
|
||||
"import-status": "Status importu",
|
||||
"in-progress": "Import w trakcie: {{progress}}",
|
||||
"successful": "Importowanie zakończone sukcesem.",
|
||||
"safeImportTooltip": "Pliki eksportu Trilium <code>.zip</code> mogą zawierać skrypty wykonywalne, które mogą powodować szkodliwe zachowania. Bezpieczny import dezaktywuje automatyczne wykonywanie wszystkich importowanych skryptów. Odznacz opcję „Bezpieczny import” tylko wtedy, gdy importowane archiwum ma zawierać skrypty wykonywalne i masz pełne zaufanie do zawartości importowanego pliku.",
|
||||
"import": "Import",
|
||||
"failed": "Błąd importu: {{message}}.",
|
||||
"html_import_tags": {
|
||||
"title": "Tagi importu HTML",
|
||||
"description": "Skonfiguruj, które tagi HTML mają zostać zachowane podczas importowania notatek. Tagi spoza tej listy zostaną usunięte podczas importu. Niektóre tagi (np. „script”) są zawsze usuwane ze względów bezpieczeństwa.",
|
||||
"placeholder": "Wpisz tagi HTML, jedna na linijkę",
|
||||
"reset_button": "Zresetuj do domyślnej listy"
|
||||
}
|
||||
},
|
||||
"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": "Wgraj nową wersję",
|
||||
"upload_success": "Nowa wersja obrazu została wysłana.",
|
||||
"upload_failed": "Wysyłanie nowej wersji obrazu nie powiodło się: {{message}}"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "Odziedziczone atrybuty",
|
||||
"no_inherited_attributes": "Brak odziedziczonych atrybutów."
|
||||
},
|
||||
"note_info_widget": {
|
||||
"note_id": "ID notatki",
|
||||
"created": "Stworzona",
|
||||
"modified": "Zmodyfikowano",
|
||||
"type": "Typ",
|
||||
"note_size": "Rozmiar notatki",
|
||||
"note_size_info": "Rozmiar notatki pozwala oszacować przybliżoną ilość miejsca potrzebnego na przechowanie jej. Uwzględnia ona jej treść oraz treść jej poprawek.",
|
||||
"calculate": "oblicz",
|
||||
"subtree_size": "(rozmiar poddrzewa: {{size}} w {{count}} notatkach)",
|
||||
"title": "Informacje o notatce"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "Pełne rozszerzenie",
|
||||
"collapse": "Zmniejsz do normalnego rozmiaru",
|
||||
"title": "Mapa notatki",
|
||||
"fix-nodes": "Napraw węzły",
|
||||
"link-distance": "Odległość linku"
|
||||
},
|
||||
"note_paths": {
|
||||
"title": "Ścieżki notatki",
|
||||
"clone_button": "Sklonuj notatkę do nowej lokalizacji...",
|
||||
"intro_placed": "Ta notatka jest umieszczona w następujących lokalizacjach:",
|
||||
"intro_not_placed": "Ta notatka nie została jeszcze umieszczona w drzewie.",
|
||||
"outside_hoisted": "Ta ścieżka znajduje się poza podniesioną notatką i trzeba ją odwiesić.",
|
||||
"archived": "Zarchiwizowane",
|
||||
"search": "Szukaj"
|
||||
},
|
||||
"note_properties": {
|
||||
"this_note_was_originally_taken_from": "Ta notatka oryginalnie została wzięta z:",
|
||||
"info": "Info"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "Posiadane atrybuty"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"promoted_attributes": "Promowane atrybuty",
|
||||
"unset-field-placeholder": "nie ustawione",
|
||||
"url_placeholder": "http://strona...",
|
||||
"open_external_link": "Otwórz link zewnętrzny",
|
||||
"unknown_label_type": "Nieznany typ etykiety \"{{type}}\"",
|
||||
"unknown_attribute_type": "Nieznany typ atrybutu \"{{type}}\"",
|
||||
"add_new_attribute": "Dodaj nowy atrybut",
|
||||
"remove_this_attribute": "Usuń ten atrybut",
|
||||
"remove_color": "Usuń ten kolor etykiety"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "Zapytanie",
|
||||
"script": "Skrypt",
|
||||
"execute_query": "Wykonaj zapytanie",
|
||||
"execute_script": "Wykonaj skrypt"
|
||||
},
|
||||
"search_definition": {
|
||||
"add_search_option": "Dodaj opcje wyszukiwania:",
|
||||
"search_string": "ciąg wyszukiwania",
|
||||
"search_script": "skrypt wyszukiwania",
|
||||
"ancestor": "przodek",
|
||||
"fast_search": "szybkie wyszukiwanie",
|
||||
"fast_search_description": "Opcja szybkiego wyszukiwania wyłącza pełno tekstowe przeszukiwanie zawartości notatek, co może przyspieszyć przeszukiwanie dużych baz danych.",
|
||||
"include_archived": "dodaj zarchiwizowane",
|
||||
"include_archived_notes_description": "Domyślnie zarchiwizowane notatki są wyłączone z wyszukiwania, z tą opcją zostaną dodane do wyszukiwania.",
|
||||
"order_by": "sortuj",
|
||||
"limit": "limituj",
|
||||
"limit_description": "Limituj liczbę wyników",
|
||||
"save_to_note": "Zapisz do notatki",
|
||||
"search_parameters": "Parametry wyszukiwania",
|
||||
"unknown_search_option": "Nieznana opcja wyszukiwania {{searchOptionName}}",
|
||||
"search_note_saved": "Wyszukiwana notatka została zapisana do {{- notePathTitle}}",
|
||||
"actions_executed": "Akcja została wykonana."
|
||||
},
|
||||
"similar_notes": {
|
||||
"title": "Podobne notatki",
|
||||
"no_similar_notes_found": "Nie znaleziono podobnych notatek."
|
||||
},
|
||||
"abstract_search_option": {
|
||||
"remove_this_search_option": "Usuń tą opcję wyszukiwania",
|
||||
"failed_rendering": "Nieudana opcja wyszukiwania: {{dto}} z błędem: {{error}} {{stack}}"
|
||||
},
|
||||
"ancestor": {
|
||||
"label": "Przodek",
|
||||
"placeholder": "szukaj notatki po jej nazwie",
|
||||
"depth_label": "glębokość",
|
||||
"depth_doesnt_matter": "nie ważne",
|
||||
"depth_eq": "jest dokładnie {{count}}",
|
||||
"direct_children": "bezpośrednie podnotatki",
|
||||
"depth_gt": "jest więcej niż {{count}}",
|
||||
"depth_lt": "jest mniej niż {{count}}"
|
||||
},
|
||||
"debug": {
|
||||
"debug": "Debuguj",
|
||||
"debug_info": "Debugowanie wyświetli dodatkowe informacje debugowania w konsoli, aby ułatwić debugowanie złożonych zapytań."
|
||||
},
|
||||
"fast_search": {
|
||||
"fast_search": "Szybkie wyszukiwanie"
|
||||
},
|
||||
"file_properties": {
|
||||
"download": "Pobierz",
|
||||
"open": "Otwórz",
|
||||
"upload_new_revision": "Wgraj nową wersję",
|
||||
"upload_success": "Nowa wersja pliku nie została wysłana.",
|
||||
"upload_failed": "Wysyłanie nowej wersji pliku się nie udało.",
|
||||
"title": "Plik"
|
||||
},
|
||||
"include_note": {
|
||||
"label_note": "Notatka",
|
||||
"placeholder_search": "szukaj notatki po jej nazwie",
|
||||
"dialog_title": "Dołącz notatkę",
|
||||
"button_include": "Dołącz notatkę"
|
||||
},
|
||||
"info": {
|
||||
"closeButton": "Zamknij",
|
||||
"okButton": "OK",
|
||||
"modalTitle": "Wiadomość"
|
||||
},
|
||||
"jump_to_note": {
|
||||
"search_placeholder": "Szukaj notatki po jej nazwie albo typie > komendy...",
|
||||
"search_button": "Wyszukiwanie pełno tekstowe"
|
||||
},
|
||||
"markdown_import": {
|
||||
"dialog_title": "Zaimportuj Markdown",
|
||||
"import_button": "Import",
|
||||
"import_success": "Treść Markdown została zaimportowana do dokumentu."
|
||||
},
|
||||
"limit": {
|
||||
"limit": "Limit"
|
||||
},
|
||||
"link_context_menu": {
|
||||
"open_note_in_popup": "Szybka edycja",
|
||||
"open_note_in_new_tab": "Otwórz notatkę w nowej karcie",
|
||||
"open_note_in_new_split": "Otwórz notatkę w nowym podziale ekranu",
|
||||
"open_note_in_new_window": "Otwórz notatkę w nowym oknie"
|
||||
},
|
||||
"electron_integration": {
|
||||
"desktop-application": "Aplikacja desktopowa"
|
||||
},
|
||||
"electron_context_menu": {
|
||||
"cut": "Wytnij",
|
||||
"copy": "Kopiuj",
|
||||
"copy-link": "Kopiuj link",
|
||||
"paste": "Wklej",
|
||||
"paste-as-plain-text": "Wklej jako plain text",
|
||||
"search_online": "Szukaj \"{{term}}\" za pomocą {{searchEngine}}"
|
||||
},
|
||||
"image_context_menu": {
|
||||
"copy_reference_to_clipboard": "Skopiuj odnośnik do schowka",
|
||||
"copy_image_to_clipboard": "Skopiuj obraz do schowka"
|
||||
},
|
||||
"note_autocomplete": {
|
||||
"clear-text-field": "Wyczyść pole tekstowe",
|
||||
"show-recent-notes": "Pokaż ostatnie notatki",
|
||||
"full-text-search": "Wyszukiwanie pełnotekstowe"
|
||||
},
|
||||
"note_tooltip": {
|
||||
"note-has-been-deleted": "Notatka została usunięta.",
|
||||
"quick-edit": "Szybka edycja"
|
||||
},
|
||||
"duration": {
|
||||
"seconds": "sekundy",
|
||||
"minutes": "minuty",
|
||||
"hours": "godziny",
|
||||
"days": "dni"
|
||||
},
|
||||
"share": {
|
||||
"title": "Ustawienia udostępniania"
|
||||
},
|
||||
"tasks": {
|
||||
"due": {
|
||||
"today": "Dziś",
|
||||
"tomorrow": "Jutro",
|
||||
"yesterday": "Wczoraj"
|
||||
}
|
||||
},
|
||||
"content_widget": {
|
||||
"unknown_widget": "Nieznany widget dla \"{{id}}\"."
|
||||
},
|
||||
"note_language": {
|
||||
"not_set": "Nie ustawione",
|
||||
"configure-languages": "Konfiguracja języków..."
|
||||
},
|
||||
"content_language": {
|
||||
"title": "Język treści",
|
||||
"description": "Wybierz jeden lub więcej języków, które mają być wyświetlane w sekcji Właściwości Podstawowe Notatki Tekstowej tylko do odczytu lub edytowalnej. Umożliwi to korzystanie z takich funkcji, jak sprawdzanie pisowni czy obsługa pisania od prawej do lewej."
|
||||
},
|
||||
"switch_layout_button": {
|
||||
"title_vertical": "Przesuń panel edycji na dół",
|
||||
"title_horizontal": "Przesuń panel edycji do lewej"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Odblokuj edycję",
|
||||
"lock-editing": "Zablokuj edycję"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Wyeksportuj diagram jako PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Diagram nie może zostać wyeksportowany jako PNG."
|
||||
},
|
||||
"code_theme": {
|
||||
"title": "Wygląd",
|
||||
"word_wrapping": "Zawijanie słów",
|
||||
"color-scheme": "Schemat kolorów"
|
||||
},
|
||||
"cpu_arch_warning": {
|
||||
"title": "Proszę o pobranie wersji ARM64",
|
||||
"message_macos": "TriliumNext działa obecnie w oparciu o technologię Rosetta 2, co oznacza, że używasz wersji Intel (x64) na komputerze Mac z procesorem Apple Silicon. Będzie to miało znaczący wpływ na wydajność i czas pracy baterii.",
|
||||
"message_windows": "TriliumNext działa obecnie w trybie emulacji, co oznacza, że używasz wersji Intel (x64) na urządzeniu z systemem Windows na procesorze ARM. Będzie to miało znaczący wpływ na wydajność i czas pracy baterii.",
|
||||
"recommendation": "Aby uzyskać najlepsze wrażenia, pobierz natywną wersję ARM64 aplikacji TriliumNext ze strony poświęconej wydaniom.",
|
||||
"download_link": "Pobierz wersję natywną",
|
||||
"continue_anyway": "Kontynuuj mimo wszystko",
|
||||
"dont_show_again": "Nie pokazuj więcej tego ostrzeżenia"
|
||||
},
|
||||
"editorfeatures": {
|
||||
"title": "Cechy",
|
||||
"emoji_completion_enabled": "Włącz autouzupełnianie Emoji",
|
||||
"note_completion_enabled": "Włącz autouzupełnianie notatki"
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "Nowy wiersz",
|
||||
"new-column": "Nowa kolumna",
|
||||
"sort-column-by": "Sotuj po \"{{title}}\"",
|
||||
"sort-column-ascending": "Rosnąco",
|
||||
"sort-column-descending": "Malejąco",
|
||||
"sort-column-clear": "Wyczyść sortowanie",
|
||||
"hide-column": "Ukryj kolumnę \"{{title}}\"",
|
||||
"show-hide-columns": "Pokaż/ukryj kolumny",
|
||||
"row-insert-above": "Wstaw wiersz nad",
|
||||
"row-insert-below": "Wstaw wiersz pod",
|
||||
"row-insert-child": "Wstaw podnotatkę",
|
||||
"add-column-to-the-left": "Dodaj kolumnę po lewej",
|
||||
"add-column-to-the-right": "Dodaj kolumnę po prawej",
|
||||
"edit-column": "Edytuj kolumnę",
|
||||
"delete_column_confirmation": "Czy na pewno chcesz usunąć tę kolumnę? Odpowiedni atrybut zostanie usunięty ze wszystkich notatek.",
|
||||
"delete-column": "Usuń kolumnę",
|
||||
"new-column-label": "Etykieta",
|
||||
"new-column-relation": "Relacje"
|
||||
},
|
||||
"book_properties_config": {
|
||||
"hide-weekends": "Ukryj weekendy",
|
||||
"display-week-numbers": "Pokaż numery tygodni",
|
||||
"map-style": "Styl mapy:",
|
||||
"max-nesting-depth": "Maksymalna głębokość zagnieżdżenia:",
|
||||
"raster": "Raster",
|
||||
"vector_light": "Wektor (jasny)",
|
||||
"vector_dark": "Wektor (ciemny)",
|
||||
"show-scale": "Pokaż skalę"
|
||||
},
|
||||
"table_context_menu": {
|
||||
"delete_row": "Usuń wiersz"
|
||||
},
|
||||
"move_to": {
|
||||
"dialog_title": "Przenieś notatki do ...",
|
||||
"notes_to_move": "Notatki do przeniesienia"
|
||||
},
|
||||
"note_type_chooser": {
|
||||
"modal_title": "Wybierz typ notatki",
|
||||
"modal_body": "Wybierz typ / szablon notatki dla nowej notatki:",
|
||||
"templates": "Szablony",
|
||||
"builtin_templates": "Wbudowane szablony"
|
||||
},
|
||||
"password_not_set": {
|
||||
"title": "Hasło nie zostało ustawione"
|
||||
},
|
||||
"add_relation": {
|
||||
"add_relation": "Dodaj powiązanie",
|
||||
"relation_name": "nazwa powiązania",
|
||||
"allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.",
|
||||
"to": "do",
|
||||
"target_note": "docelowa notatka"
|
||||
},
|
||||
"ai_llm": {
|
||||
"actions": "Akcje",
|
||||
"retry": "Spróbuj ponownie",
|
||||
"partial": "{{ percentage }}% wykonania",
|
||||
"retry_queued": "notatka dodana do kolejki",
|
||||
"retry_failed": "Nieudana próba dodania notatki do kolejki",
|
||||
"max_notes_per_llm_query": "Maksymalna ilość notatek w zapytaniu",
|
||||
"index_all_notes": "Zindeksuj wszystkie notatki",
|
||||
"index_status": "Status indeksowania",
|
||||
"indexed_notes": "Zindeksowane notatki",
|
||||
"indexing_stopped": "Indeksowanie zatrzymane",
|
||||
"indexing_in_progress": "Indeksowanie w trakcie...",
|
||||
"last_indexed": "Ostatnio zindeksowane",
|
||||
"n_notes_queued_0": "{{ count }} notatka zakolejkowana do indeksowania",
|
||||
"n_notes_queued_1": "{{ count }} notatek zakolejkowanych do indeksowania",
|
||||
"n_notes_queued_2": "{{ count }} notatek zakolejkowanych do indeksowania",
|
||||
"note_chat": "Czat notatki",
|
||||
"note_title": "Tytuł notatki",
|
||||
"error": "Błąd",
|
||||
"last_attempt": "Ostatnia próba",
|
||||
"queued_notes": "Zakolejkowane notatki",
|
||||
"failed_notes": "Nieudane notatki",
|
||||
"last_processed": "Ostatnio procesowane",
|
||||
"refresh_stats": "Odśwież Statystyki",
|
||||
"enable_ai_features": "Włącz funkcje AI/LLM",
|
||||
"enable_ai_description": "Włącz funkcje AI, takie jak podsumowywanie notatek, generowanie treści i inne możliwości LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Włącz funkcje AI/LLM",
|
||||
"enable_ai_desc": "Włącz funkcje AI, takie jak podsumowywanie notatek, generowanie treści i inne możliwości LLM",
|
||||
"provider_configuration": "Konfiguracja dostawcy AI",
|
||||
"provider_precedence": "Pierwszeństwo dostawcy",
|
||||
"provider_precedence_description": "Lista dostawców przedzielonych przecinkami w kolejności (np. „openai,anthropic,ollama”)",
|
||||
"temperature": "Temperatura",
|
||||
"temperature_description": "Kontroluje losowość odpowiedzi (0 = deterministyczna, 2 = maksymalna losowość)",
|
||||
"system_prompt": "Monit systemowy",
|
||||
"system_prompt_description": "Domyślny monit systemowy używany do wszystkich interakcji ze sztuczną inteligencją",
|
||||
"openai_configuration": "Konfiguracja OpenAI",
|
||||
"openai_settings": "Ustawienia OpenAI",
|
||||
"api_key": "Klucz API",
|
||||
"url": "Bazowy URL",
|
||||
"model": "Model",
|
||||
"openai_api_key_description": "Klucz API OpenAI umożliwiający dostęp do usług AI",
|
||||
"anthropic_api_key_description": "Klucz API Anthropic umożliwiający dostęp do usług AI",
|
||||
"default_model": "Domyślny Model",
|
||||
"openai_model_description": "Przykłady: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "Bazowy URL",
|
||||
"openai_url_description": "Domyślny: https://api.openai.com/v1",
|
||||
"anthropic_settings": "Ustawienia Anthropic",
|
||||
"anthropic_url_description": "Bazowy URL dla Anthropic API (domyślny: https://api.anthropic.com)",
|
||||
"anthropic_model_description": "Modele Anthropic Claude'a do uzupełniania czatów",
|
||||
"voyage_settings": "Ustawienia Voyage AI",
|
||||
"ollama_settings": "Ustawienia Ollama",
|
||||
"ollama_url_description": "URL dla Ollama API (domyślny: http://localhost:11434)",
|
||||
"ollama_model_description": "Model Ollama używany do uzupełniania czatów",
|
||||
"anthropic_configuration": "Konfiguracja Anthropic",
|
||||
"voyage_configuration": "Konfiguracja Voyage AI",
|
||||
"voyage_url_description": "Domyślny: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Konfiguracja Ollama",
|
||||
"enable_ollama": "Włącz Ollama",
|
||||
"enable_ollama_description": "Włącz Ollama dla lokalnego modelu AI",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_model": "Model Ollama",
|
||||
"refresh_models": "Odśwież modele",
|
||||
"refreshing_models": "Odświeżanie...",
|
||||
"enable_automatic_indexing": "Włącz automatyczne indeksowanie",
|
||||
"rebuild_index": "Odbuduj indeks",
|
||||
"rebuild_index_error": "Błąd uruchomienia odbudowy indeksu. Sprawdź logi.",
|
||||
"max_notes_per_llm_query_description": "Maksymalna liczba podobnych notatek do uwzględnienia w kontekście sztucznej inteligencji",
|
||||
"active_providers": "Aktywni dostawcy",
|
||||
"disabled_providers": "Wyłączeni dostawcy",
|
||||
"remove_provider": "Usuń dostawcę z wyszukiwania",
|
||||
"restore_provider": "Przywróć dostawcę do wyszukiwania",
|
||||
"similarity_threshold": "Próg podobieństwa"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -432,7 +432,12 @@
|
||||
"mime": "MIME: ",
|
||||
"file_size": "Tamanho do arquivo:",
|
||||
"preview": "Visualizar:",
|
||||
"preview_not_available": "A visualização não está disponível para este tipo de nota."
|
||||
"preview_not_available": "A visualização não está disponível para este tipo de nota.",
|
||||
"diff_on": "Exibir diferença",
|
||||
"diff_off": "Exibir conteúdo",
|
||||
"diff_on_hint": "Clique para exibir a diferença de fonte da nota",
|
||||
"diff_off_hint": "Clique para exibir o conteúdo da nota",
|
||||
"diff_not_available": "A diferença não está disponível."
|
||||
},
|
||||
"sort_child_notes": {
|
||||
"sort_children_by": "Ordenar notas filhas por...",
|
||||
@@ -774,7 +779,9 @@
|
||||
"apply-bulk-actions": "Aplicar ações em massa",
|
||||
"converted-to-attachments": "{{count}} notas foram convertidas em anexos.",
|
||||
"convert-to-attachment-confirm": "Tem certeza de que deseja converter as notas selecionadas em anexos de suas notas-pai?",
|
||||
"open-in-popup": "Edição rápida"
|
||||
"open-in-popup": "Edição rápida",
|
||||
"archive": "Ficheiro",
|
||||
"unarchive": "Desarquivar"
|
||||
},
|
||||
"command_palette": {
|
||||
"search_subtree_title": "Buscar na Subárvore",
|
||||
@@ -843,7 +850,18 @@
|
||||
"september": "Setembro",
|
||||
"october": "Outubro",
|
||||
"november": "Novembro",
|
||||
"december": "Dezembro"
|
||||
"december": "Dezembro",
|
||||
"week": "Semana",
|
||||
"week_previous": "Semana passada",
|
||||
"week_next": "Próxima semana",
|
||||
"month": "Mês",
|
||||
"month_previous": "Mês passado",
|
||||
"month_next": "Próximo mês",
|
||||
"year": "Ano",
|
||||
"year_previous": "Ano passado",
|
||||
"year_next": "Próximo ano",
|
||||
"list": "Lista",
|
||||
"today": "Hoje"
|
||||
},
|
||||
"close_pane_button": {
|
||||
"close_this_pane": "Fechar este painel"
|
||||
@@ -995,7 +1013,8 @@
|
||||
"calendar": "Calendário",
|
||||
"table": "Tabela",
|
||||
"geo-map": "Mapa geográfico",
|
||||
"board": "Quadro"
|
||||
"board": "Quadro",
|
||||
"include_archived_notes": "Exibir notas arquivadas"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…",
|
||||
@@ -1350,7 +1369,9 @@
|
||||
"title": "Desempenho",
|
||||
"enable-motion": "Habilitar transições e animações",
|
||||
"enable-shadows": "Habilitar sombras",
|
||||
"enable-backdrop-effects": "Habilitar efeitos de fundo para menus, popups e painéis"
|
||||
"enable-backdrop-effects": "Habilitar efeitos de fundo para menus, popups e painéis",
|
||||
"enable-smooth-scroll": "Habilitar rolagem suave",
|
||||
"app-restart-required": "(é necessário reiniciar o programa para que a mudança tenha efeito)"
|
||||
},
|
||||
"zoom_factor": {
|
||||
"title": "Fator do Zoom (apenas versão de área de trabalho)",
|
||||
@@ -1730,7 +1751,7 @@
|
||||
"native-title-bar": "Barra de título nativa",
|
||||
"native-title-bar-description": "Para Windows e macOS, manter a barra de título nativa desabilitada faz a aplicação parecer mais compacta. No Linux, manter a barra de título nativa habilitada faz a aplicação se integrar melhor com o restante do sistema.",
|
||||
"background-effects": "Habilitar efeitos de fundo (apenas Windows 11)",
|
||||
"background-effects-description": "O efeito Mica adicionar um fundo borrado e estilizado às janelas da aplicação, criando profundidade e um visual moderno.",
|
||||
"background-effects-description": "O efeito Mica adiciona um fundo borrado e estilizado às janelas da aplicação, criando profundidade e um visual moderno. \"Barra de título nativa\" precisa ser desativada.",
|
||||
"restart-app-button": "Reiniciar a aplicação para ver as alterações",
|
||||
"zoom-factor": "Fator de Zoom"
|
||||
},
|
||||
@@ -1865,14 +1886,21 @@
|
||||
"delete_row": "Excluir linha"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "Excluir Nota",
|
||||
"delete-note": "Deletar nota...",
|
||||
"move-to": "Mover para",
|
||||
"insert-above": "Inserir acima",
|
||||
"insert-below": "Inserir abaixo",
|
||||
"delete-column": "Excluir coluna",
|
||||
"delete-column-confirmation": "Tem certeza de que deseja excluir esta coluna? O atributo correspondente também será removido de todas as notas abaixo desta coluna.",
|
||||
"new-item": "Novo item",
|
||||
"add-column": "Adicionar Coluna"
|
||||
"add-column": "Adicionar Coluna",
|
||||
"remove-from-board": "Remover do quadro",
|
||||
"archive-note": "Arquivar nota",
|
||||
"unarchive-note": "Desarquivar nota",
|
||||
"new-item-placeholder": "Escreva o título da nota...",
|
||||
"add-column-placeholder": "Escreva o nome da coluna...",
|
||||
"edit-note-title": "Clique para editar o título da nota",
|
||||
"edit-column-title": "Clique para editar o título da coluna"
|
||||
},
|
||||
"call_to_action": {
|
||||
"next_theme_title": "Testar no novo tema do Trilium",
|
||||
@@ -1894,7 +1922,9 @@
|
||||
"percentage": "%"
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "Esta coleção não possui nenhum nota filha, então não há nada para exibir. Veja <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para detalhes."
|
||||
"no_children_help": "Esta coleção não possui nenhum nota filha, então não há nada para exibir. Veja <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para detalhes.",
|
||||
"drag_locked_title": "Bloqueado para edição",
|
||||
"drag_locked_message": "Arrastar não é permitido pois a coleção está bloqueada para edição."
|
||||
},
|
||||
"render": {
|
||||
"note_detail_render_help_1": "Esta nota de ajuda é mostrada porque esta nota do tipo Renderizar HTML não possui a relação necessária para funcionar corretamente.",
|
||||
@@ -1978,7 +2008,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID é uma forma padronizada de permitir que você faça login em sites usando uma conta de outro serviço, como o Google, para verificar sua identidade. O emissor padrão é o Google, mas você pode alterá-lo para qualquer outro provedor OpenID. Consulte <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">aqui</a> para mais informações. Siga estas <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">instruções</a> para configurar um serviço OpenID através do Google.",
|
||||
"oauth_description_warning": "Para habilitar o OAuth/OpenID, você precisa definir a URL base do OAuth/OpenID, o client ID e o client secret no arquivo config.ini e reiniciar a aplicação. Se quiser configurar via variáveis de ambiente, defina TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID e TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Configurações ausentes: {{variables}}",
|
||||
"oauth_missing_vars": "Configurações ausentes: {{-variables}}",
|
||||
"oauth_user_account": "Conta do Usuário: ",
|
||||
"oauth_user_email": "E-mail do Usuário: ",
|
||||
"oauth_user_not_logged_in": "Não está logado!"
|
||||
@@ -2026,5 +2056,12 @@
|
||||
"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": {
|
||||
"page_title": "Página de {{startIndex}} - {{endIndex}}",
|
||||
"total_notes": "{{count}} notas"
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "Não foi possível exibir o conteúdo devido a um erro."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1931,7 +1931,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID este o cale standardizată ce permite autentificarea într-un site folosind un cont dintr-un alt serviciu, precum Google, pentru a verifica identitatea. În mod implicit furnizorul este Google, dar se poate schimba cu orice furnizor OpenID. Pentru mai multe informații, consultați <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">ghidul</a>. Urmați <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">aceste instrucțiuni</a> pentru a putea configura OpenID prin Google.",
|
||||
"oauth_description_warning": "Pentru a activa OAuth sau OpenID, trebuie să configurați URL-ul de bază, ID-ul de client și secretul de client în fișierul config.ini și să reporniți aplicația. Dacă doriți să utilizați variabile de environment, puteți seta TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID și TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Setări lipsă: {{variables}}",
|
||||
"oauth_missing_vars": "Setări lipsă: {{-variables}}",
|
||||
"oauth_user_account": "Cont: ",
|
||||
"oauth_user_email": "Email: ",
|
||||
"oauth_user_not_logged_in": "Neautentificat!"
|
||||
|
||||
@@ -301,7 +301,7 @@
|
||||
"chooseImportFile": "Выберите файл импорта",
|
||||
"safeImport": "Безопасный импорт",
|
||||
"shrinkImages": "Уменьшить изображения",
|
||||
"textImportedAsText": "Импортировать HTML, Markdown и TXT как текстовые заметки, если из метаданные не позволяют определить тип заметки",
|
||||
"textImportedAsText": "Импортировать HTML, Markdown и TXT как текстовые заметки, если их метаданные не позволяют определить тип заметки",
|
||||
"replaceUnderscoresWithSpaces": "Заменить подчеркивания пробелами в названиях импортированных заметок",
|
||||
"import": "Импорт",
|
||||
"failed": "Сбой при импорте: {{message}}.",
|
||||
@@ -665,10 +665,10 @@
|
||||
"electron_integration": {
|
||||
"zoom-factor": "Коэффициент масштабирования",
|
||||
"restart-app-button": "Применить изменения и перезапустить приложение",
|
||||
"background-effects-description": "Эффект Mica добавляет размытый, стильный фон окнам приложений, создавая глубину и современный вид.",
|
||||
"background-effects-description": "Эффект Mica добавляет размытый, стильный фон окнам приложений, создавая глубину и современный вид. Опция \"Системная строка заголовка\" должна быть отключена.",
|
||||
"background-effects": "Включить фоновые эффекты (только Windows 11)",
|
||||
"native-title-bar-description": "В Windows и macOS отключение нативной строки заголовка делает приложение более компактным. В Linux включение нативной строки заголовка улучшает интеграцию с остальной частью системы.",
|
||||
"native-title-bar": "Нативная панель заголовка",
|
||||
"native-title-bar-description": "В Windows и macOS отключение системной строки заголовка делает приложение более компактным. В Linux включение системной строки заголовка улучшает интеграцию с остальной частью системы.",
|
||||
"native-title-bar": "Системная панель заголовка",
|
||||
"desktop-application": "Десктопное приложение"
|
||||
},
|
||||
"link_context_menu": {
|
||||
@@ -824,7 +824,7 @@
|
||||
"expand-subtree": "Развернуть поддерево",
|
||||
"collapse-subtree": "Свернуть поддерево",
|
||||
"sort-by": "Сортировать по...",
|
||||
"insert-note-after": "Вставить замтку после",
|
||||
"insert-note-after": "Вставить заметку после",
|
||||
"insert-child-note": "Вставить дочернюю заметку",
|
||||
"search-in-subtree": "Поиск в поддереве",
|
||||
"edit-branch-prefix": "Изменить префикс ветки",
|
||||
@@ -1207,7 +1207,7 @@
|
||||
"native_title_bar": {
|
||||
"enabled": "включено",
|
||||
"disabled": "выключено",
|
||||
"title": "Нативная панель заголовка (требует перезапуска приложения)"
|
||||
"title": "Системная панель заголовка (требует перезапуска приложения)"
|
||||
},
|
||||
"ai_llm": {
|
||||
"progress": "Прогресс",
|
||||
@@ -1475,7 +1475,7 @@
|
||||
"totp_secret_generated": "Создан секрет TOTP",
|
||||
"recovery_keys_generate": "Генерация кодов восстановления",
|
||||
"recovery_keys_regenerate": "Регенерация кодов восстановления",
|
||||
"oauth_missing_vars": "Отсутствуют настройки: {{variables}}",
|
||||
"oauth_missing_vars": "Отсутствуют настройки: {{-variables}}",
|
||||
"oauth_user_not_logged_in": "Не выполнен вход!",
|
||||
"totp_title": "Одноразовый пароль с ограничением по времени (TOTP)",
|
||||
"recovery_keys_title": "Ключи восстановления единого входа",
|
||||
|
||||
@@ -1843,7 +1843,7 @@
|
||||
"oauth_title": "OAuth / OpenID 驗證",
|
||||
"oauth_description": "OpenID 是一種標準化的方式,可讓您使用其他服務(如 Google)的帳號登入網站,以驗證您的身份。預設的提供者是 Google,但您可以將其變更為任何其他 OpenID 提供者。查看<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">此處</a>以瞭解更多資訊。依照這些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指示</a>以透過 Google 設定 OpenID 服務。",
|
||||
"oauth_description_warning": "要啟用 OAuth / OpenID,您需要設定 config.ini 文件中的 OAuth / OpenID 基礎 URL、客戶端 ID 和客戶端金鑰,並重新啟動應用程式。如果要從環境變數設置,請設定 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 環境變數。",
|
||||
"oauth_missing_vars": "缺少以下設定:{{variables}}",
|
||||
"oauth_missing_vars": "缺少以下設定:{{-variables}}",
|
||||
"oauth_user_account": "用戶帳號: ",
|
||||
"oauth_user_email": "用戶信箱: ",
|
||||
"oauth_user_not_logged_in": "尚未登入!"
|
||||
|
||||
@@ -560,7 +560,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID – це стандартизований спосіб входу на веб-сайти за допомогою облікового запису з іншого сервісу, такого як Google, для підтвердження вашої особи. Емітентом за замовчуванням є Google, але ви можете змінити його на будь-якого іншого постачальника OpenID. Перегляньте <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">тут</a> для отримання додаткової інформації. Дотримуйтесь цих <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">інструкцій</a>, щоб налаштувати сервіс OpenID через Google.",
|
||||
"oauth_description_warning": "Щоб увімкнути OAuth/OpenID, потрібно встановити базову URL-адресу OAuth/OpenID, ідентифікатор клієнта та секрет клієнта у файлі config.ini та перезапустити програму. Якщо ви хочете встановити зі змінних середовища, встановіть TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID та TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Відсутні налаштування: {{variables}}",
|
||||
"oauth_missing_vars": "Відсутні налаштування: {{-variables}}",
|
||||
"oauth_user_account": "Обліковий запис користувача: ",
|
||||
"oauth_user_email": "Електронна пошта користувача: ",
|
||||
"oauth_user_not_logged_in": "Ви не ввійшли в систему!"
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
.floating-buttons-children,
|
||||
.show-floating-buttons {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
top: var(--floating-buttons-vert-offset, 10px);
|
||||
right: var(--floating-buttons-horiz-offset, 10px);
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
z-index: 100;
|
||||
@@ -28,8 +28,8 @@
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.type-canvas .floating-buttons-children {
|
||||
top: 70px;
|
||||
.type-canvas {
|
||||
--floating-buttons-vert-offset: 70px;
|
||||
}
|
||||
|
||||
.type-canvas .floating-buttons-children > * {
|
||||
|
||||
@@ -8,31 +8,50 @@
|
||||
min-width: 20em;
|
||||
}
|
||||
|
||||
.global-menu-button {
|
||||
button.global-menu-button {
|
||||
position: relative;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
position: relative;
|
||||
border: none;
|
||||
padding: 6px;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.global-menu-button svg > g {
|
||||
transform-origin: center;
|
||||
transition: transform 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.global-menu-button:active svg > g,
|
||||
.global-menu-button.show svg > g{
|
||||
transform: scale(0.85) rotate(-10deg);
|
||||
}
|
||||
|
||||
.global-menu-button svg path {
|
||||
fill: var(--launcher-pane-text-color);
|
||||
}
|
||||
|
||||
.global-menu-button:hover { border: 0; }
|
||||
.global-menu-button:hover svg path {
|
||||
transition: 200ms ease-in-out fill;
|
||||
.global-menu-button:hover {
|
||||
border: none;
|
||||
}
|
||||
.global-menu-button:hover svg path.st0 { fill:#95C980; }
|
||||
.global-menu-button:hover svg path.st1 { fill:#72B755; }
|
||||
.global-menu-button:hover svg path.st2 { fill:#4FA52B; }
|
||||
.global-menu-button:hover svg path.st3 { fill:#EE8C89; }
|
||||
.global-menu-button:hover svg path.st4 { fill:#E96562; }
|
||||
.global-menu-button:hover svg path.st5 { fill:#E33F3B; }
|
||||
.global-menu-button:hover svg path.st6 { fill:#EFB075; }
|
||||
.global-menu-button:hover svg path.st7 { fill:#E99547; }
|
||||
.global-menu-button:hover svg path.st8 { fill:#E47B19; }
|
||||
|
||||
.global-menu-button:hover svg path,
|
||||
.global-menu-button.show svg path {
|
||||
transition: 300ms linear fill;
|
||||
}
|
||||
|
||||
.global-menu-button svg path {
|
||||
transition: fill 1000ms ease-out;
|
||||
}
|
||||
|
||||
.global-menu-button:is(:hover, .show) svg path.st0 { fill:#95C980; transition-delay: 0ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st1 { fill:#72B755; transition-delay: 50ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st2 { fill:#4FA52B; transition-delay: 100ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st3 { fill:#EE8C89; transition-delay: 200ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st4 { fill:#E96562; transition-delay: 250ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st5 { fill:#E33F3B; transition-delay: 300ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st6 { fill:#EFB075; transition-delay: 400ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st7 { fill:#E99547; transition-delay: 450ms; }
|
||||
.global-menu-button:is(:hover, .show) svg path.st8 { fill:#E47B19; transition-delay: 500ms; }
|
||||
|
||||
.global-menu-button-update-available {
|
||||
position: absolute;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import Dropdown from "../react/Dropdown";
|
||||
import "./global_menu.css";
|
||||
import { useStaticTooltip, useStaticTooltipWithKeyboardShortcut, useTriliumOption, useTriliumOptionBool } from "../react/hooks";
|
||||
import { useStaticTooltip, useStaticTooltipWithKeyboardShortcut, useTriliumOption, useTriliumOptionBool, useTriliumOptionInt } from "../react/hooks";
|
||||
import { useContext, useEffect, useRef, useState } from "preact/hooks";
|
||||
import { t } from "../../services/i18n";
|
||||
import { FormDropdownDivider, FormDropdownSubmenu, FormListItem } from "../react/FormList";
|
||||
@@ -142,31 +142,25 @@ function VerticalLayoutIcon() {
|
||||
}
|
||||
|
||||
function ZoomControls({ parentComponent }: { parentComponent?: Component | null }) {
|
||||
const [ zoomLevel, setZoomLevel ] = useState(100);
|
||||
const [ zoomLevel ] = useTriliumOption("zoomFactor");
|
||||
|
||||
function updateZoomState() {
|
||||
if (!isElectron()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const zoomFactor = dynamicRequire("electron").webFrame.getZoomFactor();
|
||||
setZoomLevel(Math.round(zoomFactor * 100));
|
||||
}
|
||||
|
||||
useEffect(updateZoomState, []);
|
||||
|
||||
function ZoomControlButton({ command, title, icon, children }: { command: KeyboardActionNames, title: string, icon?: string, children?: ComponentChildren }) {
|
||||
function ZoomControlButton({ command, title, icon, children, dismiss }: { command: KeyboardActionNames, title: string, icon?: string, children?: ComponentChildren, dismiss?: boolean }) {
|
||||
const linkRef = useRef<HTMLAnchorElement>(null);
|
||||
useStaticTooltipWithKeyboardShortcut(linkRef, title, command);
|
||||
useStaticTooltipWithKeyboardShortcut(linkRef, title, command, {
|
||||
placement: "bottom",
|
||||
fallbackPlacements: [ "bottom" ]
|
||||
});
|
||||
return (
|
||||
<a
|
||||
ref={linkRef}
|
||||
tabIndex={0}
|
||||
onClick={(e) => {
|
||||
parentComponent?.triggerCommand(command);
|
||||
setTimeout(() => updateZoomState(), 300)
|
||||
e.stopPropagation();
|
||||
if (!dismiss) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
}}
|
||||
className={icon}
|
||||
className={`dropdown-item-button ${icon}`}
|
||||
>{children}</a>
|
||||
)
|
||||
}
|
||||
@@ -174,15 +168,17 @@ function ZoomControls({ parentComponent }: { parentComponent?: Component | null
|
||||
return isElectron() ? (
|
||||
<FormListItem
|
||||
icon="bx bx-empty"
|
||||
container
|
||||
className="zoom-container"
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
{t("global_menu.zoom")}
|
||||
<>
|
||||
<div className="zoom-buttons">
|
||||
<ZoomControlButton command="toggleFullscreen" title={t("global_menu.toggle_fullscreen")} icon="bx bx-expand-alt" />
|
||||
<ZoomControlButton command="toggleFullscreen" title={t("global_menu.toggle_fullscreen")} icon="bx bx-expand-alt" dismiss />
|
||||
|
||||
<ZoomControlButton command="zoomOut" title={t("global_menu.zoom_out")} icon="bx bx-minus" />
|
||||
<ZoomControlButton command="zoomReset" title={t("global_menu.reset_zoom_level")}>{zoomLevel}{t("units.percentage")}</ZoomControlButton>
|
||||
<ZoomControlButton command="zoomReset" title={t("global_menu.reset_zoom_level")}>{(parseFloat(zoomLevel) * 100).toFixed(0)}{t("units.percentage")}</ZoomControlButton>
|
||||
<ZoomControlButton command="zoomIn" title={t("global_menu.zoom_in")} icon="bx bx-plus" />
|
||||
</div>
|
||||
</>
|
||||
|
||||
@@ -14,23 +14,33 @@ import { WebSocketMessage } from "@triliumnext/commons";
|
||||
import froca from "../../services/froca";
|
||||
|
||||
interface NoteListProps<T extends object> {
|
||||
note?: FNote | null;
|
||||
note: FNote | null | undefined;
|
||||
notePath: string | null | undefined;
|
||||
highlightedTokens?: string[] | null;
|
||||
/** if set to `true` then only collection-type views are displayed such as geo-map and the calendar. The original book types grid and list will be ignored. */
|
||||
displayOnlyCollections?: boolean;
|
||||
highlightedTokens?: string[] | null;
|
||||
viewStorage?: ViewModeStorage<T>;
|
||||
isEnabled: boolean;
|
||||
ntxId: string | null | undefined;
|
||||
}
|
||||
|
||||
export default function NoteList<T extends object>({ note: providedNote, highlightedTokens, displayOnlyCollections }: NoteListProps<T>) {
|
||||
export default function NoteList<T extends object>(props: Pick<NoteListProps<T>, "displayOnlyCollections">) {
|
||||
const { note, noteContext, notePath, ntxId } = useNoteContext();
|
||||
const isEnabled = noteContext?.hasNoteList();
|
||||
return <CustomNoteList note={note} isEnabled={!!isEnabled} notePath={notePath} ntxId={ntxId} {...props} />
|
||||
}
|
||||
|
||||
export function SearchNoteList<T extends object>(props: Omit<NoteListProps<T>, "isEnabled">) {
|
||||
return <CustomNoteList {...props} isEnabled={true} />
|
||||
}
|
||||
|
||||
function CustomNoteList<T extends object>({ note, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId }: NoteListProps<T>) {
|
||||
const widgetRef = useRef<HTMLDivElement>(null);
|
||||
const { note: contextNote, noteContext, notePath } = useNoteContext();
|
||||
const note = providedNote ?? contextNote;
|
||||
const viewType = useNoteViewType(note);
|
||||
const noteIds = useNoteIds(note, viewType);
|
||||
const noteIds = useNoteIds(note, viewType, ntxId);
|
||||
const isFullHeight = (viewType && viewType !== "list" && viewType !== "grid");
|
||||
const [ isIntersecting, setIsIntersecting ] = useState(false);
|
||||
const shouldRender = (isFullHeight || isIntersecting || note?.type === "book");
|
||||
const isEnabled = (note && noteContext?.hasNoteList() && !!viewType && shouldRender);
|
||||
const isEnabled = (note && shouldEnable && !!viewType && shouldRender);
|
||||
|
||||
useEffect(() => {
|
||||
if (isFullHeight || displayOnlyCollections || note?.type === "book") {
|
||||
@@ -110,7 +120,7 @@ function useNoteViewType(note?: FNote | null): ViewTypeOptions | undefined {
|
||||
}
|
||||
}
|
||||
|
||||
function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined) {
|
||||
function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined, ntxId: string | null | undefined) {
|
||||
const [ noteIds, setNoteIds ] = useState<string[]>([]);
|
||||
const [ includeArchived ] = useNoteLabelBoolean(note, "includeArchived");
|
||||
|
||||
@@ -144,6 +154,12 @@ function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions |
|
||||
}
|
||||
})
|
||||
|
||||
// Refresh on search.
|
||||
useTriliumEvent("searchRefreshed", ({ ntxId: eventNtxId }) => {
|
||||
if (eventNtxId !== ntxId) return;
|
||||
refreshNoteIds();
|
||||
});
|
||||
|
||||
// Refresh on import.
|
||||
useEffect(() => {
|
||||
async function onImport(message: WebSocketMessage) {
|
||||
|
||||
@@ -41,7 +41,7 @@ export function openNoteContextMenu(api: Api, event: ContextMenuEvent, note: FNo
|
||||
y: event.pageY,
|
||||
items: [
|
||||
...link_context_menu.getItems(),
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("board_view.move-to"),
|
||||
uiIcon: "bx bx-transfer",
|
||||
@@ -52,7 +52,7 @@ export function openNoteContextMenu(api: Api, event: ContextMenuEvent, note: FNo
|
||||
})),
|
||||
},
|
||||
getArchiveMenuItem(note),
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("board_view.insert-above"),
|
||||
uiIcon: "bx bx-list-plus",
|
||||
@@ -63,7 +63,7 @@ export function openNoteContextMenu(api: Api, event: ContextMenuEvent, note: FNo
|
||||
uiIcon: "bx bx-empty",
|
||||
handler: () => api.insertRowAtPosition(column, branchId, "after")
|
||||
},
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("board_view.remove-from-board"),
|
||||
uiIcon: "bx bx-task-x",
|
||||
|
||||
@@ -228,7 +228,7 @@ export function TitleEditor({ currentValue, placeholder, save, dismiss, multilin
|
||||
}) {
|
||||
const inputRef = useRef<any>(null);
|
||||
const dismissOnNextRefreshRef = useRef(false);
|
||||
const shouldSave = useRef(false);
|
||||
const shouldDismiss = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
inputRef.current?.focus();
|
||||
@@ -254,12 +254,12 @@ export function TitleEditor({ currentValue, placeholder, save, dismiss, multilin
|
||||
onKeyDown={(e: TargetedKeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
||||
if (e.key === "Enter" || e.key === "Escape") {
|
||||
e.preventDefault();
|
||||
shouldSave.current = (e.key === "Enter");
|
||||
shouldDismiss.current = (e.key === "Escape");
|
||||
e.currentTarget.blur();
|
||||
}
|
||||
}}
|
||||
onBlur={(newValue) => {
|
||||
if (shouldSave.current && newValue.trim() && (newValue !== currentValue || isNewItem)) {
|
||||
if (!shouldDismiss.current && newValue.trim() && (newValue !== currentValue || isNewItem)) {
|
||||
save(newValue);
|
||||
dismissOnNextRefreshRef.current = true;
|
||||
} else {
|
||||
|
||||
@@ -10,14 +10,14 @@ import link from "../../../services/link.js";
|
||||
export default function openContextMenu(noteId: string, e: LeafletMouseEvent, isEditable: boolean) {
|
||||
let items: MenuItem<keyof CommandMappings>[] = [
|
||||
...buildGeoLocationItem(e),
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
...linkContextMenu.getItems(),
|
||||
];
|
||||
|
||||
if (isEditable) {
|
||||
items = [
|
||||
...items,
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{ title: t("geo-map-context.remove-from-map"), command: "deleteFromMap", uiIcon: "bx bx-trash" }
|
||||
];
|
||||
}
|
||||
@@ -46,7 +46,7 @@ export function openMapContextMenu(noteId: string, e: LeafletMouseEvent, isEdita
|
||||
if (isEditable) {
|
||||
items = [
|
||||
...items,
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("geo-map-context.add-note"),
|
||||
handler: () => createNewNote(noteId, e),
|
||||
|
||||
@@ -74,7 +74,7 @@ function showColumnContextMenu(parentComponent: Component, e: MouseEvent, column
|
||||
handler: () => tabulator.clearSort()
|
||||
},
|
||||
{
|
||||
title: "----"
|
||||
kind: "separator"
|
||||
},
|
||||
{
|
||||
title: t("table_view.hide-column", { title }),
|
||||
@@ -86,7 +86,7 @@ function showColumnContextMenu(parentComponent: Component, e: MouseEvent, column
|
||||
uiIcon: "bx bx-columns",
|
||||
items: buildColumnItems(tabulator)
|
||||
},
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("table_view.add-column-to-the-left"),
|
||||
uiIcon: "bx bx-horizontal-left",
|
||||
@@ -105,7 +105,7 @@ function showColumnContextMenu(parentComponent: Component, e: MouseEvent, column
|
||||
direction: "after"
|
||||
})
|
||||
},
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("table_view.edit-column"),
|
||||
uiIcon: "bx bxs-edit-alt",
|
||||
@@ -143,7 +143,7 @@ function showHeaderContextMenu(parentComponent: Component, e: MouseEvent, tabula
|
||||
uiIcon: "bx bx-columns",
|
||||
items: buildColumnItems(tabulator)
|
||||
},
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("table_view.new-column"),
|
||||
uiIcon: "bx bx-empty",
|
||||
@@ -174,7 +174,7 @@ export function showRowContextMenu(parentComponent: Component, e: MouseEvent, ro
|
||||
contextMenu.show({
|
||||
items: [
|
||||
...link_context_menu.getItems(),
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("table_view.row-insert-above"),
|
||||
uiIcon: "bx bx-horizontal-left bx-rotate-90",
|
||||
@@ -214,7 +214,7 @@ export function showRowContextMenu(parentComponent: Component, e: MouseEvent, ro
|
||||
}
|
||||
})
|
||||
},
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{
|
||||
title: t("table_context_menu.delete_row"),
|
||||
uiIcon: "bx bx-trash",
|
||||
|
||||
@@ -17,8 +17,15 @@
|
||||
}
|
||||
|
||||
.bulk-actions-dialog .bulk-existing-action-list .button-column {
|
||||
/* minimal width so that table remains static sized and most space remains for middle column with settings */
|
||||
width: 50px;
|
||||
white-space: nowrap;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.bulk-actions-dialog .bulk-existing-action-list .button-column > * {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.bulk-actions-dialog .bulk-existing-action-list .button-column .help-dropdown {
|
||||
display: inline-block !important;
|
||||
}
|
||||
@@ -28,8 +28,8 @@ const SEPARATOR_TITLE_REPLACEMENTS = [
|
||||
export default function NoteTypeChooserDialogComponent() {
|
||||
const [ callback, setCallback ] = useState<ChooseNoteTypeCallback>();
|
||||
const [ shown, setShown ] = useState(false);
|
||||
const [ parentNote, setParentNote ] = useState<Suggestion | null>();
|
||||
const [ noteTypes, setNoteTypes ] = useState<MenuItem<TreeCommandNames>[]>([]);
|
||||
const [ parentNote, setParentNote ] = useState<Suggestion | null>();
|
||||
const [ noteTypes, setNoteTypes ] = useState<MenuItem<TreeCommandNames>[]>([]);
|
||||
|
||||
useTriliumEvent("chooseNoteType", ({ callback }) => {
|
||||
setCallback(() => callback);
|
||||
@@ -41,11 +41,11 @@ export default function NoteTypeChooserDialogComponent() {
|
||||
let index = -1;
|
||||
|
||||
setNoteTypes((noteTypes ?? []).map((item) => {
|
||||
if (item.title === "----") {
|
||||
if ("kind" in item && item.kind === "separator") {
|
||||
index++;
|
||||
return {
|
||||
title: SEPARATOR_TITLE_REPLACEMENTS[index],
|
||||
enabled: false
|
||||
kind: "header",
|
||||
title: SEPARATOR_TITLE_REPLACEMENTS[index]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ export default function NoteTypeChooserDialogComponent() {
|
||||
|
||||
function onNoteTypeSelected(value: string) {
|
||||
const [ noteType, templateNoteId ] = value.split(",");
|
||||
|
||||
|
||||
callback?.({
|
||||
success: true,
|
||||
noteType,
|
||||
@@ -95,21 +95,21 @@ export default function NoteTypeChooserDialogComponent() {
|
||||
<FormGroup name="note-type" label={t("note_type_chooser.modal_body")}>
|
||||
<FormList onSelect={onNoteTypeSelected}>
|
||||
{noteTypes.map((_item) => {
|
||||
if (_item.title === "----") {
|
||||
return;
|
||||
if ("kind" in _item && _item.kind === "separator") {
|
||||
return;
|
||||
}
|
||||
|
||||
const item = _item as MenuCommandItem<TreeCommandNames>;
|
||||
|
||||
if (item.enabled === false) {
|
||||
if ("kind" in item && item.kind === "header") {
|
||||
return <FormListHeader text={item.title} />
|
||||
} else {
|
||||
return <FormListItem
|
||||
value={[ item.type, item.templateNoteId ].join(",") }
|
||||
icon={item.uiIcon}>
|
||||
{item.title}
|
||||
{item.badges && item.badges.map((badge) => <Badge {...badge} />)}
|
||||
</FormListItem>;
|
||||
{item.title}
|
||||
{item.badges && item.badges.map((badge) => <Badge {...badge} />)}
|
||||
</FormListItem>;
|
||||
}
|
||||
})}
|
||||
</FormList>
|
||||
|
||||
@@ -34,10 +34,10 @@ export async function validateProviders(validationWarning: HTMLElement): Promise
|
||||
precedenceList = [precedenceStr];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Check for configuration issues with providers in the precedence list
|
||||
const configIssues: string[] = [];
|
||||
|
||||
|
||||
// Always add experimental warning as the first item
|
||||
configIssues.push(t("ai_llm.experimental_warning"));
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ export default function MobileDetailMenu() {
|
||||
items: [
|
||||
{ title: t("mobile_detail_menu.insert_child_note"), command: "insertChildNote", uiIcon: "bx bx-plus", enabled: note?.type !== "search" },
|
||||
{ title: t("mobile_detail_menu.delete_this_note"), command: "delete", uiIcon: "bx bx-trash", enabled: note?.noteId !== "root" },
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{ title: "Note revisions", command: "showRevisions", uiIcon: "bx bx-history" }
|
||||
],
|
||||
selectMenuItemHandler: async ({ command }) => {
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
.note-icon-widget {
|
||||
padding-top: 3px;
|
||||
padding-left: 7px;
|
||||
margin-right: 0;
|
||||
width: 50px;
|
||||
|
||||
@@ -34,7 +34,7 @@ export default function NoteTitleWidget() {
|
||||
if (isReadOnly) {
|
||||
noteContext?.getNavigationTitle().then(setNavigationTitle);
|
||||
}
|
||||
}, [noteContext, isReadOnly]);
|
||||
}, [note, isReadOnly]);
|
||||
|
||||
// Save changes to title.
|
||||
const spacedUpdate = useSpacedUpdate(async () => {
|
||||
|
||||
@@ -86,6 +86,7 @@ interface FormListItemOpts {
|
||||
disabledTooltip?: string;
|
||||
checked?: boolean | null;
|
||||
selected?: boolean;
|
||||
container?: boolean;
|
||||
onClick?: (e: MouseEvent) => void;
|
||||
triggerCommand?: CommandNames;
|
||||
description?: string;
|
||||
@@ -98,7 +99,7 @@ const TOOLTIP_CONFIG: Partial<Tooltip.Options> = {
|
||||
fallbackPlacements: [ "right" ]
|
||||
}
|
||||
|
||||
export function FormListItem({ className, icon, value, title, active, disabled, checked, onClick, selected, rtl, triggerCommand, description, ...contentProps }: FormListItemOpts) {
|
||||
export function FormListItem({ className, icon, value, title, active, disabled, checked, container, onClick, selected, rtl, triggerCommand, description, ...contentProps }: FormListItemOpts) {
|
||||
const itemRef = useRef<HTMLLIElement>(null);
|
||||
|
||||
if (checked) {
|
||||
@@ -110,9 +111,9 @@ export function FormListItem({ className, icon, value, title, active, disabled,
|
||||
return (
|
||||
<li
|
||||
ref={itemRef}
|
||||
class={`dropdown-item ${active ? "active" : ""} ${disabled ? "disabled" : ""} ${selected ? "selected" : ""} ${className ?? ""}`}
|
||||
class={`dropdown-item ${active ? "active" : ""} ${disabled ? "disabled" : ""} ${selected ? "selected" : ""} ${container ? "dropdown-container-item": ""} ${className ?? ""}`}
|
||||
data-value={value} title={title}
|
||||
tabIndex={0}
|
||||
tabIndex={container ? -1 : 0}
|
||||
onClick={onClick}
|
||||
data-trigger-command={triggerCommand}
|
||||
dir={rtl ? "rtl" : undefined}
|
||||
|
||||
@@ -35,7 +35,7 @@ export default function NoteLink({ className, notePath, showNotePath, showNoteIc
|
||||
if (!ref.current || !jqueryEl) return;
|
||||
ref.current.replaceChildren(jqueryEl[0]);
|
||||
highlightSearch(ref.current);
|
||||
}, [ jqueryEl ]);
|
||||
}, [ jqueryEl, highlightedTokens ]);
|
||||
|
||||
if (style) {
|
||||
jqueryEl?.css(style);
|
||||
|
||||
@@ -332,7 +332,9 @@ export function useNoteRelation(note: FNote | undefined | null, relationName: Re
|
||||
*
|
||||
* @param note the note whose label to read/write.
|
||||
* @param labelName the name of the label to read/write.
|
||||
* @returns an array where the first element is the getter and the second element is the setter. The setter has a special behaviour for convenience: if the value is undefined, the label is created without a value (e.g. a tag), if the value is null then the label is removed.
|
||||
* @returns an array where the first element is the getter and the second element is the setter. The setter has a special behaviour for convenience:
|
||||
* - if the value is undefined, the label is created without a value (e.g. a tag)
|
||||
* - if the value is null then the label is removed.
|
||||
*/
|
||||
export function useNoteLabel(note: FNote | undefined | null, labelName: FilterLabelsByType<string>): [string | null | undefined, (newValue: string | null | undefined) => void] {
|
||||
const [ , setLabelValue ] = useState<string | null | undefined>();
|
||||
@@ -352,9 +354,9 @@ export function useNoteLabel(note: FNote | undefined | null, labelName: FilterLa
|
||||
|
||||
const setter = useCallback((value: string | null | undefined) => {
|
||||
if (note) {
|
||||
if (value || value === undefined) {
|
||||
if (value !== null) {
|
||||
attributes.setLabel(note.noteId, labelName, value)
|
||||
} else if (value === null) {
|
||||
} else {
|
||||
attributes.removeOwnedLabelByName(note, labelName);
|
||||
}
|
||||
}
|
||||
@@ -592,10 +594,11 @@ export function useStaticTooltip(elRef: RefObject<Element>, config?: Partial<Too
|
||||
}, [ elRef, config ]);
|
||||
}
|
||||
|
||||
export function useStaticTooltipWithKeyboardShortcut(elRef: RefObject<Element>, title: string, actionName: KeyboardActionNames | undefined) {
|
||||
export function useStaticTooltipWithKeyboardShortcut(elRef: RefObject<Element>, title: string, actionName: KeyboardActionNames | undefined, opts?: Omit<Partial<Tooltip.Options>, "title">) {
|
||||
const [ keyboardShortcut, setKeyboardShortcut ] = useState<string[]>();
|
||||
useStaticTooltip(elRef, {
|
||||
title: keyboardShortcut?.length ? `${title} (${keyboardShortcut?.join(",")})` : title
|
||||
title: keyboardShortcut?.length ? `${title} (${keyboardShortcut?.join(",")})` : title,
|
||||
...opts
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
@@ -341,7 +341,7 @@ function NoteLanguageSwitch({ note }: { note?: FNote | null }) {
|
||||
return <FormListItem
|
||||
rtl={locale.rtl}
|
||||
checked={checked}
|
||||
onClick={() => setCurrentNoteLanguage(locale.id)}
|
||||
onClick={() => setCurrentNoteLanguage(locale.id || null)}
|
||||
>{locale.name}</FormListItem>
|
||||
} else {
|
||||
return <FormDropdownDivider />
|
||||
|
||||
@@ -96,7 +96,7 @@ const TAB_CONFIGURATION = numberObjectsInPlace<TabConfiguration>([
|
||||
content: FilePropertiesTab,
|
||||
show: ({ note }) => note?.type === "file",
|
||||
toggleCommand: "toggleRibbonTabFileProperties",
|
||||
activate: true
|
||||
activate: ({ note }) => note?.mime !== "application/pdf"
|
||||
},
|
||||
{
|
||||
title: t("image_properties.title"),
|
||||
|
||||
@@ -33,7 +33,7 @@ export default function SearchDefinitionTab({ note, ntxId }: TabContext) {
|
||||
const activeOptions: SearchOption[] = [];
|
||||
|
||||
for (const searchOption of SEARCH_OPTIONS) {
|
||||
const attr = note.getAttribute(searchOption.attributeType, searchOption.attributeName);
|
||||
const attr = note.getAttribute(searchOption.attributeType, searchOption.attributeName);
|
||||
if (attr) {
|
||||
activeOptions.push(searchOption);
|
||||
} else {
|
||||
@@ -75,24 +75,26 @@ export default function SearchDefinitionTab({ note, ntxId }: TabContext) {
|
||||
return (
|
||||
<div className="search-definition-widget">
|
||||
<div className="search-settings">
|
||||
{note &&
|
||||
{note &&
|
||||
<table className="search-setting-table">
|
||||
<tr>
|
||||
<td className="title-column">{t("search_definition.add_search_option")}</td>
|
||||
<td colSpan={2} className="add-search-option">
|
||||
{searchOptions?.availableOptions.map(({ icon, label, tooltip, attributeName, attributeType, defaultValue }) => (
|
||||
<Button
|
||||
size="small"
|
||||
icon={icon}
|
||||
text={label}
|
||||
title={tooltip}
|
||||
onClick={() => attributes.setAttribute(note, attributeType, attributeName, defaultValue ?? "")}
|
||||
/>
|
||||
))}
|
||||
<tbody>
|
||||
<tr>
|
||||
<td className="title-column">{t("search_definition.add_search_option")}</td>
|
||||
<td colSpan={2} className="add-search-option">
|
||||
{searchOptions?.availableOptions.map(({ icon, label, tooltip, attributeName, attributeType, defaultValue }) => (
|
||||
<Button
|
||||
size="small"
|
||||
icon={icon}
|
||||
text={label}
|
||||
title={tooltip}
|
||||
onClick={() => attributes.setAttribute(note, attributeType, attributeName, defaultValue ?? "")}
|
||||
/>
|
||||
))}
|
||||
|
||||
<AddBulkActionButton note={note} />
|
||||
</td>
|
||||
</tr>
|
||||
<AddBulkActionButton note={note} />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tbody className="search-options">
|
||||
{searchOptions?.activeOptions.map(({ attributeType, attributeName, component, additionalAttributesToDelete, defaultValue }) => {
|
||||
const Component = component;
|
||||
@@ -125,7 +127,7 @@ export default function SearchDefinitionTab({ note, ntxId }: TabContext) {
|
||||
onClick={async () => {
|
||||
await server.post(`search-and-execute-note/${note.noteId}`);
|
||||
refreshResults();
|
||||
toast.showMessage(t("search_definition.actions_executed"), 3000);
|
||||
toast.showMessage(t("search_definition.actions_executed"), 3000);
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -196,9 +198,9 @@ function AddBulkActionButton({ note }: { note: FNote }) {
|
||||
|
||||
{actions.map(({ actionName, actionTitle }) => (
|
||||
<FormListItem onClick={() => bulk_action.addAction(note.noteId, actionName)}>{actionTitle}</FormListItem>
|
||||
))}
|
||||
))}
|
||||
</>
|
||||
))}
|
||||
</Dropdown>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ export default function SimilarNotesTab({ note }: TabContext) {
|
||||
notePath={notePath}
|
||||
noTnLink
|
||||
style={{
|
||||
"font-size": 24 * (1 - 1 / (1 + score))
|
||||
"font-size": 20 * (1 - 1 / (1 + score))
|
||||
}}
|
||||
/>
|
||||
))}
|
||||
|
||||
@@ -387,7 +387,7 @@ export default function AttributeEditor({ api, note, componentId, notePath, ntxI
|
||||
items: [
|
||||
{ title: t("attribute_editor.add_new_label"), command: "addNewLabel", uiIcon: "bx bx-hash" },
|
||||
{ title: t("attribute_editor.add_new_relation"), command: "addNewRelation", uiIcon: "bx bx-transfer" },
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
{ title: t("attribute_editor.add_new_label_definition"), command: "addNewLabelDefinition", uiIcon: "bx bx-empty" },
|
||||
{ title: t("attribute_editor.add_new_relation_definition"), command: "addNewRelationDefinition", uiIcon: "bx bx-empty" }
|
||||
],
|
||||
|
||||
@@ -3,7 +3,7 @@ import { t } from "../services/i18n";
|
||||
import Alert from "./react/Alert";
|
||||
import { useNoteContext, useTriliumEvent } from "./react/hooks";
|
||||
import "./search_result.css";
|
||||
import NoteList from "./collections/NoteList";
|
||||
import { SearchNoteList } from "./collections/NoteList";
|
||||
// import NoteListRenderer from "../services/note_list_renderer";
|
||||
|
||||
enum SearchResultState {
|
||||
@@ -13,7 +13,7 @@ enum SearchResultState {
|
||||
}
|
||||
|
||||
export default function SearchResult() {
|
||||
const { note, ntxId } = useNoteContext();
|
||||
const { note, notePath, ntxId } = useNoteContext();
|
||||
const [ state, setState ] = useState<SearchResultState>();
|
||||
const [ highlightedTokens, setHighlightedTokens ] = useState<string[]>();
|
||||
|
||||
@@ -53,7 +53,12 @@ export default function SearchResult() {
|
||||
)}
|
||||
|
||||
{state === SearchResultState.GOT_RESULTS && (
|
||||
<NoteList note={note} highlightedTokens={highlightedTokens} />
|
||||
<SearchNoteList
|
||||
note={note}
|
||||
notePath={notePath}
|
||||
highlightedTokens={highlightedTokens}
|
||||
ntxId={ntxId}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -168,7 +168,6 @@ const TAB_ROW_TPL = `
|
||||
|
||||
.tab-row-widget .note-tab .note-tab-icon {
|
||||
position: relative;
|
||||
top: -1px;
|
||||
padding-right: 3px;
|
||||
}
|
||||
|
||||
@@ -356,11 +355,11 @@ export default class TabRowWidget extends BasicWidget {
|
||||
{ title: t("tab_row.close_right_tabs"), command: "closeRightTabs", uiIcon: "bx bx-empty", enabled: appContext.tabManager.noteContexts?.at(-1)?.ntxId !== ntxId },
|
||||
{ title: t("tab_row.close_all_tabs"), command: "closeAllTabs", uiIcon: "bx bx-empty" },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{ title: t("tab_row.reopen_last_tab"), command: "reopenLastTab", uiIcon: "bx bx-undo", enabled: appContext.tabManager.recentlyClosedTabs.length !== 0 },
|
||||
|
||||
{ title: "----" },
|
||||
{ kind: "separator" },
|
||||
|
||||
{ title: t("tab_row.move_tab_to_new_window"), command: "moveTabToNewWindow", uiIcon: "bx bx-window-open" },
|
||||
{ title: t("tab_row.copy_tab_to_new_window"), command: "copyTabToNewWindow", uiIcon: "bx bx-empty" }
|
||||
|
||||
@@ -14,9 +14,9 @@ import dialog from "../../../services/dialog";
|
||||
import { useTriliumEvent } from "../../react/hooks";
|
||||
|
||||
export default function ShortcutSettings() {
|
||||
const [ keyboardShortcuts, setKeyboardShortcuts ] = useState<KeyboardShortcut[]>([]);
|
||||
const [ keyboardShortcuts, setKeyboardShortcuts ] = useState<KeyboardShortcut[]>([]);
|
||||
const [ filter, setFilter ] = useState<string>();
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
server.get<KeyboardShortcut[]>("keyboard-actions").then(setKeyboardShortcuts);
|
||||
}, [])
|
||||
@@ -82,7 +82,7 @@ export default function ShortcutSettings() {
|
||||
</FormText>
|
||||
|
||||
<FormGroup name="keyboard-shortcut-filter">
|
||||
<FormTextBox
|
||||
<FormTextBox
|
||||
placeholder={t("shortcuts.type_text_to_filter")}
|
||||
currentValue={filter} onChange={(value) => setFilter(value.toLowerCase())}
|
||||
/>
|
||||
@@ -136,7 +136,7 @@ function KeyboardShortcutTable({ filter, keyboardShortcuts }: { filter?: string,
|
||||
}}>
|
||||
{action.separator}
|
||||
</td>
|
||||
) : ( (!filter || filterKeyboardAction(action, filter)) &&
|
||||
) : ( (!filter || filterKeyboardAction(action, filter)) &&
|
||||
<>
|
||||
<td>{action.friendlyName}</td>
|
||||
<td>
|
||||
@@ -181,4 +181,4 @@ function getOptionName(actionName: string) {
|
||||
|
||||
function getActionNameFromOptionName(optionName: string) {
|
||||
return optionName.at(PREFIX.length)?.toLowerCase() + optionName.substring(PREFIX.length + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import Column from "../../react/Column";
|
||||
import { FormSelectGroup, FormSelectWithGroups } from "../../react/FormSelect";
|
||||
import { Themes } from "@triliumnext/highlightjs";
|
||||
import { ensureMimeTypesForHighlighting, loadHighlightingTheme } from "../../../services/syntax_highlight";
|
||||
import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons";
|
||||
import { normalizeMimeTypeForCKEditor, type OptionNames } from "@triliumnext/commons";
|
||||
import { getHtml } from "../../react/RawHtml";
|
||||
import type { CSSProperties } from "preact/compat";
|
||||
import FormText from "../../react/FormText";
|
||||
@@ -69,26 +69,27 @@ function FormattingToolbar() {
|
||||
}
|
||||
|
||||
function EditorFeatures() {
|
||||
const [ textNoteEmojiCompletionEnabled, setTextNoteEmojiCompletionEnabled] = useTriliumOptionBool("textNoteEmojiCompletionEnabled");
|
||||
const [ textNoteCompletionEnabled, setTextNoteCompletionEnabled ] = useTriliumOptionBool("textNoteCompletionEnabled");
|
||||
|
||||
return (
|
||||
<OptionsSection title={t("editorfeatures.title")}>
|
||||
<FormCheckbox
|
||||
name="emoji-completion-enabled"
|
||||
label={t("editorfeatures.emoji_completion_enabled")}
|
||||
currentValue={textNoteEmojiCompletionEnabled} onChange={setTextNoteEmojiCompletionEnabled}
|
||||
/>
|
||||
|
||||
<FormCheckbox
|
||||
name="note-completion-enabled"
|
||||
label={t("editorfeatures.note_completion_enabled")}
|
||||
currentValue={textNoteCompletionEnabled} onChange={setTextNoteCompletionEnabled}
|
||||
/>
|
||||
<EditorFeature name="emoji-completion-enabled" optionName="textNoteEmojiCompletionEnabled" label={t("editorfeatures.emoji_completion_enabled")} description={t("editorfeatures.emoji_completion_description")} />
|
||||
<EditorFeature name="note-completion-enabled" optionName="textNoteCompletionEnabled" label={t("editorfeatures.note_completion_enabled")} description={t("editorfeatures.emoji_completion_description")} />
|
||||
<EditorFeature name="slash-commands-enabled" optionName="textNoteSlashCommandsEnabled" label={t("editorfeatures.slash_commands_enabled")} description={t("editorfeatures.emoji_completion_description")} />
|
||||
</OptionsSection>
|
||||
);
|
||||
}
|
||||
|
||||
function EditorFeature({ optionName, name, label, description }: { optionName: OptionNames, name: string, label: string, description: string }) {
|
||||
const [ featureEnabled, setFeatureEnabled ] = useTriliumOptionBool(optionName);
|
||||
|
||||
return (
|
||||
<FormCheckbox
|
||||
name={name} label={label}
|
||||
currentValue={featureEnabled} onChange={setFeatureEnabled}
|
||||
hint={description}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
function HeadingStyle() {
|
||||
const [ headingStyle, setHeadingStyle ] = useTriliumOption("headingStyle");
|
||||
|
||||
@@ -152,7 +153,7 @@ function CodeBlockStyle() {
|
||||
const [ codeBlockWordWrap, setCodeBlockWordWrap ] = useTriliumOptionBool("codeBlockWordWrap");
|
||||
|
||||
return (
|
||||
<OptionsSection title={t("highlighting.title")}>
|
||||
<OptionsSection title={t("highlighting.title")}>
|
||||
<div className="row" style={{ marginBottom: "15px" }}>
|
||||
<FormGroup name="theme" className="col-md-6" label={t("highlighting.color-scheme")} style={{ marginBottom: 0 }}>
|
||||
<FormSelectWithGroups
|
||||
@@ -173,7 +174,7 @@ function CodeBlockStyle() {
|
||||
/>
|
||||
</Column>
|
||||
</div>
|
||||
|
||||
|
||||
<CodeBlockPreview theme={codeBlockTheme} wordWrap={codeBlockWordWrap} />
|
||||
</OptionsSection>
|
||||
)
|
||||
@@ -299,10 +300,10 @@ function DateTimeFormatOptions() {
|
||||
}}
|
||||
/>
|
||||
</FormText>
|
||||
|
||||
|
||||
<div className="row align-items-center">
|
||||
<FormGroup name="custom-date-time-format" className="col-md-6" label={t("custom_date_time_format.format_string")}>
|
||||
<FormTextBox
|
||||
<FormTextBox
|
||||
placeholder="YYYY-MM-DD HH:mm"
|
||||
currentValue={customDateTimeFormat || "YYYY-MM-DD HH:mm"} onChange={setCustomDateTimeFormat}
|
||||
/>
|
||||
@@ -316,4 +317,4 @@ function DateTimeFormatOptions() {
|
||||
</div>
|
||||
</OptionsSection>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,5 +244,9 @@ function getDisabledPlugins() {
|
||||
disabledPlugins.push("EmojiMention");
|
||||
}
|
||||
|
||||
if (options.get("textNoteSlashCommandsEnabled") !== "true") {
|
||||
disabledPlugins.push("SlashCommand");
|
||||
}
|
||||
|
||||
return disabledPlugins;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user