Compare commits

...

24 Commits

Author SHA1 Message Date
renovate[bot]
96d78af126 fix(deps): update dependency fuse.js to v7.3.0 2026-04-08 01:36:15 +00:00
Elian Doran
a2c5adec3d Extra bugfixes (#9332) 2026-04-07 21:28:45 +03:00
Elian Doran
6089c8c7c6 Merge branch 'feature/extra_bugfixes' of https://github.com/TriliumNext/Trilium into feature/extra_bugfixes 2026-04-07 20:52:26 +03:00
Elian Doran
f28f725519 fix(server,desktop): not running correctly if placed in dot-hidden directory 2026-04-07 20:46:25 +03:00
Elian Doran
22d853e0b0 Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Elian Doran <contact@eliandoran.me>
2026-04-07 20:26:55 +03:00
Elian Doran
0f1d395651 refactor(script): move runScript to executeScript at BNote level 2026-04-07 19:59:14 +03:00
Elian Doran
3a0bab217d fix(share): hard-coded root-level paths 2026-04-07 19:48:06 +03:00
Elian Doran
f824cb5f15 feat(script): add API to execute backend 2026-04-07 19:40:12 +03:00
Elian Doran
40fd8d6d1a fix(quick_search): ctrl+click & middle click not working (closes #9220) 2026-04-07 19:18:16 +03:00
Elian Doran
e37f73bce0 fix(tab_bar): changing note icon reflect in the tab icon (closes #8994) 2026-04-07 19:11:26 +03:00
Elian Doran
d1cd08972f chore(share): use i18n for more strings 2026-04-07 19:07:20 +03:00
Elian Doran
5a13ca6409 feat(share): render dates on the client side 2026-04-07 19:06:33 +03:00
Elian Doran
eb3fd73415 fix(share): translation not used in template (closes #8722) 2026-04-07 18:54:13 +03:00
Elian Doran
1764fcbba2 fix(script): useContext not provided in imports (closes #9152) 2026-04-07 18:49:54 +03:00
Elian Doran
19f3552bfc fix(calendar): colors unreadable on dark theme (closes #8989)
The calendar event has a light yellow background with light yellow text in dark theme, making it nearly unreadable.

The root cause is a CSS load order issue. The :root defaults in index.css:1-10 are loaded after the dark theme's :root overrides (since component CSS loads after global CSS in Vite), so the defaults (95% lightness, 80% saturation) stomp over the dark theme values (20% lightness, 25% saturation). The background stays light, but --custom-color correctly gets the dark-adjusted (light) text color → light-on-light = bad contrast.

The fix: remove the :root block and use var() fallbacks instead, so there's no :root competition.
2026-04-07 18:48:32 +03:00
Elian Doran
cedce6cf32 feat(relation_map): rename relations through context menu (closes #442) 2026-04-07 18:47:00 +03:00
Elian Doran
26cf215150 fix(share): webviews occupied very little height (closes #9215) 2026-04-07 18:08:23 +03:00
Elian Doran
d21557069c fix(import/zip): ZIPs without language encoding flag importing garbage (closes #3013) 2026-04-07 17:01:34 +03:00
Elian Doran
28b2547229 Translations update from Hosted Weblate (#9327) 2026-04-07 16:13:33 +03:00
Hosted Weblate
d75f556074 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-07 15:03:00 +02:00
Ali Kaya
eb66810e59 Translated using Weblate (Turkish)
Currently translated at 5.6% (104 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/tr/
2026-04-07 15:02:55 +02:00
Tomas Adamek
540b39206d Translated using Weblate (Czech)
Currently translated at 100.0% (1842 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/cs/
2026-04-07 15:02:55 +02:00
Tomas Adamek
5baea04c5d Translated using Weblate (Czech)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/cs/
2026-04-07 15:02:54 +02:00
Giovi
f5e65748a7 Translated using Weblate (Italian)
Currently translated at 100.0% (1842 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-07 15:02:53 +02:00
42 changed files with 558 additions and 388 deletions

View File

@@ -1,4 +1,4 @@
import { Fragment, h, VNode } from "preact";
import { createContext, Fragment, h, VNode } from "preact";
import * as hooks from "preact/hooks";
import ActionButton from "../widgets/react/ActionButton";
@@ -47,6 +47,7 @@ export const preactAPI = Object.freeze({
// Core
h,
Fragment,
createContext,
/**
* Method that must be run for widget scripts that run on Preact, using JSX. The method just returns the same definition, reserved for future typechecking and perhaps validation purposes.

View File

@@ -1129,9 +1129,7 @@
"spellcheck": {
"title": "التدقيق الاملائي",
"enable": "تفعيل التدقيق الاملائي",
"language_code_label": "رمز اللغة او رموز اللغات",
"available_language_codes_label": "رموز اللغات المتاحة:",
"language_code_placeholder": "على سبيل المثال \"en-US\", \"de-AI\""
"language_code_label": "رمز اللغة او رموز اللغات"
},
"note-map": {
"button-link-map": "خريطة الروابط",

View File

@@ -1437,9 +1437,6 @@
"description": "这些选项仅适用于桌面版本,浏览器将使用其原生的拼写检查功能。",
"enable": "启用拼写检查",
"language_code_label": "语言代码",
"language_code_placeholder": "例如 \"en-US\", \"de-AT\"",
"multiple_languages_info": "多种语言可以用逗号分隔,例如 \"en-US, de-DE, cs\"。 ",
"available_language_codes_label": "可用的语言代码:",
"restart-required": "拼写检查选项的更改将在应用重启后生效。"
},
"sync_2": {

View File

@@ -21,7 +21,7 @@
},
"bundle-error": {
"title": "Načtení uživatelského skriptu selhalo",
"message": "Uživatelský skript z poznámky s ID \"{{id}}\" a názvem \"{{title}}\" nemohl být spuštěn z důvodu: \n\n{{message}}"
"message": "Skript nebylo možné spustit z následujícího důvodu:\n\n{{message}}"
},
"widget-list-error": {
"title": "Nepodařilo se získat seznam widgetů ze serveru"
@@ -29,7 +29,7 @@
"widget-render-error": {
"title": "Nepodařilo se vykreslit vlastní React widget"
},
"widget-missing-parent": "Vlastní widget nemá definovanou povinnou vlastnost '{{property}}'.",
"widget-missing-parent": "Vlastní widget nemá definovanou povinnou vlastnost {{property}}“.\n\nPokud má být tento skript spuštěn bez prvku uživatelského rozhraní, použijte místo toho „#run=frontendStartup“.",
"open-script-note": "Otevřít poznámku se skriptem",
"scripting-error": "Chyba vlastního skriptu: {{title}}"
},
@@ -120,9 +120,9 @@
"note_cloned": "Poznámka „{{clonedTitle}}“ bylo naklonována do „{{targetTitle}}“"
},
"zpetne_odkazy": {
"backlink_one": "{{count}} zpětný odkaz",
"backlink_few": "{{count}} zpětné odkazy",
"backlink_other": "{{count}} zpětných odkazů",
"backlink_one": "{{count}} Zpětný odkaz",
"backlink_few": "{{count}} Zpětné odkazy",
"backlink_other": "{{count}} Zpětných odkazů",
"relation": "vazba"
},
"help": {
@@ -183,7 +183,7 @@
"import": {
"importIntoNote": "Import do poznámky",
"chooseImportFile": "Vyberte soubor k importu",
"importDescription": "Obsah vybraných souborů bude importován jako dceřiné poznámky do {{name}}",
"importDescription": "Obsah vybraných souborů bude importován jako dceřiné poznámky do",
"importZipRecommendation": "Při importu ZIP souboru bude hierarchie poznámek odrážet strukturu podadresářů v archivu.",
"options": "Nastavení",
"safeImportTooltip": "Exportované soubory Trilium <code>.zip</code> mohou obsahovat spustitelné skripty, které mohou mít škodlivé chování. Bezpečný import deaktivuje automatické spouštění všech importovaných skriptů. Zrušte zaškrtnutí \"Bezpečný import\" pouze v případě, že importovaný archiv má obsahovat spustitelné skripty a plně důvěřujete obsahu importovaného souboru.",
@@ -215,26 +215,26 @@
"box_size_small": "Malý (~ 10 řádků)",
"box_size_medium": "Střední (~ 30 řádků)",
"box_size_full": "Úplný (pole zobrazuje kompletní text)",
"button_include": "Zahrnout {{note}}"
"button_include": "Zahrnout poznámku"
},
"info": {
"modalTitle": "Informační zpráva",
"closeButton": "Zavřít",
"okButton": "OK",
"copy_to_clipboard": "Kopírovat do {{clipboard}}"
"copy_to_clipboard": "Kopírovat do schránky"
},
"jump_to_note": {
"search_placeholder": "Hledat {{note}} podle jména nebo typu > pro příkazy...",
"search_placeholder": "Hledat poznámku podle jména nebo typu > pro příkazy...",
"search_button": "Hledat v celém textu"
},
"markdown_import": {
"dialog_title": "{{Markdown}} import",
"modal_body_text": "Kvůli sandboxu prohlížeče není možné přímo číst z {{clipboard}} z {{JavaScript}}. Vložte prosím {{Markdown}} k importu do textového pole níže a klikněte na tlačítko Import.",
"dialog_title": "Markdown import",
"modal_body_text": "Vzhledem k omezením prohlížeče není možné přímo číst obsah schránky z JavaScriptu. Vložte prosím Markdown, který chcete importovat, do textového pole níže a klikněte na tlačítko Importovat",
"import_button": "Import",
"import_success": "{{Markdown}} obsah byl importován do dokumentu."
"import_success": "Markdown obsah byl importován do dokumentu."
},
"move_to": {
"dialog_title": "Přesunout {{notes}} do ...",
"dialog_title": "Přesunout poznámku do ...",
"notes_to_move": "Poznámky k přesunu",
"target_parent_note": "Cílová nadřazená poznámka",
"search_placeholder": "Hledat poznámku podle názvu",
@@ -333,12 +333,12 @@
"attr_detail_title": "Detail Atributu",
"close_button_title": "Zrušit změny a zavřít",
"attr_is_owned_by": "Atribut je vlastněn",
"attr_name_title": "Název atributu může obsahovat pouze alfanumerické znaky, dvojtečku a podtržítko.",
"attr_name_title": "Název atributu může obsahovat pouze alfanumerické znaky, dvojtečku a podtržítko",
"name": "Název",
"value": "Hodnota",
"target_note_title": "Vazba je pojmenované spojení mezi zdrojovou {{note}} a cílovou {{note}}.",
"target_note": "Cílová {{note}}",
"promoted_title": "Propagovaný atribut je zobrazen prominentně na {{note}}.",
"target_note_title": "Vazba je pojmenované spojení mezi zdrojovou poznámkou a cílovou poznámkou.",
"target_note": "Cílová poznámka",
"promoted_title": "Propagovaný atribut je zobrazen prominentně na poznámce.",
"promoted": "Propagováno",
"promoted_alias_title": "Název, který se má zobrazit v uživatelském rozhraní propagovaných atributů.",
"promoted_alias": "Alias",
@@ -374,51 +374,51 @@
"disable_versioning": "zakáže automatické verzování. Užitečné například pro velké, ale nepodstatné poznámky - například velké JavaScript knihovny používané pro scripting",
"calendar_root": "označí poznámku, která by měla být použita jako kořen pro denní poznámky. Pouze jedna by měla být takto označena.",
"archived": "Poznámky s tímto štítkem nebudou ve výchozím nastavení viditelné ve výsledcích vyhledávání (také v dialogových oknech Přeskočit na, Přidat odkaz atd.).",
"exclude_from_export": "Poznámky (včetně jejich podstromu) nebudou zahrnuty do žádného exportu poznámek.",
"run": "Definuje, při kterých událostech se má skript spustit. Možné hodnoty jsou: <ul> <li>frontendStartup - když se spustí frontend Trilium (nebo se obnoví), ale ne na mobilních zařízeních.</li> <li>mobileStartup - když se spustí frontend Trilium (nebo se obnoví), na mobilních zařízeních.</li> <li>backendStartup - když se spustí backend Trilium.</li> <li>hourly - spustit jednou za hodinu. Můžete použít další štítek <code>runAtHour</code> pro určení hodiny.</li> <li>daily - spustit jednou denně.</li> </ul>",
"exclude_from_export": "Poznámky (včetně jejich podstromu) nebudou zahrnuty do žádného exportu poznámek",
"run": "Definuje, při kterých událostech se má skript spustit. Možné hodnoty jsou: \n<ul>\n <li>frontendStartup - když se spustí frontend Trilium (nebo se obnoví), ale ne na mobilních zařízeních.</li>\n<li>mobileStartup - když se spustí frontend Trilium (nebo se obnoví), na mobilních zařízeních.</li>\n <li>backendStartup - když se spustí backend Trilium.</li>\n<li>hourly - spustit jednou za hodinu. Můžete použít další štítek <code>runAtHour</code> pro určení hodiny.</li>\n <li>daily - spustit jednou denně.</li>\n </ul>",
"run_on_instance": "Definujte, na které instanci Trilium se má toto spustit. Ve výchozím nastavení na všech instancích.",
"run_at_hour": "V kterou hodinu se má toto spustit. Mělo by se používat společně s <code>#run=hourly</code>. Lze definovat vícekrát pro více spuštění během dne.",
"disable_inclusion": "Skripty s tímto štítkem nebudou zahrnuty do spuštění nadřazeného skriptu.",
"sorted": "Udržuje podřízené poznámky seřazené podle názvu abecedně.",
"sorted": "Udržuje podřízené poznámky seřazené podle názvu abecedně",
"sort_direction": "ASC (výchozí) nebo DESC",
"sort_folders_first": "Složky (poznámky s podřízenými položkami) by měly být řazeny nahoře.",
"top": "Udržuje danou poznámku nahoře v rámci jejího nadřazeného (platí pouze pro seřazené nadřazené položky).",
"hide_promoted_attributes": "Skryje propagované atributy v této poznámce.",
"sort_folders_first": "Složky (poznámky s podřízenými položkami) by měly být řazeny nahoře",
"top": "Udržuje danou poznámku nahoře v rámci jejího nadřazeného (platí pouze pro seřazené nadřazené položky)",
"hide_promoted_attributes": "Skryje propagované atributy v této poznámce",
"read_only": "Editor je v režimu pouze pro čtení. Funguje pouze pro textové a kódové poznámky.",
"auto_read_only_disabled": "Textové/kódové poznámky se mohou automaticky nastavit do režimu pouze pro čtení, pokud jsou příliš velké. Toto chování můžete zakázat pro každou poznámku přidáním tohoto štítku do poznámky.",
"auto_read_only_disabled": "Textové/kódové poznámky se mohou automaticky nastavit do režimu pouze pro čtení, pokud jsou příliš velké. Toto chování můžete zakázat pro každou poznámku přidáním tohoto štítku do poznámky",
"app_css": "Označuje CSS poznámky, které jsou načteny do aplikace Trilium a mohou být tak použity k úpravě vzhledu Trilium.",
"app_theme": "Označuje CSS poznámky, které jsou kompletními motivy Trilium a jsou tak dostupné v možnostech Trilium.",
"app_theme_base": "nastavte na \"next\", \"next-light\" nebo \"next-dark\" pro použití odpovídajícího tématu TriliumNext (auto, světlé nebo tmavé) jako základu pro vlastní téma, namísto staršího.",
"css_class": "hodnota tohoto štítku je poté přidána jako CSS třída k uzlu reprezentujícímu danou {{Poznámka}} ve stromu. To může být užitečné pro pokročilé tématizace. Lze použít v šablonových {{Poznámka}}.",
"icon_class": "hodnota tohoto štítku je přidána jako CSS třída k ikoně ve stromu, což může pomoci vizuálně odlišit {{Poznámky}} ve stromu. Příkladem může být bx bx-home - ikony jsou převzaty z boxicons. Lze použít v šablonových {{Poznámka}}.",
"page_size": "počet položek na stránce v seznamu {{Poznámek}}",
"css_class": "hodnota tohoto štítku je poté přidána jako CSS třída k uzlu reprezentujícímu danou poznámku ve stromu. To může být užitečné pro pokročilé tématizace. Lze použít v šablonových poznámkách.",
"icon_class": "hodnota tohoto štítku je přidána jako CSS třída k ikoně ve stromu, což může pomoci vizuálně odlišit poznámky ve stromu. Příkladem může být bx bx-home - ikony jsou převzaty z boxicons. Lze použít v šablonových poznámkách.",
"page_size": "počet položek na stránce v seznamu poznámek",
"custom_request_handler": "viz <a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">Vlastní zpracovatel požadavků</a>",
"custom_resource_provider": "viz <a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">Vlastní zpracovatel požadavků</a>",
"widget": "označí tuto {{Poznámka}} jako vlastní widget, který bude přidán do stromu komponent Trilium",
"workspace": "označí tuto {{Poznámka}} jako pracovní prostor, který umožňuje snadné zúžení zobrazení",
"workspace_icon_class": "definuje CSS třídu ikony box, která bude použita na {{záložce}} při zúžení zobrazení na tuto {{Poznámka}}",
"workspace_tab_background_color": "CSS barva použitá na {{záložce}} při zúžení zobrazení na tuto {{Poznámka}}",
"workspace_calendar_root": "Definuje kořenový {{Kalendář}} pro pracovní prostor",
"workspace_template": "Tato {{Poznámka}} se zobrazí ve výběru dostupných {{šablon}} při vytváření nové {{Poznámky}}, ale pouze pokud je zúžena do pracovního prostoru obsahujícího tuto {{šablonu}}",
"search_home": "nové {{Poznámky}} {{Hledání}} budou vytvořeny jako {{Dceřiné}} této {{Poznámky}}",
"workspace_search_home": "nové {{Poznámky}} {{Hledání}} budou vytvořeny jako {{Dceřiné}} této {{Poznámky}} při zúžení zobrazení na některého z předků této {{Poznámky}} pracovního prostoru",
"inbox": "výchozí složka doručené pošty pro nové {{Poznámky}} - při vytváření {{Poznámky}} pomocí tlačítka \"nová {{Poznámka}}\" na postranním panelu budou {{Poznámky}} vytvořeny jako {{Dceřiné}} {{Poznámky}} označené štítkem <code>#inbox</code>.",
"workspace_inbox": "Výchozí umístění pro nové {{Poznámky}} při přesunutí do některého předka této {{Poznámky}} pracovního prostoru",
"sql_console_home": "Výchozí umístění {{Poznámky}} konzole {{SQL}}",
"bookmark_folder": "{{Poznámka}} s tímto {{štítek}} se zobrazí v {{záložkách}} jako složka (umožňuje přístup k jejím podřízeným {{Poznámky}})",
"share_hidden_from_tree": "Tato {{Poznámka}} je skrytá z levého navigačního {{stromu}}, ale je stále přístupná pomocí její {{URL}}",
"share_external_link": "{{Poznámka}} bude fungovat jako odkaz na externí webovou stránku ve sdíleném {{stromu}}",
"share_alias": "Definujte alias, pod kterým bude {{Poznámka}} dostupná na https://your_trilium_host/share/[your_alias]",
"share_omit_default_css": "Výchozí {{CSS}} stránky pro sdílení bude vynechána. Použijte, pokud provedete rozsáhlé změny stylu.",
"share_root": "Označuje {{Poznámku}}, která je obsluhována z kořene /share.",
"share_description": "Definujte text, který má být přidán do meta tagu {{HTML}} pro popis",
"share_raw": "{{Poznámka}} bude obsluhována v surovém formátu, bez obalu {{HTML}}",
"share_disallow_robot_indexing": "Zakáže indexování této {{Poznámky}} roboty pomocí hlavičky <code>X-Robots-Tag: noindex</code>",
"share_credentials": "Vyžaduje pověření pro přístup k této sdílené {{Poznámce}}. Hodnota se očekává ve formátu 'username:password'. Nezapomeňte ji učinit dědičnou, aby se použila na podřízené {{Poznámky}}/obrázky.",
"share_index": "{{Poznámka}} s tímto {{štítek}} zobrazí všechny kořeny sdílených {{Poznámek}}",
"display_relations": "Seznam jmen {{vazeb}} oddělených čárkami, které se mají zobrazit. Všechny ostatní budou skryté.",
"hide_relations": "Seznam jmen {{vazeb}} oddělených čárkami, které se mají skrýt. Všechny ostatní budou zobrazeny.",
"title_template": "Výchozí název poznámek vytvořených jako dceřiné této poznámky. Hodnota se vyhodnocuje jako JavaScript řetězec a může být tak obohacena o dynamický obsah pomocí vložených proměnných <code>now</code> a <code>parentNote</code>. Příklady: <ul> <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li> <li><code>Log pro ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li> </ul> Viz <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki s detaily</a>, API dokumentace pro <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> a <a href=\"https://day.js.org/docs/en/display/format\">now</a> pro detaily.",
"widget": "označí tuto poznámku jako vlastní widget, který bude přidán do stromu komponent Trilium",
"workspace": "označí tuto poznámku jako pracovní prostor, který umožňuje snadné zúžení zobrazení",
"workspace_icon_class": "definuje CSS třídu ikony box, která bude použita na záložce při zúžení zobrazení na tuto poznámku",
"workspace_tab_background_color": "CSS barva použitá na záložce při zúžení zobrazení na tuto poznámku",
"workspace_calendar_root": "Definuje kořenový kalendář pro pracovní prostor",
"workspace_template": "Tato poznámka se zobrazí ve výběru dostupných šablon při vytváření nové poznámky, ale pouze pokud je zúžena do pracovního prostoru obsahujícího tuto šablonu",
"search_home": "nové poznámky k vyhledávání budou vytvořeny jako podřízené položky této poznámky",
"workspace_search_home": "při přesunutí do některé nadřazené poznámky tohoto pracovního prostoru budou vytvořeny nové poznámky k vyhledávání jako podřízené této poznámky",
"inbox": "výchozí umístění schránky pro nové poznámky pokud vytvoříte poznámku pomocí tlačítka „Nová poznámka“ v postranním panelu, poznámky se uloží jako podřízené poznámky k poznámce označené štítkem <code>#inbox</code>.",
"workspace_inbox": "výchozí umístění doručené pošty pro nové poznámky při přesunutí do některé nadřazené poznámky tohoto pracovního prostoru",
"sql_console_home": "výchozí umístění poznámky konzole SQL",
"bookmark_folder": "poznámka s tímto štítkem se zobrazí v záložkách jako složka (umožňuje přístup k jejím podřízeným poznámkám)",
"share_hidden_from_tree": "Tato poznámka je skrytá z levého navigačního stromu, ale je stále přístupná pomocí její URL",
"share_external_link": "poznámka bude fungovat jako odkaz na externí webovou stránku ve sdíleném stromu",
"share_alias": "definujte alias, pod kterým bude poznámka dostupná na https://your_trilium_host/share/[your_alias]",
"share_omit_default_css": "výchozí CSS stránky pro sdílení bude vynechána. Použijte, pokud provedete rozsáhlé změny stylu.",
"share_root": "Označuje poznámku, která je obsluhována z kořene /share.",
"share_description": "Definujte text, který má být přidán do meta tagu HTML pro popis",
"share_raw": "poznámka bude obsluhována v surovém formátu, bez obalu HTML",
"share_disallow_robot_indexing": "zakáže indexování této poznámky roboty pomocí hlavičky <code>X-Robots-Tag: noindex</code>",
"share_credentials": "Vyžaduje pověření pro přístup k této sdílené poznámce. Hodnota se očekává ve formátu 'username:password'. Nezapomeňte ji učinit dědičnou, aby se použila na podřízené poznámky/obrázky.",
"share_index": "poznámka s tímto štítkem zobrazí všechny kořeny sdílených poznámek",
"display_relations": "seznam jmen vazeb oddělených čárkami, které se mají zobrazit. Všechny ostatní budou skryté.",
"hide_relations": "Seznam jmen vazeb oddělených čárkami, které se mají skrýt. Všechny ostatní budou zobrazeny.",
"title_template": "výchozí název poznámek vytvořených jako podřízené této poznámce. Hodnota je vyhodnocena jako řetězec v JavaScriptu \n a lze ji tedy obohatit o dynamický obsah pomocí vložených proměnných <code>now</code> a <code>parentNote</code>. Příklady:\n \n <ul>\n <li><code>${parentNote.getLabelValue(authorName)}ova literární díla</code></li>\n <li><code>Záznam pro ${now.format(YYYY-MM-DD HH:mm:ss)}</code></li>\n </ul>\n \n Viz <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html \">wiki s podrobnostmi</a>, dokumentaci API pro <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> a <a href=\"https://day.js.org/docs/en/display/format\">now</a> pro podrobnosti.",
"template": "Tato poznámka se zobrazí ve výběru dostupných šablon při vytváření nové poznámky",
"toc": "<code>#toc</code> nebo <code>#toc=show</code> vynutí zobrazení Obsahu, <code>#toc=hide</code> vynutí jeho skrytí. Pokud štítek neexistuje, je respektováno globální nastavení",
"color": "Definuje barvu poznámky ve stromu poznámek, odkazech atd. Použijte jakoukoli platnou hodnotu CSS barvy, například 'red' nebo #a13d5f",
@@ -429,20 +429,20 @@
"exclude_from_note_map": "Poznámky s tímto štítkem budou skryté v Mapě poznámek",
"new_notes_on_top": "Nové poznámky budou vytvářeny nahoře nadřazené poznámky, nikoli dole.",
"hide_highlight_widget": "Skrýt Widget Seznam zvýraznění",
"run_on_note_creation": "Spustí se při vytvoření {{name}} na backendu. Použijte tuto vazbu, pokud chcete spustit skript pro všechny {{name}} vytvořené pod určitým podstromem. V takovém případě ji vytvořte na kořenovém {{name}} podstromu a nastavte ji jako dědičnou. Nově vytvořená {{name}} v podstromu (v jakékoli hloubce) spustí skript.",
"run_on_child_note_creation": "Spustí se při vytvoření nové {{name}} pod {{name}}, kde je tato vazba definována.",
"run_on_note_title_change": "Spustí se při změně názvu {{name}} (zahrnuje i vytvoření {{name}}).",
"run_on_note_content_change": "Spustí se při změně obsahu {{name}} (zahrnuje i vytvoření {{name}}).",
"run_on_note_change": "Spustí se při změně {{name}} (zahrnuje i vytvoření {{name}}). Nezahrnuje změny obsahu.",
"run_on_note_deletion": "Spustí se při mazání {{name}}.",
"run_on_branch_creation": "Spustí se při vytvoření větve. Větev je odkaz mezi nadřazenou {{name}} a dceřinou {{name}} a je vytvořena například při klonování nebo přesouvání {{name}}.",
"run_on_note_creation": "spustí se při vytvoření poznámky na serveru. Tuto relaci použijte, pokud chcete skript spustit pro všechny poznámky vytvořené v rámci konkrétního podstromu. V takovém případě ji vytvořte na kořenové poznámce podstromu a nastavte ji jako dědičnou. Skript se spustí při vytvoření nové poznámky v rámci podstromu (v jakékoli úrovni).",
"run_on_child_note_creation": "provede se, když je pod poznámkou, ve které je tento vztah definován, vytvořena nová poznámka",
"run_on_note_title_change": "spustí se při změně názvu poznámky (včetně vytvoření poznámky)",
"run_on_note_content_change": "spustí se při změně obsahu poznámky (včetně jejího vytvoření).",
"run_on_note_change": "spustí se při změně noty (včetně jejího vytvoření). Nezahrnuje změny obsahu",
"run_on_note_deletion": "spustí se při mazání poznámky",
"run_on_branch_creation": "spustí se při vytvoření větve. Větev je propojení mezi nadřazenou a podřízenou poznámkou a vzniká například při klonování nebo přesouvání poznámky.",
"run_on_branch_change": "Spustí se při aktualizaci větve.",
"run_on_branch_deletion": "Spustí se při smazání větve. Větev je odkaz mezi nadřazenou {{name}} a dceřinou {{name}} a je smazána například při přesouvání {{name}} (stará větev/odkaz je smazán).",
"run_on_attribute_creation": "Spustí se při vytvoření nového atributu pro {{name}}, která definuje tuto vazbu.",
"relation_template": "Atributy {{name}} budou zděděny i bez vztahu rodič-dítě, obsah {{name}} a podstrom budou přidány k instančním {{name}}, pokud jsou prázdné. Podrobnosti naleznete v dokumentaci.",
"inherit": "Atributy {{name}} budou zděděny i bez vztahu rodič-dítě. Podobný koncept naleznete ve vazbě {{template}}. Viz dědičnost atributů v dokumentaci.",
"render_note": "{{name}} typu \"render HTML note\" budou vykresleny pomocí kódové {{name}} (HTML nebo skript) a je nutné pomocí této vazby určit, která {{name}} má být vykreslena.",
"widget_relation": "Cíl této vazby bude spuštěn a vykreslen jako widget na postranním panelu.",
"run_on_branch_deletion": "spustí se při smazání větve. Větev představuje propojení mezi nadřazenou a podřízenou poznámkou a je smazána např. při přesunu poznámky (původní větev/propojení je smazáno).",
"run_on_attribute_creation": "spustí se při vytvoření nového atributu pro poznámku, která definuje tuto vazbu",
"relation_template": "atributy poznámky budou zděděny i bez vztahu rodič-potomek; obsah poznámky a její podstrom budou přidány do instancí poznámek, pokud jsou prázdné. Podrobnosti najdete v dokumentaci.",
"inherit": "Atributy poznámky budou zděděny i bez vztahu rodičpotomek. Podobný koncept najdete v sekci „Vazby šablon“. Více informací najdete v dokumentaci v části „Dědičnost atributů.",
"render_note": "Poznámky typu „zobrazit HTML poznámku“ budou zobrazeny pomocí kódové poznámky (HTML nebo skript) a je nutné pomocí této vazby určit, která poznámka se má zobrazit",
"widget_relation": "cíl této vazby bude proveden a zobrazen jako widget v postranním panelu",
"share_css": "CSS poznámka, která bude vložena do sdílené stránky. CSS poznámka musí být také v sdíleném podstromu. Zvažte použití 'share_hidden_from_tree' a 'share_omit_default_css'.",
"share_js": "JavaScript poznámka, která bude vložena do sdílené stránky. JS poznámka musí být také v sdíleném podstromu. Zvažte použití 'share_hidden_from_tree'.",
"share_template": "Vložená JavaScript poznámka, která bude použita jako šablona pro zobrazení sdílené poznámky. Vrací se k výchozí šabloně. Zvažte použití 'share_hidden_from_tree'.",
@@ -452,7 +452,8 @@
"and_more": "... a {{count}} dalších.",
"print_landscape": "Při exportu do ⟨PDF⟩ změní orientaci stránky na landscape místo portrait.",
"print_page_size": "Při exportu do ⟨PDF⟩ změní velikost stránky. Podporované hodnoty: <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": "Barva"
"color_type": "Barva",
"run_on_attribute_change": " spustí se při změně atributu poznámky, která tuto vazbu definuje. Spustí se také při smazání tohoto atributu"
},
"attribute_editor": {
"help_text_body1": "Pro přidání štítku stačí zadat např. <code>#rock</code> nebo pokud chcete přidat i hodnotu, např. <code>#year = 2020</code>",
@@ -481,27 +482,27 @@
"label_name_title": "Povolené znaky jsou alfanumerické znaky, podtržítko a dvojtečka.",
"to_value": "k hodnotě",
"new_value_placeholder": "nová hodnota",
"help_text": "Na všech odpovídajících {{Note}}:",
"help_text_item1": "vytvořit daný {{label}}, pokud {{Note}} jej ještě nemá",
"help_text_item2": "nebo změnit hodnotu existujícího {{label}}",
"help_text_note": "Můžete také zavolat tuto metodu bez hodnoty, v takovém případě bude {{label}} přiřazen k {{Note}} bez hodnoty."
"help_text": "Na všech odpovídajících poznámkách:",
"help_text_item1": "vytvořit daný štítek, pokud jej poznámka ještě nemá",
"help_text_item2": "nebo změnit hodnotu existujícího štítku",
"help_text_note": "Můžete také zavolat tuto metodu bez hodnoty, v takovém případě bude štítek přiřazen k poznámce bez hodnoty."
},
"delete_label": {
"delete_label": "Smazat {{label}}",
"label_name_placeholder": "Název {{label}}",
"delete_label": "Smazat štítek",
"label_name_placeholder": "název štítku",
"label_name_title": "Povolené znaky jsou alfanumerické znaky, podtržítko a dvojtečka."
},
"rename_label": {
"rename_label": "Přejmenovat {{label}}",
"rename_label_from": "Přejmenovat {{label}} z",
"rename_label": "Přejmenovat štítek",
"rename_label_from": "Přejmenovat štítek z",
"old_name_placeholder": "starý název",
"to": "Na",
"new_name_placeholder": "nový název",
"name_title": "Povolené znaky jsou alfanumerické znaky, podtržítko a dvojtečka."
},
"update_label_value": {
"update_label_value": "Aktualizovat hodnotu {{label}}",
"label_name_placeholder": "Název {{label}}",
"update_label_value": "Aktualizovat hodnotu štítku",
"label_name_placeholder": "název štítku",
"label_name_title": "Povolené znaky jsou alfanumerické znaky, podtržítko a dvojtečka.",
"to_value": "na hodnotu",
"new_value_placeholder": "nová hodnota",
@@ -523,29 +524,29 @@
"move_note": "Přesunout poznámku",
"to": "do",
"target_parent_note": "cílové nadřazené poznámky",
"on_all_matched_notes": "Na všech odpovídajících {{Poznámka}}",
"move_note_new_parent": "přesunout {{Poznámka}} do nového nadřazeného, pokud má {{Poznámka}} pouze jednoho nadřazeného (tj. stará větev je odstraněna a nová větev je vytvořena do nového nadřazeného)",
"clone_note_new_parent": "klonovat {{Poznámka}} do nového nadřazeného, pokud má {{Poznámka}} více klonů/větví (není jasné, kterou větev by mělo odstranit)",
"nothing_will_happen": "nic se nestane, pokud nelze {{Poznámka}} přesunout do cílové {{Poznámka}} (tj. to by vytvořilo cyklus ve stromu)"
"on_all_matched_notes": "Na všech odpovídajících poznámkách",
"move_note_new_parent": "přesunout poznámku do nové nadřazené složky, pokud má poznámka pouze jednu nadřazenou složku (tj. stará větev je odstraněna a je vytvořena nová větev vedoucí do nové nadřazené složky)",
"clone_note_new_parent": "klonovat poznámku do novéhé nadřazené složky, pokud má poznámka více klonů/větví (není jasné, kterou větev by mělo odstranit)",
"nothing_will_happen": "nic se nestane, pokud nelze poznámku přesunout do cílové poznámky (tj. to by vytvořilo cyklus ve stromu)"
},
"rename_note": {
"rename_note": "Přejmenovat {{Poznámka}}",
"rename_note_title_to": "Přejmenovat název {{Poznámka}} na",
"new_note_title": "nový název {{Poznámka}}",
"rename_note": "Přejmenovat poznámku",
"rename_note_title_to": "Přejmenovat název poznámky na",
"new_note_title": "nový název poznámky",
"click_help_icon": "Klikněte na ikonu nápovědy vpravo a zobrazte všechny možnosti",
"evaluated_as_js_string": "Zadaná hodnota je vyhodnocena jako JavaScript řetězec a může být tak obohacena o dynamický obsah pomocí vložené proměnné <code>note</code> (přejmenovaná {{Poznámka}}). Příklady:",
"example_note": "<code>Poznámka</code> - všechny odpovídající {{Poznámka}} jsou přejmenovány na 'Poznámka'",
"example_new_title": "<code>NOVÝ: ${note.title}</code> - názvy odpovídajících {{Poznámka}} jsou předponovány 'NOVÝ: '",
"example_date_prefix": "<code>${note.dateCreatedObj.format('MM-DD:')}: ${note.title}</code> - odpovídající {{Poznámka}} jsou předponovány měsícem a dnem vytvoření",
"api_docs": "Pro podrobnosti si přečtěte <a>API dokumentaci</a> pro {{note}} a jeho <a>vlastnosti dateCreatedObj / utcDateCreatedObj</a>."
"evaluated_as_js_string": "Zadaná hodnota je vyhodnocena jako JavaScript řetězec a může být tak obohacena o dynamický obsah pomocí vložené proměnné <code>note</code> (poznámka bude přejmenována). Příklady:",
"example_note": "<code>Poznámka</code> - všechny odpovídající poznámky jsou přejmenovány na 'Poznámka'",
"example_new_title": "<code>NOVÝ: ${note.title}</code> - názvy odpovídajících poznámek mají předponu 'NOVÝ: '",
"example_date_prefix": "<code>${note.dateCreatedObj.format('MM-DD:')}: ${note.title}</code> - před názvem nalezených poznámek je uvedeno datum a měsíc jejich vytvoření",
"api_docs": "Podrobnosti najdete v dokumentaci k API v <a href='https://zadam.github.io/trilium/backend_api/Note.html'>poznámce</a> a u jejích vlastností <a href='https://day.js.org/docs/en/display/format'>dateCreatedObj / utcDateCreatedObj</a>."
},
"add_relation": {
"add_relation": "Přidat {{Vazba}}",
"relation_name": "Název {{Vazba}}",
"add_relation": "Přidat vazbu",
"relation_name": "název vazby",
"allowed_characters": "Povolené znaky jsou alfanumerické znaky, podtržítko a dvojtečka.",
"to": "do",
"target_note": "cílová {{name}}",
"create_relation_on_all_matched_notes": "Na všechny nalezené {{name}} vytvořte danou vazbu."
"target_note": "cílová poznámka",
"create_relation_on_all_matched_notes": "U všech shodných not vytvoř dannou vazbu."
},
"delete_relation": {
"delete_relation": "Smazat vazbu",
@@ -565,9 +566,9 @@
"relation_name": "název vazby",
"allowed_characters": "Povolené znaky jsou alfanumerické znaky, podtržítko a dvojtečka.",
"to": "do",
"target_note": "cílová {{name}}",
"on_all_matched_notes": "Na všech odpovídajících {{name}}",
"change_target_note": "změnit cílovou {{name}} existující vazby",
"target_note": "cílová poznámka",
"on_all_matched_notes": "Na všech odpovídajících poznámkách",
"change_target_note": "změnit cílovou poznámku existující vazby",
"update_relation_target": "Aktualizovat cílovou vazbu"
},
"attachments_actions": {
@@ -578,8 +579,8 @@
"download": "Stáhnout",
"rename_attachment": "Přejmenovat přílohu",
"upload_new_revision": "Nahrát novou revizi",
"copy_link_to_clipboard": "Kopírovat odkaz do {{clipboard}}",
"convert_attachment_into_note": "Převést přílohu na {{Note}}",
"copy_link_to_clipboard": "Kopírovat odkaz do schránky",
"convert_attachment_into_note": "Převést přílohu na poznámku",
"delete_attachment": "Smazat přílohu",
"upload_success": "Nová revize přílohy byla nahrána.",
"upload_failed": "Nahrání nové revize přílohy selhalo.",
@@ -599,8 +600,8 @@
"fri": "Pá",
"sat": "So",
"sun": "Ne",
"cannot_find_day_note": "Nelze najít denní {{name}}",
"cannot_find_week_note": "Nelze najít týdenní {{name}}",
"cannot_find_day_note": "Nelze najít denní poznámku",
"cannot_find_week_note": "Nelze najít týdenní poznámku",
"january": "Leden",
"february": "Únor",
"march": "Březen",
@@ -632,7 +633,7 @@
"create_new_split": "Vytvořit nové rozdělení"
},
"edit_button": {
"edit_this_note": "Upravit tuto {{Note}}"
"edit_this_note": "Upravit tuto poznámku"
},
"show_toc_widget_button": {
"show_toc": "Zobrazit Obsah"
@@ -718,7 +719,7 @@
"note_map": "Mapa poznámek"
},
"onclick_button": {
"no_click_handler": "Widget tlačítka '{{componentId}}' nemá definovaný obslužný program kliknutí."
"no_click_handler": "Widget tlačítka '{{componentId}}' nemá definovaný obslužný program kliknutí"
},
"protected_session_status": {
"active": "Chráněná relace je aktivní. Klikněte pro ukončení chráněné relace.",
@@ -775,8 +776,11 @@
"filter": "Filtr",
"filter-none": "Všechny ikony",
"filter-default": "Výchozí ikony",
"icon_tooltip": "{{name}} Balíček ikon: {{iconPack}}",
"no_results": "Žádné ikony nenalezeny."
"icon_tooltip": "{{name}}\nBalíček ikon: {{iconPack}}",
"no_results": "Žádné ikony nenalezeny.",
"search_placeholder_one": "Najít {{number}} ikonu v {{count}} balíčcích",
"search_placeholder_few": "Najít {{number}} ikony v {{count}} balíčcích",
"search_placeholder_other": "Najít {{number}} ikon v {{count}} balíčcích"
},
"basic_properties": {
"note_type": "Typ poznámky",
@@ -789,14 +793,14 @@
"view_type": "Typ zobrazení",
"grid": "Mřížka",
"list": "Seznam",
"collapse_all_notes": "Sbalit všechny {{Note}}s",
"expand_tooltip": "Rozbalí přímé {{Child}} této {{Collection}} (do hloubky jedné úrovně). Pro více možností stiskněte šipku vpravo.",
"collapse_all_notes": "Sbalit všechny poznámky",
"expand_tooltip": "Rozbalí přímé podprvky této kolekce (do hloubky jedné úrovně). Další možnosti zobrazíte kliknutím na šipku vpravo.",
"collapse": "Sbalit",
"expand": "Rozbalit",
"expand_first_level": "Rozbalit přímé {{Child}}",
"expand_first_level": "Rozbalit přímé potomky",
"expand_nth_level": "Rozbalit {{depth}} úrovně",
"expand_all_levels": "Rozbalit všechny úrovně",
"book_properties": "Vlastnosti {{Collection}}",
"book_properties": "Vlastnosti kolekce",
"invalid_view_type": "Neplatný typ zobrazení '{{type}}'",
"calendar": "Kalendář",
"table": "Tabulka",
@@ -829,7 +833,7 @@
"file_size": "Velikost souboru",
"download": "Stáhnout",
"open": "Otevřít",
"copy_reference_to_clipboard": "Kopírovat odkaz do {{clipboard}}",
"copy_reference_to_clipboard": "Kopírovat referenci do schránky",
"upload_new_revision": "Nahrát novou revizi",
"upload_success": "Nová revize obrázku byla nahrána.",
"upload_failed": "Nahrání nové revize obrázku selhalo: {{message}}",
@@ -906,7 +910,7 @@
"limit": "limit",
"limit_description": "Omezit počet výsledků",
"debug": "ladění",
"debug_description": "Ladění vypíše do konzole další ladicí informace, které pomohou při ladění složitých dotazů.",
"debug_description": "Ladění vypíše do konzole další ladicí informace, které pomohou při ladění složitých dotazů",
"action": "akce",
"option": "možnost",
"search_button": "Hledání",
@@ -974,23 +978,23 @@
"search_script": {
"title": "Skript pro hledání:",
"placeholder": "hledat Poznámku podle jejího názvu",
"description1": "Skript pro {{search}} umožňuje definovat výsledky {{search}} spuštěním skriptu. To poskytuje maximální flexibilitu, když standardní {{search}} nestačí.",
"description2": "Skript pro {{search}} musí být typu \"code\" a podtypu \"JavaScript {{backend}}\". Skript musí vrátit pole ID {{Poznámky}} nebo samotných {{Poznámky}}.",
"description1": "Vyhledávací skript umožňuje definovat výsledky vyhledávání spuštěním skriptu. To poskytuje maximální flexibilitu v případech, kdy standardní vyhledávání nestačí.",
"description2": "Vyhledávací skript musí být typu code a podtypu JavaScript backend. Skript musí vracet pole noteIds nebo notes.",
"example_title": "Podívejte se na tento příklad:",
"example_code": "// 1. předfiltrování pomocí standardního {{search}} const candidateNotes = api.searchForNotes(\"#journal\"); // 2. použití vlastních kritérií {{search}} const matchedNotes = candidateNotes .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/)); return matchedNotes;",
"note": "Upozorňujeme, že skript pro {{search}} a {{search}} řetězec nelze kombinovat."
"example_code": "// 1. Předběžné filtrování pomocí standardního vyhledávání\nconst candidateNotes = api.searchForNotes(#journal); \n\n// 2. Použití vlastních vyhledávacích kritérií\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;",
"note": "Upozorňujeme, že vyhledávací skript a vyhledávací řetězec nelze vzájemně kombinovat."
},
"search_string": {
"title_column": "{{Search}} řetězec:",
"placeholder": "fulltext klíčová slova, #{{label}} = hodnota...",
"search_syntax": "Syntaxe {{search}}",
"title_column": "Vyhledávací řetězec:",
"placeholder": "fulltext klíčová slova, #tag = hodnota...",
"search_syntax": "Syntaxe vyhledávání",
"also_see": "také viz",
"complete_help": "kompletní nápověda k syntaxi {{search}}",
"full_text_search": "Stačí zadat jakýkoli text pro fulltextové {{search}}.",
"label_abc": "vrací {{Poznámky}} se {{štítek}} abc",
"label_year": "odpovídá {{Poznámky}} se {{štítek}} year s hodnotou 2019",
"label_rock_pop": "odpovídá {{Poznámky}}, které mají {{štítek}} rock i {{štítek}} pop",
"label_rock_or_pop": "stačí, aby byl přítomen jeden z {{štítek}}.",
"complete_help": "kompletní nápověda k syntaxi vyhledávání",
"full_text_search": "Stačí zadat jakýkoli text pro fulltextové vyhledávání",
"label_abc": "vrací poznámky se stítkem abc",
"label_year": "vyhledá poznámky, u nichž má štítek roku hodnotu 2019",
"label_rock_pop": "vyhledá poznámky, které mají štítek rock i pop",
"label_rock_or_pop": "stačí, aby byl přítomen jeden ze štít",
"label_year_comparison": "numerické porovnání (také >, >=, <).",
"label_date_created": "poznámky vytvořené za poslední měsíc",
"error": "Chyba vyhledávání: {{error}}",
@@ -1051,12 +1055,12 @@
"exit-picture-in-picture": "Ukončit obraz v obraze",
"fullscreen": "Celá obrazovka (F)",
"exit-fullscreen": "Ukončit celou obrazovku",
"unsupported-format": "Náhled médií není dostupný pro tento formát souboru: {{mime}}",
"unsupported-format": "Náhled médií není dostupný pro tento formát souboru:\n {{mime}}",
"zoom-to-fit": "Přiblížit do šířky",
"zoom-reset": "Obnovit přiblížení do šířky"
},
"protected_session": {
"enter_password_instruction": "Zobrazení chráněné {{name}} vyžaduje zadání hesla:",
"enter_password_instruction": "Zobrazení chráněné poznámky vyžadující zadání hesla:",
"start_session_button": "Spustit chráněnou relaci",
"started": "Chráněná relace byla spuštěna.",
"wrong_password": "Nesprávné heslo.",
@@ -1068,9 +1072,9 @@
"unprotecting-title": "Stav odchrany"
},
"relation_map": {
"remove_note": "Odstranit {{name}}",
"remove_note": "Odstranit poznámku",
"edit_title": "Upravit název",
"rename_note": "Přejmenovat {{name}}",
"rename_note": "Přejmenovat poznámku",
"enter_new_title": "Zadejte nový název poznámky:",
"remove_relation": "Odstranit vazbu",
"confirm_remove_relation": "Jste si jisti, že chcete odstranit vazbu?",
@@ -1093,7 +1097,7 @@
"disabled_button_enable": "Povolit poznámku pro vykreslení"
},
"web_view_setup": {
"title": "Vytvořte živý pohled na webovou stránku přímo v Trilium.",
"title": "Vytvořte živý pohled na webovou stránku přímo v Trilium",
"url_placeholder": "Zadejte nebo vložte webovou adresu, například https://triliumnotes.org",
"create_button": "Vytvořit Webový Pohled",
"invalid_url_title": "Neplatná adresa",
@@ -1116,13 +1120,13 @@
"full_anonymization_description": "Tato akce vytvoří novou kopii databáze a anonymizuje ji (odstraní veškerý obsah poznámek a ponechá pouze strukturu a některá nesenzitivní metadata) pro sdílení online pro účely ladění bez obav z úniku vašich osobních údajů.",
"save_fully_anonymized_database": "Uložit plně anonymizovanou databázi",
"light_anonymization": "Částečná Anonymizace",
"light_anonymization_description": "Tato akce vytvoří novou kopii databáze a provede na ní částečnou anonymizaci konkrétně bude odstraněn obsah všech {{Note}}, ale názvy a {{attributes}} zůstanou zachovány. Navíc zůstanou zachovány poznámky s vlastními skripty {{frontend}}/{{backend}} v {{JavaScript}} a vlastní {{widget}}y. To poskytuje více kontextu pro ladění problémů.",
"light_anonymization_description": "Tato akce vytvoří novou kopii databáze a provede v ní částečnou anonymizaci konkrétně budou odstraněny pouze obsahy všech poznámek, zatímco názvy a atributy zůstanou zachovány. Zachovány zůstanou také vlastní skripty poznámek v JS pro frontend i backend a vlastní widgety. To poskytuje více kontextu pro ladění problémů.",
"choose_anonymization": "Můžete se sami rozhodnout, zda chcete poskytnout plně nebo částečně anonymizovanou databázi. I plně anonymizovaná databáze je velmi užitečná, ale v některých případech může částečně anonymizovaná databáze urychlit proces identifikace a opravy chyb.",
"save_lightly_anonymized_database": "Uložit částečně anonymizovanou databázi",
"existing_anonymized_databases": "Existující anonymizované databáze",
"creating_fully_anonymized_database": "Vytváření plně anonymizované databáze...",
"creating_lightly_anonymized_database": "Vytváření částečně anonymizované databáze...",
"error_creating_anonymized_database": "Nepodařilo se vytvořit anonymizovanou databázi, zkontrolujte protokoly {{backend}} pro podrobnosti",
"error_creating_anonymized_database": "Nepodařilo se vytvořit anonymizovanou databázi, podrobnosti najdete v protokolech backendu",
"successfully_created_fully_anonymized_database": "Vytvořena plně anonymizovaná databáze v {{anonymizedFilePath}}",
"successfully_created_lightly_anonymized_database": "Vytvořena částečně anonymizovaná databáze v {{anonymizedFilePath}}",
"no_anonymized_database_yet": "Zatím žádná anonymizovaná databáze."
@@ -1197,8 +1201,8 @@
},
"ribbon": {
"widgets": "Widgety pásu karet",
"promoted_attributes_message": "Záložka Propagované atributy na pásu karet se automaticky otevře, pokud jsou na poznámce přítomny propagované atributy.",
"edited_notes_message": "Záložka Upravené poznámky na pásu karet se automaticky otevře u denních poznámek."
"promoted_attributes_message": "Záložka Propagované Atributy se automaticky otevře, pokud jsou v poznámce přítomny povýšené atributy",
"edited_notes_message": "Záložka Upravené poznámky na pásu karet se automaticky otevře u denních poznámek"
},
"theme": {
"title": "Vzhled aplikace",
@@ -1213,8 +1217,8 @@
"layout": "Rozložení",
"layout-vertical-title": "Vertikální",
"layout-horizontal-title": "Horizontální",
"layout-vertical-description": "lišta {{launcher}} je vlevo (výchozí)",
"layout-horizontal-description": "lišta {{launcher}} je pod záložkou, záložka je nyní celá šířka."
"layout-vertical-description": "panel spouštěčů je vlevo (výchozí nastavení)",
"layout-horizontal-description": "panel spouštěčů je pod záložkou, záložka je nyní celá šířka."
},
"ui-performance": {
"title": "Výkon",
@@ -1269,7 +1273,7 @@
"ocr_min_confidence": "Minimální spolehlivost",
"ocr_confidence_description": "Extrahovat pouze text nad touto hranicí spolehlivosti. Nižší hodnoty zahrnují více textu, ale mohou být méně přesné.",
"batch_ocr_title": "Zpracovat existující soubory",
"batch_ocr_description": "Extrahovat text ze všech existujících obrázků, PDF a Office dokumentů ve vašich {{Notes}}. To může trvat nějaký čas v závislosti na počtu souborů.",
"batch_ocr_description": "Extrahovat text ze všech existujících obrázků, PDF a Office dokumentů ve vašich poznámkách. To může trvat nějaký čas v závislosti na počtu souborů.",
"batch_ocr_start": "Spustit dávkové zpracování",
"batch_ocr_starting": "Spuštění dávkového zpracování...",
"batch_ocr_progress": "Zpracovávám {{processed}} z {{total}} souborů...",
@@ -1277,11 +1281,11 @@
"batch_ocr_error": "Chyba během dávkového zpracování: {{error}}"
},
"attachment_erasure_timeout": {
"attachment_erasure_timeout": "Časový limit pro vymazání {{attachments}}",
"attachment_auto_deletion_description": "{{Attachments}} jsou automaticky smazány (a vymazány), pokud nejsou po definovaném časovém limitu odkazovány jejich {{Note}}.",
"erase_attachments_after": "Vymazat nepoužité {{attachments}} po:",
"attachment_erasure_timeout": "Časový limit pro vymazání příloh",
"attachment_auto_deletion_description": "Přílohy jsou automaticky smazány (a vymazány), pokud nejsou po definovaném časovém limitu odkazovány jejich poznámkách.",
"erase_attachments_after": "Vymazat nepoužité přílohy po:",
"manual_erasing_description": "Můžete také spustit vymazání ručně (bez ohledu na výše definovaný časový limit):",
"erase_unused_attachments_now": "Vymazat nepoužité {{attachments}} nyní",
"erase_unused_attachments_now": "Vymazat nepoužité přílohy nyní",
"unused_attachments_erased": "Nepoužívané přílohy byly vymazány."
},
"network_connections": {
@@ -1290,7 +1294,7 @@
},
"note_erasure_timeout": {
"note_erasure_timeout_title": "Časový limit pro vymazání Poznámky",
"note_erasure_description": "SmazaPoznámky (a {{attributes}}, {{revisions}}...) jsou zpočátku pouze označeny jako smazané a lze je obnovit z dialogu Nedávné Poznámky. Po určité době jsou smazaPoznámky \"vymazány\", což znamená, že jejich obsah nelze obnovit. Toto nastavení umožňuje konfigurovat délku doby mezi smazáním a vymazáním Poznámky.",
"note_erasure_description": "Odstraněpoznámky (a atributy, revize...) jsou zpočátku pouze označeny jako odstraněné a lze je obnovit v dialogovém okně „Poslední poznámky. Po uplynutí určité doby jsou odstraněpoznámky vymazány, což znamená, že jejich obsah již nelze obnovit. Toto nastavení vám umožňuje určit dobu, která uplyne mezi odstraněním a vymazáním poznámky.",
"erase_notes_after": "Vymazat Poznámky po:",
"manual_erasing_description": "Můžete také spustit vymazání ručně (bez ohledu na výše uvedený časový limit):",
"erase_deleted_notes_now": "Vymazat smazané Poznámky nyní",
@@ -1311,7 +1315,7 @@
},
"search_engine": {
"title": "Vyhledávač",
"custom_search_engine_info": "Vlastní vyhledávač vyžaduje nastavení jak názvu, tak {{URL}}. Pokud některý z nich není nastaven, bude použit DuckDuckGo jako výchozí vyhledávač.",
"custom_search_engine_info": "Vlastní vyhledávač vyžaduje nastavení jak názvu, tak URL. Pokud některý z nich není nastaven, bude použit DuckDuckGo jako výchozí vyhledávač.",
"predefined_templates_label": "Předdefinované šablony vyhledávačů",
"bing": "Bing",
"baidu": "Baidu",
@@ -1319,8 +1323,8 @@
"google": "Google",
"custom_name_label": "Název vlastního vyhledávače",
"custom_name_placeholder": "Přizpůsobit název vyhledávače",
"custom_url_label": "{{URL}} vlastního vyhledávače by měl obsahovat {keyword} jako zástupný symbol pro vyhledávací výraz.",
"custom_url_placeholder": "Přizpůsobit {{URL}} vyhledávače",
"custom_url_label": "URL vlastního vyhledávače by měl obsahovat {keyword} jako zástupný symbol pro vyhledávací výraz.",
"custom_url_placeholder": "Přizpůsobit URL vyhledávače",
"save_button": "Uložit"
},
"tray": {
@@ -1414,7 +1418,7 @@
"default_token_name": "nový token",
"error_empty_name": "Název tokenu nemůže být prázdný",
"token_created_title": "ETAPI token vytvořen",
"token_created_message": "Zkopírujte vytvořený token do {{clipboard}}. Trilium token ukládá hashovaný a toto je poslední možnost, jak jej uvidíte.",
"token_created_message": "Zkopírujte vytvořený token do schránky. Trilium token ukládá hashovaný a toto je poslední možnost, jak jej uvidíte.",
"rename_token": "Přejmenovat tento token",
"delete_token": "Smazat / deaktivovat tento token",
"rename_token_title": "Přejmenovat token",
@@ -1434,11 +1438,11 @@
"new_password_confirmation": "Potvrzení nového hesla",
"change_password": "Změnit heslo",
"protected_session_timeout": "Časový limit pro Chráněná relace",
"protected_session_timeout_description": "Časový limit chráněné relace je doba, po které se chráněná relace vymaže z paměti prohlížeče. Měří se od poslední interakce s chráněnými {{poznámkami}}. Viz",
"protected_session_timeout_description": "Časový limit chráněné relace je doba, po které se chráněná relace vymaže z paměti prohlížeče. Měří se od poslední interakce s chráněnými poznámkami. Viz",
"wiki": "wiki",
"for_more_info": "pro více informací.",
"protected_session_timeout_label": "Časový limit chráněné relace:",
"reset_confirmation": "Resetováním hesla navždy ztratíte přístup ke všem svým existujícím chráněným {{poznámkám}}. Opravdu chcete heslo resetovat?",
"reset_confirmation": "Resetováním hesla navždy ztratíte přístup ke všem svým existujícím chráněným poznámkám. Opravdu chcete heslo resetovat?",
"reset_success_message": "Heslo bylo resetováno. Nastavte nové heslo",
"change_password_heading": "Změnit heslo",
"set_password_heading": "Nastavit heslo",
@@ -1451,17 +1455,17 @@
"description": "Vícefaktorová autentizace (MFA) přidává další vrstvu zabezpečení k vašemu účtu. Místo pouhého zadání hesla pro přihlášení MFA vyžaduje, abyste poskytli jeden nebo více dalších důkazů pro ověření vaší identity. Tímto způsobem, i když se někdo dostane k vašemu heslu, nemůže se k vašemu účtu dostat bez druhého kusu informace. Je to jako přidání dalšího zámku ke dveřím, což ztěžuje vniknutí kohokoli jiného.<br><br>Postupujte podle pokynů níže a povolte MFA. Pokud to nenakonfigurujete správně, přihlášení se vrátí pouze k heslu.",
"mfa_enabled": "Povolit vícefaktorovou autentizaci",
"mfa_method": "Metoda MFA",
"electron_disabled": "Multifaktorová autentizace není v {{desktop}} verzi aktuálně podporována.",
"totp_title": "Časově založený jednorázový heslo ({{TOTP}})",
"totp_description": "{{TOTP}} (Časově založený jednorázový heslo) je bezpečnostní funkce, která generuje jedinečný, dočasný kód, který se mění každých 30 sekund. Tento kód spolu s vaším heslem použijete k přihlášení do svého účtu, což ztěžuje přístup k němu pro kohokoli jiného.",
"totp_secret_title": "Generovat {{TOTP}} tajný klíč",
"totp_secret_generate": "Generovat {{TOTP}} tajný klíč",
"totp_secret_regenerate": "Regenerovat {{TOTP}} tajný klíč",
"no_totp_secret_warning": "Pro povolení {{TOTP}} je nejprve nutné vygenerovat {{TOTP}} tajný klíč.",
"totp_secret_description_warning": "Po vygenerování nového {{TOTP}} tajného klíče budete muset znovu přihlásit pomocí nového {{TOTP}} tajného klíče.",
"totp_secret_generated": "{{TOTP}} tajný klíč vygenerován",
"electron_disabled": "Multifaktorová autentizace není v desktop verzi aktuálně podporována.",
"totp_title": "Časově založené jednorázové heslo (TOTP)",
"totp_description": "TOTP (Časově založené jednorázové heslo) je bezpečnostní funkce, která generuje jedinečný, dočasný kód, který se mění každých 30 sekund. Tento kód spolu s vaším heslem použijete k přihlášení do svého účtu, což ztěžuje přístup k němu pro kohokoli jiného.",
"totp_secret_title": "Generovat TOTP tajný klíč",
"totp_secret_generate": "Generovat TOTP tajný klíč",
"totp_secret_regenerate": "Regenerovat TOTP tajný klíč",
"no_totp_secret_warning": "Pro povolení TOTP je nejprve nutné vygenerovat TOTP tajný klíč.",
"totp_secret_description_warning": "Po vygenerování nového TOTP tajného klíče budete muset znovu přihlásit pomocí nového TOTP tajného klíče.",
"totp_secret_generated": "TOTP tajný klíč vygenerován",
"totp_secret_warning": "Uložte vygenerovaný tajný klíč na bezpečném místě. Nebude znovu zobrazen.",
"totp_secret_regenerate_confirm": "Jste si jisti, že chcete regenerovat {{TOTP}} tajný klíč? Tím se zneplatní předchozí {{TOTP}} tajný klíč a všechny existující záchranné kódy.",
"totp_secret_regenerate_confirm": "Jste si jisti, že chcete regenerovat TOTP tajný klíč? Tím se zneplatní předchozí TOTP tajný klíč a všechny existující záchranné kódy.",
"recovery_keys_title": "Záchranné klíče pro jednotné přihlašování",
"recovery_keys_description": "Záchranné klíče pro jednotné přihlašování se používají k přihlášení v případě, že nemáte přístup ke svým autentifikačním kódům.",
"recovery_keys_description_warning": "Záchranné klíče nebudou po opuštění stránky znovu zobrazeny, uchovejte je na bezpečném místě. Po použití záchranného klíče jej nelze znovu použít.",
@@ -1498,9 +1502,6 @@
"description": "Tato nastavení platí pouze pro ⟨desktop⟩ verze, prohlížeče budou používat vlastní nativní kontrolu pravopisu.",
"enable": "Povolit kontrolu pravopisu",
"language_code_label": "Kód jazyka(ů)",
"language_code_placeholder": "například \"en-US\", \"de-AT\"",
"multiple_languages_info": "Více jazyků lze oddělit čárkou, např. \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Dostupné jazykové kódy:",
"restart-required": "Změny v nastavení kontroly pravopisu se projeví po restartu aplikace."
},
"sync_2": {
@@ -1696,7 +1697,10 @@
"options": "Nastavení",
"modal_title": "Konfigurovat seznam zvýraznění",
"menu_configure": "Konfigurovat seznam zvýraznění...",
"no_highlights": "Nebyla nalezena žádná zvýraznění."
"no_highlights": "Nebyla nalezena žádná zvýraznění.",
"title_with_count_one": "{{count}} zvýraznění",
"title_with_count_few": "{{count}} zvýraznění",
"title_with_count_other": "{{count}} zvýraznění"
},
"quick-search": {
"placeholder": "Rychlé hledání",
@@ -1727,7 +1731,10 @@
"shared-indicator-tooltip-with-url": "Tato poznámka je sdílena veřejně na: {{- url}}",
"subtree-hidden-moved-title": "Přidáno do {{title}}",
"subtree-hidden-moved-description-collection": "Tato kolekce skrývá své dceřiné poznámky ve stromu.",
"subtree-hidden-moved-description-other": "Dceřiné poznámky jsou pro tuto poznámku skryty ve stromu."
"subtree-hidden-moved-description-other": "Dceřiné poznámky jsou pro tuto poznámku skryty ve stromu.",
"subtree-hidden-tooltip_one": "{{count}} podřízená poznámka, která je ve stromu skrytá",
"subtree-hidden-tooltip_few": "{{count}} podřízené poznámky, které jsou ve stromu skryté",
"subtree-hidden-tooltip_other": "{{count}} podřízených poznámek, které jsou ve stromu skryté"
},
"title_bar_buttons": {
"window-on-top": "Připítnout okno na horní část obrazovky"
@@ -1740,7 +1747,10 @@
"print_report_error_title": "Tisk se nezdařil",
"print_report_stack_trace": "Stack trace",
"print_report_collection_details_button": "Zobrazit podrobnosti",
"print_report_collection_details_ignored_notes": "Ignorované poznámky"
"print_report_collection_details_ignored_notes": "Ignorované poznámky",
"print_report_collection_content_one": "{{count}} poznámka ve sbírce nebyla možná vytisknout, protože není podporována nebo je chráněna.",
"print_report_collection_content_few": "{{count}} poznámky ve sbírce nebylo možné vytisknout, protože nejsou podporovány nebo jsou chráněny.",
"print_report_collection_content_other": "{{count}} poznámek ve sbírce nebylo možné vytisknout, protože nejsou podporovány nebo jsou chráněny."
},
"note_title": {
"placeholder": "Zde napište název poznámky...",
@@ -1892,7 +1902,7 @@
"search_online": "Hledat „{{term}}“ pomocí {{searchEngine}}"
},
"image_context_menu": {
"copy_reference_to_clipboard": "Kopírovat odkaz do schránky",
"copy_reference_to_clipboard": "Kopírovat referenci do schránky",
"copy_image_to_clipboard": "Kopírovat obrázek do schránky"
},
"link_context_menu": {
@@ -2086,7 +2096,10 @@
"processing": "Zpracovávání...",
"processing_started": "Zpracování OCR bylo zahájeno. Počkejte chvíli a obnovte stránku.",
"processing_failed": "Nepodařilo se zahájit zpracování OCR",
"view_extracted_text": "Zobrazit extraktovaný text (OCR)"
"view_extracted_text": "Zobrazit extraktovaný text (OCR)",
"processing_complete": "Zpracování pomocí OCR bylo dokončeno.",
"text_filtered_low_confidence": "OCR rozpoznal text s jistotou {{confidence}} %, ale výsledek byl vyřazen, protože vaše minimální prahová hodnota je {{threshold}} %.",
"open_media_settings": "Otevřít Nastavení"
},
"command_palette": {
"tree-action-name": "Strom: {{name}}",
@@ -2118,7 +2131,7 @@
"background_effects_message": "Na zařízeních Windows a macOS jsou efekty pozadí nyní stabilní. Efekty pozadí přidávají uživatelskému rozhraní nádech barvy rozostřením pozadí za ním.",
"background_effects_button": "Povolit efekty pozadí",
"new_layout_title": "Nové rozvržení",
"new_layout_message": "Pro Trilium jsme zavedli modernizované rozvržení. Pás karet byl odstraněn a plynule integrovan do hlavního rozhraní, přičemž nové stavové řádky a rozšiřitelné sekce (jako jsou propagované atributy) převzaly klíčové funkce. Nové rozvržení je padrãoně zapnuté a lze jej dočasně vypnout přes Nastavení → Vzhled.",
"new_layout_message": "Pro Trilium jsme zavedli modernizované rozvržení. Pás karet byl odstraněn a plynule integrovan do hlavního rozhraní, přičemž nové stavové řádky a rozšiřitelné sekce (jako jsou propagované atributy) převzaly klíčové funkce. \n\nNové rozvržení je padrãoně zapnuté a lze jej dočasně vypnout přes Nastavení → Vzhled.",
"new_layout_button": "Více informací",
"dismiss": "Zavřít"
},
@@ -2153,7 +2166,7 @@
},
"server": {
"unknown_http_error_title": "Chyba komunikace se serverem",
"unknown_http_error_content": "Stavový kód: {{statusCode}} URL: {{method}} {{url}} Zpráva: {{message}}",
"unknown_http_error_content": "Stavový kód: {{statusCode}} \nURL: {{method}} {{url}} \nZpráva: {{message}}",
"traefik_blocks_requests": "Pokud používáte reverzní proxy Traefik, došlo k wprowadzeniu zásadní změny, která ovlivňuje komunikaci se serverem."
},
"tab_history_navigation_buttons": {
@@ -2170,18 +2183,18 @@
},
"breadcrumb_badges": {
"read_only_explicit": "Pouze pro čtení",
"read_only_explicit_description": "Tato poznámka byla ručně nastavena jako pouze pro čtení. Kliknutím ji můžete dočasně upravit.",
"read_only_explicit_description": "Tato poznámka byla ručně nastavena jako pouze pro čtení.\nKliknutím ji můžete dočasně upravit.",
"read_only_auto": "Automatické pouze pro čtení",
"read_only_auto_description": "Tato poznámka byla automaticky nastavena do režimu pouze pro čtení z důvodu výkonu. Toto automatické omezení lze upravit v nastavení. Kliknutím ji můžete dočasně upravit.",
"read_only_auto_description": "Tato poznámka byla automaticky nastavena do režimu pouze pro čtení z důvodu výkonu. Toto automatické omezení lze upravit v nastavení.\n\nKliknutím ji můžete dočasně upravit.",
"read_only_temporarily_disabled": "Dočasně upravitelné",
"read_only_temporarily_disabled_description": "Tato poznámka je nyní upravitelná, ale normálně je pouze pro čtení. Jakmile přejdete na jinou poznámku, vrátí se do režimu pouze pro čtení. Kliknutím znovu aktivujete režim pouze pro čtení.",
"read_only_temporarily_disabled_description": "Tato poznámka je nyní upravitelná, ale normálně je pouze pro čtení. Jakmile přejdete na jinou poznámku, vrátí se do režimu pouze pro čtení.\n\nKliknutím znovu aktivujete režim pouze pro čtení.",
"shared_publicly": "Veřejně sdílené",
"shared_locally": "Lokálně sdílené",
"shared_copy_to_clipboard": "Kopírovat odkaz do schránky",
"shared_open_in_browser": "Otevřít odkaz v prohlížeči",
"shared_unshare": "Zrušit sdílení",
"clipped_note": "Webový výřez",
"clipped_note_description": "Tato poznámka byla původně převzata z {{url}}. Kliknutím přejdete na zdrojovou webovou stránku.",
"clipped_note_description": "Tato poznámka byla původně převzata z {{url}}.\n\nKliknutím přejdete na zdrojovou webovou stránku.",
"execute_script": "Spustit skript",
"execute_script_description": "Tato poznámka obsahuje skript. Kliknutím jej spustíte.",
"execute_sql": "Spustit SQL",
@@ -2199,7 +2212,25 @@
"note_info_title": "Zobrazit informace o poznámce (např. datum, velikost poznámky)",
"attributes_title": "Vlastní atributy a zděděné atributy",
"note_paths_title": "Cesty poznámky",
"code_note_switcher": "Změnit režim jazyka"
"code_note_switcher": "Změnit režim jazyka",
"backlinks_one": "{{count}} zpětný odkaz",
"backlinks_few": "{{count}} zpětné odkazy",
"backlinks_other": "{{count}} zpětných odkazů",
"backlinks_title_one": "Zobrazit zpětný odkaz",
"backlinks_title_few": "Zobrazit zpětné odkazy",
"backlinks_title_other": "Zobrazení zpětných odkazu",
"attachments_one": "{{count}} příloha",
"attachments_few": "{{count}} přílohy",
"attachments_other": "{{count}} příloh",
"attachments_title_one": "Zobrazit přílohu v nové záložce",
"attachments_title_few": "Zobrazit přílohy v nové záložce",
"attachments_title_other": "Zobrazit přílohy v nové záložce",
"attributes_one": "{{count}} atribut",
"attributes_few": "{{count}} atributy",
"attributes_other": "{{count}} atributů",
"note_paths_one": "{{count}} cesta",
"note_paths_few": "{{count}} cesty",
"note_paths_other": "{{count}} cest"
},
"attributes_panel": {
"title": "Atributy poznámky"
@@ -2212,13 +2243,25 @@
},
"pdf": {
"pages_alt": "Strana {{pageNumber}}",
"pages_loading": "Načítání..."
"pages_loading": "Načítání...",
"attachments_one": "{{count}} příloha",
"attachments_few": "{{count}} přílohy",
"attachments_other": "{{count}} příloh",
"layers_one": "{{count}} vrstva",
"layers_few": "{{count}} vrstvy",
"layers_other": "{{count}} vrstev",
"pages_one": "{{count}} stránka",
"pages_few": "{{count}} stránky",
"pages_other": "{{count}} stran"
},
"platform_indicator": {
"available_on": "Dostupné na {{platform}}"
},
"mobile_tab_switcher": {
"more_options": "Další nastavení"
"more_options": "Další nastavení",
"title_one": "{{count}} záložka",
"title_few": "{{count}} záložky",
"title_other": "{{count}} záložek"
},
"bookmark_buttons": {
"bookmarks": "Záložky (oblíbené)"
@@ -2276,7 +2319,9 @@
"sample_user_journey": "Cesta uživatele",
"sample_xy": "XY",
"sample_venn": "Vennův diagram",
"sample_ishikawa": "Ishikawa"
"sample_ishikawa": "Ishikawa",
"sample_treeview": "Stromové zobrazení",
"sample_wardley": "Wardleyho mapa"
},
"mind-map": {
"addChild": "Přidat dceřiný",

View File

@@ -1386,9 +1386,6 @@
"description": "Diese Optionen gelten nur für Desktop-Builds. Browser verwenden ihre eigene native Rechtschreibprüfung.",
"enable": "Aktiviere die Rechtschreibprüfung",
"language_code_label": "Sprachcode(s)",
"language_code_placeholder": "zum Beispiel \"en-US\", \"de-AT\"",
"multiple_languages_info": "Mehrere Sprachen können mit einem Komma getrennt werden z.B. \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Verfügbare Sprachcodes:",
"restart-required": "Änderungen an den Rechtschreibprüfungsoptionen werden nach dem Neustart der Anwendung wirksam."
},
"sync_2": {

View File

@@ -1074,6 +1074,7 @@
"edit_title": "Edit title",
"rename_note": "Rename note",
"enter_new_title": "Enter new note title:",
"rename_relation": "Rename relation",
"remove_relation": "Remove relation",
"confirm_remove_relation": "Are you sure you want to remove the relation?",
"specify_new_relation_name": "Specify new relation name (allowed characters: alphanumeric, colon and underscore):",

View File

@@ -1432,9 +1432,6 @@
"description": "Estas opciones se aplican sólo para compilaciones de escritorio; los navegadores utilizarán su corrector ortográfico nativo.",
"enable": "Habilitar corrector ortográfico",
"language_code_label": "Código(s) de idioma",
"language_code_placeholder": "por ejemplo \"en-US\", \"de-AT\"",
"multiple_languages_info": "Múltiples idiomas se pueden separar por coma, por ejemplo \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Códigos de idioma disponibles:",
"restart-required": "Los cambios en las opciones de corrección ortográfica entrarán en vigor después del reinicio de la aplicación."
},
"sync_2": {

View File

@@ -1391,9 +1391,6 @@
"description": "Ces options s'appliquent uniquement aux versions de bureau, les navigateurs utiliseront leur propre vérification orthographique native.",
"enable": "Activer la vérification orthographique",
"language_code_label": "Code(s) de langue",
"language_code_placeholder": "par exemple \"fr-FR\", \"en-US\", \"de-AT\"",
"multiple_languages_info": "Plusieurs langues peuvent être séparées par une virgule, par ex. \"fr-FR, en-US, de-DE, cs\". ",
"available_language_codes_label": "Codes de langue disponibles :",
"restart-required": "Les modifications apportées aux options de vérification orthographique prendront effet après le redémarrage de l'application."
},
"sync_2": {

View File

@@ -1470,9 +1470,6 @@
"description": "Ní bhaineann na roghanna seo ach le leaganacha deisce, úsáidfidh brabhsálaithe a seiceáil litrithe dúchasach féin.",
"enable": "Cumasaigh seiceáil litrithe",
"language_code_label": "Cód(anna) teanga",
"language_code_placeholder": "mar shampla \"en-US\", \"de-AT\"",
"multiple_languages_info": "Is féidir camóg a úsáid chun teangacha iolracha a dheighilt óna chéile, m.sh. \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Cóid teanga atá ar fáil:",
"restart-required": "Tiocfaidh athruithe ar na roghanna seiceála litrithe i bhfeidhm tar éis atosú an fheidhmchláir."
},
"sync_2": {

View File

@@ -1461,9 +1461,6 @@
"description": "ये विकल्प सिर्फ़ डेस्कटॉप वर्जन के लिए हैं, ब्राउज़र अपना स्पेल चेक इस्तेमाल करेंगे।",
"enable": "स्पेल चेक चालू करें",
"language_code_label": "भाषा कोड (Language code)",
"language_code_placeholder": "जैसे \"en-US\", \"hi-IN\"",
"multiple_languages_info": "कई भाषाओं को कॉमा से अलग किया जा सकता है, जैसे \"en-US, hi-IN\"। ",
"available_language_codes_label": "उपलब्ध भाषा कोड:",
"restart-required": "स्पेल चेक में बदलाव ऐप रीस्टार्ट करने के बाद ही दिखेंगे।"
},
"sync_2": {

View File

@@ -538,12 +538,12 @@
"new_tab": "Nuova scheda"
},
"toc": {
"table_of_contents": "Sommario",
"table_of_contents": "Tabella dei Contenuti",
"options": "Opzioni",
"no_headings": "Nessun titolo."
},
"table_of_contents": {
"title": "Sommario",
"title": "Tabella dei Contenuti",
"description": "L'indice apparirà nelle note di testo quando la nota contiene più di un numero definito di titoli. È possibile personalizzare questo numero:",
"unit": "titoli",
"disable_info": "È anche possibile utilizzare questa opzione per disattivare efficacemente l'indice impostando un numero molto alto.",
@@ -853,7 +853,7 @@
"archived": "Le note con questa etichetta non saranno visibili per impostazione predefinita nei risultati di ricerca (anche nelle finestre di dialogo Vai a, Aggiungi collegamento ecc.).",
"run_on_instance": "Definire su quale istanza di Trilium eseguire questa operazione. L'impostazione predefinita è tutte le istanze.",
"exclude_from_export": "le note (con la loro sottostruttura) non saranno incluse in nessuna esportazione di note",
"run": "definisce su quali eventi deve essere eseguito lo script. I valori possibili sono:\n<ul>\n<li>frontendStartup - quando il frontend Trilium viene avviato (o aggiornato), ma non su dispositivi mobili.</li>\n<li>mobileStartup - quando il frontend Trilium viene avviato (o aggiornato) su dispositivi mobili.</li>\n<li>backendStartup - quando viene avviato il backend Trilium</li>\n<li>hourly - eseguire una volta all'ora. È possibile utilizzare l'etichetta aggiuntiva <code>runAtHour</code> per specificare a che ora.</li>\n<li>daily - eseguire una volta al giorno</li>\n</ul>",
"run": "definisce su quali eventi deve essere eseguito lo script. I valori possibili sono:\n<ul>\n<li>frontendStartup - quando il frontend Trilium viene avviato (o aggiornato), ma non su dispositivi mobili.</li>\n<li>mobileStartup - quando il frontend Trilium viene avviato (o aggiornato) su dispositivi mobili.</li>\n<li>backendStartup - quando viene avviato il backend Trilium.</li>\n<li>hourly - eseguire una volta all'ora. È possibile utilizzare l'etichetta aggiuntiva <code>runAtHour</code> per specificare a che ora.</li>\n<li>daily - eseguire una volta al giorno.</li>\n</ul>",
"run_at_hour": "A che ora deve essere eseguito. Deve essere utilizzato insieme a <code>#run=hourly</code>. Può essere definito più volte per più esecuzioni durante il giorno.",
"disable_inclusion": "gli script con questa etichetta non saranno inclusi nell'esecuzione dello script principale.",
"sorted": "mantiene le note figlie ordinate alfabeticamente per titolo",
@@ -1149,7 +1149,8 @@
"export_as_image": "Esporta come immagine",
"export_as_image_png": "PNG (raster)",
"export_as_image_svg": "SVG (vector)",
"note_map": "Mappa"
"note_map": "Mappa",
"view_ocr_text": "Visualizza il testo OCR"
},
"onclick_button": {
"no_click_handler": "Il widget pulsante '{{componentId}}' non ha un gestore di clic definito"
@@ -1541,12 +1542,28 @@
},
"images": {
"images_section_title": "Immagini",
"download_images_automatically": "Scarica automaticamente le immagini per l'utilizzo offline.",
"download_images_description": "L'HTML incollato può contenere riferimenti a immagini online; Trilium troverà tali riferimenti e scaricherà le immagini in modo che siano disponibili offline.",
"enable_image_compression": "Abilita la compressione delle immagini",
"max_image_dimensions": "Larghezza/altezza massima di un'immagine (l'immagine verrà ridimensionata se supera questa impostazione).",
"download_images_automatically": "Scarica automaticamente le immagini",
"download_images_description": "Scarica le immagini online a cui si fa riferimento nel codice HTML incollato, in modo che siano disponibili offline.",
"enable_image_compression": "Compressione delle immagini",
"max_image_dimensions": "Dimensioni massime dell'immagine",
"max_image_dimensions_unit": "pixel",
"jpeg_quality_description": "Qualità JPEG (10 - qualità peggiore, 100 - qualità migliore, 50 - 85 è consigliato)"
"jpeg_quality_description": "Il range consigliato è compreso tra 50 e 85. Valori più bassi riducono le dimensioni del file, mentre valori più alti preservano i dettagli.",
"enable_image_compression_description": "Comprimi e ridimensiona le immagini al momento del caricamento o dell'inserimento.",
"max_image_dimensions_description": "Le immagini che superano queste dimensioni verranno ridimensionate automaticamente.",
"jpeg_quality": "Qualità JPEG",
"ocr_section_title": "Estrazione di testo (OCR)",
"ocr_related_content_languages": "Lingue dei contenuti (utilizzate per l'estrazione del testo)",
"ocr_auto_process": "Elaborazione automatica dei nuovi file",
"ocr_auto_process_description": "Estrai automaticamente il testo dai file appena caricati o incollati.",
"ocr_min_confidence": "Livello minimo di confidenza",
"ocr_confidence_description": "Estrai solo il testo che supera questa soglia di affidabilità. Valori inferiori includono più testo, ma potrebbero risultare meno accurati.",
"batch_ocr_title": "Elabora i file esistenti",
"batch_ocr_description": "Estrai il testo da tutte le immagini, i PDF e i documenti Office presenti nei tuoi appunti. L'operazione potrebbe richiedere un po' di tempo a seconda del numero di file.",
"batch_ocr_start": "Avvia l'elaborazione in batch",
"batch_ocr_starting": "Avvio dell'elaborazione in batch...",
"batch_ocr_progress": "Elaborazione di {{processed}} su {{total}} file...",
"batch_ocr_completed": "Elaborazione in batch completata! Sono stati elaborati {{processed}} file.",
"batch_ocr_error": "Errore durante l'elaborazione in batch: {{error}}"
},
"attachment_erasure_timeout": {
"attachment_erasure_timeout": "Timeout cancellazione allegato",
@@ -1656,9 +1673,6 @@
"description": "Queste opzioni sono valide solo per le versioni desktop; i browser utilizzeranno il proprio controllo ortografico nativo.",
"enable": "Abilita il controllo ortografico",
"language_code_label": "Codice/i della lingua",
"language_code_placeholder": "ad esempio \"en-US\", \"de-AT\"",
"multiple_languages_info": "È possibile separare più lingue con una virgola, ad esempio \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Codici lingua disponibili:",
"restart-required": "Le modifiche alle opzioni di controllo ortografico avranno effetto dopo il riavvio dell'applicazione."
},
"api_log": {
@@ -1940,7 +1954,7 @@
},
"content_language": {
"title": "Lingue dei contenuti",
"description": "Seleziona una o più lingue che desideri visualizzare nella sezione \"Proprietà di base\" di una nota di testo di sola lettura o modificabile. Ciò consentirà funzionalità come il controllo ortografico o il supporto per la scrittura da destra a sinistra."
"description": "Seleziona una o più lingue che devono comparire nell'elenco di selezione delle lingue nella sezione \"Proprietà di base\" di una nota di testo in sola lettura o modificabile. Ciò consentirà di utilizzare funzioni quali il controllo ortografico, il supporto per la scrittura da destra a sinistra e l'estrazione del testo (OCR)."
},
"switch_layout_button": {
"title_vertical": "Sposta il riquadro di modifica in basso",
@@ -2247,7 +2261,9 @@
"sample_user_journey": "Percorso dell'utente",
"sample_xy": "XY",
"sample_venn": "Venn",
"sample_ishikawa": "Ishikawa"
"sample_ishikawa": "Ishikawa",
"sample_treeview": "TreeView",
"sample_wardley": "Mappa di Wardley"
},
"llm_chat": {
"placeholder": "Scrivi un messaggio...",
@@ -2278,7 +2294,8 @@
"note_context_enabled": "Clicca qui per disattivare il contesto della nota: {{title}}",
"note_context_disabled": "Clicca per includere la nota corrente nel contesto",
"no_provider_message": "Non è stato configurato alcun fornitore di IA. Aggiungine uno per iniziare a chattare.",
"add_provider": "Aggiungi un fornitore di IA"
"add_provider": "Aggiungi un fornitore di IA",
"sources_summary": "{{count}} fonti provenienti da {{sites}} siti"
},
"sidebar_chat": {
"title": "Chat AI",
@@ -2304,6 +2321,61 @@
"delete_provider_confirmation": "Sei sicuro di voler eliminare il provider \"{{name}}\"?",
"api_key": "Chiave API",
"api_key_placeholder": "Inserisci la tua chiave API",
"cancel": "Annulla"
"cancel": "Annulla",
"feature_not_enabled": "Abilita la funzione sperimentale LLM in Impostazioni → Avanzate → Funzioni sperimentali per utilizzare le integrazioni basate sull'intelligenza artificiale.",
"mcp_title": "MCP (Model Context Protocol)",
"mcp_enabled": "Server MCP",
"mcp_enabled_description": "Rendi pubblico un endpoint MCP (Model Context Protocol) in modo che gli assistenti di programmazione basati sull'intelligenza artificiale (ad esempio Claude Code, GitHub Copilot) possano leggere e modificare le tue note. L'endpoint è accessibile solo da localhost.",
"mcp_endpoint_title": "URL dell'endpoint",
"mcp_endpoint_description": "Aggiungi questo URL alla configurazione MCP del tuo assistente AI",
"tools": {
"search_notes": "Cerca nelle note",
"get_note": "Prendi nota",
"get_note_content": "Visualizza il contenuto della nota",
"update_note_content": "Aggiorna il contenuto della nota",
"append_to_note": "Aggiungi alla nota",
"create_note": "Crea nota",
"get_attributes": "Recupera gli attributi",
"get_attribute": "Ottieni attributo",
"set_attribute": "Imposta attributo",
"delete_attribute": "Elimina attributo",
"get_child_notes": "Recupera le note relative ai figli",
"get_subtree": "Ottieni sottostruttura",
"load_skill": "Carica skill",
"web_search": "Ricerca sul web",
"note_in_parent": "<Note/> in <Parent/>",
"get_attachment": "Scarica l'allegato",
"get_attachment_content": "Leggi il contenuto dell'allegato"
}
},
"ocr": {
"extracted_text": "Testo estratto (OCR)",
"extracted_text_title": "Testo estratto (OCR)",
"loading_text": "Caricamento del testo OCR in corso...",
"no_text_available": "Non è disponibile alcun testo OCR",
"no_text_explanation": "Questo documento non è stato sottoposto a elaborazione OCR per l'estrazione del testo oppure non è stato trovato alcun testo.",
"failed_to_load": "Impossibile caricare il testo OCR",
"process_now": "Elaborazione OCR",
"processing": "Elaborazione in corso...",
"processing_started": "L'elaborazione OCR è stata avviata. Attendere qualche istante e aggiorna.",
"processing_complete": "Elaborazione OCR completata.",
"processing_failed": "Impossibile avviare l'elaborazione OCR",
"text_filtered_low_confidence": "L'OCR ha rilevato il testo con un livello di affidabilità del {{confidence}}%, ma è stato scartato perché la soglia minima impostata è del {{threshold}}%.",
"open_media_settings": "Apri Impostazioni",
"view_extracted_text": "Visualizza il testo estratto (OCR)"
},
"mind-map": {
"addChild": "Aggiungi figlio",
"addParent": "Aggiungi genitore",
"addSibling": "Aggiungi un fratello o una sorella",
"removeNode": "Rimuovi nodo",
"focus": "Modalità Focus",
"cancelFocus": "Annulla modalità Focus",
"moveUp": "Sposta su",
"moveDown": "Sposta giù",
"link": "Collegamento",
"linkBidirectional": "Collegamento bidirezionale",
"clickTips": "Clicca sul nodo di destinazione",
"summary": "Sommario"
}
}

View File

@@ -1029,9 +1029,6 @@
"description": "これらのオプションはデスクトップビルドにのみ適用され、ブラウザはそれぞれのネイティブスペルチェックを使用します。",
"enable": "スペルチェックを有効",
"language_code_label": "言語コード",
"language_code_placeholder": "例えば \"en-US\", \"de-AT\"",
"multiple_languages_info": "複数の言語はカンマで区切ることができます。例: \"en-US, de-DE, cs\"。 ",
"available_language_codes_label": "使用可能な言語コード:",
"restart-required": "スペルチェックオプションの変更は、アプリケーションの再起動後に有効になります。"
},
"sync_2": {

View File

@@ -1665,9 +1665,6 @@
"description": "Te opcje dotyczą tylko wersji desktopowych, przeglądarki będą używać własnego natywnego sprawdzania pisowni.",
"enable": "Włącz sprawdzanie pisowni",
"language_code_label": "Kod(y) języka",
"language_code_placeholder": "na przykład \"pl-PL\", \"en-US\"",
"multiple_languages_info": "Wiele języków można oddzielić przecinkiem, np. \"en-US, de-DE, pl\". ",
"available_language_codes_label": "Dostępne kody języków:",
"restart-required": "Zmiany w opcjach sprawdzania pisowni wejdą w życie po ponownym uruchomieniu aplikacji."
},
"sync_2": {

View File

@@ -1435,9 +1435,6 @@
"description": "Estas opções aplicam-se apenas às versões desktop; os navegadores usarão a sua própria verificação ortográfica nativa.",
"enable": "Ativar verificação ortográfica",
"language_code_label": "Código(s) de idioma",
"language_code_placeholder": "por exemplo \"en-US\", \"de-AT\", \"pt-BR\"",
"multiple_languages_info": "Múltiplos idiomas podem ser separados por vírgula, por exemplo: \"en-US, de-DE, pt-BR, cs\". ",
"available_language_codes_label": "Códigos de idioma disponíveis:",
"restart-required": "As alterações nas opções de verificação ortográfica terão efeito após reiniciar a aplicação."
},
"sync_2": {

View File

@@ -1944,9 +1944,6 @@
"description": "Estas opções se aplicam apenas às versões desktop; os navegadores usarão sua própria verificação ortográfica nativa.",
"enable": "Habilitar verificação ortográfica",
"language_code_label": "Código(s) de idioma",
"language_code_placeholder": "por exemplo \"en-US\", \"de-AT\", \"pt-BR\"",
"multiple_languages_info": "Múltiplos idiomas podem ser separados por vírgula, por exemplo: \"en-US, de-DE, pt-BR, cs\". ",
"available_language_codes_label": "Códigos de idioma disponíveis:",
"restart-required": "As alterações nas opções de verificação ortográfica terão efeito após reiniciar o aplicativo."
},
"sync_2": {

View File

@@ -1237,12 +1237,9 @@
"title": "titlu"
},
"spellcheck": {
"available_language_codes_label": "Coduri de limbă disponibile:",
"description": "Aceste opțiuni se aplică doar pentru aplicația de desktop, navigatoarele web folosesc propriile corectoare ortografice.",
"enable": "Activează corectorul ortografic",
"language_code_label": "Codurile de limbă",
"language_code_placeholder": "de exemplu „en-US”, „de-AT”",
"multiple_languages_info": "Mai multe limbi pot fi separate prin virgulă, e.g. \"en-US, de-DE, cs\". ",
"title": "Corector ortografic",
"restart-required": "Schimbările asupra setărilor corectorului ortografic vor fi aplicate după restartarea aplicației."
},

View File

@@ -1679,10 +1679,7 @@
"title": "Проверка орфографии",
"enable": "Включить проверку орфографии",
"language_code_label": "Код(ы) языков",
"multiple_languages_info": "Несколько языков можно разделять запятой, например, \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Доступные коды языков:",
"restart-required": "Изменения параметров проверки орфографии вступят в силу после перезапуска приложения.",
"language_code_placeholder": "например \"en-US\", \"de-AT\"",
"description": "Эти параметры применимы только для десктопных сборок, браузеры будут использовать собственную встроенную проверку орфографии."
},
"attribute_editor": {

View File

@@ -23,10 +23,33 @@
"close": "Kapat",
"delete_notes_preview": "Not önizlemesini sil",
"delete_all_clones_description": "Tüm klonları da sil (son değişikliklerden geri alınabilir)",
"erase_notes_description": "Normal (yazılımsal) silme işlemi, notları yalnızca silinmiş olarak işaretler ve belirli bir süre içinde (son değişiklikler iletişim kutusunda) geri alınabilir. Bu seçeneği işaretlemek, notları hemen siler ve notların geri alınması mümkün olmaz."
"erase_notes_description": "Normal (yazılımsal) silme işlemi, notları yalnızca silinmiş olarak işaretler ve belirli bir süre içinde (son değişiklikler iletişim kutusunda) geri alınabilir. Bu seçeneği işaretlemek, notları hemen siler ve notların geri alınması mümkün olmaz.",
"erase_notes_warning": "Notları, tüm kopyaları da dahil olmak üzere kalıcı olarak silin (geri alınamaz). Bu işlem, uygulamanın yeniden yüklenmesine neden olacaktır.",
"notes_to_be_deleted": "Aşağıdaki notlar silinecektir. ({{notesCount}})",
"no_note_to_delete": "Hiçbir not silinmeyecek (sadece kopyaları silinecek).",
"broken_relations_to_be_deleted": "Aşağıdaki ilişkiler koparılacak ve silinecektir ({{ relationCount}})",
"cancel": "İptal",
"ok": "Tamam",
"deleted_relation_text": "{{- note}} (silinecek) notu, {{- source}} kaynağından kaynaklanan {{- relation}} ilişkisi tarafından referans alınmaktadır."
},
"export": {
"close": "Kapat"
"close": "Kapat",
"export_note_title": "Notu dışa aktar",
"export_type_subtree": "Bu not ve tüm torunları",
"format_html": "HTML - tüm biçimlendirmeyi koruduğu için önerilir",
"format_html_zip": "ZIP arşivindeki HTML dosyaları - tüm biçimlendirmeyi koruduğu için bu yöntem önerilir.",
"format_markdown": "Markdown - bu, biçimlendirmenin büyük kısmını korur.",
"format_opml": "OPML - yalnızca metin için anahat değişim biçimi. Biçimlendirme, resimler ve dosyalar dahil edilmez.",
"opml_version_1": "OPML v1.0 - yalnızca düz metin",
"opml_version_2": "OPML v2.0 - HTML de destekler",
"export_type_single": "Yalnızca bu not, alt öğeleri olmadan",
"export": "Dışa aktar",
"choose_export_type": "Lütfen önce dışa aktarma türünü seçin",
"export_status": "Dışa aktarma durumu",
"export_in_progress": "Dışa aktarma devam ediyor: {{progressCount}}",
"export_finished_successfully": "Dışa aktarma başarıyla tamamlandı.",
"format_pdf": "PDF - yazdırma veya paylaşım amaçları için.",
"share-format": "Web yayını için HTML - paylaşılan notlarda kullanılan temayı kullanır, ancak statik bir web sitesi olarak yayınlanabilir."
},
"import": {
"chooseImportFile": "İçe aktarım dosyası",
@@ -58,7 +81,9 @@
"widget-render-error": {
"title": "Özel React widget'ı çizilirken sorun yaşandı"
},
"scripting-error": "Kullanıcı tanımlı betik hatası: {{title}}"
"scripting-error": "Kullanıcı tanımlı betik hatası: {{title}}",
"widget-missing-parent": "Özel widget'ın zorunlu '{{property}}' özelliği tanımlanmamıştır.\n\nBu komut dosyasının bir kullanıcı arayüzü öğesi olmadan çalıştırılması gerekiyorsa, bunun yerine '#run=frontendStartup' kullanın.",
"open-script-note": "Komut dosyası notunu aç"
},
"add_link": {
"add_link": "Bağlantı ekle",
@@ -103,5 +128,15 @@
"are_you_sure_remove_note": "\"{{title}}\" notunu ilişki haritasından kaldırmak istediğinize emin misiniz?. ",
"also_delete_note": "Notu da sil",
"if_you_dont_check": "Bunu işaretlemezseniz, not yalnızca ilişki haritasından kaldırılacaktır."
},
"help": {
"title": "Özet tablo",
"editShortcuts": "Klavye kısayollarını düzenle",
"noteNavigation": "Not içinde gezinme",
"goUpDown": "Notlar listesinde yukarı/aşağı gitmek",
"collapseExpand": "düğümü daralt/genişlet",
"notSet": "ayarlanmamış",
"goBackForwards": "tarihte geri/ileri git",
"showJumpToNoteDialog": "<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Şuraya Git\" iletişim kutusunu göster</a>"
}
}

View File

@@ -1398,9 +1398,6 @@
"description": "這些選項僅適用於桌面版,瀏覽器將使用其原生的拼寫檢查功能。",
"enable": "啟用拼寫檢查",
"language_code_label": "語言代碼",
"language_code_placeholder": "例如 \"en-US\", \"de-AT\"",
"multiple_languages_info": "多種語言可以用逗號分隔,例如 \"en-US, de-DE, cs\"。 ",
"available_language_codes_label": "可用的語言代碼:",
"restart-required": "拼寫檢查選項的更改將在應用重啟後生效。"
},
"sync_2": {

View File

@@ -1744,9 +1744,6 @@
"description": "Ці параметри застосовуються лише для збірок для ПК, браузери використовуватимуть власну вбудовану перевірку орфографії.",
"enable": "Увімкнути перевірку орфографії",
"language_code_label": "Код(и) мови",
"language_code_placeholder": "наприклад, \"en-US\", \"de-AT\"",
"multiple_languages_info": "Кілька мов можна розділяти комами, наприклад, \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Доступні коди мови:",
"restart-required": "Зміни в параметрах перевірки орфографії набудуть чинності після перезапуску програми."
},
"sync_2": {

View File

@@ -1,20 +1,9 @@
:root {
/* Default values to be overridden by themes */
--calendar-coll-event-background-lightness: 95%;
--calendar-coll-event-background-saturation: 80%;
--calendar-coll-event-background-color: var(--accented-background-color);
--calendar-coll-event-text-color: var(--main-text-color);
--calendar-coll-event-hover-filter: none;
--callendar-coll-event-archived-sripe-color: #00000013;
--calendar-coll-today-background-color: var(--more-accented-background-color);
}
.calendar-view {
--fc-event-border-color: var(--calendar-coll-event-text-color);
--fc-event-bg-color: var(--calendar-coll-event-background-color);
--fc-event-text-color: var(--calendar-coll-event-text-color);
--fc-event-border-color: var(--calendar-coll-event-text-color, var(--main-text-color));
--fc-event-bg-color: var(--calendar-coll-event-background-color, var(--accented-background-color));
--fc-event-text-color: var(--calendar-coll-event-text-color, var(--main-text-color));
--fc-event-selected-overlay-color: transparent;
--fc-today-bg-color: var(--calendar-coll-today-background-color);
--fc-today-bg-color: var(--calendar-coll-today-background-color, var(--more-accented-background-color));
overflow: hidden;
position: relative;
@@ -123,7 +112,7 @@
z-index: -1;
--c1: transparent;
--c2: var(--callendar-coll-event-archived-sripe-color);
--c2: var(--callendar-coll-event-archived-sripe-color, #00000013);
background: repeating-linear-gradient(45deg, var(--c1), var(--c1) 8px,
var(--c2) 8px, var(--c2) 16px);
@@ -153,8 +142,8 @@
--fc-event-text-color: var(--custom-color);
--fc-event-bg-color: hsl(var(--custom-color-hue),
var(--calendar-coll-event-background-saturation),
var(--calendar-coll-event-background-lightness)) !important;
var(--calendar-coll-event-background-saturation, 80%),
var(--calendar-coll-event-background-lightness, 95%)) !important;
}
.calendar-view a.fc-timegrid-event:focus-visible,
@@ -171,7 +160,7 @@
.calendar-view a.fc-timegrid-event:hover,
.calendar-view a.fc-daygrid-event:hover {
filter: var(--calendar-coll-event-hover-filter);
filter: var(--calendar-coll-event-hover-filter, none);
border-color: var(--fc-event-text-color);
text-decoration: none;
color: currentColor;

View File

@@ -1,13 +1,14 @@
import BasicWidget from "./basic_widget.js";
import server from "../services/server.js";
import linkService from "../services/link.js";
import froca from "../services/froca.js";
import utils, { handleRightToLeftPlacement } from "../services/utils.js";
import appContext from "../components/app_context.js";
import shortcutService, { isIMEComposing } from "../services/shortcuts.js";
import { t } from "../services/i18n.js";
import { Dropdown, Tooltip } from "bootstrap";
import appContext from "../components/app_context.js";
import froca from "../services/froca.js";
import { t } from "../services/i18n.js";
import linkService from "../services/link.js";
import server from "../services/server.js";
import shortcutService, { isIMEComposing } from "../services/shortcuts.js";
import utils, { handleRightToLeftPlacement } from "../services/utils.js";
import BasicWidget from "./basic_widget.js";
const TPL = /*html*/`
<div class="quick-search input-group input-group-sm">
<style>
@@ -245,7 +246,7 @@ export default class QuickSearchWidget extends BasicWidget {
const { searchResultNoteIds, searchResults, error } = await server.get<QuickSearchResponse>(`quick-search/${encodeURIComponent(searchString)}`);
if (error) {
let tooltip = new Tooltip(this.$searchString[0], {
const tooltip = new Tooltip(this.$searchString[0], {
trigger: "manual",
title: `Search error: ${error}`,
placement: handleRightToLeftPlacement("right")
@@ -289,10 +290,9 @@ export default class QuickSearchWidget extends BasicWidget {
const resultsToDisplay = this.allSearchResults.slice(startIndex, endIndex);
for (const result of resultsToDisplay) {
const noteId = result.notePath.split("/").pop();
if (!noteId) continue;
if (!result.notePath) continue;
const $item = $('<a class="dropdown-item" tabindex="0" href="javascript:">');
const $item = $(`<a class="dropdown-item" tabindex="0" href="#${result.notePath}">`);
// Build the display HTML with content snippet below the title
let itemHtml = `<div class="quick-search-item">
@@ -317,23 +317,13 @@ export default class QuickSearchWidget extends BasicWidget {
$item.html(itemHtml);
$item.on("click", (e) => {
$item.on("click auxclick", () => {
this.dropdown.hide();
e.preventDefault();
const activeContext = appContext.tabManager.getActiveContext();
if (activeContext) {
activeContext.setNote(noteId);
}
});
shortcutService.bindElShortcut($item, "return", () => {
this.dropdown.hide();
const activeContext = appContext.tabManager.getActiveContext();
if (activeContext) {
activeContext.setNote(noteId);
}
$item[0].click();
});
this.$dropdownMenu.append($item);
@@ -350,24 +340,18 @@ export default class QuickSearchWidget extends BasicWidget {
const $link = await linkService.createLink(note.noteId, { showNotePath: true, showNoteIcon: true });
$link.addClass("dropdown-item");
$link.attr("tabIndex", "0");
$link.on("click", (e) => {
$link.on("click auxclick", (e) => {
this.dropdown.hide();
if (!e.target || e.target.nodeName !== "A") {
// click on the link is handled by link handling, but we want the whole item clickable
const activeContext = appContext.tabManager.getActiveContext();
if (activeContext) {
activeContext.setNote(note.noteId);
}
if (!e.target || (e.target as HTMLElement).nodeName !== "A") {
// click on the <a> is handled by the global goToLink handler,
// but we want the whole item clickable
$link.find("a")[0]?.dispatchEvent(new MouseEvent(e.type, e.originalEvent as MouseEventInit));
}
});
shortcutService.bindElShortcut($link, "return", () => {
this.dropdown.hide();
const activeContext = appContext.tabManager.getActiveContext();
if (activeContext) {
activeContext.setNote(note.noteId);
}
$link.find("a")[0]?.click();
});
this.$dropdownMenu.append($link);

View File

@@ -903,7 +903,7 @@ export default class TabRowWidget extends BasicWidget {
loadResults.isNoteReloaded(noteContext.noteId) ||
loadResults
.getAttributeRows()
.find((attr) => ["workspace", "workspaceIconClass", "workspaceTabBackgroundColor"].includes(attr.name || "") && attributeService.isAffecting(attr, noteContext.note))
.find((attr) => ["workspace", "iconClass", "workspaceIconClass", "workspaceTabBackgroundColor"].includes(attr.name || "") && attributeService.isAffecting(attr, noteContext.note))
) {
const $tab = this.getTabById(noteContext.ntxId);

View File

@@ -8,13 +8,11 @@ import { HTMLProps } from "preact/compat";
import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks";
import FNote from "../../../entities/fnote";
import attribute_autocomplete from "../../../services/attribute_autocomplete";
import dialog from "../../../services/dialog";
import { isExperimentalFeatureEnabled } from "../../../services/experimental_features";
import { t } from "../../../services/i18n";
import server from "../../../services/server";
import toast from "../../../services/toast";
import utils from "../../../services/utils";
import ActionButton from "../../react/ActionButton";
import { useEditorSpacedUpdate, useTriliumEvent, useTriliumEvents } from "../../react/hooks";
import { TypeWidgetProps } from "../type_widget";
@@ -23,7 +21,7 @@ import { buildRelationContextMenuHandler } from "./context_menu";
import { JsPlumb } from "./jsplumb";
import { NoteBox } from "./NoteBox";
import setupOverlays, { uniDirectionalOverlays } from "./overlays";
import { getMousePosition, getZoom, idToNoteId, noteIdToId } from "./utils";
import { getMousePosition, getZoom, idToNoteId, noteIdToId, promptForRelationName } from "./utils";
const isNewLayout = isExperimentalFeatureEnabled("new-layout");
@@ -415,27 +413,7 @@ function useRelationCreation({ mapApiRef, jsPlumbApiRef }: { mapApiRef: RefObjec
// if there's no event, then this has been triggered programmatically
if (!originalEvent || !mapApiRef.current) return;
const name = await dialog.prompt({
message: t("relation_map.specify_new_relation_name"),
shown: ({ $answer }) => {
if (!$answer) {
return;
}
$answer.on("keyup", () => {
// invalid characters are simply ignored (from user perspective they are not even entered)
const attrName = utils.filterAttributeName($answer.val() as string);
$answer.val(attrName);
});
attribute_autocomplete.initAttributeNameAutocomplete({
$el: $answer,
attributeType: "relation",
open: true
});
}
});
const name = await promptForRelationName();
// Delete the newly created connection if the dialog was dismissed.
if (!name || !name.trim()) {

View File

@@ -75,6 +75,29 @@ export default class RelationMapApi {
this.onDataChange(true);
}
async renameRelation(connection: Connection, newName: string) {
newName = utils.filterAttributeName(newName);
const relation = this.relations.find((rel) => rel.attributeId === connection.id);
if (!relation) return false;
// Check if a relation with the new name already exists between these notes.
const exists = this.relations.some(
(rel) => rel.sourceNoteId === relation.sourceNoteId && rel.targetNoteId === relation.targetNoteId && rel.name === newName
);
if (exists) return false;
await server.put(`notes/${relation.sourceNoteId}/relations/${newName}/to/${relation.targetNoteId}`);
await server.remove(`notes/${relation.sourceNoteId}/relations/${relation.name}/to/${relation.targetNoteId}`);
this.onDataChange(true);
return true;
}
getRelationName(connection: Connection): string | undefined {
const relation = this.relations.find((rel) => rel.attributeId === connection.id);
return relation?.name;
}
cleanupOtherNotes(noteIds: string[]) {
const filteredNotes = this.data.notes.filter((note) => noteIds.includes(note.noteId));
if (filteredNotes.length === this.data.notes.length) return;

View File

@@ -9,6 +9,7 @@ import dialog from "../../../services/dialog";
import { t } from "../../../services/i18n";
import server from "../../../services/server";
import RelationMapApi from "./api";
import { promptForRelationName } from "./utils";
export function buildNoteContextMenuHandler(note: FNote | null | undefined, mapApiRef: RefObject<RelationMapApi>) {
return (e: MouseEvent) => {
@@ -73,9 +74,25 @@ export function buildRelationContextMenuHandler(connection: Connection, mapApiRe
contextMenu.show({
x: event.pageX,
y: event.pageY,
items: [{ title: t("relation_map.remove_relation"), command: "remove", uiIcon: "bx bx-trash" }],
items: [
{ title: t("relation_map.rename_relation"), command: "rename", uiIcon: "bx bx-pencil" },
{ kind: "separator" },
{ title: t("relation_map.remove_relation"), command: "remove", uiIcon: "bx bx-trash" }
],
selectMenuItemHandler: async ({ command }) => {
if (command === "remove") {
if (command === "rename") {
const currentName = mapApiRef.current?.getRelationName(connection) ?? "";
const newName = await promptForRelationName(currentName);
if (!newName?.trim() || newName === currentName) {
return;
}
const result = await mapApiRef.current?.renameRelation(connection, newName);
if (!result) {
await dialog.info(t("relation_map.connection_exists", { name: newName }));
}
} else if (command === "remove") {
if (!(await dialog.confirm(t("relation_map.confirm_remove_relation")))) {
return;
}

View File

@@ -1,4 +1,7 @@
import attribute_autocomplete from "../../../services/attribute_autocomplete";
import dialog from "../../../services/dialog";
import { t } from "../../../services/i18n";
import utils from "../../../services/utils";
export function noteIdToId(noteId: string) {
return `rel-map-note-${noteId}`;
@@ -32,3 +35,26 @@ export function getMousePosition(evt: MouseEvent, container: HTMLDivElement, zoo
y: ((evt.clientY ?? 0) - rect.top) / zoom
};
}
export function promptForRelationName(defaultValue?: string): Promise<string | null> {
return dialog.prompt({
message: t("relation_map.specify_new_relation_name"),
defaultValue,
shown: ({ $answer }) => {
if (!$answer) {
return;
}
$answer.on("keyup", () => {
const attrName = utils.filterAttributeName($answer.val() as string);
$answer.val(attrName);
});
attribute_autocomplete.initAttributeNameAutocomplete({
$el: $answer,
attributeType: "relation",
open: true
});
}
});
}

View File

@@ -10,6 +10,7 @@ import helmet from "helmet";
import { t } from "i18next";
import path from "path";
import favicon from "serve-favicon";
import type serveStatic from "serve-static";
import assets from "./routes/assets.js";
import custom from "./routes/custom.js";
@@ -24,6 +25,9 @@ import { RESOURCE_DIR } from "./services/resource_dir.js";
import sql_init from "./services/sql_init.js";
import utils, { getResourceDir, isDev } from "./services/utils.js";
// Allow serving assets even if the installation path contains a hidden (dot-prefixed) directory.
const STATIC_OPTIONS: serveStatic.ServeStaticOptions = { dotfiles: "allow" };
export default async function buildApp() {
const app = express();
@@ -95,10 +99,10 @@ export default async function buildApp() {
// localhost-only guard and does not require Trilium authentication.
mcpRoutes.register(app);
app.use(express.static(path.join(publicDir, "root")));
app.use(`/manifest.webmanifest`, express.static(path.join(publicAssetsDir, "manifest.webmanifest")));
app.use(`/robots.txt`, express.static(path.join(publicAssetsDir, "robots.txt")));
app.use(`/icon.png`, express.static(path.join(publicAssetsDir, "icon.png")));
app.use(express.static(path.join(publicDir, "root"), STATIC_OPTIONS));
app.use(`/manifest.webmanifest`, express.static(path.join(publicAssetsDir, "manifest.webmanifest"), STATIC_OPTIONS));
app.use(`/robots.txt`, express.static(path.join(publicAssetsDir, "robots.txt"), STATIC_OPTIONS));
app.use(`/icon.png`, express.static(path.join(publicAssetsDir, "icon.png"), STATIC_OPTIONS));
const { default: sessionParser, startSessionCleanup } = await import("./routes/session_parser.js");
app.use(sessionParser);

View File

@@ -406,7 +406,10 @@
"last-updated": "Last updated on {{- date}}",
"subpages": "Subpages:",
"on-this-page": "On This Page",
"expand": "Expand"
"expand": "Expand",
"toggle-navigation": "Toggle Navigation",
"toggle-toc": "Toggle Table of Contents",
"logo-alt": "Logo"
},
"hidden_subtree_templates": {
"text-snippet": "Text Snippet",

View File

@@ -316,6 +316,18 @@ class BNote extends AbstractBeccaEntity<BNote> {
return null;
}
/**
* Executes this note as a script. The note must be of type "Code: JS backend".
*
* @returns the return value of the executed script
*/
executeScript() {
// Lazy require to avoid circular dependency (script.ts imports BNote as a type).
// eslint-disable-next-line @typescript-eslint/no-require-imports
const scriptService = require("../../services/script.js").default;
return scriptService.executeNote(this, { originEntity: this });
}
/**
* Beware that the method must not create a copy of the array, but actually returns its internal array
* (for performance reasons)

View File

@@ -9,6 +9,9 @@ import auth from "../services/auth.js";
import { getResourceDir, isDev } from "../services/utils.js";
import { doubleCsrfProtection as csrfMiddleware } from "./csrf_protection.js";
// Allow serving assets even if the installation path contains a hidden (dot-prefixed) directory.
const STATIC_OPTIONS: serveStatic.ServeStaticOptions = { dotfiles: "allow" };
const persistentCacheStatic = (root: string, options?: serveStatic.ServeStaticOptions<express.Response<unknown, Record<string, unknown>>>) => {
if (!isDev) {
options = {
@@ -16,7 +19,7 @@ const persistentCacheStatic = (root: string, options?: serveStatic.ServeStaticOp
...options
};
}
return express.static(root, options);
return express.static(root, { ...STATIC_OPTIONS, ...options });
};
async function register(app: express.Application) {
@@ -66,7 +69,7 @@ async function register(app: express.Application) {
// broken when closing the browser and coming back in to the page.
// The page is restored from cache, but the API call fail.
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
res.sendFile(path.join(publicDir, "index.html"));
res.sendFile(path.join(publicDir, "index.html"), STATIC_OPTIONS);
});
app.use("/assets", persistentCacheStatic(path.join(publicDir, "assets")));
app.use(`/src`, persistentCacheStatic(path.join(publicDir, "src")));
@@ -76,14 +79,14 @@ async function register(app: express.Application) {
app.use(`/${assetUrlFragment}/translations/`, persistentCacheStatic(path.join(publicDir, "translations")));
app.use(`/node_modules/`, persistentCacheStatic(path.join(publicDir, "node_modules")));
}
app.use(`/share/assets/fonts/`, express.static(path.join(getClientDir(), "fonts")));
app.use(`/share/assets/`, express.static(getShareThemeAssetDir()));
app.use(`/share/assets/fonts/`, express.static(path.join(getClientDir(), "fonts"), STATIC_OPTIONS));
app.use(`/share/assets/`, express.static(getShareThemeAssetDir(), STATIC_OPTIONS));
app.use(`/pdfjs/`, persistentCacheStatic(getPdfjsAssetDir()));
app.use(`/${assetUrlFragment}/images`, persistentCacheStatic(path.join(resourceDir, "assets", "images")));
app.use(`/${assetUrlFragment}/doc_notes`, persistentCacheStatic(path.join(resourceDir, "assets", "doc_notes")));
app.use(`/assets/vX/fonts`, express.static(path.join(srcRoot, "public/fonts")));
app.use(`/assets/vX/images`, express.static(path.join(srcRoot, "..", "images")));
app.use(`/assets/vX/stylesheets`, express.static(path.join(srcRoot, "public/stylesheets")));
app.use(`/assets/vX/fonts`, express.static(path.join(srcRoot, "public/fonts"), STATIC_OPTIONS));
app.use(`/assets/vX/images`, express.static(path.join(srcRoot, "..", "images"), STATIC_OPTIONS));
app.use(`/assets/vX/stylesheets`, express.static(path.join(srcRoot, "public/stylesheets"), STATIC_OPTIONS));
}
export function getShareThemeAssetDir() {

View File

@@ -1,41 +1,42 @@
import log from "./log.js";
import noteService from "./notes.js";
import sql from "./sql.js";
import { randomString, escapeHtml, unescapeHtml } from "./utils.js";
import attributeService from "./attributes.js";
import dateNoteService from "./date_notes.js";
import treeService from "./tree.js";
import config from "./config.js";
import axios from "axios";
import type { AttributeRow } from "@triliumnext/commons";
import { dayjs } from "@triliumnext/commons";
import xml2js from "xml2js";
import { formatLogMessage } from "@triliumnext/commons";
import axios from "axios";
import * as cheerio from "cheerio";
import cloningService from "./cloning.js";
import appInfo from "./app_info.js";
import searchService from "./search/services/search.js";
import SearchContext from "./search/search_context.js";
import xml2js from "xml2js";
import becca from "../becca/becca.js";
import ws from "./ws.js";
import type Becca from "../becca/becca-interface.js";
import type AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js";
import type BAttachment from "../becca/entities/battachment.js";
import type BAttribute from "../becca/entities/battribute.js";
import type BBranch from "../becca/entities/bbranch.js";
import type BEtapiToken from "../becca/entities/betapi_token.js";
import type BNote from "../becca/entities/bnote.js";
import type BOption from "../becca/entities/boption.js";
import type BRevision from "../becca/entities/brevision.js";
import appInfo from "./app_info.js";
import attributeService from "./attributes.js";
import type { ApiParams } from "./backend_script_api_interface.js";
import backupService from "./backup.js";
import branchService from "./branches.js";
import cloningService from "./cloning.js";
import config from "./config.js";
import dateNoteService from "./date_notes.js";
import exportService from "./export/zip.js";
import log from "./log.js";
import type { NoteParams } from "./note-interface.js";
import noteService from "./notes.js";
import optionsService from "./options.js";
import SearchContext from "./search/search_context.js";
import searchService from "./search/services/search.js";
import SpacedUpdate from "./spaced_update.js";
import specialNotesService from "./special_notes.js";
import branchService from "./branches.js";
import exportService from "./export/zip.js";
import sql from "./sql.js";
import syncMutex from "./sync_mutex.js";
import backupService from "./backup.js";
import optionsService from "./options.js";
import { formatLogMessage } from "@triliumnext/commons";
import type BNote from "../becca/entities/bnote.js";
import type AbstractBeccaEntity from "../becca/entities/abstract_becca_entity.js";
import type BBranch from "../becca/entities/bbranch.js";
import type BAttribute from "../becca/entities/battribute.js";
import type BAttachment from "../becca/entities/battachment.js";
import type BRevision from "../becca/entities/brevision.js";
import type BEtapiToken from "../becca/entities/betapi_token.js";
import type BOption from "../becca/entities/boption.js";
import type { AttributeRow } from "@triliumnext/commons";
import type Becca from "../becca/becca-interface.js";
import type { NoteParams } from "./note-interface.js";
import type { ApiParams } from "./backend_script_api_interface.js";
import treeService from "./tree.js";
import { escapeHtml, randomString, unescapeHtml } from "./utils.js";
import ws from "./ws.js";
/**
* A whole number
@@ -506,7 +507,7 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) {
throw new Error(`Unable to find parent note with ID ${parentNote}.`);
}
let extraOptions: NoteParams = {
const extraOptions: NoteParams = {
..._extraOptions,
content: "",
type: "text",
@@ -620,13 +621,13 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) {
}
const parentNoteId = opts.isVisible ? "_lbVisibleLaunchers" : "_lbAvailableLaunchers";
const noteId = "al_" + opts.id;
const noteId = `al_${opts.id}`;
const launcherNote =
becca.getNote(noteId) ||
specialNotesService.createLauncher({
noteId: noteId,
parentNoteId: parentNoteId,
noteId,
parentNoteId,
launcherType: opts.type
}).note;
@@ -680,7 +681,7 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) {
ws.sendMessageToAllClients({
type: "execute-script",
script: script,
script,
params: prepareParams(params),
startNoteId: this.startNote?.noteId,
currentNoteId: this.currentNote.noteId,
@@ -696,9 +697,8 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) {
return params.map((p) => {
if (typeof p === "function") {
return `!@#Function: ${p.toString()}`;
} else {
return p;
}
}
return p;
});
}
};

View File

@@ -71,6 +71,11 @@ describe("processNoteContent", () => {
expect(content).toContain(`<img src="api/images/${bananaNote!.noteId}/banana.jpeg`);
});
it("can import ZIP with UTF-8 filenames without language encoding flag", async () => {
const { importedNote } = await testImport("utf8-filename.zip");
expect(importedNote.title).toBe("测试");
});
it("can import old geomap notes", async () => {
const { importedNote } = await testImport("geomap.zip");
expect(importedNote.type).toBe("book");

View File

@@ -659,13 +659,20 @@ export function readContent(zipfile: yauzl.ZipFile, entry: yauzl.Entry): Promise
export function readZipFile(buffer: Buffer, processEntryCallback: (zipfile: yauzl.ZipFile, entry: yauzl.Entry) => Promise<void>) {
return new Promise<void>((res, rej) => {
yauzl.fromBuffer(buffer, { lazyEntries: true, validateEntrySizes: false }, (err, zipfile) => {
yauzl.fromBuffer(buffer, { lazyEntries: true, validateEntrySizes: false, decodeStrings: false }, (err, zipfile) => {
if (err) rej(err);
if (!zipfile) throw new Error("Unable to read zip file.");
zipfile.readEntry();
zipfile.on("entry", async (entry) => {
try {
// yauzl with decodeStrings: false returns fileName as a Buffer.
// We decode as UTF-8 to handle ZIP files that use UTF-8 filenames
// without setting the general purpose bit flag 11 (language encoding flag).
if (Buffer.isBuffer(entry.fileName)) {
entry.fileName = (entry.fileName as Buffer).toString("utf-8");
}
await processEntryCallback(zipfile, entry);
} catch (e) {
rej(e);

View File

@@ -149,8 +149,8 @@ export function renderNoteContent(note: SNote) {
isStatic: false,
faviconUrl: note.hasRelation("shareFavicon") ? `api/notes/${note.getRelationValue("shareFavicon")}/download` : `../favicon.ico`,
iconPackCss: iconPacks.map(p => generateCss(p, p.builtin
? `/share/assets/fonts/${p.fontAttachmentId}.${MIME_TO_EXTENSION_MAPPINGS[p.fontMime]}`
: `/share/api/attachments/${p.fontAttachmentId}/download`
? `assets/fonts/${p.fontAttachmentId}.${MIME_TO_EXTENSION_MAPPINGS[p.fontMime]}`
: `api/attachments/${p.fontAttachmentId}/download`
))
.filter(Boolean)
.join("\n\n"),

View File

@@ -1,13 +1,13 @@
{
"get-started": {
"title": "Začínáme",
"title": "Začít",
"desktop_title": "Stažení aplikace pro osobní počítače (v{{version}})",
"architecture": "Architektura:",
"older_releases": "Starší vydání",
"server_title": "Nastavte server pro přístup z více zařízení"
},
"hero_section": {
"get_started": "Start",
"get_started": "Začít",
"github": "GitHub",
"title": "Uspořádejte si myšlenky. Vytvořte si osobní znalostní bázi.",
"subtitle": "Trilium je open-source řešení pro pořizování poznámek a organizaci osobní znalostní báze. Používejte jej lokálně na svém počítači nebo jej synchronizujte se svým vlastním serverem, abyste měli své poznámky vždy po ruce, ať jste kdekoli.",

View File

@@ -24,7 +24,7 @@
],
"license": "Apache-2.0",
"dependencies": {
"fuse.js": "7.2.0",
"fuse.js": "7.3.0",
"katex": "0.16.44",
"mermaid": "11.14.0"
},

View File

@@ -47,6 +47,14 @@ document.addEventListener(
if (toggleMenuButton && layout) {
toggleMenuButton.addEventListener("click", () => layout.classList.toggle("showMenu"));
}
// Format <time> elements using the browser's locale.
for (const el of document.querySelectorAll<HTMLTimeElement>("time[datetime]")) {
const date = new Date(el.dateTime);
if (!isNaN(date.getTime())) {
el.textContent = date.toLocaleDateString();
}
}
},
false
);

View File

@@ -62,6 +62,7 @@ body.type-webView {
#main {
max-width: unset;
padding: 0;
height: 100%;
}
#content {

View File

@@ -112,13 +112,13 @@ content = content.replaceAll(headingRe, (...match) => {
<body data-note-id="<%= note.noteId %>" class="type-<%= note.type %>" data-ancestor-note-id="<%= subRoot.note.noteId %>">
<%- renderSnippets("body:start") %>
<div id="header">
<button aria-label="Toggle Navigation" id="left-pane-toggle-button" class="header-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z"></path></svg></button>
<button aria-label="<%= t("share_theme.toggle-navigation") %>" id="left-pane-toggle-button" class="header-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z"></path></svg></button>
<a href="<%= shareRootLink %>" id="header-logo">
<img src="<%= logoUrl %>" width="32" height="<%= mobileLogoHeight %>" alt="Logo" />
<img src="<%= logoUrl %>" width="32" height="<%= mobileLogoHeight %>" alt="<%= t("share_theme.logo-alt") %>" />
<%= subRoot.note.title %>
</a>
<% if (headingMatches.length > 1) { %>
<button aria-label="Toggle Table of Contents" id="toc-pane-toggle-button" class="header-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10V7h2v2h-2zm0 6h2v-2h-2v2z"></path></svg></button>
<button aria-label="<%= t("share_theme.toggle-toc") %>" id="toc-pane-toggle-button" class="header-button"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10V7h2v2h-2zm0 6h2v-2h-2v2z"></path></svg></button>
<% } else { %>
<div class="header-button-placeholder"></div>
<% } %>
@@ -160,7 +160,7 @@ content = content.replaceAll(headingRe, (...match) => {
<%- renderSnippets("content:start") %>
<h1 id="title"><%= note.title %></h1>
<% if (isEmpty && (!note.hasVisibleChildren() && note.type !== "book")) { %>
<p>This note has no content.</p>
<p><%= t("share_page.no-content") %></p>
<% } else { %>
<%
content = content.replace(/<img /g, `<img alt="${t("share_theme.image_alt")}" loading="lazy" `);
@@ -196,7 +196,7 @@ content = content.replaceAll(headingRe, (...match) => {
<% if (!isEmpty && !isStatic) { %>
<div class="updated">
<% const lastUpdated = new Date(note.utcDateModified); %>
<%- t("share_theme.last-updated", { date: `<time datetime="${lastUpdated.toISOString()}">${lastUpdated.toLocaleDateString()}</time>`}) %>
<%- t("share_theme.last-updated", { date: `<time datetime="${lastUpdated.toISOString()}">${lastUpdated.toLocaleDateString("en-US")}</time>`}) %>
</div>
<% } %>

10
pnpm-lock.yaml generated
View File

@@ -1403,8 +1403,8 @@ importers:
packages/share-theme:
dependencies:
fuse.js:
specifier: 7.2.0
version: 7.2.0
specifier: 7.3.0
version: 7.3.0
katex:
specifier: 0.16.44
version: 0.16.44
@@ -9013,8 +9013,8 @@ packages:
functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
fuse.js@7.2.0:
resolution: {integrity: sha512-zf4vdcIGpjNKTuXwug33Hm2okqX6a0t2ZEbez+o9oBJQSNhVJ5AqERfeiRD3r8HcLqP66MrjdkmzxrncbAOTUQ==}
fuse.js@7.3.0:
resolution: {integrity: sha512-plz8RVjfcDedTGfVngWH1jmJvBvAwi1v2jecfDerbEnMcmOYUEEwKFTHbNoCiYyzaK2Ws8lABkTCcRSqCY1q4w==}
engines: {node: '>=10'}
futoin-hkdf@1.5.3:
@@ -24396,7 +24396,7 @@ snapshots:
functions-have-names@1.2.3: {}
fuse.js@7.2.0: {}
fuse.js@7.3.0: {}
futoin-hkdf@1.5.3: {}