Merge remote-tracking branch 'origin/main' into renovate/jquery-3.x

This commit is contained in:
Elian Doran
2025-08-25 20:01:59 +03:00
49 changed files with 5101 additions and 851 deletions

View File

@@ -41,7 +41,7 @@
"@types/node": "22.17.2", "@types/node": "22.17.2",
"@types/yargs": "17.0.33", "@types/yargs": "17.0.33",
"@vitest/coverage-v8": "3.2.4", "@vitest/coverage-v8": "3.2.4",
"eslint": "9.33.0", "eslint": "9.34.0",
"eslint-plugin-simple-import-sort": "12.1.1", "eslint-plugin-simple-import-sort": "12.1.1",
"esm": "3.2.25", "esm": "3.2.25",
"jsdoc": "4.0.4", "jsdoc": "4.0.4",

View File

@@ -10,7 +10,7 @@
"url": "https://github.com/TriliumNext/Notes" "url": "https://github.com/TriliumNext/Notes"
}, },
"dependencies": { "dependencies": {
"@eslint/js": "9.33.0", "@eslint/js": "9.34.0",
"@excalidraw/excalidraw": "0.18.0", "@excalidraw/excalidraw": "0.18.0",
"@fullcalendar/core": "6.1.19", "@fullcalendar/core": "6.1.19",
"@fullcalendar/daygrid": "6.1.19", "@fullcalendar/daygrid": "6.1.19",
@@ -36,7 +36,7 @@
"draggabilly": "3.0.0", "draggabilly": "3.0.0",
"force-graph": "1.50.1", "force-graph": "1.50.1",
"globals": "16.3.0", "globals": "16.3.0",
"i18next": "25.4.0", "i18next": "25.4.2",
"i18next-http-backend": "3.0.2", "i18next-http-backend": "3.0.2",
"jquery": "3.7.1", "jquery": "3.7.1",
"jquery.fancytree": "2.38.5", "jquery.fancytree": "2.38.5",
@@ -47,12 +47,12 @@
"leaflet-gpx": "2.2.0", "leaflet-gpx": "2.2.0",
"mark.js": "8.11.1", "mark.js": "8.11.1",
"marked": "16.2.0", "marked": "16.2.0",
"mermaid": "11.10.0", "mermaid": "11.10.1",
"mind-elixir": "5.0.6", "mind-elixir": "5.0.6",
"normalize.css": "8.0.1", "normalize.css": "8.0.1",
"panzoom": "9.4.3", "panzoom": "9.4.3",
"preact": "10.27.1", "preact": "10.27.1",
"react-i18next": "15.7.1", "react-i18next": "15.7.2",
"split.js": "1.6.5", "split.js": "1.6.5",
"svg-pan-zoom": "3.6.2", "svg-pan-zoom": "3.6.2",
"tabulator-tables": "6.3.1", "tabulator-tables": "6.3.1",

View File

@@ -36,6 +36,8 @@ export interface Suggestion {
commandId?: string; commandId?: string;
commandDescription?: string; commandDescription?: string;
commandShortcut?: string; commandShortcut?: string;
attributeSnippet?: string;
highlightedAttributeSnippet?: string;
} }
export interface Options { export interface Options {
@@ -323,7 +325,33 @@ function initNoteAutocomplete($el: JQuery<HTMLElement>, options?: Options) {
html += '</div>'; html += '</div>';
return html; return html;
} }
return `<span class="${suggestion.icon ?? "bx bx-note"}"></span> ${suggestion.highlightedNotePathTitle}`; // Add special class for search-notes action
const actionClass = suggestion.action === "search-notes" ? "search-notes-action" : "";
// Choose appropriate icon based on action
let iconClass = suggestion.icon ?? "bx bx-note";
if (suggestion.action === "search-notes") {
iconClass = "bx bx-search";
} else if (suggestion.action === "create-note") {
iconClass = "bx bx-plus";
} else if (suggestion.action === "external-link") {
iconClass = "bx bx-link-external";
}
// Simplified HTML structure without nested divs
let html = `<div class="note-suggestion ${actionClass}">`;
html += `<span class="${iconClass}" style="display: inline-block; width: 16px; vertical-align: top;"></span>`;
html += `<span style="display: inline-block; width: calc(100% - 20px); padding-left: 4px;">`;
html += `<span class="search-result-title" style="display: block;">${suggestion.highlightedNotePathTitle}</span>`;
// Add attribute snippet inline if available
if (suggestion.highlightedAttributeSnippet) {
html += `<span style="display: block; font-size: 0.8em; color: var(--muted-text-color); opacity: 0.6; line-height: 1;" class="search-result-attributes">${suggestion.highlightedAttributeSnippet}</span>`;
}
html += `</span>`;
html += `</div>`;
return html;
} }
}, },
// we can't cache identical searches because notes can be created / renamed, new recent notes can be added // we can't cache identical searches because notes can be created / renamed, new recent notes can be added

View File

@@ -28,6 +28,28 @@
--ck-mention-list-max-height: 500px; --ck-mention-list-max-height: 500px;
} }
body#trilium-app.motion-disabled *,
body#trilium-app.motion-disabled *::before,
body#trilium-app.motion-disabled *::after {
/* Disable transitions and animations */
transition: none !important;
animation: none !important;
}
body#trilium-app.shadows-disabled *,
body#trilium-app.shadows-disabled *::before,
body#trilium-app.shadows-disabled *::after {
/* Disable shadows */
box-shadow: none !important;
}
body#trilium-app.backdrop-effects-disabled *,
body#trilium-app.backdrop-effects-disabled *::before,
body#trilium-app.backdrop-effects-disabled *::after {
/* Disable backdrop effects */
backdrop-filter: none !important;
}
.table { .table {
--bs-table-bg: transparent !important; --bs-table-bg: transparent !important;
} }
@@ -355,7 +377,7 @@ body.desktop .tabulator-popup-container {
@supports (animation-fill-mode: forwards) { @supports (animation-fill-mode: forwards) {
/* Delay the opening of submenus */ /* Delay the opening of submenus */
body.desktop .dropdown-submenu .dropdown-menu { body.desktop:not(.motion-disabled) .dropdown-submenu .dropdown-menu {
opacity: 0; opacity: 0;
animation-fill-mode: forwards; animation-fill-mode: forwards;
animation-delay: var(--submenu-opening-delay); animation-delay: var(--submenu-opening-delay);
@@ -1773,20 +1795,69 @@ textarea {
font-size: 1em; font-size: 1em;
} }
.jump-to-note-dialog .modal-dialog {
max-width: 900px;
width: 90%;
}
.jump-to-note-dialog .modal-header { .jump-to-note-dialog .modal-header {
align-items: center; align-items: center;
} }
.jump-to-note-dialog .modal-body { .jump-to-note-dialog .modal-body {
padding: 0; padding: 0;
min-height: 200px;
} }
.jump-to-note-results .aa-dropdown-menu { .jump-to-note-results .aa-dropdown-menu {
max-height: 40vh; max-height: calc(80vh - 200px);
width: 100%;
max-width: none;
overflow-y: auto;
overflow-x: hidden;
text-overflow: ellipsis;
box-shadow: none;
}
.jump-to-note-results {
width: 100%;
} }
.jump-to-note-results .aa-suggestions { .jump-to-note-results .aa-suggestions {
padding: 1rem; padding: 0;
width: 100%;
}
.jump-to-note-results .aa-dropdown-menu .aa-suggestion {
white-space: normal;
padding: 2px 12px !important;
line-height: 1.1;
position: relative;
border-radius: 0;
margin: 0 !important;
}
.jump-to-note-results .note-suggestion {
margin: 0;
padding: 0;
line-height: 1;
}
.jump-to-note-results .aa-suggestion:not(:last-child)::after {
display: none; /* Remove dividers for more compact look */
}
.jump-to-note-results .aa-suggestion:last-child::after {
display: none;
}
.jump-to-note-results .aa-suggestion.disabled::after {
display: none;
}
.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 */ /* Command palette styling */
@@ -1804,8 +1875,24 @@ textarea {
.jump-to-note-dialog .aa-cursor .command-suggestion, .jump-to-note-dialog .aa-cursor .command-suggestion,
.jump-to-note-dialog .aa-suggestion:hover .command-suggestion { .jump-to-note-dialog .aa-suggestion:hover .command-suggestion {
border-left-color: var(--link-color); background-color: transparent;
background-color: var(--hover-background-color); }
.jump-to-note-dialog .show-in-full-search,
.jump-to-note-results .show-in-full-search {
border-top: 1px solid var(--main-border-color);
padding-top: 12px;
margin-top: 12px;
}
.jump-to-note-results .aa-suggestion .search-notes-action {
border-top: 1px solid var(--main-border-color);
margin-top: 8px;
padding-top: 8px;
}
.jump-to-note-results .aa-suggestion:has(.search-notes-action)::after {
display: none;
} }
.jump-to-note-dialog .command-icon { .jump-to-note-dialog .command-icon {
@@ -2262,7 +2349,8 @@ footer.webview-footer button {
/* Search result highlighting */ /* Search result highlighting */
.search-result-title b, .search-result-title b,
.search-result-content b { .search-result-content b,
.search-result-attributes b {
font-weight: 900; font-weight: 900;
color: var(--admonition-warning-accent-color); color: var(--admonition-warning-accent-color);
} }

View File

@@ -89,6 +89,7 @@
--menu-text-color: #e3e3e3; --menu-text-color: #e3e3e3;
--menu-background-color: #222222d9; --menu-background-color: #222222d9;
--menu-background-color-no-backdrop: #1b1b1b;
--menu-item-icon-color: #8c8c8c; --menu-item-icon-color: #8c8c8c;
--menu-item-disabled-opacity: 0.5; --menu-item-disabled-opacity: 0.5;
--menu-item-keyboard-shortcut-color: #ffffff8f; --menu-item-keyboard-shortcut-color: #ffffff8f;

View File

@@ -83,6 +83,7 @@
--menu-text-color: #272727; --menu-text-color: #272727;
--menu-background-color: #ffffffd9; --menu-background-color: #ffffffd9;
--menu-background-color-no-backdrop: #fdfdfd;
--menu-item-icon-color: #727272; --menu-item-icon-color: #727272;
--menu-item-disabled-opacity: 0.6; --menu-item-disabled-opacity: 0.6;
--menu-item-keyboard-shortcut-color: #666666a8; --menu-item-keyboard-shortcut-color: #666666a8;

View File

@@ -83,6 +83,12 @@
--tab-note-icons: true; --tab-note-icons: true;
} }
body.backdrop-effects-disabled {
/* Backdrop effects are disabled, replace the menu background color with the
* no-backdrop fallback color */
--menu-background-color: var(--menu-background-color-no-backdrop);
}
/* /*
* MENUS * MENUS
* *
@@ -532,8 +538,8 @@ body.mobile .dropdown-menu .dropdown-item.submenu-open .dropdown-toggle::after {
/* List item */ /* List item */
.jump-to-note-dialog .aa-suggestions div, .jump-to-note-dialog .aa-suggestions div,
.note-detail-empty .aa-suggestions div { .note-detail-empty .aa-suggestions div {
border-radius: 6px; border-radius: 0;
padding: 6px 12px; padding: 12px 16px;
color: var(--menu-text-color); color: var(--menu-text-color);
cursor: default; cursor: default;
} }

View File

@@ -1871,7 +1871,12 @@
"selected_provider": "已选提供商", "selected_provider": "已选提供商",
"selected_provider_description": "选择用于聊天和补全功能的AI提供商", "selected_provider_description": "选择用于聊天和补全功能的AI提供商",
"select_model": "选择模型...", "select_model": "选择模型...",
"select_provider": "选择提供商..." "select_provider": "选择提供商...",
"ai_enabled": "已启用 AI 功能",
"ai_disabled": "已禁用 AI 功能",
"no_models_found_online": "找不到模型。请检查您的 API 密钥及设置。",
"no_models_found_ollama": "找不到 Ollama 模型。请确认 Ollama 是否正在运行。",
"error_fetching": "获取模型失败:{{error}}"
}, },
"code-editor-options": { "code-editor-options": {
"title": "编辑器" "title": "编辑器"
@@ -1999,5 +2004,21 @@
"next_theme_message": "当前使用旧版主题,要试用新主题吗?", "next_theme_message": "当前使用旧版主题,要试用新主题吗?",
"next_theme_button": "试用新主题", "next_theme_button": "试用新主题",
"dismiss": "关闭" "dismiss": "关闭"
},
"settings": {
"related_settings": "相关设置"
},
"settings_appearance": {
"related_code_blocks": "文本笔记中代码块的色彩方案",
"related_code_notes": "代码笔记的色彩方案"
},
"units": {
"percentage": "%"
},
"ui-performance": {
"title": "性能",
"enable-motion": "启用过渡和动画",
"enable-shadows": "启用阴影",
"enable-backdrop-effects": "启用菜单、弹窗和面板的背景效果"
} }
} }

View File

@@ -202,7 +202,8 @@
"okButton": "OK" "okButton": "OK"
}, },
"jump_to_note": { "jump_to_note": {
"search_button": "Suche im Volltext" "search_button": "Suche im Volltext",
"search_placeholder": "Suche nach Notiz anhand ihres Titels oder gib > ein für Kommandos..."
}, },
"markdown_import": { "markdown_import": {
"dialog_title": "Markdown-Import", "dialog_title": "Markdown-Import",
@@ -217,21 +218,26 @@
"search_placeholder": "Suche nach einer Notiz anhand ihres Namens", "search_placeholder": "Suche nach einer Notiz anhand ihres Namens",
"move_button": "Zur ausgewählten Notiz wechseln", "move_button": "Zur ausgewählten Notiz wechseln",
"error_no_path": "Kein Weg, auf den man sich bewegen kann.", "error_no_path": "Kein Weg, auf den man sich bewegen kann.",
"move_success_message": "Ausgewählte Notizen wurden verschoben" "move_success_message": "Ausgewählte Notizen wurden verschoben in "
}, },
"note_type_chooser": { "note_type_chooser": {
"modal_title": "Wähle den Notiztyp aus", "modal_title": "Wähle den Notiztyp aus",
"modal_body": "Wähle den Notiztyp / die Vorlage der neuen Notiz:", "modal_body": "Wähle den Notiztyp / die Vorlage der neuen Notiz:",
"templates": "Vorlagen" "templates": "Vorlagen",
"change_path_prompt": "Ändern wo die neue Notiz erzeugt wird:",
"search_placeholder": "Durchsuche Pfad nach Namen (Standard falls leer)",
"builtin_templates": "Eingebaute Vorlage"
}, },
"password_not_set": { "password_not_set": {
"title": "Das Passwort ist nicht festgelegt", "title": "Das Passwort ist nicht festgelegt",
"body1": "Geschützte Notizen werden mit einem Benutzerpasswort verschlüsselt, es wurde jedoch noch kein Passwort festgelegt." "body1": "Geschützte Notizen werden mit einem Benutzerpasswort verschlüsselt, es wurde jedoch noch kein Passwort festgelegt.",
"body2": "Um Notizen zu schützen, klicke den unteren Button um den Optionsdialog zu öffnen und dein Passwort festzulegen.",
"go_to_password_options": "Gehe zu Passwortoptionen"
}, },
"prompt": { "prompt": {
"title": "Prompt", "title": "Eingabeaufforderung",
"ok": "OK", "ok": "OK",
"defaultTitle": "Prompt" "defaultTitle": "Eingabeaufforderung"
}, },
"protected_session_password": { "protected_session_password": {
"modal_title": "Geschützte Sitzung", "modal_title": "Geschützte Sitzung",
@@ -265,10 +271,12 @@
"maximum_revisions": "Maximale Revisionen für aktuelle Notiz: {{number}}.", "maximum_revisions": "Maximale Revisionen für aktuelle Notiz: {{number}}.",
"settings": "Einstellungen für Notizrevisionen", "settings": "Einstellungen für Notizrevisionen",
"download_button": "Herunterladen", "download_button": "Herunterladen",
"mime": "MIME:", "mime": "MIME: ",
"file_size": "Dateigröße:", "file_size": "Dateigröße:",
"preview": "Vorschau:", "preview": "Vorschau:",
"preview_not_available": "Für diesen Notiztyp ist keine Vorschau verfügbar." "preview_not_available": "Für diesen Notiztyp ist keine Vorschau verfügbar.",
"restore_button": "Wiederherstellen",
"delete_button": "Löschen"
}, },
"sort_child_notes": { "sort_child_notes": {
"sort_children_by": "Unternotizen sortieren nach...", "sort_children_by": "Unternotizen sortieren nach...",
@@ -374,7 +382,7 @@
"bookmark_folder": "Notizen mit dieser Bezeichnung werden in den Lesezeichen als Ordner angezeigt (und ermöglichen den Zugriff auf ihre untergeordneten Ordner).", "bookmark_folder": "Notizen mit dieser Bezeichnung werden in den Lesezeichen als Ordner angezeigt (und ermöglichen den Zugriff auf ihre untergeordneten Ordner).",
"share_hidden_from_tree": "Diese Notiz ist im linken Navigationsbaum ausgeblendet, kann aber weiterhin über ihre URL aufgerufen werden", "share_hidden_from_tree": "Diese Notiz ist im linken Navigationsbaum ausgeblendet, kann aber weiterhin über ihre URL aufgerufen werden",
"share_external_link": "Die Notiz dient als Link zu einer externen Website im Freigabebaum", "share_external_link": "Die Notiz dient als Link zu einer externen Website im Freigabebaum",
"share_alias": "Lege einen Alias fest, unter dem die Notiz unter https://your_trilium_host/share/[dein_alias] verfügbar sein wird.", "share_alias": "Lege einen Alias fest, mit dem die Notiz unter https://your_trilium_host/share/[dein_alias] verfügbar sein wird.",
"share_omit_default_css": "Das Standard-CSS für die Freigabeseite wird weggelassen. Verwende es, wenn du umfangreiche Stylingänderungen vornimmst.", "share_omit_default_css": "Das Standard-CSS für die Freigabeseite wird weggelassen. Verwende es, wenn du umfangreiche Stylingänderungen vornimmst.",
"share_root": "Markiert eine Notiz, die im /share-Root bereitgestellt wird.", "share_root": "Markiert eine Notiz, die im /share-Root bereitgestellt wird.",
"share_description": "Definiere Text, der dem HTML-Meta-Tag zur Beschreibung hinzugefügt werden soll", "share_description": "Definiere Text, der dem HTML-Meta-Tag zur Beschreibung hinzugefügt werden soll",
@@ -390,7 +398,7 @@
"color": "Definiert die Farbe der Notiz im Notizbaum, in Links usw. Verwende einen beliebigen gültigen CSS-Farbwert wie „rot“ oder #a13d5f", "color": "Definiert die Farbe der Notiz im Notizbaum, in Links usw. Verwende einen beliebigen gültigen CSS-Farbwert wie „rot“ oder #a13d5f",
"keyboard_shortcut": "Definiert eine Tastenkombination, die sofort zu dieser Notiz springt. Beispiel: „Strg+Alt+E“. Erfordert ein Neuladen des Frontends, damit die Änderung wirksam wird.", "keyboard_shortcut": "Definiert eine Tastenkombination, die sofort zu dieser Notiz springt. Beispiel: „Strg+Alt+E“. Erfordert ein Neuladen des Frontends, damit die Änderung wirksam wird.",
"keep_current_hoisting": "Das Öffnen dieses Links ändert das Hochziehen nicht, selbst wenn die Notiz im aktuell hochgezogenen Unterbaum nicht angezeigt werden kann.", "keep_current_hoisting": "Das Öffnen dieses Links ändert das Hochziehen nicht, selbst wenn die Notiz im aktuell hochgezogenen Unterbaum nicht angezeigt werden kann.",
"execute_button": "Titel der Schaltfläche, die die aktuelle Codenotiz ausführt", "execute_button": "Titel der Schaltfläche, welche die aktuelle Codenotiz ausführt",
"execute_description": "Längere Beschreibung der aktuellen Codenotiz, die zusammen mit der Schaltfläche „Ausführen“ angezeigt wird", "execute_description": "Längere Beschreibung der aktuellen Codenotiz, die zusammen mit der Schaltfläche „Ausführen“ angezeigt wird",
"exclude_from_note_map": "Notizen mit dieser Bezeichnung werden in der Notizenkarte ausgeblendet", "exclude_from_note_map": "Notizen mit dieser Bezeichnung werden in der Notizenkarte ausgeblendet",
"new_notes_on_top": "Neue Notizen werden oben in der übergeordneten Notiz erstellt, nicht unten.", "new_notes_on_top": "Neue Notizen werden oben in der übergeordneten Notiz erstellt, nicht unten.",
@@ -405,7 +413,7 @@
"run_on_branch_change": "wird ausgeführt, wenn ein Zweig aktualisiert wird.", "run_on_branch_change": "wird ausgeführt, wenn ein Zweig aktualisiert wird.",
"run_on_branch_deletion": "wird ausgeführt, wenn ein Zweig gelöscht wird. Der Zweig ist eine Verknüpfung zwischen der übergeordneten Notiz und der untergeordneten Notiz und wird z. B. gelöscht. beim Verschieben der Notiz (alter Zweig/Link wird gelöscht).", "run_on_branch_deletion": "wird ausgeführt, wenn ein Zweig gelöscht wird. Der Zweig ist eine Verknüpfung zwischen der übergeordneten Notiz und der untergeordneten Notiz und wird z. B. gelöscht. beim Verschieben der Notiz (alter Zweig/Link wird gelöscht).",
"run_on_attribute_creation": "wird ausgeführt, wenn für die Notiz ein neues Attribut erstellt wird, das diese Beziehung definiert", "run_on_attribute_creation": "wird ausgeführt, wenn für die Notiz ein neues Attribut erstellt wird, das diese Beziehung definiert",
"run_on_attribute_change": "wird ausgeführt, wenn das Attribut einer Notiz geändert wird, die diese Beziehung definiert. Dies wird auch ausgelöst, wenn das Attribut gelöscht wird", "run_on_attribute_change": " wird ausgeführt, wenn das Attribut einer Notiz geändert wird, die diese Beziehung definiert. Dies wird auch ausgelöst, wenn das Attribut gelöscht wird",
"relation_template": "Die Attribute der Notiz werden auch ohne eine Eltern-Kind-Beziehung vererbt. Der Inhalt und der Unterbaum der Notiz werden den Instanznotizen hinzugefügt, wenn sie leer sind. Einzelheiten findest du in der Dokumentation.", "relation_template": "Die Attribute der Notiz werden auch ohne eine Eltern-Kind-Beziehung vererbt. Der Inhalt und der Unterbaum der Notiz werden den Instanznotizen hinzugefügt, wenn sie leer sind. Einzelheiten findest du in der Dokumentation.",
"inherit": "Die Attribute einer Notiz werden auch ohne eine Eltern-Kind-Beziehung vererbt. Ein ähnliches Konzept findest du unter Vorlagenbeziehung. Siehe Attributvererbung in der Dokumentation.", "inherit": "Die Attribute einer Notiz werden auch ohne eine Eltern-Kind-Beziehung vererbt. Ein ähnliches Konzept findest du unter Vorlagenbeziehung. Siehe Attributvererbung in der Dokumentation.",
"render_note": "Notizen vom Typ \"HTML-Notiz rendern\" werden mit einer Code-Notiz (HTML oder Skript) gerendert, und es ist notwendig, über diese Beziehung anzugeben, welche Notiz gerendert werden soll.", "render_note": "Notizen vom Typ \"HTML-Notiz rendern\" werden mit einer Code-Notiz (HTML oder Skript) gerendert, und es ist notwendig, über diese Beziehung anzugeben, welche Notiz gerendert werden soll.",
@@ -418,7 +426,8 @@
"other_notes_with_name": "Other notes with {{attributeType}} name \"{{attributeName}}\"", "other_notes_with_name": "Other notes with {{attributeType}} name \"{{attributeName}}\"",
"and_more": "... und {{count}} mehr.", "and_more": "... und {{count}} mehr.",
"print_landscape": "Beim Export als PDF, wird die Seitenausrichtung Querformat anstatt Hochformat verwendet.", "print_landscape": "Beim Export als PDF, wird die Seitenausrichtung Querformat anstatt Hochformat verwendet.",
"print_page_size": "Beim Export als PDF, wird die Größe der Seite angepasst. Unterstützte Größen: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>." "print_page_size": "Beim Export als PDF, wird die Größe der Seite angepasst. Unterstützte Größen: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
"color_type": "Farbe"
}, },
"attribute_editor": { "attribute_editor": {
"help_text_body1": "Um ein Label hinzuzufügen, gebe einfach z.B. ein. <code>#rock</code> oder wenn du auch einen Wert hinzufügen möchten, dann z.B. <code>#year = 2024</code>", "help_text_body1": "Um ein Label hinzuzufügen, gebe einfach z.B. ein. <code>#rock</code> oder wenn du auch einen Wert hinzufügen möchten, dann z.B. <code>#year = 2024</code>",
@@ -492,7 +501,7 @@
"on_all_matched_notes": "Auf allen übereinstimmenden Notizen", "on_all_matched_notes": "Auf allen übereinstimmenden Notizen",
"move_note_new_parent": "Verschiebe die Notiz in die neue übergeordnete Notiz, wenn die Notiz nur eine übergeordnete Notiz hat (d. h. der alte Zweig wird entfernt und ein neuer Zweig in die neue übergeordnete Notiz erstellt).", "move_note_new_parent": "Verschiebe die Notiz in die neue übergeordnete Notiz, wenn die Notiz nur eine übergeordnete Notiz hat (d. h. der alte Zweig wird entfernt und ein neuer Zweig in die neue übergeordnete Notiz erstellt).",
"clone_note_new_parent": "Notiz auf die neue übergeordnete Notiz klonen, wenn die Notiz mehrere Klone/Zweige hat (es ist nicht klar, welcher Zweig entfernt werden soll)", "clone_note_new_parent": "Notiz auf die neue übergeordnete Notiz klonen, wenn die Notiz mehrere Klone/Zweige hat (es ist nicht klar, welcher Zweig entfernt werden soll)",
"nothing_will_happen": "Es passiert nichts, wenn die Notiz nicht zur Zielnotiz verschoben werden kann (d. h. dies würde einen Baumzyklus erzeugen)." "nothing_will_happen": "Es passiert nichts, wenn die Notiz nicht zur Zielnotiz verschoben werden kann (z.B. wenn dies einen Kreislauf in der Baumstruktur erzeugen würde)."
}, },
"rename_note": { "rename_note": {
"rename_note": "Notiz umbenennen", "rename_note": "Notiz umbenennen",
@@ -503,7 +512,7 @@
"example_note": "<code>Notiz</code> alle übereinstimmenden Notizen werden in „Notiz“ umbenannt.", "example_note": "<code>Notiz</code> alle übereinstimmenden Notizen werden in „Notiz“ umbenannt.",
"example_new_title": "<code>NEU: ${note.title}</code> Übereinstimmende Notiztitel erhalten das Präfix „NEU:“", "example_new_title": "<code>NEU: ${note.title}</code> Übereinstimmende Notiztitel erhalten das Präfix „NEU:“",
"example_date_prefix": "<code>${note.dateCreatedObj.format('MM-DD:')}: ${note.title}</code> übereinstimmende Notizen werden mit dem Erstellungsmonat und -datum der Notiz vorangestellt", "example_date_prefix": "<code>${note.dateCreatedObj.format('MM-DD:')}: ${note.title}</code> übereinstimmende Notizen werden mit dem Erstellungsmonat und -datum der Notiz vorangestellt",
"api_docs": "Siehe API-Dokumente für <a hrefu003d'https://zadam.github.io/trilium/backend_api/Note.html'>Notiz</a> und seinen <a hrefu003d'https://day.js.org/ docs/en/display/format'>dateCreatedObj / utcDateCreatedObj-Eigenschaften</a> für Details." "api_docs": "Siehe API-Dokumente für <a href='https://zadam.github.io/trilium/backend_api/Note.html'>Notiz</a> und seinen <a href='https://day.js.org/ docs/en/display/format'>dateCreatedObj / utcDateCreatedObj properties</a> für Details."
}, },
"add_relation": { "add_relation": {
"add_relation": "Beziehung hinzufügen", "add_relation": "Beziehung hinzufügen",
@@ -577,7 +586,8 @@
"september": "September", "september": "September",
"october": "Oktober", "october": "Oktober",
"november": "November", "november": "November",
"december": "Dezember" "december": "Dezember",
"cannot_find_week_note": "Wochennotiz kann nicht gefunden werden"
}, },
"close_pane_button": { "close_pane_button": {
"close_this_pane": "Schließe diesen Bereich" "close_this_pane": "Schließe diesen Bereich"
@@ -699,8 +709,8 @@
"zoom_out_title": "Herauszoomen" "zoom_out_title": "Herauszoomen"
}, },
"zpetne_odkazy": { "zpetne_odkazy": {
"backlink": "{{count}} Backlink", "backlink": "{{count}} Rückverlinkung",
"backlinks": "{{count}} Backlinks", "backlinks": "{{count}} Rückverlinkungen",
"relation": "Beziehung" "relation": "Beziehung"
}, },
"mobile_detail_menu": { "mobile_detail_menu": {
@@ -718,7 +728,8 @@
"basic_properties": { "basic_properties": {
"note_type": "Notiztyp", "note_type": "Notiztyp",
"editable": "Bearbeitbar", "editable": "Bearbeitbar",
"basic_properties": "Grundlegende Eigenschaften" "basic_properties": "Grundlegende Eigenschaften",
"language": "Sprache"
}, },
"book_properties": { "book_properties": {
"view_type": "Ansichtstyp", "view_type": "Ansichtstyp",
@@ -729,7 +740,11 @@
"collapse": "Einklappen", "collapse": "Einklappen",
"expand": "Ausklappen", "expand": "Ausklappen",
"invalid_view_type": "Ungültiger Ansichtstyp „{{type}}“", "invalid_view_type": "Ungültiger Ansichtstyp „{{type}}“",
"calendar": "Kalender" "calendar": "Kalender",
"book_properties": "Sammlungseigenschaften",
"table": "Tabelle",
"geo-map": "Weltkarte",
"board": "Tafel"
}, },
"edited_notes": { "edited_notes": {
"no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...", "no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...",
@@ -805,7 +820,9 @@
"unknown_label_type": "Unbekannter Labeltyp „{{type}}“", "unknown_label_type": "Unbekannter Labeltyp „{{type}}“",
"unknown_attribute_type": "Unbekannter Attributtyp „{{type}}“", "unknown_attribute_type": "Unbekannter Attributtyp „{{type}}“",
"add_new_attribute": "Neues Attribut hinzufügen", "add_new_attribute": "Neues Attribut hinzufügen",
"remove_this_attribute": "Entferne dieses Attribut" "remove_this_attribute": "Entferne dieses Attribut",
"unset-field-placeholder": "nicht gesetzt",
"remove_color": "Entferne Farblabel"
}, },
"script_executor": { "script_executor": {
"query": "Abfrage", "query": "Abfrage",
@@ -917,7 +934,7 @@
"attachment_detail": { "attachment_detail": {
"open_help_page": "Hilfeseite zu Anhängen öffnen", "open_help_page": "Hilfeseite zu Anhängen öffnen",
"owning_note": "Eigentümernotiz: ", "owning_note": "Eigentümernotiz: ",
"you_can_also_open": ", Du kannst auch das öffnen", "you_can_also_open": ", Du kannst auch das öffnen ",
"list_of_all_attachments": "Liste aller Anhänge", "list_of_all_attachments": "Liste aller Anhänge",
"attachment_deleted": "Dieser Anhang wurde gelöscht." "attachment_deleted": "Dieser Anhang wurde gelöscht."
}, },
@@ -942,7 +959,8 @@
"enter_workspace": "Betrete den Arbeitsbereich {{title}}" "enter_workspace": "Betrete den Arbeitsbereich {{title}}"
}, },
"file": { "file": {
"file_preview_not_available": "Für dieses Dateiformat ist keine Dateivorschau verfügbar." "file_preview_not_available": "Für dieses Dateiformat ist keine Dateivorschau verfügbar.",
"too_big": "Die Vorschau zeigt aus Effizienzgründen nur die ersten {{maxNumChars}} Zeichen der Datei an. Lade die Datei herunter und öffne sie extern um den gesamten Inhalt zu sehen."
}, },
"protected_session": { "protected_session": {
"enter_password_instruction": "Um die geschützte Notiz anzuzeigen, musst du dein Passwort eingeben:", "enter_password_instruction": "Um die geschützte Notiz anzuzeigen, musst du dein Passwort eingeben:",
@@ -981,7 +999,7 @@
"web_view": { "web_view": {
"web_view": "Webansicht", "web_view": "Webansicht",
"embed_websites": "Notiz vom Typ Web View ermöglicht das Einbetten von Websites in Trilium.", "embed_websites": "Notiz vom Typ Web View ermöglicht das Einbetten von Websites in Trilium.",
"create_label": "To start, please create a label with a URL address you want to embed, e.g. #webViewSrc=\"https://www.google.com\"" "create_label": "Um zu beginnen, erstelle bitte ein Label mit einer URL-Adresse, die eingebettet werden soll, z. B. #webViewSrc=\"https://www.google.com\""
}, },
"backend_log": { "backend_log": {
"refresh": "Aktualisieren" "refresh": "Aktualisieren"
@@ -1007,7 +1025,7 @@
"error_creating_anonymized_database": "Die anonymisierte Datenbank konnte nicht erstellt werden. Überprüfe die Backend-Protokolle auf Details", "error_creating_anonymized_database": "Die anonymisierte Datenbank konnte nicht erstellt werden. Überprüfe die Backend-Protokolle auf Details",
"successfully_created_fully_anonymized_database": "Vollständig anonymisierte Datenbank in {{anonymizedFilePath}} erstellt", "successfully_created_fully_anonymized_database": "Vollständig anonymisierte Datenbank in {{anonymizedFilePath}} erstellt",
"successfully_created_lightly_anonymized_database": "Leicht anonymisierte Datenbank in {{anonymizedFilePath}} erstellt", "successfully_created_lightly_anonymized_database": "Leicht anonymisierte Datenbank in {{anonymizedFilePath}} erstellt",
"no_anonymized_database_yet": "Noch keine anonymisierte Datenbank" "no_anonymized_database_yet": "Noch keine anonymisierte Datenbank."
}, },
"database_integrity_check": { "database_integrity_check": {
"title": "Datenbankintegritätsprüfung", "title": "Datenbankintegritätsprüfung",
@@ -1063,7 +1081,8 @@
"max_width_label": "Maximale Inhaltsbreite in Pixel", "max_width_label": "Maximale Inhaltsbreite in Pixel",
"apply_changes_description": "Um Änderungen an der Inhaltsbreite anzuwenden, klicke auf", "apply_changes_description": "Um Änderungen an der Inhaltsbreite anzuwenden, klicke auf",
"reload_button": "Frontend neu laden", "reload_button": "Frontend neu laden",
"reload_description": "Änderungen an den Darstellungsoptionen" "reload_description": "Änderungen an den Darstellungsoptionen",
"max_width_unit": "Pixel"
}, },
"native_title_bar": { "native_title_bar": {
"title": "Native Titelleiste (App-Neustart erforderlich)", "title": "Native Titelleiste (App-Neustart erforderlich)",
@@ -1086,7 +1105,10 @@
"layout-vertical-title": "Vertikal", "layout-vertical-title": "Vertikal",
"layout-horizontal-title": "Horizontal", "layout-horizontal-title": "Horizontal",
"layout-vertical-description": "Startleiste ist auf der linken Seite (standard)", "layout-vertical-description": "Startleiste ist auf der linken Seite (standard)",
"layout-horizontal-description": "Startleiste ist unter der Tableiste. Die Tableiste wird dadurch auf die ganze Breite erweitert." "layout-horizontal-description": "Startleiste ist unter der Tableiste. Die Tableiste wird dadurch auf die ganze Breite erweitert.",
"auto_theme": "Alt (Folge dem Farbschema des Systems)",
"light_theme": "Alt (Hell)",
"dark_theme": "Alt (Dunkel)"
}, },
"zoom_factor": { "zoom_factor": {
"title": "Zoomfaktor (nur Desktop-Build)", "title": "Zoomfaktor (nur Desktop-Build)",
@@ -1119,7 +1141,7 @@
"attachment_erasure_timeout": { "attachment_erasure_timeout": {
"attachment_erasure_timeout": "Zeitüberschreitung beim Löschen von Anhängen", "attachment_erasure_timeout": "Zeitüberschreitung beim Löschen von Anhängen",
"attachment_auto_deletion_description": "Anhänge werden automatisch gelöscht (und gelöscht), wenn sie nach einer definierten Zeitspanne nicht mehr in ihrer Notiz referenziert werden.", "attachment_auto_deletion_description": "Anhänge werden automatisch gelöscht (und gelöscht), wenn sie nach einer definierten Zeitspanne nicht mehr in ihrer Notiz referenziert werden.",
"erase_attachments_after": "Erase unused attachments after:", "erase_attachments_after": "Nicht verwendete Anhänge löschen nach:",
"manual_erasing_description": "Du kannst das Löschen auch manuell auslösen (ohne Berücksichtigung des oben definierten Timeouts):", "manual_erasing_description": "Du kannst das Löschen auch manuell auslösen (ohne Berücksichtigung des oben definierten Timeouts):",
"erase_unused_attachments_now": "Lösche jetzt nicht verwendete Anhangnotizen", "erase_unused_attachments_now": "Lösche jetzt nicht verwendete Anhangnotizen",
"unused_attachments_erased": "Nicht verwendete Anhänge wurden gelöscht." "unused_attachments_erased": "Nicht verwendete Anhänge wurden gelöscht."
@@ -1130,7 +1152,7 @@
}, },
"note_erasure_timeout": { "note_erasure_timeout": {
"note_erasure_timeout_title": "Beachte das Zeitlimit für die Löschung", "note_erasure_timeout_title": "Beachte das Zeitlimit für die Löschung",
"note_erasure_description": "Deleted notes (and attributes, revisions...) are at first only marked as deleted and it is possible to recover them from Recent Notes dialog. After a period of time, deleted notes are \"erased\" which means their content is not recoverable anymore. This setting allows you to configure the length of the period between deleting and erasing the note.", "note_erasure_description": "Gelöschte Notizen (und Attribute, Notizrevisionen...) werden zunächst nur als gelöscht markiert und können über den Dialog „Zuletzt verwendete Notizen” wiederhergestellt werden. Nach einer bestimmten Zeit werden gelöschte Notizen „gelöscht”, was bedeutet, dass ihr Inhalt nicht mehr wiederhergestellt werden kann. Mit dieser Einstellung können Sie die Zeitspanne zwischen dem Löschen und dem endgültigen Löschen der Notiz festlegen.",
"erase_notes_after": "Notizen löschen nach:", "erase_notes_after": "Notizen löschen nach:",
"manual_erasing_description": "Du kannst das Löschen auch manuell auslösen (ohne Berücksichtigung des oben definierten Timeouts):", "manual_erasing_description": "Du kannst das Löschen auch manuell auslösen (ohne Berücksichtigung des oben definierten Timeouts):",
"erase_deleted_notes_now": "Jetzt gelöschte Notizen löschen", "erase_deleted_notes_now": "Jetzt gelöschte Notizen löschen",
@@ -1361,7 +1383,7 @@
"duplicate": "Duplizieren", "duplicate": "Duplizieren",
"export": "Exportieren", "export": "Exportieren",
"import-into-note": "In Notiz importieren", "import-into-note": "In Notiz importieren",
"apply-bulk-actions": "Massenaktionen ausführen", "apply-bulk-actions": "Massenaktionen anwenden",
"converted-to-attachments": "{{count}} Notizen wurden als Anhang konvertiert.", "converted-to-attachments": "{{count}} Notizen wurden als Anhang konvertiert.",
"convert-to-attachment-confirm": "Bist du sicher, dass du die ausgewählten Notizen in Anhänge ihrer übergeordneten Notizen umwandeln möchtest?" "convert-to-attachment-confirm": "Bist du sicher, dass du die ausgewählten Notizen in Anhänge ihrer übergeordneten Notizen umwandeln möchtest?"
}, },
@@ -1377,7 +1399,7 @@
"relation-map": "Beziehungskarte", "relation-map": "Beziehungskarte",
"note-map": "Notizkarte", "note-map": "Notizkarte",
"render-note": "Render Notiz", "render-note": "Render Notiz",
"mermaid-diagram": "Mermaid Diagram", "mermaid-diagram": "Mermaid Diagramm",
"canvas": "Canvas", "canvas": "Canvas",
"web-view": "Webansicht", "web-view": "Webansicht",
"mind-map": "Mind Map", "mind-map": "Mind Map",
@@ -1387,7 +1409,7 @@
"doc": "Dokument", "doc": "Dokument",
"widget": "Widget", "widget": "Widget",
"confirm-change": "Es is nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?", "confirm-change": "Es is nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?",
"geo-map": "Geo Map", "geo-map": "Geo-Karte",
"beta-feature": "Beta" "beta-feature": "Beta"
}, },
"protect_note": { "protect_note": {
@@ -1561,11 +1583,11 @@
"label": "Format Toolbar", "label": "Format Toolbar",
"floating": { "floating": {
"title": "Schwebend", "title": "Schwebend",
"description": "Werkzeuge erscheinen in Cursornähe" "description": "Werkzeuge erscheinen in Cursornähe;"
}, },
"fixed": { "fixed": {
"title": "Fixiert", "title": "Fixiert",
"description": "Werkzeuge erscheinen im \"Format\" Tab" "description": "Werkzeuge erscheinen im \"Format\" Tab."
}, },
"multiline-toolbar": "Toolbar wenn nötig in mehreren Zeilen darstellen." "multiline-toolbar": "Toolbar wenn nötig in mehreren Zeilen darstellen."
} }
@@ -1631,5 +1653,49 @@
}, },
"modal": { "modal": {
"close": "Schließen" "close": "Schließen"
},
"ai_llm": {
"n_notes_queued": "{{ count }} Notiz zur Indizierung vorgemerkt",
"n_notes_queued_plural": "{{ count }} Notizen zur Indizierung vorgemerkt",
"notes_indexed": "{{ count }} Notiz indiziert",
"notes_indexed_plural": "{{ count }} Notizen indiziert",
"not_started": "Nicht gestartet",
"title": "KI Einstellungen",
"processed_notes": "Verarbeitete Notizen",
"total_notes": "Gesamt Notizen",
"progress": "Fortschritt",
"queued_notes": "Eingereihte Notizen",
"failed_notes": "Fehlgeschlagenen Notizen",
"last_processed": "Zuletzt verarbeitet",
"refresh_stats": "Statistiken neu laden",
"enable_ai_features": "Aktiviere KI/LLM Funktionen",
"enable_ai_description": "Aktiviere KI-Funktionen wie Notizzusammenfassungen, Inhaltserzeugung und andere LLM-Funktionen",
"openai_tab": "OpenAI",
"anthropic_tab": "Anthropic",
"voyage_tab": "Voyage AI",
"ollama_tab": "Ollama",
"enable_ai": "Aktiviere KI/LLM Funktionen",
"enable_ai_desc": "Aktiviere KI-Funktionen wie Notizzusammenfassungen, Inhaltserzeugung und andere LLM-Funktionen",
"provider_configuration": "KI-Anbieterkonfiguration",
"provider_precedence": "Anbieter Priorität",
"provider_precedence_description": "Komma-getrennte Liste von Anbieter in der Reihenfolge ihrer Priorität (z.B. 'openai, anthropic,ollama')",
"temperature": "Temperatur",
"temperature_description": "Regelt die Zufälligkeit in Antworten (0 = deterministisch, 2 = maximale Zufälligkeit)",
"system_prompt": "Systemaufforderung",
"system_prompt_description": "Standard Systemaufforderung für alle KI-Interaktionen",
"openai_configuration": "OpenAI Konfiguration",
"openai_settings": "OpenAI Einstellungen",
"api_key": "API Schlüssel",
"url": "Basis-URL",
"model": "Modell"
},
"zen_mode": {
"button_exit": "Verlasse Zen Modus"
},
"ui-performance": {
"title": "Leistung",
"enable-motion": "Aktiviere Übergänge und Animationen",
"enable-shadows": "Aktiviere Schatten",
"enable-backdrop-effects": "Aktiviere Hintergrundeffekte für Menüs, Pop-up Fenster und Panele"
} }
} }

View File

@@ -1113,6 +1113,12 @@
"layout-vertical-description": "launcher bar is on the left (default)", "layout-vertical-description": "launcher bar is on the left (default)",
"layout-horizontal-description": "launcher bar is underneath the tab bar, the tab bar is now full width." "layout-horizontal-description": "launcher bar is underneath the tab bar, the tab bar is now full width."
}, },
"ui-performance": {
"title": "Performance",
"enable-motion": "Enable transitions and animations",
"enable-shadows": "Enable shadows",
"enable-backdrop-effects": "Enable background effects for menus, popups and panels"
},
"ai_llm": { "ai_llm": {
"not_started": "Not started", "not_started": "Not started",
"title": "AI Settings", "title": "AI Settings",

View File

@@ -1680,6 +1680,16 @@
"n_notes_queued_2": "", "n_notes_queued_2": "",
"notes_indexed_0": "{{ count }} note indexée", "notes_indexed_0": "{{ count }} note indexée",
"notes_indexed_1": "{{ count }} notes indexées", "notes_indexed_1": "{{ count }} notes indexées",
"notes_indexed_2": "" "notes_indexed_2": "",
"anthropic_url_description": "URL de base pour l'API Anthropic (par défaut : https ://api.anthropic.com)",
"anthropic_model_description": "Modèles Anthropic Claude pour la complétion",
"voyage_settings": "Réglages d'IA Voyage",
"ollama_settings": "Réglages Ollama",
"ollama_url_description": "URL pour l'API Ollama (par défaut: http://localhost:11434)",
"ollama_model_description": "Model Ollama utilisé pour la complétion",
"anthropic_configuration": "Configuration Anthropic",
"voyage_configuration": "Configuration IA Voyage",
"voyage_url_description": "Défaut: https://api.voyageai.com/v1",
"ollama_configuration": "Configuration Ollama"
} }
} }

View File

@@ -692,7 +692,8 @@
"placeholder_search": "ノート名で検索", "placeholder_search": "ノート名で検索",
"dialog_title": "埋め込みノート", "dialog_title": "埋め込みノート",
"box_size_prompt": "埋め込みノート枠のサイズ:", "box_size_prompt": "埋め込みノート枠のサイズ:",
"button_include": "埋め込みノート" "button_include": "埋め込みノート",
"label_note": "ノート"
}, },
"ancestor": { "ancestor": {
"placeholder": "ノート名で検索" "placeholder": "ノート名で検索"

View File

@@ -1 +1,29 @@
{} {
"about": {
"title": "Trilium Notes에 대해서",
"homepage": "홈페이지:",
"app_version": "앱 버전:",
"db_version": "DB 버전:",
"sync_version": "동기화 버전:",
"build_date": "빌드 날짜:",
"build_revision": "빌드 리비전:",
"data_directory": "데이터 경로:"
},
"toast": {
"critical-error": {
"title": "심각한 오류",
"message": "클라이언트 애플리케이션 시작 도중 심각한 오류가 발생했습니다:\n\n{{message}}\n\n이는 스크립트가 예기치 않게 실패하면서 발생한 것일 수 있습니다. 애플리케이션을 안전 모드로 시작한 뒤 문제를 해결해 보세요."
},
"widget-error": {
"title": "위젯 초기화 실패"
}
},
"add_link": {
"add_link": "링크 추가",
"note": "노트",
"search_note": "이름으로 노트 검색하기"
},
"branch_prefix": {
"save": "저장"
}
}

View File

@@ -0,0 +1,9 @@
{
"about": {
"title": "Over Trilium Notes",
"homepage": "Homepagina:",
"app_version": "App versie:",
"db_version": "DB Versie:",
"sync_version": "Sync Versie:"
}
}

View File

@@ -78,7 +78,121 @@
"n_notes_queued_2": "{{ count }} notas enfileiradas para indexação", "n_notes_queued_2": "{{ count }} notas enfileiradas para indexação",
"notes_indexed_0": "{{ count }} nota indexada", "notes_indexed_0": "{{ count }} nota indexada",
"notes_indexed_1": "{{ count }} notas indexadas", "notes_indexed_1": "{{ count }} notas indexadas",
"notes_indexed_2": "{{ count }} notas indexadas" "notes_indexed_2": "{{ count }} notas indexadas",
"temperature": "Temperatura",
"retry_queued": "Nota enfileirada para nova tentativa",
"queued_notes": "Notas Enfileiradas",
"empty_key_warning": {
"voyage": "A chave de API da Voyage API está vazia. Por favor, digite uma chave de API válida.",
"ollama": "A chave de API da Ollama API está vazia. Por favor, digite uma chave de API válida.",
"anthropic": "A chave de API Anthropic está vazia. Por favor, digite uma chave de API válida.",
"openai": "A chave de API OpenAI está vazia. Por favor, digite uma chave de API válida."
},
"not_started": "Não iniciado",
"title": "Configurações de IA",
"processed_notes": "Notas Processadas",
"total_notes": "Total de Notas",
"progress": "Andamento",
"failed_notes": "Notas com Falha",
"last_processed": "Últimas Processadas",
"refresh_stats": "Atualizar Estatísticas",
"enable_ai_features": "Ativar recurso IA/LLM",
"enable_ai_description": "Ativar recursos IA como sumarização de notas, geração de conteúdo, e outras capacidades de LLM",
"openai_tab": "OpenAI",
"anthropic_tab": "Anthropic",
"voyage_tab": "Voyage AI",
"enable_ai": "Ativar recursos IA/LLM",
"provider_configuration": "Configuração de Provedor de IA",
"system_prompt": "Prompt de Sistema",
"system_prompt_description": "Prompt padrão de sistema usado para todas as interações de IA",
"openai_configuration": "Configuração OpenAI",
"openai_settings": "Opções OpenAI",
"api_key": "Chave de API",
"url": "URL Base",
"model": "Modelo",
"openai_api_key_description": "Sua API Key da OpenAI para acessar os serviços de IA",
"anthropic_api_key_description": "Sua API Key da Anthropic para acessar os modelos Claude",
"default_model": "Modelo Padrão",
"openai_model_description": "Exemplos: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
"base_url": "URL Base",
"openai_url_description": "Padrão: https://api.openai.com/v1",
"anthropic_settings": "Configurações Anthropic",
"anthropic_url_description": "URL Base da API Anthropic (padrão: https://api.anthropic.com)",
"anthropic_model_description": "Modelos Claude da Anthropic para completar conversas",
"voyage_settings": "Configurações Voyage AI",
"retry": "Tentar novamente",
"retry_failed": "Falha ao enfileirar nota para nova tentativa",
"max_notes_per_llm_query": "Máximo de Notas por Consulta",
"max_notes_per_llm_query_description": "Número máximo de notas similares para incluir no contexto da IA",
"active_providers": "Provedores Ativos",
"disabled_providers": "Provedores Desativados",
"remove_provider": "Remover provedor da pesquisa",
"restore_provider": "Restaurar provedor na pesquisa",
"similarity_threshold": "Tolerância de Similaridade",
"similarity_threshold_description": "Pontuação máxima de similaridade (0-1) para notas a serem incluídas no contexto das consultas de LLM",
"reprocess_index": "Reconstruir Índice de Pesquisa",
"reprocessing_index": "Reconstruindo…",
"reprocess_index_started": "Otimiação do índice de pesquisa iniciado em plano de fundo",
"reprocess_index_error": "Erro ao reconstruir índice de pesquisa",
"index_rebuild_progress": "Andamento da Reconstrução do Índice",
"index_rebuilding": "Otimizando índice ({{percentage}}%)",
"index_rebuild_complete": "Otimização de índice finalizada",
"index_rebuild_status_error": "Erro ao verificar o estado da reconstrução do índice",
"never": "Nunca",
"processing": "Processando ({{percentage}}%)",
"incomplete": "Incompleto ({{percentage}}%)",
"complete": "Completo (100%)",
"refreshing": "Atualizando…",
"auto_refresh_notice": "Atualizando automaticamente a cada {{seconds}} segundos",
"note_queued_for_retry": "Nota enfileirada para nova tentativa",
"failed_to_retry_note": "Falha ao retentar nota",
"all_notes_queued_for_retry": "Todas as notas com falha enfileiradas para nova tentativa",
"failed_to_retry_all": "Falha ao retentar notas",
"ai_settings": "Configurações IA",
"api_key_tooltip": "Chave de API para acessar o serviço",
"agent": {
"processing": "Processando…",
"thinking": "Pensando…",
"loading": "Carregando…",
"generating": "Gerando…"
},
"name": "IA",
"openai": "OpenAI",
"use_enhanced_context": "Usar contexto aprimorado",
"enhanced_context_description": "Alimentar IA com mais contexto sobre a nota e suas notas relacionadas para melhores respostas",
"show_thinking": "Exibir pensamento",
"enter_message": "Digite sua mensagem…",
"error_contacting_provider": "Erro ao contatar o provedor de IA. Por favor, verifique suas configurações e sua conexão de internet.",
"error_generating_response": "Erro ao gerar resposta da IA",
"index_all_notes": "Indexar Todas as Notas",
"index_status": "Estado do Índice",
"indexed_notes": "Notas Indexadas",
"indexing_stopped": "Indexação interrompida",
"indexing_in_progress": "Indexação em andamento…",
"last_indexed": "Última Indexada",
"note_chat": "Conversa de Nota",
"sources": "Origens",
"start_indexing": "Iniciar Indexação",
"use_advanced_context": "Usar Contexto Avançado",
"ollama_no_url": "Ollama não está configurado. Por favor, digite uma URL válida.",
"chat": {
"root_note_title": "Conversas IA",
"root_note_content": "Esta nota contém suas conversas com IA salvas.",
"new_chat_title": "Nova Conversa",
"create_new_ai_chat": "Criar nova Conversa IA"
},
"create_new_ai_chat": "Criar nova Conversa IA",
"configuration_warnings": "Existem alguns problemas com sua configuração de IA. Por fovor, verifique suas configurações.",
"experimental_warning": "O recurso de LLM atualmente é experimental - você foi avisado.",
"selected_provider": "Provedor Selecionado",
"selected_provider_description": "Escolha o provedor de IA para conversas e recursos de completar",
"select_model": "Selecionar modelo…",
"select_provider": "Selecionar provedor…",
"ai_enabled": "Recursos de IA habilitados",
"ai_disabled": "Recursos de IA desabilitados",
"no_models_found_online": "Nenhum modelo encontrado. Por favor, verifique sua chave de API e as configurações.",
"no_models_found_ollama": "Nenhum modelo Ollama encontrado. Por favor, verifique se o Ollama está em execução.",
"error_fetching": "Erro ao obter modelos: {{error}}"
}, },
"confirm": { "confirm": {
"confirmation": "Confirmação", "confirmation": "Confirmação",
@@ -405,7 +519,7 @@
"share_index": "notas com este rótulo irão listar todas as raízes das notas compartilhadas", "share_index": "notas com este rótulo irão listar todas as raízes das notas compartilhadas",
"display_relations": "nomes das relações separados por vírgula que devem ser exibidos. Todas as outras serão ocultadas.", "display_relations": "nomes das relações separados por vírgula que devem ser exibidos. Todas as outras serão ocultadas.",
"hide_relations": "nomes das relações separados por vírgula que devem ser ocultados. Todas as outras serão exibidas.", "hide_relations": "nomes das relações separados por vírgula que devem ser ocultados. Todas as outras serão exibidas.",
"title_template": "Título padrão das notas criadas como filhas desta nota. O valor é avaliado como uma string JavaScript e pode ser enriquecido com conteúdo dinâmico usando as variáveis injetadas <code>now</code> e <code>parentNote</code>. Exemplos:\n\n<ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n</ul>\n\nVeja a <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki com detalhes</a>, a documentação da API para <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> e para <a href=\"https://day.js.org/docs/en/display/format\">now</a> para mais informações.", "title_template": "título padrão das notas criadas como filhas desta nota. O valor é avaliado como uma string JavaScript \n e pode ser enriquecido com conteúdo dinâmico usando as variáveis injetadas <code>now</code> e <code>parentNote</code>. Exemplos:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Veja a <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki com detalhes</a>, a documentação da API para <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> e para <a href=\"https://day.js.org/docs/en/display/format\">now</a> para mais informações.",
"template": "Esta nota aparecerá na seleção de modelos disponíveis ao criar uma nova nota", "template": "Esta nota aparecerá na seleção de modelos disponíveis ao criar uma nova nota",
"toc": "<code>#toc</code> ou <code>#toc=show</code> irá forçar a exibição do Sumário, <code>#toc=hide</code> irá forçar que ele fique oculto. Se o rótulo não existir, será considerado o ajuste global", "toc": "<code>#toc</code> ou <code>#toc=show</code> irá forçar a exibição do Sumário, <code>#toc=hide</code> irá forçar que ele fique oculto. Se o rótulo não existir, será considerado o ajuste global",
"color": "define a cor da nota na árvore de notas, links etc. Use qualquer valor de cor CSS válido, como 'red' ou #a13d5f", "color": "define a cor da nota na árvore de notas, links etc. Use qualquer valor de cor CSS válido, como 'red' ou #a13d5f",
@@ -414,6 +528,679 @@
"keep_current_hoisting": "Abrir este link não alterará o destaque, mesmo que a nota não seja exibível na subárvore destacada atual.", "keep_current_hoisting": "Abrir este link não alterará o destaque, mesmo que a nota não seja exibível na subárvore destacada atual.",
"execute_button": "Titulo do botão que executará a nota de código atual", "execute_button": "Titulo do botão que executará a nota de código atual",
"exclude_from_note_map": "Notas com este rótulo ficarão ocultas no Mapa de Notas", "exclude_from_note_map": "Notas com este rótulo ficarão ocultas no Mapa de Notas",
"new_notes_on_top": "Novas notas serão criadas no topo da nota raiz, não na parte inferior." "new_notes_on_top": "Novas notas serão criadas no topo da nota raiz, não na parte inferior.",
"execute_description": "Descrição longa da nota de código atualmente exibida junto ao botão executar",
"print_page_size": "Quando exportando para PDF, altera o tamanho da página. Valores suportados: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
"and_more": "... e {{count}} mais.",
"other_notes_with_name": "Outras notas com {{attributeType}} igual a \"{{attributeName}}\"",
"color_type": "Cor",
"run_on_note_creation": "executa quando a nota é criada no backend. Use esta relação se quiser executar o script para todas as notas criadas em uma subárvore específica. Neste caso, crie-a na nota raiz da subárvore e torne-a herdável. Uma nova nota criada dentro da subárvore (qualquer profundidade) irá acionar o script.",
"run_on_child_note_creation": "executa quando uma nova nota é criada sob a nota onde esta relação está definida",
"run_on_note_title_change": "executa quando o título da nota é alterado (inclusive na criação de nota)",
"run_on_note_content_change": "executa quando o conteúdo da nota é alterado (inclusive na criação de nota).",
"run_on_note_change": "executa quando a nota é alterada (inclusive na criação de nota). Não incluí alterações no conteúdo",
"run_on_note_deletion": "executa quando a nota está sendo excluída",
"run_on_branch_creation": "executa quando uma ramificação é criada. Ramificação é uma ligação entre nota pai e nota filha e é criado, por exemplo, ao clonar ou mover uma nota.",
"run_on_branch_change": "executa quando uma remificação é atualizada.",
"run_on_attribute_creation": "executa quando um novo atributo é criado para a nota que define esta relação",
"run_on_attribute_change": " executa quando o atributo é alterado na nota que define esta relação. Também é disparado quando o atributo é excluído",
"widget_relation": "o destino desta relação será executado e renderizado como um widget na barra lateral"
},
"attachments_actions": {
"delete_attachment": "Excluir anexo",
"open_externally": "Abrir externamente",
"open_custom": "Abrir customizado",
"download": "Baixar",
"rename_attachment": "Renomear anexo",
"upload_new_revision": "Enviar nova revisão",
"copy_link_to_clipboard": "Copiar link para a área de transferência",
"convert_attachment_into_note": "Converter anexo para nota",
"upload_success": "Uma nova revisão de anexo foi enviada.",
"upload_failed": "O envio de uma nova revisão de anexo falhou.",
"delete_success": "O anexo '{{title}}' foi excluído.",
"convert_success": "O anexo '{{title}}' foi convertido para uma nota.",
"enter_new_name": "Por favor, digite o novo nome do anexo",
"delete_confirm": "Tem certeza que deseja excluir o anexo '{{title}}'?",
"convert_confirm": "Tem certeza que deseja converter o anexo '{{title}}' em uma nota separada?",
"open_externally_title": "O arquivo será aberto em uma aplicação externa e monitorado por alterações. Você então poderá enviar a versão modificada de volta para o Trilium.",
"open_custom_title": "O arquivo será aberto em uma aplicação externa e monitorado por alterações. Você então poderá enviar a versão modificada de volta para o Trilium.",
"open_externally_detail_page": "A abertura de anexo externamente só está disponível através da página de detalhes. Por favor, primeiro clique nos detalhes do anexo e repita a ação.",
"open_custom_client_only": "A abertura customizada de anexos só pode ser feita usando o cliente de desktop."
},
"attachment_detail": {
"you_can_also_open": ", você também pode abrir o(a) ",
"open_help_page": "Abrir página de ajuda nos anexos",
"list_of_all_attachments": "Lista de todos os anexos",
"attachment_deleted": "Este anexo foi excluído."
},
"ancestor": {
"depth_gt": "é maior que {{count}}",
"label": "Ancestral",
"placeholder": "buscar notas pelo nome",
"depth_label": "profundidade",
"depth_doesnt_matter": "não importa",
"depth_eq": "é exatamente {{count}}",
"direct_children": "filho direto",
"depth_lt": "é menor que {{count}}"
},
"add_relation": {
"add_relation": "Adicionar relação",
"allowed_characters": "Caracteres alfanuméricos, underscore e vírgula são permitidos.",
"relation_name": "nome da relação",
"to": "para",
"target_note": "nota destino",
"create_relation_on_all_matched_notes": "Crie a relação informada em todas as notas correspondentes."
},
"delete_label": {
"label_name_placeholder": "nome da etiqueta",
"label_name_title": "Caracteres alfanuméricos, underscore e vírgula são permitidos.",
"delete_label": "Excluir etiqueta"
},
"rename_label": {
"rename_label": "Renomear etiqueta",
"rename_label_from": "Renomear etiqueta de",
"old_name_placeholder": "nome antigo",
"to": "Para",
"new_name_placeholder": "novo nome",
"name_title": "Caracteres alfanuméricos, underscore e vírgula são permitidos."
},
"execute_script": {
"example_1": "Por exemplo para anexar um texto ao título de uma nota, use este pequeno script:",
"execute_script": "Executar script",
"help_text": "Você pode executar scripts simples nas notas correspondentes.",
"example_2": "Um exemplo mais complexo seria excluir todos os atributos das notas correspondentes:"
},
"attribute_editor": {
"help_text_body1": "Para adicionar uma etiqueta, digite por exemplo <code>#rock</code> ou se você também quer adicionar um valor então por exemplo <code>#year = 2020</code>",
"help_text_body2": "Para relação, digite <code>~author = @</code>, que deve ser exibido um autocompletar onde você pode encontrar a nota desejada.",
"help_text_body3": "Alternativamente, você pode adicionar etiqueta e relação usando o botão <code>+</code> no lado direito.",
"save_attributes": "Salvar atributos <enter>",
"add_a_new_attribute": "Adicionar um novo atributo",
"add_new_label": "Adicionar nova etiqueta <kbd data-command=\"addNewLabel\"></kbd>",
"add_new_relation": "Adicionar nova relação <kbd data-command=\"addNewRelation\"></kbd>",
"add_new_label_definition": "Adicionar nova definição de etiqueta",
"add_new_relation_definition": "Adicionar nova definição de relação",
"placeholder": "Digite as etiquetas e relações aqui"
},
"abstract_bulk_action": {
"remove_this_search_action": "Remover esta ação de busca"
},
"add_label": {
"add_label": "Adicionar etiqueta",
"label_name_placeholder": "nome da etiqueta",
"label_name_title": "Caracteres alfanuméricos, underscore e vírgula são permitidos.",
"to_value": "para o valor",
"new_value_placeholder": "novo valor",
"help_text": "Em todas as notas correspondentes:",
"help_text_item1": "criar a etiqueta indicada se a nota ainda não tiver uma",
"help_text_item2": "ou altere o valor da etiqueta existente",
"help_text_note": "Você também pode chamar este método sem valor, neste caso a etiqueta será atribuída à nota sem valor."
},
"update_label_value": {
"update_label_value": "Atualizar valor da etiqueta",
"label_name_placeholder": "nome da etiqueta",
"label_name_title": "Caracteres alfanuméricos, underscore e vírgula são permitidos.",
"new_value_placeholder": "novo valor",
"to_value": "para o valor",
"help_text": "Em todas as notas correspondentes, altera o valor da etiqueta existente.",
"help_text_note": "Você também pode chamar este método sem um valor, neste caso a etiqueta será à nota sem um valor."
},
"delete_relation": {
"allowed_characters": "Caracteres alfanuméricos, underscore e vírgula são permitidos.",
"delete_relation": "Excluir relação",
"relation_name": "nome da relação"
},
"rename_relation": {
"allowed_characters": "Caracteres alfanuméricos, underscore e vírgula são permitidos.",
"rename_relation": "Renomar relação",
"rename_relation_from": "Renomear relação de",
"old_name": "nome antigo",
"to": "Para",
"new_name": "novo nome"
},
"update_relation_target": {
"allowed_characters": "Caracteres alfanuméricos, underscore e vírgula são permitidos.",
"to": "para",
"target_note": "nota destino",
"on_all_matched_notes": "Em todas as notas correspondentes",
"change_target_note": "alterar nota destino da relação existente",
"update_relation_target": "Atualizar destino da relação",
"update_relation": "Atualizar relação",
"relation_name": "nome da relação"
},
"content_renderer": {
"open_externally": "Abrir externamente"
},
"modal": {
"close": "Fechar"
},
"api_log": {
"close": "Fechar"
},
"attachment_detail_2": {
"will_be_deleted_in": "Este anexo será excluído automaticamente em {{time}}",
"will_be_deleted_soon": "Este anexo será excluído automaticamente em breve",
"deletion_reason": ", porque o anexo não está associado ao conteúdo da nota. Para evitar a exclusão, adicione o anexo novamente ao conteúdo ou converta o anexo em uma nota.",
"role_and_size": "Regra: {{role}}, Tamanho: {{size}}",
"link_copied": "Link do anexo copiado para a área de transferência.",
"unrecognized_role": "Regra desconhecida de anexo '{{role}}'."
},
"bookmark_switch": {
"bookmark": "Favorito",
"bookmark_this_note": "Favoritar esta nota no painel da esquerda",
"remove_bookmark": "Remover favorito"
},
"editability_select": {
"auto": "Auto",
"read_only": "Somente leitura",
"always_editable": "Sempre Editável",
"note_is_editable": "A nota é editável se não for muito longa.",
"note_is_read_only": "A nota é somente leitura, mas pode ser editada com um clique no botão.",
"note_is_always_editable": "A nota é sempre editável, independentemente do seu tamanho."
},
"note-map": {
"button-link-map": "Mapa de Links",
"button-tree-map": "Mapa em Árvore"
},
"tree-context-menu": {
"open-in-a-new-tab": "Abrir em uma nova aba <kbd>Ctrl+Click</kbd>",
"open-in-a-new-split": "Abrir em um novo painel dividido",
"insert-note-after": "Inserir nota após",
"insert-child-note": "Inserir nota filha",
"delete": "Excluir",
"search-in-subtree": "Buscar na subárvore"
},
"command_palette": {
"search_subtree_title": "Buscar na Subárvore",
"search_subtree_description": "Buscar dentro da subárvore atual",
"search_history_title": "Exibir Histórico de Busca",
"search_history_description": "Visualizar buscas anteriores",
"configure_launch_bar_title": "Configurar Barra de Execução"
},
"delete_note": {
"delete_note": "Excluir nota",
"delete_matched_notes": "Excluir notas correspondentes",
"delete_matched_notes_description": "Isso irá excluir as notas correspondentes.",
"undelete_notes_instruction": "Depois da exclusão, é possível desfazer através da janela de Alterações Recentes.",
"erase_notes_instruction": "Para apagar notas permanentemente, você pode fazer isso depois da exclusão indo em Opções -> Outros e clicar no botão \"Apagar notas excluídas agora\"."
},
"delete_revisions": {
"delete_note_revisions": "Excluir revisões da nota",
"all_past_note_revisions": "Todas as revisões anteriores das notas correspondentes serão excluídas. A nota em si será perservada. Ou seja, o histórico da nota será removido."
},
"move_note": {
"move_note": "Mover nota",
"to": "para",
"target_parent_note": "nota pai destino",
"on_all_matched_notes": "Em todas as notas correspondentes"
},
"rename_note": {
"rename_note": "Renomear nota",
"rename_note_title_to": "Renomear título da nota para",
"new_note_title": "novo título da nota",
"click_help_icon": "Clique no ícone de ajuda a direita para ver todas as opções",
"example_note": "<code>Nota</code> - todas as notas correspondentes serão renomeadas para 'Nota'",
"example_new_title": "<code>NOVO: ${note.title}</code> - o título das notas correspondentes receberá o prefixo 'NOVO: '",
"example_date_prefix": "<code>${note.dateCreatedObj.format('MM-DD:')}: ${note.title}</code> - notas correspondentes receberão um prefixo com o mês-dia da data de criação da nota",
"api_docs": "Veja da documentação da API para <a href='https://zadam.github.io/trilium/backend_api/Note.html'>nota</a> e suas <a href='https://day.js.org/docs/en/display/format'>propriedades dateCreatedObj / utcDateCreatedObj</a> para detalhes."
},
"calendar": {
"mon": "Seg",
"tue": "Ter",
"wed": "Qua",
"thu": "Qui",
"fri": "Sex",
"sat": "Sáb",
"sun": "Dom",
"cannot_find_day_note": "Nota do dia não encontrada",
"cannot_find_week_note": "Nota semanal não encontrada",
"january": "Janeiro",
"febuary": "Fevereiro",
"march": "Março",
"april": "Abril",
"may": "Maio",
"june": "Junho",
"july": "Julho",
"august": "Agosto",
"september": "Setembro",
"october": "Outubro",
"november": "Novembro",
"december": "Dezembro"
},
"close_pane_button": {
"close_this_pane": "Fechar este painel"
},
"create_pane_button": {
"create_new_split": "Criar nova divisão"
},
"edit_button": {
"edit_this_note": "Editar esta nota"
},
"show_toc_widget_button": {
"show_toc": "Mostrar Tabela de Conteúdo"
},
"show_highlights_list_widget_button": {
"show_highlights_list": "Mostrar Lista de Destaques"
},
"global_menu": {
"menu": "Menu",
"options": "Opções",
"open_new_window": "Abrir Nova Janela",
"switch_to_mobile_version": "Alternar para Versão Mobile",
"switch_to_desktop_version": "Alternar para Versão Desktop",
"zoom": "Zoom",
"toggle_fullscreen": "Alternar Tela Cheia",
"zoom_out": "Reduzir",
"reset_zoom_level": "Redefinir Zoom",
"zoom_in": "Aumentar",
"configure_launchbar": "Configurar Barra de Lançamento",
"show_shared_notes_subtree": "Exibir Subárvore de Notas Compartilhadas",
"advanced": "Avançado",
"open_dev_tools": "Abrir Ferramentas de Desenvolvedor",
"open_sql_console": "Abrir Console SQL",
"open_sql_console_history": "Abrir Histórico de Console SQL",
"open_search_history": "Abrir Histórico de Busca",
"show_backend_log": "Abrir Log do Servidor",
"reload_frontend": "Recarregar Frontend",
"show_hidden_subtree": "Exibir Subárvore Oculta",
"show_help": "Exibir Ajuda",
"about": "Sobre o Trilium Notes",
"logout": "Sair",
"show-cheatsheet": "Exibir Cheatsheet",
"toggle-zen-mode": "Modo Zen",
"reload_hint": "Recarregar pode ajudar com alguns problemas visuais sem reiniciar toda a aplicação."
},
"zen_mode": {
"button_exit": "Sair do Modo Zen"
},
"sync_status": {
"in_progress": "Sincronização com o servidor em andamento.",
"unknown": "<p>O estado da sincronização será conhecido assim que a próxima tentativa começar.</p><p>Clique para iniciar a sincronização agora.</p>",
"connected_with_changes": "<p>Conectado ao servidor de sincronização.<br>Existem algumas alterações esperando para serem sincronizadas.</p><p>Clique para sincronizar.</p>",
"connected_no_changes": "<p>Conectado ao servidor de sincronização.<br>Todas as alterações já foram sincronizadas.</p><p>Clique para sincronizar.</p>",
"disconnected_with_changes": "<p>A conexão ao servidor de sincronização falhou.<br>Existem algumas alterações esperando para serem sincronizadas.</p><p>Clique para sincronizar.</p>",
"disconnected_no_changes": "<p>A conexão ao servidor de sincronização falhou.<br>Todas as alterações já foram sincronizadas.</p><p>Clique para sincronizar.</p>"
},
"left_pane_toggle": {
"show_panel": "Exibir painel",
"hide_panel": "Esconder painel"
},
"move_pane_button": {
"move_left": "Mover para a esquerda",
"move_right": "Mover para a direita"
},
"note_actions": {
"convert_into_attachment": "Converter para anexo",
"re_render_note": "Renderizar nota novamente",
"search_in_note": "Buscar na nota",
"note_source": "Código Fonte da nota",
"note_attachments": "Anexos da nota",
"open_note_externally": "Abrir nota externamente",
"open_note_custom": "Abrir nota de forma customizada",
"import_files": "Importar arquivos",
"export_note": "Exportar nota",
"delete_note": "Excluir nota",
"print_note": "Imprimir nota",
"save_revision": "Salvar revisão",
"convert_into_attachment_failed": "A conversão da nota '{{title}}' falhou.",
"convert_into_attachment_successful": "A nota '{{title}}' foi convertida para anexo.",
"print_pdf": "Exportar como PDF…",
"open_note_externally_title": "O arquivo será aberto em uma aplicação externa e monitorado por alterações. Você então poderá enviar a versão modificada de volta para o Trilium.",
"convert_into_attachment_prompt": "Você tem certeza que quer converter a nota '{{title}}' em um anexo da nota pai?"
},
"protected_session_status": {
"inactive": "Clique para entrar na sessão protegida",
"active": "Sessão protegida está ativada. Clique para deixar a sessão protegida."
},
"revisions_button": {
"note_revisions": "Revisões da Nota"
},
"update_available": {
"update_available": "Atualização disponível"
},
"code_buttons": {
"execute_button_title": "Executar script",
"trilium_api_docs_button_title": "Abrir documentação da Trilium API",
"save_to_note_button_title": "Salvar para uma nota",
"opening_api_docs_message": "Abrindo documentação da API…",
"sql_console_saved_message": "Nota do Console SQL foi salva no caminho {{note_path}}"
},
"hide_floating_buttons_button": {
"button_title": "Esconder botões"
},
"show_floating_buttons_button": {
"button_title": "Exibir botões"
},
"svg_export_button": {
"button_title": "Exportar diagrama como SVG"
},
"relation_map_buttons": {
"zoom_in_title": "Aumentar",
"zoom_out_title": "Reduzir",
"create_child_note_title": "Criar nova nota filha e adicione neste mapa de relação"
},
"zpetne_odkazy": {
"backlink": "{{count}} Links Reversos",
"backlinks": "{{count}} Links Reversos",
"relation": "relação"
},
"mobile_detail_menu": {
"insert_child_note": "Inserir nota filha",
"delete_this_note": "Excluir essa nota",
"error_unrecognized_command": "Comando não reconhecido {{command}}"
},
"note_icon": {
"change_note_icon": "Alterar ícone da nota",
"category": "Categoria:",
"search": "Busca:",
"reset-default": "Redefinir para o ícone padrão"
},
"basic_properties": {
"note_type": "Tipo da nota",
"editable": "Editável",
"basic_properties": "Propriedades Básicas",
"language": "Idioma"
},
"book_properties": {
"view_type": "Tipo de visualização",
"grid": "Grade",
"list": "Lista",
"collapse_all_notes": "Recolher todas as notas",
"expand_all_children": "Expandir todos os filhos",
"collapse": "Recolher",
"expand": "Expandir",
"book_properties": "Propriedades da Coleção",
"invalid_view_type": "Tipo de visualização inválido '{{type}}'",
"calendar": "Calendário",
"table": "Tabela",
"geo-map": "Geo Map",
"board": "Quadro"
},
"edited_notes": {
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…",
"title": "Notas Editadas",
"deleted": "(excluído)"
},
"file_properties": {
"note_id": "ID da Nota",
"original_file_name": "Nome original do arquivo",
"file_type": "Tipo do arquivo",
"file_size": "Tamanho do arquivo",
"download": "Baixar",
"open": "Abrir",
"upload_new_revision": "Enviar nova revisão",
"upload_success": "Uma nova revisão de arquivo foi enviada.",
"upload_failed": "O envio de uma nova revisão de arquivo falhou.",
"title": "Arquivo"
},
"image_properties": {
"original_file_name": "Nome original do arquivo",
"file_type": "Tipo do arquivo",
"file_size": "Tamanho do arquivo",
"download": "Baixar",
"open": "Abrir",
"copy_reference_to_clipboard": "Copiar referência para a área de transferência",
"upload_new_revision": "Enviar nova revisão",
"upload_success": "Uma nova revisão de imagem foi enviado.",
"upload_failed": "O envio de uma nova revisão de imagem falhou: {{message}}",
"title": "Imagem"
},
"inherited_attribute_list": {
"title": "Atributos Herdados",
"no_inherited_attributes": "Nenhum atributo herdado."
},
"note_info_widget": {
"note_id": "ID da Nota",
"created": "Criado",
"modified": "Editado",
"type": "Tipo",
"note_size": "Tamanho da nota",
"calculate": "calcular",
"title": "Informações da nota",
"subtree_size": "(tamanho da subárvore: {{size}} em {{count}} notas)"
},
"note_map": {
"open_full": "Expandir completamente",
"collapse": "Recolher para tamanho normal",
"title": "Mapa de Notas",
"fix-nodes": "Fixar nós",
"link-distance": "Distância do Link"
},
"note_paths": {
"title": "Caminho das Notas",
"clone_button": "Clonar nota para novo local…",
"intro_placed": "Esta nova está localizada nos caminhos:",
"intro_not_placed": "Esta nota ainda não está em nenhuma árvore de notas.",
"archived": "Arquivado",
"search": "Pesquisar"
},
"note_properties": {
"this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:",
"info": "Informações"
},
"promoted_attributes": {
"promoted_attributes": "Atributos Promovidos",
"unset-field-placeholder": "não atribuído",
"open_external_link": "Abrir link externo",
"unknown_label_type": "Tipo de etiqueta desconhecido '{{type}}'",
"unknown_attribute_type": "Tipo de atributo desconhecido '{{type}}'",
"add_new_attribute": "Adicionar novo atributo",
"remove_this_attribute": "Remover este atributo",
"remove_color": "Remover a etiqueta de cor"
},
"script_executor": {
"query": "Consulta",
"script": "Script",
"execute_query": "Executar Consulta",
"execute_script": "Executar Script"
},
"search_definition": {
"add_search_option": "Adicionar opção de pesquisa:",
"search_string": "pesquisa de texto",
"search_script": "pesquisa de script",
"ancestor": "ancestral",
"fast_search": "pesquisa rápida",
"include_archived": "incluir arquivados",
"order_by": "ordenar por",
"limit": "limite",
"limit_description": "Limitar número de resultados",
"debug": "depurar",
"action": "ação",
"search_button": "Pesquisar <kbd>enter</kbd>",
"search_execute": "Pesquisar & Executar ações",
"save_to_note": "Salvar para nota",
"search_parameters": "Parâmetros de Pesquisa",
"unknown_search_option": "Opção de pesquisa desconhecida {{searchOptionName}}",
"actions_executed": "As ações foram executadas.",
"search_note_saved": "Nota de pesquisa foi salva em {{- notePathTitle}}"
},
"similar_notes": {
"title": "Notas Similares",
"no_similar_notes_found": "Nenhum nota similar encontrada."
},
"abstract_search_option": {
"remove_this_search_option": "Remover esta opção de pesquisa",
"failed_rendering": "A renderização da opção de busca falhou: {{dto}} com o erro: {{error}} {{stack}}"
},
"debug": {
"debug": "Depurar"
},
"fast_search": {
"fast_search": "Pesquisa rápida"
},
"include_archived_notes": {
"include_archived_notes": "Incluir notas arquivadas"
},
"limit": {
"limit": "Limite",
"take_first_x_results": "Pegar apenas os X primeiros resultados."
},
"order_by": {
"order_by": "Ordenar por",
"relevancy": "Relevância (padrão)",
"title": "Título",
"date_created": "Data de criação",
"date_modified": "Data da última modificação",
"content_size": "Tamaho do conteúdo da nota",
"content_and_attachments_size": "Tamanho do conteúdo da nota incluindo anexos",
"content_and_attachments_and_revisions_size": "Tamanho do conteúdo da nota incluindo anexos e revisões",
"revision_count": "Número de revisões",
"children_count": "Número de notas filhas",
"parent_count": "Número de clones",
"owned_label_count": "Número de etiquetas",
"owned_relation_count": "Número de relações",
"target_relation_count": "Número de relações para esta nota",
"random": "Ordem aleatória",
"asc": "Crescente (padrão)",
"desc": "Decrescente"
},
"search_script": {
"title": "Buscar script:",
"placeholder": "buscar notas pelo nome",
"example_title": "Veja este exemplo:",
"example_code": "// 1. pré-filtro usando pesquisa padrão\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. aplicando critérios de pesquisa customizados\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;"
},
"search_string": {
"title_column": "Buscar texto:",
"search_syntax": "Sintaxe de pesquisa",
"also_see": "veja também",
"full_text_search": "Digite qualquer texto para busca por texto completo",
"label_abc": "retorna notas com a etiqueta abc",
"label_year": "corresponde notas com a etiqueta de ano 2019",
"label_rock_pop": "corresponde notas que tenham tanto a etiqueta rock quando pop",
"label_rock_or_pop": "apenas uma das etiquetas deve estar presente",
"label_year_comparison": "comparação numérica (também >, >=, <).",
"label_date_created": "notas criadas no último mês",
"error": "Erro na busca: {{error}}",
"search_prefix": "Busca:"
},
"attachment_list": {
"open_help_page": "Abrir página de ajuda nos anexos",
"upload_attachments": "Enviar anexos",
"no_attachments": "Esta nota não possuí anexos."
},
"editable_code": {
"placeholder": "Digite o conteúdo da sua nota de código aqui…"
},
"editable_text": {
"placeholder": "Digite o conteúdo da sua nota aqui…"
},
"empty": {
"search_placeholder": "buscar uma nota pelo nome",
"enter_workspace": "Entrar no workspace {{title}}"
},
"file": {
"file_preview_not_available": "Prévia não disponível para este formato de arquivo."
},
"protected_session": {
"enter_password_instruction": "É necessário digitar sua senha para mostar notas protegidas:",
"started": "A sessão protegida foi iniciada.",
"wrong_password": "Senha incorreta.",
"protecting-finished-successfully": "A proteção foi finalizada com sucesso.",
"unprotecting-finished-successfully": "A remoção da proteção foi finalizada com sucesso.",
"protecting-in-progress": "Proteções em andamento: {{count}}",
"unprotecting-in-progress-count": "Remoções de proteção em andamento: {{count}}",
"protecting-title": "Estado da proteção",
"unprotecting-title": "Estado da remoção de proteção"
},
"relation_map": {
"open_in_new_tab": "Abrir em nova aba",
"remove_note": "Remover nota",
"edit_title": "Editar título",
"rename_note": "Renomear nota",
"enter_new_title": "Digite o novo título da nota:",
"remove_relation": "Remover relação",
"confirm_remove_relation": "Tem certeza que deseja remover esta relação?",
"connection_exists": "A conexão '{{name}}' já existe entre estas notas.",
"note_not_found": "Nota {{noteId}} não encontrada!",
"note_already_in_diagram": "A nota \"{{title}}\" já está no diagrama.",
"enter_title_of_new_note": "Digite o título da nova nota",
"default_new_note_title": "nova nota",
"click_on_canvas_to_place_new_note": "Clique no quadro para incluir uma nova nota"
},
"web_view": {
"web_view": "Web View"
},
"backend_log": {
"refresh": "Recarregar"
},
"consistency_checks": {
"title": "Chegagem de Consistência",
"find_and_fix_button": "Encontrar e corrigir problemas de consistência",
"finding_and_fixing_message": "Buscando e corrigindo problemas de consistência…",
"issues_fixed_message": "Qualquer problema de consistência encontrado foi corrigido."
},
"database_integrity_check": {
"check_button": "Verificar integridade do banco de dados",
"checking_integrity": "Verificando integridade do banco de dados…",
"integrity_check_succeeded": "Verificação de integridade bem sucedida - nenhum problema encontrado.",
"integrity_check_failed": "Verificação de integridade falhou: {{results}}"
},
"sync": {
"title": "Sincronizar",
"force_full_sync_button": "Forçar sincronização completa",
"full_sync_triggered": "Sincronização completa iniciada",
"finished-successfully": "Sincronização finalizada com sucesso.",
"failed": "Sincronização falhou: {{message}}"
},
"vacuum_database": {
"description": "Isso irá reconstruir o banco de dados, o que normalmente irá resultar em uma redução do arquivo do banco de dados. Nenhum dado será alterado."
},
"fonts": {
"theme_defined": "Tema definido",
"fonts": "Fontes",
"main_font": "Fonte Principal",
"font_family": "Família da fonte",
"size": "Tamanho",
"note_tree_font": "Fonte da Árvore de Notas",
"note_detail_font": "Fonte Padrão da Nota",
"monospace_font": "Fonte Monospace (código)",
"not_all_fonts_available": "Nem todas as fontes listadas podem estar disponíveis em seu sistema.",
"apply_font_changes": "Para aplicar as alterações de fonte, clique em",
"reload_frontend": "recarregar frontend",
"generic-fonts": "Fontes genéricas",
"sans-serif-system-fonts": "Fontes sem serifa de sistema",
"serif-system-fonts": "Fontes serifadas de sistema",
"monospace-system-fonts": "Fontes monospace de sistema",
"handwriting-system-fonts": "Fontes de escrita à mão de sistema",
"serif": "Serifa",
"sans-serif": "Sem Serifa",
"monospace": "Monospace",
"system-default": "Padrão do Sistema"
},
"max_content_width": {
"title": "Largura do Conteúdo",
"max_width_label": "Largura máxima do conteúdo",
"max_width_unit": "pixels",
"apply_changes_description": "Para aplicar as alterações de largura do conteúdo, clique em",
"reload_button": "recarregar frontend",
"reload_description": "alterações de opções de aparência"
},
"native_title_bar": {
"title": "Barra de Título Nativa (requer recarregar o app)",
"enabled": "ativada",
"disabled": "desativada"
},
"theme": {
"title": "Tema da Aplicação",
"theme_label": "Tema",
"override_theme_fonts_label": "Sobrepor fontes do tema",
"auto_theme": "Legado (Seguir esquema de cor do sistema)",
"light_theme": "Legado (Claro)",
"dark_theme": "Legado (Escuro)",
"triliumnext": "Trilium (Seguir esquema de cor do sistema)",
"triliumnext-light": "Trilium (Claro)",
"triliumnext-dark": "Trilium (Escuro)",
"layout": "Layout",
"layout-vertical-title": "Vertical",
"layout-horizontal-title": "Horizontal",
"layout-vertical-description": "barra de lançamento está a esquerda (padrão)",
"layout-horizontal-description": "barra de lançamento está abaixo da barra de abas, a barra de abas agora tem a largura total."
},
"note_launcher": {
"this_launcher_doesnt_define_target_note": "Este lançador não define uma nota destino."
},
"copy_image_reference_button": {
"button_title": "Copiar referência da imagem para a área de transferência, pode ser colado em uma nota de texto."
} }
} }

View File

@@ -98,7 +98,8 @@
"snapshot_number_limit_unit": "снимков", "snapshot_number_limit_unit": "снимков",
"note_revisions_snapshot_limit_title": "Максимальное количество снимков заметок", "note_revisions_snapshot_limit_title": "Максимальное количество снимков заметок",
"snapshot_number_limit_label": "Максимальное количество снимков:", "snapshot_number_limit_label": "Максимальное количество снимков:",
"erase_excess_revision_snapshots_prompt": "Удалить лишние снимки." "erase_excess_revision_snapshots_prompt": "Удалить лишние снимки.",
"erase_excess_revision_snapshots": "Удалить лишние снимки версий"
}, },
"password": { "password": {
"alert_message": "Пожалуйста, запомните новый пароль. Пароль используется для входа в веб-интерфейс и шифрования защищённых заметок. Если вы забудете пароль, все ваши защищённые заметки будут потеряны навсегда.", "alert_message": "Пожалуйста, запомните новый пароль. Пароль используется для входа в веб-интерфейс и шифрования защищённых заметок. Если вы забудете пароль, все ваши защищённые заметки будут потеряны навсегда.",
@@ -115,10 +116,14 @@
"protected_session_timeout": "Тайм-аут защищенного сеанса", "protected_session_timeout": "Тайм-аут защищенного сеанса",
"protected_session_timeout_label": "Тайм-аут защищенного сеанса:", "protected_session_timeout_label": "Тайм-аут защищенного сеанса:",
"protected_session_timeout_description": "Тайм-аут защищенного сеанса - это период времени, по истечении которого защищенный сеанс удаляется из памяти браузера. Он отсчитывается с момента последнего взаимодействия с защищенными заметками. См", "protected_session_timeout_description": "Тайм-аут защищенного сеанса - это период времени, по истечении которого защищенный сеанс удаляется из памяти браузера. Он отсчитывается с момента последнего взаимодействия с защищенными заметками. См",
"for_more_info": "для получения более подробной информации." "for_more_info": "для получения более подробной информации.",
"reset_confirmation": "Сбросив пароль, вы навсегда потеряете доступ ко всем своим защищённым заметкам. Вы действительно хотите сбросить пароль?",
"password_changed_success": "Пароль изменён. Trilium будет перезагружен после нажатия кнопки «ОК».",
"password_mismatch": "Новые пароли не совпадают.",
"reset_success_message": "Пароль был сброшен. Пожалуйста, установите новый пароль"
}, },
"content_language": { "content_language": {
"description": "Выберите один или несколько языков, которые должны отображаться в разделе «Основные свойства» текстовой заметки, доступной только для чтения или редактируемой. Это позволит реализовать такие функции, как проверка орфографии и поддержка письма справа налево.", "description": "Выберите один или несколько языков, которые должны отображаться в разделе «Общее» текстовой заметки, доступной только для чтения или редактируемой. Это позволит реализовать такие функции, как проверка орфографии и поддержка письма справа налево.",
"title": "Языки контента" "title": "Языки контента"
}, },
"theme": { "theme": {
@@ -133,7 +138,9 @@
"layout-horizontal-title": "Горизонтальный", "layout-horizontal-title": "Горизонтальный",
"auto_theme": "Legacy (следует системной цветовой схеме)", "auto_theme": "Legacy (следует системной цветовой схеме)",
"light_theme": "Legacy (светлая)", "light_theme": "Legacy (светлая)",
"dark_theme": "Legacy (темная)" "dark_theme": "Legacy (темная)",
"layout-horizontal-description": "панель запуска находится под панелью вкладок, панель вкладок теперь занимает всю ширину.",
"layout-vertical-description": "панель запуска находится слева (по умолчанию)"
}, },
"tasks": { "tasks": {
"due": { "due": {
@@ -154,7 +161,8 @@
"reopen_last_tab": "Повторно открыть последнюю закрытую вкладку", "reopen_last_tab": "Повторно открыть последнюю закрытую вкладку",
"close_all_tabs": "Закрыть все вкладки", "close_all_tabs": "Закрыть все вкладки",
"close_other_tabs": "Закрыть остальные вкладки", "close_other_tabs": "Закрыть остальные вкладки",
"add_new_tab": "Добавить новую вкладку" "add_new_tab": "Добавить новую вкладку",
"close_right_tabs": "Закрыть вкладки справа"
}, },
"table_view": { "table_view": {
"new-row": "Новая строка", "new-row": "Новая строка",
@@ -182,7 +190,10 @@
"label_name_title": "Разрешены буквенно-цифровые символы, подчеркивание и двоеточие.", "label_name_title": "Разрешены буквенно-цифровые символы, подчеркивание и двоеточие.",
"new_value_placeholder": "новое значение", "new_value_placeholder": "новое значение",
"to_value": "на значение", "to_value": "на значение",
"help_text": "На всех совпадающих заметках:" "help_text": "На всех совпадающих заметках:",
"help_text_note": "Вы также можете вызвать этот метод без значения, в таком случае метка будет присвоена заметке без значения.",
"help_text_item1": "создать заданную метку, если у заметки ее еще нет",
"help_text_item2": "или изменить значение существующей метки"
}, },
"delete_label": { "delete_label": {
"delete_label": "Удалить метку", "delete_label": "Удалить метку",
@@ -273,16 +284,17 @@
"selectNote": "выбрать заметку", "selectNote": "выбрать заметку",
"copyNotes": "скопировать активную заметку (или выделение) в буфер обмер (используется для <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">клонирования</a>)", "copyNotes": "скопировать активную заметку (или выделение) в буфер обмер (используется для <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">клонирования</a>)",
"createEditLink": "создать/редактировать внешнюю ссылку", "createEditLink": "создать/редактировать внешнюю ссылку",
"headings": "<code>##</code>, <code>###</code>, <code>####</code> и т. д., за которыми следует пробел для заголовков.", "headings": "<code>##</code>, <code>###</code>, <code>####</code> и т. д., за которыми следует пробел для заголовков",
"bulletList": "<code>*</code> или <code>-</code> с последующим пробелом для маркированного списка", "bulletList": "<code>*</code> или <code>-</code> с последующим пробелом для маркированного списка",
"numberedList": "<code>1.</code> или <code>1)</code> с последующим пробелом для нумерованного списка", "numberedList": "<code>1.</code> или <code>1)</code> с последующим пробелом для нумерованного списка",
"blockQuote": "начните строку с <code>></code>, а затем пробела для блока цитаты", "blockQuote": "начните строку с <code>></code>, а затем пробела для блока цитаты",
"quickSearch": "сфокусироваться на полее ввода быстрого поиска", "quickSearch": "сфокусироваться на полее ввода быстрого поиска",
"editNoteTitle": "В области дерева переключится с области дерева на заголовок заметки. Сочетание клавиш Enter из области заголовка заметки переключит фокус на текстовый редактор. <kbd>Ctrl+.</kbd> переключит обратно с редактора на область дерева.", "editNoteTitle": "в области дерева переключится с области дерева на заголовок заметки. Сочетание клавиш Enter из области заголовка заметки переключит фокус на текстовый редактор. <kbd>Ctrl+.</kbd> переключит обратно с редактора на область дерева.",
"title": "Справка" "title": "Справка"
}, },
"modal": { "modal": {
"close": "Закрыть" "close": "Закрыть",
"help_title": "Показать больше информации об этом экране"
}, },
"import": { "import": {
"importIntoNote": "Импортировать в заметку", "importIntoNote": "Импортировать в заметку",
@@ -327,7 +339,7 @@
"password_not_set": { "password_not_set": {
"title": "Пароль не установлен", "title": "Пароль не установлен",
"body1": "Защищенные заметки шифруются с помощью пароля пользователя, но пароль еще не установлен.", "body1": "Защищенные заметки шифруются с помощью пароля пользователя, но пароль еще не установлен.",
"body2": "Чтобы иметь возможность защищать заметки, нажмите <a class=\"open-password-options-button\" href=\"javascript:\">здесь</a>, чтобы установить пароль.", "body2": "Чтобы защитить заметки, нажмите кнопку ниже, чтобы открыть диалоговое окно «Параметры» и установить пароль.",
"go_to_password_options": "Перейти к параметрам пароля" "go_to_password_options": "Перейти к параметрам пароля"
}, },
"protected_session_password": { "protected_session_password": {
@@ -339,7 +351,7 @@
}, },
"recent_changes": { "recent_changes": {
"title": "Последние изменения", "title": "Последние изменения",
"erase_notes_button": "Удалить заметки, помеченные на удаление сейчас", "erase_notes_button": "Стереть удаленные заметки сейчас",
"undelete_link": "восстановить", "undelete_link": "восстановить",
"no_changes_message": "Еще нет изменений...", "no_changes_message": "Еще нет изменений...",
"deleted_notes_message": "Удаленные заметки были стерты окончательно.", "deleted_notes_message": "Удаленные заметки были стерты окончательно.",
@@ -389,7 +401,7 @@
"upload_attachments": { "upload_attachments": {
"upload_attachments_to_note": "Загрузить вложения к заметке", "upload_attachments_to_note": "Загрузить вложения к заметке",
"choose_files": "Выберите файлы", "choose_files": "Выберите файлы",
"files_will_be_uploaded": "Файлы будут загружены как приложения в", "files_will_be_uploaded": "Файлы будут загружены как приложения в {{noteTitle}}",
"options": "Параметры", "options": "Параметры",
"shrink_images": "Сжать изображения", "shrink_images": "Сжать изображения",
"tooltip": "Если этот параметр включен, Trilium попытается уменьшить размер загружаемых изображений путём масштабирования и оптимизации, что может повлиять на воспринимаемое качество изображения. Если этот параметр не включен, изображения будут загружаться без изменений.", "tooltip": "Если этот параметр включен, Trilium попытается уменьшить размер загружаемых изображений путём масштабирования и оптимизации, что может повлиять на воспринимаемое качество изображения. Если этот параметр не включен, изображения будут загружаться без изменений.",
@@ -425,7 +437,7 @@
"target_note_title": "Отношение — это именованная связь между исходной и целевой заметками.", "target_note_title": "Отношение — это именованная связь между исходной и целевой заметками.",
"promoted_title": "Выделенный атрибут отображается в заметке явно.", "promoted_title": "Выделенный атрибут отображается в заметке явно.",
"promoted": "Выделенный", "promoted": "Выделенный",
"promoted_alias_title": "Название, которое будет отображаться в интерфейсе выделенных атрибутов.", "promoted_alias_title": "Название, которое будет отображаться в интерфейсе продвигаемых атрибутов.",
"multiplicity_title": "Множественность определяет, сколько атрибутов с одним и тем же именем можно создать — максимум 1 или более 1.", "multiplicity_title": "Множественность определяет, сколько атрибутов с одним и тем же именем можно создать — максимум 1 или более 1.",
"label_type_title": "Тип метки поможет Trilium выбрать подходящий интерфейс для ввода значения метки.", "label_type_title": "Тип метки поможет Trilium выбрать подходящий интерфейс для ввода значения метки.",
"precision_title": "Какое количество цифр после плавающей запятой должно быть доступно в интерфейсе настройки значения.", "precision_title": "Какое количество цифр после плавающей запятой должно быть доступно в интерфейсе настройки значения.",
@@ -446,10 +458,10 @@
"run_at_hour": "В какой час это должно выполняться? Следует использовать вместе с <code>#run=hourly</code>. Можно задать несколько раз для большего количества запусков в течение дня.", "run_at_hour": "В какой час это должно выполняться? Следует использовать вместе с <code>#run=hourly</code>. Можно задать несколько раз для большего количества запусков в течение дня.",
"disable_inclusion": "скрипты с этой меткой не будут включены в выполнение родительского скрипта.", "disable_inclusion": "скрипты с этой меткой не будут включены в выполнение родительского скрипта.",
"sorted": "сохраняет алфавитную сортировку дочерних заметок", "sorted": "сохраняет алфавитную сортировку дочерних заметок",
"sort_direction": "ASC (по умолчанию) или DESC", "sort_direction": "ASC (по возрастани, по умолчанию) или DESC (по убыванию)",
"sort_folders_first": "Папки (заметки, включая дочерние) должны быть отсортированы вверх", "sort_folders_first": "Папки (заметки, включая дочерние) должны быть отсортированы вверх",
"top": "закрепить заданную заметку наверху в ее родителе (применяется только к отсортированным родительским заметкам)", "top": "закрепить заданную заметку наверху в ее родителе (применяется только к отсортированным родительским заметкам)",
"hide_promoted_attributes": "Скрыть выделенные атрибуты в этой заметке", "hide_promoted_attributes": "Скрыть продвигаемых атрибуты в этой заметке",
"read_only": "редактор находится в режиме только для чтения. Работает только с текстом и заметками типа \"код\".", "read_only": "редактор находится в режиме только для чтения. Работает только с текстом и заметками типа \"код\".",
"auto_read_only_disabled": "текстовые/заметки с кодом могут автоматически переводиться в режим чтения, если они слишком большие. Вы можете отключить это поведение для каждой заметки, добавив к ней соответствующую метку", "auto_read_only_disabled": "текстовые/заметки с кодом могут автоматически переводиться в режим чтения, если они слишком большие. Вы можете отключить это поведение для каждой заметки, добавив к ней соответствующую метку",
"app_css": "отмечает заметки CSS, которые загружаются в приложение Trilium и, таким образом, могут использоваться для изменения внешнего вида Trilium.", "app_css": "отмечает заметки CSS, которые загружаются в приложение Trilium и, таким образом, могут использоваться для изменения внешнего вида Trilium.",
@@ -461,10 +473,64 @@
"workspace_template": "Эта заметка появится в списке доступных шаблонов при создании новой заметки, но только если она будет перемещена в рабочую область, содержащую этот шаблон", "workspace_template": "Эта заметка появится в списке доступных шаблонов при создании новой заметки, но только если она будет перемещена в рабочую область, содержащую этот шаблон",
"workspace_search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки при перемещении их к какому-либо предку этой заметки рабочей области", "workspace_search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки при перемещении их к какому-либо предку этой заметки рабочей области",
"workspace_calendar_root": "Определяет корень календаря для каждого рабочего пространства", "workspace_calendar_root": "Определяет корень календаря для каждого рабочего пространства",
"hide_highlight_widget": "Скрыть виджет «Список выделенного»", "hide_highlight_widget": "Скрыть виджет «Выделенное»",
"is_owned_by_note": "принадлежит записке", "is_owned_by_note": "принадлежит записке",
"and_more": "... и ещё {{count}}.", "and_more": "... и ещё {{count}}.",
"app_theme": "отмечает заметки CSS, которые являются полноценными темами Trilium и, таким образом, доступны в опциях Trilium." "app_theme": "отмечает заметки CSS, которые являются полноценными темами Trilium и, таким образом, доступны в опциях Trilium.",
"title_template": "Заголовок по умолчанию для заметок, создаваемых как дочерние элементы данной заметки. Значение вычисляется как строка JavaScript\n и, таким образом, может быть дополнено динамическим контентом с помощью внедренных переменных <code>now</code> и <code>parentNote</code>. Примеры:\n \n <ul>\n <li><code>Литературные произведения ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Лог для ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">вики</a>, документации API для <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> и <a href=\"https://day.js.org/docs/en/display/format\">now</a>.",
"icon_class": "значение этой метки добавляется в виде CSS-класса к значку в дереве, что помогает визуально различать заметки в дереве. Примером может служить bx bx-home — значки берутся из boxicons. Может использоваться в шаблонах заметок.",
"share_favicon": "Заметка о фавиконе должна быть размещена на странице общего доступа. Обычно её назначают корневой папке общего доступа и делают наследуемой. Заметка о фавиконе также должна находиться в поддереве общего доступа. Рассмотрите возможность использования атрибута 'share_hidden_from_tree'.",
"inbox": "расположение папки «Входящие» по умолчанию для новых заметок — при создании заметки с помощью кнопки «Новая заметка» на боковой панели заметки будут созданы как дочерние заметки в заметке, помеченной меткой <code>#inbox</code>.",
"share_css": "CSS-заметка, которая будет добавлена на страницу общего доступа. CSS-заметка также должна находиться в общем поддереве. Также рассмотрите возможность использования 'share_hidden_from_tree' и 'share_omit_default_css'.",
"run_on_branch_deletion": "выполняется при удалении ветви. Ветка — это связь между родительской и дочерней заметками и удаляется, например, при перемещении заметки (старая ветвь/ссылка удаляется).",
"share_template": "Встроенная заметка JavaScript, которая будет использоваться в качестве шаблона для отображения общей заметки. Возвращается к шаблону по умолчанию. Рекомендуется использовать 'share_hidden_from_tree'.",
"print_page_size": "При экспорте в PDF изменяет размер страницы. Поддерживаемые значения: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
"keyboard_shortcut": "Определяет сочетание клавиш для немедленного перехода к этой заметке. Пример: Ctrl+Alt+E. Для вступления изменений в силу требуется перезагрузка интерфейса.",
"new_notes_on_top": "Новые заметки будут создаваться вверху родительской заметки, а не внизу.",
"print_landscape": "При экспорте в PDF изменяет ориентацию страницы с книжной на альбомную.",
"hide_relations": "имена отношений, которые следует скрыть, разделённые запятыми. Все остальные будут отображены.",
"run_on_note_change": "выполняется при изменении заметки (включая создание заметки). Не включает изменения содержимого",
"display_relations": "названия отношений, разделённые запятыми, которые следует отобразить. Все остальные будут скрыты.",
"template": "Эта заметка появится в списке доступных шаблонов при создании новой заметки",
"execute_button": "Название кнопки, которая выполнит текущую заметку типа \"Код\"",
"page_size": "количество элементов на странице в списке заметок",
"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",
"search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки",
"workspace_inbox": "расположение в папке «Входящие» по умолчанию для новых заметок при перемещении их в некую родственную папку этой заметки в рабочей области",
"sql_console_home": "расположение заметок консоли SQL по умолчанию",
"css_class": "значение этой метки затем добавляется как CSS-класс к узлу, представляющему данную заметку в дереве. Это может быть полезно для изменения внешнего вида заметки. Может использоваться в шаблонах заметок.",
"bookmark_folder": "заметка с этой меткой появится в закладках как папка (с предоставлением доступа к ее дочерним элементам)",
"share_hidden_from_tree": "эта заметка скрыта в левом навигационном дереве, но по-прежнему доступна по ее URL-адресу",
"share_external_link": "заметка будет действовать как ссылка на внешний веб-сайт в дереве общего доступа",
"share_alias": "определить псевдоним, с помощью которого заметка будет доступна по адресу https://ссылкаааш_trilium/share/[ваш_псевдоним]",
"share_omit_default_css": "CSS-код страницы общего доступа по умолчанию будет пропущен. Используйте его при внесении существенных изменений в стили.",
"share_root": "помечает заметку, которая будет выступать корневой страницей /share общедоступного сайта.",
"share_description": "определение текста, который будет добавлен в HTML-тег meta для описания",
"share_raw": "заметка будет передана в исходном виде, без HTML-обертки",
"share_disallow_robot_indexing": "запретит индексацию этой заметки роботами через заголовок <code>X-Robots-Tag: noindex</code>",
"share_credentials": "для доступа к этой общедоступной заметке требуются учётные данные. Значение должно быть в формате 'имя пользователя:пароль'. Не забудьте сделать этот атрибут наследуемым для применения к дочерним заметкам/изображениям.",
"share_index": "заметка с этой меткой будет содержать список всех корневых узлов общедоступных заметок",
"toc": "<code>#toc</code> или <code>#toc=show</code> принудительно отобразят оглавление, <code>#toc=hide</code> — скроют его. Если метка отсутствует, применяется глобальная настройка",
"color": "определяет цвет заметки в дереве заметок, ссылках и т. д. Используйте любое допустимое значение цвета CSS, например «red» или #a13d5f",
"keep_current_hoisting": "Открытие этой ссылки не изменит закрепление, даже если заметка не отображается в текущем закрепленном поддереве.",
"execute_description": "Более подробное описание текущей заметки типа \"Код\", отображаемое вместе с кнопкой \"Выполнить\"",
"run_on_note_creation": "выполняется при создании заметки на сервере. Используйте это отношение, если хотите запустить скрипт для всех заметок, созданных в определённом поддереве. В этом случае создайте его в корневой заметке поддерева и сделайте его наследуемым. Новая заметка, созданная в поддереве (любой глубины), запустит скрипт.",
"run_on_child_note_creation": "выполняется, когда создается новая заметка под заметкой, в которой определено это отношение",
"run_on_note_title_change": "выполняется при изменении заголовка заметки (включая создание заметки)",
"run_on_note_content_change": "выполняется при изменении содержимого заметки (включая создание заметки).",
"run_on_note_deletion": "выполняется при удалении заметки",
"run_on_branch_creation": "выполняется при создании ветви. Ветвь — это связующее звено между родительской и дочерней заметками и создаётся, например, при клонировании или перемещении заметки.",
"run_on_branch_change": "выполняется при обновлении ветки.",
"run_on_attribute_creation": "выполняется, когда создается новый атрибут для заметка, определяющей это отношение",
"run_on_attribute_change": " выполняется при изменении атрибута заметки, определяющей это отношение. Также срабатывает при удалении атрибута",
"relation_template": "атрибуты заметки будут унаследованы даже без родительско-дочерних отношений. Содержимое заметки и её поддерево будут добавлены к экземпляру заметки, если оно пустое. Подробности см. в документации.",
"inherit": "атрибуты заметки будут унаследованы даже без родительско-дочерних отношений. См. описание шаблонных отношений для получения аналогичной информации. См. раздел «Наследование атрибутов» в документации.",
"render_note": "заметки типа «Рендер HTML» будут отображаться с использованием кодовой заметки (HTML или скрипта), и необходимо указать с помощью этой связи, какую заметку следует отобразить",
"widget_relation": "заметка, на которую ссылается отношение будет выполнена и отображена как виджет на боковой панели",
"share_js": "JavaScript-заметка, которая будет добавлена на страницу общего доступа. JavaScript-заметка также должна находиться в общем поддереве. Рекомендуется использовать 'share_hidden_from_tree'.",
"other_notes_with_name": "Другие заметки с {{attributeType}} названием \"{{attributeName}}\""
}, },
"command_palette": { "command_palette": {
"configure_launch_bar_description": "Откройте конфигурацию панели запуска, чтобы добавить или удалить элементы.", "configure_launch_bar_description": "Откройте конфигурацию панели запуска, чтобы добавить или удалить элементы.",
@@ -542,7 +608,8 @@
"not_set": "Не установлен" "not_set": "Не установлен"
}, },
"time_selector": { "time_selector": {
"invalid_input": "Введенное значение времени не является допустимым числом." "invalid_input": "Введенное значение времени не является допустимым числом.",
"minimum_input": "Введенное значение времени должно быть не менее {{minimumSeconds}} секунд."
}, },
"share": { "share": {
"share_root_not_found": "Заметка с меткой #shareRoot не найдена", "share_root_not_found": "Заметка с меткой #shareRoot не найдена",
@@ -550,7 +617,10 @@
"redirect_bare_domain_description": "Перенаправлять анонимных пользователей на страницу общедоступных заметок вместо отображения страницы входа", "redirect_bare_domain_description": "Перенаправлять анонимных пользователей на страницу общедоступных заметок вместо отображения страницы входа",
"show_login_link": "Показать ссылку для аутентификации в интерфейсе общедоступных заметок", "show_login_link": "Показать ссылку для аутентификации в интерфейсе общедоступных заметок",
"show_login_link_description": "Добавить ссылку для аутентификации в нижний колонтитул интерфейса общедоступных заметок", "show_login_link_description": "Добавить ссылку для аутентификации в нижний колонтитул интерфейса общедоступных заметок",
"title": "Настройки общего доступа" "title": "Настройки общего доступа",
"check_share_root": "Проверка состояния корневой заметки для общедоступного сайта",
"share_root_not_shared": "Заметка '{{noteTitle}}' имеет метку #shareRoot, но не является общедоступной",
"share_root_found": "Заметка корня общедоступного сайта '{{noteTitle}}' готова"
}, },
"duration": { "duration": {
"days": "Дни", "days": "Дни",
@@ -564,7 +634,9 @@
"open-location": "Открыть местоположение" "open-location": "Открыть местоположение"
}, },
"geo-map": { "geo-map": {
"unable-to-load-map": "Не удалось загрузить карту." "unable-to-load-map": "Не удалось загрузить карту.",
"create-child-note-instruction": "Щелкните по карте, чтобы создать новую заметку в этом месте, или нажмите Escape, чтобы закрыть ее.",
"create-child-note-title": "Создать новую дочернюю заметку и добавить ее на карту"
}, },
"note_tooltip": { "note_tooltip": {
"quick-edit": "Быстрое редактирование", "quick-edit": "Быстрое редактирование",
@@ -574,7 +646,9 @@
"full-text-search": "Полнотекстовый поиск", "full-text-search": "Полнотекстовый поиск",
"show-recent-notes": "Показать последние заметки", "show-recent-notes": "Показать последние заметки",
"search-for": "Поиск \"{{term}}\"", "search-for": "Поиск \"{{term}}\"",
"clear-text-field": "Очистить текстовое поле" "clear-text-field": "Очистить текстовое поле",
"insert-external-link": "Вставить внешнюю ссылку \"{{term}}\"",
"create-note": "Создать и связать дочернюю заметку \"{{term}}\""
}, },
"electron_integration": { "electron_integration": {
"zoom-factor": "Коэффициент масштабирования", "zoom-factor": "Коэффициент масштабирования",
@@ -592,7 +666,8 @@
"open_note_in_new_split": "Открыть заметку в новой панели" "open_note_in_new_split": "Открыть заметку в новой панели"
}, },
"image_context_menu": { "image_context_menu": {
"copy_image_to_clipboard": "Копировать изображение в буфер обмена" "copy_image_to_clipboard": "Копировать изображение в буфер обмена",
"copy_reference_to_clipboard": "Скопировать ссылку в буфер обмена"
}, },
"electron_context_menu": { "electron_context_menu": {
"paste-as-plain-text": "Вставить как обычный текст", "paste-as-plain-text": "Вставить как обычный текст",
@@ -600,7 +675,8 @@
"copy-link": "Скопировать ссылку", "copy-link": "Скопировать ссылку",
"copy": "Скопировать", "copy": "Скопировать",
"cut": "Вырезать", "cut": "Вырезать",
"search_online": "Поиск \"{{term}}\" в {{searchEngine}}" "search_online": "Поиск \"{{term}}\" в {{searchEngine}}",
"add-term-to-dictionary": "Добавить \"{{term}}\" в словарь"
}, },
"editing": { "editing": {
"editor_type": { "editor_type": {
@@ -631,7 +707,8 @@
}, },
"highlighting": { "highlighting": {
"color-scheme": "Цветовая схема", "color-scheme": "Цветовая схема",
"title": "Блоки кода" "title": "Блоки кода",
"description": "Управляет подсветкой синтаксиса для блоков кода внутри текстовых заметок. Заметки с типом \"Код\" не будут затронуты."
}, },
"editable-text": { "editable-text": {
"auto-detect-language": "Определен автоматически" "auto-detect-language": "Определен автоматически"
@@ -642,7 +719,11 @@
"add-custom-widget": "Добавить пользовательский виджет", "add-custom-widget": "Добавить пользовательский виджет",
"move-to-visible-launchers": "Переместить к видимым лаунчерам", "move-to-visible-launchers": "Переместить к видимым лаунчерам",
"move-to-available-launchers": "Переместить к доступным лаунчерам", "move-to-available-launchers": "Переместить к доступным лаунчерам",
"delete": "Удалить <kbd data-command=\"deleteNotes\"></kbd>" "delete": "Удалить <kbd data-command=\"deleteNotes\"></kbd>",
"add-note-launcher": "Добавить лаунчер заметки",
"add-script-launcher": "Добавить лаунчер скрипта",
"duplicate-launcher": "Создать копию лаунчера <kbd data-command=\"duplicateSubtree\">",
"reset_launcher_confirm": "Вы действительно хотите сбросить \"{{title}}\"? Все данные/настройки в этой заметке (и её дочерних заметках) будут потеряны, а панель запуска будет возвращена в исходное местоположение."
}, },
"toc": { "toc": {
"table_of_contents": "Оглавление", "table_of_contents": "Оглавление",
@@ -660,13 +741,15 @@
"create-child-note": "Создать дочернюю заметку", "create-child-note": "Создать дочернюю заметку",
"save-changes": "Сохранить и применить изменения", "save-changes": "Сохранить и применить изменения",
"saved-search-note-refreshed": "Сохраненная поисковая заметка обновлена.", "saved-search-note-refreshed": "Сохраненная поисковая заметка обновлена.",
"refresh-saved-search-results": "Обновить сохраненные результаты поиска" "refresh-saved-search-results": "Обновить сохраненные результаты поиска",
"automatically-collapse-notes-title": "Заметки будут свернуты после определенного периода бездействия, чтобы навести порядок в дереве."
}, },
"quick-search": { "quick-search": {
"no-results": "Результаты не найдены", "no-results": "Результаты не найдены",
"placeholder": "Быстрый поиск", "placeholder": "Быстрый поиск",
"searching": "Поиск...", "searching": "Поиск...",
"show-in-full-search": "Расширенный поиск" "show-in-full-search": "Расширенный поиск",
"more-results": "... и еще {{number}} результатов."
}, },
"find": { "find": {
"replace_all": "Заменить все", "replace_all": "Заменить все",
@@ -678,7 +761,8 @@
}, },
"template_switch": { "template_switch": {
"template": "Шаблон", "template": "Шаблон",
"toggle-off-hint": "Удалить заметку как шаблон" "toggle-off-hint": "Удалить заметку как шаблон",
"toggle-on-hint": "Сделать заметку шаблоном"
}, },
"note_types": { "note_types": {
"collections": "Коллекции", "collections": "Коллекции",
@@ -702,7 +786,8 @@
"mind-map": "Mind Map", "mind-map": "Mind Map",
"geo-map": "Географическая карта", "geo-map": "Географическая карта",
"ai-chat": "ИИ Чат", "ai-chat": "ИИ Чат",
"task-list": "Список задач" "task-list": "Список задач",
"confirm-change": "Не рекомендуется менять тип заметки, если её содержимое не пустое. Вы всё равно хотите продолжить?"
}, },
"tree-context-menu": { "tree-context-menu": {
"open-in-popup": "Быстрое редактирование", "open-in-popup": "Быстрое редактирование",
@@ -732,7 +817,10 @@
"edit-branch-prefix": "Изменить префикс ветки", "edit-branch-prefix": "Изменить префикс ветки",
"convert-to-attachment": "Преобразовать в приложение", "convert-to-attachment": "Преобразовать в приложение",
"apply-bulk-actions": "Применить массовые действия", "apply-bulk-actions": "Применить массовые действия",
"recent-changes-in-subtree": "Последние изменения в поддереве" "recent-changes-in-subtree": "Последние изменения в поддереве",
"copy-note-path-to-clipboard": "Копировать путь к заметке в буфер обмена",
"convert-to-attachment-confirm": "Вы уверены, что хотите преобразовать выбранные заметки во вложения их родительских заметок?",
"converted-to-attachments": "{{count}} заметок были преобразованы во вложения."
}, },
"info": { "info": {
"closeButton": "Закрыть", "closeButton": "Закрыть",
@@ -770,14 +858,17 @@
"to": "в", "to": "в",
"add_relation": "Добавить отношение", "add_relation": "Добавить отношение",
"relation_name": "название отношения", "relation_name": "название отношения",
"target_note": "целевая заметка" "target_note": "целевая заметка",
"allowed_characters": "Разрешены буквенно-цифровые символы, подчеркивание и двоеточие.",
"create_relation_on_all_matched_notes": "Для всех соответствующих заметок создать заданную связь."
}, },
"rename_relation": { "rename_relation": {
"to": "В", "to": "В",
"rename_relation": "Переименовать отношение", "rename_relation": "Переименовать отношение",
"old_name": "старое наименование", "old_name": "старое наименование",
"new_name": "новое наименование", "new_name": "новое наименование",
"rename_relation_from": "Переименовать отношение из" "rename_relation_from": "Переименовать отношение из",
"allowed_characters": "Разрешены буквенно-цифровые символы, подчеркивание и двоеточие."
}, },
"update_relation_target": { "update_relation_target": {
"to": "в", "to": "в",
@@ -785,7 +876,9 @@
"relation_name": "название отношения", "relation_name": "название отношения",
"target_note": "целевая заметка", "target_note": "целевая заметка",
"update_relation_target": "Обновить целевой элемент отношения", "update_relation_target": "Обновить целевой элемент отношения",
"on_all_matched_notes": "На всех совпадающих заметках" "on_all_matched_notes": "На всех совпадающих заметках",
"allowed_characters": "Разрешены буквенно-цифровые символы, подчеркивание и двоеточие.",
"change_target_note": "изменить целевую заметку существующего отношения"
}, },
"attachments_actions": { "attachments_actions": {
"download": "Скачать", "download": "Скачать",
@@ -799,7 +892,14 @@
"open_custom_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.", "open_custom_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.",
"open_externally_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.", "open_externally_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.",
"copy_link_to_clipboard": "Копировать ссылку в буфер обмена", "copy_link_to_clipboard": "Копировать ссылку в буфер обмена",
"convert_attachment_into_note": "Преобразовать вложение в заметку" "convert_attachment_into_note": "Преобразовать вложение в заметку",
"delete_success": "Вложение \"{{title}}\" удалено.",
"enter_new_name": "Введите новое название вложения",
"upload_success": "Загружена новая версия вложения.",
"upload_failed": "Не удалось загрузить новую версию вложения.",
"delete_confirm": "Вы уверены, что хотите удалить вложение '{{title}}'?",
"convert_confirm": "Вы уверены, что хотите преобразовать вложение '{{title}}' в отдельную заметку?",
"convert_success": "Вложение '{{title}}' преобразовано в заметку."
}, },
"calendar": { "calendar": {
"mon": "Пн", "mon": "Пн",
@@ -867,7 +967,7 @@
"editable": "Изменяемое", "editable": "Изменяемое",
"language": "Язык", "language": "Язык",
"note_type": "Тип", "note_type": "Тип",
"basic_properties": "Общие параметры" "basic_properties": "Общее"
}, },
"book_properties": { "book_properties": {
"grid": "Сетка", "grid": "Сетка",
@@ -886,8 +986,8 @@
}, },
"edited_notes": { "edited_notes": {
"deleted": "(удалено)", "deleted": "(удалено)",
"title": "Отредактированные заметки", "title": "Измененные заметки",
"no_edited_notes_found": "Пока нет отредактированных заметок за этот день..." "no_edited_notes_found": "Пока нет измененных заметок за этот день..."
}, },
"file_properties": { "file_properties": {
"download": "Скачать", "download": "Скачать",
@@ -898,7 +998,8 @@
"file_size": "Размер файла", "file_size": "Размер файла",
"file_type": "Тип файла", "file_type": "Тип файла",
"original_file_name": "Исходное имя файла", "original_file_name": "Исходное имя файла",
"note_id": "ID заметки" "note_id": "ID заметки",
"upload_failed": "Загрузка новой версии файла не удалась."
}, },
"image_properties": { "image_properties": {
"download": "Скачать", "download": "Скачать",
@@ -919,7 +1020,9 @@
"note_id": "ID заметки", "note_id": "ID заметки",
"note_size": "Размер заметки", "note_size": "Размер заметки",
"title": "Информация", "title": "Информация",
"calculate": "подсчитать" "calculate": "подсчитать",
"note_size_info": "Размер заметки позволяет приблизительно оценить требования к объёму хранилища для данной заметки. Он учитывает её содержание и содержание её сохраненных версий.",
"subtree_size": "(размер поддерева: {{size}} в {{count}} заметках)"
}, },
"note_paths": { "note_paths": {
"search": "Поиск", "search": "Поиск",
@@ -927,11 +1030,12 @@
"clone_button": "Клонировать заметку в новое место...", "clone_button": "Клонировать заметку в новое место...",
"intro_placed": "Эта заметка размещена по следующим путям:", "intro_placed": "Эта заметка размещена по следующим путям:",
"intro_not_placed": "Эта заметка еще не помещена в дерево заметок.", "intro_not_placed": "Эта заметка еще не помещена в дерево заметок.",
"outside_hoisted": "Этот путь находится за пределами выделенный заметки, и вам придется снять выделение.", "outside_hoisted": "Этот путь находится за пределами закрепленной заметки, и вам придется снять закрепление.",
"archived": "Архивировано" "archived": "Архивировано"
}, },
"note_properties": { "note_properties": {
"info": "Информация" "info": "Информация",
"this_note_was_originally_taken_from": "Эта заметка была первоначально взята из:"
}, },
"promoted_attributes": { "promoted_attributes": {
"url_placeholder": "http://website...", "url_placeholder": "http://website...",
@@ -989,7 +1093,8 @@
"access_info": "Чтобы получить доступ к отладочной информации, выполните запрос и нажмите «Показать лог бэкенда» в левом верхнем углу." "access_info": "Чтобы получить доступ к отладочной информации, выполните запрос и нажмите «Показать лог бэкенда» в левом верхнем углу."
}, },
"limit": { "limit": {
"limit": "Ограничение" "limit": "Ограничение",
"take_first_x_results": "Взять только первые X указанных результатов."
}, },
"order_by": { "order_by": {
"title": "Названию", "title": "Названию",
@@ -1005,7 +1110,10 @@
"owned_label_count": "Количество меток", "owned_label_count": "Количество меток",
"owned_relation_count": "Количество отношений", "owned_relation_count": "Количество отношений",
"date_modified": "Дата последнего изменения", "date_modified": "Дата последнего изменения",
"children_count": "Количество дочерних заметок" "children_count": "Количество дочерних заметок",
"content_and_attachments_size": "Размер содержимого заметки, включая вложения",
"content_and_attachments_and_revisions_size": "Размер содержимого заметки, включая вложения и версии.",
"target_relation_count": "Количество отношений, направленных на заметку"
}, },
"search_string": { "search_string": {
"search_prefix": "Поиск:", "search_prefix": "Поиск:",
@@ -1020,7 +1128,8 @@
"label_rock_or_pop": "должна присутствовать только одна из vtnjr", "label_rock_or_pop": "должна присутствовать только одна из vtnjr",
"label_year_comparison": "числовое сравнение (также >, >=, <).", "label_year_comparison": "числовое сравнение (также >, >=, <).",
"label_date_created": "заметки, созданные за последний месяц", "label_date_created": "заметки, созданные за последний месяц",
"error": "Ошибка поиска: {{error}}" "error": "Ошибка поиска: {{error}}",
"placeholder": "полнотекстовые ключевые слова, #tag = value..."
}, },
"backend_log": { "backend_log": {
"refresh": "Обновить" "refresh": "Обновить"
@@ -1032,7 +1141,8 @@
"full_sync_triggered": "Полная синхронизация запущена", "full_sync_triggered": "Полная синхронизация запущена",
"finished-successfully": "Синхронизация успешно завершена.", "finished-successfully": "Синхронизация успешно завершена.",
"failed": "Синхронизация не удалась: {{message}}", "failed": "Синхронизация не удалась: {{message}}",
"sync_rows_filled_successfully": "Строки синхронизации успешно заполнены" "sync_rows_filled_successfully": "Строки синхронизации успешно заполнены",
"filling_entity_changes": "Заполнение строк изменений сущностей..."
}, },
"fonts": { "fonts": {
"fonts": "Шрифты", "fonts": "Шрифты",
@@ -1052,7 +1162,10 @@
"sans-serif-system-fonts": "Системные шрифты без засечек", "sans-serif-system-fonts": "Системные шрифты без засечек",
"serif-system-fonts": "Системные шрифты с засечками", "serif-system-fonts": "Системные шрифты с засечками",
"monospace-system-fonts": "Моноширинные системные шрифты", "monospace-system-fonts": "Моноширинные системные шрифты",
"handwriting-system-fonts": "Шрифты системы рукописного ввода" "handwriting-system-fonts": "Шрифты системы рукописного ввода",
"note_tree_and_detail_font_sizing": "Обратите внимание, что размер шрифта дерева и детальной страницы зависит от настройки размера основного шрифта.",
"apply_font_changes": "Чтобы применить изменения шрифта, нажмите",
"not_all_fonts_available": "Не все перечисленные шрифты могут быть доступны в вашей системе."
}, },
"max_content_width": { "max_content_width": {
"max_width_unit": "пикселей", "max_width_unit": "пикселей",
@@ -1129,13 +1242,14 @@
"index_status": "Статус индексирования", "index_status": "Статус индексирования",
"indexed_notes": "Проиндексированные заметки", "indexed_notes": "Проиндексированные заметки",
"indexing_stopped": "Индексирование остановлено", "indexing_stopped": "Индексирование остановлено",
"last_indexed": "Последние проиндексированные", "last_indexed": "Индексировано в последний раз",
"note_chat": "Чат по заметке", "note_chat": "Чат по заметке",
"start_indexing": "Начать индексирование", "start_indexing": "Начать индексирование",
"chat": { "chat": {
"root_note_title": "Чаты с AI", "root_note_title": "Чаты с AI",
"new_chat_title": "Новый чат", "new_chat_title": "Новый чат",
"create_new_ai_chat": "Создать новый чат с ИИ" "create_new_ai_chat": "Создать новый чат с ИИ",
"root_note_content": "В этой заметке содержатся сохраненные вами разговоры в чате ИИ."
}, },
"selected_provider": "Выбранный провайдер", "selected_provider": "Выбранный провайдер",
"select_model": "Выбрать модель...", "select_model": "Выбрать модель...",
@@ -1151,7 +1265,10 @@
"temperature_description": "Контролирует случайность ответов (0 = детерминированный, 2 = максимальная случайность)", "temperature_description": "Контролирует случайность ответов (0 = детерминированный, 2 = максимальная случайность)",
"system_prompt_description": "Системный промпт по умолчанию, используемый для всех взаимодействий с ИИ", "system_prompt_description": "Системный промпт по умолчанию, используемый для всех взаимодействий с ИИ",
"empty_key_warning": { "empty_key_warning": {
"openai": "Ключ API OpenAI пуст. Введите действительный ключ API." "openai": "Ключ API OpenAI пуст. Введите действительный ключ API.",
"ollama": "API-ключ Ollama пуст. Введите действительный API-ключ.",
"voyage": "Ключ API Voyage пуст. Введите действительный ключ API.",
"anthropic": "Ключ API Anthropic пуст. Введите действительный ключ API."
}, },
"openai_api_key_description": "Ваш ключ API OpenAI для доступа к их службам ИИ", "openai_api_key_description": "Ваш ключ API OpenAI для доступа к их службам ИИ",
"provider_precedence_description": "Список провайдеров, разделенных запятыми, в порядке приоритета (например, \"openai,anthropic,ollama\")", "provider_precedence_description": "Список провайдеров, разделенных запятыми, в порядке приоритета (например, \"openai,anthropic,ollama\")",
@@ -1181,7 +1298,37 @@
"failed_to_retry_note": "Не удалось повторить попытку", "failed_to_retry_note": "Не удалось повторить попытку",
"failed_to_retry_all": "Не удалось повторить попытку", "failed_to_retry_all": "Не удалось повторить попытку",
"error_generating_response": "Ошибка генерации ответа ИИ", "error_generating_response": "Ошибка генерации ответа ИИ",
"create_new_ai_chat": "Создать новый чат с ИИ" "create_new_ai_chat": "Создать новый чат с ИИ",
"ai_enabled": "Возможности ИИ активны",
"ai_disabled": "Возможности ИИ неактивны",
"restore_provider": "Восстановить значение провайдера",
"error_fetching": "Ошибка получения списка моделей: {{error}}",
"index_rebuild_status_error": "Ошибка проверки статуса перестроения индекса",
"enhanced_context_description": "Предоставляет ИИ больше контекста из заметки и связанных с ней заметок для более точных ответов",
"n_notes_queued_0": "{{ count }} заметка в очереди на индексирование",
"n_notes_queued_1": "{{ count }} заметки в очереди на индексирование",
"n_notes_queued_2": "{{ count }} заметок в очереди на индексирование",
"no_models_found_ollama": "Модели Ollama не найдены. Проверьте, запущена ли Ollama.",
"no_models_found_online": "Модели не найдены. Проверьте ваш ключ API и настройки.",
"experimental_warning": "Функция LLM в настоящее время является экспериментальной — вы предупреждены.",
"ollama_no_url": "Ollama не настроена. Введите корректный URL-адрес.",
"notes_indexed_0": "{{ count }} заметка проиндексирована",
"notes_indexed_1": "{{ count }} заметки проиндексировано",
"notes_indexed_2": "{{ count }} заметок проиндексировано",
"show_thinking_description": "Показать цепочку мыслительного процесса ИИ",
"api_key_tooltip": "API-ключ для доступа к сервису",
"all_notes_queued_for_retry": "Все неудачные заметки поставлены в очередь на повторную попытку",
"reprocess_index_started": "Оптимизация поискового индекса запущена в фоновом режиме",
"similarity_threshold_description": "Минимальный показатель сходства (similarity score, 01) для заметок, которые следует включить в контекст запросов LLM",
"max_notes_per_llm_query_description": "Максимальное количество похожих заметок для включения в контекст ИИ",
"retry_failed": "Не удалось поставить заметку в очередь для повторной попытки",
"rebuild_index_error": "Ошибка при запуске перестроения индекса. Подробности смотрите в логах.",
"enable_ollama_description": "Включить Ollama для использования локальной модели ИИ",
"anthropic_model_description": "Модели Anthropic Claude для автодополнения чата",
"anthropic_url_description": "Базовый URL для Anthropic API (по умолчанию: https://api.anthropic.com)",
"anthropic_api_key_description": "Ваш ключ Anthropic API для доступа к моделям Claude",
"enable_ai_desc": "Включить функции ИИ, такие как резюмирование заметок, генерация контента и другие возможности LLM",
"enable_ai_description": "Включить функции ИИ, такие как резюмирование заметок, генерация контента и другие возможности LLM"
}, },
"code-editor-options": { "code-editor-options": {
"title": "Редактор" "title": "Редактор"
@@ -1245,7 +1392,7 @@
}, },
"backup": { "backup": {
"path": "Путь", "path": "Путь",
"backup_now": "Резервное копирование сейчас", "backup_now": "Принудительное резервное копирование",
"existing_backups": "Существующие резервные копии", "existing_backups": "Существующие резервные копии",
"automatic_backup": "Автоматическое резервное копирование", "automatic_backup": "Автоматическое резервное копирование",
"automatic_backup_description": "Trilium может автоматически создавать резервную копию базы данных:", "automatic_backup_description": "Trilium может автоматически создавать резервную копию базы данных:",
@@ -1254,7 +1401,9 @@
"enable_monthly_backup": "Включить ежемесячное резервное копирование", "enable_monthly_backup": "Включить ежемесячное резервное копирование",
"backup_database_now": "Создать резервную копию", "backup_database_now": "Создать резервную копию",
"date-and-time": "Дата и время", "date-and-time": "Дата и время",
"no_backup_yet": "нет резервных копий" "no_backup_yet": "нет резервных копий",
"database_backed_up_to": "Резервная копия базы данных создана в {{backupFilePath}}",
"backup_recommendation": "Рекомендуется держать резервное копирование включенным, но это может замедлить запуск приложений при использовании больших баз данных и/или медленных устройств хранения."
}, },
"etapi": { "etapi": {
"title": "ETAPI", "title": "ETAPI",
@@ -1272,7 +1421,14 @@
"swagger_ui": "Пользовательский интерфейс ETAPI Swagger", "swagger_ui": "Пользовательский интерфейс ETAPI Swagger",
"new_token_title": "Новый токен ETAPI", "new_token_title": "Новый токен ETAPI",
"token_created_title": "Создан токен ETAPI", "token_created_title": "Создан токен ETAPI",
"rename_token": "Переименовать этот токен" "rename_token": "Переименовать этот токен",
"new_token_message": "Введите название нового токена",
"error_empty_name": "Имя токена не может быть пустым",
"delete_token": "Удалить/деактивировать этот токен",
"rename_token_message": "Пожалуйста, введите имя нового токена",
"token_created_message": "Скопируйте созданный токен в буфер обмена. Trilium сохранит хеш токена, и вы его больше не сможете увидеть.",
"delete_token_confirmation": "Вы уверены, что хотите удалить токен ETAPI \"{{name}}\"?",
"no_tokens_yet": "Токенов пока нет. Нажмите кнопку выше, чтобы создать токен."
}, },
"multi_factor_authentication": { "multi_factor_authentication": {
"oauth_title": "OAuth/OpenID", "oauth_title": "OAuth/OpenID",
@@ -1296,7 +1452,16 @@
"totp_title": "Одноразовый пароль с ограничением по времени (TOTP)", "totp_title": "Одноразовый пароль с ограничением по времени (TOTP)",
"recovery_keys_title": "Ключи восстановления единого входа", "recovery_keys_title": "Ключи восстановления единого входа",
"recovery_keys_error": "Ошибка генерации кодов восстановления", "recovery_keys_error": "Ошибка генерации кодов восстановления",
"recovery_keys_no_key_set": "Коды восстановления не установлены" "recovery_keys_no_key_set": "Коды восстановления не установлены",
"recovery_keys_unused": "Код восстановления {{index}} не используется",
"description": "Многофакторная аутентификация (MFA) добавляет дополнительный уровень безопасности вашей учётной записи. Вместо простого ввода пароля для входа MFA требует предоставить один или несколько дополнительных документов для подтверждения вашей личности. Таким образом, даже если кто-то узнает ваш пароль, он всё равно не сможет получить доступ к вашей учётной записи без второго элемента данных. Это похоже на установку дополнительного замка на вашу дверь, значительно усложняя взлом.<br><br>Следуйте инструкциям ниже, чтобы включить MFA. Если вы настроите её неправильно, для входа будет использоваться только пароль.",
"totp_description": "TOTP (одноразовый пароль с ограничением по времени) — это функция безопасности, которая генерирует уникальный временный код, который меняется каждые 30 секунд. Вы используете этот код вместе с паролем для входа в свою учётную запись, что значительно затрудняет доступ к ней посторонним лицам.",
"recovery_keys_description_warning": "Ключи восстановления больше не будут отображаться после выхода со страницы, сохраните их в надежном и безопасном месте.<br>После использования ключа восстановления его нельзя будет использовать повторно.",
"totp_secret_regenerate_confirm": "Вы уверены, что хотите восстановить секрет TOTP? Это аннулирует предыдущий секрет TOTP и все существующие коды восстановления.",
"totp_secret_description_warning": "После создания нового секрета TOTP вам потребуется снова войти в систему, используя новый секрет TOTP.",
"recovery_keys_description": "Ключи восстановления единого входа используются для входа в систему, даже если вы не можете получить доступ к своим кодам аутентификатора.",
"totp_secret_warning": "Сохраните сгенерированный секретный ключ в безопасном месте. Он больше не будет показан.",
"no_totp_secret_warning": "Чтобы включить TOTP, вам сначала нужно сгенерировать секрет TOTP."
}, },
"shortcuts": { "shortcuts": {
"shortcuts": "Сочетания клавиш", "shortcuts": "Сочетания клавиш",
@@ -1305,7 +1470,11 @@
"action_name": "Название действия", "action_name": "Название действия",
"default_shortcuts": "Сочетания клавиш по умолчанию", "default_shortcuts": "Сочетания клавиш по умолчанию",
"multiple_shortcuts": "Несколько сочетаний клавиш для одного и того же действия можно разделить запятой.", "multiple_shortcuts": "Несколько сочетаний клавиш для одного и того же действия можно разделить запятой.",
"electron_documentation": "Информацию о доступных модификаторах и кодах клавиш см. в <a href=\"https://www.electronjs.org/docs/latest/api/accelerator\">документации Electron</a>." "electron_documentation": "Информацию о доступных модификаторах и кодах клавиш см. в <a href=\"https://www.electronjs.org/docs/latest/api/accelerator\">документации Electron</a>.",
"type_text_to_filter": "Введите текст для фильтрации сочетаний клавиш...",
"reload_app": "Перезагрузить приложение, чтобы применить изменения",
"confirm_reset": "Вы действительно хотите сбросить все сочетания клавиш до значений по умолчанию?",
"set_all_to_default": "Установить все сочетания клавиш по умолчанию"
}, },
"sync_2": { "sync_2": {
"timeout_unit": "миллисекунд", "timeout_unit": "миллисекунд",
@@ -1320,28 +1489,35 @@
"timeout": "Тайм-аут синхронизации", "timeout": "Тайм-аут синхронизации",
"test_description": "Это проверит подключение и подтверждение связи с сервером синхронизации. Если сервер синхронизации не инициализирован, он будет настроен на синхронизацию с локальным документом.", "test_description": "Это проверит подключение и подтверждение связи с сервером синхронизации. Если сервер синхронизации не инициализирован, он будет настроен на синхронизацию с локальным документом.",
"test_title": "Тест синхронизации", "test_title": "Тест синхронизации",
"test_button": "Проверка синхронизации" "test_button": "Проверка синхронизации",
"handshake_failed": "Синхронизация с сервером не удалась, ошибка: {{message}}"
}, },
"api_log": { "api_log": {
"close": "Закрыть" "close": "Закрыть"
}, },
"bookmark_switch": { "bookmark_switch": {
"bookmark": "В закладки", "bookmark": "В закладки",
"remove_bookmark": "Удалить закладку" "remove_bookmark": "Удалить закладку",
"bookmark_this_note": "Добавить эту заметку в закладки на левой боковой панели"
}, },
"editability_select": { "editability_select": {
"auto": "Авто", "auto": "Авто",
"read_only": "Только для чтения", "read_only": "Только для чтения",
"always_editable": "Всегда доступно для редактирования" "always_editable": "Всегда доступно для редактирования",
"note_is_always_editable": "Заметку всегда можно редактировать, независимо от ее длины.",
"note_is_read_only": "Заметка доступна только для чтения, но ее можно редактировать одним нажатием кнопки.",
"note_is_editable": "Заметку можно редактировать, если она не слишком длинная."
}, },
"shared_switch": { "shared_switch": {
"shared": "Общий доступ", "shared": "Общий доступ",
"toggle-on-title": "Сделать заметку общедоступной", "toggle-on-title": "Сделать заметку общедоступной",
"toggle-off-title": "Отменить общий доступ к заметке" "toggle-off-title": "Отменить общий доступ к заметке",
"shared-branch": "Эта заметка существует только как общая, и если отменить общий доступ, она будет удалена. Хотите продолжить и удалить эту заметку?",
"inherited": "Заметка не может быть убрана из общего доступа в данном случае, поскольку общий доступ передан по наследству от предка."
}, },
"highlights_list_2": { "highlights_list_2": {
"options": "Параметры", "options": "Параметры",
"title": "Список выделений" "title": "Список выделенного"
}, },
"include_note": { "include_note": {
"dialog_title": "Вставить заметку", "dialog_title": "Вставить заметку",
@@ -1354,26 +1530,42 @@
"box_size_prompt": "Размер рамки вставленной заметки:" "box_size_prompt": "Размер рамки вставленной заметки:"
}, },
"execute_script": { "execute_script": {
"execute_script": "Выполнить скрипт" "execute_script": "Выполнить скрипт",
"help_text": "Вы можете выполнять простые скрипты на соответствующих заметках.",
"example_1": "Например, чтобы добавить строку к заголовку заметки, используйте этот небольшой скрипт:",
"example_2": "Более сложным примером будет удаление всех соответствующих атрибутов заметки:"
}, },
"update_label_value": { "update_label_value": {
"label_name_placeholder": "название метки", "label_name_placeholder": "название метки",
"new_value_placeholder": "новое значение", "new_value_placeholder": "новое значение",
"update_label_value": "Обновить значение метки", "update_label_value": "Обновить значение метки",
"to_value": "на значение" "to_value": "на значение",
"help_text_note": "Вы также можете вызвать этот метод без значения, в таком случае метка будет присвоена заметке без значения.",
"label_name_title": "Разрешены буквенно-цифровые символы, подчеркивание и двоеточие.",
"help_text": "На всех соответствующих заметках изменить значение существующей метки."
}, },
"delete_note": { "delete_note": {
"delete_note": "Удалить заметку", "delete_note": "Удалить заметку",
"delete_matched_notes": "Удалить совпадающие заметки" "delete_matched_notes": "Удалить совпадающие заметки",
"delete_matched_notes_description": "Это приведет к удалению соответствующих заметок.",
"erase_notes_instruction": "Чтобы навсегда стереть заметки, после удаления перейдите в раздел «Параметры» -> «Другие» и нажмите кнопку «Стереть удаленные заметки сейчас».",
"undelete_notes_instruction": "После удаления их можно восстановить из диалогового окна «Последние изменения»."
}, },
"rename_note": { "rename_note": {
"rename_note": "Переименовать заметку", "rename_note": "Переименовать заметку",
"new_note_title": "название новой заметки", "new_note_title": "название новой заметки",
"rename_note_title_to": "Переименовать заголовок заметки на" "rename_note_title_to": "Переименовать заголовок заметки на",
"click_help_icon": "Нажмите значок справки справа, чтобы увидеть все параметры",
"evaluated_as_js_string": "Указанное значение обрабатывается как строка JavaScript и, таким образом, может быть дополнено динамическим содержимым через внедренную переменную <code>note</code> (при этом заметка переименовывается). Примеры:",
"example_note": "<code>Note</code> — все соответствующие примечания переименовываются в \"Note\"",
"example_new_title": "<code>NEW: ${note.title}</code> — заголовки соответствующих заметок начинаются с префикса \"NEW:\"",
"example_date_prefix": "<code>${note.dateCreatedObj.format('MM-DD:')}: ${note.title}</code> — соответствующие заметки имеют префикс в виде месяца и даты создания заметки",
"api_docs": "Подробную информацию см. в документации API для <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</a>."
}, },
"delete_relation": { "delete_relation": {
"delete_relation": "Удалить отношение", "delete_relation": "Удалить отношение",
"relation_name": "название отношения" "relation_name": "название отношения",
"allowed_characters": "Разрешены буквенно-цифровые символы, подчеркивание и двоеточие."
}, },
"left_pane_toggle": { "left_pane_toggle": {
"show_panel": "Показать панель", "show_panel": "Показать панель",
@@ -1394,7 +1586,7 @@
"save_revision": "Сохранить версию", "save_revision": "Сохранить версию",
"convert_into_attachment": "Конвертировать во вложение", "convert_into_attachment": "Конвертировать во вложение",
"search_in_note": "Поиск в заметке", "search_in_note": "Поиск в заметке",
"print_pdf": "Экспорт в PDF", "print_pdf": "Экспорт в PDF...",
"convert_into_attachment_prompt": "Вы уверены, что хотите преобразовать заметку '{{title}}' во вложение родительской заметки?", "convert_into_attachment_prompt": "Вы уверены, что хотите преобразовать заметку '{{title}}' во вложение родительской заметки?",
"convert_into_attachment_successful": "Примечание '{{title}}' преобразовано во вложение.", "convert_into_attachment_successful": "Примечание '{{title}}' преобразовано во вложение.",
"convert_into_attachment_failed": "Не удалось преобразовать заметку '{{title}}'.", "convert_into_attachment_failed": "Не удалось преобразовать заметку '{{title}}'.",
@@ -1457,7 +1649,9 @@
}, },
"attachment_list": { "attachment_list": {
"upload_attachments": "Загрузка вложений", "upload_attachments": "Загрузка вложений",
"owning_note": "Заметка-владелец: " "owning_note": "Заметка-владелец: ",
"open_help_page": "Открыть справку по вложениям",
"no_attachments": "Заметка не содержит вложений."
}, },
"protected_session": { "protected_session": {
"wrong_password": "Неверный пароль.", "wrong_password": "Неверный пароль.",
@@ -1467,7 +1661,9 @@
"unprotecting-finished-successfully": "Снятие защиты успешно завершено.", "unprotecting-finished-successfully": "Снятие защиты успешно завершено.",
"start_session_button": "Начать защищенный сеанс <kbd>enter</kbd>", "start_session_button": "Начать защищенный сеанс <kbd>enter</kbd>",
"protecting-in-progress": "Защита в процессе: {{count}}", "protecting-in-progress": "Защита в процессе: {{count}}",
"unprotecting-in-progress-count": "Снятие защиты в процессе: {{count}}" "unprotecting-in-progress-count": "Снятие защиты в процессе: {{count}}",
"started": "Защищенный сеанс запущен.",
"enter_password_instruction": "Для отображения защищенной заметки требуется ввести пароль:"
}, },
"relation_map": { "relation_map": {
"remove_note": "Удалить заметку", "remove_note": "Удалить заметку",
@@ -1479,7 +1675,13 @@
"confirm_remove_relation": "Вы уверены, что хотите удалить отношение?", "confirm_remove_relation": "Вы уверены, что хотите удалить отношение?",
"enter_new_title": "Введите новое название заметки:", "enter_new_title": "Введите новое название заметки:",
"note_not_found": "Заметка {{noteId}} не найдена!", "note_not_found": "Заметка {{noteId}} не найдена!",
"cannot_match_transform": "Невозможно сопоставить преобразование: {{transform}}" "cannot_match_transform": "Невозможно сопоставить преобразование: {{transform}}",
"enter_title_of_new_note": "Введите название новой заметки",
"click_on_canvas_to_place_new_note": "Щелкните по холсту, чтобы разместить новую заметку",
"note_already_in_diagram": "Заметка \"{{title}}\" уже есть на диаграмме.",
"connection_exists": "Связь '{{name}}' между этими заметками уже существует.",
"specify_new_relation_name": "Укажите новое имя отношения (допустимые символы: буквы, цифры, двоеточие и подчеркивание):",
"start_dragging_relations": "Начните перетягивать отношения отсюда на другую заметку."
}, },
"vacuum_database": { "vacuum_database": {
"title": "Сжатие базы данных", "title": "Сжатие базы данных",
@@ -1501,22 +1703,22 @@
"enable_tray": "Включить отображение иконки в системном трее (чтобы изменения вступили в силу, необходимо перезапустить Trilium)" "enable_tray": "Включить отображение иконки в системном трее (чтобы изменения вступили в силу, необходимо перезапустить Trilium)"
}, },
"highlights_list": { "highlights_list": {
"title": "Список выделений", "title": "Список выделенного",
"bold": "Жирный текст", "bold": "Жирный текст",
"italic": "Наклонный текст", "italic": "Наклонный текст",
"underline": "Подчеркнутый текст", "underline": "Подчеркнутый текст",
"color": "Цветной текст", "color": "Цветной текст",
"description": "Вы можете настроить список выделений, отображаемый на правой панели:", "description": "Вы можете настроить список выделенного, отображаемый на правой панели:",
"bg_color": "Текст с заливкой фона", "bg_color": "Текст с заливкой фона",
"visibility_title": "Видимость списка выделений", "visibility_title": "Видимость списка выделений",
"visibility_description": "Вы можете скрыть виджет списка выделений, добавив атрибут #hideHighlightWidget к заметке.", "visibility_description": "Вы можете скрыть виджет списка выделенного, добавив атрибут #hideHighlightWidget к заметке.",
"shortcut_info": "Вы можете настроить сочетание клавиш для быстрого переключения правой панели (включая список выделений) в меню Параметры -> Сочетания клавиш (название \"toggleRightPane\")." "shortcut_info": "Вы можете настроить сочетание клавиш для быстрого переключения правой панели (включая список выделенного) в меню Параметры -> Сочетания клавиш (название \"toggleRightPane\")."
}, },
"custom_date_time_format": { "custom_date_time_format": {
"format_string": "Строка форматирования:", "format_string": "Строка форматирования:",
"formatted_time": "Пример форматирования:", "formatted_time": "Пример форматирования:",
"title": "Пользовательский формат даты и времени", "title": "Пользовательский формат даты и времени",
"description": "Настройте формат даты и времени, вставляемых с помощью <kbd>Alt+T</kbd> или панели инструментов. Доступные токены формата см. в <a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">документации Day.js</a>." "description": "Настройте формат даты и времени, вставляемых с помощью <shortcut /> или панели инструментов. Доступные токены форматирования см. в <doc>документации Day.js</doc>."
}, },
"spellcheck": { "spellcheck": {
"title": "Проверка орфографии", "title": "Проверка орфографии",
@@ -1525,13 +1727,20 @@
"multiple_languages_info": "Несколько языков можно разделять запятой, например, \"en-US, de-DE, cs\". ", "multiple_languages_info": "Несколько языков можно разделять запятой, например, \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Доступные коды языков:", "available_language_codes_label": "Доступные коды языков:",
"restart-required": "Изменения параметров проверки орфографии вступят в силу после перезапуска приложения.", "restart-required": "Изменения параметров проверки орфографии вступят в силу после перезапуска приложения.",
"language_code_placeholder": "например \"en-US\", \"de-AT\"" "language_code_placeholder": "например \"en-US\", \"de-AT\"",
"description": "Эти параметры применимы только для десктопных сборок, браузеры будут использовать собственную встроенную проверку орфографии."
}, },
"attribute_editor": { "attribute_editor": {
"save_attributes": "Сохранить атрибуты <enter>", "save_attributes": "Сохранить атрибуты <enter>",
"add_a_new_attribute": "Добавить новый атрибут", "add_a_new_attribute": "Добавить новый атрибут",
"add_new_label_definition": "Добавить новое определение метки", "add_new_label_definition": "Добавить новое определение метки",
"add_new_relation_definition": "Добавить новое определение отношения" "add_new_relation_definition": "Добавить новое определение отношения",
"add_new_label": "Добавить новую метку <kbd data-command=\"addNewLabel\"></kbd>",
"add_new_relation": "Добавить новое отношение <kbd data-command=\"addNewRelation\"></kbd>",
"help_text_body1": "Чтобы добавить метку, просто введите, например, <code>#rock</code> или, если вы хотите добавить также значение, то, например, <code>#year = 2020</code>",
"help_text_body2": "Для отношения введите <code>~author = @</code>, после чего должно появиться окно автозаполнения, где вы сможете найти нужную заметку.",
"help_text_body3": "В качестве альтернативы вы можете добавить метку и отношение, используя кнопку <code>+</code> с правой стороны.",
"placeholder": "Введите здесь метки и отношения"
}, },
"delete_revisions": { "delete_revisions": {
"delete_note_revisions": "Удалить версии заметки", "delete_note_revisions": "Удалить версии заметки",
@@ -1547,7 +1756,7 @@
"edit_this_note": "Редактировать заметку" "edit_this_note": "Редактировать заметку"
}, },
"show_highlights_list_widget_button": { "show_highlights_list_widget_button": {
"show_highlights_list": "Показать список выделений" "show_highlights_list": "Показать список выделенного"
}, },
"zen_mode": { "zen_mode": {
"button_exit": "Покинуть режим \"дзен\"" "button_exit": "Покинуть режим \"дзен\""
@@ -1587,7 +1796,9 @@
}, },
"protect_note": { "protect_note": {
"toggle-on": "Защитить заметку", "toggle-on": "Защитить заметку",
"toggle-off": "Снять защиту с заметки" "toggle-off": "Снять защиту с заметки",
"toggle-off-hint": "Заметка защищена. Щелкните, чтобы снять защиту",
"toggle-on-hint": "Заметка не защищена. Щелкните, чтобы установить защиту"
}, },
"note-map": { "note-map": {
"button-link-map": "Карта связей", "button-link-map": "Карта связей",
@@ -1604,15 +1815,21 @@
"consistency_checks": { "consistency_checks": {
"find_and_fix_button": "Найти и устранить проблемы целостности", "find_and_fix_button": "Найти и устранить проблемы целостности",
"finding_and_fixing_message": "Поиск и устранение проблем целостности...", "finding_and_fixing_message": "Поиск и устранение проблем целостности...",
"title": "Проверки целостности" "title": "Проверки целостности",
"issues_fixed_message": "Все обнаруженные проблемы с согласованностью теперь устранены."
}, },
"call_to_action": { "call_to_action": {
"next_theme_message": "В настоящее время вы используете старую тему оформления. Хотите попробовать новую тему?", "next_theme_message": "В настоящее время вы используете старую тему оформления. Хотите попробовать новую тему?",
"dismiss": "Отклонить", "dismiss": "Отклонить",
"background_effects_button": "Включить эффекты фона" "background_effects_button": "Включить эффекты фона",
"next_theme_button": "Попробовать новую тему",
"background_effects_message": "На устройствах Windows фоновые эффекты теперь полностью стабильны. Они добавляют цвет в пользовательский интерфейс, размывая фон за ним. Этот приём также используется в других приложениях, например, в проводнике Windows.",
"background_effects_title": "Фоновые эффекты теперь стабильны",
"next_theme_title": "Попробуйте новую тему Trilium"
}, },
"zoom_factor": { "zoom_factor": {
"description": "Масштабированием также можно управлять с помощью сочетаний клавиш CTRL+- и CTRL+=." "description": "Масштабированием также можно управлять с помощью сочетаний клавиш CTRL+- и CTRL+=.",
"title": "Коэффициент масштабирования (только для настольной версии)"
}, },
"show_toc_widget_button": { "show_toc_widget_button": {
"show_toc": "Показать оглавление" "show_toc": "Показать оглавление"
@@ -1621,7 +1838,8 @@
"title": "Доступные типы в выпадающем списке" "title": "Доступные типы в выпадающем списке"
}, },
"search_result": { "search_result": {
"no_notes_found": "По заданным параметрам поиска заметки не найдены." "no_notes_found": "По заданным параметрам поиска заметки не найдены.",
"search_not_executed": "Поиск ещё не выполнен. Нажмите кнопку «Поиск» выше, чтобы увидеть результаты."
}, },
"empty": { "empty": {
"search_placeholder": "поиск заметки по ее названию", "search_placeholder": "поиск заметки по ее названию",
@@ -1631,7 +1849,11 @@
"search_script": { "search_script": {
"placeholder": "поиск заметки по ее названию", "placeholder": "поиск заметки по ее названию",
"title": "Скрипт поиска:", "title": "Скрипт поиска:",
"example_title": "См. этот пример:" "example_title": "См. этот пример:",
"description1": "Скрипт поиска позволяет определить результаты поиска, запустив его. Это обеспечивает максимальную гибкость, когда стандартного поиска недостаточно.",
"description2": "Скрипт поиска должен иметь тип «Код» и подтип «JavaScript backend». Скрипт должен возвращать массив идентификаторов заметок или заметок.",
"note": "Обратите внимание, что скрипт поиска и строка поиска не могут быть объединены друг с другом.",
"example_code": "// 1. Предварительная фильтрация с использованием стандартного поиска\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. Применение пользовательских критериев поиска\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;"
}, },
"note_erasure_timeout": { "note_erasure_timeout": {
"note_erasure_timeout_title": "Срок окончательного удаления заметок", "note_erasure_timeout_title": "Срок окончательного удаления заметок",
@@ -1645,21 +1867,25 @@
"erase_unused_attachments_now": "Удалить неиспользуемые вложения прямо сейчас", "erase_unused_attachments_now": "Удалить неиспользуемые вложения прямо сейчас",
"attachment_auto_deletion_description": "Вложения автоматически удаляются, если в заметке на них больше не ссылаются по истечении определенного времени.", "attachment_auto_deletion_description": "Вложения автоматически удаляются, если в заметке на них больше не ссылаются по истечении определенного времени.",
"attachment_erasure_timeout": "Тайм-аут удаления вложения", "attachment_erasure_timeout": "Тайм-аут удаления вложения",
"erase_attachments_after": "Удалять неиспользуемые вложения через:" "erase_attachments_after": "Удалять неиспользуемые вложения через:",
"unused_attachments_erased": "Неиспользуемые вложения были удалены.",
"manual_erasing_description": "Вы также можете запустить стирание вручную (без учета тайм-аута, определенного выше):"
}, },
"revisions_snapshot_interval": { "revisions_snapshot_interval": {
"note_revisions_snapshot_interval_title": "Интервал создания снимка версии заметки", "note_revisions_snapshot_interval_title": "Интервал создания снимка версии заметки",
"note_revisions_snapshot_description": "Интервал создания снимка версии заметки - это время, по истечении которого для неё будет создана новая версия. Подробнее см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/note-revisions.html\" class=\"external\">wiki</a>.", "note_revisions_snapshot_description": "Интервал между снимками редакции заметки это время, по истечении которого для заметки будет создана новая редакция. Подробнее см. <doc>wiki</doc>.",
"snapshot_time_interval_label": "Интервал создания снимка версии заметки:" "snapshot_time_interval_label": "Интервал создания снимка версии заметки:"
}, },
"title_bar_buttons": { "title_bar_buttons": {
"window-on-top": "Закрепить окно" "window-on-top": "Закрепить окно"
}, },
"abstract_search_option": { "abstract_search_option": {
"remove_this_search_option": "Удалить эту опцию поиска" "remove_this_search_option": "Удалить эту опцию поиска",
"failed_rendering": "Не удалось выполнить рендеринг опции поиска: {{dto}} с ошибкой: {{error}} {{stack}}"
}, },
"image": { "image": {
"copied-to-clipboard": "Ссылка на изображение скопирована в буфер обмена. Её можно вставить в любую текстовую заметку." "copied-to-clipboard": "Ссылка на изображение скопирована в буфер обмена. Её можно вставить в любую текстовую заметку.",
"cannot-copy": "Не удалось скопировать ссылку на изображение в буфер обмена."
}, },
"abstract_bulk_action": { "abstract_bulk_action": {
"remove_this_search_action": "Удалить это действие поиска" "remove_this_search_action": "Удалить это действие поиска"
@@ -1668,26 +1894,38 @@
"cannot-move-notes-here": "Невозможно переместить заметки сюда.", "cannot-move-notes-here": "Невозможно переместить заметки сюда.",
"delete-status": "Статус удаления", "delete-status": "Статус удаления",
"delete-finished-successfully": "Удаление успешно завершено.", "delete-finished-successfully": "Удаление успешно завершено.",
"undeleting-notes-finished-successfully": "Восстановление заметок успешно завершено." "undeleting-notes-finished-successfully": "Восстановление заметок успешно завершено.",
"delete-notes-in-progress": "Удаление заметок в процессе: {{count}}",
"undeleting-notes-in-progress": "Идет восстановление заметок: {{count}}"
}, },
"attachment_detail": { "attachment_detail": {
"owning_note": "Заметка-владелец: ", "owning_note": "Заметка-владелец: ",
"list_of_all_attachments": "Список всех вложений" "list_of_all_attachments": "Список всех вложений",
"open_help_page": "Открыть справку по вложениям",
"attachment_deleted": "Это вложение было удалено.",
"you_can_also_open": ", вы также можете открыть "
}, },
"web_view": { "web_view": {
"web_view": "Веб-страница" "web_view": "Веб-страница",
"create_label": "Для начала создайте метку с URL-адресом, который вы хотите встроить, например, #webViewSrc=\"https://www.google.com\"",
"embed_websites": "Заметки типа \"Веб-страница\" позволяет встраивать веб-сайты в Trilium."
}, },
"ribbon": { "ribbon": {
"widgets": "Виджеты ленты" "widgets": "Виджеты ленты",
"promoted_attributes_message": "Вкладка \"Продвигаемые атрибуты\" будет автоматически открыта, если таковые атрибуты установлены у заметки",
"edited_notes_message": "Вкладка ленты «Измененные заметки» будет автоматически открываться в заметках дня"
}, },
"options_widget": { "options_widget": {
"options_status": "Статус опций" "options_status": "Статус опций",
"options_change_saved": "Изменения параметров сохранены."
}, },
"spacer": { "spacer": {
"configure_launchbar": "Конфигурация лаунчбара" "configure_launchbar": "Конфигурация лаунчбара"
}, },
"entrypoints": { "entrypoints": {
"note-executed": "Заметка выполнена." "note-executed": "Заметка выполнена.",
"note-revision-created": "Снимок версии заметки создан успешно.",
"sql-error": "Произошла ошибка при выполнении SQL-запроса: {{message}}"
}, },
"include_archived_notes": { "include_archived_notes": {
"include_archived_notes": "Включить архивные заметки" "include_archived_notes": "Включить архивные заметки"
@@ -1695,19 +1933,96 @@
"open-help-page": "Открыть страницу справки", "open-help-page": "Открыть страницу справки",
"watched_file_update_status": { "watched_file_update_status": {
"upload_modified_file": "Загрузить измененный файл", "upload_modified_file": "Загрузить измененный файл",
"ignore_this_change": "Игнорировать это изменение" "ignore_this_change": "Игнорировать это изменение",
"file_last_modified": "Файл <code class=\"file-path\"></code> был последний раз изменен <span class=\"file-last-modified\"></span>."
}, },
"clipboard": { "clipboard": {
"copy_success": "Скопировано в буфер обмена." "copy_success": "Скопировано в буфер обмена.",
"copy_failed": "Невозможно скопировать в буфер обмена из-за проблем с правами доступа.",
"copied": "Заметки скопированы в буфер обмена.",
"cut": "Заметки вырезаны в буфер обмена."
}, },
"ws": { "ws": {
"sync-check-failed": "Проверка синхронизации не удалась!" "sync-check-failed": "Проверка синхронизации не удалась!",
"encountered-error": "Обнаружена ошибка \"{{message}}\", проверьте консоль.",
"consistency-checks-failed": "Проверка целостности не пройдена! Подробности смотрите в логах."
}, },
"attachment_detail_2": { "attachment_detail_2": {
"role_and_size": "Роль: {{role}}, Размер: {{size}}", "role_and_size": "Роль: {{role}}, Размер: {{size}}",
"unrecognized_role": "Нераспознанная роль вложения '{{role}}'." "unrecognized_role": "Нераспознанная роль вложения '{{role}}'.",
"link_copied": "Ссылка на вложение скопирована в буфер обмена.",
"will_be_deleted_soon": "Это вложение скоро будет автоматически удалено",
"will_be_deleted_in": "Это вложение будет автоматически удалено через {{time}}",
"deletion_reason": ", поскольку вложение не связано с содержимым заметки. Чтобы предотвратить удаление, добавьте ссылку на вложение обратно в содержимое или преобразуйте вложение в заметку."
}, },
"note_title": { "note_title": {
"placeholder": "введите здесь название заметки..." "placeholder": "введите здесь название заметки..."
},
"units": {
"percentage": "%"
},
"settings": {
"related_settings": "Связанные настройки"
},
"content_widget": {
"unknown_widget": "Неизвестный виджет \"{{id}}\"."
},
"wrap_lines": {
"wrap_lines_in_code_notes": "Переносить строки в заметках типа \"Код\"",
"enable_line_wrap": "Включить перенос строк (для вступления изменений в силу может потребоваться перезагрузка интерфейса)"
},
"shared_info": {
"help_link": "Для получения справки посетите <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">вики</a>.",
"shared_locally": "Заметка общедоступна локально в",
"shared_publicly": "Заметка общедоступна публично в"
},
"note_create": {
"duplicated": "Создан дубль заметки \"{{title}}\"."
},
"help-button": {
"title": "Открыть соответствующую страницу справки"
},
"render": {
"note_detail_render_help_2": "Тип заметки «Рендер HTML» используется для <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/scripts.html\">скриптинга</a>. Если коротко, у вас есть заметка с HTML-кодом (возможно, с добавлением JavaScript), и эта заметка её отобразит. Для этого необходимо определить <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/attributes.html\">отношение</a> с именем «renderNote», указывающее на HTML-заметку для отрисовки.",
"note_detail_render_help_1": "Эта справочная заметка отображается, поскольку эта справка типа Render HTML не имеет необходимой связи для правильной работы."
},
"file": {
"too_big": "В целях повышения производительности в режиме предварительного просмотра отображаются только первые {{maxNumChars}} символов файла. Загрузите файл и откройте его во внешнем браузере, чтобы увидеть всё содержимое.",
"file_preview_not_available": "Предварительный просмотр файла недоступен для этого файла."
},
"app_context": {
"please_wait_for_save": "Подождите несколько секунд, пока сохранение завершится, затем попробуйте еще раз."
},
"settings_appearance": {
"related_code_blocks": "Цветовая схема для блоков кода в текстовых заметках",
"related_code_notes": "Цветовая схема для заметок типа \"Код\""
},
"sql_result": {
"no_rows": "По этому запросу не возвращено ни одной строки"
},
"editable_code": {
"placeholder": "Введите содержимое для заметки с кодом..."
},
"editable_text": {
"placeholder": "Введите содержимое для заметки..."
},
"hoisted_note": {
"confirm_unhoisting": "Запрошенная заметка «{{requestedNote}}» находится за пределами поддерева закрепленной заметки \"{{hoistedNote}}\", и для доступа к ней необходимо снять закрепление. Открепить заметку?"
},
"frontend_script_api": {
"sync_warning": "Вы передаете синхронную функцию в `api.runAsyncOnBackendWithManualTransactionHandling()`, \\nхотя вместо этого вам, скорее всего, следует использовать `api.runOnBackend()`.",
"async_warning": "Вы передаете асинхронную функцию в `api.runOnBackend()`, которая, скорее всего, не будет работать так, как вы предполагали.\\nЛибо сделайте функцию синхронной (удалив ключевое слово `async`), либо используйте `api.runAsyncOnBackendWithManualTransactionHandling()`."
},
"note_detail": {
"could_not_find_typewidget": "Не удалось найти typeWidget для типа '{{type}}'"
},
"book": {
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. на <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>."
},
"ui-performance": {
"title": "Производительность",
"enable-motion": "Включить визуальные эффекты и анимации",
"enable-shadows": "Включить тени",
"enable-backdrop-effects": "Включить эффекты размытия фона меню, всплывающих окон и панелей"
} }
} }

View File

@@ -1643,13 +1643,13 @@
"failed_notes": "失敗筆記", "failed_notes": "失敗筆記",
"last_processed": "最後處理時間", "last_processed": "最後處理時間",
"refresh_stats": "更新統計資料", "refresh_stats": "更新統計資料",
"enable_ai_features": "啟用 AI / LLM 功能", "enable_ai_features": "啟用 AI/LLM 功能",
"enable_ai_description": "啟用筆記摘要、內容生成等 AI 功能及其他 LLM 能力", "enable_ai_description": "啟用筆記摘要、內容生成等 AI 功能及其他 LLM 能力",
"openai_tab": "OpenAI", "openai_tab": "OpenAI",
"anthropic_tab": "Anthropic", "anthropic_tab": "Anthropic",
"voyage_tab": "Voyage AI", "voyage_tab": "Voyage AI",
"ollama_tab": "Ollama", "ollama_tab": "Ollama",
"enable_ai": "啟用 AI / LLM 功能", "enable_ai": "啟用 AI/LLM 功能",
"enable_ai_desc": "啟用筆記摘要、內容生成等 AI 功能及其他 LLM 能力", "enable_ai_desc": "啟用筆記摘要、內容生成等 AI 功能及其他 LLM 能力",
"provider_configuration": "AI 提供者設定", "provider_configuration": "AI 提供者設定",
"provider_precedence": "提供者優先級", "provider_precedence": "提供者優先級",
@@ -1771,7 +1771,12 @@
"selected_provider": "已選提供者", "selected_provider": "已選提供者",
"selected_provider_description": "選擇用於聊天和補全功能的 AI 提供者", "selected_provider_description": "選擇用於聊天和補全功能的 AI 提供者",
"select_model": "選擇模型…", "select_model": "選擇模型…",
"select_provider": "選擇提供者…" "select_provider": "選擇提供者…",
"ai_enabled": "已啟用 AI 功能",
"ai_disabled": "已禁用 AI 功能",
"no_models_found_online": "找不到模型。請檢查您的 API 金鑰及設定。",
"no_models_found_ollama": "找不到 Ollama 模型。請確認 Ollama 是否正在執行。",
"error_fetching": "獲取模型失敗:{{error}}"
}, },
"code-editor-options": { "code-editor-options": {
"title": "編輯器" "title": "編輯器"
@@ -1999,5 +2004,21 @@
"next_theme_message": "您正在使用舊版主題,要試用新主題嗎?", "next_theme_message": "您正在使用舊版主題,要試用新主題嗎?",
"next_theme_button": "試用新主題", "next_theme_button": "試用新主題",
"dismiss": "關閉" "dismiss": "關閉"
},
"settings": {
"related_settings": "相關設定"
},
"settings_appearance": {
"related_code_blocks": "文字筆記中程式碼區塊的配色方案",
"related_code_notes": "程式碼筆記的配色方案"
},
"units": {
"percentage": "%"
},
"ui-performance": {
"title": "效能",
"enable-motion": "啟用轉場與動畫",
"enable-shadows": "啟用陰影",
"enable-backdrop-effects": "啟用選單、彈出視窗和面板的背景特效"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
import utils from "../../services/utils.js"; import { EventData } from "../../components/app_context.js";
import type BasicWidget from "../basic_widget.js";
import FlexContainer from "./flex_container.js"; import FlexContainer from "./flex_container.js";
import options from "../../services/options.js";
import type BasicWidget from "../basic_widget.js";
import utils from "../../services/utils.js";
/** /**
* The root container is the top-most widget/container, from which the entire layout derives. * The root container is the top-most widget/container, from which the entire layout derives.
@@ -27,15 +29,45 @@ export default class RootContainer extends FlexContainer<BasicWidget> {
window.visualViewport?.addEventListener("resize", () => this.#onMobileResize()); window.visualViewport?.addEventListener("resize", () => this.#onMobileResize());
} }
this.#setMotion(options.is("motionEnabled"));
this.#setShadows(options.is("shadowsEnabled"));
this.#setBackdropEffects(options.is("backdropEffectsEnabled"));
return super.render(); return super.render();
} }
entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
if (loadResults.isOptionReloaded("motionEnabled")) {
this.#setMotion(options.is("motionEnabled"));
}
if (loadResults.isOptionReloaded("shadowsEnabled")) {
this.#setShadows(options.is("shadowsEnabled"));
}
if (loadResults.isOptionReloaded("backdropEffectsEnabled")) {
this.#setBackdropEffects(options.is("backdropEffectsEnabled"));
}
}
#onMobileResize() { #onMobileResize() {
const currentViewportHeight = getViewportHeight(); const currentViewportHeight = getViewportHeight();
const isKeyboardOpened = (currentViewportHeight < this.originalViewportHeight); const isKeyboardOpened = (currentViewportHeight < this.originalViewportHeight);
this.$widget.toggleClass("virtual-keyboard-opened", isKeyboardOpened); this.$widget.toggleClass("virtual-keyboard-opened", isKeyboardOpened);
} }
#setMotion(enabled: boolean) {
document.body.classList.toggle("motion-disabled", !enabled);
jQuery.fx.off = !enabled;
}
#setShadows(enabled: boolean) {
document.body.classList.toggle("shadows-disabled", !enabled);
}
#setBackdropEffects(enabled: boolean) {
document.body.classList.toggle("backdrop-effects-disabled", !enabled);
}
} }
function getViewportHeight() { function getViewportHeight() {

View File

@@ -9,6 +9,7 @@ import appContext from "../../components/app_context";
import commandRegistry from "../../services/command_registry"; import commandRegistry from "../../services/command_registry";
import { refToJQuerySelector } from "../react/react_utils"; import { refToJQuerySelector } from "../react/react_utils";
import useTriliumEvent from "../react/hooks"; import useTriliumEvent from "../react/hooks";
import shortcutService from "../../services/shortcuts";
const KEEP_LAST_SEARCH_FOR_X_SECONDS = 120; const KEEP_LAST_SEARCH_FOR_X_SECONDS = 120;
@@ -83,6 +84,27 @@ function JumpToNoteDialogComponent() {
$autoComplete $autoComplete
.trigger("focus") .trigger("focus")
.trigger("select"); .trigger("select");
// Add keyboard shortcut for full search
shortcutService.bindElShortcut($autoComplete, "ctrl+return", () => {
if (!isCommandMode) {
showInFullSearch();
}
});
}
async function showInFullSearch() {
try {
setShown(false);
const searchString = actualText.current?.trim();
if (searchString && !searchString.startsWith(">")) {
await appContext.triggerCommand("searchNotes", {
searchString
});
}
} catch (error) {
console.error("Failed to trigger full search:", error);
}
} }
return ( return (
@@ -108,7 +130,12 @@ function JumpToNoteDialogComponent() {
/>} />}
onShown={onShown} onShown={onShown}
onHidden={() => setShown(false)} onHidden={() => setShown(false)}
footer={!isCommandMode && <Button className="show-in-full-text-button" text={t("jump_to_note.search_button")} keyboardShortcut="Ctrl+Enter" />} footer={!isCommandMode && <Button
className="show-in-full-text-button"
text={t("jump_to_note.search_button")}
keyboardShortcut="Ctrl+Enter"
onClick={showInFullSearch}
/>}
show={shown} show={shown}
> >
<div className="algolia-autocomplete-container jump-to-note-results" ref={containerRef}></div> <div className="algolia-autocomplete-container jump-to-note-results" ref={containerRef}></div>

View File

@@ -88,6 +88,7 @@ export default function AppearanceSettings() {
<ApplicationTheme /> <ApplicationTheme />
{overrideThemeFonts === "true" && <Fonts />} {overrideThemeFonts === "true" && <Fonts />}
{isElectron() && <ElectronIntegration /> } {isElectron() && <ElectronIntegration /> }
<Performance />
<MaxContentWidth /> <MaxContentWidth />
<RelatedSettings items={[ <RelatedSettings items={[
{ {
@@ -245,6 +246,30 @@ function ElectronIntegration() {
) )
} }
function Performance() {
const [ motionEnabled, setMotionEnabled ] = useTriliumOptionBool("motionEnabled");
const [ shadowsEnabled, setShadowsEnabled ] = useTriliumOptionBool("shadowsEnabled");
const [ backdropEffectsEnabled, setBackdropEffectsEnabled ] = useTriliumOptionBool("backdropEffectsEnabled");
return <OptionsSection title={t("ui-performance.title")}>
<FormCheckbox
label={t("ui-performance.enable-motion")}
currentValue={motionEnabled} onChange={setMotionEnabled}
/>
<FormCheckbox
label={t("ui-performance.enable-shadows")}
currentValue={shadowsEnabled} onChange={setShadowsEnabled}
/>
<FormCheckbox
label={t("ui-performance.enable-backdrop-effects")}
currentValue={backdropEffectsEnabled} onChange={setBackdropEffectsEnabled}
/>
</OptionsSection>
}
function MaxContentWidth() { function MaxContentWidth() {
const [ maxContentWidth, setMaxContentWidth ] = useTriliumOption("maxContentWidth"); const [ maxContentWidth, setMaxContentWidth ] = useTriliumOption("maxContentWidth");

View File

@@ -676,6 +676,10 @@ export async function getFullCalendarLocale(locale: string) {
return (await import("@fullcalendar/core/locales/ru")).default; return (await import("@fullcalendar/core/locales/ru")).default;
case "ja": case "ja":
return (await import("@fullcalendar/core/locales/ja")).default; return (await import("@fullcalendar/core/locales/ja")).default;
case "pt_br":
return (await import("@fullcalendar/core/locales/pt-br")).default;
case "uk":
return (await import("@fullcalendar/core/locales/uk")).default;
case "en": case "en":
default: default:
return undefined; return undefined;

View File

@@ -74,7 +74,7 @@
"html2plaintext": "2.1.4", "html2plaintext": "2.1.4",
"http-proxy-agent": "7.0.2", "http-proxy-agent": "7.0.2",
"https-proxy-agent": "7.0.6", "https-proxy-agent": "7.0.6",
"i18next": "25.4.0", "i18next": "25.4.2",
"i18next-fs-backend": "2.6.0", "i18next-fs-backend": "2.6.0",
"image-type": "6.0.0", "image-type": "6.0.0",
"ini": "5.0.0", "ini": "5.0.0",

View File

@@ -1,27 +1,335 @@
<p>Trilium supports configuration via a file named <code>config.ini</code> and <p>Trilium supports configuration via a file named <code>config.ini</code> and environment variables. This document provides a comprehensive reference for all configuration options.</p>
environment variables. Please review the file named <a href="https://github.com/TriliumNext/Trilium/blob/main/apps/server/src/assets/config-sample.ini">config-sample.ini</a> in
the <a href="https://github.com/TriliumNext/Trilium">Trilium</a> repository <h2>Configuration Precedence</h2>
to see what values are supported.</p> <p>Configuration values are loaded in the following order of precedence (highest to lowest):</p>
<p>You can provide the same values via environment variables instead of the <code>config.ini</code> file,
and these environment variables use the following format:</p>
<ol> <ol>
<li>Environment variables should be prefixed with <code>TRILIUM_</code> and <li><strong>Environment variables</strong> (checked first)</li>
use underscores to represent the INI section structure.</li> <li><strong>config.ini file values</strong></li>
<li>The format is: <code>TRILIUM_&lt;SECTION&gt;_&lt;KEY&gt;=&lt;VALUE&gt;</code> <li><strong>Default values</strong></li>
</li>
<li>The environment variables will override any matching values from config.ini</li>
</ol>
<p>For example, if you have this in your config.ini:</p><pre><code class="language-text-x-trilium-auto">[Network]
host=localhost
port=8080</code></pre>
<p>You can override these values using environment variables:</p><pre><code class="language-text-x-trilium-auto">TRILIUM_NETWORK_HOST=0.0.0.0
TRILIUM_NETWORK_PORT=9000</code></pre>
<p>The code will:</p>
<ol>
<li>First load the <code>config.ini</code> file as before</li>
<li>Then scan all environment variables for ones starting with <code>TRILIUM_</code>
</li>
<li>Parse these variables into section/key pairs</li>
<li>Merge them with the config from the file, with environment variables taking
precedence</li>
</ol> </ol>
<h2>Environment Variable Patterns</h2>
<p>Trilium supports multiple environment variable patterns for flexibility. The primary pattern is: <code>TRILIUM_[SECTION]_[KEY]</code></p>
<p>Where:</p>
<ul>
<li><code>SECTION</code> is the INI section name in UPPERCASE</li>
<li><code>KEY</code> is the camelCase configuration key converted to UPPERCASE (e.g., <code>instanceName</code><code>INSTANCENAME</code>)</li>
</ul>
<p>Additionally, shorter aliases are available for common configurations (see Alternative Variables section below).</p>
<h2>Environment Variable Reference</h2>
<h3>General Section</h3>
<table>
<thead>
<tr>
<th>Environment Variable</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TRILIUM_GENERAL_INSTANCENAME</code></td>
<td>string</td>
<td>""</td>
<td>Instance name for API identification</td>
</tr>
<tr>
<td><code>TRILIUM_GENERAL_NOAUTHENTICATION</code></td>
<td>boolean</td>
<td>false</td>
<td>Disable authentication (server only)</td>
</tr>
<tr>
<td><code>TRILIUM_GENERAL_NOBACKUP</code></td>
<td>boolean</td>
<td>false</td>
<td>Disable automatic backups</td>
</tr>
<tr>
<td><code>TRILIUM_GENERAL_NODESKTOPICON</code></td>
<td>boolean</td>
<td>false</td>
<td>Disable desktop icon creation</td>
</tr>
<tr>
<td><code>TRILIUM_GENERAL_READONLY</code></td>
<td>boolean</td>
<td>false</td>
<td>Enable read-only mode</td>
</tr>
</tbody>
</table>
<h3>Network Section</h3>
<table>
<thead>
<tr>
<th>Environment Variable</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TRILIUM_NETWORK_HOST</code></td>
<td>string</td>
<td>"0.0.0.0"</td>
<td>Server host binding</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_PORT</code></td>
<td>string</td>
<td>"3000"</td>
<td>Server port</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_HTTPS</code></td>
<td>boolean</td>
<td>false</td>
<td>Enable HTTPS</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_CERTPATH</code></td>
<td>string</td>
<td>""</td>
<td>SSL certificate path</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_KEYPATH</code></td>
<td>string</td>
<td>""</td>
<td>SSL key path</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_TRUSTEDREVERSEPROXY</code></td>
<td>boolean/string</td>
<td>false</td>
<td>Reverse proxy trust settings</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_CORSALLOWORIGIN</code></td>
<td>string</td>
<td>""</td>
<td>CORS allowed origins</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_CORSALLOWMETHODS</code></td>
<td>string</td>
<td>""</td>
<td>CORS allowed methods</td>
</tr>
<tr>
<td><code>TRILIUM_NETWORK_CORSALLOWHEADERS</code></td>
<td>string</td>
<td>""</td>
<td>CORS allowed headers</td>
</tr>
</tbody>
</table>
<h3>Session Section</h3>
<table>
<thead>
<tr>
<th>Environment Variable</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TRILIUM_SESSION_COOKIEMAXAGE</code></td>
<td>integer</td>
<td>1814400</td>
<td>Session cookie max age in seconds (21 days)</td>
</tr>
</tbody>
</table>
<h3>Sync Section</h3>
<table>
<thead>
<tr>
<th>Environment Variable</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TRILIUM_SYNC_SYNCSERVERHOST</code></td>
<td>string</td>
<td>""</td>
<td>Sync server host URL</td>
</tr>
<tr>
<td><code>TRILIUM_SYNC_SYNCSERVERTIMEOUT</code></td>
<td>string</td>
<td>"120000"</td>
<td>Sync server timeout in milliseconds</td>
</tr>
<tr>
<td><code>TRILIUM_SYNC_SYNCPROXY</code></td>
<td>string</td>
<td>""</td>
<td>Sync proxy URL</td>
</tr>
</tbody>
</table>
<h3>MultiFactorAuthentication Section</h3>
<table>
<thead>
<tr>
<th>Environment Variable</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL</code></td>
<td>string</td>
<td>""</td>
<td>OAuth/OpenID base URL</td>
</tr>
<tr>
<td><code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID</code></td>
<td>string</td>
<td>""</td>
<td>OAuth client ID</td>
</tr>
<tr>
<td><code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET</code></td>
<td>string</td>
<td>""</td>
<td>OAuth client secret</td>
</tr>
<tr>
<td><code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL</code></td>
<td>string</td>
<td>"https://accounts.google.com"</td>
<td>OAuth issuer base URL</td>
</tr>
<tr>
<td><code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME</code></td>
<td>string</td>
<td>"Google"</td>
<td>OAuth issuer display name</td>
</tr>
<tr>
<td><code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON</code></td>
<td>string</td>
<td>""</td>
<td>OAuth issuer icon URL</td>
</tr>
</tbody>
</table>
<h3>Logging Section</h3>
<table>
<thead>
<tr>
<th>Environment Variable</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TRILIUM_LOGGING_RETENTIONDAYS</code></td>
<td>integer</td>
<td>90</td>
<td>Number of days to retain log files</td>
</tr>
</tbody>
</table>
<h2>Alternative Environment Variables</h2>
<p>The following alternative environment variable names are also supported and work identically to their longer counterparts:</p>
<h3>Network CORS Variables</h3>
<ul>
<li><code>TRILIUM_NETWORK_CORS_ALLOW_ORIGIN</code> (alternative to <code>TRILIUM_NETWORK_CORSALLOWORIGIN</code>)</li>
<li><code>TRILIUM_NETWORK_CORS_ALLOW_METHODS</code> (alternative to <code>TRILIUM_NETWORK_CORSALLOWMETHODS</code>)</li>
<li><code>TRILIUM_NETWORK_CORS_ALLOW_HEADERS</code> (alternative to <code>TRILIUM_NETWORK_CORSALLOWHEADERS</code>)</li>
</ul>
<h3>Sync Variables</h3>
<ul>
<li><code>TRILIUM_SYNC_SERVER_HOST</code> (alternative to <code>TRILIUM_SYNC_SYNCSERVERHOST</code>)</li>
<li><code>TRILIUM_SYNC_SERVER_TIMEOUT</code> (alternative to <code>TRILIUM_SYNC_SYNCSERVERTIMEOUT</code>)</li>
<li><code>TRILIUM_SYNC_SERVER_PROXY</code> (alternative to <code>TRILIUM_SYNC_SYNCPROXY</code>)</li>
</ul>
<h3>OAuth/MFA Variables</h3>
<ul>
<li><code>TRILIUM_OAUTH_BASE_URL</code> (alternative to <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL</code>)</li>
<li><code>TRILIUM_OAUTH_CLIENT_ID</code> (alternative to <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID</code>)</li>
<li><code>TRILIUM_OAUTH_CLIENT_SECRET</code> (alternative to <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET</code>)</li>
<li><code>TRILIUM_OAUTH_ISSUER_BASE_URL</code> (alternative to <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL</code>)</li>
<li><code>TRILIUM_OAUTH_ISSUER_NAME</code> (alternative to <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME</code>)</li>
<li><code>TRILIUM_OAUTH_ISSUER_ICON</code> (alternative to <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON</code>)</li>
</ul>
<h3>Logging Variables</h3>
<ul>
<li><code>TRILIUM_LOGGING_RETENTION_DAYS</code> (alternative to <code>TRILIUM_LOGGING_RETENTIONDAYS</code>)</li>
</ul>
<h2>Boolean Values</h2>
<p>Boolean environment variables accept the following values:</p>
<ul>
<li><strong>True</strong>: <code>"true"</code>, <code>"1"</code>, <code>1</code></li>
<li><strong>False</strong>: <code>"false"</code>, <code>"0"</code>, <code>0</code></li>
<li>Any other value defaults to <code>false</code></li>
</ul>
<h2>Using Environment Variables</h2>
<p>Both naming patterns are fully supported and can be used interchangeably:</p>
<ul>
<li>The longer format follows the section/key pattern for consistency with the INI file structure</li>
<li>The shorter alternatives provide convenience for common configurations</li>
<li>You can use whichever format you prefer - both are equally valid</li>
</ul>
<h2>Examples</h2>
<h3>Docker Compose Example</h3>
<pre><code class="language-yaml">services:
trilium:
image: triliumnext/notes
environment:
# Using full format
TRILIUM_GENERAL_INSTANCENAME: "My Trilium Instance"
TRILIUM_NETWORK_PORT: "8080"
TRILIUM_NETWORK_CORSALLOWORIGIN: "https://myapp.com"
TRILIUM_SYNC_SYNCSERVERHOST: "https://sync.example.com"
TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL: "https://auth.example.com"
# Or using shorter alternatives (equally valid)
# TRILIUM_NETWORK_CORS_ALLOW_ORIGIN: "https://myapp.com"
# TRILIUM_SYNC_SERVER_HOST: "https://sync.example.com"
# TRILIUM_OAUTH_BASE_URL: "https://auth.example.com"</code></pre>
<h3>Shell Export Example</h3>
<pre><code class="language-bash"># Using either format
export TRILIUM_GENERAL_NOAUTHENTICATION=false
export TRILIUM_NETWORK_HTTPS=true
export TRILIUM_NETWORK_CERTPATH=/path/to/cert.pem
export TRILIUM_NETWORK_KEYPATH=/path/to/key.pem
export TRILIUM_LOGGING_RETENTIONDAYS=30
# Start Trilium
npm start</code></pre>
<h2>config.ini Reference</h2>
<p>For the complete list of configuration options and their INI file format, please review the <a href="https://github.com/TriliumNext/Trilium/blob/main/apps/server/src/assets/config-sample.ini">config-sample.ini</a> file in the Trilium repository.</p>

View File

@@ -134,6 +134,7 @@ docker run -d --name trilium -p 8080:8080 --user $(id -u):$(id -g) -v ~/trilium-
<li><code>TRILIUM_DATA_DIR</code>: Path to the data directory inside the container <li><code>TRILIUM_DATA_DIR</code>: Path to the data directory inside the container
(default: <code>/home/node/trilium-data</code>)</li> (default: <code>/home/node/trilium-data</code>)</li>
</ul> </ul>
<p>For a complete list of configuration environment variables (network settings, authentication, sync, etc.), see <a class="reference-link" href="#root/_help_Gzjqa934BdH4">Configuration (config.ini or environment variables)</a>.</p>
<h3>Volume Permissions</h3> <h3>Volume Permissions</h3>
<p>If you encounter permission issues with the data volume, ensure that:</p> <p>If you encounter permission issues with the data volume, ensure that:</p>
<ol> <ol>

View File

@@ -49,7 +49,12 @@ class="admonition warning">
the <code>config.ini</code> file (check&nbsp;<a class="reference-link" href="#root/_help_Gzjqa934BdH4">Configuration (config.ini or environment variables)</a>&nbsp;for the <code>config.ini</code> file (check&nbsp;<a class="reference-link" href="#root/_help_Gzjqa934BdH4">Configuration (config.ini or environment variables)</a>&nbsp;for
more information). more information).
<ol> <ol>
<li>You can also setup through environment variables (<code>TRILIUM_OAUTH_BASE_URL</code>, <code>TRILIUM_OAUTH_CLIENT_ID</code> and <code>TRILIUM_OAUTH_CLIENT_SECRET</code>).</li> <li>You can also setup through environment variables:
<ul>
<li>Standard: <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL</code>, <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID</code>, <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET</code></li>
<li>Legacy (still supported): <code>TRILIUM_OAUTH_BASE_URL</code>, <code>TRILIUM_OAUTH_CLIENT_ID</code>, <code>TRILIUM_OAUTH_CLIENT_SECRET</code></li>
</ul>
</li>
<li><code>oauthBaseUrl</code> should be the link of your Trilium instance server, <li><code>oauthBaseUrl</code> should be the link of your Trilium instance server,
for example, <code>https://&lt;your-trilium-domain&gt;</code>.</li> for example, <code>https://&lt;your-trilium-domain&gt;</code>.</li>
</ol> </ol>
@@ -64,8 +69,12 @@ class="admonition warning">
<p>The default OAuth issuer is Google. To use other services such as Authentik <p>The default OAuth issuer is Google. To use other services such as Authentik
or Auth0, you can configure the settings via <code>oauthIssuerBaseUrl</code>, <code>oauthIssuerName</code>, or Auth0, you can configure the settings via <code>oauthIssuerBaseUrl</code>, <code>oauthIssuerName</code>,
and <code>oauthIssuerIcon</code> in the <code>config.ini</code> file. Alternatively, and <code>oauthIssuerIcon</code> in the <code>config.ini</code> file. Alternatively,
these values can be set using environment variables: <code>TRILIUM_OAUTH_ISSUER_BASE_URL</code>, <code>TRILIUM_OAUTH_ISSUER_NAME</code>, these values can be set using environment variables:
and <code>TRILIUM_OAUTH_ISSUER_ICON</code>. <code>oauthIssuerName</code> and <code>oauthIssuerIcon</code> are <ul>
<li>Standard: <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL</code>, <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME</code>, <code>TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON</code></li>
<li>Legacy (still supported): <code>TRILIUM_OAUTH_ISSUER_BASE_URL</code>, <code>TRILIUM_OAUTH_ISSUER_NAME</code>, <code>TRILIUM_OAUTH_ISSUER_ICON</code></li>
</ul>
<code>oauthIssuerName</code> and <code>oauthIssuerIcon</code> are
required for displaying correct issuer information at the Login page.</p> required for displaying correct issuer information at the Login page.</p>
</aside> </aside>
<h4>Authentik</h4> <h4>Authentik</h4>

View File

@@ -26,7 +26,10 @@ https=true
certPath=/[username]/.acme.sh/[hostname]/fullchain.cer certPath=/[username]/.acme.sh/[hostname]/fullchain.cer
keyPath=/[username]/.acme.sh/[hostname]/example.com.key</code></pre> keyPath=/[username]/.acme.sh/[hostname]/example.com.key</code></pre>
<p>You can also review the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file <p>You can also review the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file
to provide all <code>config.ini</code> values as environment variables instead.</p> to provide all <code>config.ini</code> values as environment variables instead. For example, you can configure TLS using environment variables:</p>
<pre><code class="language-bash">export TRILIUM_NETWORK_HTTPS=true
export TRILIUM_NETWORK_CERTPATH=/path/to/cert.pem
export TRILIUM_NETWORK_KEYPATH=/path/to/key.pem</code></pre>
<p>The above example shows how this is set up in an environment where the <p>The above example shows how this is set up in an environment where the
certificate was generated using Let's Encrypt's ACME utility. Your paths certificate was generated using Let's Encrypt's ACME utility. Your paths
may differ. For Docker installations, ensure these paths are within a volume may differ. For Docker installations, ensure these paths are within a volume

View File

@@ -111,7 +111,9 @@
"incorrect-password": "Das Passwort ist falsch. Bitte versuche es erneut.", "incorrect-password": "Das Passwort ist falsch. Bitte versuche es erneut.",
"password": "Passwort", "password": "Passwort",
"remember-me": "Angemeldet bleiben", "remember-me": "Angemeldet bleiben",
"button": "Anmelden" "button": "Anmelden",
"incorrect-totp": "Einmaltoken ist falsch. Bitte erneut versuchen.",
"sign_in_with_sso": "Mit {{ ssoIssuerName }} anmelden"
}, },
"set_password": { "set_password": {
"title": "Passwort festlegen", "title": "Passwort festlegen",
@@ -248,7 +250,13 @@
"other": "Weitere", "other": "Weitere",
"advanced-title": "Erweitert", "advanced-title": "Erweitert",
"visible-launchers-title": "Sichtbare Launcher", "visible-launchers-title": "Sichtbare Launcher",
"user-guide": "Nutzerhandbuch" "user-guide": "Nutzerhandbuch",
"jump-to-note-title": "Springe zu...",
"llm-chat-title": "Chat mit Notizen",
"multi-factor-authentication-title": "MFA",
"ai-llm-title": "AI/LLM",
"localization": "Sprache & Region",
"inbox-title": "Posteingang"
}, },
"notes": { "notes": {
"new-note": "Neue Notiz", "new-note": "Neue Notiz",
@@ -275,11 +283,31 @@
"bookmarks": "Lesezeichen", "bookmarks": "Lesezeichen",
"today": "Heutigen Journal Eintrag öffnen", "today": "Heutigen Journal Eintrag öffnen",
"new-note": "Neue Notiz", "new-note": "Neue Notiz",
"show-windows": "Fenster anzeigen" "show-windows": "Fenster anzeigen",
"open_new_window": "Öffne neues Fenster"
}, },
"hidden_subtree_templates": { "hidden_subtree_templates": {
"table": "Tabelle", "table": "Tabelle",
"board_status_done": "Erledigt" "board_status_done": "Erledigt",
"text-snippet": "Text Ausschnitt",
"description": "Beschreibung",
"list-view": "Listenansicht",
"grid-view": "Gitteransicht",
"calendar": "Kalender",
"geo-map": "Geokarte",
"start-date": "Startdatum",
"end-date": "Enddatum",
"start-time": "Startzeit",
"end-time": "Endzeit",
"geolocation": "Geolokation",
"built-in-templates": "Integrierte Vorlagen",
"board": "Tafel",
"status": "Status",
"board_note_first": "Erste Notiz",
"board_note_second": "Zweite Notiz",
"board_note_third": "Dritte Notiz",
"board_status_todo": "To-Do",
"board_status_progress": "In Bearbeitung"
}, },
"keyboard_action_names": { "keyboard_action_names": {
"copy-notes-to-clipboard": "Notizen in Zwischenablage kopieren", "copy-notes-to-clipboard": "Notizen in Zwischenablage kopieren",
@@ -333,6 +361,68 @@
"show-backend-log": "Zeige Backend-Protokoll", "show-backend-log": "Zeige Backend-Protokoll",
"show-help": "Zeige Hilfe", "show-help": "Zeige Hilfe",
"show-cheatsheet": "Zeige Cheatsheet", "show-cheatsheet": "Zeige Cheatsheet",
"add-link-to-text": "Link zum Text hinzufügen" "add-link-to-text": "Link zum Text hinzufügen",
"cut-into-note": "In neue Notiz verschieben",
"add-new-label": "Neues Label hinzufügen",
"add-new-relation": "Neue Beziehung hinzufügen",
"print-active-note": "Drucke aktive Notiz",
"export-active-note-as-pdf": "Exportiere aktive Notiz als PDF",
"move-note-up-in-hierarchy": "Notiz in der Hierarchie nach oben verschieben",
"move-note-down-in-hierarchy": "Notiz in der Hierarchie nach unten verschieben",
"edit-branch-prefix": "Zweigpräfix bearbeiten",
"select-all-notes-in-parent": "Alle Notizen in übergeordnetem Element auswählen",
"duplicate-subtree": "Unterbaum duplizieren",
"follow-link-under-cursor": "Folge Link unterhalb des Mauszeigers",
"insert-date-and-time-to-text": "Datum und Uhrzeit in Text einfügen",
"paste-markdown-into-text": "Markdown in Text einfügen",
"add-include-note-to-text": "Notiz in Text einfügen",
"edit-read-only-note": "Schreibgeschützte Notiz bearbeiten",
"toggle-ribbon-tab-classic-editor": "Registerkarte Klassischer Editor umschalten",
"toggle-ribbon-tab-basic-properties": "Registerkarte Grundlegende Eigenschaften umschalten",
"toggle-ribbon-tab-book-properties": "Registerkarte Buch-Eigenschaften umschalten",
"toggle-ribbon-tab-file-properties": "Registerkarte Datei-Eigenschaften umschalten",
"toggle-ribbon-tab-image-properties": "Registerkarte Bilder-Eigenschaften umschalten",
"toggle-ribbon-tab-owned-attributes": "Registerkarte Besitzerattribute umschalten",
"toggle-ribbon-tab-inherited-attributes": "Registerkarte geerbte Attribute umschalten",
"toggle-ribbon-tab-promoted-attributes": "Registerkarte verliehene Attribute umschalten",
"toggle-ribbon-tab-note-map": "Registerkarte Notizkarte umschalten",
"toggle-ribbon-tab-note-info": "Registerkarte Notiz-Info umschalten",
"toggle-ribbon-tab-note-paths": "Registerkarte Notiz-Pfad umschalten",
"toggle-ribbon-tab-similar-notes": "Registerkarte ähnliche Notizen umschalten",
"toggle-right-pane": "Rechten Bereich ein-/ausblenden",
"open-note-externally": "Notiz extern öffnen",
"render-active-note": "Aktive Notiz rendern",
"run-active-note": "Aktive Notiz ausführen",
"toggle-note-hoisting": "Notiz hochziehen umschalten",
"unhoist-note": "Notiz hochziehen rückgängig machen",
"reload-frontend-app": "Oberfläche neu laden",
"open-developer-tools": "Öffne Entwickler-Tools",
"find-in-text": "Im Text suchen",
"toggle-left-pane": "Linken Bereich ein-/ausblenden",
"toggle-full-screen": "Vollbild-Modus de-/aktivieren",
"zoom-out": "Vergrößern",
"zoom-in": "Verkleinern",
"reset-zoom-level": "Zoom zurücksetzen",
"copy-without-formatting": "Kopieren ohne Formatierung",
"force-save-revision": "Speichern der Notizrevision erzwingen"
},
"weekdayNumber": "Woche {weekNumber}",
"quarterNumber": "Quartal {quarterNumber}",
"migration": {
"old_version": "Eine direkte Migration von Ihrer aktuellen Version wird nicht unterstützt. Bitte führen Sie zunächst ein Upgrade auf die neueste Version v0.60.4 durch und erst dann auf diese Version.",
"error_message": "Fehler bei der Migration zu Version {{version}}: {{stack}}",
"wrong_db_version": "Die Version der Datenbank ({{version}}) ist neuer als die von der Anwendung erwartete Version ({{targetVersion}}), was bedeutet, dass diese mit einer neueren und inkompatiblen Version von Trilium erstellt wurde. Führen Sie ein Upgrade auf die neueste Version von Trilium durch, um dieses Problem zu beheben."
},
"modals": {
"error_title": "Fehler"
},
"share_theme": {
"site-theme": "Webseite Stil",
"search_placeholder": "Suche...",
"image_alt": "Artikel Bild",
"last-updated": "Zuletzt aktualisiert am {{- date}}",
"subpages": "Unterseiten:",
"on-this-page": "Auf dieser Seite",
"expand": "Erweitern"
} }
} }

View File

@@ -111,7 +111,9 @@
"incorrect-password": "Le mot de passe est incorrect. Veuillez réessayer.", "incorrect-password": "Le mot de passe est incorrect. Veuillez réessayer.",
"password": "Mot de passe", "password": "Mot de passe",
"remember-me": "Se souvenir de moi", "remember-me": "Se souvenir de moi",
"button": "Connexion" "button": "Connexion",
"sign_in_with_sso": "Se connecter avec {{ ssoIssuerName }}",
"incorrect-totp": "TOTP incorrect. Veuillez réessayer."
}, },
"set_password": { "set_password": {
"title": "Définir un mot de passe", "title": "Définir un mot de passe",
@@ -350,6 +352,29 @@
"add-include-note-to-text": "Ajouter une note inclusion au texte", "add-include-note-to-text": "Ajouter une note inclusion au texte",
"edit-read-only-note": "Modifier une note en lecture seule", "edit-read-only-note": "Modifier une note en lecture seule",
"add-new-label": "Ajouter une nouvelle étiquette", "add-new-label": "Ajouter une nouvelle étiquette",
"add-new-relation": "Ajouter une nouvelle relation" "add-new-relation": "Ajouter une nouvelle relation",
"toggle-ribbon-tab-classic-editor": "Basculer l'onglet Mise en forme de l'éditeur avec la barre d'outils fixe",
"toggle-ribbon-tab-basic-properties": "Afficher/masquer les Propriétés de base de la note",
"toggle-ribbon-tab-book-properties": "Afficher/masquer les Propriétés du Livre",
"toggle-ribbon-tab-file-properties": "Afficher/masquer les Propriétés du fichier",
"toggle-ribbon-tab-image-properties": "Afficher/masquer les Propriétés de l'image",
"toggle-ribbon-tab-owned-attributes": "Afficher/masquer les Attributs propres",
"toggle-ribbon-tab-inherited-attributes": "Afficher/masquer les Attributs hérités",
"toggle-right-pane": "Afficher le panneau de droite",
"print-active-note": "Imprimer la note active",
"export-active-note-as-pdf": "Exporter la note active en PDF",
"open-note-externally": "Ouvrir la note à l'extérieur",
"render-active-note": "Faire un rendu de la note active",
"run-active-note": "Lancer la note active",
"reload-frontend-app": "Recharger l'application Frontend",
"open-developer-tools": "Ouvrir les outils développeur",
"find-in-text": "Chercher un texte",
"toggle-left-pane": "Afficher le panneau de gauche",
"toggle-full-screen": "Passer en mode plein écran",
"zoom-out": "Dézoomer",
"zoom-in": "Zoomer",
"reset-zoom-level": "Réinitilaliser le zoom",
"copy-without-formatting": "Copier sans mise en forme",
"force-save-revision": "Forcer la sauvegarde de la révision"
} }
} }

View File

@@ -1 +1,43 @@
{} {
"keyboard_actions": {
"back-in-note-history": "기록 내 이전 노트로 이동하기",
"open-command-palette": "명령어 팔레트 열기",
"delete-note": "노트 삭제",
"quick-search": "빠른 검색바 활성화",
"move-note-up": "노트를 위로 이동",
"move-note-down": "노트를 아래로 이동",
"move-note-up-in-hierarchy": "노트를 상위 계층으로 이동",
"move-note-down-in-hierarchy": "노트를 하위 계층으로 이동",
"sort-child-notes": "자식 노트 정렬",
"forward-in-note-history": "기록 내 다음 노트로 이동하기",
"open-jump-to-note-dialog": "\"노트로 이동하기\" 대화창 열기",
"scroll-to-active-note": "노트 트리를 활성화된 노트로 스크롤하기",
"search-in-subtree": "활성화된 노트 하위에서 노트 찾기",
"expand-subtree": "현재 노트의 서브트리 펼치기",
"collapse-tree": "전체 노트 트리 접기",
"collapse-subtree": "현재 노트의 서브트리 접기",
"creating-and-moving-notes": "노트 만들기 및 이동하기",
"create-note-after": "노트 활성화 후 노트 만들기",
"create-note-into": "활성화된 노트 하위에 노트 만들기",
"create-note-into-inbox": "받은 편지함(정의된 경우) 또는 당일 노트에 노트 만들기",
"edit-note-title": "트리에서 노트 세부 사항으로 이동하고 제목 편집하기",
"edit-branch-prefix": "\"브랜치 접두사 편집\" 대화창 표시하기",
"clone-notes-to": "선택된 노트들을 복사하기",
"move-notes-to": "선택된 노트들을 이동하기",
"note-clipboard": "노트 클립보드",
"copy-notes-to-clipboard": "선택된 노트들을 클립보드에 복사하기",
"paste-notes-from-clipboard": "클립보드 내 노트를 활성화된 노트에 붙여넣기",
"cut-notes-to-clipboard": "선택된 노트들을 클립보드에 잘라내기",
"select-all-notes-in-parent": "현재 노트 레벨에서 모든 노트 선택하기",
"add-note-above-to-the-selection": "선택한 영역 위에 노트 추가하기",
"add-note-below-to-selection": "선택한 영역 아래에 노트 추가하기",
"duplicate-subtree": "서브트리 복사하기",
"open-new-tab": "새 탭 열기",
"close-active-tab": "활성화된 탭 닫기",
"reopen-last-tab": "마지막으로 닫은 탭 열기",
"activate-next-tab": "우측 탭 활성화",
"activate-previous-tab": "좌측 탭 활성화",
"open-new-window": "새 비어있는 창 열기",
"toggle-tray": "시스템 트레이에서 애플리케이션 보여주기/숨기기"
}
}

View File

@@ -0,0 +1,12 @@
{
"keyboard_actions": {
"back-in-note-history": "Navigeer naar vorige notitie in geschiedenis",
"forward-in-note-history": "Navigeer naar de volgende notitie in de geschiedenis",
"open-jump-to-note-dialog": "Open het dialoogvenster 'Ga naar notitie'",
"open-command-palette": "Open het opdrachtvenster",
"scroll-to-active-note": "Scroll naar actieve notitie in de notitieboom",
"quick-search": "Snelle zoekbalk activeren",
"search-in-subtree": "Zoek naar notities in de subboom van de actieve notitie",
"expand-subtree": "Subboom van huidige notitie uitbreiden"
}
}

View File

@@ -71,10 +71,10 @@
"add-new-label": "Создать новую заметку", "add-new-label": "Создать новую заметку",
"create-new-relation": "Создать новое отношение", "create-new-relation": "Создать новое отношение",
"ribbon-tabs": "Вкладки ленты", "ribbon-tabs": "Вкладки ленты",
"toggle-basic-properties": "Перейти к основным свойствам", "toggle-basic-properties": "Перейти к общим параметрам",
"toggle-file-properties": "Перейти к свойствам файла", "toggle-file-properties": "Перейти к свойствам файла",
"toggle-image-properties": "Перейти к свойствам изображения", "toggle-image-properties": "Перейти к свойствам изображения",
"toggle-owned-attributes": "Перейти к собственным атрибутами", "toggle-owned-attributes": "Перейти к атрибутам",
"toggle-inherited-attributes": "Перейти к унаследованным атрибутам", "toggle-inherited-attributes": "Перейти к унаследованным атрибутам",
"toggle-promoted-attributes": "Перейти к продвигаемым атрибутам", "toggle-promoted-attributes": "Перейти к продвигаемым атрибутам",
"toggle-link-map": "Перейти к картуессылок", "toggle-link-map": "Перейти к картуессылок",
@@ -100,7 +100,10 @@
"toggle-book-properties": "Перейти к свойствам коллекции", "toggle-book-properties": "Перейти к свойствам коллекции",
"toggle-classic-editor-toolbar": "Перейти на вкладку «Форматирование» для редактора с фиксированной панелью инструментов", "toggle-classic-editor-toolbar": "Перейти на вкладку «Форматирование» для редактора с фиксированной панелью инструментов",
"export-as-pdf": "Экспортировать текущую заметку в формате PDF", "export-as-pdf": "Экспортировать текущую заметку в формате PDF",
"toggle-zen-mode": "Включает/отключает режим дзен (минимальный пользовательский интерфейс для фокусирования)" "toggle-zen-mode": "Включает/отключает режим дзен (минимальный пользовательский интерфейс для фокусирования)",
"toggle-note-hoisting": "Переключить закрепление активной заметки",
"unhoist": "Убрать закрепление везде",
"force-save-revision": "Принудительное создать/сохранить снимок версии активной заметки"
}, },
"hidden-subtree": { "hidden-subtree": {
"localization": "Язык и регион", "localization": "Язык и регион",
@@ -147,12 +150,13 @@
"visible-launchers-title": "Видимые лаунчеры", "visible-launchers-title": "Видимые лаунчеры",
"user-guide": "Руководство пользователя", "user-guide": "Руководство пользователя",
"sql-console-history-title": "История консоли SQL", "sql-console-history-title": "История консоли SQL",
"user-hidden-title": "Пользователь скрыт", "user-hidden-title": "Скрытый пользователь",
"launch-bar-templates-title": "Шаблоны панели запуска", "launch-bar-templates-title": "Шаблоны панели запуска",
"base-abstract-launcher-title": "Базовый абстрактный лаунчер", "base-abstract-launcher-title": "Базовый абстрактный лаунчер",
"go-to-previous-note-title": "К предыдущей заметке", "go-to-previous-note-title": "К предыдущей заметке",
"go-to-next-note-title": "К следующей заметке", "go-to-next-note-title": "К следующей заметке",
"open-today-journal-note-title": "Открыть сегодняшнюю заметку в журнале" "open-today-journal-note-title": "Открыть сегодняшнюю заметку в журнале",
"llm-chat-title": "ИИ чат с заметками"
}, },
"tray": { "tray": {
"bookmarks": "Закладки", "bookmarks": "Закладки",
@@ -160,7 +164,9 @@
"close": "Выйти из Trilium", "close": "Выйти из Trilium",
"recents": "Последние заметки", "recents": "Последние заметки",
"new-note": "Новая заметка", "new-note": "Новая заметка",
"show-windows": "Показать окна" "show-windows": "Показать окна",
"open_new_window": "Открыть новое окно",
"today": "Открыть заметку дня"
}, },
"keyboard_action_names": { "keyboard_action_names": {
"scroll-to-active-note": "Прокрутить к активной заметке", "scroll-to-active-note": "Прокрутить к активной заметке",
@@ -238,7 +244,26 @@
"toggle-full-screen": "Переключить на полный экран", "toggle-full-screen": "Переключить на полный экран",
"reset-zoom-level": "Сбросить уровень масштабирования", "reset-zoom-level": "Сбросить уровень масштабирования",
"copy-without-formatting": "Копировать без форматирования", "copy-without-formatting": "Копировать без форматирования",
"force-save-revision": "Принудительное сохранение версии" "force-save-revision": "Принудительное сохранение версии",
"unhoist-note": "Открепить заметку",
"toggle-right-pane": "Переключить правую панель",
"print-active-note": "Печать активной заметки",
"render-active-note": "Рендеринг активной заметки",
"run-active-note": "Запуск активной заметки",
"add-include-note-to-text": "Добавить включение другой заметки в текст",
"toggle-ribbon-tab-basic-properties": "Переключить на вкладку \"Общее\"",
"toggle-ribbon-tab-book-properties": "Переключить на вкладку \"Свойства книги\"",
"toggle-ribbon-tab-file-properties": "Переключить на вкладку \"Свойства файла\"",
"toggle-ribbon-tab-image-properties": "Переключить на вкладку \"Свойства изображения\"",
"toggle-ribbon-tab-owned-attributes": "Переключить на вкладку \"Атрибуты\"",
"toggle-ribbon-tab-inherited-attributes": "Переключить на вкладку \"Унаследованные атрибуты\"",
"toggle-ribbon-tab-promoted-attributes": "Переключить на вкладку \"Продвигаемые атрибуты\"",
"toggle-ribbon-tab-note-map": "Переключить на вкладку \"Карта заметок\"",
"toggle-ribbon-tab-note-info": "Переключить на вкладку \"Информация о заметке\"",
"toggle-ribbon-tab-note-paths": "Переключить на вкладку \"Пути к заметке\"",
"toggle-ribbon-tab-similar-notes": "Переключить на вкладку \"Похожие заметки\"",
"export-active-note-as-pdf": "Экспортировать активную заметку в формате PDF",
"toggle-note-hoisting": "Переключить закрепление заметки"
}, },
"months": { "months": {
"august": "Август", "august": "Август",
@@ -318,7 +343,8 @@
}, },
"notes": { "notes": {
"duplicate-note-suffix": "(дубликат)", "duplicate-note-suffix": "(дубликат)",
"new-note": "Новая заметка" "new-note": "Новая заметка",
"duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}"
}, },
"modals": { "modals": {
"error_title": "Ошибка" "error_title": "Ошибка"
@@ -328,7 +354,9 @@
"subpages": "Подстраницы:", "subpages": "Подстраницы:",
"expand": "Развернуть", "expand": "Развернуть",
"site-theme": "Тема оформления сайта", "site-theme": "Тема оформления сайта",
"image_alt": "Изображение статьи" "image_alt": "Изображение статьи",
"on-this-page": "На текущей странице",
"last-updated": "Последнее обновление: {{- date}}"
}, },
"hidden_subtree_templates": { "hidden_subtree_templates": {
"description": "Описание", "description": "Описание",
@@ -359,12 +387,14 @@
}, },
"share_page": { "share_page": {
"child-notes": "Дочерние заметки:", "child-notes": "Дочерние заметки:",
"no-content": "Эта заметка пуста." "no-content": "Эта заметка пуста.",
"parent": "родитель:",
"clipped-from": "Эта заметка изначально была вырезана из {{- url}}"
}, },
"javascript-required": "Для работы Trilium требуется JavaScript.", "javascript-required": "Для работы Trilium требуется JavaScript.",
"setup_sync-from-desktop": { "setup_sync-from-desktop": {
"heading": "Синхронизация с приложения ПК", "heading": "Синхронизация с приложения ПК",
"description": "Эту настройку необходимо инициировать из приложения для ПК.", "description": "Эту настройку необходимо инициировать из приложения для ПК:",
"step1": "Откройте приложение Trilium Notes на ПК.", "step1": "Откройте приложение Trilium Notes на ПК.",
"step2": "В меню Trilium выберите «Параметры».", "step2": "В меню Trilium выберите «Параметры».",
"step3": "Нажмите на категорию «Синхронизация».", "step3": "Нажмите на категорию «Синхронизация».",
@@ -376,5 +406,23 @@
"test_sync": { "test_sync": {
"not-configured": "Адрес сервера синхронизации не установлен. Сначала настройте синхронизацию.", "not-configured": "Адрес сервера синхронизации не установлен. Сначала настройте синхронизацию.",
"successful": "Установление связи с сервером синхронизации прошло успешно, синхронизация начата." "successful": "Установление связи с сервером синхронизации прошло успешно, синхронизация начата."
},
"pdf": {
"export_filter": "Документ PDF (*.pdf)",
"unable-to-save-message": "Не удалось записать выбранный файл. Попробуйте ещё раз или выберите другой путь.",
"unable-to-export-message": "Текущую заметку невозможно экспортировать в формате PDF.",
"unable-to-export-title": "Невозможно экспортировать в PDF"
},
"migration": {
"wrong_db_version": "Версия базы данных ({{version}}) новее, чем та, которую ожидает приложение ({{targetVersion}}). Это означает, что она была создана более новой и несовместимой версией Trilium. Для решения этой проблемы обновите Trilium до последней версии.",
"old_version": "Прямая миграция с текущей версии не поддерживается. Сначала обновитесь до последней версии 0.60.4, а затем — до этой.",
"error_message": "Ошибка при миграции на версию {{version}}: {{stack}}"
},
"backend_log": {
"reading-log-failed": "Не удалось прочитать файл лога бэкенда '{{ fileName }}'.",
"log-does-not-exist": "Файл лога бэкенда '{{ fileName }}' (пока) не существует."
},
"content_renderer": {
"note-cannot-be-displayed": "Этот тип заметки не может быть отображен."
} }
} }

View File

@@ -349,7 +349,7 @@
"etapi-title": "ETAPI", "etapi-title": "ETAPI",
"backup-title": "備份", "backup-title": "備份",
"sync-title": "同步", "sync-title": "同步",
"ai-llm-title": "AI / LLM", "ai-llm-title": "AI/LLM",
"other": "其他", "other": "其他",
"advanced-title": "進階", "advanced-title": "進階",
"visible-launchers-title": "可見啟動器", "visible-launchers-title": "可見啟動器",

View File

@@ -3,25 +3,25 @@
"back-in-note-history": "Перейти до попередньої нотатки в історії", "back-in-note-history": "Перейти до попередньої нотатки в історії",
"forward-in-note-history": "Перейти до наступної нотатки в історії", "forward-in-note-history": "Перейти до наступної нотатки в історії",
"open-command-palette": "Відкрити палітру команд", "open-command-palette": "Відкрити палітру команд",
"scroll-to-active-note": "Прокрутити дерево нотаток до активної нотатки", "scroll-to-active-note": "Прокрутити дерево до активної нотатки",
"quick-search": "Активувати панель швидкого пошуку", "quick-search": "Активувати панель швидкого пошуку",
"search-in-subtree": "Пошук нотаток в піддереві активної нотатки", "search-in-subtree": "Пошук нотаток в піддереві активної нотатки",
"expand-subtree": "Розкрити піддерево поточної нотатки", "expand-subtree": "Розгорнути піддерево поточної нотатки",
"collapse-tree": "Згорнути все дерево нотаток", "collapse-tree": "Згорнути все дерево нотаток",
"open-jump-to-note-dialog": "Відкрити вікно \"Перейти до нотатки\"", "open-jump-to-note-dialog": "Відкрити діалог \"Перейти до нотатки\"",
"collapse-subtree": "Згорнути піддерево поточної нотатки", "collapse-subtree": "Згорнути піддерево поточної нотатки",
"sort-child-notes": "Сортувати дочірні нотатки", "sort-child-notes": "Сортувати дочірні нотатки",
"creating-and-moving-notes": "Створення та переміщення нотаток", "creating-and-moving-notes": "Створення та переміщення нотаток",
"create-note-after": "Створити нотатку після активної нотатки", "create-note-after": "Створити нотатку після активної нотатки",
"create-note-into": "Створити нотатку як дочірню до активної нотатки", "create-note-into": "Створити нотатку як дочірню до активної нотатки",
"create-note-into-inbox": "Створити нотатку у \"Вхідні\" (якщо визначено) або в щоденнику", "create-note-into-inbox": "Створити нотатку у вхідні (якщо визначено) або денну нотатку",
"delete-note": "Видалити нотатку", "delete-note": "Видалити нотатку",
"move-note-up": "Перемістити нотатку вгору", "move-note-up": "Перемістити нотатку вгору",
"move-note-down": "Перемістити нотатку вниз", "move-note-down": "Перемістити нотатку вниз",
"move-note-up-in-hierarchy": "Перемістити нотатку вище в ієрархії", "move-note-up-in-hierarchy": "Перемістити нотатку вище в ієрархії",
"move-note-down-in-hierarchy": "Перемістити нотатку вниз в ієрархії", "move-note-down-in-hierarchy": "Перемістити нотатку вниз в ієрархії",
"edit-note-title": "Перейти від дерева до деталей нотатки та редагувати заголовок", "edit-note-title": "Перейти від дерева до деталей нотатки та редагувати заголовок",
"edit-branch-prefix": "Показати вікно \"Редагувати префікс гілки\"", "edit-branch-prefix": "Показати діалог \"Редагувати префікс гілки\"",
"clone-notes-to": "Клонувати вибрані нотатки", "clone-notes-to": "Клонувати вибрані нотатки",
"move-notes-to": "Перемістити вибрані нотатки", "move-notes-to": "Перемістити вибрані нотатки",
"note-clipboard": "Буфер обміну нотатки", "note-clipboard": "Буфер обміну нотатки",
@@ -29,7 +29,7 @@
"paste-notes-from-clipboard": "Вставити нотатки з буферу обміну в активну нотатку", "paste-notes-from-clipboard": "Вставити нотатки з буферу обміну в активну нотатку",
"cut-notes-to-clipboard": "Вирізати вибрані нотатки в буфер обміну", "cut-notes-to-clipboard": "Вирізати вибрані нотатки в буфер обміну",
"select-all-notes-in-parent": "Вибрати всі нотатки з поточного рівня нотаток", "select-all-notes-in-parent": "Вибрати всі нотатки з поточного рівня нотаток",
"add-note-above-to-the-selection": "Додати нотатку вище до виділення", "add-note-above-to-the-selection": "Додати нотатку вище до вибраного",
"add-note-below-to-selection": "Додати нотатку нижче до вибраного", "add-note-below-to-selection": "Додати нотатку нижче до вибраного",
"duplicate-subtree": "Дублювання піддерева", "duplicate-subtree": "Дублювання піддерева",
"tabs-and-windows": "Вкладки & Вікна", "tabs-and-windows": "Вкладки & Вікна",
@@ -51,21 +51,21 @@
"ninth-tab": "Активувати дев'яту вкладку у списку", "ninth-tab": "Активувати дев'яту вкладку у списку",
"last-tab": "Активувати останню вкладку у списку", "last-tab": "Активувати останню вкладку у списку",
"dialogs": "Діалоги", "dialogs": "Діалоги",
"show-note-source": "Показати \"Джерело нотатки\"", "show-note-source": "Показати діалог \"Джерело нотатки\"",
"show-options": "Відкрити \"Параметри\"", "show-options": "Відкрити сторінку \"Параметри\"",
"show-revisions": "Показати \"Версії нотаток\"", "show-revisions": "Показати діалог \"Версії нотаток\"",
"show-recent-changes": "Показати \"Останні зміни\"", "show-recent-changes": "Показати діалог \"Останні зміни\"",
"show-sql-console": "Відкрити \"Консоль SQL\"", "show-sql-console": "Відкрити сторінку \"Консоль SQL\"",
"show-backend-log": "Відкрити \"Backend Log\"", "show-backend-log": "Відкрити сторінку \"Backend Log\"",
"show-help": "Відкрити вбудований Посібник користувача", "show-help": "Відкрити вбудований Посібник користувача",
"show-cheatsheet": "Показати вікно зі стандартними діями клавіатури", "show-cheatsheet": "Показати вікно зі стандартними діями клавіатури",
"text-note-operations": "Дії з текстовими нотатками", "text-note-operations": "Дії з текстовими нотатками",
"add-link-to-text": "Відкрити діалогове вікно для додавання посилання до тексту", "add-link-to-text": "Відкрити діалог для додавання посилання до тексту",
"follow-link-under-cursor": "Перейдіть за посиланням, на якому знаходиться курсор", "follow-link-under-cursor": "Перехід за посиланням, на якому знаходиться курсор",
"insert-date-and-time-to-text": "Вставити поточну дату & час у текст", "insert-date-and-time-to-text": "Вставити поточну дату & час у текст",
"paste-markdown-into-text": "Вставити Markdown з буфера обміну в текстову нотатку", "paste-markdown-into-text": "Вставити Markdown з буфера обміну в текстову нотатку",
"cut-into-note": "Вирізати виділений фрагмент із поточної нотатки та створити піднотатку з виділеним текстом", "cut-into-note": "Вирізати виділений фрагмент із поточної нотатки та створити піднотатку з виділеним текстом",
"add-include-note-to-text": "Відкрити вікно для додавання нотатки", "add-include-note-to-text": "Відкрити діалог для додавання нотатки",
"edit-readonly-note": "Редагувати нотатку, доступну тільки для читання", "edit-readonly-note": "Редагувати нотатку, доступну тільки для читання",
"attributes-labels-and-relations": "Атрибути (мітки & зв'язки)", "attributes-labels-and-relations": "Атрибути (мітки & зв'язки)",
"add-new-label": "Створити нову мітку", "add-new-label": "Створити нову мітку",
@@ -85,121 +85,122 @@
"toggle-right-pane": "Увімкнути відображення правої панелі, яка містить Зміст та Основні моменти", "toggle-right-pane": "Увімкнути відображення правої панелі, яка містить Зміст та Основні моменти",
"print-active-note": "Друк активної нотатки", "print-active-note": "Друк активної нотатки",
"open-note-externally": "Відкрити нотатку як файл у програмі за замовчуванням", "open-note-externally": "Відкрити нотатку як файл у програмі за замовчуванням",
"render-active-note": "Відтворити (повторно відтворити) активну нотатку", "render-active-note": "Рендеринг (перерендерінг) активної нотатки",
"run-active-note": "Виконати активний код JavaScript (frontend/backend) нотатки з кодом", "run-active-note": "Виконати активний код JavaScript (frontend/backend) нотатки з кодом",
"toggle-note-hoisting": "Увімкнути хостинг активної нотатки", "toggle-note-hoisting": "Увімкнути хостинг активної нотатки",
"unhoist": "Зняти з будь-якого місця", "unhoist": "Відкріпити з будь-якого місця",
"reload-frontend-app": "Перезавантажити інтерфейс", "reload-frontend-app": "Перезавантажити інтерфейс",
"open-dev-tools": "Відкрити інструменти розробника", "open-dev-tools": "Відкрити інструменти розробника",
"find-in-text": "Увімкнути панель пошуку", "find-in-text": "Увімкнути панель пошуку",
"toggle-left-note-tree-panel": "Увімкнути ліву панель (дерево нотаток)", "toggle-left-note-tree-panel": "Увімкнути ліву панель (дерево нотатки)",
"toggle-full-screen": "Увімкнути повноекранний режим", "toggle-full-screen": "Увімкнути повноекранний режим",
"zoom-out": "Зменшити масштаб", "zoom-out": "Зменшити масштаб",
"zoom-in": "Збільшити масштаб", "zoom-in": "Збільшити масштаб",
"note-navigation": "Навігація по нотатках", "note-navigation": "Навігація по нотатках",
"reset-zoom-level": "Скинути масштабування", "reset-zoom-level": "Скинути рівень масштабування",
"copy-without-formatting": "Копіювати виділений текст без форматування", "copy-without-formatting": "Копіювати виділений текст без форматування",
"force-save-revision": "Примусове створення/збереження нової версії активної нотатки", "force-save-revision": "Примусове створення/збереження нової версії активної нотатки",
"toggle-book-properties": "Увімкнути Властивості Колекції", "toggle-book-properties": "Увімкнути Властивості Колекції",
"toggle-classic-editor-toolbar": "Увімкнути вкладку Форматування для редактора з фіксованою панеллю інструментів", "toggle-classic-editor-toolbar": "Увімкнути вкладку Форматування для редактора з фіксованою панеллю інструментів",
"export-as-pdf": "Експортувати поточну нотатку в PDF", "export-as-pdf": "Експортувати поточну нотатку в PDF",
"toggle-zen-mode": "Вмикає/вимикає Дзен-режим (мінімальний інтерфейс для більш сфокусованого редагування)" "toggle-zen-mode": "Вмикає/вимикає Дзен-режим (мінімальний інтерфейс сфокусованого редагування)"
}, },
"keyboard_action_names": { "keyboard_action_names": {
"back-in-note-history": "Назад до Історії Нотаток", "back-in-note-history": "Назад в Історії нотаток",
"forward-in-note-history": "Вперед в Історія Нотаток", "forward-in-note-history": "Вперед в Історії нотаток",
"jump-to-note": "Перейти до...", "jump-to-note": "Перейти до...",
"command-palette": "Палітра Команд", "command-palette": "Палітра Команд",
"scroll-to-active-note": "Прокрутити до Активної Нотатки", "scroll-to-active-note": "Прокрутити до Активної нотатки",
"quick-search": "Швидкий Пошук", "quick-search": "Швидкий Пошук",
"search-in-subtree": "Пошук у Піддереві", "search-in-subtree": "Пошук у Піддереві",
"expand-subtree": "Розгорнути Піддерево", "expand-subtree": "Розгорнути Піддерево",
"collapse-tree": "Згорнути Дерево", "collapse-tree": "Згорнути Дерево",
"collapse-subtree": "Згорнути Піддерево", "collapse-subtree": "Згорнути Піддерево",
"sort-child-notes": "Сортувати Дочірні Нотатки", "sort-child-notes": "Сортувати Дочірні нотатки",
"create-note-after": "Створити Нотатку після", "create-note-after": "Створити Нотатку після",
"create-note-into": "Створити Нотатку в", "create-note-into": "Створити Нотатку в",
"create-note-into-inbox": "Створити Нотатку у \"Вхідні\"", "create-note-into-inbox": "Створити Нотатку у Вхідні",
"delete-notes": "Видалити Нотатки", "delete-notes": "Видалити Нотатки",
"move-note-up": "Перемістити Нотатку вгору", "move-note-up": "Перемістити Нотатку вгору",
"move-note-down": "Перемістити Нотатку вниз", "move-note-down": "Перемістити Нотатку вниз",
"move-note-up-in-hierarchy": "Перемістити Нотатку вгору в ієрархії", "move-note-up-in-hierarchy": "Перемістити Нотатку вгору в Ієрархії",
"move-note-down-in-hierarchy": "Перемістити Нотатку вниз в ієрархії", "move-note-down-in-hierarchy": "Перемістити Нотатку вниз в Ієрархії",
"edit-note-title": "Редагувати Заголовок Нотатки", "edit-note-title": "Редагувати Заголовок нотатки",
"edit-branch-prefix": "Редагувати Префікс Гілки", "edit-branch-prefix": "Редагувати префікс Гілки",
"clone-notes-to": "Клонувати Нотатки до", "clone-notes-to": "Клонувати нотатки до",
"move-notes-to": "Перемістити Нотатки до", "move-notes-to": "Перемістити нотатки до",
"copy-notes-to-clipboard": "Копіювати Нотатки в Буфер обміну", "copy-notes-to-clipboard": "Копіювати нотатки в Буфер обміну",
"paste-notes-from-clipboard": "Вставити Нотатки з Буфера обміну", "paste-notes-from-clipboard": "Вставити нотатки з Буфера обміну",
"cut-notes-to-clipboard": "Вирізати Нотатки в Буфер обміну", "cut-notes-to-clipboard": "Вирізати нотатки в Буфер обміну",
"select-all-notes-in-parent": "Вибрати всі Нотатки в \"Батьківські\"", "select-all-notes-in-parent": "Вибрати всі нотатки в Батьківські",
"add-note-above-to-selection": "Додати Нотатку вище до виділення", "add-note-above-to-selection": "Додати Нотатку вище до вибраного",
"add-note-below-to-selection": "Додати Нотатку нижче до виділення", "add-note-below-to-selection": "Додати Нотатку нижче до вибраного",
"duplicate-subtree": "Дублікат Піддерева", "duplicate-subtree": "Дублікат Піддерева",
"open-new-tab": "Відкрити Нову Вкладку", "open-new-tab": "Відкрити Нову вкладку",
"close-active-tab": "Закрити Активну Вкладку", "close-active-tab": "Закрити активну вкладку",
"reopen-last-tab": "Відкрити Останню Вкладку", "reopen-last-tab": "Відкрити останню вкладку",
"activate-next-tab": "Активувати Наступну Вкладку", "activate-next-tab": "Активувати наступну вкладку",
"activate-previous-tab": "Активувати Попередню Вкладку", "activate-previous-tab": "Активувати попередню вкладку",
"open-new-window": "Відкрити Нове Вікно", "open-new-window": "Відкрити Нове вікно",
"toggle-system-tray-icon": "Увімкнути Значок системного трея", "toggle-system-tray-icon": "Увімкнути Значок системного трея",
"toggle-zen-mode": "Увімкнути Дзен-режим", "toggle-zen-mode": "Увімкнути Дзен-режим",
"switch-to-first-tab": "Перейти до першої вкладки", "switch-to-first-tab": "Перейти до першої вкладки",
"switch-to-second-tab": "Перейти до другої вкладки", "switch-to-second-tab": "Перейти до другої вкладки",
"switch-to-third-tab": "Перейти до третьої вкладки", "switch-to-third-tab": "Перейти до третьої вкладки",
"switch-to-fourth-tab": "Перейти до четвертої вкладки", "switch-to-fourth-tab": "Перейти до четвертої вкладки",
"switch-to-fifth-tab": "Перейти на п'яту вкладку", "switch-to-fifth-tab": "Перейти до п'ятої вкладки",
"switch-to-sixth-tab": "Перейти до шостої вкладки", "switch-to-sixth-tab": "Перейти до шостої вкладки",
"switch-to-seventh-tab": "Перейти до сьомої вкладки", "switch-to-seventh-tab": "Перейти до сьомої вкладки",
"switch-to-eighth-tab": "Перейти до восьмої вкладки", "switch-to-eighth-tab": "Перейти до восьмої вкладки",
"find-in-text": "Знайти в тексті", "find-in-text": "Знайти в тексті",
"toggle-left-pane": "Увімкнути ліву панель", "toggle-left-pane": "Увімкнути Ліву панель",
"toggle-full-screen": "Увімкнути повноекранний режим", "toggle-full-screen": "Увімкнути Повноекранний режим",
"zoom-out": "Зменшити масштаб", "zoom-out": "Зменшити масштаб",
"zoom-in": "Збільшити масштаб", "zoom-in": "Збільшити масштаб",
"reset-zoom-level": "Скинути масштабування", "reset-zoom-level": "Скинути Масштабування",
"copy-without-formatting": "Копіювати без форматування", "copy-without-formatting": "Копіювати без форматування",
"force-save-revision": "Примусове збереження версії", "force-save-revision": "Примусове збереження версії",
"switch-to-ninth-tab": "Перейти на дев'яту вкладку", "switch-to-ninth-tab": "Перейти до дев'ятої вкладки",
"switch-to-last-tab": "Перейти до останньої вкладки", "switch-to-last-tab": "Перейти до останньої вкладки",
"show-note-source": "Показати Джерело Нотатки", "show-note-source": "Показати Джерело нотатки",
"show-options": "Показати Параметри", "show-options": "Показати Параметри",
"show-revisions": "Показати Версії", "show-revisions": "Показати Версії",
"show-recent-changes": "Показати Останні Зміни", "show-recent-changes": "Показати Останні зміни",
"show-sql-console": "Показати консоль SQL", "show-sql-console": "Показати Консоль SQL",
"show-backend-log": "Показати Backend Log", "show-backend-log": "Показати Backend Log",
"show-help": "Показати Довідку", "show-help": "Показати Допомогу",
"show-cheatsheet": "Показати Шпаргалку", "show-cheatsheet": "Показати Шпаргалку",
"add-link-to-text": "Додати посилання до тексту", "add-link-to-text": "Додати Посилання до тексту",
"follow-link-under-cursor": "Перейти за посиланням під курсором", "follow-link-under-cursor": "Перейти за Посиланням під курсором",
"insert-date-and-time-to-text": "Вставити Дату та Час у текст", "insert-date-and-time-to-text": "Вставити Дату та Час у текст",
"paste-markdown-into-text": "Вставити Markdown у текст", "paste-markdown-into-text": "Вставити Markdown у текст",
"cut-into-note": "Вирізати у Нотатку", "cut-into-note": "Вирізати у нотатку",
"add-include-note-to-text": "Додати включену Нотатку до тексту", "add-include-note-to-text": "Додати включену нотатку до тексту",
"edit-read-only-note": "Редагувати нотатку лише для читання", "edit-read-only-note": "Редагувати нотатку лише для читання",
"add-new-label": "Додати Нову Мітку", "add-new-label": "Додати Нову мітку",
"add-new-relation": "Додати Новий Зв'язок", "add-new-relation": "Додати Новий зв'язок",
"toggle-ribbon-tab-classic-editor": "Включити вкладку стрічки \"Класичний Редактор\"", "toggle-ribbon-tab-classic-editor": "Включити Вкладку стрічки Класичний Редактор",
"toggle-ribbon-tab-basic-properties": "Включити вкладку стрічки \"Основні властивості\"", "toggle-ribbon-tab-basic-properties": "Включити Вкладку стрічки Основні властивості",
"toggle-ribbon-tab-book-properties": "Включити вкладку стрічки \"Властивості Книги\"", "toggle-ribbon-tab-book-properties": "Включити вкладку стрічки Властивості книги",
"toggle-ribbon-tab-file-properties": "Включити вкладку стрічки \"Властивості файлу\"", "toggle-ribbon-tab-file-properties": "Включити вкладку стрічки Властивості Файлу",
"toggle-ribbon-tab-image-properties": "Включити вкладку стрічки \"Властивості Зображення\"", "toggle-ribbon-tab-image-properties": "Включити вкладку стрічки Властивості Зображення",
"toggle-ribbon-tab-owned-attributes": "Включити вкладку стрічки \"Власні атрибути\"", "toggle-ribbon-tab-owned-attributes": "Включити вкладку стрічки Власні Атрибути",
"toggle-ribbon-tab-inherited-attributes": "Включити вкладку стрічки \"Успадковані Атрибути\"", "toggle-ribbon-tab-inherited-attributes": "Включити вкладку стрічки Успадковані Атрибути",
"toggle-ribbon-tab-promoted-attributes": "Включити вкладку стрічки \"Просунуті Атрибути\"", "toggle-ribbon-tab-promoted-attributes": "Включити вкладку стрічки Просунуті Атрибути",
"toggle-ribbon-tab-note-map": "Включити вкладку стрічки \"Карта Нотатки\"", "toggle-ribbon-tab-note-map": "Включити вкладку стрічки Карта Нотатки",
"toggle-ribbon-tab-note-info": "Включити вкладку стрічки \"Інформація про Нотатку\"", "toggle-ribbon-tab-note-info": "Включити вкладку стрічки Інформація про Нотатку",
"toggle-ribbon-tab-note-paths": "Включити вкладку стрічки \"Шляхи Нотатки\"", "toggle-ribbon-tab-note-paths": "Включити вкладку стрічки Шляхи Нотатки",
"toggle-ribbon-tab-similar-notes": "Включити вкладку стрічки \"Схожі Нотатки\"", "toggle-ribbon-tab-similar-notes": "Включити вкладку стрічки Схожі Нотатки",
"toggle-right-pane": "Включити праву панель", "toggle-right-pane": "Включити Праву панель",
"print-active-note": "Друк Активної Нотатки", "print-active-note": "Друк Активної Нотатки",
"export-active-note-as-pdf": "Експорт активної нотатки у PDF", "export-active-note-as-pdf": "Експорт Активної нотатки у PDF",
"open-note-externally": "Відкрити Нотатку зовнішньою програмою", "open-note-externally": "Відкрити Нотатку зовнішньою програмою",
"render-active-note": "Відтворити Активну Нотатку", "render-active-note": "Рендеринг Активної Нотатки",
"run-active-note": "Запустити Активну Нотатку", "run-active-note": "Запустити Активну Нотатку",
"toggle-note-hoisting": "Включити хостинг нотатки", "toggle-note-hoisting": "Включити хостинг нотатки",
"reload-frontend-app": "Перезавантажити інтерфейс програми", "reload-frontend-app": "Перезавантажити Інтерфейс програми",
"open-developer-tools": "Відкрити Інструменти розробника" "open-developer-tools": "Відкрити Інструменти розробника",
"unhoist-note": "Відкріпити Нотатку"
}, },
"login": { "login": {
"title": "Увійти", "title": "Увійти",
@@ -212,7 +213,7 @@
"sign_in_with_sso": "Увійти за допомогою {{ ssoIssuerName }}" "sign_in_with_sso": "Увійти за допомогою {{ ssoIssuerName }}"
}, },
"set_password": { "set_password": {
"title": "Встановити пароль", "title": "Встановити Пароль",
"heading": "Встановити пароль", "heading": "Встановити пароль",
"description": "Перш ніж почати користуватися Trilium з веб-сайту, вам потрібно спочатку встановити пароль. Потім ви будете використовувати цей пароль для входу в систему.", "description": "Перш ніж почати користуватися Trilium з веб-сайту, вам потрібно спочатку встановити пароль. Потім ви будете використовувати цей пароль для входу в систему.",
"password": "Пароль", "password": "Пароль",
@@ -305,55 +306,56 @@
}, },
"hidden-subtree": { "hidden-subtree": {
"root-title": "Приховані Нотатки", "root-title": "Приховані Нотатки",
"search-history-title": "Історія Пошуку", "search-history-title": "Історія пошуку",
"note-map-title": "Карта Нотатки", "note-map-title": "Карта Нотатки",
"sql-console-history-title": "Історія консолі SQL", "sql-console-history-title": "Історія консолі SQL",
"shared-notes-title": "Спільні Нотатки", "shared-notes-title": "Спільні Нотатки",
"bulk-action-title": "Масова дія", "bulk-action-title": "Масова дія",
"backend-log-title": "Backend Log", "backend-log-title": "Backend Log",
"user-hidden-title": "Прихований користувач", "user-hidden-title": "Прихований користувач",
"launch-bar-templates-title": "Шаблони Панелі запуску", "launch-bar-templates-title": "Запуск Шаблони панелей",
"base-abstract-launcher-title": "Базовий Абстрактний лаунчер", "base-abstract-launcher-title": "Базовий Лаунчер Abstract",
"command-launcher-title": "Командний лаунчер", "command-launcher-title": "Лаунчер Command",
"note-launcher-title": "Лаунчер нотаток", "note-launcher-title": "Лаунчер Note",
"script-launcher-title": "Запуск скриптів", "script-launcher-title": "Лаунчер Script",
"built-in-widget-title": "Вбудований віджет", "built-in-widget-title": "Вбудований віджет",
"custom-widget-title": "Користувацький віджет", "custom-widget-title": "Користувацький віджет",
"launch-bar-title": "Панель запуску", "launch-bar-title": "Панель запуску",
"available-launchers-title": "Доступні лаунчери", "available-launchers-title": "Доступні Лаунчери",
"go-to-previous-note-title": "Перейти до попередньої нотатки", "go-to-previous-note-title": "Перейти до попередньої нотатки",
"go-to-next-note-title": "Перейти до наступної нотатки", "go-to-next-note-title": "Перейти до наступної нотатки",
"new-note-title": "Нова нотатка", "new-note-title": "Нова Нотатка",
"search-notes-title": "Пошук нотаток", "search-notes-title": "Пошук нотаток",
"jump-to-note-title": "Перейти до...", "jump-to-note-title": "Перейти до...",
"calendar-title": "Календар", "calendar-title": "Календар",
"recent-changes-title": "Останні зміни", "recent-changes-title": "Останні Зміни",
"bookmarks-title": "Закладки", "bookmarks-title": "Закладки",
"open-today-journal-note-title": "Відкрити Щоденник за сьогодні", "open-today-journal-note-title": "Відкрити Щоденник за Сьогодні",
"quick-search-title": "Швидкий пошук", "quick-search-title": "Швидкий Пошук",
"protected-session-title": "Захищений сеанс", "protected-session-title": "Захищений Сеанс",
"sync-status-title": "Статус синхронізації", "sync-status-title": "Статус синхронізації",
"settings-title": "Налаштування", "settings-title": "Налаштування",
"llm-chat-title": "Чат з Нотатками", "llm-chat-title": "Чат з Нотатками",
"options-title": "Параметри", "options-title": "Параметри",
"appearance-title": "Зовнішній вигляд", "appearance-title": "Зовнішній вигляд",
"shortcuts-title": "Швидкі клавіші", "shortcuts-title": "Комбінації клавіші",
"text-notes": "Текстові Нотатки", "text-notes": "Текстові Нотатки",
"code-notes-title": "Нотатка з кодом", "code-notes-title": "Нотатка з кодом",
"images-title": "Зображення", "images-title": "Зображення",
"spellcheck-title": "Перевірка орфографії", "spellcheck-title": "Перевірка Орфографії",
"password-title": "Пароль", "password-title": "Пароль",
"multi-factor-authentication-title": "МФА", "multi-factor-authentication-title": "MFA",
"etapi-title": "ETAPI", "etapi-title": "ETAPI",
"backup-title": "Резервне копіювання", "backup-title": "Резервне копіювання",
"sync-title": "Синхронізація", "sync-title": "Синхронізація",
"ai-llm-title": "AI/LLM", "ai-llm-title": "AI/LLM",
"other": "Інше", "other": "Інше",
"advanced-title": "Розширені", "advanced-title": "Розширені",
"visible-launchers-title": "Видимі лаунчери", "visible-launchers-title": "Видимі Лаунчери",
"user-guide": "Посібник користувача", "user-guide": "Посібник користувача",
"localization": "Мова & регіон", "localization": "Мова & Регіон",
"inbox-title": "Вхідні" "inbox-title": "Вхідні",
"spacer-title": "Роздільник"
}, },
"notes": { "notes": {
"new-note": "Нова нотатка", "new-note": "Нова нотатка",
@@ -378,7 +380,7 @@
"close": "Вихід з Trilium", "close": "Вихід з Trilium",
"recents": "Останні нотатки", "recents": "Останні нотатки",
"bookmarks": "Закладки", "bookmarks": "Закладки",
"today": "Відкрити Щоденник за сьогодні", "today": "Відкрити щоденник за сьогодні",
"new-note": "Нова нотатка", "new-note": "Нова нотатка",
"show-windows": "Показати вікна", "show-windows": "Показати вікна",
"open_new_window": "Відкрити нове вікно" "open_new_window": "Відкрити нове вікно"
@@ -394,7 +396,7 @@
"share_theme": { "share_theme": {
"site-theme": "Тема сайту", "site-theme": "Тема сайту",
"search_placeholder": "Пошук...", "search_placeholder": "Пошук...",
"image_alt": "Зображення статті", "image_alt": "Зображення до статті",
"last-updated": "Останнє оновлення: {{- date}}", "last-updated": "Останнє оновлення: {{- date}}",
"subpages": "Підсторінки:", "subpages": "Підсторінки:",
"on-this-page": "На цій сторінці", "on-this-page": "На цій сторінці",

View File

@@ -9,7 +9,7 @@
<link rel="manifest" crossorigin="use-credentials" href="manifest.webmanifest"> <link rel="manifest" crossorigin="use-credentials" href="manifest.webmanifest">
<title>Trilium Notes</title> <title>Trilium Notes</title>
</head> </head>
<body class="desktop heading-style-<%= headingStyle %> layout-<%= layoutOrientation %> platform-<%= platform %> <%= isElectron ? 'electron' : '' %> <%= hasNativeTitleBar ? 'native-titlebar' : '' %> <%= hasBackgroundEffects ? 'background-effects' : '' %>"> <body id="trilium-app" class="desktop heading-style-<%= headingStyle %> layout-<%= layoutOrientation %> platform-<%= platform %> <%= isElectron ? 'electron' : '' %> <%= hasNativeTitleBar ? 'native-titlebar' : '' %> <%= hasBackgroundEffects ? 'background-effects' : '' %>">
<noscript><%= t("javascript-required") %></noscript> <noscript><%= t("javascript-required") %></noscript>
<script> <script>

View File

@@ -63,6 +63,9 @@ const ALLOWED_OPTIONS = new Set<OptionNames>([
"dailyBackupEnabled", "dailyBackupEnabled",
"weeklyBackupEnabled", "weeklyBackupEnabled",
"monthlyBackupEnabled", "monthlyBackupEnabled",
"motionEnabled",
"shadowsEnabled",
"backdropEffectsEnabled",
"maxContentWidth", "maxContentWidth",
"compressImages", "compressImages",
"downloadImagesAutomatically", "downloadImagesAutomatically",

View File

@@ -0,0 +1,348 @@
import { vi, describe, it, expect, beforeEach, afterEach } from "vitest";
import fs from "fs";
import ini from "ini";
// Mock dependencies
vi.mock("fs");
vi.mock("./data_dir.js", () => ({
default: {
CONFIG_INI_PATH: "/test/config.ini"
}
}));
vi.mock("./resource_dir.js", () => ({
default: {
RESOURCE_DIR: "/test/resources"
}
}));
describe("Config Service", () => {
let originalEnv: NodeJS.ProcessEnv;
beforeEach(() => {
// Save original environment
originalEnv = { ...process.env };
// Clear all TRILIUM env vars
Object.keys(process.env).forEach(key => {
if (key.startsWith("TRILIUM_")) {
delete process.env[key];
}
});
// Mock fs to return empty config
vi.mocked(fs.existsSync).mockReturnValue(true);
vi.mocked(fs.readFileSync).mockImplementation((path) => {
if (String(path).includes("config-sample.ini")) {
return "" as any; // Return string for INI parsing
}
// Return empty INI config as string
return `
[General]
[Network]
[Session]
[Sync]
[MultiFactorAuthentication]
[Logging]
` as any;
});
// Clear module cache to reload config with new env vars
vi.resetModules();
});
afterEach(() => {
// Restore original environment
process.env = originalEnv;
vi.clearAllMocks();
});
describe("Environment Variable Naming", () => {
it("should use standard environment variables following TRILIUM_[SECTION]_[KEY] pattern", async () => {
// Set standard env vars
process.env.TRILIUM_GENERAL_INSTANCENAME = "test-instance";
process.env.TRILIUM_NETWORK_CORSALLOWORIGIN = "https://example.com";
process.env.TRILIUM_SYNC_SYNCSERVERHOST = "sync.example.com";
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL = "https://auth.example.com";
process.env.TRILIUM_LOGGING_RETENTIONDAYS = "30";
const { default: config } = await import("./config.js");
expect(config.General.instanceName).toBe("test-instance");
expect(config.Network.corsAllowOrigin).toBe("https://example.com");
expect(config.Sync.syncServerHost).toBe("sync.example.com");
expect(config.MultiFactorAuthentication.oauthBaseUrl).toBe("https://auth.example.com");
expect(config.Logging.retentionDays).toBe(30);
});
it("should maintain backward compatibility with alias environment variables", async () => {
// Set alias/legacy env vars
process.env.TRILIUM_NETWORK_CORS_ALLOW_ORIGIN = "https://legacy.com";
process.env.TRILIUM_SYNC_SERVER_HOST = "legacy-sync.com";
process.env.TRILIUM_OAUTH_BASE_URL = "https://legacy-auth.com";
process.env.TRILIUM_LOGGING_RETENTION_DAYS = "60";
const { default: config } = await import("./config.js");
expect(config.Network.corsAllowOrigin).toBe("https://legacy.com");
expect(config.Sync.syncServerHost).toBe("legacy-sync.com");
expect(config.MultiFactorAuthentication.oauthBaseUrl).toBe("https://legacy-auth.com");
expect(config.Logging.retentionDays).toBe(60);
});
it("should prioritize standard env vars over aliases when both are set", async () => {
// Set both standard and alias env vars - standard should win
process.env.TRILIUM_NETWORK_CORSALLOWORIGIN = "standard-cors.com";
process.env.TRILIUM_NETWORK_CORS_ALLOW_ORIGIN = "alias-cors.com";
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL = "standard-auth.com";
process.env.TRILIUM_OAUTH_BASE_URL = "alias-auth.com";
const { default: config } = await import("./config.js");
expect(config.Network.corsAllowOrigin).toBe("standard-cors.com");
expect(config.MultiFactorAuthentication.oauthBaseUrl).toBe("standard-auth.com");
});
it("should handle all CORS environment variables correctly", async () => {
// Test with standard naming
process.env.TRILIUM_NETWORK_CORSALLOWORIGIN = "*";
process.env.TRILIUM_NETWORK_CORSALLOWMETHODS = "GET,POST,PUT";
process.env.TRILIUM_NETWORK_CORSALLOWHEADERS = "Content-Type,Authorization";
let { default: config } = await import("./config.js");
expect(config.Network.corsAllowOrigin).toBe("*");
expect(config.Network.corsAllowMethods).toBe("GET,POST,PUT");
expect(config.Network.corsAllowHeaders).toBe("Content-Type,Authorization");
// Clear and test with alias naming
delete process.env.TRILIUM_NETWORK_CORSALLOWORIGIN;
delete process.env.TRILIUM_NETWORK_CORSALLOWMETHODS;
delete process.env.TRILIUM_NETWORK_CORSALLOWHEADERS;
process.env.TRILIUM_NETWORK_CORS_ALLOW_ORIGIN = "https://app.com";
process.env.TRILIUM_NETWORK_CORS_ALLOW_METHODS = "GET,POST";
process.env.TRILIUM_NETWORK_CORS_ALLOW_HEADERS = "X-Custom-Header";
vi.resetModules();
config = (await import("./config.js")).default;
expect(config.Network.corsAllowOrigin).toBe("https://app.com");
expect(config.Network.corsAllowMethods).toBe("GET,POST");
expect(config.Network.corsAllowHeaders).toBe("X-Custom-Header");
});
it("should handle all OAuth/MFA environment variables correctly", async () => {
// Test with standard naming
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL = "https://oauth.standard.com";
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID = "standard-client-id";
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET = "standard-secret";
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL = "https://issuer.standard.com";
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME = "Standard Auth";
process.env.TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON = "standard-icon.png";
let { default: config } = await import("./config.js");
expect(config.MultiFactorAuthentication.oauthBaseUrl).toBe("https://oauth.standard.com");
expect(config.MultiFactorAuthentication.oauthClientId).toBe("standard-client-id");
expect(config.MultiFactorAuthentication.oauthClientSecret).toBe("standard-secret");
expect(config.MultiFactorAuthentication.oauthIssuerBaseUrl).toBe("https://issuer.standard.com");
expect(config.MultiFactorAuthentication.oauthIssuerName).toBe("Standard Auth");
expect(config.MultiFactorAuthentication.oauthIssuerIcon).toBe("standard-icon.png");
// Clear and test with alias naming
Object.keys(process.env).forEach(key => {
if (key.startsWith("TRILIUM_MULTIFACTORAUTHENTICATION_")) {
delete process.env[key];
}
});
process.env.TRILIUM_OAUTH_BASE_URL = "https://oauth.alias.com";
process.env.TRILIUM_OAUTH_CLIENT_ID = "alias-client-id";
process.env.TRILIUM_OAUTH_CLIENT_SECRET = "alias-secret";
process.env.TRILIUM_OAUTH_ISSUER_BASE_URL = "https://issuer.alias.com";
process.env.TRILIUM_OAUTH_ISSUER_NAME = "Alias Auth";
process.env.TRILIUM_OAUTH_ISSUER_ICON = "alias-icon.png";
vi.resetModules();
config = (await import("./config.js")).default;
expect(config.MultiFactorAuthentication.oauthBaseUrl).toBe("https://oauth.alias.com");
expect(config.MultiFactorAuthentication.oauthClientId).toBe("alias-client-id");
expect(config.MultiFactorAuthentication.oauthClientSecret).toBe("alias-secret");
expect(config.MultiFactorAuthentication.oauthIssuerBaseUrl).toBe("https://issuer.alias.com");
expect(config.MultiFactorAuthentication.oauthIssuerName).toBe("Alias Auth");
expect(config.MultiFactorAuthentication.oauthIssuerIcon).toBe("alias-icon.png");
});
it("should handle all Sync environment variables correctly", async () => {
// Test with standard naming
process.env.TRILIUM_SYNC_SYNCSERVERHOST = "sync-standard.com";
process.env.TRILIUM_SYNC_SYNCSERVERTIMEOUT = "60000";
process.env.TRILIUM_SYNC_SYNCPROXY = "proxy-standard.com";
let { default: config } = await import("./config.js");
expect(config.Sync.syncServerHost).toBe("sync-standard.com");
expect(config.Sync.syncServerTimeout).toBe("60000");
expect(config.Sync.syncProxy).toBe("proxy-standard.com");
// Clear and test with alias naming
delete process.env.TRILIUM_SYNC_SYNCSERVERHOST;
delete process.env.TRILIUM_SYNC_SYNCSERVERTIMEOUT;
delete process.env.TRILIUM_SYNC_SYNCPROXY;
process.env.TRILIUM_SYNC_SERVER_HOST = "sync-alias.com";
process.env.TRILIUM_SYNC_SERVER_TIMEOUT = "30000";
process.env.TRILIUM_SYNC_SERVER_PROXY = "proxy-alias.com";
vi.resetModules();
config = (await import("./config.js")).default;
expect(config.Sync.syncServerHost).toBe("sync-alias.com");
expect(config.Sync.syncServerTimeout).toBe("30000");
expect(config.Sync.syncProxy).toBe("proxy-alias.com");
});
});
describe("INI Config Integration", () => {
it("should fall back to INI config when no env vars are set", async () => {
// Mock INI config with values
vi.mocked(fs.readFileSync).mockImplementation((path) => {
if (String(path).includes("config-sample.ini")) {
return "" as any;
}
return `
[General]
instanceName=ini-instance
[Network]
corsAllowOrigin=https://ini-cors.com
port=9000
[Sync]
syncServerHost=ini-sync.com
[MultiFactorAuthentication]
oauthBaseUrl=https://ini-oauth.com
[Logging]
retentionDays=45
` as any;
});
const { default: config } = await import("./config.js");
expect(config.General.instanceName).toBe("ini-instance");
expect(config.Network.corsAllowOrigin).toBe("https://ini-cors.com");
expect(config.Network.port).toBe("9000");
expect(config.Sync.syncServerHost).toBe("ini-sync.com");
expect(config.MultiFactorAuthentication.oauthBaseUrl).toBe("https://ini-oauth.com");
expect(config.Logging.retentionDays).toBe(45);
});
it("should prioritize env vars over INI config", async () => {
// Mock INI config with values
vi.mocked(fs.readFileSync).mockImplementation((path) => {
if (String(path).includes("config-sample.ini")) {
return "" as any;
}
return `
[General]
instanceName=ini-instance
[Network]
corsAllowOrigin=https://ini-cors.com
` as any;
});
// Set env vars that should override INI
process.env.TRILIUM_GENERAL_INSTANCENAME = "env-instance";
process.env.TRILIUM_NETWORK_CORS_ALLOW_ORIGIN = "https://env-cors.com"; // Using alias
const { default: config } = await import("./config.js");
expect(config.General.instanceName).toBe("env-instance");
expect(config.Network.corsAllowOrigin).toBe("https://env-cors.com");
});
});
describe("Type Transformations", () => {
it("should correctly transform boolean values", async () => {
process.env.TRILIUM_GENERAL_NOAUTHENTICATION = "true";
process.env.TRILIUM_GENERAL_NOBACKUP = "1";
process.env.TRILIUM_GENERAL_READONLY = "false";
process.env.TRILIUM_NETWORK_HTTPS = "0";
const { default: config } = await import("./config.js");
expect(config.General.noAuthentication).toBe(true);
expect(config.General.noBackup).toBe(true);
expect(config.General.readOnly).toBe(false);
expect(config.Network.https).toBe(false);
});
it("should correctly transform integer values", async () => {
process.env.TRILIUM_SESSION_COOKIEMAXAGE = "3600";
process.env.TRILIUM_LOGGING_RETENTIONDAYS = "7";
const { default: config } = await import("./config.js");
expect(config.Session.cookieMaxAge).toBe(3600);
expect(config.Logging.retentionDays).toBe(7);
});
it("should use default values for invalid integers", async () => {
process.env.TRILIUM_SESSION_COOKIEMAXAGE = "invalid";
process.env.TRILIUM_LOGGING_RETENTION_DAYS = "not-a-number"; // Using alias
const { default: config } = await import("./config.js");
expect(config.Session.cookieMaxAge).toBe(21 * 24 * 60 * 60); // Default
expect(config.Logging.retentionDays).toBe(90); // Default
});
});
describe("Default Values", () => {
it("should use correct default values when no config is provided", async () => {
const { default: config } = await import("./config.js");
// General defaults
expect(config.General.instanceName).toBe("");
expect(config.General.noAuthentication).toBe(false);
expect(config.General.noBackup).toBe(false);
expect(config.General.noDesktopIcon).toBe(false);
expect(config.General.readOnly).toBe(false);
// Network defaults
expect(config.Network.host).toBe("0.0.0.0");
expect(config.Network.port).toBe("3000");
expect(config.Network.https).toBe(false);
expect(config.Network.certPath).toBe("");
expect(config.Network.keyPath).toBe("");
expect(config.Network.trustedReverseProxy).toBe(false);
expect(config.Network.corsAllowOrigin).toBe("");
expect(config.Network.corsAllowMethods).toBe("");
expect(config.Network.corsAllowHeaders).toBe("");
// Session defaults
expect(config.Session.cookieMaxAge).toBe(21 * 24 * 60 * 60);
// Sync defaults
expect(config.Sync.syncServerHost).toBe("");
expect(config.Sync.syncServerTimeout).toBe("120000");
expect(config.Sync.syncProxy).toBe("");
// OAuth defaults
expect(config.MultiFactorAuthentication.oauthBaseUrl).toBe("");
expect(config.MultiFactorAuthentication.oauthClientId).toBe("");
expect(config.MultiFactorAuthentication.oauthClientSecret).toBe("");
expect(config.MultiFactorAuthentication.oauthIssuerBaseUrl).toBe("https://accounts.google.com");
expect(config.MultiFactorAuthentication.oauthIssuerName).toBe("Google");
expect(config.MultiFactorAuthentication.oauthIssuerIcon).toBe("");
// Logging defaults
expect(config.Logging.retentionDays).toBe(90);
});
});
});

View File

@@ -1,3 +1,24 @@
/**
* ╔════════════════════════════════════════════════════════════════════════════╗
* ║ TRILIUM CONFIGURATION RESOLUTION ORDER ║
* ╠════════════════════════════════════════════════════════════════════════════╣
* ║ ║
* ║ Priority │ Source │ Example ║
* ║ ─────────┼─────────────────────────────────┼─────────────────────────────║
* ║ 1 │ Environment Variables │ TRILIUM_NETWORK_PORT=8080 ║
* ║ ↓ │ (Highest Priority - Overrides all) ║
* ║ │ ║
* ║ 2 │ config.ini File │ [Network] ║
* ║ ↓ │ (User Configuration) │ port=8080 ║
* ║ │ ║
* ║ 3 │ Default Values │ port='3000' ║
* ║ │ (Lowest Priority - Fallback) │ (hardcoded defaults) ║
* ║ ║
* ╠════════════════════════════════════════════════════════════════════════════╣
* ║ IMPORTANT: Environment variables ALWAYS override config.ini values! ║
* ╚════════════════════════════════════════════════════════════════════════════╝
*/
import ini from "ini"; import ini from "ini";
import fs from "fs"; import fs from "fs";
import dataDir from "./data_dir.js"; import dataDir from "./data_dir.js";
@@ -5,153 +26,594 @@ import path from "path";
import resourceDir from "./resource_dir.js"; import resourceDir from "./resource_dir.js";
import { envToBoolean, stringToInt } from "./utils.js"; import { envToBoolean, stringToInt } from "./utils.js";
/**
* Path to the sample configuration file that serves as a template for new installations.
* This file contains all available configuration options with documentation.
*/
const configSampleFilePath = path.resolve(resourceDir.RESOURCE_DIR, "config-sample.ini"); const configSampleFilePath = path.resolve(resourceDir.RESOURCE_DIR, "config-sample.ini");
/**
* Initialize config.ini file if it doesn't exist.
* On first run, copies the sample configuration to the data directory,
* allowing users to customize their settings.
*/
if (!fs.existsSync(dataDir.CONFIG_INI_PATH)) { if (!fs.existsSync(dataDir.CONFIG_INI_PATH)) {
const configSample = fs.readFileSync(configSampleFilePath).toString("utf8"); const configSample = fs.readFileSync(configSampleFilePath).toString("utf8");
fs.writeFileSync(dataDir.CONFIG_INI_PATH, configSample); fs.writeFileSync(dataDir.CONFIG_INI_PATH, configSample);
} }
const iniConfig = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, "utf-8")); /**
* Type definition for the parsed INI configuration structure.
* The ini parser returns an object with string keys and values that can be
* strings, booleans, numbers, or nested objects.
*/
type IniConfigValue = string | number | boolean | null | undefined;
type IniConfigSection = Record<string, IniConfigValue>;
type IniConfig = Record<string, IniConfigSection | IniConfigValue>;
/**
* Parse the config.ini file into a JavaScript object.
* This object contains all user-defined configuration from the INI file,
* which will be merged with environment variables and defaults.
*/
const iniConfig = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, "utf-8")) as IniConfig;
/**
* Complete type-safe configuration interface for Trilium.
* This interface defines all configuration options available through
* environment variables, config.ini, or defaults.
*/
export interface TriliumConfig { export interface TriliumConfig {
/** General application settings */
General: { General: {
/** Custom instance name for identifying this Trilium instance */
instanceName: string; instanceName: string;
/** Whether to disable authentication (useful for local-only instances) */
noAuthentication: boolean; noAuthentication: boolean;
/** Whether to disable automatic backups */
noBackup: boolean; noBackup: boolean;
/** Whether to prevent desktop icon creation (desktop app only) */
noDesktopIcon: boolean; noDesktopIcon: boolean;
/** Whether to run in read-only mode (prevents all data modifications) */
readOnly: boolean; readOnly: boolean;
}; };
/** Network and server configuration */
Network: { Network: {
/** Host/IP address to bind the server to (e.g., '0.0.0.0' for all interfaces) */
host: string; host: string;
/** Port number for the HTTP/HTTPS server */
port: string; port: string;
/** Whether to enable HTTPS (requires certPath and keyPath) */
https: boolean; https: boolean;
/** Path to SSL certificate file (required when https=true) */
certPath: string; certPath: string;
/** Path to SSL private key file (required when https=true) */
keyPath: string; keyPath: string;
/** Trust reverse proxy headers (boolean or specific IP/subnet string) */
trustedReverseProxy: boolean | string; trustedReverseProxy: boolean | string;
/** CORS allowed origins (comma-separated list or '*' for all) */
corsAllowOrigin: string; corsAllowOrigin: string;
/** CORS allowed methods (comma-separated HTTP methods) */
corsAllowMethods: string; corsAllowMethods: string;
/** CORS allowed headers (comma-separated header names) */
corsAllowHeaders: string; corsAllowHeaders: string;
}; };
/** Session management configuration */
Session: { Session: {
/** Maximum age of session cookies in seconds (default: 21 days) */
cookieMaxAge: number; cookieMaxAge: number;
}; };
/** Synchronization settings for multi-instance setups */
Sync: { Sync: {
/** URL of the sync server to connect to */
syncServerHost: string; syncServerHost: string;
/** Timeout for sync operations in milliseconds */
syncServerTimeout: string; syncServerTimeout: string;
/** Proxy URL for sync connections (if behind corporate proxy) */
syncProxy: string; syncProxy: string;
}; };
/** Multi-factor authentication and OAuth/OpenID configuration */
MultiFactorAuthentication: { MultiFactorAuthentication: {
/** Base URL for OAuth authentication endpoint */
oauthBaseUrl: string; oauthBaseUrl: string;
/** OAuth client ID from your identity provider */
oauthClientId: string; oauthClientId: string;
/** OAuth client secret from your identity provider */
oauthClientSecret: string; oauthClientSecret: string;
/** Base URL of the OAuth issuer (e.g., 'https://accounts.google.com') */
oauthIssuerBaseUrl: string; oauthIssuerBaseUrl: string;
/** Display name of the OAuth provider (shown in UI) */
oauthIssuerName: string; oauthIssuerName: string;
/** URL to the OAuth provider's icon/logo */
oauthIssuerIcon: string; oauthIssuerIcon: string;
}; };
/** Logging configuration */
Logging: { Logging: {
/** /**
* The number of days to keep the log files around. When rotating the logs, log files created by Trilium older than the specified amount of time will be deleted. * The number of days to keep the log files around. When rotating the logs,
* log files created by Trilium older than the specified amount of time will be deleted.
*/ */
retentionDays: number; retentionDays: number;
} }
} }
/**
* Default retention period for log files in days.
* After this period, old log files are automatically deleted during rotation.
*/
export const LOGGING_DEFAULT_RETENTION_DAYS = 90; export const LOGGING_DEFAULT_RETENTION_DAYS = 90;
//prettier-ignore /**
const config: TriliumConfig = { * Configuration value source with precedence handling.
* This interface defines how each configuration value is resolved from multiple sources.
*/
interface ConfigValue<T> {
/**
* Standard environment variable name following TRILIUM_[SECTION]_[KEY] pattern.
* This is the primary way to override configuration via environment.
*/
standardEnvVar?: string;
/**
* Alternative environment variable names for additional flexibility.
* These provide shorter or more intuitive names for common settings.
*/
aliasEnvVars?: string[];
/**
* Function to retrieve the value from the parsed INI configuration.
* Returns undefined if the value is not set in config.ini.
*/
iniGetter: () => IniConfigValue | IniConfigSection;
/**
* Default value used when no environment variable or INI value is found.
* This ensures every configuration has a sensible default.
*/
defaultValue: T;
/**
* Optional transformer function to convert string values to the correct type.
* Common transformers handle boolean and integer conversions.
*/
transformer?: (value: unknown) => T;
}
/**
* Core configuration resolution function.
*
* Resolves configuration values using a clear precedence order:
* 1. Standard environment variable (highest priority) - Follows TRILIUM_[SECTION]_[KEY] pattern
* 2. Alias environment variables - Alternative names for convenience and compatibility
* 3. INI config file value - User-defined settings in config.ini
* 4. Default value (lowest priority) - Fallback to ensure valid configuration
*
* This precedence allows for flexible configuration management:
* - Environment variables for container/cloud deployments
* - config.ini for traditional installations
* - Defaults ensure the application always has valid settings
*
* @param config - Configuration value definition with sources and transformers
* @returns The resolved configuration value with appropriate type
*/
function getConfigValue<T>(config: ConfigValue<T>): T {
// Check standard env var first
if (config.standardEnvVar && process.env[config.standardEnvVar] !== undefined) {
const value = process.env[config.standardEnvVar];
return config.transformer ? config.transformer(value) : value as T;
}
// Check alternative env vars for additional flexibility
if (config.aliasEnvVars) {
for (const aliasVar of config.aliasEnvVars) {
if (process.env[aliasVar] !== undefined) {
const value = process.env[aliasVar];
return config.transformer ? config.transformer(value) : value as T;
}
}
}
// Check INI config
const iniValue = config.iniGetter();
if (iniValue !== undefined && iniValue !== null && iniValue !== '') {
return config.transformer ? config.transformer(iniValue) : iniValue as T;
}
// Return default
return config.defaultValue;
}
/**
* Helper function to safely access INI config sections.
* The ini parser can return either a section object or a primitive value,
* so we need to check the type before accessing nested properties.
*
* @param sectionName - The name of the INI section to access
* @returns The section object or undefined if not found or not an object
*/
function getIniSection(sectionName: string): IniConfigSection | undefined {
const section = iniConfig[sectionName];
if (section && typeof section === 'object' && !Array.isArray(section)) {
return section as IniConfigSection;
}
return undefined;
}
/**
* Transform a value to boolean, handling various input formats.
*
* This function provides flexible boolean parsing to handle different
* configuration sources (environment variables, INI files, etc.):
* - String "true"/"false" (case-insensitive)
* - String "1"/"0"
* - Numeric 1/0
* - Actual boolean values
* - Any other value defaults to false
*
* @param value - The value to transform (string, number, boolean, etc.)
* @returns The boolean value or false as default
*/
function transformBoolean(value: unknown): boolean {
// First try the standard envToBoolean function which handles "true"/"false" strings
const result = envToBoolean(String(value));
if (result !== undefined) return result;
// Handle numeric boolean values (both string and number types)
if (value === "1" || value === 1) return true;
if (value === "0" || value === 0) return false;
// Default to false for any other value
return false;
}
/**
* Complete configuration mapping that defines how each setting is resolved.
*
* This mapping structure:
* 1. Mirrors the INI file sections for consistency
* 2. Defines multiple sources for each configuration value
* 3. Provides type transformers where needed
* 4. Maintains compatibility with various environment variable formats
*
* Environment Variable Patterns:
* - Standard: TRILIUM_[SECTION]_[KEY] (e.g., TRILIUM_GENERAL_INSTANCENAME)
* - Aliases: Shorter alternatives (e.g., TRILIUM_OAUTH_BASE_URL)
*
* Both patterns are equally valid and can be used based on preference.
* The standard pattern provides consistency, while aliases offer convenience.
*/
const configMapping = {
General: { General: {
instanceName: instanceName: {
process.env.TRILIUM_GENERAL_INSTANCENAME || iniConfig.General.instanceName || "", standardEnvVar: 'TRILIUM_GENERAL_INSTANCENAME',
iniGetter: () => getIniSection("General")?.instanceName,
noAuthentication: defaultValue: ''
envToBoolean(process.env.TRILIUM_GENERAL_NOAUTHENTICATION) || iniConfig.General.noAuthentication || false, },
noAuthentication: {
noBackup: standardEnvVar: 'TRILIUM_GENERAL_NOAUTHENTICATION',
envToBoolean(process.env.TRILIUM_GENERAL_NOBACKUP) || iniConfig.General.noBackup || false, iniGetter: () => getIniSection("General")?.noAuthentication,
defaultValue: false,
noDesktopIcon: transformer: transformBoolean
envToBoolean(process.env.TRILIUM_GENERAL_NODESKTOPICON) || iniConfig.General.noDesktopIcon || false, },
noBackup: {
readOnly: standardEnvVar: 'TRILIUM_GENERAL_NOBACKUP',
envToBoolean(process.env.TRILIUM_GENERAL_READONLY) || iniConfig.General.readOnly || false iniGetter: () => getIniSection("General")?.noBackup,
defaultValue: false,
transformer: transformBoolean
},
noDesktopIcon: {
standardEnvVar: 'TRILIUM_GENERAL_NODESKTOPICON',
iniGetter: () => getIniSection("General")?.noDesktopIcon,
defaultValue: false,
transformer: transformBoolean
},
readOnly: {
standardEnvVar: 'TRILIUM_GENERAL_READONLY',
iniGetter: () => getIniSection("General")?.readOnly,
defaultValue: false,
transformer: transformBoolean
}
}, },
Network: { Network: {
host: host: {
process.env.TRILIUM_NETWORK_HOST || iniConfig.Network.host || "0.0.0.0", standardEnvVar: 'TRILIUM_NETWORK_HOST',
iniGetter: () => getIniSection("Network")?.host,
port: defaultValue: '0.0.0.0'
process.env.TRILIUM_NETWORK_PORT || iniConfig.Network.port || "3000", },
port: {
https: standardEnvVar: 'TRILIUM_NETWORK_PORT',
envToBoolean(process.env.TRILIUM_NETWORK_HTTPS) || iniConfig.Network.https || false, iniGetter: () => getIniSection("Network")?.port,
defaultValue: '3000'
certPath: },
process.env.TRILIUM_NETWORK_CERTPATH || iniConfig.Network.certPath || "", https: {
standardEnvVar: 'TRILIUM_NETWORK_HTTPS',
keyPath: iniGetter: () => getIniSection("Network")?.https,
process.env.TRILIUM_NETWORK_KEYPATH || iniConfig.Network.keyPath || "", defaultValue: false,
transformer: transformBoolean
trustedReverseProxy: },
process.env.TRILIUM_NETWORK_TRUSTEDREVERSEPROXY || iniConfig.Network.trustedReverseProxy || false, certPath: {
standardEnvVar: 'TRILIUM_NETWORK_CERTPATH',
corsAllowOrigin: iniGetter: () => getIniSection("Network")?.certPath,
process.env.TRILIUM_NETWORK_CORS_ALLOW_ORIGIN || iniConfig.Network.corsAllowOrigin || "", defaultValue: ''
},
corsAllowMethods: keyPath: {
process.env.TRILIUM_NETWORK_CORS_ALLOW_METHODS || iniConfig.Network.corsAllowMethods || "", standardEnvVar: 'TRILIUM_NETWORK_KEYPATH',
iniGetter: () => getIniSection("Network")?.keyPath,
corsAllowHeaders: defaultValue: ''
process.env.TRILIUM_NETWORK_CORS_ALLOW_HEADERS || iniConfig.Network.corsAllowHeaders || "" },
trustedReverseProxy: {
standardEnvVar: 'TRILIUM_NETWORK_TRUSTEDREVERSEPROXY',
iniGetter: () => getIniSection("Network")?.trustedReverseProxy,
defaultValue: false as boolean | string
},
corsAllowOrigin: {
standardEnvVar: 'TRILIUM_NETWORK_CORSALLOWORIGIN',
// alternative with underscore format
aliasEnvVars: ['TRILIUM_NETWORK_CORS_ALLOW_ORIGIN'],
iniGetter: () => getIniSection("Network")?.corsAllowOrigin,
defaultValue: ''
},
corsAllowMethods: {
standardEnvVar: 'TRILIUM_NETWORK_CORSALLOWMETHODS',
// alternative with underscore format
aliasEnvVars: ['TRILIUM_NETWORK_CORS_ALLOW_METHODS'],
iniGetter: () => getIniSection("Network")?.corsAllowMethods,
defaultValue: ''
},
corsAllowHeaders: {
standardEnvVar: 'TRILIUM_NETWORK_CORSALLOWHEADERS',
// alternative with underscore format
aliasEnvVars: ['TRILIUM_NETWORK_CORS_ALLOW_HEADERS'],
iniGetter: () => getIniSection("Network")?.corsAllowHeaders,
defaultValue: ''
}
}, },
Session: { Session: {
cookieMaxAge: cookieMaxAge: {
parseInt(String(process.env.TRILIUM_SESSION_COOKIEMAXAGE)) || parseInt(iniConfig?.Session?.cookieMaxAge) || 21 * 24 * 60 * 60 // 21 Days in Seconds standardEnvVar: 'TRILIUM_SESSION_COOKIEMAXAGE',
iniGetter: () => getIniSection("Session")?.cookieMaxAge,
defaultValue: 21 * 24 * 60 * 60, // 21 Days in Seconds
transformer: (value: unknown) => parseInt(String(value)) || 21 * 24 * 60 * 60
}
}, },
Sync: { Sync: {
syncServerHost: syncServerHost: {
process.env.TRILIUM_SYNC_SERVER_HOST || iniConfig?.Sync?.syncServerHost || "", standardEnvVar: 'TRILIUM_SYNC_SYNCSERVERHOST',
// alternative format
syncServerTimeout: aliasEnvVars: ['TRILIUM_SYNC_SERVER_HOST'],
process.env.TRILIUM_SYNC_SERVER_TIMEOUT || iniConfig?.Sync?.syncServerTimeout || "120000", iniGetter: () => getIniSection("Sync")?.syncServerHost,
defaultValue: ''
syncProxy: },
// additionally checking in iniConfig for inconsistently named syncProxy for backwards compatibility syncServerTimeout: {
process.env.TRILIUM_SYNC_SERVER_PROXY || iniConfig?.Sync?.syncProxy || iniConfig?.Sync?.syncServerProxy || "" standardEnvVar: 'TRILIUM_SYNC_SYNCSERVERTIMEOUT',
// alternative format
aliasEnvVars: ['TRILIUM_SYNC_SERVER_TIMEOUT'],
iniGetter: () => getIniSection("Sync")?.syncServerTimeout,
defaultValue: '120000'
},
syncProxy: {
standardEnvVar: 'TRILIUM_SYNC_SYNCPROXY',
// alternative shorter formats
aliasEnvVars: ['TRILIUM_SYNC_SERVER_PROXY'],
// The INI config uses 'syncServerProxy' key for historical reasons (see config-sample.ini)
// We check both 'syncProxy' and 'syncServerProxy' for backward compatibility with old configs
iniGetter: () => getIniSection("Sync")?.syncProxy || getIniSection("Sync")?.syncServerProxy,
defaultValue: ''
}
}, },
MultiFactorAuthentication: { MultiFactorAuthentication: {
oauthBaseUrl: oauthBaseUrl: {
process.env.TRILIUM_OAUTH_BASE_URL || iniConfig?.MultiFactorAuthentication?.oauthBaseUrl || "", standardEnvVar: 'TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL',
// alternative shorter format (commonly used)
oauthClientId: aliasEnvVars: ['TRILIUM_OAUTH_BASE_URL'],
process.env.TRILIUM_OAUTH_CLIENT_ID || iniConfig?.MultiFactorAuthentication?.oauthClientId || "", iniGetter: () => getIniSection("MultiFactorAuthentication")?.oauthBaseUrl,
defaultValue: ''
oauthClientSecret: },
process.env.TRILIUM_OAUTH_CLIENT_SECRET || iniConfig?.MultiFactorAuthentication?.oauthClientSecret || "", oauthClientId: {
standardEnvVar: 'TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID',
oauthIssuerBaseUrl: // alternative format
process.env.TRILIUM_OAUTH_ISSUER_BASE_URL || iniConfig?.MultiFactorAuthentication?.oauthIssuerBaseUrl || "https://accounts.google.com", aliasEnvVars: ['TRILIUM_OAUTH_CLIENT_ID'],
iniGetter: () => getIniSection("MultiFactorAuthentication")?.oauthClientId,
oauthIssuerName: defaultValue: ''
process.env.TRILIUM_OAUTH_ISSUER_NAME || iniConfig?.MultiFactorAuthentication?.oauthIssuerName || "Google", },
oauthClientSecret: {
oauthIssuerIcon: standardEnvVar: 'TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET',
process.env.TRILIUM_OAUTH_ISSUER_ICON || iniConfig?.MultiFactorAuthentication?.oauthIssuerIcon || "" // alternative format
aliasEnvVars: ['TRILIUM_OAUTH_CLIENT_SECRET'],
iniGetter: () => getIniSection("MultiFactorAuthentication")?.oauthClientSecret,
defaultValue: ''
},
oauthIssuerBaseUrl: {
standardEnvVar: 'TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL',
// alternative format
aliasEnvVars: ['TRILIUM_OAUTH_ISSUER_BASE_URL'],
iniGetter: () => getIniSection("MultiFactorAuthentication")?.oauthIssuerBaseUrl,
defaultValue: 'https://accounts.google.com'
},
oauthIssuerName: {
standardEnvVar: 'TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME',
// alternative format
aliasEnvVars: ['TRILIUM_OAUTH_ISSUER_NAME'],
iniGetter: () => getIniSection("MultiFactorAuthentication")?.oauthIssuerName,
defaultValue: 'Google'
},
oauthIssuerIcon: {
standardEnvVar: 'TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON',
// alternative format
aliasEnvVars: ['TRILIUM_OAUTH_ISSUER_ICON'],
iniGetter: () => getIniSection("MultiFactorAuthentication")?.oauthIssuerIcon,
defaultValue: ''
}
}, },
Logging: { Logging: {
retentionDays: retentionDays: {
stringToInt(process.env.TRILIUM_LOGGING_RETENTION_DAYS) ?? standardEnvVar: 'TRILIUM_LOGGING_RETENTIONDAYS',
stringToInt(iniConfig?.Logging?.retentionDays) ?? // alternative with underscore format
LOGGING_DEFAULT_RETENTION_DAYS aliasEnvVars: ['TRILIUM_LOGGING_RETENTION_DAYS'],
iniGetter: () => getIniSection("Logging")?.retentionDays,
defaultValue: LOGGING_DEFAULT_RETENTION_DAYS,
transformer: (value: unknown) => stringToInt(String(value)) ?? LOGGING_DEFAULT_RETENTION_DAYS
}
} }
}; };
/**
* Build the final configuration object by resolving all values through the mapping.
*
* This creates the runtime configuration used throughout the application by:
* 1. Iterating through each section and key in the mapping
* 2. Calling getConfigValue() to resolve each setting with proper precedence
* 3. Applying type transformers where needed (booleans, integers)
* 4. Returning a fully typed TriliumConfig object
*
* The resulting config object is immutable at runtime and represents
* the complete application configuration.
*/
const config: TriliumConfig = {
General: {
instanceName: getConfigValue(configMapping.General.instanceName),
noAuthentication: getConfigValue(configMapping.General.noAuthentication),
noBackup: getConfigValue(configMapping.General.noBackup),
noDesktopIcon: getConfigValue(configMapping.General.noDesktopIcon),
readOnly: getConfigValue(configMapping.General.readOnly)
},
Network: {
host: getConfigValue(configMapping.Network.host),
port: getConfigValue(configMapping.Network.port),
https: getConfigValue(configMapping.Network.https),
certPath: getConfigValue(configMapping.Network.certPath),
keyPath: getConfigValue(configMapping.Network.keyPath),
trustedReverseProxy: getConfigValue(configMapping.Network.trustedReverseProxy),
corsAllowOrigin: getConfigValue(configMapping.Network.corsAllowOrigin),
corsAllowMethods: getConfigValue(configMapping.Network.corsAllowMethods),
corsAllowHeaders: getConfigValue(configMapping.Network.corsAllowHeaders)
},
Session: {
cookieMaxAge: getConfigValue(configMapping.Session.cookieMaxAge)
},
Sync: {
syncServerHost: getConfigValue(configMapping.Sync.syncServerHost),
syncServerTimeout: getConfigValue(configMapping.Sync.syncServerTimeout),
syncProxy: getConfigValue(configMapping.Sync.syncProxy)
},
MultiFactorAuthentication: {
oauthBaseUrl: getConfigValue(configMapping.MultiFactorAuthentication.oauthBaseUrl),
oauthClientId: getConfigValue(configMapping.MultiFactorAuthentication.oauthClientId),
oauthClientSecret: getConfigValue(configMapping.MultiFactorAuthentication.oauthClientSecret),
oauthIssuerBaseUrl: getConfigValue(configMapping.MultiFactorAuthentication.oauthIssuerBaseUrl),
oauthIssuerName: getConfigValue(configMapping.MultiFactorAuthentication.oauthIssuerName),
oauthIssuerIcon: getConfigValue(configMapping.MultiFactorAuthentication.oauthIssuerIcon)
},
Logging: {
retentionDays: getConfigValue(configMapping.Logging.retentionDays)
}
};
/**
* =====================================================================
* ENVIRONMENT VARIABLE REFERENCE
* =====================================================================
*
* Trilium supports flexible environment variable configuration with multiple
* naming patterns. Both formats below are equally valid and can be used
* based on your preference.
*
* CONFIGURATION PRECEDENCE:
* 1. Environment variables (highest priority)
* 2. config.ini file values
* 3. Default values (lowest priority)
*
* FULL FORMAT VARIABLES (following TRILIUM_[SECTION]_[KEY] pattern):
* ====================================================================
*
* General Section:
* - TRILIUM_GENERAL_INSTANCENAME : Custom instance identifier
* - TRILIUM_GENERAL_NOAUTHENTICATION : Disable auth (true/false)
* - TRILIUM_GENERAL_NOBACKUP : Disable backups (true/false)
* - TRILIUM_GENERAL_NODESKTOPICON : No desktop icon (true/false)
* - TRILIUM_GENERAL_READONLY : Read-only mode (true/false)
*
* Network Section:
* - TRILIUM_NETWORK_HOST : Bind address (e.g., "0.0.0.0")
* - TRILIUM_NETWORK_PORT : Server port (e.g., "8080")
* - TRILIUM_NETWORK_HTTPS : Enable HTTPS (true/false)
* - TRILIUM_NETWORK_CERTPATH : SSL certificate file path
* - TRILIUM_NETWORK_KEYPATH : SSL private key file path
* - TRILIUM_NETWORK_TRUSTEDREVERSEPROXY : Trust proxy headers (true/false/IP)
* - TRILIUM_NETWORK_CORSALLOWORIGIN : CORS allowed origins
* - TRILIUM_NETWORK_CORSALLOWMETHODS : CORS allowed HTTP methods
* - TRILIUM_NETWORK_CORSALLOWHEADERS : CORS allowed headers
*
* Session Section:
* - TRILIUM_SESSION_COOKIEMAXAGE : Cookie lifetime in seconds
*
* Sync Section:
* - TRILIUM_SYNC_SYNCSERVERHOST : Sync server URL
* - TRILIUM_SYNC_SYNCSERVERTIMEOUT : Sync timeout in milliseconds
* - TRILIUM_SYNC_SYNCPROXY : Proxy URL for sync
*
* Multi-Factor Authentication Section:
* - TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL : OAuth base URL
* - TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID : OAuth client ID
* - TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET : OAuth client secret
* - TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL : OAuth issuer URL
* - TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME : OAuth provider name
* - TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON : OAuth provider icon
*
* Logging Section:
* - TRILIUM_LOGGING_RETENTIONDAYS : Log retention period in days
*
* SHORTER ALTERNATIVE VARIABLES (equally valid, for convenience):
* ================================================================
*
* Network CORS (with underscores):
* - TRILIUM_NETWORK_CORS_ALLOW_ORIGIN : Same as TRILIUM_NETWORK_CORSALLOWORIGIN
* - TRILIUM_NETWORK_CORS_ALLOW_METHODS : Same as TRILIUM_NETWORK_CORSALLOWMETHODS
* - TRILIUM_NETWORK_CORS_ALLOW_HEADERS : Same as TRILIUM_NETWORK_CORSALLOWHEADERS
*
* Sync (with SERVER prefix):
* - TRILIUM_SYNC_SERVER_HOST : Same as TRILIUM_SYNC_SYNCSERVERHOST
* - TRILIUM_SYNC_SERVER_TIMEOUT : Same as TRILIUM_SYNC_SYNCSERVERTIMEOUT
* - TRILIUM_SYNC_SERVER_PROXY : Same as TRILIUM_SYNC_SYNCPROXY
*
* OAuth (simplified without section name):
* - TRILIUM_OAUTH_BASE_URL : Same as TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL
* - TRILIUM_OAUTH_CLIENT_ID : Same as TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID
* - TRILIUM_OAUTH_CLIENT_SECRET : Same as TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET
* - TRILIUM_OAUTH_ISSUER_BASE_URL : Same as TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL
* - TRILIUM_OAUTH_ISSUER_NAME : Same as TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME
* - TRILIUM_OAUTH_ISSUER_ICON : Same as TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON
*
* Logging (with underscore):
* - TRILIUM_LOGGING_RETENTION_DAYS : Same as TRILIUM_LOGGING_RETENTIONDAYS
*
* BOOLEAN VALUES:
* - Accept: "true", "false", "1", "0", 1, 0
* - Default to false for invalid values
*
* EXAMPLES:
* export TRILIUM_NETWORK_PORT="8080" # Using full format
* export TRILIUM_OAUTH_CLIENT_ID="my-client-id" # Using shorter alternative
* export TRILIUM_GENERAL_NOAUTHENTICATION="true" # Boolean value
* export TRILIUM_SYNC_SERVER_HOST="https://sync.example.com" # Using alternative with SERVER
*/
/**
* The exported configuration object used throughout the Trilium application.
* This object is resolved once at startup and remains immutable during runtime.
*
* To override any setting:
* 1. Set an environment variable (see documentation above)
* 2. Edit config.ini in your data directory
* 3. Defaults will be used if neither is provided
*
* @example
* // Accessing configuration in other modules:
* import config from './services/config.js';
*
* if (config.General.noAuthentication) {
* // Skip authentication checks
* }
*
* const server = https.createServer({
* cert: fs.readFileSync(config.Network.certPath),
* key: fs.readFileSync(config.Network.keyPath)
* });
*/
export default config; export default config;

View File

@@ -16,11 +16,13 @@ const DAYJS_LOADER: Record<LOCALE_IDS, () => Promise<typeof import("dayjs/locale
"fa": () => import("dayjs/locale/fa.js"), "fa": () => import("dayjs/locale/fa.js"),
"fr": () => import("dayjs/locale/fr.js"), "fr": () => import("dayjs/locale/fr.js"),
"he": () => import("dayjs/locale/he.js"), "he": () => import("dayjs/locale/he.js"),
"ja": () => import("dayjs/locale/ja.js"),
"ku": () => import("dayjs/locale/ku.js"), "ku": () => import("dayjs/locale/ku.js"),
"pt_br": () => import("dayjs/locale/pt-br.js"),
"ro": () => import("dayjs/locale/ro.js"), "ro": () => import("dayjs/locale/ro.js"),
"ru": () => import("dayjs/locale/ru.js"), "ru": () => import("dayjs/locale/ru.js"),
"tw": () => import("dayjs/locale/zh-tw.js"), "tw": () => import("dayjs/locale/zh-tw.js"),
"ja": () => import("dayjs/locale/ja.js") "uk": () => import("dayjs/locale/uk.js"),
} }
export async function initializeTranslations() { export async function initializeTranslations() {
@@ -39,8 +41,10 @@ export async function initializeTranslations() {
}); });
// Initialize dayjs locale. // Initialize dayjs locale.
const dayjsLocale = await DAYJS_LOADER[locale](); const dayjsLocale = DAYJS_LOADER[locale];
dayjs.locale(dayjsLocale); if (dayjsLocale) {
dayjs.locale(await dayjsLocale());
}
} }
export function ordinal(date: Dayjs) { export function ordinal(date: Dayjs) {

View File

@@ -152,6 +152,10 @@ const defaultOptions: DefaultOption[] = [
}, },
isSynced: false isSynced: false
}, },
{ name: "motionEnabled", value: "true", isSynced: false },
{ name: "shadowsEnabled", value: "true", isSynced: false },
{ name: "backdropEffectsEnabled", value: "true", isSynced: false },
// Internationalization // Internationalization
{ name: "locale", value: "en", isSynced: true }, { name: "locale", value: "en", isSynced: true },

View File

@@ -1,30 +1,155 @@
# Configuration (config.ini or environment variables) # Configuration (config.ini or environment variables)
Trilium supports configuration via a file named `config.ini` and environment variables. Please review the file named [config-sample.ini](https://github.com/TriliumNext/Trilium/blob/main/apps/server/src/assets/config-sample.ini) in the [Trilium](https://github.com/TriliumNext/Trilium) repository to see what values are supported.
You can provide the same values via environment variables instead of the `config.ini` file, and these environment variables use the following format: Trilium supports configuration via a file named `config.ini` and environment variables. This document provides a comprehensive reference for all configuration options.
1. Environment variables should be prefixed with `TRILIUM_` and use underscores to represent the INI section structure. ## Configuration Precedence
2. The format is: `TRILIUM_<SECTION>_<KEY>=<VALUE>`
3. The environment variables will override any matching values from config.ini
For example, if you have this in your config.ini: Configuration values are loaded in the following order of precedence (highest to lowest):
1. **Environment variables** (checked first)
2. **config.ini file values**
3. **Default values**
``` ## Environment Variable Patterns
[Network]
host=localhost Trilium supports multiple environment variable patterns for flexibility. The primary pattern is: `TRILIUM_[SECTION]_[KEY]`
port=8080
Where:
- `SECTION` is the INI section name in UPPERCASE
- `KEY` is the camelCase configuration key converted to UPPERCASE (e.g., `instanceName``INSTANCENAME`)
Additionally, shorter aliases are available for common configurations (see Alternative Variables section below).
## Environment Variable Reference
### General Section
| Environment Variable | Type | Default | Description |
|------------------|------|---------|-------------|
| `TRILIUM_GENERAL_INSTANCENAME` | string | "" | Instance name for API identification |
| `TRILIUM_GENERAL_NOAUTHENTICATION` | boolean | false | Disable authentication (server only) |
| `TRILIUM_GENERAL_NOBACKUP` | boolean | false | Disable automatic backups |
| `TRILIUM_GENERAL_NODESKTOPICON` | boolean | false | Disable desktop icon creation |
| `TRILIUM_GENERAL_READONLY` | boolean | false | Enable read-only mode |
### Network Section
| Environment Variable | Type | Default | Description |
|------------------|------|---------|-------------|
| `TRILIUM_NETWORK_HOST` | string | "0.0.0.0" | Server host binding |
| `TRILIUM_NETWORK_PORT` | string | "3000" | Server port |
| `TRILIUM_NETWORK_HTTPS` | boolean | false | Enable HTTPS |
| `TRILIUM_NETWORK_CERTPATH` | string | "" | SSL certificate path |
| `TRILIUM_NETWORK_KEYPATH` | string | "" | SSL key path |
| `TRILIUM_NETWORK_TRUSTEDREVERSEPROXY` | boolean/string | false | Reverse proxy trust settings |
| `TRILIUM_NETWORK_CORSALLOWORIGIN` | string | "" | CORS allowed origins |
| `TRILIUM_NETWORK_CORSALLOWMETHODS` | string | "" | CORS allowed methods |
| `TRILIUM_NETWORK_CORSALLOWHEADERS` | string | "" | CORS allowed headers |
### Session Section
| Environment Variable | Type | Default | Description |
|------------------|------|---------|-------------|
| `TRILIUM_SESSION_COOKIEMAXAGE` | integer | 1814400 | Session cookie max age in seconds (21 days) |
### Sync Section
| Environment Variable | Type | Default | Description |
|------------------|------|---------|-------------|
| `TRILIUM_SYNC_SYNCSERVERHOST` | string | "" | Sync server host URL |
| `TRILIUM_SYNC_SYNCSERVERTIMEOUT` | string | "120000" | Sync server timeout in milliseconds |
| `TRILIUM_SYNC_SYNCPROXY` | string | "" | Sync proxy URL |
### MultiFactorAuthentication Section
| Environment Variable | Type | Default | Description |
|------------------|------|---------|-------------|
| `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL` | string | "" | OAuth/OpenID base URL |
| `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID` | string | "" | OAuth client ID |
| `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET` | string | "" | OAuth client secret |
| `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL` | string | "https://accounts.google.com" | OAuth issuer base URL |
| `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME` | string | "Google" | OAuth issuer display name |
| `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON` | string | "" | OAuth issuer icon URL |
### Logging Section
| Environment Variable | Type | Default | Description |
|------------------|------|---------|-------------|
| `TRILIUM_LOGGING_RETENTIONDAYS` | integer | 90 | Number of days to retain log files |
## Alternative Environment Variables
The following alternative environment variable names are also supported and work identically to their longer counterparts:
### Network CORS Variables
- `TRILIUM_NETWORK_CORS_ALLOW_ORIGIN` (alternative to `TRILIUM_NETWORK_CORSALLOWORIGIN`)
- `TRILIUM_NETWORK_CORS_ALLOW_METHODS` (alternative to `TRILIUM_NETWORK_CORSALLOWMETHODS`)
- `TRILIUM_NETWORK_CORS_ALLOW_HEADERS` (alternative to `TRILIUM_NETWORK_CORSALLOWHEADERS`)
### Sync Variables
- `TRILIUM_SYNC_SERVER_HOST` (alternative to `TRILIUM_SYNC_SYNCSERVERHOST`)
- `TRILIUM_SYNC_SERVER_TIMEOUT` (alternative to `TRILIUM_SYNC_SYNCSERVERTIMEOUT`)
- `TRILIUM_SYNC_SERVER_PROXY` (alternative to `TRILIUM_SYNC_SYNCPROXY`)
### OAuth/MFA Variables
- `TRILIUM_OAUTH_BASE_URL` (alternative to `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL`)
- `TRILIUM_OAUTH_CLIENT_ID` (alternative to `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID`)
- `TRILIUM_OAUTH_CLIENT_SECRET` (alternative to `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET`)
- `TRILIUM_OAUTH_ISSUER_BASE_URL` (alternative to `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL`)
- `TRILIUM_OAUTH_ISSUER_NAME` (alternative to `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME`)
- `TRILIUM_OAUTH_ISSUER_ICON` (alternative to `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON`)
### Logging Variables
- `TRILIUM_LOGGING_RETENTION_DAYS` (alternative to `TRILIUM_LOGGING_RETENTIONDAYS`)
## Boolean Values
Boolean environment variables accept the following values:
- **True**: `"true"`, `"1"`, `1`
- **False**: `"false"`, `"0"`, `0`
- Any other value defaults to `false`
## Using Environment Variables
Both naming patterns are fully supported and can be used interchangeably:
- The longer format follows the section/key pattern for consistency with the INI file structure
- The shorter alternatives provide convenience for common configurations
- You can use whichever format you prefer - both are equally valid
## Examples
### Docker Compose Example
```yaml
services:
trilium:
image: triliumnext/notes
environment:
# Using full format
TRILIUM_GENERAL_INSTANCENAME: "My Trilium Instance"
TRILIUM_NETWORK_PORT: "8080"
TRILIUM_NETWORK_CORSALLOWORIGIN: "https://myapp.com"
TRILIUM_SYNC_SYNCSERVERHOST: "https://sync.example.com"
TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL: "https://auth.example.com"
# Or using shorter alternatives (equally valid)
# TRILIUM_NETWORK_CORS_ALLOW_ORIGIN: "https://myapp.com"
# TRILIUM_SYNC_SERVER_HOST: "https://sync.example.com"
# TRILIUM_OAUTH_BASE_URL: "https://auth.example.com"
``` ```
You can override these values using environment variables: ### Shell Export Example
```bash
# Using either format
export TRILIUM_GENERAL_NOAUTHENTICATION=false
export TRILIUM_NETWORK_HTTPS=true
export TRILIUM_NETWORK_CERTPATH=/path/to/cert.pem
export TRILIUM_NETWORK_KEYPATH=/path/to/key.pem
export TRILIUM_LOGGING_RETENTIONDAYS=30
``` # Start Trilium
TRILIUM_NETWORK_HOST=0.0.0.0 npm start
TRILIUM_NETWORK_PORT=9000
``` ```
The code will: ## config.ini Reference
1. First load the `config.ini` file as before For the complete list of configuration options and their INI file format, please review the [config-sample.ini](https://github.com/TriliumNext/Trilium/blob/main/apps/server/src/assets/config-sample.ini) file in the Trilium repository
2. Then scan all environment variables for ones starting with `TRILIUM_`
3. Parse these variables into section/key pairs
4. Merge them with the config from the file, with environment variables taking precedence

View File

@@ -187,6 +187,8 @@ docker run -d --name trilium -p 8080:8080 --user $(id -u):$(id -g) -v ~/trilium-
* `TRILIUM_GID`: GID to use for the container process (passed to Docker's `--user` flag) * `TRILIUM_GID`: GID to use for the container process (passed to Docker's `--user` flag)
* `TRILIUM_DATA_DIR`: Path to the data directory inside the container (default: `/home/node/trilium-data`) * `TRILIUM_DATA_DIR`: Path to the data directory inside the container (default: `/home/node/trilium-data`)
For a complete list of configuration environment variables (network settings, authentication, sync, etc.), see <a class="reference-link" href="../../Advanced%20Usage/Configuration%20(config.ini%20or%20e.md">Configuration (config.ini or environment variables)</a>.
### Volume Permissions ### Volume Permissions
If you encounter permission issues with the data volume, ensure that: If you encounter permission issues with the data volume, ensure that:

View File

@@ -37,7 +37,9 @@ MFA can only be set up on a server instance.
In order to setup OpenID, you will need to setup a authentication provider. This requires a bit of extra setup. Follow [these instructions](https://developers.google.com/identity/openid-connect/openid-connect) to setup an OpenID service through google. The Redirect URL of Trilium is `https://<your-trilium-domain>/callback`. In order to setup OpenID, you will need to setup a authentication provider. This requires a bit of extra setup. Follow [these instructions](https://developers.google.com/identity/openid-connect/openid-connect) to setup an OpenID service through google. The Redirect URL of Trilium is `https://<your-trilium-domain>/callback`.
1. Set the `oauthBaseUrl`, `oauthClientId` and `oauthClientSecret` in the `config.ini` file (check <a class="reference-link" href="../../Advanced%20Usage/Configuration%20(config.ini%20or%20e.md">Configuration (config.ini or environment variables)</a> for more information). 1. Set the `oauthBaseUrl`, `oauthClientId` and `oauthClientSecret` in the `config.ini` file (check <a class="reference-link" href="../../Advanced%20Usage/Configuration%20(config.ini%20or%20e.md">Configuration (config.ini or environment variables)</a> for more information).
1. You can also setup through environment variables (`TRILIUM_OAUTH_BASE_URL`, `TRILIUM_OAUTH_CLIENT_ID` and `TRILIUM_OAUTH_CLIENT_SECRET`). 1. You can also setup through environment variables:
- Standard: `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHBASEURL`, `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTID`, `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHCLIENTSECRET`
- Legacy (still supported): `TRILIUM_OAUTH_BASE_URL`, `TRILIUM_OAUTH_CLIENT_ID`, `TRILIUM_OAUTH_CLIENT_SECRET`
2. `oauthBaseUrl` should be the link of your Trilium instance server, for example, `https://<your-trilium-domain>`. 2. `oauthBaseUrl` should be the link of your Trilium instance server, for example, `https://<your-trilium-domain>`.
2. Restart the server 2. Restart the server
3. Go to "Menu" -> "Options" -> "MFA" 3. Go to "Menu" -> "Options" -> "MFA"
@@ -46,7 +48,11 @@ In order to setup OpenID, you will need to setup a authentication provider. This
6. Refresh the page and login through OpenID provider 6. Refresh the page and login through OpenID provider
> [!NOTE] > [!NOTE]
> The default OAuth issuer is Google. To use other services such as Authentik or Auth0, you can configure the settings via `oauthIssuerBaseUrl`, `oauthIssuerName`, and `oauthIssuerIcon` in the `config.ini` file. Alternatively, these values can be set using environment variables: `TRILIUM_OAUTH_ISSUER_BASE_URL`, `TRILIUM_OAUTH_ISSUER_NAME`, and `TRILIUM_OAUTH_ISSUER_ICON`. `oauthIssuerName` and `oauthIssuerIcon` are required for displaying correct issuer information at the Login page. > The default OAuth issuer is Google. To use other services such as Authentik or Auth0, you can configure the settings via `oauthIssuerBaseUrl`, `oauthIssuerName`, and `oauthIssuerIcon` in the `config.ini` file. Alternatively, these values can be set using environment variables:
> - Standard: `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERBASEURL`, `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERNAME`, `TRILIUM_MULTIFACTORAUTHENTICATION_OAUTHISSUERICON`
> - Legacy (still supported): `TRILIUM_OAUTH_ISSUER_BASE_URL`, `TRILIUM_OAUTH_ISSUER_NAME`, `TRILIUM_OAUTH_ISSUER_ICON`
>
> `oauthIssuerName` and `oauthIssuerIcon` are required for displaying correct issuer information at the Login page.
#### Authentik #### Authentik

View File

@@ -25,7 +25,13 @@ certPath=/[username]/.acme.sh/[hostname]/fullchain.cer
keyPath=/[username]/.acme.sh/[hostname]/example.com.key keyPath=/[username]/.acme.sh/[hostname]/example.com.key
``` ```
You can also review the [configuration](../../Advanced%20Usage/Configuration%20\(config.ini%20or%20e.md) file to provide all `config.ini` values as environment variables instead. You can also review the [configuration](../../Advanced%20Usage/Configuration%20\(config.ini%20or%20e.md) file to provide all `config.ini` values as environment variables instead. For example, you can configure TLS using environment variables:
```bash
export TRILIUM_NETWORK_HTTPS=true
export TRILIUM_NETWORK_CERTPATH=/path/to/cert.pem
export TRILIUM_NETWORK_KEYPATH=/path/to/key.pem
```
The above example shows how this is set up in an environment where the certificate was generated using Let's Encrypt's ACME utility. Your paths may differ. For Docker installations, ensure these paths are within a volume or another directory accessible by the Docker container, such as `/home/node/trilium-data/[DIR IN DATA DIRECTORY]`. The above example shows how this is set up in an environment where the certificate was generated using Let's Encrypt's ACME utility. Your paths may differ. For Docker installations, ensure these paths are within a volume or another directory accessible by the Docker container, such as `/home/node/trilium-data/[DIR IN DATA DIRECTORY]`.

View File

@@ -58,7 +58,7 @@
"react-refresh": "^0.17.0", "react-refresh": "^0.17.0",
"rollup-plugin-webpack-stats": "2.1.4", "rollup-plugin-webpack-stats": "2.1.4",
"tslib": "^2.3.0", "tslib": "^2.3.0",
"tsx": "4.20.4", "tsx": "4.20.5",
"typescript": "~5.9.0", "typescript": "~5.9.0",
"typescript-eslint": "^8.19.0", "typescript-eslint": "^8.19.0",
"upath": "2.0.1", "upath": "2.0.1",
@@ -89,7 +89,7 @@
"@nx/js": "patches/@nx__js.patch" "@nx/js": "patches/@nx__js.patch"
}, },
"overrides": { "overrides": {
"mermaid": "11.10.0", "mermaid": "11.10.1",
"preact": "10.27.1", "preact": "10.27.1",
"roughjs": "4.6.6", "roughjs": "4.6.6",
"@types/express-serve-static-core": "5.0.7", "@types/express-serve-static-core": "5.0.7",

View File

@@ -63,6 +63,6 @@
"codemirror-lang-elixir": "4.0.0", "codemirror-lang-elixir": "4.0.0",
"codemirror-lang-hcl": "0.1.0", "codemirror-lang-hcl": "0.1.0",
"codemirror-lang-mermaid": "0.5.0", "codemirror-lang-mermaid": "0.5.0",
"eslint-linter-browserify": "9.33.0" "eslint-linter-browserify": "9.34.0"
} }
} }

View File

@@ -10,51 +10,17 @@ export interface Locale {
} }
const UNSORTED_LOCALES: Locale[] = [ const UNSORTED_LOCALES: Locale[] = [
{ { id: "cn", name: "简体中文", electronLocale: "zh_CN" },
id: "en", { id: "de", name: "Deutsch", electronLocale: "de" },
name: "English", { id: "en", name: "English", electronLocale: "en" },
electronLocale: "en" { id: "es", name: "Español", electronLocale: "es" },
}, { id: "fr", name: "Français", electronLocale: "fr" },
{ { id: "ja", name: "日本語", electronLocale: "ja" },
id: "de", { id: "pt_br", name: "Português (Brasil)", electronLocale: "pt-BR" },
name: "Deutsch", { id: "ro", name: "Română", electronLocale: "ro" },
electronLocale: "de" { id: "ru", name: "Русский", electronLocale: "ru" },
}, { id: "tw", name: "繁體中文", electronLocale: "zh_TW" },
{ { id: "uk", name: "Українська", electronLocale: "uk" },
id: "es",
name: "Español",
electronLocale: "es"
},
{
id: "fr",
name: "Français",
electronLocale: "fr"
},
{
id: "cn",
name: "简体中文",
electronLocale: "zh_CN"
},
{
id: "tw",
name: "繁體中文",
electronLocale: "zh_TW"
},
{
id: "ro",
name: "Română",
electronLocale: "ro"
},
{
id: "ru",
name: "Русский",
electronLocale: "ru"
},
{
id: "ja",
name: "日本語",
electronLocale: "ja"
},
/* /*
* Right to left languages * Right to left languages

View File

@@ -93,6 +93,9 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions<KeyboardActi
// Appearance // Appearance
splitEditorOrientation: "horziontal" | "vertical"; splitEditorOrientation: "horziontal" | "vertical";
motionEnabled: boolean;
shadowsEnabled: boolean;
backdropEffectsEnabled: boolean;
codeNoteTheme: string; codeNoteTheme: string;
initialized: boolean; initialized: boolean;

683
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff