Compare commits

...

49 Commits

Author SHA1 Message Date
renovate[bot]
660791d781 fix(deps): update dependency @codemirror/view to v6.39.6 2025-12-23 11:40:42 +00:00
Elian Doran
79494e8cfe chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54.2.3 (#8135) 2025-12-23 13:39:40 +02:00
Elian Doran
2afba34055 chore(deps): update typescript-eslint monorepo to v8.50.1 (#8136) 2025-12-23 13:39:26 +02:00
Elian Doran
c391234eeb fix(deps): update fullcalendar monorepo to v6.1.20 (#8138) 2025-12-23 13:39:13 +02:00
renovate[bot]
7dd4c09057 fix(deps): update fullcalendar monorepo to v6.1.20 2025-12-23 11:05:39 +00:00
renovate[bot]
cddde353cd chore(deps): update typescript-eslint monorepo to v8.50.1 2025-12-23 11:04:01 +00:00
renovate[bot]
e4ef8f2352 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54.2.3 2025-12-23 11:02:27 +00:00
Elian Doran
b4e4950d20 chore(client): fix typecheck 2025-12-23 12:59:22 +02:00
Adorian Doran
a4be86dbd8 style/text: prevent reference links inherit color from the current note 2025-12-23 05:26:54 +02:00
Adorian Doran
b6ca6476de demo notes: change the icon and color for the "Trilium Demo" branch 2025-12-23 05:00:23 +02:00
Adorian Doran
db1f632859 style/zen mode: make the read-only note badge visible 2025-12-23 04:24:39 +02:00
Adorian Doran
7af8acec0f style/zen mode: fix the title widget layout, make the icon and title editable 2025-12-23 04:20:17 +02:00
Adorian Doran
3f1b0fa71e style/breadcrumb: tweak 2025-12-23 04:02:53 +02:00
Adorian Doran
519323292c style/breadcrumb: tweak 2025-12-23 03:48:09 +02:00
Adorian Doran
2d6f17aeaa style/breadcrumb: tweak dropdown lists 2025-12-23 03:07:30 +02:00
Adorian Doran
7507d6b385 style/bottom panel: tweak colors 2025-12-23 02:52:03 +02:00
Adorian Doran
d4fa21e7c1 style/bottom panel: tweak colors 2025-12-22 23:57:40 +02:00
Adorian Doran
608f156b82 client: rename "status bar pane" to "bottom panel" 2025-12-22 23:40:11 +02:00
Adorian Doran
0c965bfdf4 client/status bar panes: extract colors as CSS variables 2025-12-22 23:36:35 +02:00
Adorian Doran
d407c72fae Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-22 23:27:55 +02:00
Adorian Doran
bdc0b062d5 client/status bar panes: improve 2025-12-22 23:27:45 +02:00
Elian Doran
0b912b9c7d Translations update from Hosted Weblate (#8134) 2025-12-22 22:35:26 +02:00
Anton Antonov
99ac6b4df1 Translated using Weblate (Bulgarian)
Currently translated at 16.4% (25 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/bg/
2025-12-22 20:23:36 +00:00
Hosted Weblate
b0a97208a2 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/
2025-12-22 20:23:36 +00:00
Anton Antonov
6e044b19c8 Translated using Weblate (Bulgarian)
Currently translated at 12.5% (19 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/bg/
2025-12-22 20:23:35 +00:00
Anton Antonov
198dd15fb4 Added translation using Weblate (Bulgarian) 2025-12-22 20:23:34 +00:00
Anton Antonov
18f3b83827 Added translation using Weblate (Bulgarian) 2025-12-22 20:23:33 +00:00
Anton Antonov
8142b7489a Added translation using Weblate (Bulgarian) 2025-12-22 20:23:33 +00:00
Anton Antonov
7bf0a4134e Added translation using Weblate (Bulgarian) 2025-12-22 20:23:32 +00:00
Kuzma Simonov
29ed08d062 Translated using Weblate (Russian)
Currently translated at 100.0% (1718 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-22 20:23:31 +00:00
Francis C.
68dc7eedec Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.5% (1711 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-12-22 20:23:31 +00:00
Yunho Park
3fc195998c Translated using Weblate (Korean)
Currently translated at 67.7% (103 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/
2025-12-22 20:23:30 +00:00
Kuzma Simonov
b6d550f682 Translated using Weblate (Russian)
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2025-12-22 20:23:29 +00:00
Adorian Doran
1f55ff536e client/status bar panes: tweak 2025-12-22 22:23:16 +02:00
Adorian Doran
67fb8d0354 client/status bar panes: tweak 2025-12-22 21:25:39 +02:00
Adorian Doran
1408b159d7 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-22 19:40:01 +02:00
Adorian Doran
74b00e60e3 client/status bar panes: refactor into own component, add title bar and close button 2025-12-22 19:39:52 +02:00
Elian Doran
1b18a964b9 chore(deps): update dependency @types/tabulator-tables to v6.3.1 (#8131) 2025-12-22 19:35:09 +02:00
renovate[bot]
931f0a694e chore(deps): update dependency @types/tabulator-tables to v6.3.1 2025-12-22 01:50:47 +00:00
Adorian Doran
0d32e1f0d8 style/classic toolbar: fix broken border radius 2025-12-22 02:43:39 +02:00
Adorian Doran
d0f91e7709 style/status bar: hide the focus outline for dropdown buttons 2025-12-22 02:37:00 +02:00
Adorian Doran
353d626d45 style/breadcrumb: tweak arrows 2025-12-22 02:29:05 +02:00
Adorian Doran
af67a3ba11 style/breadcrumb: use scrollable dropdowns for note listings 2025-12-22 02:24:34 +02:00
Adorian Doran
a867c646e4 style: refactor 2025-12-22 02:23:43 +02:00
Adorian Doran
150e2504b1 style: add (limited) support for scrollable menus 2025-12-22 02:20:56 +02:00
Adorian Doran
aa7ae150dc style/text editor/links: tweak 2025-12-22 02:04:35 +02:00
Adorian Doran
d99e08bfdd style/text editor: fix links 2025-12-22 01:39:33 +02:00
Elian Doran
29d038c76b Translations update from Hosted Weblate (#8130) 2025-12-22 00:25:39 +02:00
Barszczun
f1615bb4f6 Translated using Weblate (Polish)
Currently translated at 99.6% (1712 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-21 23:11:12 +01:00
34 changed files with 1061 additions and 533 deletions

View File

@@ -17,12 +17,12 @@
}, },
"dependencies": { "dependencies": {
"@excalidraw/excalidraw": "0.18.0", "@excalidraw/excalidraw": "0.18.0",
"@fullcalendar/core": "6.1.19", "@fullcalendar/core": "6.1.20",
"@fullcalendar/daygrid": "6.1.19", "@fullcalendar/daygrid": "6.1.20",
"@fullcalendar/interaction": "6.1.19", "@fullcalendar/interaction": "6.1.20",
"@fullcalendar/list": "6.1.19", "@fullcalendar/list": "6.1.20",
"@fullcalendar/multimonth": "6.1.19", "@fullcalendar/multimonth": "6.1.20",
"@fullcalendar/timegrid": "6.1.19", "@fullcalendar/timegrid": "6.1.20",
"@maplibre/maplibre-gl-leaflet": "0.1.3", "@maplibre/maplibre-gl-leaflet": "0.1.3",
"@mermaid-js/layout-elk": "0.2.0", "@mermaid-js/layout-elk": "0.2.0",
"@mind-elixir/node-menu": "5.0.1", "@mind-elixir/node-menu": "5.0.1",
@@ -75,7 +75,7 @@
"@types/leaflet-gpx": "1.3.8", "@types/leaflet-gpx": "1.3.8",
"@types/mark.js": "8.11.12", "@types/mark.js": "8.11.12",
"@types/reveal.js": "5.2.2", "@types/reveal.js": "5.2.2",
"@types/tabulator-tables": "6.3.0", "@types/tabulator-tables": "6.3.1",
"copy-webpack-plugin": "13.0.1", "copy-webpack-plugin": "13.0.1",
"happy-dom": "20.0.11", "happy-dom": "20.0.11",
"script-loader": "0.7.2", "script-loader": "0.7.2",

View File

@@ -2012,8 +2012,10 @@ body.zen .shared-info-widget,
body.zen .ribbon-container:not(:has(.classic-toolbar-widget)), body.zen .ribbon-container:not(:has(.classic-toolbar-widget)),
body.zen .ribbon-container:has(.classic-toolbar-widget) .ribbon-top-row, body.zen .ribbon-container:has(.classic-toolbar-widget) .ribbon-top-row,
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)), body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)),
body.zen .note-icon-widget,
body.zen .title-row .icon-action, body.zen .title-row .icon-action,
body.zen .note-badges > *:not(.read-only-badge),
body.zen .ribbon-button-container,
body.zen .inline-title,
body.zen .promoted-attributes-widget, body.zen .promoted-attributes-widget,
body.zen .floating-buttons-children > *:not(.bx-edit-alt), body.zen .floating-buttons-children > *:not(.bx-edit-alt),
body.zen .action-button, body.zen .action-button,
@@ -2036,11 +2038,11 @@ body.zen #launcher-pane {
} }
body.zen .title-row { body.zen .title-row {
display: block !important;
height: unset !important; height: unset !important;
-webkit-app-region: drag; -webkit-app-region: drag;
padding-inline-start: env(titlebar-area-x); padding-inline-start: env(titlebar-area-x);
padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em); padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em);
border-bottom: none !important;
} }
body.zen .floating-buttons { body.zen .floating-buttons {
@@ -2060,8 +2062,6 @@ body.zen .floating-buttons-children .button-widget {
body.zen .note-title-widget, body.zen .note-title-widget,
body.zen .note-title-widget input { body.zen .note-title-widget input {
font-size: 1rem !important; font-size: 1rem !important;
background: transparent !important;
pointer-events: none;
} }
body.zen #detail-container { body.zen #detail-container {

View File

@@ -234,6 +234,9 @@
--right-pane-item-hover-background: #ffffff26; --right-pane-item-hover-background: #ffffff26;
--right-pane-item-hover-color: white; --right-pane-item-hover-color: white;
--bottom-panel-background-color: #11111180;
--bottom-panel-title-bar-background-color: #3F3F3F80;
--scrollbar-thumb-color: #fdfdfd5c; --scrollbar-thumb-color: #fdfdfd5c;
--scrollbar-thumb-hover-color: #ffffff7d; --scrollbar-thumb-hover-color: #ffffff7d;
--scrollbar-background-color: transparent; --scrollbar-background-color: transparent;

View File

@@ -232,6 +232,9 @@
--right-pane-item-hover-background: #00000013; --right-pane-item-hover-background: #00000013;
--right-pane-item-hover-color: inherit; --right-pane-item-hover-color: inherit;
--bottom-panel-background-color: #0000000a;
--bottom-panel-title-bar-background-color: #00000017;
--scrollbar-thumb-color: #0000005c; --scrollbar-thumb-color: #0000005c;
--scrollbar-thumb-hover-color: #00000066; --scrollbar-thumb-hover-color: #00000066;
--scrollbar-background-color: transparent; --scrollbar-background-color: transparent;

View File

@@ -128,6 +128,12 @@ body.backdrop-effects-disabled {
font-size: 0.9rem !important; font-size: 0.9rem !important;
} }
.dropdown-menu.tn-dropdown-menu-scrollable {
/* Note: scrollable dropdowns does not support submenus */
max-height: 90vh;
overflow: scroll;
}
body.desktop .dropdown-menu::before, body.desktop .dropdown-menu::before,
:root .ck.ck-dropdown__panel::before, :root .ck.ck-dropdown__panel::before,
:root .excalidraw .popover::before, :root .excalidraw .popover::before,

View File

@@ -653,7 +653,8 @@ body a.tn-link:focus-visible,
} }
body a.tn-link:hover, body a.tn-link:hover,
.use-tn-links a:hover { .use-tn-links a:hover,
.use-tn-links a.ck-widget_selected {
box-shadow: 0 0 0 4px var(--link-hover-background); box-shadow: 0 0 0 4px var(--link-hover-background);
--background: var(--link-hover-background); --background: var(--link-hover-background);
color: var(--link-hover-color); color: var(--link-hover-color);

View File

@@ -670,16 +670,33 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
color: var(--main-text-color); color: var(--main-text-color);
} }
/* Links */
.ck-content a.ck-widget {
outline: none;
}
.ck-content a.ck-widget.ck-widget_selected,
.ck-content a.ck-link_selected {
outline: 2px solid var(--input-focus-outline-color);
outline-offset: 2px;
background: var(--link-hover-background);
}
/* Reference link */ /* Reference link */
.ck-content a.reference-link, .ck-content a.reference-link,
.ck-content a.reference-link:hover { .ck-content a.reference-link:hover {
/* Apply underline only to the span inside the link so it can follow the /* Apply underline only to the span inside the link so it can follow the
* target note's user defined color */ * target note's user defined color */
text-decoration: none; text-decoration: none;
} }
.ck-content a.reference-link > span { .ck-content a.reference-link.use-note-color > span {
color: var(--custom-color, inherit);
}
.ck-content a.reference-link:hover > span {
text-decoration: underline; text-decoration: underline;
} }

View File

@@ -1230,7 +1230,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging .
margin-bottom: 2px; margin-bottom: 2px;
} }
body.vertical-layout #rest-pane > .classic-toolbar-widget { body.layout-vertical #rest-pane > .classic-toolbar-widget {
border-start-start-radius: var(--center-pane-border-radius); border-start-start-radius: var(--center-pane-border-radius);
} }

View File

@@ -0,0 +1 @@
{}

View File

@@ -818,7 +818,8 @@
}, },
"inherited_attribute_list": { "inherited_attribute_list": {
"title": "Inherited Attributes", "title": "Inherited Attributes",
"no_inherited_attributes": "No inherited attributes." "no_inherited_attributes": "No inherited attributes.",
"none": "none"
}, },
"note_info_widget": { "note_info_widget": {
"note_id": "Note ID", "note_id": "Note ID",
@@ -2203,6 +2204,9 @@
"note_paths_title": "Note paths", "note_paths_title": "Note paths",
"code_note_switcher": "Change language mode" "code_note_switcher": "Change language mode"
}, },
"attributes_panel": {
"title": "Note Attributes"
},
"right_pane": { "right_pane": {
"empty_message": "Nothing to show for this note", "empty_message": "Nothing to show for this note",
"empty_button": "Hide the panel", "empty_button": "Hide the panel",

View File

@@ -1934,7 +1934,10 @@
}, },
"highlights_list_2": { "highlights_list_2": {
"title": "Lista wyróżnień", "title": "Lista wyróżnień",
"options": "Opcje" "options": "Opcje",
"modal_title": "Konfiguracja listy wyróżnień",
"menu_configure": "Konfiguracja listy wyróżnień...",
"no_highlights": "Nie znaleziono wyróżnień."
}, },
"quick-search": { "quick-search": {
"placeholder": "Szybkie wyszukiwanie", "placeholder": "Szybkie wyszukiwanie",

View File

@@ -483,7 +483,7 @@
"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.",
@@ -750,7 +750,8 @@
}, },
"toc": { "toc": {
"table_of_contents": "Оглавление", "table_of_contents": "Оглавление",
"options": "Параметры" "options": "Параметры",
"no_headings": "Заголовки не найдены."
}, },
"note_tree": { "note_tree": {
"hide-archived-notes": "Скрыть архивные заметки", "hide-archived-notes": "Скрыть архивные заметки",
@@ -1562,7 +1563,13 @@
}, },
"highlights_list_2": { "highlights_list_2": {
"options": "Параметры", "options": "Параметры",
"title": "Список выделенного" "title": "Акценты",
"modal_title": "Настроить акценты",
"menu_configure": "Настроить акценты...",
"no_highlights": "Акценты в тексте не найдены.",
"title_with_count_one": "{{count}} акцент",
"title_with_count_few": "{{count}} акцента",
"title_with_count_many": "{{count}} акцентов"
}, },
"include_note": { "include_note": {
"dialog_title": "Вставить заметку", "dialog_title": "Вставить заметку",
@@ -1755,15 +1762,15 @@
"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": {
@@ -1808,7 +1815,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": "Покинуть режим \"дзен\""
@@ -2203,5 +2210,11 @@
}, },
"popup-editor": { "popup-editor": {
"maximize": "Переключить на полный редактор" "maximize": "Переключить на полный редактор"
},
"right_pane": {
"custom_widget_go_to_source": "Исходный код",
"toggle": "Переключить панель справа",
"empty_button": "Скрыть панель",
"empty_message": "Нечего отобразить для текущей заметки"
} }
} }

View File

@@ -691,7 +691,12 @@
"convert_into_attachment_prompt": "確定要將筆記 '{{title}}' 轉換為父級筆記的附件嗎?", "convert_into_attachment_prompt": "確定要將筆記 '{{title}}' 轉換為父級筆記的附件嗎?",
"print_pdf": "匯出為 PDF…", "print_pdf": "匯出為 PDF…",
"open_note_on_server": "在伺服器上開啟筆記", "open_note_on_server": "在伺服器上開啟筆記",
"view_revisions": "筆記歷史版本..." "view_revisions": "筆記歷史版本...",
"advanced": "進階",
"export_as_image": "匯出為圖片",
"export_as_image_png": "PNG (點陣)",
"export_as_image_svg": "SVG (向量)",
"note_map": "筆記地圖"
}, },
"onclick_button": { "onclick_button": {
"no_click_handler": "按鈕元件'{{componentId}}'沒有定義點擊時的處理方式" "no_click_handler": "按鈕元件'{{componentId}}'沒有定義點擊時的處理方式"
@@ -790,7 +795,7 @@
"file_type": "檔案類型", "file_type": "檔案類型",
"file_size": "檔案大小", "file_size": "檔案大小",
"download": "下載", "download": "下載",
"open": "打開", "open": "以外部程式打開",
"upload_new_revision": "上傳新版本", "upload_new_revision": "上傳新版本",
"upload_success": "已上傳新檔案版本。", "upload_success": "已上傳新檔案版本。",
"upload_failed": "新檔案版本上傳失敗。", "upload_failed": "新檔案版本上傳失敗。",
@@ -821,7 +826,9 @@
"note_size_info": "筆記大小提供了該筆記儲存需求的粗略估計。它考慮了筆記及其歷史的內容。", "note_size_info": "筆記大小提供了該筆記儲存需求的粗略估計。它考慮了筆記及其歷史的內容。",
"calculate": "計算", "calculate": "計算",
"subtree_size": "(子階層大小: {{size}}, 共計 {{count}} 個筆記)", "subtree_size": "(子階層大小: {{size}}, 共計 {{count}} 個筆記)",
"title": "筆記資訊" "title": "筆記資訊",
"mime": "MIME 類型",
"show_similar_notes": "顯示相似筆記"
}, },
"note_map": { "note_map": {
"open_full": "展開顯示", "open_full": "展開顯示",
@@ -884,7 +891,8 @@
"search_parameters": "搜尋參數", "search_parameters": "搜尋參數",
"unknown_search_option": "未知的搜尋選項 {{searchOptionName}}", "unknown_search_option": "未知的搜尋選項 {{searchOptionName}}",
"search_note_saved": "搜尋筆記已儲存至 {{- notePathTitle}}", "search_note_saved": "搜尋筆記已儲存至 {{- notePathTitle}}",
"actions_executed": "已執行操作。" "actions_executed": "已執行操作。",
"view_options": "查看選項:"
}, },
"similar_notes": { "similar_notes": {
"title": "相似筆記", "title": "相似筆記",
@@ -1503,7 +1511,11 @@
}, },
"highlights_list_2": { "highlights_list_2": {
"title": "高亮列表", "title": "高亮列表",
"options": "選項" "options": "選項",
"title_with_count_one": "{{count}} 處高亮",
"modal_title": "設定高亮列表",
"menu_configure": "設定高亮列表…",
"no_highlights": "未找到高亮內容。"
}, },
"quick-search": { "quick-search": {
"placeholder": "快速搜尋", "placeholder": "快速搜尋",
@@ -1539,8 +1551,13 @@
}, },
"note_title": { "note_title": {
"placeholder": "請輸入筆記標題...", "placeholder": "請輸入筆記標題...",
"created_on": "建立於 {{date}}", "created_on": "建立於 <Value />",
"last_modified": "最後修改於 {{date}}" "last_modified": "修改於 <Value />",
"note_type_switcher_label": "從 {{type}} 切換至:",
"note_type_switcher_others": "其他筆記類型",
"note_type_switcher_templates": "模板",
"note_type_switcher_collection": "集合",
"edited_notes": "編輯過的筆記"
}, },
"search_result": { "search_result": {
"no_notes_found": "沒有找到符合搜尋條件的筆記。", "no_notes_found": "沒有找到符合搜尋條件的筆記。",
@@ -1569,7 +1586,8 @@
}, },
"toc": { "toc": {
"table_of_contents": "目錄", "table_of_contents": "目錄",
"options": "選項" "options": "選項",
"no_headings": "無標題。"
}, },
"watched_file_update_status": { "watched_file_update_status": {
"file_last_modified": "檔案 <code class=\"file-path\"></code> 最後修改時間為 <span class=\"file-last-modified\"></span>。", "file_last_modified": "檔案 <code class=\"file-path\"></code> 最後修改時間為 <span class=\"file-last-modified\"></span>。",
@@ -1943,8 +1961,9 @@
"unknown_widget": "未知元件:\"{{id}}\"。" "unknown_widget": "未知元件:\"{{id}}\"。"
}, },
"note_language": { "note_language": {
"not_set": "設定", "not_set": "設定語言",
"configure-languages": "設定語言…" "configure-languages": "設定語言…",
"help-on-languages": "設定內容語言說明…"
}, },
"content_language": { "content_language": {
"title": "內文語言", "title": "內文語言",
@@ -2011,7 +2030,7 @@
"book_properties_config": { "book_properties_config": {
"hide-weekends": "隱藏週末", "hide-weekends": "隱藏週末",
"display-week-numbers": "顯示週數", "display-week-numbers": "顯示週數",
"map-style": "地圖樣式", "map-style": "地圖樣式",
"max-nesting-depth": "最大嵌套深度:", "max-nesting-depth": "最大嵌套深度:",
"raster": "柵格", "raster": "柵格",
"vector_light": "向量(淺色)", "vector_light": "向量(淺色)",
@@ -2068,14 +2087,19 @@
"next_theme_title": "試用新 Trilium 主題", "next_theme_title": "試用新 Trilium 主題",
"next_theme_message": "您正在使用舊版主題,要試用新主題嗎?", "next_theme_message": "您正在使用舊版主題,要試用新主題嗎?",
"next_theme_button": "試用新主題", "next_theme_button": "試用新主題",
"dismiss": "關閉" "dismiss": "關閉",
"new_layout_title": "新版面配置",
"new_layout_button": "更多資訊"
}, },
"settings": { "settings": {
"related_settings": "相關設定" "related_settings": "相關設定"
}, },
"settings_appearance": { "settings_appearance": {
"related_code_blocks": "文字筆記中程式碼區塊的配色方案", "related_code_blocks": "文字筆記中程式碼區塊的配色方案",
"related_code_notes": "程式碼筆記的配色方案" "related_code_notes": "程式碼筆記的配色方案",
"ui": "使用者介面",
"ui_old_layout": "舊版面配置",
"ui_new_layout": "新版面配置"
}, },
"units": { "units": {
"percentage": "%" "percentage": "%"
@@ -2135,6 +2159,40 @@
"read_only_explicit": "唯讀", "read_only_explicit": "唯讀",
"read_only_auto": "自動唯讀", "read_only_auto": "自動唯讀",
"shared_publicly": "公開分享", "shared_publicly": "公開分享",
"shared_locally": "本地分享" "shared_locally": "本地分享",
"read_only_explicit_description": "此筆記已被手動設定為唯讀。\n點擊以臨時編輯。",
"read_only_temporarily_disabled": "臨時編輯",
"shared_copy_to_clipboard": "複製連結至剪貼簿",
"shared_open_in_browser": "在瀏覽器中打開連結",
"shared_unshare": "取消分享",
"clipped_note": "網頁擷取",
"execute_script": "運行腳本",
"execute_sql": "運行 SQL"
},
"breadcrumb": {
"hoisted_badge": "聚焦",
"hoisted_badge_title": "取消聚焦",
"workspace_badge": "工作空間",
"scroll_to_top_title": "跳轉至筆記開頭",
"create_new_note": "新增子筆記",
"empty_hide_archived_notes": "隱藏已歸檔的筆記"
},
"status_bar": {
"language_title": "更改內容語言",
"note_info_title": "查看筆記資訊(如日期、筆記大小)",
"backlinks_one": "{{count}} 個反連結",
"backlinks_title_one": "查看反連結",
"attachments_one": "{{count}} 個附件",
"attachments_title_one": "在新分頁中查看附件",
"attributes_one": "{{count}} 個屬性",
"attributes_title": "自有屬性及繼承屬性",
"note_paths_one": "{{count}} 條路徑",
"note_paths_title": "筆記路徑",
"code_note_switcher": "更改語言模式"
},
"right_pane": {
"empty_button": "隱藏面板",
"toggle": "切換右側面板",
"custom_widget_go_to_source": "跳轉至原始碼"
} }
} }

View File

@@ -16,6 +16,8 @@
} }
a.tn-link { a.tn-link {
--link-hover-background: var(--icon-button-hover-background);
color: var(--custom-color, inherit); color: var(--custom-color, inherit);
&:hover { &:hover {
@@ -46,6 +48,19 @@
overflow: hidden; overflow: hidden;
display: block; display: block;
flex-shrink: 2; flex-shrink: 2;
font-weight: normal;
}
}
.icon-action {
font-size: .9rem !important;
.bxs-chevron-right {
transform: translateY(8%);
&::before {
opacity: .75;
}
} }
} }
@@ -72,6 +87,15 @@
color: var(--custom-color, inherit) !important; color: var(--custom-color, inherit) !important;
} }
.dropdown .breadcrumb-child-list {
/* Icon */
li > span:first-child {
opacity: .75;
padding-inline-end: 4px;
translate: none;
};
}
a.breadcrumb-last-item, a.breadcrumb-last-item,
a.breadcrumb-last-item:visited { a.breadcrumb-last-item:visited {
text-decoration: none; text-decoration: none;

View File

@@ -189,10 +189,11 @@ interface BreadcrumbSeparatorProps {
function BreadcrumbSeparator(props: BreadcrumbSeparatorProps) { function BreadcrumbSeparator(props: BreadcrumbSeparatorProps) {
return ( return (
<Dropdown <Dropdown
text={<Icon icon="bx bx-chevron-right" />} text={<Icon icon="bx bxs-chevron-right" />}
noSelectButtonStyle noSelectButtonStyle
buttonClassName="icon-action" buttonClassName="icon-action"
hideToggleArrow hideToggleArrow
dropdownContainerClassName="tn-dropdown-menu-scrollable"
dropdownOptions={{ popperConfig: { strategy: "fixed", placement: "top" } }} dropdownOptions={{ popperConfig: { strategy: "fixed", placement: "top" } }}
> >
<BreadcrumbSeparatorDropdownContent {...props} /> <BreadcrumbSeparatorDropdownContent {...props} />

View File

@@ -1,15 +1,15 @@
.component.status-bar { .component.status-bar {
contain: none; contain: none;
border-top: 1px solid var(--main-border-color); border-top: 1px solid var(--main-border-color);
background-color: var(--left-pane-background-color);
> .status-bar-main-row { > .status-bar-main-row {
min-height: 28px; min-height: 28px;
display: flex; display: flex;
align-items: center; align-items: center;
background-color: var(--left-pane-background-color);
padding-inline: 0.25em; padding-inline: 0.25em;
font-size: 0.85em; font-size: 0.85em;
> .breadcrumb { > .breadcrumb {
flex-grow: 1; flex-grow: 1;
--icon-button-size: 23px; --icon-button-size: 23px;
@@ -155,11 +155,6 @@
} }
} }
.dropdown-code-note-switcher {
max-height: 90vh;
overflow: scroll;
}
.backlinks-widget > .dropdown-menu { .backlinks-widget > .dropdown-menu {
--menu-padding-size: .9em; --menu-padding-size: .9em;
@@ -248,16 +243,82 @@
> .attribute-list { > .attribute-list {
font-size: 0.9em; font-size: 0.9em;
padding: 0.5em 0.75em;
.inherited-attributes-widget > div { .attributes-panel-label {
padding: 0; opacity: .5;
font-size: 0.9em; margin-inline-end: 4px;
font-weight: 600;
} }
.attribute-list-editor { .inherited-attributes-widget {
padding: 0 !important; display: inline;
}
> div {
display: inline;
padding: 0;
}
}
.attribute-list-editor-wrapper {
display: flex;
flex-direction: column-reverse;
padding-bottom: 0 !important;
.attribute-list-editor {
padding-block: 0 !important;
padding-inline: 0 100px !important ;
}
.attribute-errors {
padding: 4px 0;
color: var(--dropdown-item-icon-destructive-color);
font-style: italic;
}
.ck.ck-editor__editable::after {
/* Remove a hidden spinner that causes overflow */
display: none;
}
}
}
div.similar-notes-widget div.similar-notes-wrapper {
max-height: unset;
}
button.select-button:not(:focus-visible) {
outline: none;
} }
} }
.bottom-panel {
margin: 0 !important;
padding: 0;
.bottom-panel-title-bar {
display: flex;
padding: 6px 12px;
background: var(--bottom-panel-title-bar-background-color);
justify-content: space-between;
align-items: center;
.bottom-panel-title-bar-caption {
text-transform: uppercase;
letter-spacing: .3pt;
font-weight: 600;
font-size: .85em;
}
}
.bottom-panel-content {
border-bottom: 1px solid var(--main-border-color);
background: var(--bottom-panel-background-color);
padding: 8px 12px;
max-height: 40vh;
overflow-y: auto;
}
}

View File

@@ -266,11 +266,15 @@ function NoteInfoValue({ text, title, value }: { text: string; title?: string, v
); );
} }
function SimilarNotesPane({ note, similarNotesShown }: NoteInfoContext) { function SimilarNotesPane({ note, similarNotesShown, setSimilarNotesShown }: NoteInfoContext) {
return (similarNotesShown && return (similarNotesShown &&
<div className="similar-notes-pane"> <BottomPanel title={t("similar_notes.title")}
className="similar-notes-pane"
visible={similarNotesShown}
setVisible={setSimilarNotesShown}
>
<SimilarNotesTab note={note} /> <SimilarNotesTab note={note} />
</div> </BottomPanel>
); );
} }
//#endregion //#endregion
@@ -367,15 +371,20 @@ function AttributesPane({ note, noteContext, attributesShown, setAttributesShown
}), [ api ])); }), [ api ]));
return (context && return (context &&
<div className={clsx("attribute-list", !attributesShown && "hidden-ext")}> <BottomPanel title={t("attributes_panel.title")}
<InheritedAttributesTab {...context} /> className="attribute-list"
visible={attributesShown}
setVisible={setAttributesShown}>
<span class="attributes-panel-label">{t("inherited_attribute_list.title")}</span>
<InheritedAttributesTab {...context} emptyListString="inherited_attribute_list.none" />
<AttributeEditor <AttributeEditor
{...context} {...context}
api={api} api={api}
ntxId={noteContext.ntxId} ntxId={noteContext.ntxId}
/> />
</div> </BottomPanel>
); );
} }
//#endregion //#endregion
@@ -422,7 +431,7 @@ function CodeNoteSwitcher({ note }: StatusBarContext) {
icon="bx bx-code-curly" icon="bx bx-code-curly"
text={correspondingMimeType?.title} text={correspondingMimeType?.title}
title={t("status_bar.code_note_switcher")} title={t("status_bar.code_note_switcher")}
dropdownContainerClassName="dropdown-code-note-switcher" dropdownContainerClassName="dropdown-code-note-switcher tn-dropdown-menu-scrollable"
> >
<NoteTypeCodeNoteList <NoteTypeCodeNoteList
currentMimeType={currentNoteMime} currentMimeType={currentNoteMime}
@@ -439,3 +448,26 @@ function CodeNoteSwitcher({ note }: StatusBarContext) {
); );
} }
//#endregion //#endregion
//#region Bottom panel
interface BottomPanelParams {
children: ComponentChildren;
title: string;
visible: boolean;
setVisible?: (visible: boolean) => void;
className?: string;
}
function BottomPanel({ children, title, visible, setVisible, className }: BottomPanelParams) {
return <div className={clsx("bottom-panel", className, {"hidden-ext": !visible})}>
<div className="bottom-panel-title-bar">
<span className="bottom-panel-title-bar-caption">{title}</span>
<button class="icon-action bx bx-x" onClick={() => setVisible?.(false)} />
</div>
<div class={clsx("bottom-panel-content")}>
{children}
</div>
</div>;
}
//#endregion

View File

@@ -9,7 +9,11 @@ import RawHtml from "../react/RawHtml";
import { joinElements } from "../react/react_utils"; import { joinElements } from "../react/react_utils";
import AttributeDetailWidget from "../attribute_widgets/attribute_detail"; import AttributeDetailWidget from "../attribute_widgets/attribute_detail";
export default function InheritedAttributesTab({ note, componentId }: Pick<TabContext, "note" | "componentId">) { type InheritedAttributesTabArgs = Pick<TabContext, "note" | "componentId"> & {
emptyListString?: string;
}
export default function InheritedAttributesTab({ note, componentId, emptyListString }: InheritedAttributesTabArgs) {
const [ inheritedAttributes, setInheritedAttributes ] = useState<FAttribute[]>(); const [ inheritedAttributes, setInheritedAttributes ] = useState<FAttribute[]>();
const [ attributeDetailWidgetEl, attributeDetailWidget ] = useLegacyWidget(() => new AttributeDetailWidget()); const [ attributeDetailWidgetEl, attributeDetailWidget ] = useLegacyWidget(() => new AttributeDetailWidget());
@@ -63,7 +67,7 @@ export default function InheritedAttributesTab({ note, componentId }: Pick<TabCo
/> />
)), " ") )), " ")
) : ( ) : (
<>{t("inherited_attribute_list.no_inherited_attributes")}</> <>{t(emptyListString ?? "inherited_attribute_list.no_inherited_attributes")}</>
)} )}
</div> </div>

View File

@@ -283,6 +283,7 @@ export default function AttributeEditor({ api, note, componentId, notePath, ntxI
return ( return (
<> <>
{!hidden && <div {!hidden && <div
className="attribute-list-editor-wrapper"
ref={wrapperRef} ref={wrapperRef}
style="position: relative; padding-top: 10px; padding-bottom: 10px" style="position: relative; padding-top: 10px; padding-bottom: 10px"
onKeyDown={(e) => { onKeyDown={(e) => {
@@ -296,106 +297,107 @@ export default function AttributeEditor({ api, note, componentId, notePath, ntxI
setTimeout(() => save(), 100); setTimeout(() => save(), 100);
} }
}} }}
> > <div style="position: relative;">
<CKEditor <CKEditor
apiRef={editorRef} apiRef={editorRef}
className="attribute-list-editor" className="attribute-list-editor"
tabIndex={200} tabIndex={200}
editor={CKEditorAttributeEditor} editor={CKEditorAttributeEditor}
currentValue={currentValue} currentValue={currentValue}
config={{ config={{
toolbar: { items: [] }, toolbar: { items: [] },
placeholder: t("attribute_editor.placeholder"), placeholder: t("attribute_editor.placeholder"),
mention: { feeds: mentionSetup }, mention: { feeds: mentionSetup },
licenseKey: "GPL", licenseKey: "GPL",
language: "en" language: "en"
}}
onChange={(currentValue) => {
currentValueRef.current = currentValue ?? "";
const oldValue = getPreprocessedData(lastSavedContent.current ?? "").trimEnd();
const newValue = getPreprocessedData(currentValue ?? "").trimEnd();
setNeedsSaving(oldValue !== newValue);
setError(undefined);
}}
onClick={(e, pos) => {
if (pos && pos.textNode && pos.textNode.data) {
const clickIndex = getClickIndex(pos);
let parsedAttrs: Attribute[];
try {
parsedAttrs = attribute_parser.lexAndParse(getPreprocessedData(currentValueRef.current), true);
} catch (e: unknown) {
// the input is incorrect because the user messed up with it and now needs to fix it manually
console.log(e);
return null;
}
let matchedAttr: Attribute | null = null;
for (const attr of parsedAttrs) {
if (attr.startIndex && clickIndex > attr.startIndex && attr.endIndex && clickIndex <= attr.endIndex) {
matchedAttr = attr;
break;
}
}
setTimeout(() => {
if (matchedAttr) {
attributeDetailWidget.showAttributeDetail({
allAttributes: parsedAttrs,
attribute: matchedAttr,
isOwned: true,
x: e.pageX,
y: e.pageY
});
setState("showAttributeDetail");
} else {
setState("showHelpTooltip");
}
}, 100);
} else {
setState("showHelpTooltip");
}
}}
onKeyDown={() => attributeDetailWidget.hide()}
onBlur={() => save()}
onInitialized={() => editorRef.current?.focus()}
disableNewlines disableSpellcheck
/>
<div className="attribute-editor-buttons">
{ needsSaving && <ActionButton
icon="bx bx-save"
className="save-attributes-button tn-tool-button"
text={escapeQuotes(t("attribute_editor.save_attributes"))}
onClick={save}
/> }
<ActionButton
icon="bx bx-plus"
className="add-new-attribute-button tn-tool-button"
text={escapeQuotes(t("attribute_editor.add_a_new_attribute"))}
onClick={(e) => {
// Prevent automatic hiding of the context menu due to the button being clicked.
e.stopPropagation();
contextMenu.show<AttributeCommandNames>({
x: e.pageX,
y: e.pageY,
orientation: "left",
items: [
{ title: t("attribute_editor.add_new_label"), command: "addNewLabel", uiIcon: "bx bx-hash" },
{ title: t("attribute_editor.add_new_relation"), command: "addNewRelation", uiIcon: "bx bx-transfer" },
{ kind: "separator" },
{ title: t("attribute_editor.add_new_label_definition"), command: "addNewLabelDefinition", uiIcon: "bx bx-empty" },
{ title: t("attribute_editor.add_new_relation_definition"), command: "addNewRelationDefinition", uiIcon: "bx bx-empty" }
],
selectMenuItemHandler: (item) => handleAddNewAttributeCommand(item.command)
});
}} }}
onChange={(currentValue) => {
currentValueRef.current = currentValue ?? "";
const oldValue = getPreprocessedData(lastSavedContent.current ?? "").trimEnd();
const newValue = getPreprocessedData(currentValue ?? "").trimEnd();
setNeedsSaving(oldValue !== newValue);
setError(undefined);
}}
onClick={(e, pos) => {
if (pos && pos.textNode && pos.textNode.data) {
const clickIndex = getClickIndex(pos);
let parsedAttrs: Attribute[];
try {
parsedAttrs = attribute_parser.lexAndParse(getPreprocessedData(currentValueRef.current), true);
} catch (e: unknown) {
// the input is incorrect because the user messed up with it and now needs to fix it manually
console.log(e);
return null;
}
let matchedAttr: Attribute | null = null;
for (const attr of parsedAttrs) {
if (attr.startIndex && clickIndex > attr.startIndex && attr.endIndex && clickIndex <= attr.endIndex) {
matchedAttr = attr;
break;
}
}
setTimeout(() => {
if (matchedAttr) {
attributeDetailWidget.showAttributeDetail({
allAttributes: parsedAttrs,
attribute: matchedAttr,
isOwned: true,
x: e.pageX,
y: e.pageY
});
setState("showAttributeDetail");
} else {
setState("showHelpTooltip");
}
}, 100);
} else {
setState("showHelpTooltip");
}
}}
onKeyDown={() => attributeDetailWidget.hide()}
onBlur={() => save()}
onInitialized={() => editorRef.current?.focus()}
disableNewlines disableSpellcheck
/> />
<div className="attribute-editor-buttons">
{ needsSaving && <ActionButton
icon="bx bx-save"
className="save-attributes-button tn-tool-button"
text={escapeQuotes(t("attribute_editor.save_attributes"))}
onClick={save}
/> }
<ActionButton
icon="bx bx-plus"
className="add-new-attribute-button tn-tool-button"
text={escapeQuotes(t("attribute_editor.add_a_new_attribute"))}
onClick={(e) => {
// Prevent automatic hiding of the context menu due to the button being clicked.
e.stopPropagation();
contextMenu.show<AttributeCommandNames>({
x: e.pageX,
y: e.pageY,
orientation: "left",
items: [
{ title: t("attribute_editor.add_new_label"), command: "addNewLabel", uiIcon: "bx bx-hash" },
{ title: t("attribute_editor.add_new_relation"), command: "addNewRelation", uiIcon: "bx bx-transfer" },
{ kind: "separator" },
{ title: t("attribute_editor.add_new_label_definition"), command: "addNewLabelDefinition", uiIcon: "bx bx-empty" },
{ title: t("attribute_editor.add_new_relation_definition"), command: "addNewRelationDefinition", uiIcon: "bx bx-empty" }
],
selectMenuItemHandler: (item) => handleAddNewAttributeCommand(item.command)
});
}}
/>
</div>
</div> </div>
{ error && ( { error && (

Binary file not shown.

View File

@@ -0,0 +1 @@
{}

View File

@@ -82,7 +82,7 @@
"toggle-note-paths": "Перейти к путям заметки", "toggle-note-paths": "Перейти к путям заметки",
"toggle-similar-notes": "Перейти к похожим заметкам", "toggle-similar-notes": "Перейти к похожим заметкам",
"other": "Прочее", "other": "Прочее",
"toggle-right-pane": "Включить/выключить отображение правой панели, которая включает оглавление и выделенные фрагменты", "toggle-right-pane": "Включить/выключить отображение правой панели, которая включает оглавление и акценты",
"print-active-note": "Распечатать активную заметку", "print-active-note": "Распечатать активную заметку",
"open-note-externally": "Открыть заметку как файл с помощью приложения по умолчанию", "open-note-externally": "Открыть заметку как файл с помощью приложения по умолчанию",
"render-active-note": "Отрендерить (повторно отрендерить) активную заметку", "render-active-note": "Отрендерить (повторно отрендерить) активную заметку",

View File

@@ -0,0 +1,35 @@
{
"get-started": {
"title": "Започнете тук",
"desktop_title": "Свалете десктоп апликацията (v{{version}})",
"architecture": "Архитектура:",
"older_releases": "Вижте по-стари версии",
"server_title": "Конфигурирайте сървър за достъп от различни устройства"
},
"hero_section": {
"title": "Организирайте Вашите идеи. Създайте Вашата лична база от знания.",
"subtitle": "Trilium е решение с отворен код за създаване на бележки и организация на лична база от знания. Изполвайте приложението на Вашия десктоп, или го синхоранизирайте чрез сървар хостнат от Вас за да имате дотъп до бележките си навсякъде.",
"get_started": "Започнете тук",
"github": "GitHub",
"screenshot_alt": "Скриншот от Trilium Notes десктоп програмата"
},
"organization_benefits": {
"title": "Организация",
"note_structure_title": "Структура на бележката",
"note_structure_description": "Бележките може да бъдат подредени йерархично. Няма нужа от папки, понеже всяка бележка може да съдържа под-бележка. Една бележка може да бъде добавена на няколко места в йерархията.",
"attributes_title": "Етикети и връзки на бележката",
"attributes_description": "Използвайте връзки между бележките или добавете етикети за по-лесна кетегоризация. Изплозвайте избрани атрибуте за да въведете стуктурирана информация, която може да бъде използвана в таблици, табла.",
"hoisting_title": "Работни плотове",
"hoisting_description": "Лесно разделяйте лични от работни бележки като ги групирате в работен плот, който ще накара дървото от бележки да показва само специфичен сет от бележки."
},
"productivity_benefits": {
"title": "Продуктивност и безопасност",
"revisions_title": "Ревизии на бележката",
"revisions_content": "Бележките периодично се запазват и ревизиите може да се ползват за ревю или за да се отмени нежелана промяна. Ревизиите също могат да бъдат създавани ръчно.",
"sync_title": "Синхронизация",
"sync_content": "Използвайте лично хостната или качена в клауда инстанция за да синхронизирате Вашите бележки на няколко устройства, и за да ги достъпите от мобилно устройство използвайки ПУА(Прогресивен Уеб Апп).",
"protected_notes_title": "Защитени бележки",
"protected_notes_content": "Защитете чуствителна лична информация като криптирате съобщенията и ги заключите с парола.",
"jump_to_title": "Бързо търсене и команди"
}
}

View File

@@ -125,5 +125,11 @@
"geomap_description": "커스터마이징이 가능한 마커로 휴가를 계획하거나 관심 지점을 지도에 직접 표시하세요. 기록된 GPX 트랙을 표시하여 여정을 추적할 수도 있습니다.", "geomap_description": "커스터마이징이 가능한 마커로 휴가를 계획하거나 관심 지점을 지도에 직접 표시하세요. 기록된 GPX 트랙을 표시하여 여정을 추적할 수도 있습니다.",
"presentation_title": "프레젠테이션", "presentation_title": "프레젠테이션",
"presentation_description": "슬라이드에 정보를 정리하고, 매끄러운 전환 효과와 함께 전체 화면으로 발표하세요. 슬라이드를 PDF로 내보내 간편하게 공유할 수도 있습니다." "presentation_description": "슬라이드에 정보를 정리하고, 매끄러운 전환 효과와 함께 전체 화면으로 발표하세요. 슬라이드를 PDF로 내보내 간편하게 공유할 수도 있습니다."
},
"faq": {
"mobile_question": "모바일 앱이 있나요?",
"mobile_answer": "현재 공식적인 모바일 앱은 없습니다. 하지만, 서버 인스턴스를 가지고 있다면 웹 브라우저를 이용해 접근하거나 PWA로 설치할 수 있습니다. 안드로이드에는 (데스크탑 클라이언트처럼)오프라인에서도 작동하는 TriliumDroid라는 비공식 앱이 있습니다.",
"database_question": "어디에 데이터가 저장되나요?",
"server_question": "Trilium을 사용하기 위해 서버가 필요한가요?"
} }
} }

337
docs/README-bg.md vendored Normal file
View File

@@ -0,0 +1,337 @@
<div align="center">
<sup>Special thanks to:</sup><br />
<a href="https://go.warp.dev/Trilium" target="_blank">
<img alt="Warp sponsorship" width="400" src="https://github.com/warpdotdev/brand-assets/blob/main/Github/Sponsor/Warp-Github-LG-03.png"><br />
Warp, built for coding with multiple AI agents<br />
</a>
<sup>Available for macOS, Linux and Windows</sup>
</div>
<hr />
# Trilium Notes
![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran)
![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\
![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium)
![GitHub Downloads (all assets, all
releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\
[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp)
[![Translation
status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/)
<!-- translate:off -->
<!-- LANGUAGE SWITCHER -->
[Chinese (Simplified Han script)](./README-ZH_CN.md) | [Chinese (Traditional Han
script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md)
| [German](./README-de.md) | [Greek](./README-el.md) | [Italian](./README-it.md)
| [Japanese](./README-ja.md) | [Romanian](./README-ro.md) |
[Spanish](./README-es.md)
<!-- translate:on -->
Trilium Notes is a free and open-source, cross-platform hierarchical note taking
application with focus on building large personal knowledge bases.
<img src="./app.png" alt="Trilium Screenshot" width="1000">
## ⏬ Download
- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest)
stable version, recommended for most users.
- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly)
unstable development version, updated daily with the latest features and
fixes.
## 📚 Documentation
**Visit our comprehensive documentation at
[docs.triliumnotes.org](https://docs.triliumnotes.org/)**
Our documentation is available in multiple formats:
- **Online Documentation**: Browse the full documentation at
[docs.triliumnotes.org](https://docs.triliumnotes.org/)
- **In-App Help**: Press `F1` within Trilium to access the same documentation
directly in the application
- **GitHub**: Navigate through the [User Guide](./User%20Guide/User%20Guide/) in
this repository
### Quick Links
- [Getting Started Guide](https://docs.triliumnotes.org/)
- [Installation Instructions](https://docs.triliumnotes.org/user-guide/setup)
- [Docker
Setup](https://docs.triliumnotes.org/user-guide/setup/server/installation/docker)
- [Upgrading
TriliumNext](https://docs.triliumnotes.org/user-guide/setup/upgrading)
- [Basic Concepts and
Features](https://docs.triliumnotes.org/user-guide/concepts/notes)
- [Patterns of Personal Knowledge
Base](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge)
## 🎁 Features
* Notes can be arranged into arbitrarily deep tree. Single note can be placed
into multiple places in the tree (see
[cloning](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning))
* Rich WYSIWYG note editor including e.g. tables, images and
[math](https://docs.triliumnotes.org/user-guide/note-types/text) with markdown
[autoformat](https://docs.triliumnotes.org/user-guide/note-types/text/markdown-formatting)
* Support for editing [notes with source
code](https://docs.triliumnotes.org/user-guide/note-types/code), including
syntax highlighting
* Fast and easy [navigation between
notes](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation),
full text search and [note
hoisting](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting)
* Seamless [note
versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions)
* Note
[attributes](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes)
can be used for note organization, querying and advanced
[scripting](https://docs.triliumnotes.org/user-guide/scripts)
* UI available in English, German, Spanish, French, Romanian, and Chinese
(simplified and traditional)
* Direct [OpenID and TOTP
integration](https://docs.triliumnotes.org/user-guide/setup/server/mfa) for
more secure login
* [Synchronization](https://docs.triliumnotes.org/user-guide/setup/synchronization)
with self-hosted sync server
* there are [3rd party services for hosting synchronisation
server](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting)
* [Sharing](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing)
(publishing) notes to public internet
* Strong [note
encryption](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes)
with per-note granularity
* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type
"canvas")
* [Relation
maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and
[note/link maps](https://docs.triliumnotes.org/user-guide/note-types/note-map)
for visualizing notes and their relations
* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/)
* [Geo maps](https://docs.triliumnotes.org/user-guide/collections/geomap) with
location pins and GPX tracks
* [Scripting](https://docs.triliumnotes.org/user-guide/scripts) - see [Advanced
showcases](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases)
* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) for
automation
* Scales well in both usability and performance upwards of 100 000 notes
* Touch optimized [mobile
frontend](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) for
smartphones and tablets
* Built-in [dark
theme](https://docs.triliumnotes.org/user-guide/concepts/themes), support for
user themes
* [Evernote](https://docs.triliumnotes.org/user-guide/concepts/import-export/evernote)
and [Markdown import &
export](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown)
* [Web Clipper](https://docs.triliumnotes.org/user-guide/setup/web-clipper) for
easy saving of web content
* Customizable UI (sidebar buttons, user-defined widgets, ...)
* [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics),
along with a Grafana Dashboard.
✨ Check out the following third-party resources/communities for more TriliumNext
related goodies:
- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party
themes, scripts, plugins and more.
- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more.
## ❓Why TriliumNext?
The original Trilium developer ([Zadam](https://github.com/zadam)) has
graciously given the Trilium repository to the community project which resides
at https://github.com/TriliumNext
### ⬆Migrating from Zadam/Trilium?
There are no special migration steps to migrate from a zadam/Trilium instance to
a TriliumNext/Trilium instance. Simply [install
TriliumNext/Trilium](#-installation) as usual and it will use your existing
database.
Versions up to and including
[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) are
compatible with the latest zadam/trilium version of
[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later
versions of TriliumNext/Trilium have their sync versions incremented which
prevents direct migration.
## 💬 Discuss with us
Feel free to join our official conversations. We would love to hear what
features, suggestions, or issues you may have!
- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous
discussions.)
- The `General` Matrix room is also bridged to
[XMPP](xmpp:discuss@trilium.thisgreat.party?join)
- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For
asynchronous discussions.)
- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug
reports and feature requests.)
## 🏗 Installation
### Windows / MacOS
Download the binary release for your platform from the [latest release
page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package
and run the `trilium` executable.
### Linux
If your distribution is listed in the table below, use your distribution's
package.
[![Packaging
status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions)
You may also download the binary release for your platform from the [latest
release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the
package and run the `trilium` executable.
TriliumNext is also provided as a Flatpak, but not yet published on FlatHub.
### Browser (any OS)
If you use a server installation (see below), you can directly access the web
interface (which is almost identical to the desktop app).
Currently only the latest versions of Chrome & Firefox are supported (and
tested).
### Mobile
To use TriliumNext on a mobile device, you can use a mobile web browser to
access the mobile interface of a server installation (see below).
See issue https://github.com/TriliumNext/Trilium/issues/4962 for more
information on mobile app support.
If you prefer a native Android app, you can use
[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid).
Report bugs and missing features at [their
repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to
disable automatic updates on your server installation (see below) when using
TriliumDroid since the sync version must match between Trilium and TriliumDroid.
### Server
To install TriliumNext on your own server (including via Docker from
[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server
installation docs](https://docs.triliumnotes.org/user-guide/setup/server).
## 💻 Contribute
### Translations
If you are a native speaker, help us translate Trilium by heading over to our
[Weblate page](https://hosted.weblate.org/engage/trilium/).
Here's the language coverage we have so far:
[![Translation
status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/)
### Code
Download the repository, install dependencies using `pnpm` and then run the
server (available at http://localhost:8080):
```shell
git clone https://github.com/TriliumNext/Trilium.git
cd Trilium
pnpm install
pnpm run server:start
```
### Documentation
Download the repository, install dependencies using `pnpm` and then run the
environment required to edit the documentation:
```shell
git clone https://github.com/TriliumNext/Trilium.git
cd Trilium
pnpm install
pnpm edit-docs:edit-docs
```
### Building the Executable
Download the repository, install dependencies using `pnpm` and then build the
desktop app for Windows:
```shell
git clone https://github.com/TriliumNext/Trilium.git
cd Trilium
pnpm install
pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32
```
For more details, see the [development
docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide).
### Developer Documentation
Please view the [documentation
guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md)
for details. If you have more questions, feel free to reach out via the links
described in the "Discuss with us" section above.
## 👏 Shoutouts
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight
widget.
* [Dosu](https://dosu.dev/) for providing us with the automated responses to
GitHub issues and discussions.
* [Tabler Icons](https://tabler.io/icons) for the system tray icons.
Trilium would not be possible without the technologies behind it:
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind
text notes. We are grateful for being offered a set of the premium features.
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with
support for huge amount of languages.
* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite
whiteboard used in Canvas notes.
* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the
mind map functionality.
* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical
maps.
* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive
table used in collections.
* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library
without real competition.
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library.
Used in [relation
maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and
[link
maps](https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#link-map)
## 🤝 Support
Trilium is built and maintained with [hundreds of hours of
work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your
support keeps it open-source, improves features, and covers costs such as
hosting.
Consider supporting the main developer
([eliandoran](https://github.com/eliandoran)) of the application via:
- [GitHub Sponsors](https://github.com/sponsors/eliandoran)
- [PayPal](https://paypal.me/eliandoran)
- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran)
## 🔑 License
Copyright 2017-2025 zadam, Elian Doran, and other contributors
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any
later version.

View File

@@ -69,7 +69,7 @@
"tslib": "2.8.1", "tslib": "2.8.1",
"tsx": "4.21.0", "tsx": "4.21.0",
"typescript": "~5.9.0", "typescript": "~5.9.0",
"typescript-eslint": "8.50.0", "typescript-eslint": "8.50.1",
"upath": "2.0.1", "upath": "2.0.1",
"vite": "7.3.0", "vite": "7.3.0",
"vite-plugin-dts": "~4.5.0", "vite-plugin-dts": "~4.5.0",

View File

@@ -21,11 +21,11 @@
"ckeditor5-metadata.json" "ckeditor5-metadata.json"
], ],
"devDependencies": { "devDependencies": {
"@ckeditor/ckeditor5-dev-build-tools": "54.2.2", "@ckeditor/ckeditor5-dev-build-tools": "54.2.3",
"@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0",
"@ckeditor/ckeditor5-package-tools": "5.0.1", "@ckeditor/ckeditor5-package-tools": "5.0.1",
"@typescript-eslint/eslint-plugin": "~8.50.0", "@typescript-eslint/eslint-plugin": "~8.50.0",
"@typescript-eslint/parser": "8.50.0", "@typescript-eslint/parser": "8.50.1",
"@vitest/browser": "4.0.16", "@vitest/browser": "4.0.16",
"@vitest/coverage-istanbul": "4.0.16", "@vitest/coverage-istanbul": "4.0.16",
"ckeditor5": "47.3.0", "ckeditor5": "47.3.0",

View File

@@ -22,11 +22,11 @@
"ckeditor5-metadata.json" "ckeditor5-metadata.json"
], ],
"devDependencies": { "devDependencies": {
"@ckeditor/ckeditor5-dev-build-tools": "54.2.2", "@ckeditor/ckeditor5-dev-build-tools": "54.2.3",
"@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0",
"@ckeditor/ckeditor5-package-tools": "5.0.1", "@ckeditor/ckeditor5-package-tools": "5.0.1",
"@typescript-eslint/eslint-plugin": "~8.50.0", "@typescript-eslint/eslint-plugin": "~8.50.0",
"@typescript-eslint/parser": "8.50.0", "@typescript-eslint/parser": "8.50.1",
"@vitest/browser": "4.0.16", "@vitest/browser": "4.0.16",
"@vitest/coverage-istanbul": "4.0.16", "@vitest/coverage-istanbul": "4.0.16",
"ckeditor5": "47.3.0", "ckeditor5": "47.3.0",

View File

@@ -24,11 +24,11 @@
"ckeditor5-metadata.json" "ckeditor5-metadata.json"
], ],
"devDependencies": { "devDependencies": {
"@ckeditor/ckeditor5-dev-build-tools": "54.2.2", "@ckeditor/ckeditor5-dev-build-tools": "54.2.3",
"@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0",
"@ckeditor/ckeditor5-package-tools": "5.0.1", "@ckeditor/ckeditor5-package-tools": "5.0.1",
"@typescript-eslint/eslint-plugin": "~8.50.0", "@typescript-eslint/eslint-plugin": "~8.50.0",
"@typescript-eslint/parser": "8.50.0", "@typescript-eslint/parser": "8.50.1",
"@vitest/browser": "4.0.16", "@vitest/browser": "4.0.16",
"@vitest/coverage-istanbul": "4.0.16", "@vitest/coverage-istanbul": "4.0.16",
"ckeditor5": "47.3.0", "ckeditor5": "47.3.0",

View File

@@ -24,11 +24,11 @@
"ckeditor5-metadata.json" "ckeditor5-metadata.json"
], ],
"devDependencies": { "devDependencies": {
"@ckeditor/ckeditor5-dev-build-tools": "54.2.2", "@ckeditor/ckeditor5-dev-build-tools": "54.2.3",
"@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0",
"@ckeditor/ckeditor5-package-tools": "5.0.1", "@ckeditor/ckeditor5-package-tools": "5.0.1",
"@typescript-eslint/eslint-plugin": "~8.50.0", "@typescript-eslint/eslint-plugin": "~8.50.0",
"@typescript-eslint/parser": "8.50.0", "@typescript-eslint/parser": "8.50.1",
"@vitest/browser": "4.0.16", "@vitest/browser": "4.0.16",
"@vitest/coverage-istanbul": "4.0.16", "@vitest/coverage-istanbul": "4.0.16",
"ckeditor5": "47.3.0", "ckeditor5": "47.3.0",

View File

@@ -24,11 +24,11 @@
"ckeditor5-metadata.json" "ckeditor5-metadata.json"
], ],
"devDependencies": { "devDependencies": {
"@ckeditor/ckeditor5-dev-build-tools": "54.2.2", "@ckeditor/ckeditor5-dev-build-tools": "54.2.3",
"@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0",
"@ckeditor/ckeditor5-package-tools": "5.0.1", "@ckeditor/ckeditor5-package-tools": "5.0.1",
"@typescript-eslint/eslint-plugin": "~8.50.0", "@typescript-eslint/eslint-plugin": "~8.50.0",
"@typescript-eslint/parser": "8.50.0", "@typescript-eslint/parser": "8.50.1",
"@vitest/browser": "4.0.16", "@vitest/browser": "4.0.16",
"@vitest/coverage-istanbul": "4.0.16", "@vitest/coverage-istanbul": "4.0.16",
"ckeditor5": "47.3.0", "ckeditor5": "47.3.0",

View File

@@ -16,7 +16,7 @@
"@codemirror/lang-xml": "6.1.0", "@codemirror/lang-xml": "6.1.0",
"@codemirror/legacy-modes": "6.5.2", "@codemirror/legacy-modes": "6.5.2",
"@codemirror/search": "6.5.11", "@codemirror/search": "6.5.11",
"@codemirror/view": "6.39.4", "@codemirror/view": "6.39.6",
"@fsegurai/codemirror-theme-abcdef": "6.2.3", "@fsegurai/codemirror-theme-abcdef": "6.2.3",
"@fsegurai/codemirror-theme-abyss": "6.2.3", "@fsegurai/codemirror-theme-abyss": "6.2.3",
"@fsegurai/codemirror-theme-android-studio": "6.2.3", "@fsegurai/codemirror-theme-android-studio": "6.2.3",

View File

@@ -32,8 +32,8 @@
"devDependencies": { "devDependencies": {
"@digitak/esrun": "3.2.26", "@digitak/esrun": "3.2.26",
"@triliumnext/ckeditor5": "workspace:*", "@triliumnext/ckeditor5": "workspace:*",
"@typescript-eslint/eslint-plugin": "8.50.0", "@typescript-eslint/eslint-plugin": "8.50.1",
"@typescript-eslint/parser": "8.50.0", "@typescript-eslint/parser": "8.50.1",
"dotenv": "17.2.3", "dotenv": "17.2.3",
"esbuild": "0.27.2", "esbuild": "0.27.2",
"eslint": "9.39.2", "eslint": "9.39.2",

630
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff