Compare commits

...

494 Commits

Author SHA1 Message Date
Elian Doran
8f6912cd57 chore(electron-builder): add build settings in package.json 2025-08-14 17:04:47 +03:00
Elian Doran
d32dbf40f8 chore(electron-builder): install dep 2025-08-14 16:15:52 +03:00
Elian Doran
1dfcf960d3 fix(client): missing calendar view language support 2025-08-14 15:20:08 +03:00
Elian Doran
9bdc51a3fb feat(i18n): add Japanese language 2025-08-14 14:51:57 +03:00
Elian Doran
dbf3bcfacf Merge remote-tracking branch 'weblate/main' 2025-08-14 14:34:30 +03:00
Elian Doran
3d5b269315 chore(docs): fix file 2025-08-14 14:23:37 +03:00
Elian Doran
48f97da9cc chore(forge/rpm): rename key properly 2025-08-14 14:10:33 +03:00
Elian Doran
9c954fbd81 Create CNAME 2025-08-14 13:53:25 +03:00
Elian Doran
c6bd41654f chore(forge/rpm): add public key 2025-08-14 13:40:23 +03:00
Francis C
d65a74bb23 Translated using Weblate (Japanese)
Currently translated at 96.8% (366 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-14 12:30:37 +02:00
acwr47
ff08bca042 Translated using Weblate (Japanese)
Currently translated at 41.6% (646 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-08-14 12:30:36 +02:00
Francis C
a5d3d2e3b4 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-08-14 12:30:35 +02:00
Bruno MARGUERIN
496a0667ee Translated using Weblate (French)
Currently translated at 71.1% (269 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/fr/
2025-08-14 12:30:34 +02:00
Bruno MARGUERIN
9be688b667 Translated using Weblate (French)
Currently translated at 80.7% (1252 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2025-08-14 12:30:33 +02:00
Elian Doran
f3d9008c61 feat(forge): rpm signing (#6646) 2025-08-14 13:30:26 +03:00
Elian Doran
649a43c978 fix(forge): RPM signing not done on the right file 2025-08-14 12:45:18 +03:00
Elian Doran
50568704ca feat(forge): minor improvements to RPM signing 2025-08-14 12:40:19 +03:00
Elian Doran
b66b4dec83 feat(forge): proper rpm signing 2025-08-14 12:04:12 +03:00
Francis C
8d0e807435 Translated using Weblate (Japanese)
Currently translated at 96.8% (366 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-14 09:02:31 +00:00
acwr47
bf05ed7caf Translated using Weblate (Japanese)
Currently translated at 96.8% (366 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-14 09:02:29 +00:00
Elian Doran
b5080eff00 Translated using Weblate (Russian)
Currently translated at 55.6% (863 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-08-14 09:02:28 +00:00
Francis C
c474769dd6 Translated using Weblate (Japanese)
Currently translated at 35.4% (550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-08-14 09:02:27 +00:00
acwr47
a6ae01da0b Translated using Weblate (Japanese)
Currently translated at 35.4% (550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-08-14 09:02:25 +00:00
Francis C
2bf4c44dbf Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (378 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hant/
2025-08-14 09:02:24 +00:00
Francis C
5ca0fbba13 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-08-14 09:02:22 +00:00
Elian Doran
4cd84b2019 Translated using Weblate (Romanian)
Currently translated at 99.0% (1536 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ro/
2025-08-14 09:02:19 +00:00
Marcelo Popper Costa
c502a45cf5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 22.3% (346 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-14 09:02:17 +00:00
Francis C
9e66914306 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-08-14 09:02:15 +00:00
Elian Doran
d33d27ee82 feat(forge): validate rpm signing 2025-08-14 11:45:59 +03:00
Elian Doran
e2b13573ae feat(forge): rpm signing 2025-08-14 10:43:38 +03:00
Elian Doran
ec74f5f1de feat(logs): provide an option to keep all logs (#6644) 2025-08-14 08:51:46 +03:00
Elian Doran
5dee56debc Add Traditional Chinese translation for README file & fix Docker Hub URL (#6645) 2025-08-14 08:43:08 +03:00
Francis C.
5623fc992d Update README-ZH_TW.md (tiny fix) 2025-08-14 12:04:45 +08:00
Francis C.
1d28bfc570 Update README-ZH_TW.md (tiny fix) 2025-08-14 11:25:53 +08:00
Francis C.
084327e973 Revise some words for Simplified Chinese translation 2025-08-14 11:20:32 +08:00
Francis C.
b2885efdc1 Update README-ZH_CN.md 2025-08-14 10:56:54 +08:00
Francis C.
b65a75f138 fix relative path for URLs 2025-08-14 10:27:41 +08:00
Francis C.
0ee7f50bb4 Move readme to docs folder 2025-08-14 10:15:03 +08:00
Francis C.
02ce21bc18 Add readme file translation for Traditional Chinese & fix Docker Hub URL 2025-08-14 10:12:14 +08:00
Romain DEP.
3ba487bb00 feat(logs): provide an option to keep all logs 2025-08-13 23:35:31 +02:00
Elian Doran
384a89b0e3 feat(etapi): also save note revision via etapi if needed too (#6602) 2025-08-13 19:45:56 +03:00
Elian Doran
e7fd9371b6 test(etapi): variable shadowing causing spurious error 2025-08-13 19:22:48 +03:00
Elian Doran
aa83429816 feat(logs): cleanup physical log files after 90 days by default (#6609) 2025-08-13 16:12:11 +03:00
Elian Doran
221ab02c24 docs(help): document backend logs retention 2025-08-13 16:10:11 +03:00
Elian Doran
0c4b751e8f Merge branch 'main' into feat/snapshot-etapi-notes-too 2025-08-13 15:17:27 +03:00
Elian Doran
43fd0924a1 feat(log): read from config.ini instead of options 2025-08-13 15:10:19 +03:00
Elian Doran
7a036fc777 fix(log): cyclic dependency to options breaking tests 2025-08-13 14:39:26 +03:00
Elian Doran
54efa6b38c Merge branch 'main' into feat/cleanup-logs 2025-08-13 13:26:52 +03:00
Elian Doran
6e37c9ee5a feat(search): improve search weights and operators (#6536) 2025-08-13 13:10:30 +03:00
Elian Doran
963f4586f3 docs: ✏️ Improve OIDC docs (#6628) 2025-08-13 13:03:37 +03:00
Elian Doran
4d0edebed3 Translations update from Hosted Weblate (#6627) 2025-08-13 12:03:28 +03:00
acwr47
cb39e8d0f8 Translated using Weblate (Japanese)
Currently translated at 72.4% (274 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-13 08:33:02 +00:00
Francis C
a336f472b8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-08-13 08:33:01 +00:00
acwr47
0a097e72be Translated using Weblate (Japanese)
Currently translated at 63.7% (241 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-13 08:33:01 +00:00
acwr47
077f10af7b Translated using Weblate (Japanese)
Currently translated at 61.1% (231 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-13 08:33:00 +00:00
acwr47
9317658fc7 Translated using Weblate (Japanese)
Currently translated at 60.8% (230 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-13 08:32:59 +00:00
acwr47
21a13f2124 Translated using Weblate (Japanese)
Currently translated at 8.3% (130 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-08-13 08:32:59 +00:00
acwr47
db6658c05f Translated using Weblate (Japanese)
Currently translated at 55.0% (208 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-13 08:32:58 +00:00
acwr47
653af0bc06 Translated using Weblate (Japanese)
Currently translated at 20.6% (78 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-13 08:32:57 +00:00
acwr47
93c5281af7 Translated using Weblate (Japanese)
Currently translated at 20.3% (77 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-13 08:32:57 +00:00
Francis C
ce28fbc968 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-08-13 08:32:56 +00:00
Marcelo Popper Costa
eb41c45711 Translated using Weblate (Portuguese (Brazil))
Currently translated at 22.0% (342 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-13 08:32:56 +00:00
Francis C
17ab14e098 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1550 of 1550 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-08-13 08:32:55 +00:00
Hosted Weblate
a42f7b4ece Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2025-08-13 08:32:54 +00:00
Elian Doran
c7d69fa66b chore(deps): update dependency copy-webpack-plugin to v13.0.1 (#6630) 2025-08-13 11:32:44 +03:00
renovate[bot]
1da5c083ee chore(deps): update dependency copy-webpack-plugin to v13.0.1 2025-08-13 08:13:22 +00:00
Elian Doran
4fb911da40 chore(deps): update dependency vite to v7.1.2 (#6633) 2025-08-13 11:09:38 +03:00
Elian Doran
881417f860 Revert "fix(print): table captions not displayed properly (closes #6483)"
This reverts commit 3e0ef10b25.
2025-08-13 11:06:53 +03:00
renovate[bot]
9748b8bf94 chore(deps): update dependency vite to v7.1.2 2025-08-13 08:01:05 +00:00
Elian Doran
337326da2b fix(deps): update ckeditor monorepo to v46.0.1 (#6635) 2025-08-13 10:58:17 +03:00
Elian Doran
a088134d9b fix(deps): update dependency tsx to v4.20.4 (#6636) 2025-08-13 10:58:07 +03:00
renovate[bot]
e49100f3f4 fix(deps): update dependency tsx to v4.20.4 2025-08-13 07:30:57 +00:00
renovate[bot]
3c638e1574 fix(deps): update ckeditor monorepo to v46.0.1 2025-08-13 07:30:22 +00:00
Elian Doran
9131edf021 chore(deps): update dependency esbuild to v0.25.9 (#6631) 2025-08-13 10:24:19 +03:00
Elian Doran
52a1318475 chore(deps): update svelte monorepo (#6639) 2025-08-13 10:22:30 +03:00
renovate[bot]
5a7483d7c7 chore(deps): update svelte monorepo 2025-08-13 05:32:46 +00:00
renovate[bot]
41f2748829 chore(deps): update dependency esbuild to v0.25.9 2025-08-13 05:29:40 +00:00
Elian Doran
66bd5268ca chore(deps): update typescript-eslint monorepo to v8.39.1 (#6634) 2025-08-13 08:27:52 +03:00
Elian Doran
ebef134af7 chore(deps): update dependency typedoc-plugin-missing-exports to v4.1.0 (#6637) 2025-08-13 08:27:30 +03:00
Elian Doran
1173bf22ab chore(deps): update dependency webdriverio to v9.19.1 (#6638) 2025-08-13 08:26:34 +03:00
Elian Doran
e8f6828168 chore(deps): update dependency @types/tabulator-tables to v6.2.10 (#6629) 2025-08-13 08:26:10 +03:00
Elian Doran
02c9339f9c chore(deps): update actions/checkout action to v5 (#6640) 2025-08-13 08:25:51 +03:00
renovate[bot]
c72bf42684 chore(deps): update actions/checkout action to v5 2025-08-13 01:52:37 +00:00
renovate[bot]
f42eeb7ee8 chore(deps): update dependency webdriverio to v9.19.1 2025-08-13 01:51:53 +00:00
renovate[bot]
3d876121cc chore(deps): update dependency typedoc-plugin-missing-exports to v4.1.0 2025-08-13 01:51:12 +00:00
renovate[bot]
f9bcd7d90a chore(deps): update typescript-eslint monorepo to v8.39.1 2025-08-13 01:49:16 +00:00
renovate[bot]
b3af14fccb chore(deps): update dependency @types/tabulator-tables to v6.2.10 2025-08-13 01:10:44 +00:00
Jin
d224f33913 docs: ✏️ Improve OIDC docs 2025-08-12 22:03:36 +02:00
Elian Doran
3a5f33ba91 Merge remote-tracking branch 'weblate/main' 2025-08-12 22:54:06 +03:00
Elian Doran
e1ae8701b2 feat(client): rename themes 2025-08-12 22:39:03 +03:00
Hosted Weblate
aff5a4d0d5 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/
2025-08-12 19:18:38 +00:00
Hosted Weblate
17467a9c29 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/
2025-08-12 19:18:33 +00:00
acwr47
ebed661863 Translated using Weblate (Japanese)
Currently translated at 15.6% (59 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-12 19:07:14 +00:00
Elian Doran
c2e9f4764b Call to action (switch to Next theme, enable background effects) (#6625) 2025-08-12 22:07:04 +03:00
Elian Doran
7e5b87f00a feat(desktop): enable background effects by default for new users 2025-08-12 22:06:19 +03:00
Elian Doran
70182e863c test: enable background effects in integration DB 2025-08-12 21:41:46 +03:00
Elian Doran
f0d30c4e34 fix(canvas): links not working on desktop (fixes #6606) 2025-08-12 21:31:04 +03:00
Elian Doran
013e7a6aa4 refactor(canvas): use new rendering mechanism 2025-08-12 21:04:57 +03:00
Elian Doran
1b25b18d9e refactor(canvas): use tsx where appropriate 2025-08-12 20:59:45 +03:00
Elian Doran
72ff384187 refactor(call_to_action): clean up 2025-08-12 20:12:06 +03:00
Elian Doran
bac048f60f feat(call_to_action): allow dismissal 2025-08-12 19:37:32 +03:00
Elian Doran
d8d0a64134 Translations update from Hosted Weblate (#6624) 2025-08-12 19:15:08 +03:00
Elian Doran
b2db87db4e chore(call-to-action): add IDs for each call to action 2025-08-12 19:05:33 +03:00
Elian Doran
1baaee582e refactor(call-to-action): split into separate file & add translations 2025-08-12 18:42:55 +03:00
nejcmenard
9212b72351 Translated using Weblate (Slovenian)
Currently translated at 1.3% (5 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/sl/
2025-08-12 17:37:58 +02:00
nejcmenard
24af820477 Translated using Weblate (Slovenian)
Currently translated at 0.3% (5 of 1544 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sl/
2025-08-12 17:37:58 +02:00
acwr47
6c4c2d22c6 Translated using Weblate (Japanese)
Currently translated at 15.3% (58 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-08-12 17:37:58 +02:00
acwr47
2e9b20be71 Translated using Weblate (Japanese)
Currently translated at 8.4% (130 of 1544 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-08-12 17:37:58 +02:00
Francis C
3216de5d89 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (378 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hant/
2025-08-12 17:37:57 +02:00
Francis C
4bf7cb8099 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 75.5% (1166 of 1544 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-08-12 17:37:57 +02:00
Elian Doran
4871dbd7ef feat(call_to_action): add actual functionality on action buttons 2025-08-12 17:48:44 +03:00
Elian Doran
e125809fe0 fix(call_to_action): error if no items 2025-08-12 17:42:18 +03:00
Elian Doran
27b80b573f feat(call_to_action): filter call to actions 2025-08-12 17:05:52 +03:00
Elian Doran
38d6ae87b6 feat(call-to-action): add support for multiple actions 2025-08-12 16:35:27 +03:00
Elian Doran
1a7cbc13e0 feat(call-to-action): basic dialog 2025-08-12 15:57:29 +03:00
Elian Doran
8e4691d4a4 fix(calendar): missing locale for Russian 2025-08-12 14:58:39 +03:00
Elian Doran
b371337ed2 Translations update from Hosted Weblate (#6623) 2025-08-12 10:55:28 +03:00
nejcmenard
4d4b76ce39 Added translation using Weblate (Slovenian) 2025-08-12 09:46:43 +02:00
nejcmenard
289d3e9882 Added translation using Weblate (Slovenian) 2025-08-12 09:46:42 +02:00
acwr47
a57eb8f27f Translated using Weblate (Japanese)
Currently translated at 1.4% (22 of 1544 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-08-12 09:46:42 +02:00
Elian Doran
27023f1fd5 only run nightly.yml on TriliumNext/Trilium (#6620) 2025-08-12 09:27:14 +03:00
Elian Doran
20a152993f feat(): Update codemirror-themes and add new Cobalt2 theme (#6621) 2025-08-12 09:26:14 +03:00
Elian Doran
ba7636db75 Translations update from Hosted Weblate (#6622) 2025-08-12 09:08:55 +03:00
Flowerlywind
e3e51a2e1f Translated using Weblate (Vietnamese)
Currently translated at 1.8% (29 of 1544 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/vi/
2025-08-12 07:46:18 +02:00
hulmgulm
93b601fe98 Translated using Weblate (German)
Currently translated at 80.4% (1242 of 1544 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2025-08-12 07:46:18 +02:00
hulmgulm
203ebb0e7a Update codemirror-themes and add new Cobalt2 theme 2025-08-12 07:09:14 +02:00
matt wilkie
041c2e5693 Merge branch 'main' into mhw-nightly 2025-08-11 21:11:17 -07:00
matt wilkie
258c0d511e only run nightly.yml on TriliumNext/Trilium
stops nightly CI/CD errors on forks without having to disable CI/CD entirely
2025-08-11 21:07:15 -07:00
Elian Doran
15705553c7 Adds a get/set to bNote to allow getting an Attribute by it's Id, or … (#6596) 2025-08-11 22:43:11 +03:00
Elian Doran
27f023e399 chore(deps): update dependency typedoc to v0.28.10 (#6611) 2025-08-11 22:31:27 +03:00
Elian Doran
0d2242171c fix(deps): update dependency i18next to v25.3.4 (#6612) 2025-08-11 22:30:56 +03:00
Elian Doran
0c62ecda65 Translations update from Hosted Weblate (#6619) 2025-08-11 22:30:32 +03:00
wild
7cd7fec93b Translated using Weblate (Serbian)
Currently translated at 27.8% (435 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sr/
2025-08-11 19:28:12 +00:00
infaktor
cfab5e6217 Translated using Weblate (German)
Currently translated at 80.8% (1261 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2025-08-11 19:28:11 +00:00
Grant Zhu
0c313e8b8f Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1560 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-08-11 19:28:10 +00:00
Grip
61366061e6 Translated using Weblate (Italian)
Currently translated at 35.1% (133 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2025-08-11 19:28:09 +00:00
Grip
b2c0685c09 Translated using Weblate (Italian)
Currently translated at 13.9% (218 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-08-11 19:28:09 +00:00
Elian Doran
e3ee284e91 fix(deps): update fullcalendar monorepo to v6.1.19 (#6613) 2025-08-11 22:27:58 +03:00
Elian Doran
58901855af React modals (#6544) 2025-08-11 22:26:14 +03:00
Elian Doran
c7f8a49c47 docs(readme): wrong link to the latest release 2025-08-11 15:09:26 +03:00
renovate[bot]
10685fe183 fix(deps): update fullcalendar monorepo to v6.1.19 2025-08-11 02:03:23 +00:00
renovate[bot]
9e514fe95e fix(deps): update dependency i18next to v25.3.4 2025-08-11 02:02:51 +00:00
renovate[bot]
f28a319e26 chore(deps): update dependency typedoc to v0.28.10 2025-08-11 02:02:15 +00:00
perf3ct
decfb58142 feat(logs): cleanup physical log files after 90 days by default
asdf
2025-08-11 00:50:40 +00:00
perf3ct
415bbc3b0a feat(docs): also update documentation for search updates 2025-08-10 23:16:37 +00:00
perf3ct
5b669ca287 feat(search): also implement defensive checks for undefined notes 2025-08-10 21:59:20 +00:00
Elian Doran
1700217241 fix(react/dialogs): broken test in cheatsheet 2025-08-10 23:37:05 +03:00
Elian Doran
f00c0d5d73 chore(deps): update dependency @anthropic-ai/sdk to v0.59.0 (#6594) 2025-08-10 23:11:36 +03:00
Elian Doran
64ce0d2911 Translations update from Hosted Weblate (#6603) 2025-08-10 23:01:39 +03:00
Elian Doran
82dce7a0d3 fix(react/dialogs): restore jump to note text 2025-08-10 22:41:20 +03:00
Elian Doran
b94f67aa72 fix(react/dialogs): entering command palette 2025-08-10 21:53:21 +03:00
Elian Doran
1ff77a1464 fix(react/dialogs): jump to note not supporting spaces 2025-08-10 21:07:41 +03:00
Elian Doran
adb0e1e844 chore(react/dialogs): remove unnecessary close translation 2025-08-10 20:39:41 +03:00
Elian Doran
2043a06a48 chore(react/dialogs): remove empty translations 2025-08-10 20:32:08 +03:00
Elian Doran
738ebb66ac Merge remote-tracking branch 'origin/main' into react/modals 2025-08-10 20:28:51 +03:00
Elian Doran
abf1f6c041 fix(react/dialogs): revision list not full height 2025-08-10 20:24:20 +03:00
Flowerlywind
7db0e90506 Translated using Weblate (Vietnamese)
Currently translated at 0.5% (2 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/vi/
2025-08-10 19:07:49 +02:00
Flowerlywind
400f9cf911 Translated using Weblate (Vietnamese)
Currently translated at 1.0% (17 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/vi/
2025-08-10 19:07:48 +02:00
Elian Doran
2d3b99c959 fix(react/dialogs): restore focus after modal is dismissed 2025-08-10 20:06:05 +03:00
Elian Doran
fd1ea05c78 fix(react/dialogs): add link default text not working 2025-08-10 19:51:56 +03:00
Elian Doran
d7c4b8f530 fix(react/dialogs): undelete note not working 2025-08-10 19:19:48 +03:00
Elian Doran
238f358d6a fix(react/dialogs): bring back keyboard navigation for note list 2025-08-10 18:56:37 +03:00
Elian Doran
50afdca150 fix(react/dialogs): autocomplete not reacting to clear 2025-08-10 18:19:39 +03:00
Elian Doran
b5555d94f5 fix(react/dialogs): note autocomplete not restoring note 2025-08-10 18:01:36 +03:00
Elian Doran
3d81633214 fix(react/dialogs): add back selection in revisions list 2025-08-10 17:53:45 +03:00
Elian Doran
5db7997a17 fix(react/dialogs): revisions not refreshing after deleting an item 2025-08-10 17:48:17 +03:00
Elian Doran
71dd428919 fix(react/dialogs): conform dialog not reporting properly 2025-08-10 17:41:31 +03:00
Elian Doran
a20d66a6b5 fix(react/dialogs): some dialogs are not displayed on top 2025-08-10 17:37:48 +03:00
Elian Doran
3caefa5409 refactor(react): use memoization where appropriate 2025-08-10 17:19:39 +03:00
Elian Doran
a6e56be55a refactor(react): move effects outside conditional 2025-08-10 17:15:38 +03:00
Flowerlywind
6d582f09be Added translation using Weblate (Vietnamese) 2025-08-10 15:58:52 +02:00
Flowerlywind
40cd46cd09 Added translation using Weblate (Vietnamese) 2025-08-10 15:58:51 +02:00
renovate[bot]
3cc59149cf chore(deps): update dependency @anthropic-ai/sdk to v0.59.0 2025-08-10 12:44:22 +00:00
Elian Doran
e659266d62 refactor(react): remove use of any 2025-08-10 15:28:52 +03:00
Elian Doran
14e09f5ea0 refactor(react): normalize imports 2025-08-10 15:21:49 +03:00
Elian Doran
11f6462a31 fix(react/dialogs): events triggering even when modal is hidden 2025-08-10 15:11:43 +03:00
Elian Doran
48eebbe2fe refactor(react/dialogs): don't render modals unless they are actually shown 2025-08-10 14:55:41 +03:00
Elian Doran
f7093c035b refactor(react/dialogs): add documentation & enforce some properties 2025-08-10 14:49:58 +03:00
Elian Doran
b25e9cdee6 fix(react/dialogs): delete notes not properly reporting state 2025-08-10 14:46:40 +03:00
Elian Doran
5cd7e4707a fix(react/dialogs): dollar signs in help tooltips 2025-08-10 14:07:54 +03:00
Elian Doran
861374bb87 fix(react/dialogs): bulk actions not working in search notes 2025-08-10 14:06:14 +03:00
Elian Doran
d3519b3059 refactor(react/dialogs): solve client errors 2025-08-10 13:02:17 +03:00
Elian Doran
da1f18c60f refactor(react/dialogs): integrate proper closing of modal 2025-08-10 12:22:11 +03:00
Elian Doran
b7482f2a6a refactor(react/dialogs): use shown everywhere 2025-08-10 11:38:12 +03:00
Elian Doran
fd616cafca fix(deps): update eslint monorepo to v9.33.0 (#6595) 2025-08-10 09:22:13 +03:00
Elian Doran
b262a5181f fix(deps): update dependency mind-elixir to v5.0.5 (#6598) 2025-08-10 09:21:52 +03:00
Elian Doran
adb54a9054 fix(deps): update dependency eslint-linter-browserify to v9.33.0 (#6599) 2025-08-10 09:21:21 +03:00
Elian Doran
5eb05f5550 Translations update from Hosted Weblate (#6600) 2025-08-10 09:20:37 +03:00
perf3ct
2950c5eaa4 feat(etapi): also save note revision via etapi if needed too
asdf
2025-08-10 05:06:48 +00:00
infaktor
16fd67c070 Translated using Weblate (German)
Currently translated at 69.0% (261 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/
2025-08-10 05:38:12 +02:00
Marcelo Nolasco
9e3559f97c Translated using Weblate (Portuguese (Brazil))
Currently translated at 23.2% (363 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-10 05:38:12 +02:00
infaktor
83eea30ea0 Translated using Weblate (German)
Currently translated at 80.8% (1261 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2025-08-10 05:38:11 +02:00
renovate[bot]
6ceccf1c7a fix(deps): update dependency eslint-linter-browserify to v9.33.0 2025-08-10 01:33:44 +00:00
renovate[bot]
31e1c4c712 fix(deps): update dependency mind-elixir to v5.0.5 2025-08-10 01:32:47 +00:00
Elian Doran
fa97ec6c72 refactor(react/dialogs): integrate self-triggering modal in more dialogs 2025-08-10 00:32:26 +03:00
Elian Doran
cd5467bf5c refactor(react/bulk_actions): set up way to self-enable modal 2025-08-09 23:12:27 +03:00
Elian Doran
899f85f4e7 chore(react/bulk_actions): clean up 2025-08-09 20:37:45 +03:00
Elian Doran
7c79fbefa6 feat(react/bulk_actions): port execute script 2025-08-09 20:34:33 +03:00
Elian Doran
18c6fe7ebd feat(react/bulk_actions): port update relation target 2025-08-09 20:26:21 +03:00
Elian Doran
6f6643d758 feat(react/bulk_actions): port rename relation 2025-08-09 20:09:27 +03:00
Elian Doran
356adebbce feat(react/bulk_actions): improve delete relation 2025-08-09 20:01:48 +03:00
Elian Doran
5c8e4fd6fd feat(react/bulk_actions): improve note auto complete handling 2025-08-09 19:49:32 +03:00
Elian Doran
5be9bb47a7 feat(react/bulk_actions): port add relation 2025-08-09 19:41:49 +03:00
Elian Doran
60c5dc525b feat(react/bulk_actions): port rename note 2025-08-09 19:30:35 +03:00
Elian Doran
abfffcec07 feat(react/bulk_actions): clear autocomplete selection 2025-08-09 19:10:40 +03:00
Elian Doran
09b12052f0 feat(react/bulk_actions): port move note 2025-08-09 18:45:39 +03:00
Elian Doran
78bb0ab016 Added zen mode to mobile layout (#6584) 2025-08-09 18:00:03 +03:00
Papierkorb2292
4cd4c2f607 Apply suggestions from code review
Use `mobile` class on body to determine the style of `CloseZenButton` instead of an extra class

Co-authored-by: Elian Doran <contact@eliandoran.me>
2025-08-09 16:31:56 +02:00
Elian Doran
f95b5d6f14 feat(react/bulk_actions): port delete revisions 2025-08-09 16:55:51 +03:00
Elian Doran
4a53be1e33 feat(react/bulk_actions): port delete note 2025-08-09 16:47:05 +03:00
Elian Doran
cbbe845d7b fix: remove unnecessary idea directory (#6554) 2025-08-09 13:37:41 +03:00
Elian Doran
b2b52e92a4 Added Simple Update/Autoupdate Script (#6568) 2025-08-09 13:35:39 +03:00
renovate[bot]
15a97a4675 fix(deps): update eslint monorepo to v9.33.0 2025-08-09 10:31:41 +00:00
Elian Doran
a01f25ec12 chore(deps): update dependency @sveltejs/vite-plugin-svelte to v6.1.1 (#6590) 2025-08-09 13:31:16 +03:00
Elian Doran
2f175765ec chore(deps): update dependency lint-staged to v16.1.5 (#6592) 2025-08-09 13:31:00 +03:00
Elian Doran
6a7ae72b1b chore(deps): update dependency tmp to v0.2.5 (#6593) 2025-08-09 13:30:31 +03:00
Elian Doran
e396bb1641 chore(deps): update dependency @types/node to v22.17.1 (#6591) 2025-08-09 13:30:10 +03:00
Elian Doran
baedac4746 chore(deps): update dependency @stylistic/eslint-plugin to v5.2.3 (#6589) 2025-08-09 13:28:05 +03:00
Elian Doran
268ef626ca chore(deps): update dependency @eslint/compat to v1.3.2 (#6588) 2025-08-09 13:27:37 +03:00
Elian Doran
40c7ad4b46 fix(react/bulk_actions): delete button not working 2025-08-09 10:12:26 +03:00
Elian Doran
54f9ce87f9 feat(react/bulk_actions): port delete/rename label 2025-08-09 10:04:58 +03:00
Elian Doran
12b8a70e5c feat(react/bulk_actions): port update label value 2025-08-09 09:28:48 +03:00
Elian Doran
acf204d0e3 fix(react/bulk_actions): spaced update triggering too fast 2025-08-09 09:15:54 +03:00
Geekswordsman
ee19f9ccaa Adds a get/set to bNote to allow getting an Attribute by it's Id, or setting an Attribute's value by it's Id 2025-08-08 21:47:20 -04:00
renovate[bot]
34c0cf33b9 chore(deps): update dependency tmp to v0.2.5 2025-08-09 00:41:34 +00:00
renovate[bot]
34ec624e46 chore(deps): update dependency lint-staged to v16.1.5 2025-08-09 00:40:50 +00:00
renovate[bot]
056d3f9f36 chore(deps): update dependency @types/node to v22.17.1 2025-08-09 00:40:21 +00:00
renovate[bot]
040673af0b chore(deps): update dependency @sveltejs/vite-plugin-svelte to v6.1.1 2025-08-09 00:39:45 +00:00
renovate[bot]
48fb0c5e21 chore(deps): update dependency @stylistic/eslint-plugin to v5.2.3 2025-08-09 00:39:01 +00:00
renovate[bot]
4c1a55708f chore(deps): update dependency @eslint/compat to v1.3.2 2025-08-09 00:38:56 +00:00
Elian Doran
6e1951b356 feat(react/bulk_actions): port add_label 2025-08-08 23:23:07 +03:00
Elian Doran
3dd6b05d2e fix(react/dialog): react to adding new bulk actions 2025-08-08 22:01:30 +03:00
Elian Doran
05f1ae01f3 Merge remote-tracking branch 'origin/main' into react/modals 2025-08-08 21:37:13 +03:00
Elian Doran
3975041798 feat(react): set up hook for reacting to events 2025-08-08 20:08:06 +03:00
serossi
3a29d65777 Merge branch 'TriliumNext:main' into patch-1 2025-08-08 15:29:44 +02:00
Elian Doran
eeeecb3988 chore(deps): update dependency electron to v37.2.6 (#6573) 2025-08-08 13:18:24 +03:00
Elian Doran
28ababcbb9 chore(deps): update dependency vite to v7.1.1 (#6583) 2025-08-08 13:18:17 +03:00
Elian Doran
f382943af3 Translations update from Hosted Weblate (#6585) 2025-08-08 13:17:42 +03:00
renovate[bot]
fa38332a6c chore(deps): update dependency vite to v7.1.1 2025-08-08 09:46:23 +00:00
renovate[bot]
5a58fcde96 chore(deps): update dependency electron to v37.2.6 2025-08-08 09:45:02 +00:00
Doğukan Çağatay
62d048433b Translated using Weblate (Turkish)
Currently translated at 1.6% (26 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/tr/
2025-08-08 09:42:50 +00:00
Doğukan Çağatay
db4ba53449 Added translation using Weblate (Turkish) 2025-08-08 09:42:50 +00:00
Doğukan Çağatay
da20916767 Added translation using Weblate (Turkish) 2025-08-08 09:42:49 +00:00
Marcelo Nolasco
b1e12182ce Translated using Weblate (Portuguese (Brazil))
Currently translated at 22.3% (348 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-08 09:42:48 +00:00
Elian Doran
80b2061935 chore(deps): update dependency stylelint to v16.23.1 (#6582) 2025-08-08 12:42:41 +03:00
Elian Doran
8ce92f8c93 chore(deps): update dependency ollama to v0.5.17 (#6580) 2025-08-08 12:42:32 +03:00
Elian Doran
05cd8cb547 chore(deps): update svelte monorepo (#6575) 2025-08-08 12:42:23 +03:00
Elian Doran
6e7d0bc51b chore(deps): update dependency rollup-plugin-webpack-stats to v2.1.3 (#6574) 2025-08-08 12:42:15 +03:00
renovate[bot]
b9aede23e6 chore(deps): update svelte monorepo 2025-08-08 09:42:12 +00:00
renovate[bot]
1d52988826 chore(deps): update dependency rollup-plugin-webpack-stats to v2.1.3 2025-08-08 09:41:29 +00:00
Elian Doran
ebe29f41f9 chore(deps): update dependency tmp to v0.2.4 [security] (#6572) 2025-08-08 12:40:01 +03:00
Elian Doran
598591a2da chore(deps): update electron-forge monorepo to v7.8.3 (#6564) 2025-08-08 12:39:06 +03:00
Elian Doran
32c2860b68 chore(deps): update dependency lint-staged to v16.1.4 (#6550) 2025-08-08 12:38:43 +03:00
Papierkorb2292
d975790e79 Added zen mode for mobile layout (useful on tablets) 2025-08-08 09:15:01 +02:00
renovate[bot]
3e1f74ae93 chore(deps): update electron-forge monorepo to v7.8.3 2025-08-08 06:51:40 +00:00
renovate[bot]
81a8908b98 chore(deps): update dependency stylelint to v16.23.1 2025-08-08 06:51:11 +00:00
renovate[bot]
892dfe2340 chore(deps): update dependency ollama to v0.5.17 2025-08-08 06:49:34 +00:00
renovate[bot]
fd175eb8a8 chore(deps): update dependency lint-staged to v16.1.4 2025-08-08 06:49:02 +00:00
renovate[bot]
c98f6d96d5 chore(deps): update dependency tmp to v0.2.4 [security] 2025-08-08 06:47:58 +00:00
Elian Doran
35b628e799 refactor(i18n): add type safety for Electron locale IDs 2025-08-08 08:35:02 +03:00
Elian Doran
49b79c016d Translations update from Hosted Weblate (#6579) 2025-08-08 08:11:08 +03:00
serossi
4d28df7a89 Merge branch 'main' into patch-1 2025-08-07 23:31:59 +02:00
Languages add-on
25a9a8a724 Added translation using Weblate (Serbian) 2025-08-07 22:58:31 +02:00
Languages add-on
313a61ec48 Added translation using Weblate (Japanese) 2025-08-07 22:58:29 +02:00
Languages add-on
a2eab03ee2 Added translation using Weblate (Russian) 2025-08-07 22:58:28 +02:00
Languages add-on
a563b1c9a0 Added translation using Weblate (Greek) 2025-08-07 22:58:27 +02:00
Elian Doran
20018b9c21 Adds duplicateSubtree to backend API. (#6577) 2025-08-07 23:57:28 +03:00
Geekswordsman
0a9bd5f6d1 Merge branch 'main' into geek-api-duplicate-subtree 2025-08-07 16:54:46 -04:00
Geekswordsman
911fee0213 Updated documentation for the duplicateSubtree, and removed commented out code per request. 2025-08-07 16:54:21 -04:00
Elian Doran
ffe4b53eee Translations update from Hosted Weblate (#6578) 2025-08-07 23:51:49 +03:00
Antonio Liccardo (TuxmAL)
cd5a68d230 Translated using Weblate (Italian)
Currently translated at 33.0% (125 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2025-08-07 22:44:23 +02:00
Elian Doran
95a2a69e0a feat(i18n): add Russian 2025-08-07 23:44:11 +03:00
Elian Doran
360b5d6de4 e2e(server): broken test after translations were introduced 2025-08-07 23:34:28 +03:00
Elian Doran
bf50883e40 Translations update from Hosted Weblate (#6569) 2025-08-07 23:17:43 +03:00
Geekswordsman
8e04690568 Adds duplicateSubtree to backend API. 2025-08-07 15:33:43 -04:00
Elian Doran
bd6c690160 chore(react/dialog): improve recent changes 2025-08-07 22:31:51 +03:00
Elian Doran
c0d7278827 refactor(react/dialogs): deduplicate raw HTML component 2025-08-07 22:00:37 +03:00
Elian Doran
f9eb0a20f7 feat(react/dialogs): port bulk actions 2025-08-07 21:58:47 +03:00
Elian Doran
8d27a5aa39 feat(react/dialogs): port import 2025-08-07 19:20:35 +03:00
Elian Doran
90f9416524 feat(react/modals): port export dialog 2025-08-07 18:52:39 +03:00
Kuzma Simonov
ae0af8b9c7 Translated using Weblate (Russian)
Currently translated at 56.8% (887 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-08-07 06:20:12 +00:00
Eduard Frigola
a03a0f8a75 Translated using Weblate (Catalan)
Currently translated at 18.5% (70 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ca/
2025-08-07 06:20:11 +00:00
Eduard Frigola
f0f27a9065 Translated using Weblate (Catalan)
Currently translated at 8.3% (130 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ca/
2025-08-07 06:20:11 +00:00
Antonio Liccardo (TuxmAL)
181d5ee36a Translated using Weblate (Italian)
Currently translated at 22.4% (85 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2025-08-07 06:20:10 +00:00
Antonio Liccardo (TuxmAL)
2758a230ac Translated using Weblate (Italian)
Currently translated at 13.7% (214 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-08-07 06:20:10 +00:00
Marcelo Nolasco
a46d32ed75 Translated using Weblate (Portuguese (Brazil))
Currently translated at 17.4% (272 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-07 06:20:09 +00:00
J. Lavoie
b2bcae8b74 Translated using Weblate (French)
Currently translated at 81.6% (1273 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2025-08-07 06:20:08 +00:00
Elian Doran
49d662afba feat(ci): add way to reset signing 2025-08-07 09:19:54 +03:00
Elian Doran
a593ce7c40 fix(react/dialog): delete note not working properly 2025-08-06 23:11:53 +03:00
Elian Doran
31fbf2cb57 fix(react/dialogs): port recent_changes 2025-08-06 23:11:31 +03:00
Elian Doran
c0d3027e65 fix(react/dialogs): unnecessary listeners on modal render 2025-08-06 20:54:29 +03:00
Elian Doran
bde270b73f fix(react/dialogs): some type errors 2025-08-06 20:29:19 +03:00
Elian Doran
edd18b53d0 refactor(react/dialogs): solve some type errors 2025-08-06 18:10:02 +03:00
Elian Doran
2ad4b26c9e chore(react/dialogs): reintroduce footer in note revisions 2025-08-06 18:01:26 +03:00
serossi
f39a5c55ba Update Packaged version for Linux.md
Updated the Script for Version check
2025-08-06 16:30:39 +02:00
Elian Doran
0af5feab79 refactor(react/dialogs): deduplicate data types 2025-08-06 17:11:01 +03:00
serossi
68dd54a100 Update Packaged version for Linux.md
Added Autoupdate Script for Server from Github releases
2025-08-06 16:07:27 +02:00
Elian Doran
7a0f148d28 chore(react/dialogs): add back content buttons to note revision 2025-08-06 17:01:32 +03:00
Elian Doran
958b1592f8 chore(react/dialogs): add back rendering in revisions 2025-08-06 16:53:58 +03:00
Elian Doran
7ac0828ae7 feat(react/dialogs): port note revisions 2025-08-06 16:16:30 +03:00
Elian Doran
f7e7b38551 chore(react/dialogs): add back badges for choose note type 2025-08-06 12:13:38 +03:00
Elian Doran
33e3112290 feat(react/dialog): port note_type_chooser 2025-08-06 12:08:17 +03:00
Elian Doran
2a27666c53 Update actions/download-artifact action to v5 (#6567) 2025-08-06 09:36:36 +03:00
Elian Doran
f2d45cb780 Update dependency @anthropic-ai/sdk to v0.58.0 (#6565) 2025-08-06 09:36:01 +03:00
Elian Doran
c4b91c9777 Update dependency fs-extra to v11.3.1 (#6563) 2025-08-06 09:35:50 +03:00
Elian Doran
fa06f56f5d Update dependency openai to v5.12.0 (#6566) 2025-08-06 08:44:06 +03:00
Elian Doran
519b962af3 Merge branch 'main' into renovate/openai-5.x 2025-08-06 08:43:56 +03:00
Elian Doran
31e6ac2349 Update dependency @sveltejs/kit to v2.27.1 (#6562) 2025-08-06 08:43:33 +03:00
renovate[bot]
ed3ba2745f Update actions/download-artifact action to v5 2025-08-06 02:33:21 +00:00
renovate[bot]
f5b7648d6d Update dependency openai to v5.12.0 2025-08-06 02:33:15 +00:00
renovate[bot]
2d537b82f6 Update dependency @anthropic-ai/sdk to v0.58.0 2025-08-06 02:32:25 +00:00
renovate[bot]
073354fe04 Update dependency fs-extra to v11.3.1 2025-08-06 02:31:08 +00:00
renovate[bot]
165d093928 Update dependency @sveltejs/kit to v2.27.1 2025-08-06 02:30:30 +00:00
Elian Doran
e8cf3f4a10 Translations update from Hosted Weblate (#6552) 2025-08-06 00:02:25 +03:00
Elian Doran
2a40d6bb7e feat(react/dialogs): port upload attachments 2025-08-05 23:03:38 +03:00
Elian Doran
f196a78728 feat(react/checkbox): use bootstrap tooltip 2025-08-05 22:34:45 +03:00
Elian Doran
523c7ac273 chore(react/dialogs): improve display of description 2025-08-05 22:11:16 +03:00
Eduard Frigola
c36b00994b Added translation using Weblate (Catalan) 2025-08-05 21:09:05 +02:00
Eduard Frigola
76b856bfe5 Added translation using Weblate (Catalan) 2025-08-05 21:09:04 +02:00
Antonio Liccardo (TuxmAL)
7b084035a3 Translated using Weblate (Italian)
Currently translated at 9.6% (150 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-08-05 21:09:03 +02:00
Vincent
59fbdaa879 Translated using Weblate (French)
Currently translated at 63.7% (241 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/fr/
2025-08-05 21:09:03 +02:00
Elian Doran
ce324586f8 fix(react/dialogs): missing autocomplete opts 2025-08-05 21:15:02 +03:00
Elian Doran
35bd210062 fix(react/dialogs): recent notes not triggered in autocomplete 2025-08-05 21:15:02 +03:00
Elian Doran
0cfe3351bb feat(react/dialogs): port include_note 2025-08-05 21:15:02 +03:00
Elian Doran
7202f47716 feat(react/dialogs): port cheatsheet 2025-08-05 21:15:02 +03:00
Elian Doran
bde4545afc feat(react/dialogs): port prompt 2025-08-05 21:15:02 +03:00
Elian Doran
b3c81ce5f2 feat(react/dialogs): port password_not_set 2025-08-05 21:15:02 +03:00
Elian Doran
02b0d1fb5e refactor(react/dialogs): separate alert component 2025-08-05 21:15:02 +03:00
Elian Doran
87d9ea06f3 feat(react/dialogs): port delete_notes 2025-08-05 21:15:02 +03:00
Adorian Doran
a4e6a964c9 feat(react/dialogs): fix broken class name 2025-08-05 20:00:39 +03:00
Elian Doran
79c5d479fc feat(react/dialogs): port incorrect_cpu_arch 2025-08-05 15:39:49 +03:00
Elian Doran
8f0a9f91c1 feat(react/dialogs): port the rest of confirm 2025-08-05 15:13:09 +03:00
Elian Doran
93fae9cc8c feat(react/dialogs): port confirm dialog partially 2025-08-05 14:25:21 +03:00
Aris Kallergis
1046321117 Translated using Weblate (Greek)
Currently translated at 0.7% (11 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/el/
2025-08-05 13:22:12 +02:00
Antonio Liccardo (TuxmAL)
00fc92764b Translated using Weblate (Italian)
Currently translated at 7.1% (111 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-08-05 13:22:12 +02:00
Aris Kallergis
dea8bc307e Added translation using Weblate (Greek) 2025-08-05 11:11:45 +02:00
Kuzma Simonov
18a4fbaa4b Translated using Weblate (Russian)
Currently translated at 53.7% (838 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-08-05 11:11:44 +02:00
Hosted Weblate
3efc4b13d5 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2025-08-05 07:41:24 +02:00
Kuzma Simonov
952456a69c Translated using Weblate (Russian)
Currently translated at 53.6% (837 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-08-05 07:41:24 +02:00
Marcelo Nolasco
bde8e17fe6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (378 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pt_BR/
2025-08-05 07:41:24 +02:00
Grant Zhu
9023ba1d0a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (378 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2025-08-05 07:41:24 +02:00
Marcelo Nolasco
61f9a86685 Translated using Weblate (Portuguese (Brazil))
Currently translated at 11.7% (184 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-05 07:41:24 +02:00
Grant Zhu
5520cfed5d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1560 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-08-05 07:41:24 +02:00
Antonio Liccardo (TuxmAL)
43df984732 Translated using Weblate (Italian)
Currently translated at 3.1% (49 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-08-05 07:41:24 +02:00
wild
3f398c1a00 Translated using Weblate (Serbian)
Currently translated at 27.8% (435 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sr/
2025-08-05 07:41:24 +02:00
Antonio Liccardo (TuxmAL)
ad35e3b48f Added translation using Weblate (Italian) 2025-08-05 07:41:24 +02:00
Antonio Liccardo (TuxmAL)
73ee44e177 Added translation using Weblate (Italian) 2025-08-05 07:41:23 +02:00
Hosted Weblate
18414cd155 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2025-08-05 07:41:23 +02:00
Kuzma Simonov
652d78ac68 Translated using Weblate (Russian)
Currently translated at 36.7% (573 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-08-05 07:41:23 +02:00
wild
9a3ab05d73 Translated using Weblate (Serbian)
Currently translated at 22.4% (350 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sr/
2025-08-05 07:41:23 +02:00
Kuzma Simonov
fe238b8afd Translated using Weblate (Russian)
Currently translated at 2.3% (36 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-08-05 07:41:23 +02:00
Kuzma Simonov
94492c7535 Added translation using Weblate (Russian) 2025-08-05 07:41:23 +02:00
Hosted Weblate
47caf970a1 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/
2025-08-05 07:41:23 +02:00
Marcelo Nolasco
3e75ab39c2 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 43.3% (164 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hant/
2025-08-05 07:41:23 +02:00
Marcelo Nolasco
72aacdbf6f Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (378 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pt_BR/
2025-08-05 07:41:23 +02:00
Marcelo Nolasco
5461dafe02 Translated using Weblate (Portuguese (Brazil))
Currently translated at 5.5% (87 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-05 07:41:23 +02:00
repilac
30f9f66b8b Translated using Weblate (Japanese)
Currently translated at 0.8% (13 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-08-05 07:41:23 +02:00
Marcelo Nolasco
19de803142 Translated using Weblate (Portuguese (Brazil))
Currently translated at 75.3% (285 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pt_BR/
2025-08-05 07:41:23 +02:00
Marcelo Nolasco
11b247fe07 Translated using Weblate (Portuguese (Brazil))
Currently translated at 3.8% (60 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-08-05 07:41:23 +02:00
Elian Doran
faa40494d8 chore(deps): update typescript-eslint monorepo to v8.39.0 (#6560) 2025-08-05 08:41:14 +03:00
Elian Doran
796802aea0 chore(deps): update node.js to v22.18.0 (#6559) 2025-08-05 08:40:46 +03:00
Elian Doran
06af5cf6d5 chore(deps): update dependency chalk to v5.5.0 (#6558) 2025-08-05 08:40:29 +03:00
Elian Doran
81a99c1e44 fix(deps): update dependency marked to v16.1.2 (#6557) 2025-08-05 08:39:23 +03:00
Elian Doran
1b384f35d2 chore(deps): update dependency rollup-plugin-webpack-stats to v2.1.2 (#6556) 2025-08-05 08:38:56 +03:00
renovate[bot]
c1259f2ea2 chore(deps): update typescript-eslint monorepo to v8.39.0 2025-08-05 02:00:27 +00:00
renovate[bot]
92d9c82d97 chore(deps): update node.js to v22.18.0 2025-08-05 01:58:57 +00:00
renovate[bot]
064f0ef921 chore(deps): update dependency chalk to v5.5.0 2025-08-05 01:58:52 +00:00
renovate[bot]
e9a9b462d4 fix(deps): update dependency marked to v16.1.2 2025-08-05 01:57:55 +00:00
renovate[bot]
98888d5f1d chore(deps): update dependency rollup-plugin-webpack-stats to v2.1.2 2025-08-05 01:57:06 +00:00
Elian Doran
134c869b07 feat(react/dialog): port protected session password 2025-08-04 23:22:45 +03:00
Elian Doran
beb0487513 feat(react): port move to 2025-08-04 22:37:31 +03:00
Elian Doran
aa9ffb8f6b feat(react/dialogs): port clone_to 2025-08-04 21:17:35 +03:00
Elian Doran
18eb704b81 feat(react/widgets): set up form group 2025-08-04 20:41:25 +03:00
Elian Doran
83fb62d4df fix(react/dialogs): listener leak in modal 2025-08-04 19:54:59 +03:00
Elian Doran
cb650b70cb fix(react/dialogs): autocomplete not displayed if list is empty 2025-08-04 19:27:53 +03:00
Elian Doran
d5e42318dd feat(dialogs): port jump to note partially 2025-08-04 18:54:56 +03:00
grantzhu
24ed474c8c fix: remove unnecessary idea directory, this will affect other developers using jetbrains ide from opening this project 2025-08-04 21:24:38 +08:00
Elian Doran
a9c25b4edd chore(react): bring back focus to add_link 2025-08-04 16:05:04 +03:00
Elian Doran
c89737ae7b feat(vscode): integrate i18n with react 2025-08-04 12:59:13 +03:00
Elian Doran
e619a6ef7c feat(react): port add_link 2025-08-04 12:58:42 +03:00
Elian Doran
6a2a096348 chore(deps): update svelte monorepo (#6551) 2025-08-04 10:35:50 +03:00
renovate[bot]
bf34ef2009 chore(deps): update svelte monorepo 2025-08-04 03:00:44 +00:00
perf3ct
583ab8dc92 feat(quick_search): make sure that we rank exact matches higher when merging results with fuzzy search 2025-08-03 21:29:18 +00:00
perf3ct
db1619af31 feat(quick_search): change the results to use the warning accent color? 2025-08-03 21:22:41 +00:00
Elian Doran
9cddb9ac1d fix(docs): fix notes -> trilium for docker install (#6543) 2025-08-04 00:15:09 +03:00
Elian Doran
d72d3db2a0 Translations update from Hosted Weblate (#6540) 2025-08-04 00:09:02 +03:00
perf3ct
22740a6c8d feat(quick_search): add tests for updated fuzzy search progressive fuzzy search functionality 2025-08-03 21:02:56 +00:00
perf3ct
e9409577db feat(quick_search): only "fallback" to fuzzy search, if there aren't that many search results found from user's query 2025-08-03 20:43:16 +00:00
perf3ct
9cef8c8e70 feat(quick_search): try using another color so that matches stand out more? might change back 2025-08-03 20:42:52 +00:00
perf3ct
53bcec602d feat(quick_search): result titles are now aligned, inline with result text 2025-08-03 20:22:30 +00:00
Elian Doran
a62f12b427 feat(react): port info modal 2025-08-03 23:20:32 +03:00
perf3ct
e20816a7ce feat(quick_search): getting closer to how we want the quick search results to look with the spacing... 2025-08-03 19:49:43 +00:00
perf3ct
58535df676 feat(quick_search): within the quick search, allow for "infinite" scrolling of results 2025-08-03 19:49:43 +00:00
perf3ct
057040af06 feat(quick_search): limit the size of the Notes to search through, to 2MB 2025-08-03 19:49:43 +00:00
perf3ct
c603783a44 feat(quick_search): show the "matched" text in the search results, even if "edit distance" (misspelling) occurs 2025-08-03 19:49:43 +00:00
perf3ct
1928356ad5 feat(quick_search): edit distance searching in quick search works 2025-08-03 19:49:43 +00:00
Elian Doran
e53ad2c62a chore(react): reintroduce max width 2025-08-03 21:39:25 +03:00
Elian Doran
bca397e3e4 feat(react): port sort child notes 2025-08-03 21:18:18 +03:00
repilac
14b3bea203 Added translation using Weblate (Japanese) 2025-08-03 20:05:49 +02:00
Aitanuqui
05c26d17d3 Translated using Weblate (Spanish)
Currently translated at 100.0% (378 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/es/
2025-08-03 20:05:49 +02:00
KeSch
51360d855a Translated using Weblate (German)
Currently translated at 61.6% (233 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/
2025-08-03 20:05:48 +02:00
Aitanuqui
ae7d03e3c7 Translated using Weblate (Spanish)
Currently translated at 100.0% (1560 of 1560 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2025-08-03 20:05:48 +02:00
Elian Doran
164feaa3ec fix(react): button not working as submit 2025-08-03 20:01:54 +03:00
Elian Doran
4d09fabad8 feat(react): slightly faster about 2025-08-03 20:00:30 +03:00
Jon Fuller
87e1ce64d1 fix(docs): fix notes -> trilium for docker install 2025-08-03 09:55:50 -07:00
Elian Doran
04913394c6 chore(react): clean up 2025-08-03 19:50:39 +03:00
Elian Doran
f8b563704f feat(react): add hlep page to branch prefix 2025-08-03 19:48:44 +03:00
Elian Doran
5d9bd0f6d3 feat(react): port branch prefix 2025-08-03 19:44:15 +03:00
Elian Doran
1229c26098 chore(react): add back Ctrl+Enter for markdown import 2025-08-03 19:06:21 +03:00
Elian Doran
77818d5453 feat(react): port markdown_import partially 2025-08-03 18:06:06 +03:00
liqiuchen1988
f9c7c5637b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (378 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2025-08-03 13:33:38 +00:00
liqiuchen1988
5d55b0b0a8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 84.6% (1320 of 1559 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-08-03 13:33:37 +00:00
Aitanuqui
b2d7fbbcad Translated using Weblate (Spanish)
Currently translated at 96.8% (366 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/es/
2025-08-03 13:33:37 +00:00
liqiuchen1988
fbc6734e08 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 84.6% (320 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2025-08-03 13:33:36 +00:00
Aitanuqui
a83172390f Translated using Weblate (Spanish)
Currently translated at 100.0% (1559 of 1559 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2025-08-03 13:33:35 +00:00
Elian Doran
4b1fd5e4a0 Basic React wrapper (#6542) 2025-08-03 16:33:29 +03:00
Elian Doran
51495b282f fix(board): items not displayed recursively 2025-08-03 16:23:18 +03:00
Elian Doran
b645d21fcd refactor(client): deduplicate app info type 2025-08-03 16:22:54 +03:00
Elian Doran
8f99ce7d14 fix(react): type errors 2025-08-03 16:04:19 +03:00
Elian Doran
6eb650bb22 chore(deps): update package lock 2025-08-03 15:30:01 +03:00
Elian Doran
a7f5702221 feat(react): port about dialog 2025-08-03 15:29:57 +03:00
Elian Doran
efeb9b90ca feat(react): basic integration for basic widget & modal 2025-08-03 13:39:23 +03:00
Elian Doran
3361a2e4ab feat(react): set up client to support Preact with JSX 2025-08-03 13:28:40 +03:00
Elian Doran
425ade5212 fix(hidden_subtree): launcher branches created both in visible & available (closes #6537) 2025-08-03 11:12:21 +03:00
Elian Doran
384ab1d1f3 feat(docs): update doc references from triliumnext/notes to triliumnext/trilium (#6535) 2025-08-03 10:48:37 +03:00
Elian Doran
70b1a37285 docs: sync changes to repo URL 2025-08-03 10:48:06 +03:00
Elian Doran
61a878e2a0 chore(deps): update dependency typescript to v5.9.2 (#6526) 2025-08-03 10:15:10 +03:00
Elian Doran
319cb8384c Translations update from Hosted Weblate (#6534) 2025-08-03 10:12:50 +03:00
perfectra1n
2d358342c5 feat(client): try to stylize the quick search even further in the client 2025-08-02 23:44:51 -07:00
renovate[bot]
dd7ee05388 chore(deps): update dependency typescript to v5.9.2 2025-08-03 05:28:24 +00:00
perf3ct
6c79be881d feat(search): allow for search through very large notes 2025-08-03 01:44:55 +00:00
perf3ct
51a8937c64 feat(quick_search): also try to show the "matched" text in quick search results and not just note titles 2025-08-03 00:29:21 +00:00
perf3ct
c436455b32 feat(tests): implement tests for updated fuzzy search operators, and text_utils used in search 2025-08-03 00:16:47 +00:00
perf3ct
f740edae91 fix(docs): revert references that were full URLs to old Notes repo 2025-08-03 00:10:02 +00:00
perf3ct
18f89b979d feat(search): normalize search text (fonts, etc.) 2025-08-02 23:59:45 +00:00
perf3ct
8094259c78 feat(search): implement edit_distances (misspelling tolerances) into fulltext search 2025-08-02 23:59:21 +00:00
perf3ct
b4f503b81e feat(search): implement additional operators (with bounds) for search comparison 2025-08-02 23:59:11 +00:00
perf3ct
4db04519bd feat(search): implement additional weights for search_results, normalize text as well 2025-08-02 23:56:23 +00:00
perf3ct
464c2bdf28 feat(docs): update doc references from triliumnext/notes to triliumnext/trilium 2025-08-02 23:48:39 +00:00
wild
8007bac8b8 Translated using Weblate (Serbian)
Currently translated at 20.5% (320 of 1559 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sr/
2025-08-03 01:01:53 +02:00
Elian Doran
7a1ec266ad chore(release): prepare for v0.97.2 2025-08-02 23:34:39 +03:00
Elian Doran
42fedaa241 chore(deps): update nx monorepo to v21.3.11 (#6523) 2025-08-02 10:38:29 +03:00
renovate[bot]
4387bd4c6f chore(deps): update nx monorepo to v21.3.11 2025-08-02 07:22:22 +00:00
Elian Doran
51e1367b82 chore(deps): update dependency typescript to v5.9.2 (#6525) 2025-08-02 10:17:05 +03:00
renovate[bot]
8bea3f4422 chore(deps): update dependency typescript to v5.9.2 2025-08-02 07:00:23 +00:00
Elian Doran
0eb2e405ff chore(deps): update node.js to v22.18.0 (#6527) 2025-08-02 09:57:18 +03:00
Elian Doran
5dbd4a765f fix(deps): update dependency @codemirror/lang-markdown to v6.3.4 (#6524) 2025-08-02 09:57:04 +03:00
Elian Doran
f6961c7e06 chore(deps): update dependency typedoc to v0.28.9 (#6522) 2025-08-02 09:56:38 +03:00
Elian Doran
8d3ba90072 chore(deps): update dependency electron to v37.2.5 (#6521) 2025-08-02 09:55:22 +03:00
Elian Doran
3772412d82 chore(deps): update dependency @playwright/test to v1.54.2 (#6520) 2025-08-02 09:55:05 +03:00
Elian Doran
84389f467e chore(deps): update pnpm to v10.14.0 (#6528) 2025-08-02 09:54:42 +03:00
Elian Doran
eb41e0f96f chore(deps): update svelte monorepo (#6529) 2025-08-02 09:53:44 +03:00
renovate[bot]
2d44dff997 chore(deps): update svelte monorepo 2025-08-02 02:29:36 +00:00
renovate[bot]
1483bf3d46 chore(deps): update pnpm to v10.14.0 2025-08-02 02:28:49 +00:00
renovate[bot]
064cf6a3ee chore(deps): update node.js to v22.18.0 2025-08-02 02:28:39 +00:00
renovate[bot]
0c0d5eaa0a fix(deps): update dependency @codemirror/lang-markdown to v6.3.4 2025-08-02 02:27:03 +00:00
renovate[bot]
afecb33b5c chore(deps): update dependency typedoc to v0.28.9 2025-08-02 02:25:23 +00:00
renovate[bot]
fbb1e3a302 chore(deps): update dependency electron to v37.2.5 2025-08-02 02:25:17 +00:00
renovate[bot]
8704350359 chore(deps): update dependency @playwright/test to v1.54.2 2025-08-02 02:24:27 +00:00
Elian Doran
d09e725d98 fix(note_list): copy to clipboard button also opening note 2025-08-01 13:07:58 +03:00
Elian Doran
8be5b149c4 fix(note_list): note tooltip showing up 2025-08-01 13:05:17 +03:00
Elian Doran
faeea6af18 Merge branch 'main' of github.com:TriliumNext/trilium 2025-08-01 00:23:13 +03:00
Elian Doran
3fa5ea1010 docs(readme): mention translations 2025-08-01 00:23:09 +03:00
Elian Doran
6aa31ae125 Translations update from Hosted Weblate (#6516) 2025-08-01 00:13:50 +03:00
wild
27f2e9c286 Translated using Weblate (Serbian)
Currently translated at 9.1% (142 of 1559 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sr/
2025-07-31 21:05:37 +00:00
Aitanuqui
67cc36fdd2 Translated using Weblate (Spanish)
Currently translated at 89.4% (338 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/es/
2025-07-31 21:05:36 +00:00
Aitanuqui
ef7297e03b Translated using Weblate (Spanish)
Currently translated at 96.4% (1503 of 1559 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2025-07-31 21:05:35 +00:00
wild
97a5314cdb Added translation using Weblate (Serbian) 2025-07-31 21:05:34 +00:00
Elian Doran
a1195a2856 feat(search): support doc notes (closes #6515) 2025-08-01 00:05:17 +03:00
Elian Doran
81419c6fe3 Translations update from Hosted Weblate (#6514) 2025-07-31 11:52:22 +03:00
Elian Doran
b8da793353 Translated using Weblate (Romanian)
Currently translated at 99.7% (377 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ro/
2025-07-31 10:51:13 +02:00
Adorian Doran
8140fa79cc Translated using Weblate (Romanian)
Currently translated at 99.7% (377 of 378 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ro/
2025-07-31 10:51:12 +02:00
Elian Doran
abff4fe67d Translated using Weblate (Romanian)
Currently translated at 100.0% (1559 of 1559 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ro/
2025-07-31 10:51:12 +02:00
Elian Doran
ec8f737eba Translations update from Hosted Weblate (#6513) 2025-07-31 09:22:49 +03:00
Hosted Weblate
cc6688ea00 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2025-07-31 08:09:52 +02:00
Elian Doran
c448b29be7 chore(deps): update nx monorepo to v21.3.10 (#6511) 2025-07-31 08:04:27 +03:00
Elian Doran
61bde294b3 chore(deps): update dependency openai to v5.11.0 (#6512) 2025-07-31 08:03:35 +03:00
Elian Doran
acab81c61e chore(deps): update dependency eslint-plugin-playwright to v2.2.2 (#6510) 2025-07-31 08:03:20 +03:00
Elian Doran
1dd965973b chore(deps): update dependency @types/tabulator-tables to v6.2.9 (#6509) 2025-07-31 08:03:07 +03:00
renovate[bot]
d61981033f chore(deps): update dependency openai to v5.11.0 2025-07-31 01:17:46 +00:00
renovate[bot]
30197ba7ce chore(deps): update nx monorepo to v21.3.10 2025-07-31 01:17:03 +00:00
renovate[bot]
1b6c957334 chore(deps): update dependency eslint-plugin-playwright to v2.2.2 2025-07-31 01:16:19 +00:00
renovate[bot]
fb7a397bf9 chore(deps): update dependency @types/tabulator-tables to v6.2.9 2025-07-31 01:15:39 +00:00
Elian Doran
133c9c5a7b Remove unmaintained hotkeys dependency (#6507) 2025-07-31 00:02:29 +03:00
Elian Doran
8a587d4d21 chore(client): fix typecheck issues 2025-07-30 23:46:43 +03:00
Elian Doran
29b813fa3b Merge remote-tracking branch 'origin/main' into feature/replace_hotkeys_library 2025-07-30 23:29:16 +03:00
Elian Doran
d5866a99ec test(hotkeys): add some basic tests 2025-07-30 19:30:27 +03:00
Elian Doran
5289d41b12 fix(hotkeys): shortcuts with number keys not working 2025-07-30 14:43:37 +03:00
Elian Doran
030178cad2 fix(hotkeys): errors on mouse clicks 2025-07-30 14:29:59 +03:00
Elian Doran
5d00630452 refactor(hotkeys): simplify normalization 2025-07-30 14:26:51 +03:00
Elian Doran
eb805bfa2a refactor(hotkeys): remove no longer necessary library 2025-07-30 14:19:02 +03:00
Elian Doran
ee3a8e105e refactor(hotkeys): remove unnecessary initialization code 2025-07-30 14:18:09 +03:00
Elian Doran
97fb273e7f fix(hotkeys): tree not using the right API 2025-07-30 14:15:29 +03:00
Elian Doran
2ef9009384 refactor(hotkeys): use own (rough) implementation 2025-07-30 14:11:41 +03:00
330 changed files with 23985 additions and 13716 deletions

View File

@@ -162,3 +162,25 @@ runs:
echo "Found ZIP: $zip_file"
echo "Note: ZIP files are not code signed, but their contents should be"
fi
- name: Sign the RPM
if: inputs.os == 'linux'
shell: ${{ inputs.shell }}
run: |
echo -n "$GPG_SIGNING_KEY" | base64 --decode | gpg --import
# Import the key into RPM for verification
gpg --export -a > pubkey
rpm --import pubkey
rm pubkey
# Sign the RPM
rpm_file=$(find ./apps/desktop/upload -name "*.rpm" -print -quit)
rpmsign --define "_gpg_name Trilium Notes Signing Key <triliumnotes@outlook.com>" --addsign "$rpm_file"
rpm -Kv "$rpm_file"
# Validate code signing
if ! rpm -K "$rpm_file" | grep -q "digests signatures OK"; then
echo .rpm file not signed
exit 1
fi

View File

@@ -44,7 +44,7 @@ runs:
steps:
# Checkout branch to compare to [required]
- name: Checkout base branch
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
ref: ${{ inputs.branch }}
path: br-base

View File

@@ -4,7 +4,7 @@ applyTo: '**'
// This file is automatically generated by Nx Console
You are in an nx workspace using Nx 21.3.5 and pnpm as the package manager.
You are in an nx workspace using Nx 21.3.9 and pnpm as the package manager.
You have access to the Nx MCP server and the tools it provides. Use them. Follow these guidelines in order to best help the user:

View File

@@ -57,7 +57,7 @@ jobs:
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
# Add any setup steps before running the `github/codeql-action/init` action.
# This includes steps like installing compilers or runtimes (`actions/setup-node`

View File

@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 0 # needed for https://github.com/marketplace/actions/nx-set-shas
@@ -48,7 +48,7 @@ jobs:
- check-affected
steps:
- name: Checkout the repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- name: Set up node & dependencies
@@ -68,7 +68,7 @@ jobs:
- test_dev
- check-affected
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- name: Install dependencies
run: pnpm install --frozen-lockfile
@@ -103,7 +103,7 @@ jobs:
- dockerfile: Dockerfile
steps:
- name: Checkout the repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- name: Install dependencies

View File

@@ -32,7 +32,7 @@ jobs:
- dockerfile: Dockerfile
steps:
- name: Checkout the repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Set IMAGE_NAME to lowercase
run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV
@@ -141,7 +141,7 @@ jobs:
run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- name: Set up node & dependencies
uses: actions/setup-node@v4
@@ -223,7 +223,7 @@ jobs:
- build
steps:
- name: Download digests
uses: actions/download-artifact@v4
uses: actions/download-artifact@v5
with:
path: /tmp/digests
pattern: digests-*

View File

@@ -27,6 +27,7 @@ permissions:
jobs:
nightly-electron:
if: github.repository == 'TriliumNext/Trilium'
name: Deploy nightly
strategy:
fail-fast: false
@@ -47,7 +48,7 @@ jobs:
forge_platform: win32
runs-on: ${{ matrix.os.image }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- name: Set up node & dependencies
uses: actions/setup-node@v4
@@ -75,6 +76,7 @@ jobs:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
- name: Publish release
uses: softprops/action-gh-release@v2.3.2
@@ -96,6 +98,7 @@ jobs:
path: apps/desktop/upload
nightly-server:
if: github.repository == 'TriliumNext/Trilium'
name: Deploy server nightly
strategy:
fail-fast: false
@@ -108,7 +111,7 @@ jobs:
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Run the build
uses: ./.github/actions/build-server

View File

@@ -14,7 +14,7 @@ jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
filter: tree:0
fetch-depth: 0

View File

@@ -32,7 +32,7 @@ jobs:
forge_platform: win32
runs-on: ${{ matrix.os.image }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- name: Set up node & dependencies
uses: actions/setup-node@v4
@@ -58,6 +58,7 @@ jobs:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
- name: Upload the artifact
uses: actions/upload-artifact@v4
@@ -78,7 +79,7 @@ jobs:
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Run the build
uses: ./.github/actions/build-server
@@ -101,13 +102,13 @@ jobs:
steps:
- run: mkdir upload
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
sparse-checkout: |
docs/Release Notes
- name: Download all artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v5
with:
merge-multiple: true
pattern: release-*

11
.github/workflows/unblock_signing.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
name: Unblock signing
on:
workflow_dispatch:
jobs:
unblock-win-signing:
runs-on: win-signing
steps:
- run: |
cat ${{ vars.WINDOWS_SIGN_ERROR_LOG }}
rm ${{ vars.WINDOWS_SIGN_ERROR_LOG }}

1
.gitignore vendored
View File

@@ -10,6 +10,7 @@ node_modules
# IDEs and editors
/.idea
.idea
.project
.classpath
.c9/

6
.idea/.gitignore generated vendored
View File

@@ -1,6 +0,0 @@
# Default ignored files
/workspace.xml
# Datasource local storage ignored files
/dataSources.local.xml
/dataSources/

View File

@@ -1,15 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</value>
</option>
<codeStyleSettings language="JSON">
<indentOptions>
<option name="INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

View File

@@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

12
.idea/dataSources.xml generated
View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="document.db" uuid="2a4ac1e6-b828-4a2a-8e4a-3f59f10aff26">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/data/document.db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

4
.idea/encodings.xml generated
View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GitToolBoxProjectSettings">
<option name="commitMessageIssueKeyValidationOverride">
<BoolValueOverride>
<option name="enabled" value="true" />
</BoolValueOverride>
</option>
<option name="commitMessageValidationEnabledOverride">
<BoolValueOverride>
<option name="enabled" value="true" />
</BoolValueOverride>
</option>
</component>
</project>

View File

@@ -1,11 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
</profile>
</component>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<includedPredefinedLibrary name="Node.js Core" />
</component>
</project>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JSLintConfiguration">
<option devel="true" />
<option es6="true" />
<option maxerr="50" />
<option node="true" />
</component>
</project>

8
.idea/misc.xml generated
View File

@@ -1,8 +0,0 @@
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_16" default="true" project-jdk-name="openjdk-16" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/trilium.iml" filepath="$PROJECT_DIR$/trilium.iml" />
</modules>
</component>
</project>

7
.idea/sqldialects.xml generated
View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$" dialect="SQLite" />
<file url="PROJECT" dialect="SQLite" />
</component>
</project>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

2
.nvmrc
View File

@@ -1 +1 @@
22.17.1
22.18.0

View File

@@ -3,6 +3,7 @@
languageIds:
- javascript
- typescript
- typescriptreact
- html
# An array of RegExes to find the key usage. **The key should be captured in the first match group**.
@@ -25,9 +26,10 @@ scopeRangeRegex: "useTranslation\\(\\s*\\[?\\s*['\"`](.*?)['\"`]"
# The "$1" will be replaced by the keypath specified.
refactorTemplates:
- t("$1")
- {t("$1")}
- ${t("$1")}
- <%= t("$1") %>
# If set to true, only enables this custom framework (will disable all built-in frameworks)
monopoly: true
monopoly: true

View File

@@ -1,12 +1,11 @@
# Trilium Notes
Donate: ![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran?style=flat-square) ![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran?style=flat-square)
![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) ![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)
![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/notes)
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/notes/total)
[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [![Translation status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/)
![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/notes?style=flat-square)
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/notes/total?style=flat-square)
[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop&style=flat-square)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp)
[English](./README.md) | [Chinese](./docs/README-ZH_CN.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
@@ -83,7 +82,7 @@ Feel free to join our official conversations. We would love to hear what feature
### Windows / MacOS
Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the `trilium` executable.
Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package and run the `trilium` executable.
### Linux
@@ -91,7 +90,7 @@ If your distribution is listed in the table below, use your distribution's packa
[![Packaging status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions)
You may also download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the `trilium` executable.
You may also download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package and run the `trilium` executable.
TriliumNext is also provided as a Flatpak, but not yet published on FlatHub.
@@ -111,11 +110,19 @@ See issue https://github.com/TriliumNext/Notes/issues/72 for more information on
### Server
To install TriliumNext on your own server (including via Docker from [Dockerhub](https://hub.docker.com/r/triliumnext/notes)) follow [the server installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation).
To install TriliumNext on your own server (including via Docker from [Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation).
## 💻 Contribute
### Translations
If you are a native speaker, help us translate Trilium by heading over to our [Weblate page](https://hosted.weblate.org/engage/trilium/).
Here's the language coverage we have so far:
[![Translation status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/)
### Code
Download the repository, install dependencies using `pnpm` and then run the server (available at http://localhost:8080):

View File

@@ -35,13 +35,13 @@
"chore:generate-openapi": "tsx bin/generate-openapi.js"
},
"devDependencies": {
"@playwright/test": "1.54.1",
"@stylistic/eslint-plugin": "5.2.2",
"@playwright/test": "1.54.2",
"@stylistic/eslint-plugin": "5.2.3",
"@types/express": "5.0.3",
"@types/node": "22.17.0",
"@types/node": "22.17.1",
"@types/yargs": "17.0.33",
"@vitest/coverage-v8": "3.2.4",
"eslint": "9.32.0",
"eslint": "9.33.0",
"eslint-plugin-simple-import-sort": "12.1.1",
"esm": "3.2.25",
"jsdoc": "4.0.4",
@@ -49,8 +49,8 @@
"rcedit": "4.0.1",
"rimraf": "6.0.1",
"tslib": "2.8.1",
"typedoc": "0.28.8",
"typedoc-plugin-missing-exports": "4.0.0"
"typedoc": "0.28.10",
"typedoc-plugin-missing-exports": "4.1.0"
},
"optionalDependencies": {
"appdmg": "0.6.6"

View File

@@ -1,6 +1,6 @@
{
"name": "@triliumnext/client",
"version": "0.97.1",
"version": "0.97.2",
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
"private": true,
"license": "AGPL-3.0-only",
@@ -10,14 +10,14 @@
"url": "https://github.com/TriliumNext/Notes"
},
"dependencies": {
"@eslint/js": "9.32.0",
"@eslint/js": "9.33.0",
"@excalidraw/excalidraw": "0.18.0",
"@fullcalendar/core": "6.1.18",
"@fullcalendar/daygrid": "6.1.18",
"@fullcalendar/interaction": "6.1.18",
"@fullcalendar/list": "6.1.18",
"@fullcalendar/multimonth": "6.1.18",
"@fullcalendar/timegrid": "6.1.18",
"@fullcalendar/core": "6.1.19",
"@fullcalendar/daygrid": "6.1.19",
"@fullcalendar/interaction": "6.1.19",
"@fullcalendar/list": "6.1.19",
"@fullcalendar/multimonth": "6.1.19",
"@fullcalendar/timegrid": "6.1.19",
"@maplibre/maplibre-gl-leaflet": "0.1.3",
"@mermaid-js/layout-elk": "0.1.8",
"@mind-elixir/node-menu": "5.0.0",
@@ -36,10 +36,9 @@
"draggabilly": "3.0.0",
"force-graph": "1.50.1",
"globals": "16.3.0",
"i18next": "25.3.2",
"i18next": "25.3.4",
"i18next-http-backend": "3.0.2",
"jquery": "3.7.1",
"jquery-hotkeys": "0.2.2",
"jquery.fancytree": "2.38.5",
"jsplumb": "2.15.6",
"katex": "0.16.22",
@@ -47,9 +46,9 @@
"leaflet": "1.9.4",
"leaflet-gpx": "2.2.0",
"mark.js": "8.11.1",
"marked": "16.1.1",
"marked": "16.1.2",
"mermaid": "11.9.0",
"mind-elixir": "5.0.4",
"mind-elixir": "5.0.5",
"normalize.css": "8.0.1",
"panzoom": "9.4.3",
"preact": "10.27.0",
@@ -60,13 +59,14 @@
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": "5.0.0",
"@preact/preset-vite": "2.10.2",
"@types/bootstrap": "5.2.10",
"@types/jquery": "3.5.32",
"@types/leaflet": "1.9.20",
"@types/leaflet-gpx": "1.3.7",
"@types/mark.js": "8.11.12",
"@types/tabulator-tables": "6.2.8",
"copy-webpack-plugin": "13.0.0",
"@types/tabulator-tables": "6.2.10",
"copy-webpack-plugin": "13.0.1",
"happy-dom": "18.0.1",
"script-loader": "0.7.2",
"vite-plugin-static-copy": "3.1.1"

View File

@@ -30,6 +30,7 @@ import type CodeMirror from "@triliumnext/codemirror";
import { StartupChecks } from "./startup_checks.js";
import type { CreateNoteOpts } from "../services/note_create.js";
import { ColumnComponent } from "tabulator-tables";
import { ChooseNoteTypeCallback } from "../widgets/dialogs/note_type_chooser.jsx";
interface Layout {
getRootWidget: (appContext: AppContext) => RootWidget;
@@ -92,7 +93,9 @@ export type CommandMappings = {
closeTocCommand: CommandData;
closeHlt: CommandData;
showLaunchBarSubtree: CommandData;
showRevisions: CommandData;
showRevisions: CommandData & {
noteId?: string | null;
};
showLlmChat: CommandData;
createAiChat: CommandData;
showOptions: CommandData & {
@@ -266,6 +269,72 @@ export type CommandMappings = {
jumpToNote: CommandData;
commandPalette: CommandData;
// Keyboard shortcuts
backInNoteHistory: CommandData;
forwardInNoteHistory: CommandData;
forceSaveRevision: CommandData;
scrollToActiveNote: CommandData;
quickSearch: CommandData;
collapseTree: CommandData;
createNoteAfter: CommandData;
createNoteInto: CommandData;
addNoteAboveToSelection: CommandData;
addNoteBelowToSelection: CommandData;
openNewTab: CommandData;
activateNextTab: CommandData;
activatePreviousTab: CommandData;
openNewWindow: CommandData;
toggleTray: CommandData;
firstTab: CommandData;
secondTab: CommandData;
thirdTab: CommandData;
fourthTab: CommandData;
fifthTab: CommandData;
sixthTab: CommandData;
seventhTab: CommandData;
eigthTab: CommandData;
ninthTab: CommandData;
lastTab: CommandData;
showNoteSource: CommandData;
showSQLConsole: CommandData;
showBackendLog: CommandData;
showCheatsheet: CommandData;
showHelp: CommandData;
addLinkToText: CommandData;
followLinkUnderCursor: CommandData;
insertDateTimeToText: CommandData;
pasteMarkdownIntoText: CommandData;
cutIntoNote: CommandData;
addIncludeNoteToText: CommandData;
editReadOnlyNote: CommandData;
toggleRibbonTabClassicEditor: CommandData;
toggleRibbonTabBasicProperties: CommandData;
toggleRibbonTabBookProperties: CommandData;
toggleRibbonTabFileProperties: CommandData;
toggleRibbonTabImageProperties: CommandData;
toggleRibbonTabOwnedAttributes: CommandData;
toggleRibbonTabInheritedAttributes: CommandData;
toggleRibbonTabPromotedAttributes: CommandData;
toggleRibbonTabNoteMap: CommandData;
toggleRibbonTabNoteInfo: CommandData;
toggleRibbonTabNotePaths: CommandData;
toggleRibbonTabSimilarNotes: CommandData;
toggleRightPane: CommandData;
printActiveNote: CommandData;
exportAsPdf: CommandData;
openNoteExternally: CommandData;
renderActiveNote: CommandData;
unhoist: CommandData;
reloadFrontendApp: CommandData;
openDevTools: CommandData;
findInText: CommandData;
toggleLeftPane: CommandData;
toggleFullscreen: CommandData;
zoomOut: CommandData;
zoomIn: CommandData;
zoomReset: CommandData;
copyWithoutFormatting: CommandData;
// Geomap
deleteFromMap: { noteId: string };
@@ -302,6 +371,9 @@ export type CommandMappings = {
};
refreshTouchBar: CommandData;
reloadTextEditor: CommandData;
chooseNoteType: CommandData & {
callback: ChooseNoteTypeCallback
}
};
type EventMappings = {

View File

@@ -30,13 +30,6 @@ interface CreateChildrenResponse {
export default class Entrypoints extends Component {
constructor() {
super();
if (jQuery.hotkeys) {
// hot keys are active also inside inputs and content editables
jQuery.hotkeys.options.filterInputAcceptingElements = false;
jQuery.hotkeys.options.filterContentEditable = false;
jQuery.hotkeys.options.filterTextInputs = false;
}
}
openDevToolsCommand() {

View File

@@ -13,7 +13,6 @@ import type ElectronRemote from "@electron/remote";
import type Electron from "electron";
import "./stylesheets/bootstrap.scss";
import "boxicons/css/boxicons.min.css";
import "jquery-hotkeys";
import "autocomplete.js/index_jquery.js";
await appContext.earlyInit();

View File

@@ -30,6 +30,7 @@ import ClassicEditorToolbar from "../widgets/ribbon_widgets/classic_editor_toolb
import PromotedAttributesWidget from "../widgets/ribbon_widgets/promoted_attributes.js";
import NoteDetailWidget from "../widgets/note_detail.js";
import NoteListWidget from "../widgets/note_list.js";
import { CallToActionDialog } from "../widgets/dialogs/call_to_action.jsx";
export function applyModals(rootContainer: RootContainer) {
rootContainer
@@ -66,4 +67,5 @@ export function applyModals(rootContainer: RootContainer) {
.child(new PromotedAttributesWidget())
.child(new NoteDetailWidget())
.child(new NoteListWidget(true)))
.child(new CallToActionDialog());
}

View File

@@ -26,6 +26,7 @@ import TabRowWidget from "../widgets/tab_row.js";
import RefreshButton from "../widgets/floating_buttons/refresh_button.js";
import MobileEditorToolbar from "../widgets/ribbon_widgets/mobile_editor_toolbar.js";
import { applyModals } from "./layout_commons.js";
import CloseZenButton from "../widgets/close_zen_button.js";
const MOBILE_CSS = `
<style>
@@ -174,7 +175,8 @@ export default class MobileLayout {
.id("mobile-bottom-bar")
.child(new TabRowWidget().css("height", "40px"))
.child(new FlexContainer("row").class("horizontal").css("height", "53px").child(new LauncherContainer(true)).child(new GlobalMenuWidget(true)).id("launcher-pane"))
);
)
.child(new CloseZenButton());
applyModals(rootContainer);
return rootContainer;
}

View File

@@ -38,8 +38,8 @@ export interface Suggestion {
commandShortcut?: string;
}
interface Options {
container?: HTMLElement;
export interface Options {
container?: HTMLElement | null;
fastSearch?: boolean;
allowCreatingNotes?: boolean;
allowJumpToSearchNotes?: boolean;
@@ -82,12 +82,12 @@ async function autocompleteSource(term: string, cb: (rows: Suggestion[]) => void
// Check if we're in command mode
if (options.isCommandPalette && term.startsWith(">")) {
const commandQuery = term.substring(1).trim();
// Get commands (all if no query, filtered if query provided)
const commands = commandQuery.length === 0
const commands = commandQuery.length === 0
? commandRegistry.getAllCommands()
: commandRegistry.searchCommands(commandQuery);
// Convert commands to suggestions
const commandSuggestions: Suggestion[] = commands.map(cmd => ({
action: "command",
@@ -99,7 +99,7 @@ async function autocompleteSource(term: string, cb: (rows: Suggestion[]) => void
commandShortcut: cmd.shortcut,
icon: cmd.icon
}));
cb(commandSuggestions);
return;
}
@@ -452,6 +452,21 @@ function init() {
};
}
/**
* Convenience function which triggers the display of recent notes in the autocomplete input and focuses it.
*
* @param inputElement - The input element to trigger recent notes on.
*/
export function triggerRecentNotes(inputElement: HTMLInputElement | null | undefined) {
if (!inputElement) {
return;
}
const $el = $(inputElement);
showRecentNotes($el);
$el.trigger("focus").trigger("select");
}
export default {
autocompleteSourceForCKEditor,
initNoteAutocomplete,

View File

@@ -109,8 +109,6 @@ async function createNote(parentNotePath: string | undefined, options: CreateNot
async function chooseNoteType() {
return new Promise<ChooseNoteTypeResponse>((res) => {
// TODO: Remove ignore after callback for chooseNoteType is defined in app_context.ts
//@ts-ignore
appContext.triggerCommand("chooseNoteType", { callback: res });
});
}

View File

@@ -13,8 +13,8 @@ let openTooltipElements: JQuery<HTMLElement>[] = [];
let dismissTimer: ReturnType<typeof setTimeout>;
function setupGlobalTooltip() {
$(document).on("mouseenter", "a", mouseEnterHandler);
$(document).on("mouseenter", "[data-href]", mouseEnterHandler);
$(document).on("mouseenter", "a:not(.no-tooltip-preview)", mouseEnterHandler);
$(document).on("mouseenter", "[data-href]:not(.no-tooltip-preview)", mouseEnterHandler);
// close any note tooltip after click, this fixes the problem that sometimes tooltips remained on the screen
$(document).on("click", (e) => {

View File

@@ -0,0 +1,323 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
import shortcuts, { keyMatches, matchesShortcut } from "./shortcuts.js";
// Mock utils module
vi.mock("./utils.js", () => ({
default: {
isDesktop: () => true
}
}));
// Mock jQuery globally since it's used in the shortcuts module
const mockElement = {
addEventListener: vi.fn(),
removeEventListener: vi.fn()
};
const mockJQuery = vi.fn(() => [mockElement]);
(mockJQuery as any).length = 1;
mockJQuery[0] = mockElement;
(global as any).$ = mockJQuery as any;
global.document = mockElement as any;
describe("shortcuts", () => {
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
// Clean up any active bindings after each test
shortcuts.removeGlobalShortcut("test-namespace");
});
describe("normalizeShortcut", () => {
it("should normalize shortcut to lowercase and remove whitespace", () => {
expect(shortcuts.normalizeShortcut("Ctrl + A")).toBe("ctrl+a");
expect(shortcuts.normalizeShortcut(" SHIFT + F1 ")).toBe("shift+f1");
expect(shortcuts.normalizeShortcut("Alt+Space")).toBe("alt+space");
});
it("should handle empty or null shortcuts", () => {
expect(shortcuts.normalizeShortcut("")).toBe("");
expect(shortcuts.normalizeShortcut(null as any)).toBe(null);
expect(shortcuts.normalizeShortcut(undefined as any)).toBe(undefined);
});
it("should handle shortcuts with multiple spaces", () => {
expect(shortcuts.normalizeShortcut("Ctrl + Shift + A")).toBe("ctrl+shift+a");
});
it("should warn about malformed shortcuts", () => {
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
shortcuts.normalizeShortcut("ctrl+");
shortcuts.normalizeShortcut("+a");
shortcuts.normalizeShortcut("ctrl++a");
expect(consoleSpy).toHaveBeenCalledTimes(3);
consoleSpy.mockRestore();
});
});
describe("keyMatches", () => {
const createKeyboardEvent = (key: string, code?: string) => ({
key,
code: code || `Key${key.toUpperCase()}`
} as KeyboardEvent);
it("should match regular letter keys using key code", () => {
const event = createKeyboardEvent("a", "KeyA");
expect(keyMatches(event, "a")).toBe(true);
expect(keyMatches(event, "A")).toBe(true);
});
it("should match number keys using digit codes", () => {
const event = createKeyboardEvent("1", "Digit1");
expect(keyMatches(event, "1")).toBe(true);
});
it("should match special keys using key mapping", () => {
expect(keyMatches({ key: "Enter" } as KeyboardEvent, "return")).toBe(true);
expect(keyMatches({ key: "Enter" } as KeyboardEvent, "enter")).toBe(true);
expect(keyMatches({ key: "Delete" } as KeyboardEvent, "del")).toBe(true);
expect(keyMatches({ key: "Escape" } as KeyboardEvent, "esc")).toBe(true);
expect(keyMatches({ key: " " } as KeyboardEvent, "space")).toBe(true);
expect(keyMatches({ key: "ArrowUp" } as KeyboardEvent, "up")).toBe(true);
});
it("should match function keys", () => {
expect(keyMatches({ key: "F1" } as KeyboardEvent, "f1")).toBe(true);
expect(keyMatches({ key: "F12" } as KeyboardEvent, "f12")).toBe(true);
});
it("should handle undefined or null keys", () => {
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
expect(keyMatches({} as KeyboardEvent, null as any)).toBe(false);
expect(keyMatches({} as KeyboardEvent, undefined as any)).toBe(false);
expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
});
});
describe("matchesShortcut", () => {
const createKeyboardEvent = (options: {
key: string;
code?: string;
ctrlKey?: boolean;
altKey?: boolean;
shiftKey?: boolean;
metaKey?: boolean;
}) => ({
key: options.key,
code: options.code || `Key${options.key.toUpperCase()}`,
ctrlKey: options.ctrlKey || false,
altKey: options.altKey || false,
shiftKey: options.shiftKey || false,
metaKey: options.metaKey || false
} as KeyboardEvent);
it("should match simple key shortcuts", () => {
const event = createKeyboardEvent({ key: "a", code: "KeyA" });
expect(matchesShortcut(event, "a")).toBe(true);
});
it("should match shortcuts with modifiers", () => {
const event = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true });
expect(matchesShortcut(event, "ctrl+a")).toBe(true);
const shiftEvent = createKeyboardEvent({ key: "a", code: "KeyA", shiftKey: true });
expect(matchesShortcut(shiftEvent, "shift+a")).toBe(true);
});
it("should match complex modifier combinations", () => {
const event = createKeyboardEvent({
key: "a",
code: "KeyA",
ctrlKey: true,
shiftKey: true
});
expect(matchesShortcut(event, "ctrl+shift+a")).toBe(true);
});
it("should not match when modifiers don't match", () => {
const event = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true });
expect(matchesShortcut(event, "alt+a")).toBe(false);
expect(matchesShortcut(event, "a")).toBe(false);
});
it("should handle alternative modifier names", () => {
const ctrlEvent = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true });
expect(matchesShortcut(ctrlEvent, "control+a")).toBe(true);
const metaEvent = createKeyboardEvent({ key: "a", code: "KeyA", metaKey: true });
expect(matchesShortcut(metaEvent, "cmd+a")).toBe(true);
expect(matchesShortcut(metaEvent, "command+a")).toBe(true);
});
it("should handle empty or invalid shortcuts", () => {
const event = createKeyboardEvent({ key: "a", code: "KeyA" });
expect(matchesShortcut(event, "")).toBe(false);
expect(matchesShortcut(event, null as any)).toBe(false);
});
it("should handle invalid events", () => {
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
expect(matchesShortcut(null as any, "a")).toBe(false);
expect(matchesShortcut({} as KeyboardEvent, "a")).toBe(false);
expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
});
it("should warn about invalid shortcut formats", () => {
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
const event = createKeyboardEvent({ key: "a", code: "KeyA" });
matchesShortcut(event, "ctrl+");
matchesShortcut(event, "+");
expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
});
});
describe("bindGlobalShortcut", () => {
it("should bind a global shortcut", () => {
const handler = vi.fn();
shortcuts.bindGlobalShortcut("ctrl+a", handler, "test-namespace");
expect(mockElement.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function));
});
it("should not bind shortcuts when handler is null", () => {
shortcuts.bindGlobalShortcut("ctrl+a", null, "test-namespace");
expect(mockElement.addEventListener).not.toHaveBeenCalled();
});
it("should remove previous bindings when namespace is reused", () => {
const handler1 = vi.fn();
const handler2 = vi.fn();
shortcuts.bindGlobalShortcut("ctrl+a", handler1, "test-namespace");
expect(mockElement.addEventListener).toHaveBeenCalledTimes(1);
shortcuts.bindGlobalShortcut("ctrl+b", handler2, "test-namespace");
expect(mockElement.removeEventListener).toHaveBeenCalledTimes(1);
expect(mockElement.addEventListener).toHaveBeenCalledTimes(2);
});
});
describe("bindElShortcut", () => {
it("should bind shortcut to specific element", () => {
const mockEl = { addEventListener: vi.fn(), removeEventListener: vi.fn() };
const mockJQueryEl = [mockEl] as any;
mockJQueryEl.length = 1;
const handler = vi.fn();
shortcuts.bindElShortcut(mockJQueryEl, "ctrl+a", handler, "test-namespace");
expect(mockEl.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function));
});
it("should fall back to document when element is empty", () => {
const emptyJQuery = [] as any;
emptyJQuery.length = 0;
const handler = vi.fn();
shortcuts.bindElShortcut(emptyJQuery, "ctrl+a", handler, "test-namespace");
expect(mockElement.addEventListener).toHaveBeenCalledWith("keydown", expect.any(Function));
});
});
describe("removeGlobalShortcut", () => {
it("should remove shortcuts for a specific namespace", () => {
const handler = vi.fn();
shortcuts.bindGlobalShortcut("ctrl+a", handler, "test-namespace");
shortcuts.removeGlobalShortcut("test-namespace");
expect(mockElement.removeEventListener).toHaveBeenCalledWith("keydown", expect.any(Function));
});
});
describe("event handling", () => {
it.skip("should call handler when shortcut matches", () => {
const handler = vi.fn();
shortcuts.bindGlobalShortcut("ctrl+a", handler, "test-namespace");
// Get the listener that was registered
expect(mockElement.addEventListener.mock.calls).toHaveLength(1);
const [, listener] = mockElement.addEventListener.mock.calls[0];
// First verify that matchesShortcut works directly
const testEvent = {
type: "keydown",
key: "a",
code: "KeyA",
ctrlKey: true,
altKey: false,
shiftKey: false,
metaKey: false,
preventDefault: vi.fn(),
stopPropagation: vi.fn()
} as any;
// Test matchesShortcut directly first
expect(matchesShortcut(testEvent, "ctrl+a")).toBe(true);
// Now test the actual listener
listener(testEvent);
expect(handler).toHaveBeenCalled();
expect(testEvent.preventDefault).toHaveBeenCalled();
expect(testEvent.stopPropagation).toHaveBeenCalled();
});
it("should not call handler for non-keyboard events", () => {
const handler = vi.fn();
shortcuts.bindGlobalShortcut("ctrl+a", handler, "test-namespace");
const [, listener] = mockElement.addEventListener.mock.calls[0];
// Simulate a non-keyboard event
const event = {
type: "click"
} as any;
listener(event);
expect(handler).not.toHaveBeenCalled();
});
it("should not call handler when shortcut doesn't match", () => {
const handler = vi.fn();
shortcuts.bindGlobalShortcut("ctrl+a", handler, "test-namespace");
const [, listener] = mockElement.addEventListener.mock.calls[0];
// Simulate a non-matching keydown event
const event = {
type: "keydown",
key: "b",
code: "KeyB",
ctrlKey: true,
altKey: false,
shiftKey: false,
metaKey: false,
preventDefault: vi.fn(),
stopPropagation: vi.fn()
} as any;
listener(event);
expect(handler).not.toHaveBeenCalled();
expect(event.preventDefault).not.toHaveBeenCalled();
});
});
});

View File

@@ -1,7 +1,18 @@
import utils from "./utils.js";
type ElementType = HTMLElement | Document;
type Handler = (e: JQuery.TriggeredEvent<ElementType | Element, string, ElementType | Element, ElementType | Element>) => void;
type Handler = (e: KeyboardEvent) => void;
interface ShortcutBinding {
element: HTMLElement | Document;
shortcut: string;
handler: Handler;
namespace: string | null;
listener: (evt: Event) => void;
}
// Store all active shortcut bindings for management
const activeBindings: Map<string, ShortcutBinding[]> = new Map();
function removeGlobalShortcut(namespace: string) {
bindGlobalShortcut("", null, namespace);
@@ -15,38 +26,167 @@ function bindElShortcut($el: JQuery<ElementType | Element>, keyboardShortcut: st
if (utils.isDesktop()) {
keyboardShortcut = normalizeShortcut(keyboardShortcut);
let eventName = "keydown";
// If namespace is provided, remove all previous bindings for this namespace
if (namespace) {
eventName += `.${namespace}`;
// if there's a namespace, then we replace the existing event handler with the new one
$el.off(eventName);
removeNamespaceBindings(namespace);
}
// method can be called to remove the shortcut (e.g. when keyboardShortcut label is deleted)
if (keyboardShortcut) {
$el.bind(eventName, keyboardShortcut, (e) => {
if (handler) {
handler(e);
// Method can be called to remove the shortcut (e.g. when keyboardShortcut label is deleted)
if (keyboardShortcut && handler) {
const element = $el.length > 0 ? $el[0] as (HTMLElement | Document) : document;
const listener = (evt: Event) => {
// Only handle keyboard events
if (evt.type !== 'keydown' || !(evt instanceof KeyboardEvent)) {
return;
}
e.preventDefault();
e.stopPropagation();
});
const e = evt as KeyboardEvent;
if (matchesShortcut(e, keyboardShortcut)) {
e.preventDefault();
e.stopPropagation();
handler(e);
}
};
// Add the event listener
element.addEventListener('keydown', listener);
// Store the binding for later cleanup
const binding: ShortcutBinding = {
element,
shortcut: keyboardShortcut,
handler,
namespace,
listener
};
const key = namespace || 'global';
if (!activeBindings.has(key)) {
activeBindings.set(key, []);
}
activeBindings.get(key)!.push(binding);
}
}
}
function removeNamespaceBindings(namespace: string) {
const bindings = activeBindings.get(namespace);
if (bindings) {
// Remove all event listeners for this namespace
bindings.forEach(binding => {
binding.element.removeEventListener('keydown', binding.listener);
});
activeBindings.delete(namespace);
}
}
export function matchesShortcut(e: KeyboardEvent, shortcut: string): boolean {
if (!shortcut) return false;
// Ensure we have a proper KeyboardEvent with key property
if (!e || typeof e.key !== 'string') {
console.warn('matchesShortcut called with invalid event:', e);
return false;
}
const parts = shortcut.toLowerCase().split('+');
const key = parts[parts.length - 1]; // Last part is the actual key
const modifiers = parts.slice(0, -1); // Everything before is modifiers
// Defensive check - ensure we have a valid key
if (!key || key.trim() === '') {
console.warn('Invalid shortcut format:', shortcut);
return false;
}
// Check if the main key matches
if (!keyMatches(e, key)) {
return false;
}
// Check modifiers
const expectedCtrl = modifiers.includes('ctrl') || modifiers.includes('control');
const expectedAlt = modifiers.includes('alt');
const expectedShift = modifiers.includes('shift');
const expectedMeta = modifiers.includes('meta') || modifiers.includes('cmd') || modifiers.includes('command');
return e.ctrlKey === expectedCtrl &&
e.altKey === expectedAlt &&
e.shiftKey === expectedShift &&
e.metaKey === expectedMeta;
}
export function keyMatches(e: KeyboardEvent, key: string): boolean {
// Defensive check for undefined/null key
if (!key) {
console.warn('keyMatches called with undefined/null key');
return false;
}
// Handle special key mappings and aliases
const keyMap: { [key: string]: string[] } = {
'return': ['Enter'],
'enter': ['Enter'], // alias for return
'del': ['Delete'],
'delete': ['Delete'], // alias for del
'esc': ['Escape'],
'escape': ['Escape'], // alias for esc
'space': [' ', 'Space'],
'tab': ['Tab'],
'backspace': ['Backspace'],
'home': ['Home'],
'end': ['End'],
'pageup': ['PageUp'],
'pagedown': ['PageDown'],
'up': ['ArrowUp'],
'down': ['ArrowDown'],
'left': ['ArrowLeft'],
'right': ['ArrowRight']
};
// Function keys
for (let i = 1; i <= 19; i++) {
keyMap[`f${i}`] = [`F${i}`];
}
const mappedKeys = keyMap[key.toLowerCase()];
if (mappedKeys) {
return mappedKeys.includes(e.key) || mappedKeys.includes(e.code);
}
// For number keys, use the physical key code regardless of modifiers
// This works across all keyboard layouts
if (key >= '0' && key <= '9') {
return e.code === `Digit${key}`;
}
// For letter keys, use the physical key code for consistency
if (key.length === 1 && key >= 'a' && key <= 'z') {
return e.code === `Key${key.toUpperCase()}`;
}
// For regular keys, check both key and code as fallback
return e.key.toLowerCase() === key.toLowerCase() ||
e.code.toLowerCase() === key.toLowerCase();
}
/**
* Normalize to the form expected by the jquery.hotkeys.js
* Simple normalization - just lowercase and trim whitespace
*/
function normalizeShortcut(shortcut: string): string {
if (!shortcut) {
return shortcut;
}
return shortcut.toLowerCase().replace("enter", "return").replace("delete", "del").replace("ctrl+alt", "alt+ctrl").replace("meta+alt", "alt+meta"); // alt needs to be first;
const normalized = shortcut.toLowerCase().trim().replace(/\s+/g, '');
// Warn about potentially problematic shortcuts
if (normalized.endsWith('+') || normalized.startsWith('+') || normalized.includes('++')) {
console.warn('Potentially malformed shortcut:', shortcut, '-> normalized to:', normalized);
}
return normalized;
}
export default {

View File

@@ -36,7 +36,9 @@ export function applyCopyToClipboardButton($codeBlock: JQuery<HTMLElement>) {
const $copyButton = $("<button>")
.addClass("bx component icon-action tn-tool-button bx-copy copy-button")
.attr("title", t("code_block.copy_title"))
.on("click", () => {
.on("click", (e) => {
e.stopPropagation();
if (!isShare) {
copyTextWithToast($codeBlock.text());
} else {

View File

@@ -1,5 +1,4 @@
import "jquery";
import "jquery-hotkeys";
import utils from "./services/utils.js";
import ko from "knockout";
import "./stylesheets/bootstrap.scss";

View File

@@ -320,8 +320,3 @@ h6 {
page-break-after: avoid;
break-after: avoid;
}
figure.table {
/* Workaround for https://github.com/ckeditor/ckeditor5/issues/18903. Remove once official fix is released */
display: table !important;
}

View File

@@ -642,6 +642,10 @@ table.promoted-attributes-in-tooltip th {
z-index: calc(var(--ck-z-panel) - 1) !important;
}
.tooltip.tooltip-top {
z-index: 32767 !important;
}
.tooltip-trigger {
background: transparent;
pointer-events: none;
@@ -1886,6 +1890,7 @@ body.zen #launcher-container,
body.zen #launcher-pane,
body.zen #left-pane,
body.zen #right-pane,
body.zen #mobile-sidebar-wrapper,
body.zen .tab-row-container,
body.zen .tab-row-widget,
body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)),
@@ -1893,7 +1898,8 @@ body.zen .ribbon-container:has(.classic-toolbar-widget.visible) .ribbon-top-row,
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)),
body.zen .note-icon-widget,
body.zen .title-row .button-widget,
body.zen .floating-buttons-children > *:not(.bx-edit-alt) {
body.zen .floating-buttons-children > *:not(.bx-edit-alt),
body.zen .action-button {
display: none !important;
}
@@ -1935,6 +1941,10 @@ body.zen .note-title-widget input {
background: transparent !important;
}
body.zen #detail-container {
width: 100%;
}
/* Content renderer */
footer.file-footer,
@@ -2245,6 +2255,13 @@ footer.webview-footer button {
padding: 1px 10px 1px 10px;
}
/* Search result highlighting */
.search-result-title b,
.search-result-content b {
font-weight: 900;
color: var(--admonition-warning-accent-color);
}
/* Customized icons */
.bx-tn-toc::before {

View File

@@ -233,16 +233,16 @@ div.tn-tool-dialog {
/* Item title link */
.recent-changes-content ul li .note-title a {
.recent-changes-content ul li a {
color: currentColor;
}
.recent-changes-content ul li .note-title a:hover {
.recent-changes-content ul li a:hover {
text-decoration: underline;
}
/* Item title for deleted notes */
.recent-changes-content ul li.deleted-note .note-title > .note-title {
.recent-changes-content ul li.deleted-note .note-title {
text-decoration: line-through;
}

View File

@@ -0,0 +1,185 @@
{
"about": {
"title": "Sobre Trilium Notes",
"homepage": "Pàgina principal:"
},
"add_link": {
"note": "Nota"
},
"branch_prefix": {
"prefix": "Prefix: ",
"save": "Desa"
},
"bulk_actions": {
"labels": "Etiquetes",
"relations": "Relacions",
"notes": "Notes",
"other": "Altres"
},
"confirm": {
"confirmation": "Confirmació",
"cancel": "Cancel·la",
"ok": "OK"
},
"delete_notes": {
"close": "Tanca",
"cancel": "Cancel·la",
"ok": "OK"
},
"export": {
"close": "Tanca",
"export": "Exporta"
},
"help": {
"troubleshooting": "Solució de problemes",
"other": "Altres"
},
"import": {
"options": "Opcions",
"import": "Importa"
},
"include_note": {
"label_note": "Nota"
},
"info": {
"closeButton": "Tanca",
"okButton": "OK"
},
"note_type_chooser": {
"templates": "Plantilles:"
},
"prompt": {
"title": "Sol·licitud",
"defaultTitle": "Sol·licitud"
},
"protected_session_password": {
"close_label": "Tanca"
},
"recent_changes": {
"undelete_link": "recuperar"
},
"revisions": {
"restore_button": "Restaura",
"delete_button": "Suprimeix",
"download_button": "Descarrega",
"mime": "MIME: ",
"preview": "Vista prèvia:"
},
"sort_child_notes": {
"title": "títol",
"ascending": "ascendent",
"descending": "descendent",
"folders": "Carpetes"
},
"upload_attachments": {
"options": "Opcions",
"upload": "Puja"
},
"attribute_detail": {
"name": "Nom",
"value": "Valor",
"promoted": "Destacat",
"promoted_alias": "Àlies",
"multiplicity": "Multiplicitat",
"label_type": "Tipus",
"text": "Text",
"number": "Número",
"boolean": "Booleà",
"date": "Data",
"time": "Hora",
"url": "URL",
"precision": "Precisió",
"digits": "dígits",
"inheritable": "Heretable",
"delete": "Suprimeix",
"color_type": "Color"
},
"rename_label": {
"to": "Per"
},
"move_note": {
"to": "a"
},
"add_relation": {
"to": "a"
},
"rename_relation": {
"to": "Per"
},
"update_relation_target": {
"to": "a"
},
"attachments_actions": {
"download": "Descarrega"
},
"calendar": {
"mon": "Dl",
"tue": "Dt",
"wed": "dc",
"thu": "Dj",
"fri": "Dv",
"sat": "Ds",
"sun": "Dg",
"january": "Gener",
"febuary": "Febrer",
"march": "Març",
"april": "Abril",
"may": "Maig",
"june": "Juny",
"july": "Juliol",
"august": "Agost",
"september": "Setembre",
"october": "Octubre",
"november": "Novembre",
"december": "Desembre"
},
"global_menu": {
"menu": "Menú",
"options": "Opcions",
"zoom": "Zoom",
"advanced": "Avançat",
"logout": "Tanca la sessió"
},
"zpetne_odkazy": {
"relation": "relació"
},
"note_icon": {
"category": "Categoria:",
"search": "Cerca:"
},
"basic_properties": {
"editable": "Editable",
"language": "Llengua"
},
"book_properties": {
"grid": "Graella",
"list": "Llista",
"collapse": "Replega",
"expand": "Desplega",
"calendar": "Calendari",
"table": "Taula",
"board": "Tauler"
},
"edited_notes": {
"deleted": "(suprimit)"
},
"file_properties": {
"download": "Descarrega",
"open": "Obre",
"title": "Fitxer"
},
"image_properties": {
"download": "Descarrega",
"open": "Obre",
"title": "Imatge"
},
"note_info_widget": {
"created": "Creat",
"modified": "Modificat",
"type": "Tipus",
"calculate": "calcula"
},
"note_paths": {
"archived": "Arxivat"
}
}

View File

@@ -1,7 +1,6 @@
{
"about": {
"title": "关于 Trilium Notes",
"close": "关闭",
"homepage": "项目主页:",
"app_version": "应用版本:",
"db_version": "数据库版本:",
@@ -28,25 +27,22 @@
"add_link": {
"add_link": "添加链接",
"help_on_links": "链接帮助",
"close": "关闭",
"note": "笔记",
"search_note": "按名称搜索笔记",
"link_title_mirrors": "链接标题跟随笔记标题变化",
"link_title_arbitrary": "链接标题可随意修改",
"link_title": "链接标题",
"button_add_link": "添加链接 <kbd>回车</kbd>"
"button_add_link": "添加链接"
},
"branch_prefix": {
"edit_branch_prefix": "编辑分支前缀",
"help_on_tree_prefix": "有关树前缀的帮助",
"close": "关闭",
"prefix": "前缀:",
"prefix": "前缀: ",
"save": "保存",
"branch_prefix_saved": "分支前缀已保存。"
},
"bulk_actions": {
"bulk_actions": "批量操作",
"close": "关闭",
"affected_notes": "受影响的笔记",
"include_descendants": "包括所选笔记的子笔记",
"available_actions": "可用操作",
@@ -61,23 +57,21 @@
},
"clone_to": {
"clone_notes_to": "克隆笔记到...",
"close": "关闭",
"help_on_links": "链接帮助",
"notes_to_clone": "要克隆的笔记",
"target_parent_note": "目标父笔记",
"search_for_note_by_its_name": "按名称搜索笔记",
"cloned_note_prefix_title": "克隆的笔记将在笔记树中显示给定的前缀",
"prefix_optional": "前缀(可选)",
"clone_to_selected_note": "克隆到选定的笔记 <kbd>回车</kbd>",
"clone_to_selected_note": "克隆到选定的笔记",
"no_path_to_clone_to": "没有克隆路径。",
"note_cloned": "笔记 \"{{clonedTitle}}\" 已克隆到 \"{{targetTitle}}\""
},
"confirm": {
"confirmation": "确认",
"close": "关闭",
"cancel": "取消",
"ok": "确定",
"are_you_sure_remove_note": "确定要从关系图中移除笔记 \"{{title}}\" ",
"are_you_sure_remove_note": "确定要从关系图中移除笔记 \"{{title}}\" ",
"if_you_dont_check": "如果不选中此项,笔记将仅从关系图中移除。",
"also_delete_note": "同时删除笔记"
},
@@ -87,9 +81,9 @@
"delete_all_clones_description": "同时删除所有克隆(可以在最近修改中撤消)",
"erase_notes_description": "通常(软)删除仅标记笔记为已删除,可以在一段时间内通过最近修改对话框撤消。选中此选项将立即擦除笔记,不可撤销。",
"erase_notes_warning": "永久擦除笔记(无法撤销),包括所有克隆。这将强制应用程序重载。",
"notes_to_be_deleted": "将删除以下笔记 ({{- noteCount}})",
"notes_to_be_deleted": "将删除以下笔记 ({{notesCount}})",
"no_note_to_delete": "没有笔记将被删除(仅克隆)。",
"broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{- relationCount}})",
"broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{ relationCount}})",
"cancel": "取消",
"ok": "确定",
"deleted_relation_text": "笔记 {{- note}} (将被删除的笔记) 被以下关系 {{- relation}} 引用, 来自 {{- source}}。"
@@ -113,20 +107,17 @@
"format_pdf": "PDF - 用于打印或共享目的。"
},
"help": {
"fullDocumentation": "帮助(完整<a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">在线文档</a>)",
"close": "关闭",
"noteNavigation": "笔记导航",
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - 在笔记列表中向上/向下移动",
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - 折叠/展开节点",
"goUpDown": "在笔记列表中向上/向下移动",
"collapseExpand": "折叠/展开节点",
"notSet": "未设置",
"goBackForwards": "在历史记录中前后移动",
"showJumpToNoteDialog": "显示<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"跳转到\" 对话框</a>",
"scrollToActiveNote": "滚动到活跃笔记",
"jumpToParentNote": "<kbd>Backspace</kbd> - 跳转到父笔记",
"jumpToParentNote": "跳转到父笔记",
"collapseWholeTree": "折叠整个笔记树",
"collapseSubTree": "折叠子树",
"tabShortcuts": "标签页快捷键",
"newTabNoteLink": "<kbd>CTRL+click</kbd> - 在笔记链接上使用CTRL+点击(或中键点击)在新标签页中打开笔记",
"onlyInDesktop": "仅在桌面版(电子构建)中",
"openEmptyTab": "打开空白标签页",
"closeActiveTab": "关闭活跃标签页",
@@ -141,14 +132,14 @@
"moveNoteUpHierarchy": "在层级结构中向上移动笔记",
"multiSelectNote": "多选上/下笔记",
"selectAllNotes": "选择当前级别的所有笔记",
"selectNote": "<kbd>Shift+click</kbd> - 选择笔记",
"selectNote": "选择笔记",
"copyNotes": "将活跃笔记(或当前选择)复制到剪贴板(用于<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">克隆</a>",
"cutNotes": "将当前笔记(或当前选择)剪切到剪贴板(用于移动笔记)",
"pasteNotes": "将笔记粘贴为活跃笔记的子笔记(根据是复制还是剪切到剪贴板来决定是移动还是克隆)",
"deleteNotes": "删除笔记/子树",
"editingNotes": "编辑笔记",
"editNoteTitle": "在树形笔记树中,焦点会从笔记树切换到笔记标题。按下 Enter 键会将焦点从笔记标题切换到文本编辑器。按下 <kbd>Ctrl+.</kbd> 会将焦点从编辑器切换回笔记树。",
"createEditLink": "<kbd>Ctrl+K</kbd> - 创建/编辑外部链接",
"createEditLink": "创建/编辑外部链接",
"createInternalLink": "创建内部链接",
"followLink": "跟随光标下的链接",
"insertDateTime": "在插入点插入当前日期和时间",
@@ -164,11 +155,13 @@
"showSQLConsole": "显示 SQL 控制台",
"other": "其他",
"quickSearch": "定位到快速搜索框",
"inPageSearch": "页面内搜索"
"inPageSearch": "页面内搜索",
"newTabWithActivationNoteLink": "在新标签页打开笔记链接并激活该标签页",
"title": "资料表",
"newTabNoteLink": "在新标签页开启链接"
},
"import": {
"importIntoNote": "导入到笔记",
"close": "关闭",
"chooseImportFile": "选择导入文件",
"importDescription": "所选文件的内容将作为子笔记导入到",
"options": "选项",
@@ -195,14 +188,13 @@
},
"include_note": {
"dialog_title": "包含笔记",
"close": "关闭",
"label_note": "笔记",
"placeholder_search": "按名称搜索笔记",
"box_size_prompt": "包含笔记的框大小:",
"box_size_small": "小型 (显示大约10行)",
"box_size_medium": "中型 (显示大约30行)",
"box_size_full": "完整显示(完整文本框)",
"button_include": "包含笔记 <kbd>回车</kbd>"
"button_include": "包含笔记"
},
"info": {
"modalTitle": "信息消息",
@@ -210,43 +202,41 @@
"okButton": "确定"
},
"jump_to_note": {
"search_placeholder": "",
"close": "关闭",
"search_button": "全文搜索 <kbd>Ctrl+回车</kbd>"
"search_button": "全文搜索",
"search_placeholder": "按名称或类型搜索笔记 > 查看命令..."
},
"markdown_import": {
"dialog_title": "Markdown 导入",
"close": "关闭",
"modal_body_text": "由于浏览器沙箱的限制,无法直接从 JavaScript 读取剪贴板内容。请将要导入的 Markdown 文本粘贴到下面的文本框中,然后点击导入按钮",
"import_button": "导入 Ctrl+回车",
"import_button": "导入",
"import_success": "Markdown 内容已成功导入文档。"
},
"move_to": {
"dialog_title": "移动笔记到...",
"close": "关闭",
"notes_to_move": "需要移动的笔记",
"target_parent_note": "目标父笔记",
"search_placeholder": "通过名称搜索笔记",
"move_button": "移动到选定的笔记 <kbd>回车</kbd>",
"move_button": "移动到选定的笔记",
"error_no_path": "没有可以移动到的路径。",
"move_success_message": "所选笔记已移动到"
"move_success_message": "所选笔记已移动到 "
},
"note_type_chooser": {
"modal_title": "选择笔记类型",
"close": "关闭",
"modal_body": "选择新笔记的类型或模板:",
"templates": "模板:"
"templates": "模板",
"change_path_prompt": "更改创建新笔记的位置:",
"search_placeholder": "按名称搜索路径(默认为空)",
"builtin_templates": "内置模板"
},
"password_not_set": {
"title": "密码未设置",
"close": "关闭",
"body1": "受保护的笔记使用用户密码加密,但密码尚未设置。",
"body2": "点击<a class=\"open-password-options-button\" href=\"javascript:\">这里</a>打开选项对话框并设置您的密码。"
"body2": "若要保护笔记,请按一下下方按钮开启「选项对话框并设置密码。",
"go_to_password_options": "移动至密码选项"
},
"prompt": {
"title": "提示",
"close": "关闭",
"ok": "确定 <kbd>回车</kbd>",
"ok": "确定",
"defaultTitle": "提示"
},
"protected_session_password": {
@@ -254,12 +244,11 @@
"help_title": "关于保护笔记的帮助",
"close_label": "关闭",
"form_label": "输入密码进入保护会话以继续:",
"start_button": "开始保护会话 <kbd>回车</kbd>"
"start_button": "开始保护会话"
},
"recent_changes": {
"title": "最近修改",
"erase_notes_button": "立即清理已删除的笔记",
"close": "关闭",
"deleted_notes_message": "已删除的笔记已清理。",
"no_changes_message": "暂无修改...",
"undelete_link": "恢复删除",
@@ -270,7 +259,6 @@
"delete_all_revisions": "删除此笔记的所有修订版本",
"delete_all_button": "删除所有修订版本",
"help_title": "关于笔记修订版本的帮助",
"close": "关闭",
"revision_last_edited": "此修订版本上次编辑于 {{date}}",
"confirm_delete_all": "您是否要删除此笔记的所有修订版本?",
"no_revisions": "此笔记暂无修订版本...",
@@ -285,14 +273,13 @@
"maximum_revisions": "当前笔记的最大历史数量: {{number}}。",
"settings": "笔记修订设置",
"download_button": "下载",
"mime": "MIME 类型:",
"mime": "MIME 类型: ",
"file_size": "文件大小:",
"preview": "预览:",
"preview_not_available": "无法预览此类型的笔记。"
},
"sort_child_notes": {
"sort_children_by": "按...排序子笔记",
"close": "关闭",
"sorting_criteria": "排序条件",
"title": "标题",
"date_created": "创建日期",
@@ -306,13 +293,12 @@
"sort_with_respect_to_different_character_sorting": "根据不同语言或地区的字符排序和排序规则排序。",
"natural_sort_language": "自然排序语言",
"the_language_code_for_natural_sort": "自然排序的语言代码,例如中文的 \"zh-CN\"。",
"sort": "排序 <kbd>Enter</kbd>"
"sort": "排序"
},
"upload_attachments": {
"upload_attachments_to_note": "上传附件到笔记",
"close": "关闭",
"choose_files": "选择文件",
"files_will_be_uploaded": "文件将作为附件上传到",
"files_will_be_uploaded": "文件将作为附件上传到 {{noteTitle}}",
"options": "选项",
"shrink_images": "缩小图片",
"upload": "上传",
@@ -427,7 +413,7 @@
"run_on_branch_change": "在分支更新时执行。",
"run_on_branch_deletion": "在删除分支时执行。分支是父笔记和子笔记之间的链接,例如在移动笔记时删除(删除旧的分支/链接)。",
"run_on_attribute_creation": "在为定义此关系的笔记创建新属性时执行",
"run_on_attribute_change": "当修改定义此关系的笔记的属性时执行。删除属性时也会触发此操作。",
"run_on_attribute_change": " 当修改定义此关系的笔记的属性时执行。删除属性时也会触发此操作。",
"relation_template": "即使没有父子关系,笔记的属性也将继承。如果空,则笔记的内容和子树将添加到实例笔记中。有关详细信息,请参见文档。",
"inherit": "即使没有父子关系,笔记的属性也将继承。有关类似概念的模板关系,请参见模板关系。请参阅文档中的属性继承。",
"render_note": "“渲染 HTML 笔记”类型的笔记将使用代码笔记HTML 或脚本)进行呈现,因此需要指定要渲染的笔记",
@@ -438,14 +424,15 @@
"share_favicon": "在分享页面中设置的 favicon 笔记。一般需要将它设置为分享和可继承。Favicon 笔记也必须位于分享子树中。可以考虑一并使用 'share_hidden_from_tree'。",
"is_owned_by_note": "由此笔记所有",
"other_notes_with_name": "其它含有 {{attributeType}} 名为 \"{{attributeName}}\" 的的笔记",
"and_more": "... 以及另外 {{count}} 个",
"and_more": "... 以及另外 {{count}} 个",
"print_landscape": "导出为 PDF 时,将页面方向更改为横向而不是纵向。",
"print_page_size": "导出为 PDF 时,更改页面大小。支持的值:<code>A0</code>、<code>A1</code>、<code>A2</code>、<code>A3</code>、<code>A4</code>、<code>A5</code>、<code>A6</code>、<code>Legal</code>、<code>Letter</code>、<code>Tabloid</code>、<code>Ledger</code>。"
"print_page_size": "导出为 PDF 时,更改页面大小。支持的值:<code>A0</code>、<code>A1</code>、<code>A2</code>、<code>A3</code>、<code>A4</code>、<code>A5</code>、<code>A6</code>、<code>Legal</code>、<code>Letter</code>、<code>Tabloid</code>、<code>Ledger</code>。",
"color_type": "颜色"
},
"attribute_editor": {
"help_text_body1": "要添加标签,只需输入例如 <code>#rock</code> 或者如果您还想添加值,则例如 <code>#year = 2020</code>",
"help_text_body2": "对于关系,请输入 <code>~author = @</code>,这将显示一个自动完成列表,您可以查找所需的笔记。",
"help_text_body3": "您也可以使用右侧的 <code>+</code> 按钮添加标签和关系。</p>",
"help_text_body3": "您也可以使用右侧的 <code>+</code> 按钮添加标签和关系。",
"save_attributes": "保存属性 <enter>",
"add_a_new_attribute": "添加新属性",
"add_new_label": "添加新标签 <kbd data-command=\"addNewLabel\"></kbd>",
@@ -744,7 +731,8 @@
"basic_properties": {
"note_type": "笔记类型",
"editable": "可编辑",
"basic_properties": "基本属性"
"basic_properties": "基本属性",
"language": "语言"
},
"book_properties": {
"view_type": "视图类型",
@@ -754,9 +742,12 @@
"expand_all_children": "展开所有子项",
"collapse": "折叠",
"expand": "展开",
"book_properties": "",
"invalid_view_type": "无效的查看类型 '{{type}}'",
"calendar": "日历"
"calendar": "日历",
"book_properties": "集合属性",
"table": "表格",
"geo-map": "地理地图",
"board": "看板"
},
"edited_notes": {
"no_edited_notes_found": "今天还没有编辑过的笔记...",
@@ -833,7 +824,8 @@
"unknown_label_type": "未知的标签类型 '{{type}}'",
"unknown_attribute_type": "未知的属性类型 '{{type}}'",
"add_new_attribute": "添加新属性",
"remove_this_attribute": "移除此属性"
"remove_this_attribute": "移除此属性",
"remove_color": "移除此颜色标签"
},
"script_executor": {
"query": "查询",
@@ -944,19 +936,19 @@
},
"attachment_detail": {
"open_help_page": "打开附件帮助页面",
"owning_note": "所属笔记:",
"you_can_also_open": ",您还可以打开",
"owning_note": "所属笔记: ",
"you_can_also_open": ",您还可以打开 ",
"list_of_all_attachments": "所有附件列表",
"attachment_deleted": "该附件已被删除。"
},
"attachment_list": {
"open_help_page": "打开附件帮助页面",
"owning_note": "所属笔记:",
"owning_note": "所属笔记: ",
"upload_attachments": "上传附件",
"no_attachments": "此笔记没有附件。"
},
"book": {
"no_children_help": "此类型为书籍的笔记没有任何子笔记,因此没有内容显示。请参阅 <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> 了解详情"
"no_children_help": "此类型为书籍的笔记没有任何子笔记,因此没有内容显示。请参阅 <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> 了解详情"
},
"editable_code": {
"placeholder": "在这里输入您的代码笔记内容..."
@@ -975,7 +967,7 @@
},
"protected_session": {
"enter_password_instruction": "显示受保护的笔记需要输入您的密码:",
"start_session_button": "开始受保护的会话",
"start_session_button": "开始受保护的会话 <kbd>Enter</kbd>",
"started": "受保护的会话已启动。",
"wrong_password": "密码错误。",
"protecting-finished-successfully": "保护操作已成功完成。",
@@ -1036,7 +1028,7 @@
"error_creating_anonymized_database": "无法创建匿名化数据库,请检查后端日志以获取详细信息",
"successfully_created_fully_anonymized_database": "成功创建完全匿名化的数据库,路径为 {{anonymizedFilePath}}",
"successfully_created_lightly_anonymized_database": "成功创建轻度匿名化的数据库,路径为 {{anonymizedFilePath}}",
"no_anonymized_database_yet": "尚无匿名化数据库"
"no_anonymized_database_yet": "尚无匿名化数据库"
},
"database_integrity_check": {
"title": "数据库完整性检查",
@@ -1092,7 +1084,8 @@
"max_width_label": "内容最大宽度(像素)",
"apply_changes_description": "要应用内容宽度更改,请点击",
"reload_button": "重载前端",
"reload_description": "来自外观选项的更改"
"reload_description": "来自外观选项的更改",
"max_width_unit": "像素"
},
"native_title_bar": {
"title": "原生标题栏(需要重新启动应用)",
@@ -1108,17 +1101,17 @@
"title": "主题",
"theme_label": "主题",
"override_theme_fonts_label": "覆盖主题字体",
"auto_theme": "自动",
"light_theme": "浅色",
"dark_theme": "深色",
"triliumnext": "TriliumNext Beta跟随系统颜色方案",
"triliumnext-light": "TriliumNext Beta浅色",
"triliumnext-dark": "TriliumNext Beta深色",
"triliumnext": "Trilium跟随系统颜色方案",
"triliumnext-light": "Trilium浅色",
"triliumnext-dark": "Trilium深色",
"layout": "布局",
"layout-vertical-title": "垂直",
"layout-horizontal-title": "水平",
"layout-vertical-description": "启动栏位于左侧(默认)",
"layout-horizontal-description": "启动栏位于标签页栏下方,标签页栏现在是全宽的。"
"layout-horizontal-description": "启动栏位于标签页栏下方,标签页栏现在是全宽的。",
"auto_theme": "传统(跟随系统配色方案)",
"light_theme": "传统(浅色)",
"dark_theme": "传统(深色)"
},
"zoom_factor": {
"title": "缩放系数(仅桌面客户端有效)",
@@ -1127,7 +1120,8 @@
"code_auto_read_only_size": {
"title": "自动只读大小",
"description": "自动只读大小是指笔记超过设置的大小后自动设置为只读模式(为性能考虑)。",
"label": "自动只读大小(代码笔记)"
"label": "自动只读大小(代码笔记)",
"unit": "字符"
},
"code_mime_types": {
"title": "下拉菜单可用的MIME文件类型"
@@ -1146,7 +1140,8 @@
"download_images_description": "粘贴的 HTML 可能包含在线图片的引用Trilium 会找到这些引用并下载图片,以便它们可以离线使用。",
"enable_image_compression": "启用图片压缩",
"max_image_dimensions": "图片的最大宽度/高度(超过此限制的图像将会被缩放)。",
"jpeg_quality_description": "JPEG 质量10 - 最差质量100 最佳质量,建议为 50 - 85"
"jpeg_quality_description": "JPEG 质量10 - 最差质量100 最佳质量,建议为 50 - 85",
"max_image_dimensions_unit": "像素"
},
"attachment_erasure_timeout": {
"attachment_erasure_timeout": "附件清理超时",
@@ -1178,7 +1173,8 @@
"note_revisions_snapshot_limit_description": "笔记修订快照数限制指的是每个笔记可以保存的最大历史记录数量。其中 -1 表示没有限制0 表示删除所有历史记录。您可以通过 #versioningLimit 标签设置单个笔记的最大修订记录数量。",
"snapshot_number_limit_label": "笔记修订快照数量限制:",
"erase_excess_revision_snapshots": "立即删除多余的修订快照",
"erase_excess_revision_snapshots_prompt": "多余的修订快照已被删除。"
"erase_excess_revision_snapshots_prompt": "多余的修订快照已被删除。",
"snapshot_number_limit_unit": "快照"
},
"search_engine": {
"title": "搜索引擎",
@@ -1220,12 +1216,14 @@
"title": "目录",
"description": "当笔记中有超过一定数量的标题时,显示目录。您可以自定义此数量:",
"disable_info": "您可以设置一个非常大的数来禁用目录。",
"shortcut_info": "您可以在 “选项” -> “快捷键” 中配置一个键盘快捷键,以便快速切换右侧面板(包括目录)(名称为 'toggleRightPane')。"
"shortcut_info": "您可以在 “选项” -> “快捷键” 中配置一个键盘快捷键,以便快速切换右侧面板(包括目录)(名称为 'toggleRightPane')。",
"unit": "标题"
},
"text_auto_read_only_size": {
"title": "自动只读大小",
"description": "自动只读笔记大小是超过该大小后,笔记将以只读模式显示(出于性能考虑)。",
"label": "自动只读大小(文本笔记)"
"label": "自动只读大小(文本笔记)",
"unit": "字符"
},
"i18n": {
"title": "本地化",
@@ -1335,9 +1333,9 @@
"oauth_title": "OAuth/OpenID 认证",
"oauth_description": "OpenID 是一种标准化方式,允许您使用其他服务(如 Google的账号登录网站来验证您的身份。默认的身份提供者是 Google但您可以更改为任何其他 OpenID 提供者。点击<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">这里</a>了解更多信息。请参阅这些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指南</a> 通过 Google 设置 OpenID 服务。",
"oauth_description_warning": "要启用 OAuth/OpenID您需要设置 config.ini 文件中的 OAuth/OpenID 基础 URL、客户端 ID 和客户端密钥,并重新启动应用程序。如果要从环境变量设置,请设置 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 环境变量。",
"oauth_missing_vars": "缺少以下设置项: {{missingVars}}",
"oauth_user_account": "用户账号:",
"oauth_user_email": "用户邮箱:",
"oauth_missing_vars": "缺少以下设置项{{variables}}",
"oauth_user_account": "用户账号: ",
"oauth_user_email": "用户邮箱: ",
"oauth_user_not_logged_in": "未登录!"
},
"shortcuts": {
@@ -1359,7 +1357,7 @@
"enable": "启用拼写检查",
"language_code_label": "语言代码",
"language_code_placeholder": "例如 \"en-US\", \"de-AT\"",
"multiple_languages_info": "多种语言可以用逗号分隔,例如 \"en-US, de-DE, cs\"。",
"multiple_languages_info": "多种语言可以用逗号分隔,例如 \"en-US, de-DE, cs\"。 ",
"available_language_codes_label": "可用的语言代码:",
"restart-required": "拼写检查选项的更改将在应用重启后生效。"
},
@@ -1376,7 +1374,8 @@
"test_title": "同步测试",
"test_description": "测试和同步服务器之间的连接。如果同步服务器没有初始化,会将本地文档同步到同步服务器上。",
"test_button": "测试同步",
"handshake_failed": "同步服务器握手失败,错误:{{message}}"
"handshake_failed": "同步服务器握手失败,错误:{{message}}",
"timeout_unit": "毫秒"
},
"api_log": {
"close": "关闭"
@@ -1435,7 +1434,9 @@
"import-into-note": "导入到笔记",
"apply-bulk-actions": "应用批量操作",
"converted-to-attachments": "{{count}} 个笔记已被转换为附件。",
"convert-to-attachment-confirm": "确定要将选中的笔记转换为其父笔记的附件吗?"
"convert-to-attachment-confirm": "确定要将选中的笔记转换为其父笔记的附件吗?",
"duplicate": "复制",
"open-in-popup": "快速编辑"
},
"shared_info": {
"shared_publicly": "此笔记已公开分享于",
@@ -1449,7 +1450,6 @@
"relation-map": "关系图",
"note-map": "笔记地图",
"render-note": "渲染笔记",
"book": "",
"mermaid-diagram": "Mermaid 图",
"canvas": "画布",
"web-view": "网页视图",
@@ -1462,7 +1462,11 @@
"confirm-change": "当笔记内容不为空时,不建议更改笔记类型。您仍然要继续吗?",
"geo-map": "地理地图",
"beta-feature": "测试版",
"task-list": "待办事项列表"
"task-list": "任务列表",
"ai-chat": "AI聊天",
"new-feature": "新建",
"collections": "集合",
"book": "集合"
},
"protect_note": {
"toggle-on": "保护笔记",
@@ -1572,7 +1576,9 @@
},
"clipboard": {
"cut": "笔记已剪切到剪贴板。",
"copied": "笔记已复制到剪贴板。"
"copied": "笔记已复制到剪贴板。",
"copy_failed": "由于权限问题,无法复制到剪贴板。",
"copy_success": "已复制到剪贴板。"
},
"entrypoints": {
"note-revision-created": "笔记修订已创建。",
@@ -1623,7 +1629,8 @@
"word_wrapping": "自动换行",
"theme_none": "无语法高亮",
"theme_group_light": "浅色主题",
"theme_group_dark": "深色主题"
"theme_group_dark": "深色主题",
"copy_title": "复制到剪贴板"
},
"classic_editor_toolbar": {
"title": "格式"
@@ -1661,7 +1668,8 @@
"link_context_menu": {
"open_note_in_new_tab": "在新标签页中打开笔记",
"open_note_in_new_split": "在新分屏中打开笔记",
"open_note_in_new_window": "在新窗口中打开笔记"
"open_note_in_new_window": "在新窗口中打开笔记",
"open_note_in_popup": "快速编辑"
},
"electron_integration": {
"desktop-application": "桌面应用程序",
@@ -1681,7 +1689,8 @@
"full-text-search": "全文搜索"
},
"note_tooltip": {
"note-has-been-deleted": "笔记已被删除。"
"note-has-been-deleted": "笔记已被删除。",
"quick-edit": "快速编辑"
},
"geo-map": {
"create-child-note-title": "创建一个新的子笔记并将其添加到地图中",
@@ -1690,7 +1699,8 @@
},
"geo-map-context": {
"open-location": "打开位置",
"remove-from-map": "从地图中移除"
"remove-from-map": "从地图中移除",
"add-note": "在这个位置添加一个标记"
},
"help-button": {
"title": "打开相关帮助页面"
@@ -1722,5 +1732,271 @@
"tomorrow": "明天",
"yesterday": "昨天"
}
},
"ai_llm": {
"not_started": "未开始",
"title": "AI设置",
"processed_notes": "已处理笔记",
"total_notes": "笔记总数",
"progress": "进度",
"queued_notes": "排队中笔记",
"failed_notes": "失败笔记",
"last_processed": "最后处理时间",
"refresh_stats": "刷新统计数据",
"enable_ai_features": "启用AI/LLM功能",
"enable_ai_description": "启用笔记摘要、内容生成等AI功能及其他LLM能力",
"openai_tab": "OpenAI",
"anthropic_tab": "Anthropic",
"voyage_tab": "Voyage AI",
"ollama_tab": "Ollama",
"enable_ai": "启用AI/LLM功能",
"enable_ai_desc": "启用笔记摘要、内容生成等AI功能及其他LLM能力",
"provider_configuration": "AI提供商配置",
"provider_precedence": "提供商优先级",
"provider_precedence_description": "按优先级排序的提供商列表(用逗号分隔,例如:'openai,anthropic,ollama'",
"temperature": "温度参数",
"temperature_description": "控制响应的随机性0 = 确定性输出2 = 最大随机性)",
"system_prompt": "系统提示词",
"system_prompt_description": "所有AI交互使用的默认系统提示词",
"openai_configuration": "OpenAI配置",
"openai_settings": "OpenAI设置",
"api_key": "API密钥",
"url": "基础URL",
"model": "模型",
"openai_api_key_description": "用于访问OpenAI服务的API密钥",
"anthropic_api_key_description": "用于访问Claude模型的Anthropic API密钥",
"default_model": "默认模型",
"openai_model_description": "示例gpt-4o、gpt-4-turbo、gpt-3.5-turbo",
"base_url": "基础URL",
"openai_url_description": "默认https://api.openai.com/v1",
"anthropic_settings": "Anthropic设置",
"anthropic_url_description": "Anthropic API的基础URL默认https://api.anthropic.com",
"anthropic_model_description": "用于聊天补全的Anthropic Claude模型",
"voyage_settings": "Voyage AI设置",
"ollama_settings": "Ollama设置",
"ollama_url_description": "Ollama API的URL默认http://localhost:11434",
"ollama_model_description": "用于聊天补全的 Ollama 模型",
"anthropic_configuration": "Anthropic配置",
"voyage_configuration": "Voyage AI配置",
"voyage_url_description": "默认https://api.voyageai.com/v1",
"ollama_configuration": "Ollama配置",
"enable_ollama": "启用Ollama",
"enable_ollama_description": "启用Ollama以使用本地AI模型",
"ollama_url": "Ollama URL",
"ollama_model": "Ollama模型",
"refresh_models": "刷新模型",
"refreshing_models": "刷新中...",
"enable_automatic_indexing": "启用自动索引",
"rebuild_index": "重建索引",
"rebuild_index_error": "启动索引重建失败。请查看日志了解详情。",
"note_title": "笔记标题",
"error": "错误",
"last_attempt": "最后尝试时间",
"actions": "操作",
"retry": "重试",
"partial": "{{ percentage }}% 已完成",
"retry_queued": "笔记已加入重试队列",
"retry_failed": "笔记加入重试队列失败",
"max_notes_per_llm_query": "每次查询的最大笔记数",
"max_notes_per_llm_query_description": "AI上下文包含的最大相似笔记数量",
"active_providers": "活跃提供商",
"disabled_providers": "已禁用提供商",
"remove_provider": "从搜索中移除提供商",
"restore_provider": "将提供商恢复到搜索中",
"similarity_threshold": "相似度阈值",
"similarity_threshold_description": "纳入LLM查询上下文的笔记最低相似度分数0-1",
"reprocess_index": "重建搜索索引",
"reprocessing_index": "重建中...",
"reprocess_index_started": "搜索索引优化已在后台启动",
"reprocess_index_error": "重建搜索索引失败",
"index_rebuild_progress": "索引重建进度",
"index_rebuilding": "正在优化索引({{percentage}}%",
"index_rebuild_complete": "索引优化完成",
"index_rebuild_status_error": "检查索引重建状态失败",
"never": "从未",
"processing": "处理中({{percentage}}%",
"incomplete": "未完成({{percentage}}%",
"complete": "已完成100%",
"refreshing": "刷新中...",
"auto_refresh_notice": "每 {{seconds}} 秒自动刷新",
"note_queued_for_retry": "笔记已加入重试队列",
"failed_to_retry_note": "重试笔记失败",
"all_notes_queued_for_retry": "所有失败笔记已加入重试队列",
"failed_to_retry_all": "重试笔记失败",
"ai_settings": "AI设置",
"api_key_tooltip": "用于访问服务的API密钥",
"empty_key_warning": {
"anthropic": "Anthropic API密钥为空。请输入有效的API密钥。",
"openai": "OpenAI API密钥为空。请输入有效的API密钥。",
"voyage": "Voyage API密钥为空。请输入有效的API密钥。",
"ollama": "Ollama API密钥为空。请输入有效的API密钥。"
},
"agent": {
"processing": "处理中...",
"thinking": "思考中...",
"loading": "加载中...",
"generating": "生成中..."
},
"name": "AI",
"openai": "OpenAI",
"use_enhanced_context": "使用增强上下文",
"enhanced_context_description": "为AI提供来自笔记及其相关笔记的更多上下文以获得更好的响应",
"show_thinking": "显示思考过程",
"show_thinking_description": "显示AI的思维链过程",
"enter_message": "输入你的消息...",
"error_contacting_provider": "联系AI提供商失败。请检查你的设置和网络连接。",
"error_generating_response": "生成AI响应失败",
"index_all_notes": "为所有笔记建立索引",
"index_status": "索引状态",
"indexed_notes": "已索引笔记",
"indexing_stopped": "索引已停止",
"indexing_in_progress": "索引进行中...",
"last_indexed": "最后索引时间",
"n_notes_queued_0": "{{ count }} 条笔记已加入索引队列",
"note_chat": "笔记聊天",
"notes_indexed_0": "{{ count }} 条笔记已索引",
"sources": "来源",
"start_indexing": "开始索引",
"use_advanced_context": "使用高级上下文",
"ollama_no_url": "Ollama 未配置。请输入有效的URL。",
"chat": {
"root_note_title": "AI聊天记录",
"root_note_content": "此笔记包含你保存的AI聊天对话。",
"new_chat_title": "新聊天",
"create_new_ai_chat": "创建新的AI聊天"
},
"create_new_ai_chat": "创建新的AI聊天",
"configuration_warnings": "你的AI配置存在一些问题。请检查你的设置。",
"experimental_warning": "LLM功能目前处于实验阶段 - 特此提醒。",
"selected_provider": "已选提供商",
"selected_provider_description": "选择用于聊天和补全功能的AI提供商",
"select_model": "选择模型...",
"select_provider": "选择提供商..."
},
"code-editor-options": {
"title": "编辑器"
},
"custom_date_time_format": {
"title": "自定义日期/时间格式",
"description": "通过<kbd></kbd>或工具栏的方式可自定义日期和时间格式,有关日期/时间格式字符串中各个字符的含义,请参阅<a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">Day.js docs</a>。",
"format_string": "日期/时间格式字符串:",
"formatted_time": "格式化后日期/时间:"
},
"content_widget": {
"unknown_widget": "未知组件:\"{{id}}\"."
},
"note_language": {
"not_set": "不设置",
"configure-languages": "设置语言..."
},
"content_language": {
"title": "内容语言",
"description": "选择一种或多种语言出现在只读或可编辑文本注释的基本属性,这将支持拼写检查或从右向左之类的功能。"
},
"switch_layout_button": {
"title_vertical": "将编辑面板移至底部",
"title_horizontal": "将编辑面板移至左侧"
},
"toggle_read_only_button": {
"unlock-editing": "解锁编辑",
"lock-editing": "锁定编辑"
},
"png_export_button": {
"button_title": "将图表导出为PNG"
},
"svg": {
"export_to_png": "无法将图表导出为PNG。"
},
"code_theme": {
"title": "外观",
"word_wrapping": "自动换行",
"color-scheme": "配色方案"
},
"cpu_arch_warning": {
"title": "请下载ARM64版本",
"message_macos": "TriliumNext当前正在通过Rosetta 2转译运行这意味着您在Apple Silicon芯片的Mac上使用的是Intelx64版本。这将显著影响性能和电池续航。",
"message_windows": "TriliumNext当前正在模拟环境中运行这意味着您在ARM架构的Windows设备上使用的是Intelx64版本。这将显著影响性能和电池续航。",
"recommendation": "为获得最佳体验请从我们的发布页面下载TriliumNext的原生ARM64版本。",
"download_link": "下载原生版本",
"continue_anyway": "仍然继续",
"dont_show_again": "不再显示此警告"
},
"editorfeatures": {
"title": "功能",
"emoji_completion_enabled": "启用表情自动补全",
"note_completion_enabled": "启用笔记自动补全"
},
"table_view": {
"new-row": "新增行",
"new-column": "新增列",
"sort-column-by": "按\"{{title}}\"排序",
"sort-column-ascending": "升序",
"sort-column-descending": "降序",
"sort-column-clear": "清除排序",
"hide-column": "隐藏\"{{title}}\"列",
"show-hide-columns": "显示/隐藏列",
"row-insert-above": "在上方插入行",
"row-insert-below": "在下方插入行",
"row-insert-child": "插入子笔记",
"add-column-to-the-left": "在左侧添加列",
"add-column-to-the-right": "在右侧添加列",
"edit-column": "编辑列",
"delete_column_confirmation": "确定要删除此列吗?所有笔记中对应的属性都将被移除。",
"delete-column": "删除列",
"new-column-label": "标签",
"new-column-relation": "关联"
},
"book_properties_config": {
"hide-weekends": "隐藏周末",
"display-week-numbers": "显示周数",
"map-style": "地图样式:",
"max-nesting-depth": "最大嵌套深度:",
"raster": "栅格",
"vector_light": "矢量(浅色)",
"vector_dark": "矢量(深色)",
"show-scale": "显示比例尺"
},
"table_context_menu": {
"delete_row": "删除行"
},
"board_view": {
"delete-note": "删除笔记",
"move-to": "移动到",
"insert-above": "在上方插入",
"insert-below": "在下方插入",
"delete-column": "删除列",
"delete-column-confirmation": "确定要删除此列吗?此列下所有笔记中对应的属性也将被删除。",
"new-item": "新增项目",
"add-column": "添加列"
},
"command_palette": {
"tree-action-name": "树形:{{name}}",
"export_note_title": "导出笔记",
"export_note_description": "导出当前笔记",
"show_attachments_title": "显示附件",
"show_attachments_description": "查看笔记附件",
"search_notes_title": "搜索笔记",
"search_notes_description": "打开高级搜索",
"search_subtree_title": "在子树中搜索",
"search_subtree_description": "在当前子树范围内搜索",
"search_history_title": "显示搜索历史",
"search_history_description": "查看之前的搜索记录",
"configure_launch_bar_title": "配置启动栏",
"configure_launch_bar_description": "打开启动栏配置,添加或移除项目。"
},
"content_renderer": {
"open_externally": "在外部打开"
},
"modal": {
"close": "关闭",
"help_title": "显示关于此画面的更多信息"
},
"call_to_action": {
"next_theme_title": "新的 Trilium 主题已进入稳定版",
"next_theme_message": "有一段时间,我们一直在设计新的主题,为了让应用程序看起来更加现代。",
"next_theme_button": "切换至新的 Trilium 主题",
"background_effects_title": "背景效果现已推出稳定版本",
"background_effects_message": "在 Windows 装置上,背景效果现在已完全稳定。背景效果通过模糊背后的背景,为使用者界面增添一抹色彩。此技术也用于其他应用程序,例如 Windows 资源管理器。",
"background_effects_button": "启用背景效果"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
{
"about": {
"title": "Πληροφορίες για το Trilium Notes",
"homepage": "Αρχική Σελίδα:",
"app_version": "Έκδοση εφαρμογής:",
"db_version": "Έκδοση βάσης δεδομένων:",
"sync_version": "Έκδοση πρωτοκόλου συγχρονισμού:",
"build_date": "Ημερομηνία χτισίματος εφαρμογής:",
"build_revision": "Αριθμός αναθεώρησης χτισίματος:",
"data_directory": "Φάκελος δεδομένων:"
},
"toast": {
"critical-error": {
"title": "Κρίσιμο σφάλμα",
"message": "Συνέβη κάποιο κρίσιμο σφάλμα, το οποίο δεν επιτρέπει στην εφαρμογή χρήστη να ξεκινήσει:\n\n{{message}}\n\nΤο πιθανότερο είναι να προκλήθηκε από κάποιο script που απέτυχε απρόοπτα. Δοκιμάστε να ξεκινήσετε την εφαρμογή σε ασφαλή λειτουργία για να λύσετε το πρόβλημα."
}
}
}

View File

@@ -1,7 +1,6 @@
{
"about": {
"title": "About Trilium Notes",
"close": "Close",
"homepage": "Homepage:",
"app_version": "App version:",
"db_version": "DB version:",
@@ -28,25 +27,22 @@
"add_link": {
"add_link": "Add link",
"help_on_links": "Help on links",
"close": "Close",
"note": "Note",
"search_note": "search for note by its name",
"link_title_mirrors": "link title mirrors the note's current title",
"link_title_arbitrary": "link title can be changed arbitrarily",
"link_title": "Link title",
"button_add_link": "Add link <kbd>enter</kbd>"
"button_add_link": "Add link"
},
"branch_prefix": {
"edit_branch_prefix": "Edit branch prefix",
"help_on_tree_prefix": "Help on Tree prefix",
"close": "Close",
"prefix": "Prefix: ",
"save": "Save",
"branch_prefix_saved": "Branch prefix has been saved."
},
"bulk_actions": {
"bulk_actions": "Bulk actions",
"close": "Close",
"affected_notes": "Affected notes",
"include_descendants": "Include descendants of the selected notes",
"available_actions": "Available actions",
@@ -61,20 +57,18 @@
},
"clone_to": {
"clone_notes_to": "Clone notes to...",
"close": "Close",
"help_on_links": "Help on links",
"notes_to_clone": "Notes to clone",
"target_parent_note": "Target parent note",
"search_for_note_by_its_name": "search for note by its name",
"cloned_note_prefix_title": "Cloned note will be shown in note tree with given prefix",
"prefix_optional": "Prefix (optional)",
"clone_to_selected_note": "Clone to selected note <kbd>enter</kbd>",
"clone_to_selected_note": "Clone to selected note",
"no_path_to_clone_to": "No path to clone to.",
"note_cloned": "Note \"{{clonedTitle}}\" has been cloned into \"{{targetTitle}}\""
},
"confirm": {
"confirmation": "Confirmation",
"close": "Close",
"cancel": "Cancel",
"ok": "OK",
"are_you_sure_remove_note": "Are you sure you want to remove the note \"{{title}}\" from relation map? ",
@@ -87,9 +81,9 @@
"delete_all_clones_description": "Delete also all clones (can be undone in recent changes)",
"erase_notes_description": "Normal (soft) deletion only marks the notes as deleted and they can be undeleted (in recent changes dialog) within a period of time. Checking this option will erase the notes immediately and it won't be possible to undelete the notes.",
"erase_notes_warning": "Erase notes permanently (can't be undone), including all clones. This will force application reload.",
"notes_to_be_deleted": "Following notes will be deleted ({{- noteCount}})",
"notes_to_be_deleted": "Following notes will be deleted ({{notesCount}})",
"no_note_to_delete": "No note will be deleted (only clones).",
"broken_relations_to_be_deleted": "Following relations will be broken and deleted ({{- relationCount}})",
"broken_relations_to_be_deleted": "Following relations will be broken and deleted ({{ relationCount}})",
"cancel": "Cancel",
"ok": "OK",
"deleted_relation_text": "Note {{- note}} (to be deleted) is referenced by relation {{- relation}} originating from {{- source}}."
@@ -113,21 +107,20 @@
"format_pdf": "PDF - for printing or sharing purposes."
},
"help": {
"fullDocumentation": "Help (full documentation is available <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">online</a>)",
"close": "Close",
"title": "Cheatsheet",
"noteNavigation": "Note navigation",
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - go up/down in the list of notes",
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - collapse/expand node",
"goUpDown": "go up/down in the list of notes",
"collapseExpand": "collapse/expand node",
"notSet": "not set",
"goBackForwards": "go back / forwards in the history",
"showJumpToNoteDialog": "show <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Jump to\" dialog</a>",
"scrollToActiveNote": "scroll to active note",
"jumpToParentNote": "<kbd>Backspace</kbd> - jump to parent note",
"jumpToParentNote": "jump to parent note",
"collapseWholeTree": "collapse whole note tree",
"collapseSubTree": "collapse sub-tree",
"tabShortcuts": "Tab shortcuts",
"newTabNoteLink": "<kbd>Ctrl+click</kbd> - (or <kbd>middle mouse click</kbd>) on note link opens note in a new tab",
"newTabWithActivationNoteLink": "<kbd>Ctrl+Shift+click</kbd> - (or <kbd>Shift+middle mouse click</kbd>) on note link opens and activates the note in a new tab",
"newTabNoteLink": "on note link opens note in a new tab",
"newTabWithActivationNoteLink": "on note link opens and activates the note in a new tab",
"onlyInDesktop": "Only in desktop (Electron build)",
"openEmptyTab": "open empty tab",
"closeActiveTab": "close active tab",
@@ -142,14 +135,14 @@
"moveNoteUpHierarchy": "move note up in the hierarchy",
"multiSelectNote": "multi-select note above/below",
"selectAllNotes": "select all notes in the current level",
"selectNote": "<kbd>Shift+click</kbd> - select note",
"selectNote": "select note",
"copyNotes": "copy active note (or current selection) into clipboard (used for <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">cloning</a>)",
"cutNotes": "cut current note (or current selection) into clipboard (used for moving notes)",
"pasteNotes": "paste note(s) as sub-note into active note (which is either move or clone depending on whether it was copied or cut into clipboard)",
"deleteNotes": "delete note / sub-tree",
"editingNotes": "Editing notes",
"editNoteTitle": "in tree pane will switch from tree pane into note title. Enter from note title will switch focus to text editor. <kbd>Ctrl+.</kbd> will switch back from editor to tree pane.",
"createEditLink": "<kbd>Ctrl+K</kbd> - create / edit external link",
"createEditLink": "create / edit external link",
"createInternalLink": "create internal link",
"followLink": "follow link under cursor",
"insertDateTime": "insert current date and time at caret position",
@@ -169,7 +162,6 @@
},
"import": {
"importIntoNote": "Import into note",
"close": "Close",
"chooseImportFile": "Choose import file",
"importDescription": "Content of the selected file(s) will be imported as child note(s) into",
"options": "Options",
@@ -196,14 +188,13 @@
},
"include_note": {
"dialog_title": "Include note",
"close": "Close",
"label_note": "Note",
"placeholder_search": "search for note by its name",
"box_size_prompt": "Box size of the included note:",
"box_size_small": "small (~ 10 lines)",
"box_size_medium": "medium (~ 30 lines)",
"box_size_full": "full (box shows complete text)",
"button_include": "Include note <kbd>enter</kbd>"
"button_include": "Include note"
},
"info": {
"modalTitle": "Info message",
@@ -212,23 +203,20 @@
},
"jump_to_note": {
"search_placeholder": "Search for note by its name or type > for commands...",
"close": "Close",
"search_button": "Search in full text <kbd>Ctrl+Enter</kbd>"
"search_button": "Search in full text"
},
"markdown_import": {
"dialog_title": "Markdown import",
"close": "Close",
"modal_body_text": "Because of browser sandbox it's not possible to directly read clipboard from JavaScript. Please paste the Markdown to import to textarea below and click on Import button",
"import_button": "Import Ctrl+Enter",
"import_button": "Import",
"import_success": "Markdown content has been imported into the document."
},
"move_to": {
"dialog_title": "Move notes to ...",
"close": "Close",
"notes_to_move": "Notes to move",
"target_parent_note": "Target parent note",
"search_placeholder": "search for note by its name",
"move_button": "Move to selected note <kbd>enter</kbd>",
"move_button": "Move to selected note",
"error_no_path": "No path to move to.",
"move_success_message": "Selected notes have been moved into "
},
@@ -236,20 +224,19 @@
"change_path_prompt": "Change where to create the new note:",
"search_placeholder": "search path by name (default if empty)",
"modal_title": "Choose note type",
"close": "Close",
"modal_body": "Choose note type / template of the new note:",
"templates": "Templates:"
"templates": "Templates",
"builtin_templates": "Built-in Templates"
},
"password_not_set": {
"title": "Password is not set",
"close": "Close",
"body1": "Protected notes are encrypted using a user password, but password has not been set yet.",
"body2": "To be able to protect notes, click <a class=\"open-password-options-button\" href=\"javascript:\">here</a> to open the Options dialog and set your password."
"body2": "To be able to protect notes, click the button below to open the Options dialog and set your password.",
"go_to_password_options": "Go to Password options"
},
"prompt": {
"title": "Prompt",
"close": "Close",
"ok": "OK <kbd>enter</kbd>",
"ok": "OK",
"defaultTitle": "Prompt"
},
"protected_session_password": {
@@ -257,12 +244,11 @@
"help_title": "Help on Protected notes",
"close_label": "Close",
"form_label": "To proceed with requested action you need to start protected session by entering password:",
"start_button": "Start protected session <kbd>enter</kbd>"
"start_button": "Start protected session"
},
"recent_changes": {
"title": "Recent changes",
"erase_notes_button": "Erase deleted notes now",
"close": "Close",
"deleted_notes_message": "Deleted notes have been erased.",
"no_changes_message": "No changes yet...",
"undelete_link": "undelete",
@@ -273,7 +259,6 @@
"delete_all_revisions": "Delete all revisions of this note",
"delete_all_button": "Delete all revisions",
"help_title": "Help on Note Revisions",
"close": "Close",
"revision_last_edited": "This revision was last edited on {{date}}",
"confirm_delete_all": "Do you want to delete all revisions of this note?",
"no_revisions": "No revisions for this note yet...",
@@ -295,7 +280,6 @@
},
"sort_child_notes": {
"sort_children_by": "Sort children by...",
"close": "Close",
"sorting_criteria": "Sorting criteria",
"title": "title",
"date_created": "date created",
@@ -309,13 +293,12 @@
"sort_with_respect_to_different_character_sorting": "sort with respect to different character sorting and collation rules in different languages or regions.",
"natural_sort_language": "Natural sort language",
"the_language_code_for_natural_sort": "The language code for natural sort, e.g. \"zh-CN\" for Chinese.",
"sort": "Sort <kbd>enter</kbd>"
"sort": "Sort"
},
"upload_attachments": {
"upload_attachments_to_note": "Upload attachments to note",
"close": "Close",
"choose_files": "Choose files",
"files_will_be_uploaded": "Files will be uploaded as attachments into",
"files_will_be_uploaded": "Files will be uploaded as attachments into {{noteTitle}}",
"options": "Options",
"shrink_images": "Shrink images",
"upload": "Upload",
@@ -1118,12 +1101,12 @@
"title": "Application Theme",
"theme_label": "Theme",
"override_theme_fonts_label": "Override theme fonts",
"auto_theme": "Auto",
"light_theme": "Light",
"dark_theme": "Dark",
"triliumnext": "TriliumNext Beta (Follow system color scheme)",
"triliumnext-light": "TriliumNext Beta (Light)",
"triliumnext-dark": "TriliumNext Beta (Dark)",
"auto_theme": "Legacy (Follow system color scheme)",
"light_theme": "Legacy (Light)",
"dark_theme": "Legacy (Dark)",
"triliumnext": "Trilium (Follow system color scheme)",
"triliumnext-light": "Trilium (Light)",
"triliumnext-dark": "Trilium (Dark)",
"layout": "Layout",
"layout-vertical-title": "Vertical",
"layout-horizontal-title": "Horizontal",
@@ -2005,5 +1988,17 @@
},
"content_renderer": {
"open_externally": "Open externally"
},
"modal": {
"close": "Close",
"help_title": "Display more information about this screen"
},
"call_to_action": {
"next_theme_title": "The new Trilium theme is now stable",
"next_theme_message": "For a while now, we've been working on a new theme to give the application a more modern look.",
"next_theme_button": "Switch to the new Trilium theme",
"background_effects_title": "Background effects are now stable",
"background_effects_message": "On Windows devices, background effects are now fully stable. The background effects adds a touch of color to the user interface by blurring the background behind it. This technique is also used in other applications such as Windows Explorer.",
"background_effects_button": "Enable background effects"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
{
"about": {
"title": "À propos de Trilium Notes",
"close": "Fermer",
"homepage": "Page d'accueil :",
"app_version": "Version de l'application :",
"db_version": "Version de la base de données :",
@@ -28,25 +27,22 @@
"add_link": {
"add_link": "Ajouter un lien",
"help_on_links": "Aide sur les liens",
"close": "Fermer",
"note": "Note",
"search_note": "rechercher une note par son nom",
"link_title_mirrors": "le titre du lien reflète le titre actuel de la note",
"link_title_arbitrary": "le titre du lien peut être modifié arbitrairement",
"link_title": "Titre du lien",
"button_add_link": "Ajouter un lien <kbd>Entrée</kbd>"
"button_add_link": "Ajouter un lien"
},
"branch_prefix": {
"edit_branch_prefix": "Modifier le préfixe de branche",
"help_on_tree_prefix": "Aide sur le préfixe de l'arbre",
"close": "Fermer",
"prefix": "Préfixe : ",
"save": "Sauvegarder",
"branch_prefix_saved": "Le préfixe de la branche a été enregistré."
},
"bulk_actions": {
"bulk_actions": "Actions groupées",
"close": "Fermer",
"affected_notes": "Notes concernées",
"include_descendants": "Inclure les descendants des notes sélectionnées",
"available_actions": "Actions disponibles",
@@ -61,20 +57,18 @@
},
"clone_to": {
"clone_notes_to": "Cloner les notes dans...",
"close": "Fermer",
"help_on_links": "Aide sur les liens",
"notes_to_clone": "Notes à cloner",
"target_parent_note": "Note parent cible",
"search_for_note_by_its_name": "rechercher une note par son nom",
"cloned_note_prefix_title": "La note clonée sera affichée dans l'arbre des notes avec le préfixe donné",
"prefix_optional": "Préfixe (facultatif)",
"clone_to_selected_note": "Cloner vers la note sélectionnée <kbd>entrer</kbd>",
"clone_to_selected_note": "Cloner vers la note sélectionnée",
"no_path_to_clone_to": "Aucun chemin vers lequel cloner.",
"note_cloned": "La note \"{{clonedTitle}}\" a été clonée dans \"{{targetTitle}}\""
},
"confirm": {
"confirmation": "Confirmation",
"close": "Fermer",
"cancel": "Annuler",
"ok": "OK",
"are_you_sure_remove_note": "Voulez-vous vraiment supprimer la note « {{title}} » de la carte des relations ? ",
@@ -87,9 +81,9 @@
"delete_all_clones_description": "Supprimer aussi les clones (peut être annulé dans des modifications récentes)",
"erase_notes_description": "La suppression normale (douce) marque uniquement les notes comme supprimées et elles peuvent être restaurées (dans la boîte de dialogue des Modifications récentes) dans un délai donné. Cocher cette option effacera les notes immédiatement et il ne sera pas possible de les restaurer.",
"erase_notes_warning": "Efface les notes de manière permanente (ne peut pas être annulée), y compris les clones. L'application va être rechargée.",
"notes_to_be_deleted": "Les notes suivantes seront supprimées ({{- noteCount}})",
"notes_to_be_deleted": "Les notes suivantes seront supprimées ({{notesCount}})",
"no_note_to_delete": "Aucune note ne sera supprimée (uniquement les clones).",
"broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{- relationCount}})",
"broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{ relationCount}})",
"cancel": "Annuler",
"ok": "OK",
"deleted_relation_text": "Note {{- note}} (à supprimer) est référencée dans la relation {{- relation}} provenant de {{- source}}."
@@ -113,20 +107,18 @@
"format_pdf": "PDF - pour l'impression ou le partage de documents."
},
"help": {
"fullDocumentation": "Aide (la documentation complète est disponible <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">en ligne</a>)",
"close": "Fermer",
"noteNavigation": "Navigation dans les notes",
"goUpDown": "<kbd>HAUT</kbd>, <kbd>BAS</kbd> - aller vers le haut/bas dans la liste des notes",
"collapseExpand": "<kbd>GAUCHE</kbd>, <kbd>DROITE</kbd> - réduire/développer le nœud",
"goUpDown": "aller vers le haut/bas dans la liste des notes",
"collapseExpand": "réduire/développer le nœud",
"notSet": "non défini",
"goBackForwards": "reculer/avancer dans l'historique",
"showJumpToNoteDialog": "afficher la <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">boîte de dialogue \"Aller à la note\"</a>",
"scrollToActiveNote": "faire défiler jusqu'à la note active",
"jumpToParentNote": "<kbd>Retour arrière</kbd> - aller à la note parent",
"jumpToParentNote": "aller à la note parent",
"collapseWholeTree": "réduire tout l'arbre des notes",
"collapseSubTree": "réduire le sous-arbre",
"tabShortcuts": "Raccourcis des onglets",
"newTabNoteLink": "<kbd>CTRL+clic</kbd> - (ou clic central de la souris) sur le lien de la note ouvre la note dans un nouvel onglet",
"newTabNoteLink": "sur le lien de la note ouvre la note dans un nouvel onglet",
"onlyInDesktop": "Uniquement sur ordinateur (version Electron)",
"openEmptyTab": "ouvrir un onglet vide",
"closeActiveTab": "fermer l'onglet actif",
@@ -141,14 +133,14 @@
"moveNoteUpHierarchy": "déplacer la note vers le haut dans la hiérarchie",
"multiSelectNote": "sélectionner plusieurs notes au-dessus/au-dessous",
"selectAllNotes": "sélectionner toutes les notes du niveau actuel",
"selectNote": "<kbd>Shift+clic</kbd> - sélectionner une note",
"selectNote": "sélectionner une note",
"copyNotes": "copier la note active (ou la sélection actuelle) dans le presse-papiers (utilisé pour le <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonage</a>)",
"cutNotes": "couper la note actuelle (ou la sélection actuelle) dans le presse-papiers (utilisé pour déplacer les notes)",
"pasteNotes": "coller la ou les notes en tant que sous-note dans la note active (qui est soit déplacée, soit clonée selon qu'elle a été copiée ou coupée dans le presse-papiers)",
"deleteNotes": "supprimer une note / un sous-arbre",
"editingNotes": "Édition des notes",
"editNoteTitle": "dans le volet de l'arborescence, basculera du volet au titre de la note. Presser Entrer à partir du titre de la note basculera vers léditeur de texte. <kbd>Ctrl+.</kbd> bascule de l'éditeur au volet arborescent.",
"createEditLink": "<kbd>Ctrl+K</kbd> - créer/éditer un lien externe",
"createEditLink": "créer/éditer un lien externe",
"createInternalLink": "créer un lien interne",
"followLink": "suivre le lien sous le curseur",
"insertDateTime": "insérer la date et l'heure courante à la position du curseur",
@@ -164,11 +156,12 @@
"showSQLConsole": "afficher la console SQL",
"other": "Autre",
"quickSearch": "aller à la recherche rapide",
"inPageSearch": "recherche sur la page"
"inPageSearch": "recherche sur la page",
"title": "Aide-mémoire",
"newTabWithActivationNoteLink": "Lorsquon clique sur un lien de note, celle-ci souvre et devient active dans un nouvel onglet"
},
"import": {
"importIntoNote": "Importer dans la note",
"close": "Fermer",
"chooseImportFile": "Choisissez le fichier à importer",
"importDescription": "Le contenu du ou des fichiers sélectionnés sera importé en tant que note(s) enfant dans",
"options": "Options",
@@ -195,14 +188,13 @@
},
"include_note": {
"dialog_title": "Inclure une note",
"close": "Fermer",
"label_note": "Note",
"placeholder_search": "rechercher une note par son nom",
"box_size_prompt": "Taille de la boîte de la note incluse :",
"box_size_small": "petit (~ 10 lignes)",
"box_size_medium": "moyen (~ 30 lignes)",
"box_size_full": "complet (la boîte affiche le texte complet)",
"button_include": "Inclure une note <kbd>Entrée</kbd>"
"button_include": "Inclure une note"
},
"info": {
"modalTitle": "Message d'information",
@@ -210,43 +202,35 @@
"okButton": "OK"
},
"jump_to_note": {
"search_placeholder": "",
"close": "Fermer",
"search_button": "Rechercher dans le texte intégral <kbd>Ctrl+Entrée</kbd>"
"search_button": "Rechercher dans le texte intégral"
},
"markdown_import": {
"dialog_title": "Importation Markdown",
"close": "Fermer",
"modal_body_text": "En raison du bac à sable du navigateur, il n'est pas possible de lire directement le presse-papiers à partir de JavaScript. Veuillez coller le Markdown à importer dans la zone de texte ci-dessous et cliquez sur le bouton Importer",
"import_button": "Importer Ctrl+Entrée",
"import_button": "Importer",
"import_success": "Le contenu Markdown a été importé dans le document."
},
"move_to": {
"dialog_title": "Déplacer les notes vers...",
"close": "Fermer",
"notes_to_move": "Notes à déplacer",
"target_parent_note": "Note parent cible",
"search_placeholder": "rechercher une note par son nom",
"move_button": "Déplacer vers la note sélectionnée <kbd>entrer</kbd>",
"move_button": "Déplacer vers la note sélectionnée",
"error_no_path": "Aucun chemin vers lequel déplacer.",
"move_success_message": "Les notes sélectionnées ont été déplacées dans "
},
"note_type_chooser": {
"modal_title": "Choisissez le type de note",
"close": "Fermer",
"modal_body": "Choisissez le type de note/le modèle de la nouvelle note :",
"templates": "Modèles :"
"templates": "Modèles"
},
"password_not_set": {
"title": "Le mot de passe n'est pas défini",
"close": "Fermer",
"body1": "Les notes protégées sont cryptées à l'aide d'un mot de passe utilisateur, mais le mot de passe n'a pas encore été défini.",
"body2": "Pour pouvoir protéger les notes, cliquez <a class=\"open-password-options-button\" href=\"javascript:\">ici</a> pour ouvrir les Options et définir votre mot de passe."
"body1": "Les notes protégées sont cryptées à l'aide d'un mot de passe utilisateur, mais le mot de passe n'a pas encore été défini."
},
"prompt": {
"title": "Prompt",
"close": "Fermer",
"ok": "OK <kbd>entrer</kbd>",
"ok": "OK",
"defaultTitle": "Prompt"
},
"protected_session_password": {
@@ -254,12 +238,11 @@
"help_title": "Aide sur les notes protégées",
"close_label": "Fermer",
"form_label": "Pour procéder à l'action demandée, vous devez démarrer une session protégée en saisissant le mot de passe :",
"start_button": "Démarrer une session protégée <kbd>entrer</kbd>"
"start_button": "Démarrer une session protégée"
},
"recent_changes": {
"title": "Modifications récentes",
"erase_notes_button": "Effacer les notes supprimées maintenant",
"close": "Fermer",
"deleted_notes_message": "Les notes supprimées ont été effacées.",
"no_changes_message": "Aucun changement pour l'instant...",
"undelete_link": "annuler la suppression",
@@ -270,13 +253,10 @@
"delete_all_revisions": "Supprimer toutes les versions de cette note",
"delete_all_button": "Supprimer toutes les versions",
"help_title": "Aide sur les versions de notes",
"close": "Fermer",
"revision_last_edited": "Cette version a été modifiée pour la dernière fois le {{date}}",
"confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?",
"no_revisions": "Aucune version pour cette note pour l'instant...",
"restore_button": "",
"confirm_restore": "Voulez-vous restaurer cette version ? Le titre et le contenu actuels de la note seront écrasés par cette version.",
"delete_button": "",
"confirm_delete": "Voulez-vous supprimer cette version ?",
"revisions_deleted": "Les versions de notes ont été supprimées.",
"revision_restored": "La version de la note a été restaurée.",
@@ -292,7 +272,6 @@
},
"sort_child_notes": {
"sort_children_by": "Trier les enfants par...",
"close": "Fermer",
"sorting_criteria": "Critères de tri",
"title": "titre",
"date_created": "date de création",
@@ -306,13 +285,12 @@
"sort_with_respect_to_different_character_sorting": "trier en fonction de différentes règles de tri et de classement des caractères dans différentes langues ou régions.",
"natural_sort_language": "Langage de tri naturel",
"the_language_code_for_natural_sort": "Le code de langue pour le tri naturel, par ex. \"zh-CN\" pour le chinois.",
"sort": "Trier <kbd>Entrée</kbd>"
"sort": "Trier"
},
"upload_attachments": {
"upload_attachments_to_note": "Téléverser des pièces jointes à la note",
"close": "Fermer",
"choose_files": "Choisir des fichiers",
"files_will_be_uploaded": "Les fichiers seront téléversés sous forme de pièces jointes dans",
"files_will_be_uploaded": "Les fichiers seront téléversés sous forme de pièces jointes dans {{noteTitle}}",
"options": "Options",
"shrink_images": "Réduire les images",
"upload": "Téléverser",
@@ -401,7 +379,7 @@
"share_root": "partage cette note à l'adresse racine /share.",
"share_description": "définir le texte à ajouter à la balise méta HTML pour la description",
"share_raw": "la note sera servie dans son format brut, sans wrapper HTML",
"share_disallow_robot_indexing": "interdira l'indexation par robot de cette note via l'en-tête <code>X-Robots-Tag: noindex</code>",
"share_disallow_robot_indexing": "Interdira l'indexation par robot de cette note via l'en-tête <code>X-Robots-Tag: noindex</code>",
"share_credentials": "exiger des informations didentification pour accéder à cette note partagée. La valeur devrait être au format « nom d'utilisateur : mot de passe ». N'oubliez pas de rendre cela héritable pour l'appliquer aux notes/images enfants.",
"share_index": "la note avec ce label listera toutes les racines des notes partagées",
"display_relations": "noms des relations délimités par des virgules qui doivent être affichés. Tous les autres seront masqués.",
@@ -560,7 +538,7 @@
},
"attachments_actions": {
"open_externally": "Ouverture externe",
"open_externally_title": "Le fichier sera ouvert dans une application externe et les modifications apportées seront surveillées. \nVous pourrez ensuite téléverser la version modifiée dans Trilium.",
"open_externally_title": "Le fichier sera ouvert dans une application externe et surveillé pour détecter les modifications. Vous pourrez ensuite téléverser la version modifiée dans Trilium.",
"open_custom": "Ouvrir avec",
"open_custom_title": "Le fichier sera ouvert dans une application externe et surveillé pour les modifications. Vous pourrez ensuite téléverser la version modifiée sur Trilium.",
"download": "Télécharger",
@@ -753,7 +731,6 @@
"expand_all_children": "Développer tous les enfants",
"collapse": "Réduire",
"expand": "Développer",
"book_properties": "",
"invalid_view_type": "Type de vue non valide '{{type}}'",
"calendar": "Calendrier"
},
@@ -1107,12 +1084,9 @@
"title": "Thème de l'application",
"theme_label": "Thème",
"override_theme_fonts_label": "Remplacer les polices du thème",
"auto_theme": "Auto",
"light_theme": "Lumière",
"dark_theme": "Sombre",
"triliumnext": "TriliumNext Beta (Suit le thème du système)",
"triliumnext-light": "TriliumNext Beta (Clair)",
"triliumnext-dark": "TriliumNext Beta (sombre)",
"triliumnext": "Trilium (Suit le thème du système)",
"triliumnext-light": "Trilium (Clair)",
"triliumnext-dark": "Trilium (sombre)",
"layout": "Disposition",
"layout-vertical-title": "Vertical",
"layout-horizontal-title": "Horizontal",
@@ -1162,7 +1136,7 @@
"note_erasure_timeout": {
"note_erasure_timeout_title": "Délai d'effacement des notes",
"note_erasure_description": "Les notes supprimées (et les attributs, versions...) sont seulement marquées comme supprimées et il est possible de les récupérer à partir de la boîte de dialogue Notes récentes. Après un certain temps, les notes supprimées sont « effacées », ce qui signifie que leur contenu n'est plus récupérable. Ce paramètre vous permet de configurer la durée entre la suppression et l'effacement de la note.",
"erase_notes_after": "Effacer les notes après",
"erase_notes_after": "Effacer les notes après:",
"manual_erasing_description": "Vous pouvez également déclencher l'effacement manuellement (sans tenir compte de la durée définie ci-dessus) :",
"erase_deleted_notes_now": "Effacer les notes supprimées maintenant",
"deleted_notes_erased": "Les notes supprimées ont été effacées."
@@ -1251,10 +1225,8 @@
"etapi": {
"title": "ETAPI",
"description": "ETAPI est une API REST utilisée pour accéder à l'instance Trilium par programme, sans interface utilisateur.",
"see_more": "",
"wiki": "wiki",
"openapi_spec": "Spec ETAPI OpenAPI",
"swagger_ui": "",
"create_token": "Créer un nouveau jeton ETAPI",
"existing_tokens": "Jetons existants",
"no_tokens_yet": "Il n'y a pas encore de jetons. Cliquez sur le bouton ci-dessus pour en créer un.",
@@ -1408,7 +1380,6 @@
"relation-map": "Carte des relations",
"note-map": "Carte de notes",
"render-note": "Rendu Html",
"book": "",
"mermaid-diagram": "Diagramme Mermaid",
"canvas": "Canevas",
"web-view": "Affichage Web",
@@ -1574,7 +1545,6 @@
"auto-detect-language": "Détecté automatiquement"
},
"highlighting": {
"title": "",
"description": "Contrôle la coloration syntaxique des blocs de code à l'intérieur des notes texte, les notes de code ne seront pas affectées.",
"color-scheme": "Jeu de couleurs"
},
@@ -1674,5 +1644,11 @@
"time_selector": {
"invalid_input": "La valeur de l'heure saisie n'est pas un nombre valide.",
"minimum_input": "La valeur de temps saisie doit être d'au moins {{minimumSeconds}} secondes."
},
"multi_factor_authentication": {
"oauth_user_email": "Courriel de l'utilisateur : "
},
"modal": {
"close": "Fermer"
}
}

View File

@@ -0,0 +1,345 @@
{
"about": {
"app_version": "Versione dell'app:",
"db_version": "Versione DB:",
"sync_version": "Versione Sync:",
"data_directory": "Cartella dati:",
"title": "Informazioni su Trilium Notes",
"build_date": "Data della build:",
"build_revision": "Revisione della build:",
"homepage": "Homepage:"
},
"toast": {
"critical-error": {
"title": "Errore critico",
"message": "Si è verificato un errore critico che impedisce l'avvio dell'applicazione client:\n\n{{message}}\n\nQuesto è probabilmente causato da un errore di script inaspettato. Prova a avviare l'applicazione in modo sicuro e controlla il problema."
},
"bundle-error": {
"title": "Non si è riusciti a caricare uno script personalizzato",
"message": "Lo script della nota con ID \"{{id}}\", dal titolo \"{{title}}\" non è stato inizializzato a causa di:\n\n{{message}}"
},
"widget-error": {
"title": "Impossibile inizializzare un widget",
"message-custom": "Il widget personalizzato della nota con ID \"{{id}}\", dal titolo \"{{title}}\" non è stato inizializzato a causa di:\n\n{{message}}",
"message-unknown": "Un widget sconosciuto non è stato inizializzato a causa di:\n\n{{message}}"
}
},
"add_link": {
"add_link": "Aggiungi un collegamento",
"note": "Nota",
"search_note": "cerca una nota per nome",
"link_title_mirrors": "il titolo del collegamento rispecchia il titolo della nota corrente",
"link_title_arbitrary": "il titolo del collegamento può essere modificato arbitrariamente",
"link_title": "Titolo del collegamento",
"button_add_link": "Aggiungi il collegamento <kbd>invio</kbd>",
"help_on_links": "Aiuto sui collegamenti"
},
"branch_prefix": {
"edit_branch_prefix": "Modifica il prefisso del ramo",
"help_on_tree_prefix": "Aiuto sui prefissi dell'Albero",
"prefix": "Prefisso: ",
"save": "Salva",
"branch_prefix_saved": "Il prefisso del ramo è stato salvato."
},
"bulk_actions": {
"bulk_actions": "Azioni massive",
"affected_notes": "Note influenzate",
"include_descendants": "Includi i discendenti della nota selezionata",
"available_actions": "Azioni disponibili",
"chosen_actions": "Azioni scelte",
"execute_bulk_actions": "Esegui le azioni massive",
"bulk_actions_executed": "Le azioni massive sono state eseguite con successo.",
"none_yet": "Ancora nessuna... aggiungi una azione cliccando su una di quelle disponibili sopra.",
"labels": "Etichette",
"relations": "Relazioni",
"notes": "Note",
"other": "Altro"
},
"clone_to": {
"clone_notes_to": "Clona note in...",
"help_on_links": "Aiuto sui collegamenti",
"notes_to_clone": "Note da clonare",
"target_parent_note": "Nodo padre obiettivo",
"search_for_note_by_its_name": "cerca una nota per nome",
"cloned_note_prefix_title": "Le note clonate saranno mostrate nell'albero delle note con il dato prefisso",
"prefix_optional": "Prefisso (opzionale)",
"clone_to_selected_note": "Clona sotto la nota selezionata <kbd>invio</kbd>",
"no_path_to_clone_to": "Nessun percorso per clonare dentro.",
"note_cloned": "La nota \"{{clonedTitle}}\" è stata clonata in \"{{targetTitle}}\""
},
"confirm": {
"cancel": "Annulla",
"ok": "OK",
"confirmation": "Conferma",
"are_you_sure_remove_note": "Sei sicuro di voler rimuovere la nota \"{{title}}\" dalla mappa delle relazioni? ",
"if_you_dont_check": "Se non lo selezioni, la nota sarà rimossa solamente dalla mappa delle relazioni.",
"also_delete_note": "Rimuove anche la nota"
},
"delete_notes": {
"ok": "OK",
"close": "Chiudi",
"delete_notes_preview": "Anteprima di eliminazione delle note",
"delete_all_clones_description": "Elimina anche tutti i cloni (può essere disfatto tramite i cambiamenti recenti)",
"erase_notes_description": "L'eliminazione normale (soft) marca le note come eliminate e potranno essere recuperate entro un certo lasso di tempo (dalla finestra dei cambiamenti recenti). Selezionando questa opzione le note si elimineranno immediatamente e non sarà possibile recuperarle.",
"erase_notes_warning": "Elimina le note in modo permanente (non potrà essere disfatto), compresi tutti i cloni. Ciò forzerà un nuovo caricamento dell'applicazione.",
"cancel": "Annulla",
"notes_to_be_deleted": "Le seguenti note saranno eliminate ({{- noteCount}})",
"no_note_to_delete": "Nessuna nota sarà eliminata (solo i cloni).",
"broken_relations_to_be_deleted": "Le seguenti relazioni saranno interrotte ed eliminate ({{- relationCount}})",
"deleted_relation_text": "La nota {{- note}} (da eliminare) è referenziata dalla relazione {{- relation}} originata da {{- source}}."
},
"info": {
"okButton": "OK",
"closeButton": "Chiudi"
},
"export": {
"close": "Chiudi",
"export_note_title": "Esporta la nota",
"export_status": "Stato dell'esportazione",
"export": "Esporta",
"choose_export_type": "Scegli prima il tipo di esportazione, per favore",
"export_in_progress": "Esportazione in corso: {{progressCount}}",
"export_finished_successfully": "Esportazione terminata con successo.",
"format_pdf": "PDF- allo scopo di stampa o esportazione.",
"export_type_subtree": "Questa nota e tutti i suoi discendenti",
"format_html": "HTML - raccomandato in quanto mantiene tutti i formati",
"format_html_zip": "HTML in archivio ZIP - questo è raccomandato in quanto conserva tutta la formattazione.",
"format_markdown": "MArkdown - questo conserva la maggior parte della formattazione."
},
"password_not_set": {
"body1": "Le note protette sono crittografate utilizzando una password utente, ma la password non è stata ancora impostata.",
"body2": "Per proteggere le note, fare clic su <a class=\"open-password-options-button\" href=\"javascript:\">qui</a> per aprire la finestra di dialogo Opzioni e impostare la password."
},
"protected_session_password": {
"close_label": "Chiudi"
},
"abstract_bulk_action": {
"remove_this_search_action": "Rimuovi questa azione di ricerca"
},
"etapi": {
"new_token_title": "Nuovo token ETAPI",
"new_token_message": "Inserire il nuovo nome del token"
},
"electron_integration": {
"zoom-factor": "Fattore di ingrandimento",
"desktop-application": "Applicazione Desktop"
},
"note_autocomplete": {
"search-for": "Cerca \"{{term}}\"",
"create-note": "Crea e collega la nota figlia \"{{term}}\"",
"insert-external-link": "Inserisci il collegamento esterno a \"{{term}}\"",
"clear-text-field": "Pulisci il campo di testo",
"show-recent-notes": "Mostra le note recenti",
"full-text-search": "Ricerca full text"
},
"note_tooltip": {
"note-has-been-deleted": "La nota è stata eliminata.",
"quick-edit": "Modifica veloce"
},
"geo-map": {
"create-child-note-title": "Crea una nota figlia e aggiungila alla mappa",
"create-child-note-instruction": "Clicca sulla mappa per creare una nuova nota qui o premi Escape per uscire.",
"unable-to-load-map": "Impossibile caricare la mappa."
},
"geo-map-context": {
"open-location": "Apri la posizione",
"remove-from-map": "Rimuovi dalla mappa",
"add-note": "Aggiungi un marcatore in questa posizione"
},
"debug": {
"debug": "Debug"
},
"database_anonymization": {
"light_anonymization": "Anonimizzazione parziale",
"title": "Anonimizzazione del Database",
"full_anonymization": "Anonimizzazione completa",
"full_anonymization_description": "Questa azione creerà una nuova copia del database e lo anonimizzerà (rimuove tutti i contenuti delle note, lasciando solo la struttura e qualche metadato non sensibile) per condividerlo online allo scopo di debugging, senza paura di far trapelare i tuoi dati personali.",
"save_fully_anonymized_database": "Salva il database completamente anonimizzato",
"light_anonymization_description": "Questa azione creerà una nuova copia del database e lo anonimizzerà in parzialmente — in particolare, solo il contenuto delle note sarà rimosso, ma i titoli e gli attributi rimarranno. Inoltre, note con script personalizzati JS di frontend/backend e widget personalizzati lasciando rimarranno. Ciò mette a disposizione più contesto per il debug dei problemi.",
"choose_anonymization": "Puoi decidere da solo se fornire un database completamente o parzialmente anonimizzato. Anche un database completamente anonimizzato è molto utile, sebbene in alcuni casi i database parzialmente anonimizzati possono accelerare il processo di identificazione dei bug e la loro correzione.",
"no_anonymized_database_yet": "Nessun database ancora anonimizzato.",
"save_lightly_anonymized_database": "Salva il database parzialmente anonimizzato",
"successfully_created_fully_anonymized_database": "Database completamente anonimizzato creato in {{anonymizedFilePath}}",
"successfully_created_lightly_anonymized_database": "Database parzialmente anonimizzato creato in {{anonymizedFilePath}}"
},
"cpu_arch_warning": {
"title": "Per favore scarica la versione ARM64",
"continue_anyway": "Continua Comunque",
"dont_show_again": "Non mostrare più questo avviso",
"download_link": "Scarica la Versione Nativa"
},
"editorfeatures": {
"title": "Caratteristiche",
"emoji_completion_enabled": "Abilita il completamento automatico delle Emoji",
"note_completion_enabled": "Abilita il completamento automatico delle note"
},
"table_view": {
"new-row": "Nuova riga",
"new-column": "Nuova colonna",
"sort-column-by": "Ordina per \"{{title}}\"",
"sort-column-ascending": "Ascendente",
"sort-column-descending": "Discendente",
"sort-column-clear": "Cancella l'ordinamento",
"hide-column": "Nascondi la colonna \"{{title}}\"",
"show-hide-columns": "Mostra/nascondi le colonne",
"row-insert-above": "Inserisci una riga sopra",
"row-insert-below": "Inserisci una riga sotto"
},
"abstract_search_option": {
"remove_this_search_option": "Rimuovi questa opzione di ricerca",
"failed_rendering": "Opzione di ricerca di rendering non riuscita: {{dto}} con errore: {{error}} {{stack}}"
},
"ancestor": {
"label": "Antenato"
},
"add_label": {
"add_label": "Aggiungi etichetta",
"label_name_placeholder": "nome dell'etichetta",
"new_value_placeholder": "nuovo valore",
"to_value": "al valore"
},
"update_label_value": {
"to_value": "al valore",
"label_name_placeholder": "nome dell'etichetta"
},
"delete_label": {
"delete_label": "Elimina etichetta",
"label_name_placeholder": "nome dell'etichetta",
"label_name_title": "Sono ammessi i caratteri alfanumerici, il carattere di sottolineato e i due punti."
},
"tree-context-menu": {
"move-to": "Muovi in...",
"cut": "Taglia"
},
"electron_context_menu": {
"cut": "Taglia",
"copy": "Copia",
"paste": "Incolla",
"copy-link": "Copia collegamento",
"paste-as-plain-text": "Incolla come testo semplice"
},
"editing": {
"editor_type": {
"multiline-toolbar": "Mostra la barra degli strumenti su più linee se non entra."
}
},
"edit_button": {
"edit_this_note": "Modifica questa nota"
},
"shortcuts": {
"shortcuts": "Scorciatoie"
},
"shared_switch": {
"toggle-on-title": "Condividi la nota",
"toggle-off-title": "Non condividere la nota"
},
"search_string": {
"search_prefix": "Cerca:"
},
"attachment_detail": {
"open_help_page": "Apri la pagina di aiuto sugli allegati"
},
"search_definition": {
"ancestor": "antenato",
"debug": "debug",
"action": "azione",
"add_search_option": "Aggiungi un opzione di ricerca:",
"search_string": "cerca la stringa",
"limit": "limite"
},
"modal": {
"close": "Chiudi"
},
"board_view": {
"insert-below": "Inserisci sotto",
"delete-column": "Elimina la colonna",
"delete-column-confirmation": "Sei sicuro di vole eliminare questa colonna? Il corrispondente attributo sarà eliminato anche nelle note sotto questa colonna."
},
"backup": {
"enable_weekly_backup": "Abilita le archiviazioni settimanali",
"enable_monthly_backup": "Abilita le archiviazioni mensili",
"backup_recommendation": "Si raccomanda di mantenere attive le archiviazioni, sebbene ciò possa rendere l'avvio dell'applicazione lento con database grandi e/o dispositivi di archiviazione lenti.",
"backup_now": "Archivia adesso",
"backup_database_now": "Archivia il database adesso",
"existing_backups": "Backup esistenti",
"date-and-time": "Data e ora",
"path": "Percorso",
"database_backed_up_to": "Il database è stato archiviato in {{backupFilePath}}",
"enable_daily_backup": "Abilita le archiviazioni giornaliere",
"no_backup_yet": "Ancora nessuna archiviazione"
},
"backend_log": {
"refresh": "Aggiorna"
},
"consistency_checks": {
"find_and_fix_button": "Trova e correggi i problemi di coerenza",
"finding_and_fixing_message": "In cerca e correzione dei problemi di coerenza...",
"issues_fixed_message": "Qualsiasi problema di coerenza che possa essere stato trovato ora è corretto."
},
"database_integrity_check": {
"check_button": "Controllo dell'integrità del database",
"checking_integrity": "Controllo dell'integrità del database in corso...",
"title": "Controllo di Integrità del database",
"description": "Controllerà che il database non sia corrotto a livello SQLite. Può durare un po' di tempo, a seconda della grandezza del DB.",
"integrity_check_failed": "Controllo di integrità fallito: {{results}}"
},
"sync": {
"title": "Sincronizza",
"force_full_sync_button": "Forza una sincronizzazione completa",
"failed": "Sincronizzazione fallita: {{message}}"
},
"sync_2": {
"config_title": "Configurazione per la Sincronizzazione",
"proxy_label": "Server Proxy per la sincronizzazione (opzionale)",
"test_title": "Test di sincronizzazione",
"timeout": "Timeout per la sincronizzazione",
"timeout_unit": "millisecondi",
"save": "Salva",
"help": "Aiuto"
},
"search_engine": {
"save_button": "Salva"
},
"sql_table_schemas": {
"tables": "Tabelle"
},
"tab_row": {
"close_tab": "Chiudi la scheda",
"add_new_tab": "Aggiungi una nuova scheda",
"close": "Chiudi",
"close_other_tabs": "Chiudi le altre schede",
"close_right_tabs": "Chiudi le schede a destra",
"close_all_tabs": "Chiudi tutte le schede",
"reopen_last_tab": "Riapri l'ultima scheda chiusa",
"move_tab_to_new_window": "Sposta questa scheda in una nuova finestra",
"copy_tab_to_new_window": "Copia questa scheda in una nuova finestra",
"new_tab": "Nuova scheda"
},
"toc": {
"table_of_contents": "Sommario"
},
"table_of_contents": {
"title": "Sommario"
},
"tray": {
"title": "Vassoio di Sistema",
"enable_tray": "Abilita il vassoio (Trilium necessita di essere riavviato affinché la modifica abbia effetto)"
},
"heading_style": {
"title": "Stile dell'Intestazione",
"plain": "Normale",
"underline": "Sottolineato",
"markdown": "Stile Markdown"
},
"highlights_list": {
"title": "Punti salienti"
},
"highlights_list_2": {
"title": "Punti salienti",
"options": "Opzioni"
},
"quick-search": {
"placeholder": "Ricerca rapida",
"searching": "Ricerca in corso..."
}
}

View File

@@ -0,0 +1,866 @@
{
"about": {
"title": "Trilium Notesについて",
"homepage": "ホームページ:",
"app_version": "アプリのバージョン:",
"db_version": "データベースのバージョン:",
"sync_version": "同期のバージョン:",
"build_date": "Build の日時:",
"build_revision": "Build のバージョン:",
"data_directory": "データの場所:"
},
"toast": {
"critical-error": {
"title": "致命的なエラー",
"message": "致命的なエラーのせいでアプリをスタートできません:\n\n{{message}}\n\nおそらくスクリプトが予期しないバグを含んでいると思われます。アプリをセーフモードでスタートしてみて下さい。"
},
"widget-error": {
"title": "ウィジェットを初期化できませんでした",
"message-custom": "ートID”{{id}}”, ノートタイトル “{{title}}” のカスタムウィジェットを初期化できませんでした:\n\n{{message}}",
"message-unknown": "不明なウィジェットが初期化できませんでした。理由は以下の通りです:\n\n{{message}}"
},
"bundle-error": {
"title": "カスタムスクリプトの読み込みに失敗しました",
"message": "ートID”{{id}}”, ノートタイトル “{{title}}” のスクリプトを実行できませんでした。理由は以下の通りです:\n\n{{message}}"
}
},
"add_link": {
"add_link": "リンクを追加",
"note": "ノート",
"link_title": "リンクタイトル",
"button_add_link": "リンクを追加",
"help_on_links": "リンクに関するヘルプ",
"search_note": "ノート名で検索",
"link_title_mirrors": "リンクタイトルはノートタイトルの変更を反映します",
"link_title_arbitrary": "リンクタイトルは自由に変更可能"
},
"branch_prefix": {
"save": "保存"
},
"global_menu": {
"menu": "メニュー",
"options": "オプション",
"open_new_window": "新しいウィンドウを開く",
"zoom": "ズーム",
"toggle_fullscreen": "フルスクリーンの切り替え",
"reset_zoom_level": "ズームレベルのリセット",
"open_dev_tools": "開発者ツールを開く",
"open_sql_console": "SQLコンソールを開く",
"open_sql_console_history": "SQLコンソールの履歴を開く",
"open_search_history": "検索履歴を開く",
"show_backend_log": "バックエンドログの表示",
"reload_hint": "リロードは、アプリ全体を再起動することなく、視覚的な不具合を解消することができます。",
"reload_frontend": "フロントエンドをリロード",
"show_hidden_subtree": "隠れたサブツリーを表示",
"show_help": "ヘルプを表示",
"about": "Trilium Notesについて",
"logout": "ログアウト",
"show-cheatsheet": "チートシートを表示",
"zoom_out": "ズームアウト",
"zoom_in": "ズームイン",
"advanced": "高度",
"toggle-zen-mode": "禅モード"
},
"left_pane_toggle": {
"show_panel": "パネルを表示",
"hide_panel": "パネルを隠す"
},
"move_pane_button": {
"move_left": "左に移動",
"move_right": "右に移動"
},
"clone_to": {
"notes_to_clone": "クローンするノート",
"target_parent_note": "ターゲットの親ノート",
"search_for_note_by_its_name": "ノート名で検索",
"cloned_note_prefix_title": "クローンされたノートは、指定された接頭辞を付けてノートツリーに表示されます",
"prefix_optional": "接頭辞(任意)",
"clone_to_selected_note": "選択したノートにクローン",
"no_path_to_clone_to": "クローン先のパスが存在しません。",
"note_cloned": "ノート \"{{clonedTitle}}\" は \"{{targetTitle}}\" にクローンされました",
"clone_notes_to": "ノートをクローンして...",
"help_on_links": "ヘルプへのリンク"
},
"delete_notes": {
"delete_all_clones_description": "すべてのクローンも削除する(最近の変更では元に戻すことができる)",
"erase_notes_description": "通常の(ソフト)削除では、ノートは削除されたものとしてマークされ、一定期間内に(最近の変更で)削除を取り消すことができます。このオプションをオンにすると、ノートは即座に削除され、削除を取り消すことはできません。",
"erase_notes_warning": "すべてのクローンを含め、ノートを完全に消去します(元に戻せません)。これにより、アプリケーションは強制的にリロードされます。",
"notes_to_be_deleted": "以下のノートが削除されます ({{notesCount}})",
"no_note_to_delete": "ノートは削除されません(クローンのみ)。",
"cancel": "キャンセル",
"ok": "OK",
"close": "閉じる"
},
"calendar": {
"mon": "月",
"tue": "火",
"wed": "水",
"thu": "木",
"fri": "金",
"sat": "土",
"sun": "日",
"january": "1月",
"febuary": "2月",
"march": "3月",
"april": "4月",
"may": "5月",
"june": "6月",
"july": "7月",
"august": "8月",
"september": "9月",
"october": "10月",
"november": "11月",
"december": "12月"
},
"note_icon": {
"change_note_icon": "ノートアイコンの変更",
"category": "カテゴリー:",
"search": "検索:",
"reset-default": "アイコンをデフォルトに戻す"
},
"basic_properties": {
"note_type": "ノートタイプ",
"editable": "編集可能",
"basic_properties": "基本プロパティ",
"language": "言語"
},
"i18n": {
"title": "ローカライゼーション",
"language": "言語",
"first-day-of-the-week": "週の最初",
"sunday": "日曜日",
"monday": "月曜日",
"first-week-of-the-year": "年の最初の週",
"first-week-contains-first-day": "最初の週には、元日が含まれる",
"first-week-contains-first-thursday": "最初の週には、その年の最初の木曜日が含まれる",
"first-week-has-minimum-days": "最初の週は最低日数",
"min-days-in-first-week": "最初の週の最低日数",
"first-week-info": "最初の週は、その年の最初の木曜日を含む週を指し、<a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>規格に基づいています。",
"first-week-warning": "最初の週のオプションを変更すると、既存のウィークノートと重複する可能性があり、既存のウィークノートはそれに応じて更新されません。",
"formatting-locale": "日付と数値のフォーマット"
},
"tab_row": {
"close_tab": "タブを閉じる",
"add_new_tab": "新しいタブ",
"close": "閉じる",
"close_other_tabs": "他のタブを閉じる",
"close_right_tabs": "右側のタブをすべて閉じる",
"close_all_tabs": "すべてのタブを閉じる",
"reopen_last_tab": "最後に閉じたタブを開く",
"move_tab_to_new_window": "このタブを新しいウィンドウに移動する",
"copy_tab_to_new_window": "このタブを新しいウィンドウにコピーする"
},
"tasks": {
"due": {
"today": "今日",
"tomorrow": "明日",
"yesterday": "昨日"
}
},
"classic_editor_toolbar": {
"title": "書式設定"
},
"search_definition": {
"add_search_option": "検索オプションを追加:",
"search_string": "文字列検索",
"search_script": "スクリプト検索",
"fast_search": "高速検索",
"fast_search_description": "高速検索オプションは、ノートの全文検索を無効にし、大規模データベースでの検索を高速化します。",
"include_archived": "アーカイブを含む",
"include_archived_notes_description": "アーカイブされたノートはデフォルトで検索結果から除外されますが、このオプションを使用すると含まれるようになります。",
"order_by": "並べ替え",
"limit": "リミット",
"limit_description": "検索結果の数を制限する",
"debug": "デバッグ",
"debug_description": "デバッグは複雑なクエリのデバッグを支援するために、追加のデバッグ情報をコンソールに出力します",
"action": "アクション",
"search_button": "検索 <kbd>Enter</kbd>",
"search_execute": "検索とアクションの実行",
"save_to_note": "ノートに保存",
"search_parameters": "検索パラメータ",
"unknown_search_option": "不明な検索オプション {{searchOptionName}}",
"search_note_saved": "検索ノートが {{- notePathTitle}} に保存されました",
"actions_executed": "アクションが実行されました。"
},
"shortcuts": {
"multiple_shortcuts": "同じアクションに対して複数のショートカットを設定する場合、カンマで区切ることができます。",
"electron_documentation": "使用可能な修飾キーとキーコードについては、 <a href=\"https://www.electronjs.org/docs/latest/api/accelerator\">Electronのドキュメント</a>を参照してください。",
"type_text_to_filter": "テキストを入力してショートカットを絞り込む...",
"action_name": "アクション名",
"shortcuts": "ショートカット",
"default_shortcuts": "デフォルトのショートカットキー",
"description": "説明",
"reload_app": "リロードして変更を適用する",
"set_all_to_default": "すべてのショートカットをデフォルトに戻す",
"confirm_reset": "キーボードショートカットをすべてデフォルトにリセットしますか?",
"keyboard_shortcuts": "キーボードショートカット"
},
"confirm": {
"confirmation": "確認",
"cancel": "キャンセル",
"ok": "OK"
},
"export": {
"export_note_title": "ノートをエクスポート",
"close": "閉じる",
"export_type_subtree": "このノートとすべての子孫",
"format_html": "HTML - すべての書式が保たれるため、おすすめ",
"format_html_zip": "HTML ZIPアーカイブ - すべての書式が保たれるため、推奨されます。",
"format_markdown": "Markdown - ほとんどの書式が維持される。",
"format_opml": "OPML - テキストのみのアウトライン交換フォーマットです。書式設定、画像、ファイルは含まれません。",
"opml_version_1": "OPML v1.0 - プレーンテキストのみ",
"opml_version_2": "OPML v2.0 - HTMLが許可されています",
"export_type_single": "このノートのみで、子孫ノートは含まない",
"export": "エクスポート",
"choose_export_type": "最初にエクスポートタイプを選択してください",
"export_status": "エクスポート状況",
"export_in_progress": "エクスポート処理中: {{progressCount}}",
"export_finished_successfully": "エクスポートが正常に完了しました。",
"format_pdf": "PDF - 印刷または共有目的に。"
},
"help": {
"title": "チートシート",
"noteNavigation": "ノートナビゲーション",
"collapseExpand": "ノードの格納/展開",
"goBackForwards": "履歴を戻る/進む",
"scrollToActiveNote": "アクティブノートまでスクロール",
"jumpToParentNote": "親ノートへ移動",
"collapseWholeTree": "すべてのノートツリーを格納",
"collapseSubTree": "サブツリーを格納",
"tabShortcuts": "タブショートカット",
"newTabNoteLink": "ノートのリンクをクリックすると、新しいタブで開く",
"newTabWithActivationNoteLink": "ノートのリンクをクリックすると、新しいタブで開き、アクティブにします",
"onlyInDesktop": "デスクトップ版Electronビルドのみ",
"openEmptyTab": "空のタブを開く",
"closeActiveTab": "アクティブなタブを閉じる",
"activateNextTab": "次のタブに移動",
"activatePreviousTab": "前のタブに移動",
"creatingNotes": "ノートの作成",
"createNoteAfter": "アクティブなノートの後ろに新しいノートを作成",
"createNoteInto": "アクティブなノートに新しいサブノートを作成",
"movingCloningNotes": "ノートの移動/クローン",
"moveNoteUpHierarchy": "階層内でノートを上下に移動",
"multiSelectNote": "複数選択に上/下のノートを追加",
"selectAllNotes": "現在のレベルのノートをすべて選択",
"selectNote": "ノートを選択",
"copyNotes": "アクティブなノート(または現在の選択範囲)をクリップボードにコピーする(<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">クローン</a>に使用)",
"cutNotes": "アクティブなノート(または現在の選択範囲)をクリップボードにカットする(ノートの移動に使用)",
"pasteNotes": "ノートをサブノートとしてアクティブノートに貼り付ける(コピーされたかカットされたかに よって、移動またはクローンになる)",
"deleteNotes": "ノート/サブツリーを削除",
"editingNotes": "ノート編集",
"editNoteTitle": "押下するとツリーペインからタイトルの編集に移ります。タイトルの編集からEnterキーを押すと、本文の編集に移動します。<kbd>Ctrl+.</kbd> で本文の編集からツリーペインに戻ります。",
"createEditLink": "外部リンクの作成/編集",
"createInternalLink": "内部リンクの作成",
"followLink": "カーソル下のリンクをたどる",
"insertDateTime": "カーソル位置に現在の日時を挿入",
"jumpToTreePane": "ツリーペインにジャンプし、アクティブなノートまでスクロール",
"markdownAutoformat": "Markdownライクな自動フォーマット",
"headings": "<code>##</code>, <code>###</code>, <code>####</code> など。その後にスペースで見出しになる",
"bulletList": "<code>*</code> または <code>-</code> その後にスペースで箇条書きになる",
"numberedList": "<code>1.</code> または <code>1)</code> その後にスペースで番号付きリストになる",
"blockQuote": "行の先頭に <code>></code> その後にスペースで引用になる",
"troubleshooting": "トラブルシューティング",
"reloadFrontend": "Triliumのフロントエンドをリロード",
"showDevTools": "開発者ツールを表示",
"showSQLConsole": "SQLコンソールを表示",
"other": "その他",
"quickSearch": "クイックサーチにフォーカス",
"inPageSearch": "ページ内検索"
},
"import": {
"importIntoNote": "ノートにインポート",
"chooseImportFile": "インポートするファイルを選択",
"importDescription": "選択されたファイルの内容は、子ノートとしてインポートされます",
"options": "オプション",
"safeImportTooltip": "Triliumの <code>.zip</code> 形式のエクスポートファイルには、有害な動作を含む実行可能スクリプトが含まれている可能性があります。セーフインポートは、インポートされたすべてのスクリプトの自動実行を無効にします。インポートするファイルの内容を完全に信頼できる場合のみ、「セーフインポート」のチェックを外してください。",
"safeImport": "セーフインポート",
"explodeArchivesTooltip": "これがチェックされている場合、Triliumは<code>.zip</code>、<code>.enex</code>、<code>.opml</code>ファイルを読み込み、それらのアーカイブからートを作成します。チェックされていない場合、Triliumはアーカイブ自体をートに添付します。",
"shrinkImagesTooltip": "<p>これをチェックすると、Triliumはインポートされた画像を、拡大縮小や最適化によって縮小しようとします。これにより、画像の品質が損なわれる可能性があります。チェックを外すと、画像は変更されずにインポートされます。</p><p>これは、メタデータ付きの<code>.zip</code>インポートには適用されません。これらのファイルは既に最適化されていると考えられるためです。</p>",
"shrinkImages": "画像を縮小",
"textImportedAsText": "メタデータから判断できない場合は、HTML、Markdown、TXTをテキストートとしてインポート",
"codeImportedAsCode": "メタデータから判断できない場合は、コードファイル(例: <code>.json</code>)をコードノートとしてインポート",
"replaceUnderscoresWithSpaces": "インポートされたノート名のアンダーバーをスペースに置換する",
"import": "インポート",
"failed": "インポートに失敗しました: {{message}}.",
"html_import_tags": {
"title": "HTMLインポートタグ",
"description": "インポート時に保持するHTMLタグを設定します。このリストにないタグはインポート時に削除されます。一部のタグ'script'など)は、セキュリティ上の懸念から常に削除されます。",
"placeholder": "HTMLタグを1行に1つ入力",
"reset_button": "リストをデフォルトにリセット"
},
"import-status": "インポート状況",
"in-progress": "インポート中: {{progress}}",
"successful": "インポートは正常に終了しました。"
},
"password_not_set": {
"title": "パスワードが設定されていない",
"body1": "保護されたノートはユーザーのパスワードを使用して暗号化されますが、パスワードはまだ設定されていません。",
"body2": "ノートを保護するには、下のボタンをクリックしてオプションダイアログを開き、パスワードを設定してください。",
"go_to_password_options": "パスワードのオプションへ"
},
"recent_changes": {
"title": "最近の変更",
"erase_notes_button": "削除したメモを今すぐ消去する",
"deleted_notes_message": "削除されたメモは完全に消去されました。",
"no_changes_message": "変更はまだありません...",
"undelete_link": "削除を取り消す",
"confirm_undelete": "このノートとサブノートを復元しますか?"
},
"sort_child_notes": {
"sort_children_by": "子ノートの並び替え...",
"sorting_criteria": "ソート基準",
"title": "タイトル",
"date_created": "作成日",
"date_modified": "更新日",
"sorting_direction": "ソート方向",
"ascending": "昇順",
"descending": "降順",
"folders": "フォルダ",
"sort_folders_at_top": "フォルダーを一番上にソートする",
"natural_sort": "自然順",
"sort_with_respect_to_different_character_sorting": "言語や地域によって異なる文字の並べ替えや照合順序の規則に従ってソートする。",
"sort": "ソート",
"natural_sort_language": "自然順言語",
"the_language_code_for_natural_sort": "自然順の言語コード。例えば、中国語の場合は \"zh-CN\"。"
},
"close_pane_button": {
"close_this_pane": "ペインを閉じる"
},
"create_pane_button": {
"create_new_split": "新しく分割する"
},
"edit_button": {
"edit_this_note": "このノートを編集"
},
"show_toc_widget_button": {
"show_toc": "目次を表示"
},
"show_highlights_list_widget_button": {
"show_highlights_list": "ハイライト一覧を表示"
},
"relation_map_buttons": {
"zoom_out_title": "ズームアウト",
"zoom_in_title": "ズームイン"
},
"tree-context-menu": {
"advanced": "高度",
"open-in-a-new-tab": "新しいタブで開く <kbd>Ctrl+Click</kbd>",
"open-in-a-new-split": "新しく分割して開く",
"insert-note-after": "ノートを後ろに挿入",
"insert-child-note": "子ノートを挿入",
"delete": "削除",
"search-in-subtree": "サブツリー内を検索",
"expand-subtree": "サブツリーを展開",
"collapse-subtree": "サブツリーを折りたたむ",
"sort-by": "並べ替え...",
"recent-changes-in-subtree": "サブツリー内の最近の変更",
"copy-note-path-to-clipboard": "ノートのパスをクリップボードにコピー",
"protect-subtree": "サブツリーを保護",
"unprotect-subtree": "サブツリーの保護を解除",
"copy-clone": "コピー/クローン",
"clone-to": "クローンして...",
"cut": "カット",
"move-to": "移動して...",
"paste-into": "貼り付け",
"paste-after": "後ろに貼り付け",
"duplicate": "複製",
"export": "エクスポート",
"import-into-note": "ノートにインポート",
"apply-bulk-actions": "一括操作の適用",
"converted-to-attachments": "{{count}}ノートが添付ファイルに変換されました。",
"convert-to-attachment": "添付ファイルに変換",
"convert-to-attachment-confirm": "選択したノートを親ノートの添付ファイルに変換しますか?",
"open-in-popup": "クイックエディット"
},
"zen_mode": {
"button_exit": "禅モードを退出"
},
"sync_status": {
"unknown": "<p>同期状況は、次回の同期が開始されるとわかるようになります。</p><p>クリックして今すぐ同期を開始する。</p>",
"connected_with_changes": "<p>同期サーバーに接続されました。<br>まだ同期されていない未処理の変更がいくつかあります。</p><p>クリックして同期を開始。</p>",
"connected_no_changes": "<p>同期サーバーに接続されました。<br>すべての変更はすでに同期されています。</p><p>クリックして同期を開始。</p>",
"disconnected_with_changes": "<p>同期サーバーへの接続の確立に失敗しました。<br>まだ同期されていない未処理の変更がいくつかあります。</p><p>クリックして同期を開始。</p>",
"disconnected_no_changes": "<p>同期サーバーへの接続確立に失敗しました。<br>既知の変更はすべて同期されました。</p><p>クリックして同期を開始。</p>",
"in_progress": "サーバーと同期中です。"
},
"note_actions": {
"re_render_note": "ノートを再描画",
"search_in_note": "ノート内検索",
"note_source": "ノートのソース",
"open_note_externally": "外部でノートを開く",
"open_note_externally_title": "ファイルを外部アプリケーションで開き、変更を監視します。その後、変更されたバージョンをTriliumにアップロードできるようになります。",
"open_note_custom": "プログラムからノートを開く",
"import_files": "ファイルをインポート",
"export_note": "ノートをエクスポート",
"delete_note": "ノートを削除する",
"print_note": "ノートを印刷",
"print_pdf": "PDFとしてエクスポート..."
},
"command_palette": {
"export_note_title": "ノートをエクスポート",
"search_subtree_title": "サブツリー内を検索"
},
"delete_note": {
"delete_note": "ノートを削除する"
},
"board_view": {
"delete-note": "ノートを削除する"
},
"code_buttons": {
"execute_button_title": "スクリプトを実行",
"trilium_api_docs_button_title": "Trilium APIのドキュメントを開く",
"save_to_note_button_title": "ノートに保存",
"opening_api_docs_message": "APIドキュメントを開いています...",
"sql_console_saved_message": "SQLコンソールが {{note_path}} に保存されました"
},
"execute_script": {
"execute_script": "スクリプトを実行"
},
"script_executor": {
"execute_script": "スクリプトを実行",
"query": "クエリ",
"script": "スクリプト",
"execute_query": "クエリを実行"
},
"hide_floating_buttons_button": {
"button_title": "ボタンを非表示"
},
"show_floating_buttons_button": {
"button_title": "ボタンを表示"
},
"svg_export_button": {
"button_title": "図をSVGとしてエクスポート"
},
"book_properties": {
"grid": "グリッド",
"list": "リスト",
"collapse_all_notes": "すべてのノートを格納",
"expand_all_children": "すべての子を展開",
"collapse": "格納",
"expand": "展開",
"book_properties": "コレクションプロパティ",
"invalid_view_type": "無効なビュータイプ '{{type}}'",
"view_type": "ビュータイプ",
"calendar": "カレンダー",
"table": "テーブル",
"geo-map": "ジオマップ",
"board": "ボード"
},
"note_types": {
"geo-map": "ジオマップ",
"file": "ファイル",
"image": "画像",
"text": "テキスト",
"code": "コード",
"saved-search": "検索の保存",
"relation-map": "関係マップ",
"note-map": "ノートマップ",
"render-note": "レンダリングノート",
"book": "コレクション",
"mermaid-diagram": "Mermaidダイアグラム",
"canvas": "キャンバス",
"web-view": "Web ビュー",
"mind-map": "マインドマップ",
"launcher": "ランチャー",
"doc": "ドキュメント",
"widget": "ウィジェット",
"confirm-change": "ノートの内容が空ではない場合、ノートタイプを変更することは推奨されません。続行しますか?",
"beta-feature": "Beta",
"ai-chat": "AI チャット",
"task-list": "タスクリスト",
"new-feature": "新しい",
"collections": "コレクション"
},
"edited_notes": {
"no_edited_notes_found": "この日の編集されたメモはまだありません...",
"title": "編集されたノート",
"deleted": "(削除済み)"
},
"file_properties": {
"note_id": "ノート ID",
"file_type": "ファイルタイプ",
"file_size": "ファイルサイズ",
"download": "ダウンロード",
"open": "開く",
"title": "ファイル"
},
"note_info_widget": {
"note_id": "ノート ID",
"created": "作成日時",
"modified": "更新日時",
"type": "タイプ",
"note_size": "ノートサイズ",
"calculate": "計算",
"subtree_size": "(サブツリーサイズ: {{size}}、ノード数: {{count}}",
"title": "ノート情報"
},
"image_properties": {
"file_type": "ファイルタイプ",
"file_size": "ファイルサイズ",
"download": "ダウンロード",
"open": "開く",
"title": "画像"
},
"revisions": {
"download_button": "ダウンロード",
"delete_button": "削除"
},
"attachments_actions": {
"download": "ダウンロード"
},
"etapi": {
"created": "作成日時",
"title": "ETAPI",
"description": "ETAPI は、Trilium インスタンスに UI なしでプログラム的にアクセスするための REST API です。",
"see_more": "詳細は{{- link_to_wiki}}と{{- link_to_openapi_spec}}または{{- link_to_swagger_ui }}を参照してください。",
"wiki": "wiki",
"openapi_spec": "ETAPI OpenAPIの仕様",
"swagger_ui": "ETAPI Swagger UI",
"create_token": "新しくETAPIトークンを作成",
"existing_tokens": "既存のトークン",
"no_tokens_yet": "トークンはまだありません。上のボタンをクリックして作成してください。",
"token_name": "トークン名",
"actions": "アクション",
"new_token_title": "新しいETAPIトークン",
"new_token_message": "新しいトークンの名前を入力",
"rename_token_message": "新しいトークンの名前を入力",
"default_token_name": "新しいトークン",
"error_empty_name": "トークン名は空にできません",
"token_created_title": "ETAPIトークン作成",
"token_created_message": "作成されたトークンをクリップボードにコピーします。Trilium はトークンをハッシュ化して保存するため、これがトークンを見る最後の機会となります。",
"rename_token": "トークン名を変更",
"delete_token": "このトークンを削除/無効にする",
"rename_token_title": "トークン名の変更",
"delete_token_confirmation": "本当にETAPIトークン\"{{name}}\"を削除しますか?"
},
"note_paths": {
"title": "ノートパス",
"clone_button": "ノートを新しい場所にクローン...",
"intro_placed": "このノートは以下のパスに置かれる:",
"intro_not_placed": "このノートはまだノートツリーに配置されていません。",
"archived": "アーカイブされた",
"search": "検索"
},
"note_properties": {
"info": "情報"
},
"similar_notes": {
"title": "類似ノート",
"no_similar_notes_found": "類似したノートが見つかりません。"
},
"abstract_search_option": {
"remove_this_search_option": "この検索オプションを削除"
},
"debug": {
"debug": "デバッグ",
"debug_info": "デバッグは、複雑なクエリのデバッグを支援するために、追加のデバッグ情報をコンソールに表示します。",
"access_info": "デバッグ情報にアクセスするには、クエリを実行し、左上隅にある \"バックエンドログを表示 \"をクリックしてください。"
},
"fast_search": {
"fast_search": "高速検索",
"description": "高速検索オプションは、ノートの全文検索を無効にし、大規模データベースでの検索を高速化します。"
},
"include_archived_notes": {
"include_archived_notes": "アーカイブされたノートを含む"
},
"limit": {
"limit": "リミット",
"take_first_x_results": "最初からX個の結果のみを取得。"
},
"order_by": {
"order_by": "並べ替え",
"relevancy": "関連性(デフォルト)",
"title": "タイトル",
"date_created": "作成日",
"date_modified": "最終更新日",
"content_size": "ノート内容のサイズ",
"children_count": "子ノートの数",
"parent_count": "クローンの数",
"random": "ランダムな順番",
"asc": "昇順(デフォルト)",
"desc": "降順"
},
"table_view": {
"sort-column-descending": "降順",
"sort-column-ascending": "昇順"
},
"search_script": {
"title": "検索スクリプト:",
"placeholder": "ノート名で検索"
},
"include_note": {
"placeholder_search": "ノート名で検索",
"dialog_title": "埋め込みノート",
"box_size_prompt": "埋め込みノート枠のサイズ:",
"button_include": "埋め込みノート"
},
"ancestor": {
"placeholder": "ノート名で検索"
},
"move_to": {
"search_placeholder": "ノート名で検索"
},
"web_view": {
"web_view": "Web ビュー",
"embed_websites": "Web ビュータイプでは、ウェブサイトをTriliumに埋め込むことができます。",
"create_label": "まず始めに、埋め込みたいURLアドレスのラベルを作成してください。例: #webViewSrc=\"https://www.google.com\""
},
"backend_log": {
"refresh": "リフレッシュ"
},
"sync": {
"title": "同期"
},
"fonts": {
"fonts": "フォント",
"main_font": "メインフォント",
"font_family": "フォントファミリー",
"size": "サイズ",
"note_tree_font": "ノートツリーフォント",
"note_detail_font": "ノート詳細フォント",
"monospace_font": "等幅(コード)フォント",
"note_tree_and_detail_font_sizing": "ツリーと詳細のフォントサイズは、メインのフォントサイズに対して相対的であることに注意してください。",
"not_all_fonts_available": "リストされているすべてのフォントが、お使いのシステムで利用できるとは限りません。",
"apply_font_changes": "フォントの変更を適用するには、クリックしてください",
"reload_frontend": "フロントエンドをリロード",
"generic-fonts": "一般的なフォント",
"sans-serif-system-fonts": "サンセリフのシステムフォント",
"serif-system-fonts": "セリフのシステムフォント",
"monospace-system-fonts": "等幅のシステムフォント",
"handwriting-system-fonts": "手書きのシステムフォント",
"serif": "セリフ",
"sans-serif": "サンセリフ",
"monospace": "等幅",
"system-default": "システムのデフォルト"
},
"max_content_width": {
"reload_button": "フロントエンドをリロード"
},
"theme": {
"title": "アプリのテーマ",
"theme_label": "テーマ",
"override_theme_fonts_label": "テーマのフォントを上書き",
"auto_theme": "レガシー(システムの配色に従う)",
"light_theme": "レガシー(ライト)",
"dark_theme": "レガシー(ダーク)",
"triliumnext": "Triliumシステムの配色に従う",
"triliumnext-light": "Triliumライト",
"triliumnext-dark": "Triliumダーク",
"layout": "レイアウト",
"layout-vertical-title": "垂直",
"layout-horizontal-title": "水平",
"layout-vertical-description": "ランチャーバーは左側(デフォルト)",
"layout-horizontal-description": "ランチャーバーはタブバーの下にあり、タブバーは全幅に。"
},
"vim_key_bindings": {
"use_vim_keybindings_in_code_notes": "Vimキーバインド",
"enable_vim_keybindings": "Vimキーバインドをコードートで有効にしますexモードはありません"
},
"wrap_lines": {
"wrap_lines_in_code_notes": "コードノートで行を折り返す",
"enable_line_wrap": "行の折り返しを有効にする(変更を適用にするにはフロントエンドのリロードが必要な場合があります)"
},
"images": {
"images_section_title": "画像",
"download_images_automatically": "画像を自動的にダウンロードしてオフラインで使用可能にする。",
"download_images_description": "貼り付けられたHTMLにはオンライン画像への参照が含まれていることがありますが、Triliumはそれらの参照を見つけて画像をダウンロードし、オフラインで利用できるようにします。",
"enable_image_compression": "画像の圧縮を有効にする",
"max_image_dimensions": "画像の最大幅/高さ(この設定を超えると画像はリサイズされます)。",
"max_image_dimensions_unit": "ピクセル",
"jpeg_quality_description": "JPEGの品質10 - 最低品質、100 - 最高品質、50 - 80を推奨"
},
"search_engine": {
"title": "検索エンジン",
"custom_search_engine_info": "カスタム検索エンジンは、名前とURLの両方を設定する必要があります。どちらも設定されていない場合、DuckDuckGoがデフォルトの検索エンジンとして使用されます。",
"predefined_templates_label": "定義済みの検索エンジンのテンプレート",
"bing": "Bing",
"baidu": "Baidu",
"duckduckgo": "DuckDuckGo",
"google": "Google",
"custom_name_label": "カスタム検索エンジンの名前",
"custom_name_placeholder": "カスタム検索エンジンの名前",
"custom_url_label": "カスタム検索エンジンのURLには、検索語句のプレースホルダーとして {keyword} を含める必要があります。",
"custom_url_placeholder": "カスタム検索エンジンのurl",
"save_button": "保存"
},
"tray": {
"title": "システムトレイ",
"enable_tray": "トレイを有効にする (この変更を適用にするには、Triliumを再起動する必要があります)"
},
"heading_style": {
"title": "見出しのスタイル",
"plain": "プレーン",
"underline": "下線",
"markdown": "Markdownスタイル"
},
"highlights_list": {
"title": "ハイライトリスト",
"description": "右のパネルに表示されるハイライトリストをカスタマイズできます:",
"bold": "太字",
"italic": "イタリック体",
"underline": "下線",
"color": "カラーテキスト",
"bg_color": "背景色付きテキスト",
"visibility_title": "ハイライトリスト表示",
"visibility_description": "#hideHighlightWidget ラベルを追加することで、ノートごとにハイライトウィジェットを非表示にできます。",
"shortcut_info": "オプション -> ショートカット('右ペイン切り替え')で、右ペイン(ハイライトを含む)を素早く切り替えるキーボードショートカットを設定できます。"
},
"table_of_contents": {
"title": "目次",
"description": "ノートに定義された数以上の見出しがある場合、テキストノートに目次が表示されます。この数はカスタマイズできます:",
"unit": "見出し",
"disable_info": "このオプションに非常に大きな数値を設定することで、目次を効果的に無効にすることもできる。",
"shortcut_info": "オプション -> ショートカット('右ペイン切り替え')で、右ペイン(目次を含む)を素早く切り替えるキーボードショートカットを設定できます。"
},
"toc": {
"table_of_contents": "目次"
},
"text_auto_read_only_size": {
"title": "自動読み取り専用のサイズ",
"description": "自動読み取り専用のノートサイズは、ノートが読み取り専用モード(パフォーマンス上の理由)で表示されるようになるサイズです。",
"label": "自動読み取り専用のサイズ(テキストノート)",
"unit": "文字"
},
"code_auto_read_only_size": {
"title": "自動読み取り専用のサイズ",
"description": "自動読み取り専用のノートサイズは、ノートが読み取り専用モード(パフォーマンス上の理由)で表示されるようになるサイズです。",
"unit": "文字"
},
"custom_date_time_format": {
"title": "日付/時刻フォーマットのカスタム",
"description": "<kbd></kbd>またはツールバーから挿入される日付と時刻のフォーマットをカスタマイズする。 利用可能なトークンについては <a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">Day.js ドキュメント</a> を参照してください。",
"format_string": "文字列形式:",
"formatted_time": "日付/時刻形式:"
},
"backup": {
"automatic_backup": "自動バックアップ",
"automatic_backup_description": "Triliumは自動的にデータベースをバックアップすることができます:",
"enable_daily_backup": "毎日バックアップ",
"enable_weekly_backup": "毎週バックアップ",
"enable_monthly_backup": "毎月バックアップ",
"backup_recommendation": "バックアップはオンが推奨されますが、大規模なデータベースや低速なストレージデバイスの場合、アプリの起動を遅くする可能性があります。",
"backup_now": "今すぐバックアップ",
"backup_database_now": "今すぐデータベースをバックアップ",
"existing_backups": "既存のバックアップ",
"date-and-time": "日時",
"path": "パス",
"database_backed_up_to": "データベースは{{backupFilePath}}にバックアップされました",
"no_backup_yet": "バックアップがありません"
},
"password": {
"wiki": "wiki",
"heading": "パスワード",
"alert_message": "新しいパスワードは大切に保管してください。パスワードはウェブインターフェースへのログインや、保護されたノートの暗号化に使用されます。パスワードを忘れると、保護されたノートはすべて永久に失われます。",
"reset_link": "リセットするにはここをクリック。",
"old_password": "旧パスワード",
"new_password": "新パスワード",
"new_password_confirmation": "新パスワードの確認",
"change_password": "パスワードの変更",
"change_password_heading": "パスワードの変更",
"protected_session_timeout": "保護されたセッションのタイムアウト",
"protected_session_timeout_description": "保護されたセッションのタイムアウトは、保護されたセッションがブラウザのメモリから消去される時間です。これは、保護されたノートとの最後のやり取りから測定されます。参照",
"for_more_info": "詳細はこちら。",
"protected_session_timeout_label": "保護されたセッションのタイムアウト:",
"reset_confirmation": "パスワードをリセットすると、保護されているすべてのノートにアクセスできなくなります。本当にパスワードをリセットしますか?",
"reset_success_message": "パスワードがリセットされました。新しいパスワードを設定してください",
"set_password_heading": "パスワードの設定",
"set_password": "パスワードの設定",
"password_mismatch": "新しいパスワードが同じではありません。",
"password_changed_success": "パスワードが変更されました。OKを押すとTriliumがリロードされます。"
},
"spellcheck": {
"title": "スペルチェック",
"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": {
"config_title": "同期設定",
"server_address": "サーバーインスタンスのアドレス",
"timeout": "同期タイムアウト",
"timeout_unit": "ミリ秒",
"proxy_label": "同期プロキシサーバー(任意)",
"note": "注",
"note_description": "プロキシ設定を空白のままにすると、システムプロキシが使用されます(デスクトップ/electronビルドにのみ適用されます。",
"special_value_description": "もう一つの特別な値は <code>noproxy</code> で、これはシステムプロキシさえも無視して、 <code>NODE_TLS_REJECT_UNAUTHORIZED</code> を尊重するように強制します。",
"save": "保存",
"help": "ヘルプ",
"test_title": "同期のテスト",
"test_description": "これは同期サーバとの接続とハンドシェイクをテストします。同期サーバーが初期化されていない場合、ローカルドキュメントと同期するように設定します。",
"test_button": "同期試行",
"handshake_failed": "同期サーバーのハンドシェイクに失敗しました。エラー: {{message}}"
},
"api_log": {
"close": "閉じる"
},
"info": {
"closeButton": "閉じる"
},
"protected_session_password": {
"close_label": "閉じる"
},
"modal": {
"close": "閉じる"
},
"bookmark_switch": {
"bookmark": "ブックマーク",
"bookmark_this_note": "このノートを左サイドパネルにブックマークする",
"remove_bookmark": "ブックマークを削除"
},
"attribute_detail": {
"delete": "削除"
},
"link_context_menu": {
"open_note_in_popup": "クイックエディット"
},
"note_tooltip": {
"quick-edit": "クイックエディット"
},
"protect_note": {
"toggle-on": "ノートを保護",
"toggle-off": "ノートの保護を解除",
"toggle-on-hint": "ノートは保護されていません。クリックして保護してください",
"toggle-off-hint": "ノートは保護されています。クリックして保護を解除してください"
},
"shared_switch": {
"shared": "共有",
"toggle-on-title": "ノートを共有",
"toggle-off-title": "ノートの共有を解除",
"shared-branch": "このノートは共有ノートとしてのみ存在し、共有を解除すると削除されます。続行してこのノートを削除しますか?",
"inherited": "このノートは、親から継承された共有方法のため、ここでは共有解除できません。"
},
"template_switch": {
"template": "テンプレート",
"toggle-on-hint": "ノートをテンプレート化する"
},
"open-help-page": "ヘルプページを開く",
"shared_info": {
"shared_publicly": "このノートは一般公開されています",
"shared_locally": "このノートはローカルで共有されています",
"help_link": "ヘルプについては、<a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>をご覧ください。"
},
"highlights_list_2": {
"title": "ハイライトリスト",
"options": "オプション"
},
"quick-search": {
"placeholder": "クイックサーチ",
"searching": "検索中...",
"no-results": "結果は見つかりませんでした",
"more-results": "... および {{number}} 件の他の結果。",
"show-in-full-search": "検索結果をすべて表示"
},
"note_tree": {
"collapse-title": "ノートツリーを折りたたむ",
"scroll-active-title": "アクティブノートまでスクロール",
"tree-settings-title": "ツリーの設定",
"hide-archived-notes": "アーカイブノートを隠す",
"automatically-collapse-notes": "ノートを自動的に折りたたむ",
"automatically-collapse-notes-title": "一定期間使用されないと、ツリーを整理するためにノートは折りたたまれます。",
"save-changes": "変更を保存して適用"
}
}

View File

@@ -1,10 +1,414 @@
{
"revisions": {
"delete_button": ""
},
"code_block": {
"theme_none": "Sem destaque de sintaxe",
"theme_group_light": "Temas claros",
"theme_group_dark": "Temas escuros"
},
"about": {
"title": "Sobre o Trilium Notes",
"homepage": "Página inicial:",
"app_version": "Versão do App:",
"db_version": "Versão do db:",
"sync_version": "Versão de sincronização:",
"build_date": "Data de compilação:",
"build_revision": "Revisão da compilação:",
"data_directory": "Diretório de dados:"
},
"toast": {
"critical-error": {
"title": "Erro crítico",
"message": "Ocorreu um erro crítico que impede a inicialização do aplicativo cliente:\n\n{{message}}\n\nIsso provavelmente foi causado por um script que falhou de maneira inesperada. Tente iniciar o aplicativo no modo seguro e resolva o problema."
},
"widget-error": {
"title": "Falha ao inicializar um widget",
"message-custom": "O widget personalizado da nota com ID \"{{id}}\", intitulada \"{{title}}\", não pôde ser inicializado devido a:\n\n{{message}}",
"message-unknown": "Widget desconhecido não pôde ser inicializado devido a:\n\n{{message}}"
},
"bundle-error": {
"title": "Falha para carregar o script customizado",
"message": "O script da nota com ID \"{{id}}\", intitulada \"{{title}}\", não pôde ser executado devido a:\n\n{{message}}"
}
},
"add_link": {
"add_link": "Adicionar link",
"help_on_links": "Ajuda sobre links",
"note": "Nota",
"search_note": "pesquisar nota pelo nome",
"link_title_mirrors": "o título do link reflete o título atual da nota",
"link_title_arbitrary": "o título do link pode ser alterado livremente",
"link_title": "Titulo do link",
"button_add_link": "Adicionar link"
},
"branch_prefix": {
"prefix": "Prefixo: ",
"save": "Salvar",
"edit_branch_prefix": "Editar Prefixo do Branch",
"help_on_tree_prefix": "Ajuda sobre o prefixo da árvore de notas",
"branch_prefix_saved": "O prefixo de ramificação foi salvo."
},
"bulk_actions": {
"bulk_actions": "Ações em massa",
"affected_notes": "Notas Afetadas",
"include_descendants": "Incluir notas filhas das notas selecionadas",
"available_actions": "Ações disponíveis",
"chosen_actions": "Ações selecionadas",
"execute_bulk_actions": "Executar ações em massa",
"bulk_actions_executed": "As ações em massa foram concluídas com sucesso.",
"none_yet": "Nenhuma até agora... adicione uma ação clicando em uma das disponíveis acima.",
"labels": "Etiquetas",
"relations": "Relações",
"notes": "Notas",
"other": "Outros"
},
"clone_to": {
"clone_notes_to": "Clonar notas para...",
"help_on_links": "Ajuda sobre links",
"notes_to_clone": "Notas para clonar",
"search_for_note_by_its_name": "pesquisar nota pelo nome",
"cloned_note_prefix_title": "A nota clonada aparecerá na árvore de notas com o prefixo fornecido",
"prefix_optional": "Prefixo (opcional)",
"no_path_to_clone_to": "Nenhum caminho para clonar.",
"target_parent_note": "Nota pai-alvo",
"clone_to_selected_note": "Clonar para a nota selecionada",
"note_cloned": "A nota \"{{clonedTitle}}\" foi clonada para \"{{targetTitle}}\""
},
"ai_llm": {
"n_notes_queued_0": "{{ count }} nota enfileirada para indexação",
"n_notes_queued_1": "{{ count }} notas enfileiradas para indexação",
"n_notes_queued_2": "{{ count }} notas enfileiradas para indexação",
"notes_indexed_0": "{{ count }} nota indexada",
"notes_indexed_1": "{{ count }} notas indexadas",
"notes_indexed_2": "{{ count }} notas indexadas"
},
"confirm": {
"confirmation": "Confirmação",
"cancel": "Cancelar",
"ok": "OK",
"are_you_sure_remove_note": "Tem certeza de que deseja remover a nota '{{title}}' do mapa de relações? ",
"if_you_dont_check": "Se você não marcar isso, a nota será removida apenas do mapa de relações.",
"also_delete_note": "Também excluir a nota"
},
"delete_notes": {
"delete_notes_preview": "Excluir pré-visualização de notas",
"close": "Fechar",
"delete_all_clones_description": "Excluir também todos os clones (pode ser desfeito em alterações recentes)",
"erase_notes_description": "A exclusão normal (suave) apenas marca as notas como excluídas, permitindo que sejam recuperadas (no diálogo de alterações recentes) dentro de um período de tempo. Se esta opção for marcada, as notas serão apagadas imediatamente e não será possível restaurá-las.",
"erase_notes_warning": "Apagar notas permanentemente (não pode ser desfeito), incluindo todos os clones. Isso forçará o recarregamento do aplicativo.",
"notes_to_be_deleted": "As seguintes notas serão excluídas ({{notesCount}})",
"no_note_to_delete": "Nenhuma nota será excluída (apenas os clones).",
"broken_relations_to_be_deleted": "As seguintes relações serão quebradas e excluídas ({{ relationCount}})",
"cancel": "Cancelar",
"ok": "OK",
"deleted_relation_text": "A nota {{- note}} (a ser excluída) está referenciada pela relação {{- relation}} originada de {{- source}}."
},
"export": {
"export_note_title": "Exportar nota",
"close": "Fechar",
"export_type_subtree": "Esta nota e todos os seus descendentes",
"format_html": "HTML recomendado, pois mantém toda a formatação",
"format_html_zip": "HTML em arquivo ZIP recomendado, pois isso preserva toda a formatação.",
"format_markdown": "Markdown isso preserva a maior parte da formatação.",
"format_opml": "OPML - formato de intercâmbio de outliners apenas para texto. Formatação, imagens e arquivos não estão incluídos.",
"opml_version_1": "OPML v1.0 apenas texto simples",
"opml_version_2": "OPML v2.0 permite também HTML",
"export_type_single": "Apenas esta nota, sem seus descendentes",
"export": "Exportar",
"choose_export_type": "Por favor, escolha primeiro o tipo de exportação",
"export_status": "Status da exportação",
"export_in_progress": "Exportação em andamento: {{progressCount}}",
"export_finished_successfully": "Exportação concluída com sucesso.",
"format_pdf": "PDF para impressão ou compartilhamento."
},
"help": {
"noteNavigation": "Navegação de notas",
"goUpDown": "subir/descer na lista de notas",
"collapseExpand": "recolher/expandir nó",
"notSet": "não definido",
"goBackForwards": "voltar / avançar no histórico",
"showJumpToNoteDialog": "mostrar diálogo <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Ir para\"</a>",
"scrollToActiveNote": "rolar até a nota atual",
"jumpToParentNote": "ir para a nota pai",
"collapseWholeTree": "recolher toda a árvore de notas",
"collapseSubTree": "recolher subárvore",
"tabShortcuts": "Atalhos de abas",
"newTabNoteLink": "em um link de nota abre a nota em uma nova aba",
"newTabWithActivationNoteLink": "em um link de nota abre e ativa a nota em uma nova aba",
"onlyInDesktop": "Apenas na versão para desktop (compilação Electron)",
"openEmptyTab": "abrir aba vazia",
"closeActiveTab": "fechar aba ativa",
"activateNextTab": "ativar próxima aba",
"activatePreviousTab": "ativar aba anterior",
"creatingNotes": "Criando notas",
"createNoteAfter": "criar nova nota após a nota atual",
"createNoteInto": "criar nova subnota dentro da nota atual",
"editBranchPrefix": "editar <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/tree-concepts.html#prefix\">prefixo</a> do clone da nota ativa",
"movingCloningNotes": "Movendo / clonando notas",
"moveNoteUpDown": "mover nota para cima/baixo na lista de notas",
"moveNoteUpHierarchy": "mover nota para cima na hierarquia",
"multiSelectNote": "selecionar múltiplas notas acima/abaixo",
"selectAllNotes": "selecionar todas as notas no nível atual",
"selectNote": "selecionar nota",
"copyNotes": "copiar nota ativa (ou seleção atual) para a área de transferência (usado para <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonar</a>)",
"cutNotes": "recortar nota atual (ou seleção atual) para a área de transferência (usado para mover notas)",
"pasteNotes": "colar nota(s) como subnota dentro da nota ativa (o que pode ser mover ou clonar dependendo se foi copiado ou recortado para a área de transferência)",
"deleteNotes": "excluir nota / subárvore",
"editingNotes": "Edição de notas",
"editNoteTitle": "no painel de árvore, a navegação mudará do painel de árvore para o título da nota. Pressionar Enter no título da nota mudará o foco para o editor de texto. <kbd>Ctrl+.</kbd> mudará o foco de volta do editor para o painel de árvore.",
"createEditLink": "criar / editar link externo",
"createInternalLink": "criar link interno",
"followLink": "seguir link sob o cursor",
"insertDateTime": "inserir data e hora atual na posição do cursor",
"jumpToTreePane": "ir para a árvore de notas e rolar até a nota ativa",
"markdownAutoformat": "Autoformatação estilo Markdown",
"headings": "<code>##</code>, <code>###</code>, <code>####</code> etc. seguidos de espaço para títulos",
"bulletList": "<code>*</code> ou <code>-</code> seguidos de espaço para lista com marcadores",
"numberedList": "<code>1.</code> ou <code>1)</code> seguidos de espaço para lista numerada",
"blockQuote": "comece uma linha com <code>></code> seguido de espaço para citação em bloco",
"troubleshooting": "Solução de problemas",
"reloadFrontend": "recarregar o frontend do Trilium",
"showDevTools": "mostrar ferramentas de desenvolvedor",
"showSQLConsole": "mostrar console SQL",
"other": "Outros",
"quickSearch": "focar no campo de pesquisa rápida",
"inPageSearch": "pesquisa na página",
"title": "Folha de Dicas"
},
"import": {
"importIntoNote": "Importar para a nota",
"chooseImportFile": "Escolher arquivo para importar",
"importDescription": "O conteúdo do(s) arquivo(s) selecionado(s) será importado como nota(s) filha(s) em",
"options": "Opções",
"safeImportTooltip": "Arquivos de exportação Trilium<code> .zip</code> podem conter scripts executáveis que podem apresentar comportamentos prejudiciais. A importação segura desativará a execução automática de todos os scripts importados. Desmarque “Importação segura” apenas se o arquivo de importação contiver scripts executáveis e você confiar totalmente no conteúdo do arquivo importado.",
"safeImport": "Importação segura",
"explodeArchivesTooltip": "Se esta opção estiver marcada, o Trilium irá ler arquivos <code>.zip</code>, <code>.enex</code> e <code>.opml</code> e criar notas a partir dos arquivos contidos nesses arquivos compactados. Se estiver desmarcada, o Trilium irá anexar os próprios arquivos compactados à nota.",
"explodeArchives": "Ler conteúdos de arquivos <code>.zip</code>, <code>.enex</code> e <code>.opml</code>.",
"shrinkImagesTooltip": "<p>Se você marcar esta opção, o Trilium tentará reduzir o tamanho das imagens importadas por meio de escala e otimização, o que pode afetar a qualidade visual das imagens. Se desmarcada, as imagens serão importadas sem alterações.</p><p>Isso não se aplica a importações de arquivos <code>.zip</code> com metadados, pois presume-se que esses arquivos já estejam otimizados.</p>",
"shrinkImages": "Reduzir imagens",
"textImportedAsText": "Importar arquivos HTML, Markdown e TXT como notas de texto caso não esteja claro pelos metadados",
"codeImportedAsCode": "Importar arquivos de código reconhecidos (por exemplo, <code>.json</code>) como notas de código caso não esteja claro pelos metadados",
"replaceUnderscoresWithSpaces": "Substituir sublinhados por espaços nos nomes das notas importadas",
"import": "Importar",
"failed": "Falha na importação: {{message}}.",
"html_import_tags": {
"title": "Tags de importação HTML",
"description": "Configurar quais tags HTML devem ser preservadas ao importar notas. As tags que não estiverem nesta lista serão removidas durante a importação. Algumas tags (como 'script') são sempre removidas por motivos de segurança.",
"placeholder": "Digite as tags HTML, uma por linha",
"reset_button": "Redefinir para lista padrão"
},
"import-status": "Status da importação",
"in-progress": "Importação em andamento: {{progress}}",
"successful": "Importação concluída com sucesso."
},
"include_note": {
"dialog_title": "Incluir nota",
"label_note": "Nota",
"placeholder_search": "pesquisar nota pelo nome",
"box_size_prompt": "Dimensão da caixa da nota incluída:",
"box_size_small": "pequeno (~ 10 linhas)",
"box_size_medium": "médio (~ 30 linhas)",
"box_size_full": "completo (a caixa exibe o texto completo)",
"button_include": "Incluir nota"
},
"info": {
"modalTitle": "Mensagem informativa",
"closeButton": "Fechar",
"okButton": "OK"
},
"jump_to_note": {
"search_placeholder": "Pesquise uma nota pelo nome ou digite > para comandos...",
"search_button": "Pesquisar em texto completo"
},
"markdown_import": {
"dialog_title": "Importar Markdown",
"modal_body_text": "Por motivos de segurança (sandbox do navegador), o JavaScript não pode acessar diretamente a área de transferência. Por favor, cole o conteúdo Markdown na área de texto abaixo e clique em Importar",
"import_button": "Importar",
"import_success": "O conteúdo Markdown foi importado para o documento."
},
"move_to": {
"dialog_title": "Mover notas para...",
"notes_to_move": "Notas para mover",
"target_parent_note": "Nota pai-alvo",
"search_placeholder": "pesquisar nota pelo nome",
"move_button": "Mover para a nota selecionada",
"error_no_path": "Nenhum caminho para mover.",
"move_success_message": "As notas selecionadas foram movidas para "
},
"note_type_chooser": {
"change_path_prompt": "Alterar onde criar a nova nota:",
"search_placeholder": "buscar caminho pelo nome (valor padrão se não for preenchido)",
"modal_title": "Escolher tipo de nota",
"modal_body": "Escolha o tipo/modelo da nova nota:",
"templates": "Modelos",
"builtin_templates": "Modelos Incorporados"
},
"password_not_set": {
"title": "A senha não está definida",
"body1": "Notas protegidas são criptografadas usando uma senha do usuário, mas a senha ainda não foi definida.",
"body2": "Para poder proteger notas, clique no botão abaixo para abrir a caixa de diálogo de Opções e definir sua senha.",
"go_to_password_options": "Ir para opções de Senha"
},
"prompt": {
"title": "Prompt",
"ok": "OK",
"defaultTitle": "Prompt"
},
"protected_session_password": {
"modal_title": "Sessão Protegida",
"help_title": "Ajuda sobre notas protegidas",
"close_label": "Fechar",
"form_label": "Para prosseguir com a ação solicitada, você precisa iniciar uma sessão protegida digitando a senha:",
"start_button": "Iniciar sessão protegida"
},
"recent_changes": {
"title": "Alterações recentes",
"erase_notes_button": "Remover permanentemente as notas excluídas agora",
"deleted_notes_message": "As notas excluídas foram removidas permanentemente.",
"no_changes_message": "Nenhuma alteração ainda...",
"undelete_link": "Restaurar",
"confirm_undelete": "Você deseja restaurar esta nota e suas subnotas?"
},
"revisions": {
"note_revisions": "Versões da nota",
"delete_all_revisions": "Excluir todas as versões desta nota",
"delete_all_button": "Excluir todas as versões",
"help_title": "Ajuda sobre as versões da nota",
"revision_last_edited": "Esta versão foi editada pela última vez em {{date}}",
"confirm_delete_all": "Você quer excluir todas as versões desta nota?",
"no_revisions": "Ainda não há versões para esta nota...",
"restore_button": "Recuperar",
"confirm_restore": "Deseja restaurar esta versão? Isso irá substituir o título e o conteúdo atuais da nota por esta versão.",
"delete_button": "Excluir",
"confirm_delete": "Deseja excluir esta versão?",
"revisions_deleted": "As versões da nota foram removidas.",
"revision_restored": "A versão da nota foi restaurada.",
"revision_deleted": "A versão da nota foi excluída.",
"snapshot_interval": "Intervalo de captura das versões da nota: {{seconds}}s.",
"maximum_revisions": "Limite de capturas das versões da nota: {{number}}.",
"settings": "Configurações de versões da nota",
"download_button": "Download",
"mime": "MIME: ",
"file_size": "Tamanho do arquivo:",
"preview": "Visualizar:",
"preview_not_available": "A visualização não está disponível para este tipo de nota."
},
"sort_child_notes": {
"sort_children_by": "Ordenar notas filhas por...",
"sorting_criteria": "Critérios de ordenação",
"title": "título",
"date_created": "data de criação",
"date_modified": "data de modificação",
"sorting_direction": "Direção de ordenação",
"ascending": "crescente",
"descending": "decrescente",
"folders": "Pastas",
"sort_folders_at_top": "colocar pastas no topo",
"natural_sort": "Ordenação Natural",
"sort_with_respect_to_different_character_sorting": "classificar de acordo com diferentes regras de ordenação de caracteres e colação em diferentes idiomas ou regiões.",
"natural_sort_language": "Linguagem da ordenação natural",
"the_language_code_for_natural_sort": "O código do idioma para ordenação natural, por exemplo, \"zh-CN\" para chinês.",
"sort": "Ordenar"
},
"upload_attachments": {
"upload_attachments_to_note": "Enviar anexos para a nota",
"choose_files": "Escolher arquivos",
"files_will_be_uploaded": "Os arquivos serão enviados como anexos para {{noteTitle}}",
"options": "Opções",
"shrink_images": "Reduzir imagens",
"upload": "Enviar",
"tooltip": "Se você marcar esta opção, o Trilium tentará reduzir as imagens enviadas redimensionando e otimizando, o que pode afetar a qualidade visual percebida. Se desmarcada, as imagens serão enviadas sem alterações."
},
"attribute_detail": {
"attr_detail_title": "Título Detalhado do Atributo",
"close_button_title": "Cancelar alterações e fechar",
"attr_is_owned_by": "O atributo pertence a",
"attr_name_title": "O nome do atributo pode ser composto apenas por caracteres alfanuméricos, dois-pontos e sublinhado",
"name": "Nome",
"value": "Valor",
"target_note_title": "Relação é uma conexão nomeada entre a nota de origem e a nota de destino.",
"target_note": "Nota de destino",
"promoted_title": "O atributo promovido é exibido de forma destacada na nota.",
"promoted": "Promovido",
"promoted_alias_title": "O nome a ser exibido na interface de atributos promovidos.",
"promoted_alias": "Alias",
"multiplicity_title": "Multiplicidade define quantos atributos com o mesmo nome podem ser criados — no máximo 1 ou mais de 1.",
"multiplicity": "Multiplicidade",
"single_value": "Valor único",
"multi_value": "Valor múltiplo",
"label_type_title": "O tipo do rótulo ajudará o Trilium a escolher a interface adequada para inserir o valor do rótulo.",
"label_type": "Tipo",
"text": "Texto",
"number": "Número",
"boolean": "Booleano",
"date": "Data",
"date_time": "Data e Hora",
"time": "Hora",
"url": "URL",
"precision_title": "Qual número de dígitos após o ponto decimal deve estar disponível na interface de configuração de valor.",
"precision": "Precisão",
"digits": "dígitos",
"inverse_relation_title": "Configuração opcional para definir a qual relação esta é oposta. Exemplo: Pai - Filho são relações inversas entre si.",
"inverse_relation": "Relação inversa",
"inheritable_title": "O atributo herdável será transmitido para todos os descendentes deste ramo.",
"inheritable": "Herdável",
"save_and_close": "Salvar e fechar <kbd>Ctrl+Enter</kbd>",
"delete": "Excluir",
"related_notes_title": "Outras notas com este rótulo",
"more_notes": "Mais notas",
"label": "Detalhe do rótulo",
"label_definition": "Detalhe da definição do rótulo",
"relation": "Detalhe da relação",
"relation_definition": "Detalhe da definição da relação",
"disable_versioning": "desativa a versão automática. Útil, por exemplo, para notas grandes, mas sem importância como grandes bibliotecas JS usadas para scripts",
"calendar_root": "marca a nota que deve ser usada como raiz para notas diárias. Apenas uma deve ser marcada assim.",
"archived": "notas com este rótulo não serão exibidas por padrão nos resultados de busca (também nos diálogos Ir para, Adicionar link, etc).",
"exclude_from_export": "notas (junto com sua subárvore) não serão incluídas em nenhuma exportação de notas",
"run": "define em quais eventos o script deve ser executado. Os valores possíveis são:\n<ul>\n<li>frontendStartup - quando o frontend do Trilium inicia (ou é atualizado), mas não no celular.</li>\n<li>mobileStartup - quando o frontend do Trilium inicia (ou é atualizado), no celular.</li>\n<li>backendStartup - quando o backend do Trilium inicia</li>\n<li>hourly - executa uma vez por hora. Você pode usar o rótulo adicional <code>runAtHour</code> para especificar em qual hora.</li>\n<li>daily - executa uma vez por dia</li>\n</ul>",
"run_on_instance": "Define em qual instância do Trilium isso deve ser executado. Por padrão, todas as instâncias.",
"run_at_hour": "Em qual hora isso deve ser executado. Deve ser usado junto com <code>#run=hourly</code>. Pode ser definido várias vezes para executar mais de uma vez ao dia.",
"disable_inclusion": "scripts com este rótulo não serão incluídos na execução do script pai.",
"sorted": "mantém as notas filhas ordenadas alfabeticamente pelo título",
"sort_direction": "ASC (padrão) ou DESC",
"sort_folders_first": "Pastas (notas com filhos) devem ser ordenadas no topo",
"top": "mantenha a nota fornecida no topo em seu pai (aplica-se apenas a pais ordenados)",
"hide_promoted_attributes": "Ocultar atributos promovidos nesta nota",
"read_only": "o editor está em modo somente leitura. Funciona apenas para notas de texto e código.",
"auto_read_only_disabled": "notas de texto/código podem ser automaticamente configuradas para modo de leitura quando são muito grandes. Você pode desabilitar esse comportamento por nota adicionando este rótulo à nota",
"app_css": "marca notas CSS que são carregadas no aplicativo Trilium e, portanto, podem ser usadas para modificar a aparência do Trilium.",
"app_theme": "marca notas CSS que são temas completos do Trilium e, portanto, estão disponíveis nas opções do Trilium.",
"app_theme_base": "defina como \"next\", \"next-light\" ou \"next-dark\" para usar o tema TriliumNext correspondente (auto, claro ou escuro) como base para um tema personalizado, em vez do tema legado.",
"css_class": "o valor deste rótulo é então adicionado como classe CSS ao nó que representa a nota específica na árvore. Isso pode ser útil para temas avançados. Pode ser usado em notas de modelo.",
"icon_class": "o valor deste rótulo é adicionado como uma classe CSS ao ícone na árvore, o que pode ajudar a distinguir visualmente as notas na árvore. Um exemplo pode ser bx bx-home os ícones são retirados do boxicons. Pode ser usado em notas de modelo.",
"page_size": "número de itens por página na listagem de notas",
"custom_request_handler": "veja <a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">Manipulador de requisição personalizada</a>",
"custom_resource_provider": "veja <a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">Manipulador de requisição personalizada</a>",
"widget": "marca esta nota como um widget personalizado que será adicionado à árvore de componentes do Trilium",
"workspace": "marca esta nota como um espaço de trabalho, o que permite fácil hoisting",
"workspace_icon_class": "define a classe CSS do ícone box que será usada na aba quando esta nota for hoisted",
"workspace_tab_background_color": "cor CSS usada na aba da nota quando esta nota é hoisted",
"workspace_calendar_root": "Define a raiz do calendário por espaço de trabalho",
"workspace_template": "Esta nota aparecerá na seleção de modelos disponíveis ao criar uma nova nota, mas apenas quando estiver destacada em um espaço de trabalho que contenha este modelo",
"search_home": "novas notas de pesquisa serão criadas como filhas desta nota",
"workspace_search_home": "novas notas de pesquisa serão criadas como filhas desta nota quando ela for destacada para algum ancestral desta nota de área de trabalho",
"inbox": "localização padrão da caixa de entrada para novas notas quando você cria uma nota usando o botão \"nova nota\" na barra lateral, as notas serão criadas como notas filhas na nota marcada com o rótulo <code>#inbox</code>.",
"workspace_inbox": "local padrão da caixa de entrada para novas notas quando esta nota for destacada para algum ancestral desta nota de área de trabalho",
"sql_console_home": "localização padrão das notas do console SQL",
"bookmark_folder": "nota com este rótulo aparecerá nos favoritos como uma pasta (permitindo acesso aos seus filhos)",
"share_hidden_from_tree": "esta nota está oculta na árvore de navegação à esquerda, mas ainda pode ser acessada via sua URL",
"share_external_link": "a nota funcionará como um link para um site externo na árvore de compartilhamento",
"share_alias": "defina um alias por meio do qual a nota ficará disponível em https://your_trilium_host/share/[your_alias]",
"share_omit_default_css": "o CSS padrão da página de compartilhamento será omitido. Use quando você fizer alterações extensas de estilo.",
"share_root": "marca a nota que é servida na raiz de /share.",
"share_description": "defina o texto a ser adicionado à meta tag HTML \"description\"",
"share_raw": "a nota será servida em seu formato bruto, sem o wrapper HTML",
"share_disallow_robot_indexing": "impedirá que robôs indexem esta nota por meio do cabeçalho <code>X-Robots-Tag: noindex</code>",
"share_credentials": "exigir credenciais para acessar esta nota compartilhada. O valor deve estar no formato 'usuário:senha'. Não se esqueça de tornar esta configuração herdável para que seja aplicada às notas-filhas/imagens.",
"share_index": "notas com este rótulo irão listar todas as raízes das notas compartilhadas",
"display_relations": "nomes das relações separados por vírgula que devem ser exibidos. Todas as outras serão ocultadas.",
"hide_relations": "nomes das relações separados por vírgula que devem ser ocultados. Todas as outras serão exibidas.",
"title_template": "Título padrão das notas criadas como filhas desta nota. O valor é avaliado como uma string JavaScript e pode ser enriquecido com conteúdo dinâmico usando as variáveis injetadas <code>now</code> e <code>parentNote</code>. Exemplos:\n\n<ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n</ul>\n\nVeja a <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki com detalhes</a>, a documentação da API para <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> e para <a href=\"https://day.js.org/docs/en/display/format\">now</a> para mais informações.",
"template": "Esta nota aparecerá na seleção de modelos disponíveis ao criar uma nova nota",
"toc": "<code>#toc</code> ou <code>#toc=show</code> irá forçar a exibição do Sumário, <code>#toc=hide</code> irá forçar que ele fique oculto. Se o rótulo não existir, será considerado o ajuste global",
"color": "define a cor da nota na árvore de notas, links etc. Use qualquer valor de cor CSS válido, como 'red' ou #a13d5f",
"keyboard_shortcut": "Define um atalho de teclado que irá pular imediatamente para esta nota. Exemplo: 'ctrl+alt+e'. É necessário recarregar o frontend para que a alteração tenha efeito."
}
}

View File

@@ -7,8 +7,7 @@
"sync_version": "Versiune sincronizare:",
"build_date": "Data compilării:",
"build_revision": "Revizia compilării:",
"data_directory": "Directorul de date:",
"close": "Închide"
"data_directory": "Directorul de date:"
},
"abstract_bulk_action": {
"remove_this_search_action": "Înlătură acesată acțiune la căutare"
@@ -30,14 +29,13 @@
},
"add_link": {
"add_link": "Adaugă legătură",
"close": "Închide",
"help_on_links": "Informații despre legături",
"link_title": "Titlu legătură",
"link_title_arbitrary": "titlul legăturii poate fi schimbat în mod arbitrar",
"link_title_mirrors": "titlul legăturii corespunde titlul curent al notiței",
"note": "Notiță",
"search_note": "căutați notița după nume",
"button_add_link": "Adaugă legătură <kbd>Enter</kbd>"
"button_add_link": "Adaugă legătură"
},
"add_relation": {
"add_relation": "Adaugă relație",
@@ -232,7 +230,8 @@
"workspace_template": "Această notița va apărea în lista de șabloane când se crează o nouă notiță, dar doar când spațiul de lucru în care se află notița este focalizat",
"app_theme_base": "setați valoarea la „next” pentru a folosi drept temă de bază „TriliumNext” în loc de cea clasică.",
"print_landscape": "Schimbă orientarea paginii din portret în vedere atunci când se exportă în PDF.",
"print_page_size": "Schimbă dimensiunea paginii când se exportă în PDF. Valori suportate: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>."
"print_page_size": "Schimbă dimensiunea paginii când se exportă în PDF. Valori suportate: <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": "Culoare"
},
"attribute_editor": {
"add_a_new_attribute": "Adaugă un nou attribut",
@@ -274,7 +273,6 @@
"no_children_help": "Această notiță de tip Carte nu are nicio subnotiță așadar nu este nimic de afișat. Vedeți <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pentru detalii."
},
"book_properties": {
"book_properties": "",
"collapse": "Minimizează",
"collapse_all_notes": "Minimizează toate notițele",
"expand": "Expandează",
@@ -283,7 +281,11 @@
"invalid_view_type": "Mod de afișare incorect „{{type}}”",
"list": "Listă",
"view_type": "Mod de afișare",
"calendar": "Calendar"
"calendar": "Calendar",
"book_properties": "Proprietăți colecție",
"table": "Tabel",
"geo-map": "Hartă geografică",
"board": "Tablă Kanban"
},
"bookmark_switch": {
"bookmark": "Semn de carte",
@@ -292,10 +294,9 @@
},
"branch_prefix": {
"branch_prefix_saved": "Prefixul ramurii a fost salvat.",
"close": "Închide",
"edit_branch_prefix": "Editează prefixul ramurii",
"help_on_tree_prefix": "Informații despre prefixe de ierarhie",
"prefix": "Prefix:",
"prefix": "Prefix: ",
"save": "Salvează"
},
"bulk_actions": {
@@ -304,7 +305,6 @@
"bulk_actions": "Acțiuni în masă",
"bulk_actions_executed": "Acțiunile în masă au fost executate cu succes.",
"chosen_actions": "Acțiuni selectate",
"close": "Închide",
"execute_bulk_actions": "Execută acțiunile în masă",
"include_descendants": "Include descendenții notiței selectate",
"none_yet": "Nicio acțiune... adăugați una printr-un click pe cele disponibile mai jos.",
@@ -333,11 +333,12 @@
"sun": "Dum",
"thu": "Joi",
"tue": "Mar",
"wed": "Mie"
"wed": "Mie",
"cannot_find_week_note": "Nu s-a putut găsi notița săptămânală"
},
"clone_to": {
"clone_notes_to": "Clonează notițele către...",
"clone_to_selected_note": "Clonează notița selectată <kbd>enter</kbd>",
"clone_to_selected_note": "Clonează notița selectată",
"cloned_note_prefix_title": "Notița clonată va fi afișată în ierarhia notiței utilizând prefixul dat",
"help_on_links": "Informații despre legături",
"no_path_to_clone_to": "Nicio cale de clonat.",
@@ -345,8 +346,7 @@
"notes_to_clone": "Notițe de clonat",
"prefix_optional": "Prefix (opțional)",
"search_for_note_by_its_name": "căutați notița după nume acesteia",
"target_parent_note": "Notița părinte țintă",
"close": "Închide"
"target_parent_note": "Notița părinte țintă"
},
"close_pane_button": {
"close_this_pane": "Închide acest panou"
@@ -373,8 +373,7 @@
"cancel": "Anulează",
"confirmation": "Confirm",
"if_you_dont_check": "Dacă această opțiune nu este bifată, notița va fi ștearsă doar din harta de relații.",
"ok": "OK",
"close": "Închide"
"ok": "OK"
},
"consistency_checks": {
"find_and_fix_button": "Caută și repară probleme de consistență",
@@ -431,14 +430,14 @@
"undelete_notes_instruction": "După ștergere, se pot recupera din ecranul Schimbări recente."
},
"delete_notes": {
"broken_relations_to_be_deleted": "Următoarele relații vor fi întrerupte și șterse ({{- relationCount}})",
"broken_relations_to_be_deleted": "Următoarele relații vor fi întrerupte și șterse ({{ relationCount}})",
"cancel": "Anulează",
"delete_all_clones_description": "Șterge și toate clonele (se pot recupera în ecranul Schimbări recente)",
"delete_notes_preview": "Previzualizare ștergerea notițelor",
"erase_notes_description": "Ștergerea obișnuită doar marchează notițele ca fiind șterse și pot fi recuperate (în ecranul Schimbări recente) pentru o perioadă de timp. Dacă se bifează această opțiune, notițele vor fi șterse imediat fără posibilitatea de a le recupera.",
"erase_notes_warning": "Șterge notițele permanent (nu se mai pot recupera), incluzând toate clonele. Va forța reîncărcarea aplicației.",
"no_note_to_delete": "Nicio notiță nu va fi ștearsă (doar clonele).",
"notes_to_be_deleted": "Următoarele notițe vor fi șterse ({{- noteCount}})",
"notes_to_be_deleted": "Următoarele notițe vor fi șterse ({{notesCount}})",
"ok": "OK",
"deleted_relation_text": "Notița {{- note}} ce va fi ștearsă este referențiată de relația {{- relation}}, originând din {{- source}}.",
"close": "Închide"
@@ -610,13 +609,12 @@
"activatePreviousTab": "activează tabul anterior",
"blockQuote": "începeți un rând cu <code>></code> urmat de spațiu pentru un bloc de citat",
"bulletList": "<code>*</code> sau <code>-</code> urmat de spațiu pentru o listă punctată",
"close": "Închide",
"closeActiveTab": "închide tabul activ",
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - minimizează/expandează nodul",
"collapseExpand": "minimizează/expandează nodul",
"collapseSubTree": "minimizează subarborele",
"collapseWholeTree": "minimizează întregul arbore de notițe",
"copyNotes": "copiază notița activă (sau selecția curentă) în clipboard (utilizat pentru <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonare</a>)",
"createEditLink": "<kbd>Ctrl+K</kbd> - crează/editează legătură externă",
"createEditLink": "crează/editează legătură externă",
"createInternalLink": "crează legătură internă",
"createNoteAfter": "crează o nouă notiță după notița activă",
"createNoteInto": "crează o subnotiță în notița activă",
@@ -627,20 +625,19 @@
"editNoteTitle": "va sări de la arborele de notițe către titlul notiței. Enter de la titlul notiței va sări către editorul de text. <kbd>Ctrl+.</kbd> va sări înapoi de la editor către arborele de notițe.",
"editingNotes": "Editarea notițelor",
"followLink": "urmărește link-ul sub cursor",
"fullDocumentation": "Instrucțiuni (documentația completă se regăsește <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">online</a>)",
"goBackForwards": "mergi înapoi/înainte în istoric",
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - mergi sus/jos în lista de notițe",
"goUpDown": "mergi sus/jos în lista de notițe",
"headings": "<code>##</code>, <code>###</code>, <code>####</code> etc. urmat de spațiu pentru titluri",
"inPageSearch": "caută în interiorul paginii",
"insertDateTime": "inserează data și timpul curente la poziția cursorului",
"jumpToParentNote": "<kbd>Backspace</kbd> - sari la pagina părinte",
"jumpToParentNote": "sari la pagina părinte",
"jumpToTreePane": "sari către arborele de notițe și scrolează către notița activă",
"markdownAutoformat": "Formatare în stil Markdown",
"moveNoteUpDown": "mută notița sus/jos în lista de notițe",
"moveNoteUpHierarchy": "mută notița mai sus în ierarhie",
"movingCloningNotes": "Mutarea/clonarea notițelor",
"multiSelectNote": "selectează multiplu notița de sus/jos",
"newTabNoteLink": "<kbd>CTRL+clic</kbd> - (sau clic mijlociu) pe o legătură către o notiță va deschide notița într-un tab nou",
"newTabNoteLink": "pe o legătură către o notiță va deschide notița într-un tab nou",
"notSet": "nesetat",
"noteNavigation": "Navigarea printre notițe",
"numberedList": "<kbd>1.</code> sau <code>1)</code> urmat de spațiu pentru o listă numerotată",
@@ -652,12 +649,13 @@
"reloadFrontend": "reîncarcă interfața Trilium",
"scrollToActiveNote": "scrolează la notița activă",
"selectAllNotes": "selectează toate notițele din nivelul curent",
"selectNote": "<kbd>Shift+Click</kbd> - selectează notița",
"selectNote": "selectează notița",
"showDevTools": "afișează instrumentele de dezvoltatori",
"showJumpToNoteDialog": "afișează <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">ecranul „Sari la”</a>",
"showSQLConsole": "afișează consola SQL",
"tabShortcuts": "Scurtături pentru tab-uri",
"troubleshooting": "Unelte pentru depanare"
"troubleshooting": "Unelte pentru depanare",
"newTabWithActivationNoteLink": "pe o legătură către o notiță deschide și activează notița într-un tab nou"
},
"hide_floating_buttons_button": {
"button_title": "Ascunde butoanele"
@@ -680,7 +678,14 @@
"monday": "Luni",
"sunday": "Duminică",
"title": "Localizare",
"formatting-locale": "Format dată și numere"
"formatting-locale": "Format dată și numere",
"first-week-of-the-year": "Prima săptămână din an",
"first-week-contains-first-day": "Prima săptămână conține prima zi din an",
"first-week-contains-first-thursday": "Prima săptămână conține prima zi de joi din an",
"first-week-has-minimum-days": "Prima săptămână are numărul minim de zile",
"min-days-in-first-week": "Numărul minim de zile pentru prima săptămână",
"first-week-info": "Opțiunea de prima săptămână conține prima zi de joi din an este bazată pe standardul <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
"first-week-warning": "Schimbarea opțiunii primei săptămâni poate cauza duplicate cu notițele săptămânale existente deoarece acestea nu vor fi actualizate retroactiv."
},
"image_properties": {
"copy_reference_to_clipboard": "Copiază referință în clipboard",
@@ -705,7 +710,6 @@
},
"import": {
"chooseImportFile": "Selectați fișierul de importat",
"close": "Închide",
"codeImportedAsCode": "Importă fișiere identificate drept cod sursă (e.g. <code>.json</code>) drept notițe de tip cod dacă nu este clar din metainformații",
"explodeArchives": "Citește conținutul arhivelor <code>.zip</code>, <code>.enex</code> și <code>.opml</code>.",
"explodeArchivesTooltip": "Dacă această opțiune este bifată atunci Trilium va citi fișiere de tip <code>.zip</code>, <code>.enex</code> și <code>.opml</code> și va crea notițe din fișierele din interiorul acestor arhive. Dacă este nebifat, atunci Trilium va atașa arhiva propriu-zisă la notiță.",
@@ -738,11 +742,10 @@
"box_size_medium": "mediu (~ 30 de rânduri)",
"box_size_prompt": "Dimensiunea căsuței notiței incluse:",
"box_size_small": "mică (~ 10 rânduri)",
"button_include": "Include notița <kbd>Enter</kbd>",
"button_include": "Include notița",
"dialog_title": "Includere notița",
"label_note": "Notiță",
"placeholder_search": "căutați notița după denumirea ei",
"close": "Închide"
"placeholder_search": "căutați notița după denumirea ei"
},
"info": {
"closeButton": "Închide",
@@ -754,9 +757,8 @@
"title": "Atribute moștenite"
},
"jump_to_note": {
"search_button": "Caută în întregul conținut <kbd>Ctrl+Enter</kbd>",
"search_placeholder": "",
"close": "Închide"
"search_button": "Caută în întregul conținut",
"search_placeholder": "Căutați notițe după nume sau tastați > pentru comenzi..."
},
"left_pane_toggle": {
"hide_panel": "Ascunde panoul",
@@ -768,10 +770,9 @@
},
"markdown_import": {
"dialog_title": "Importă Markdown",
"import_button": "Importă Ctrl+Enter",
"import_button": "Importă",
"import_success": "Conținutul Markdown a fost importat în document.",
"modal_body_text": "Din cauza limitărilor la nivel de navigator, nu este posibilă citirea clipboard-ului din JavaScript. Inserați Markdown-ul pentru a-l importa în caseta de mai jos și dați clic pe butonul Import",
"close": "Închide"
"modal_body_text": "Din cauza limitărilor la nivel de navigator, nu este posibilă citirea clipboard-ului din JavaScript. Inserați Markdown-ul pentru a-l importa în caseta de mai jos și dați clic pe butonul Import"
},
"max_content_width": {
"apply_changes_description": "Pentru a aplica schimbările de lățime a conținutului, dați click pe",
@@ -804,12 +805,11 @@
"move_to": {
"dialog_title": "Mută notițele în...",
"error_no_path": "Nicio cale la care să poată fi mutate.",
"move_button": "Mută la notița selectată <kbd>enter</kbd>",
"move_button": "Mută la notița selectată",
"move_success_message": "Notițele selectate au fost mutate în",
"notes_to_move": "Notițe de mutat",
"search_placeholder": "căutați notița după denumirea ei",
"target_parent_note": "Notița părinte destinație",
"close": "Închide"
"target_parent_note": "Notița părinte destinație"
},
"native_title_bar": {
"disabled": "dezactivată",
@@ -884,8 +884,9 @@
"note_type_chooser": {
"modal_body": "Selectați tipul notiței/șablonul pentru noua notiță:",
"modal_title": "Selectați tipul notiței",
"templates": "Șabloane:",
"close": "Închide"
"templates": "Șabloane",
"change_path_prompt": "Selectați locul unde să se creeze noua notiță:",
"search_placeholder": "căutare cale notiță după nume (cea implicită dacă este necompletat)"
},
"onclick_button": {
"no_click_handler": "Butonul „{{componentId}}” nu are nicio acțiune la clic definită"
@@ -939,9 +940,7 @@
},
"password_not_set": {
"body1": "Notițele protejate sunt criptate utilizând parola de utilizator, dar nu a fost setată nicio parolă.",
"body2": "Pentru a putea să protejați notițe, clic <a class=\"open-password-options-button\" href=\"javascript:\">aici</a> pentru a deschide ecranul de opțiuni și pentru a seta parola.",
"title": "Parola nu este setată",
"close": "Închide"
"title": "Parola nu este setată"
},
"promoted_attributes": {
"add_new_attribute": "Adaugă un nou atribut",
@@ -951,13 +950,13 @@
"unknown_attribute_type": "Tip de atribut necunoscut „{{type}}”",
"unknown_label_type": "Tip de etichetă necunoscut „{{type}}”",
"url_placeholder": "http://siteweb...",
"unset-field-placeholder": "nesetat"
"unset-field-placeholder": "nesetat",
"remove_color": "Înlătura culoarea"
},
"prompt": {
"defaultTitle": "Aviz",
"ok": "OK <kbd>enter</kbd>",
"title": "Aviz",
"close": "Închide"
"ok": "OK",
"title": "Aviz"
},
"protected_session": {
"enter_password_instruction": "Afișarea notițelor protejate necesită introducerea parolei:",
@@ -976,7 +975,7 @@
"form_label": "Pentru a putea continua cu acțiunea cerută este nevoie să fie pornită sesiunea protejată prin introducerea parolei:",
"help_title": "Informații despre notițe protejate",
"modal_title": "Sesiune protejată",
"start_button": "Pornește sesiunea protejată <kbd>enter</kbd>"
"start_button": "Pornește sesiunea protejată"
},
"protected_session_status": {
"active": "Sesiunea protejată este activă. Clic pentru a închide sesiunea protejată.",
@@ -988,8 +987,7 @@
"erase_notes_button": "Elimină notițele șterse",
"no_changes_message": "Încă nicio schimbare...",
"title": "Modificări recente",
"undelete_link": "restaurare",
"close": "Închide"
"undelete_link": "restaurare"
},
"relation_map": {
"cannot_match_transform": "Nu s-a putut identifica transformarea: {{transform}}",
@@ -1068,8 +1066,7 @@
"revisions_deleted": "Notița reviziei a fost ștearsă.",
"maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.",
"settings": "Setări revizii ale notițelor",
"snapshot_interval": "Intervalul de creare a reviziilor pentru notițe: {{seconds}}s.",
"close": "Închide"
"snapshot_interval": "Intervalul de creare a reviziilor pentru notițe: {{seconds}}s."
},
"revisions_button": {
"note_revisions": "Revizii ale notiței"
@@ -1177,15 +1174,14 @@
"folders": "Dosare",
"natural_sort": "Ordonare naturală",
"natural_sort_language": "Limba pentru ordonare naturală",
"sort": "Ordonare <kbd>Enter</kbd>",
"sort": "Ordonare",
"sort_children_by": "Ordonează subnotițele după...",
"sort_folders_at_top": "ordonează dosarele primele",
"sort_with_respect_to_different_character_sorting": "ordonează respectând regulile de sortare și clasificare diferite în funcție de limbă și regiune.",
"sorting_criteria": "Criterii de ordonare",
"sorting_direction": "Direcția de ordonare",
"the_language_code_for_natural_sort": "Codul limbii pentru ordonarea naturală, e.g. „zn-CN” pentru chineză.",
"title": "titlu",
"close": "Închide"
"title": "titlu"
},
"spellcheck": {
"available_language_codes_label": "Coduri de limbă disponibile:",
@@ -1237,12 +1233,9 @@
"unit": "caractere"
},
"theme": {
"auto_theme": "Temă auto (se adaptează la schema de culori a sistemului)",
"dark_theme": "Temă întunecată",
"light_theme": "Temă luminoasă",
"triliumnext": "TriliumNext Beta (se adaptează la schema de culori a sistemului)",
"triliumnext-light": "TriliumNext Beta (luminoasă)",
"triliumnext-dark": "TriliumNext Beta (întunecată)",
"triliumnext": "Trilium (se adaptează la schema de culori a sistemului)",
"triliumnext-light": "Trilium (luminoasă)",
"triliumnext-dark": "Trilium (întunecată)",
"override_theme_fonts_label": "Suprascrie fonturile temei",
"theme_label": "Temă",
"title": "Tema aplicației",
@@ -1295,13 +1288,12 @@
},
"upload_attachments": {
"choose_files": "Selectați fișierele",
"files_will_be_uploaded": "Fișierele vor fi încărcate ca atașamente în",
"files_will_be_uploaded": "Fișierele vor fi încărcate ca atașamente în {{noteTitle}}",
"options": "Opțuni",
"shrink_images": "Micșorează imaginile",
"tooltip": "Dacă această opțiune este bifată, Trilium va încerca micșorarea imaginilor încărcate prin scalarea și optimizarea lor, aspect ce va putea afecta calitatea imaginilor. Dacă nu este bifată, imaginile vor fi încărcate fără nicio schimbare.",
"upload": "Încărcare",
"upload_attachments_to_note": "Încarcă atașamentele la notiță",
"close": "Închide"
"upload_attachments_to_note": "Încarcă atașamentele la notiță"
},
"vacuum_database": {
"button_text": "Compactează baza de date",
@@ -1369,7 +1361,8 @@
"hoist-note": "Focalizează notița",
"unhoist-note": "Defocalizează notița",
"converted-to-attachments": "{{count}} notițe au fost convertite în atașamente.",
"convert-to-attachment-confirm": "Doriți convertirea notițelor selectate în atașamente ale notiței părinte?"
"convert-to-attachment-confirm": "Doriți convertirea notițelor selectate în atașamente ale notiței părinte?",
"open-in-popup": "Editare rapidă"
},
"shared_info": {
"help_link": "Pentru informații vizitați <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki-ul</a>.",
@@ -1396,7 +1389,10 @@
"confirm-change": "Nu se recomandă schimbarea tipului notiței atunci când ea are un conținut. Procedați oricum?",
"geo-map": "Hartă geografică",
"beta-feature": "Beta",
"task-list": "Listă de sarcini"
"task-list": "Listă de sarcini",
"ai-chat": "Discuție cu AI-ul",
"new-feature": "Nou",
"collections": "Colecții"
},
"protect_note": {
"toggle-off": "Deprotejează notița",
@@ -1530,7 +1526,9 @@
},
"clipboard": {
"copied": "Notițele au fost copiate în clipboard.",
"cut": "Notițele au fost decupate în clipboard."
"cut": "Notițele au fost decupate în clipboard.",
"copy_failed": "Nu se poate copia în clipboard din cauza unor probleme de permisiuni.",
"copy_success": "S-a copiat în clipboard."
},
"entrypoints": {
"note-executed": "Notița a fost executată.",
@@ -1581,14 +1579,15 @@
},
"highlighting": {
"color-scheme": "Temă de culori",
"title": "",
"description": "Controlează evidențierea de sintaxă pentru blocurile de cod în interiorul notițelor text, notițele de tip cod nu vor fi afectate de aceste setări."
"description": "Controlează evidențierea de sintaxă pentru blocurile de cod în interiorul notițelor text, notițele de tip cod nu vor fi afectate de aceste setări.",
"title": "Blocuri de cod"
},
"code_block": {
"word_wrapping": "Încadrare text",
"theme_none": "Fără evidențiere de sintaxă",
"theme_group_dark": "Teme întunecate",
"theme_group_light": "Teme luminoase"
"theme_group_light": "Teme luminoase",
"copy_title": "Copiază în clipboard"
},
"classic_editor_toolbar": {
"title": "Formatare"
@@ -1626,7 +1625,8 @@
"link_context_menu": {
"open_note_in_new_split": "Deschide notița într-un panou nou",
"open_note_in_new_tab": "Deschide notița într-un tab nou",
"open_note_in_new_window": "Deschide notița într-o fereastră nouă"
"open_note_in_new_window": "Deschide notița într-o fereastră nouă",
"open_note_in_popup": "Editare rapidă"
},
"note_autocomplete": {
"clear-text-field": "Șterge conținutul casetei",
@@ -1646,19 +1646,18 @@
"zoom-factor": "Factor de zoom"
},
"note_tooltip": {
"note-has-been-deleted": "Notița a fost ștearsă."
},
"notes": {
"duplicate-note-suffix": "(dupl.)",
"duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}"
"note-has-been-deleted": "Notița a fost ștearsă.",
"quick-edit": "Editare rapidă"
},
"geo-map-context": {
"open-location": "Deschide locația",
"remove-from-map": "Înlătură de pe hartă"
"remove-from-map": "Înlătură de pe hartă",
"add-note": "Adaugă un marcaj la această poziție"
},
"geo-map": {
"create-child-note-title": "Crează o notiță nouă și adaug-o pe hartă",
"unable-to-load-map": "Nu s-a putut încărca harta."
"unable-to-load-map": "Nu s-a putut încărca harta.",
"create-child-note-instruction": "Click pe hartă pentru a crea o nouă notiță la acea poziție sau apăsați Escape pentru a anula."
},
"duration": {
"days": "zile",
@@ -1704,9 +1703,6 @@
"description": "Selectați una sau mai multe limbi ce vor apărea în selecția limbii din cadrul secțiunii „Proprietăți de bază” pentru notițele de tip text (editabile sau doar în citire).",
"title": "Limbi pentru conținutul notițelor"
},
"hidden-subtree": {
"localization": "Limbă și regiune"
},
"note_language": {
"configure-languages": "Configurează limbile...",
"not_set": "Nedefinită"
@@ -1721,5 +1717,274 @@
"toggle_read_only_button": {
"lock-editing": "Blochează editarea",
"unlock-editing": "Deblochează editarea"
},
"ai_llm": {
"not_started": "Nu s-a pornit",
"title": "Setări AI",
"processed_notes": "Notițe procesate",
"total_notes": "Totalul de notițe",
"progress": "Progres",
"queued_notes": "Notițe în curs de procesare",
"failed_notes": "Notițe ce au eșuat",
"last_processed": "Ultima procesare",
"refresh_stats": "Reîmprospătare statistici",
"enable_ai_features": "Activează funcțiile AI/LLM",
"enable_ai_description": "Activează funcțiile AI precum sumarizarea notițelor, generarea de conținut și alte capabilități ale LLM-ului",
"openai_tab": "OpenAI",
"anthropic_tab": "Anthropic",
"voyage_tab": "Voyage AI",
"ollama_tab": "Ollama",
"enable_ai": "Activează funcții AI/LLM",
"enable_ai_desc": "Activează funcțiile AI precum sumarizarea notițelor, generarea de conținut și alte capabilități ale LLM-ului",
"provider_configuration": "Setările furnizorului de AI",
"provider_precedence": "Ordinea de precedență a furnizorilor",
"provider_precedence_description": "Lista de furnizori în ordinea de precedență, separate de virgulă (ex. „openai,anthropic,ollama”)",
"temperature": "Temperatură",
"temperature_description": "Controlează aleatoritatea din răspunsuri (0 = deterministic, 2 = maxim aleator)",
"system_prompt": "Prompt-ul de sistem",
"system_prompt_description": "Prompt-ul de sistem folosit pentru toate interacțiunile cu AI-ul",
"openai_configuration": "Configurația OpenAI",
"openai_settings": "Setările OpenAI",
"api_key": "Cheie API",
"url": "URL de bază",
"model": "Model",
"openai_api_key_description": "Cheia de API din OpenAI pentru a putea accesa serviciile de AI",
"anthropic_api_key_description": "Cheia de API din Anthropic pentru a accesa modelele Claude",
"default_model": "Modelul implicit",
"openai_model_description": "Exemple: gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
"base_url": "URL de bază",
"openai_url_description": "Implicit: https://api.openai.com/v1",
"anthropic_settings": "Setări Anthropic",
"anthropic_url_description": "URL de bază pentru API-ul Anthropic (implicit: https://api.anthropic.com)",
"anthropic_model_description": "Modele Anthropic Claude pentru auto-completare",
"voyage_settings": "Setări Voyage AI",
"ollama_settings": "Setări Ollama",
"ollama_url_description": "URL pentru API-ul Ollama (implicit: http://localhost:11434)",
"ollama_model_description": "Modelul Ollama pentru auto-completare",
"anthropic_configuration": "Configurația Anthropic",
"voyage_configuration": "Configurația Voyage AI",
"voyage_url_description": "Implicit: https://api.voyageai.com/v1",
"ollama_configuration": "Configurația Ollama",
"enable_ollama": "Activează Ollama",
"enable_ollama_description": "Activează Ollama pentru a putea utiliza modele AI locale",
"ollama_url": "URL Ollama",
"ollama_model": "Model Ollama",
"refresh_models": "Reîmprospătează modelele",
"refreshing_models": "Reîmprospătare...",
"enable_automatic_indexing": "Activează indexarea automată",
"rebuild_index": "Reconstruire index",
"rebuild_index_error": "Eroare la reconstruirea indexului. Verificați logurile pentru mai multe detalii.",
"note_title": "Titlul notiței",
"error": "Eroare",
"last_attempt": "Ultima încercare",
"actions": "Acțiuni",
"retry": "Reîncercare",
"partial": "{{ percentage }}% finalizat",
"retry_queued": "Notiță pusă în coadă pentru reîncercare",
"retry_failed": "Nu s-a putut pune notița în coada pentru reîncercare",
"max_notes_per_llm_query": "Număr maximum de notițe per interogare",
"max_notes_per_llm_query_description": "Numărul maxim de notițe similare incluse în contextul pentru AI",
"active_providers": "Furnizori activi",
"disabled_providers": "Furnizori dezactivați",
"remove_provider": "Șterge furnizorul din căutare",
"restore_provider": "Restaurează furnizorul pentru căutare",
"similarity_threshold": "Prag de similaritate",
"similarity_threshold_description": "Scorul minim de similaritate (0-1) pentru a include notițele în contextul interogărilor LLM",
"reprocess_index": "Reconstruiește indexul de căutare",
"reprocessing_index": "Reconstruire...",
"reprocess_index_started": "S-a pornit în fundal optimizarea indexului de căutare",
"reprocess_index_error": "Eroare la reconstruirea indexului de căutare",
"index_rebuild_progress": "Reconstruire index în curs",
"index_rebuilding": "Optimizare index ({{percentage}}%)",
"index_rebuild_complete": "Optimizarea indexului a avut loc cu succes",
"index_rebuild_status_error": "Eroare la verificarea stării reconstruirii indexului",
"never": "Niciodată",
"processing": "Procesare ({{percentage}}%)",
"incomplete": "Incomplet ({{percentage}}%)",
"complete": "Complet (100%)",
"refreshing": "Reîmprospătare...",
"auto_refresh_notice": "Reîmprospătare automată la fiecare {{seconds}} secunde",
"note_queued_for_retry": "Notiță pusă în coadă pentru reîncercare",
"failed_to_retry_note": "Eroare la reîncercarea notiței",
"all_notes_queued_for_retry": "Toate notițele eșuate au fost puse în coada de reîncercare",
"failed_to_retry_all": "Eroare la reîncercarea notițelor",
"ai_settings": "Setări AI",
"api_key_tooltip": "Cheia API pentru accesarea serviciului",
"empty_key_warning": {
"anthropic": "Cheia API pentru Anthropic lipsește. Introduceți o cheie API validă.",
"openai": "Cheia API pentru OpenAI lipsește. Introduceți o cheie API validă.",
"voyage": "Cheia API pentru Voyage lipsește. Introduceți o cheie API validă.",
"ollama": "Cheia API pentru Ollama lipsește. Introduceți o cheie API validă."
},
"agent": {
"processing": "Procesare...",
"thinking": "Raționalizare...",
"loading": "Încărcare...",
"generating": "Generare..."
},
"name": "AI",
"openai": "OpenAI",
"use_enhanced_context": "Folosește context îmbogățit",
"enhanced_context_description": "Oferă AI-ului mai multe informații de context din notiță și notițele similare pentru răspunsuri mai bune",
"show_thinking": "Afișează procesul de raționalizare",
"show_thinking_description": "Afișează lanțul de acțiuni din procesul de gândire al AI-ului",
"enter_message": "Introduceți mesajul...",
"error_contacting_provider": "Eroare la contactarea furnizorului de AI. Verificați setările și conexiunea la internet.",
"error_generating_response": "Eroare la generarea răspunsului AI",
"index_all_notes": "Indexează toate notițele",
"index_status": "Starea indexării",
"indexed_notes": "Notițe indexate",
"indexing_stopped": "Indexarea s-a oprit",
"indexing_in_progress": "Indexare în curs...",
"last_indexed": "Ultima indexare",
"n_notes_queued_0": "O notiță adăugată în coada de indexare",
"n_notes_queued_1": "{{ count }} notițe adăugate în coada de indexare",
"n_notes_queued_2": "{{ count }} de notițe adăugate în coada de indexare",
"note_chat": "Discuție pe baza notițelor",
"notes_indexed_0": "O notiță indexată",
"notes_indexed_1": "{{ count }} notițe indexate",
"notes_indexed_2": "{{ count }} de notițe indexate",
"sources": "Surse",
"start_indexing": "Indexează",
"use_advanced_context": "Folosește context îmbogățit",
"ollama_no_url": "Ollama nu este configurat. Introduceți un URL corect.",
"chat": {
"root_note_title": "Discuții cu AI-ul",
"root_note_content": "Această notiță stochează conversația cu AI-ul.",
"new_chat_title": "Discuție nouă",
"create_new_ai_chat": "Crează o nouă discuție cu AI-ul"
},
"create_new_ai_chat": "Crează o nouă discuție cu AI-ul",
"configuration_warnings": "Sunt câteva probleme la configurația AI-ului. Verificați setările.",
"experimental_warning": "Funcția LLM este experimentală!",
"selected_provider": "Furnizor selectat",
"selected_provider_description": "Selectați furnizorul de AI pentru funcțiile de discuție și completare",
"select_model": "Selectați modelul...",
"select_provider": "Selectați furnizorul..."
},
"custom_date_time_format": {
"title": "Format dată/timp personalizat",
"description": "Personalizați formatul de dată și timp inserat prin <kbd></kbd> sau din bara de unelte. Vedeți <a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">Documentația Day.js</a> pentru câmpurile de formatare disponibile.",
"format_string": "Șir de formatare:",
"formatted_time": "Data și ora formatate:"
},
"multi_factor_authentication": {
"title": "Autentificare multi-factor",
"description": "Autentificarea multifactor (MFA) adaugă un strat de securitate adițional. Pe lângă introducerea parolei pentru atentificare, este necesară o dovadă adițională pentru a verifica identitatea. În acest fel, chiar dacă cineva este în posesia parolei dvs., nu vor putea accesa contul fără dovada adițională.<br><br>Urmați instrucțiunile de mai jos pentru a activa MFA. Dacă configurația nu este corectă, autentificarea va face doar cu parolă.",
"mfa_enabled": "Activare autentificare multi-factor",
"mfa_method": "Metodă MFA",
"electron_disabled": "Autentificarea multi-factor este suportată doar în aplicația desktop momentan.",
"totp_title": "Parolă unică bazată pe timp (TOTP)",
"totp_description": "TOTP (Time-Based One-Time Password) este o funcție de securitate care crează un cod unic, temporar care se schimbă la fiecare 30 de secunde. Acest cod se poate folosi pe lângă parolă pentru a face accesul neautorizat mult mai dificil.",
"totp_secret_title": "Generează secret TOTP",
"totp_secret_generate": "Generează secret TOTP",
"totp_secret_regenerate": "Regenerează secretul TOTP",
"no_totp_secret_warning": "Pentru a activa TOTP trebuie mai întâi generat un secret TOTP.",
"totp_secret_description_warning": "După generarea unui nou secret TOTP, va trebui să vă autentificați din nou cu folosirea codului TOTP.",
"totp_secret_generated": "Secret TOTP generat",
"totp_secret_warning": "Stocați secretul generat într-un loc securizat. Acesta nu va mai fi afișat din nou.",
"totp_secret_regenerate_confirm": "Doriți regenerarea secretului TOTP? Acest lucru va invalida secretul TOTP anterior și toate codurile de recuperere preexistente.",
"recovery_keys_title": "Chei unice de recuperare",
"recovery_keys_description": "Fiecare cheie unică poate fi folosită o singură dată pentru autentificare chiar dacă nu mai aveți acces la codurile generate.",
"recovery_keys_description_warning": "Cheile de recuperare nu vor mai fi afișate după părăsirea acestei pagini; păstrați-le într-un loc sigur.<br>Odată ce o cheie de recuperare este folosită, ea nu mai poate fi refolosită.",
"recovery_keys_error": "Eroare la generarea codurilor de recuperare",
"recovery_keys_no_key_set": "Niciun cod de recuperare nu a fost setat",
"recovery_keys_generate": "Generează codurile de recuperare",
"recovery_keys_regenerate": "Regenerează codurile de recuperare",
"recovery_keys_used": "Folosit la: {{date}}",
"recovery_keys_unused": "Codul de recuperere {{index}} este nefolosit",
"oauth_title": "OAuth/OpenID",
"oauth_description": "OpenID este o cale standardizată ce permite autentificarea într-un site folosind un cont dintr-un alt serviciu, precum Google, pentru a verifica identitatea. În mod implicit furnizorul este Google, dar se poate schimba cu orice furnizor OpenID. Pentru mai multe informații, consultați <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">ghidul</a>. Urmați <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">aceste instrucțiuni</a> pentru a putea configura OpenID prin Google.",
"oauth_description_warning": "Pentru a activa OAuth sau OpenID, trebuie să configurați URL-ul de bază, ID-ul de client și secretul de client în fișierul config.ini și să reporniți aplicația. Dacă doriți să utilizați variabile de environment, puteți seta TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID și TRILIUM_OAUTH_CLIENT_SECRET.",
"oauth_missing_vars": "Setări lipsă: {{variables}}",
"oauth_user_account": "Cont: ",
"oauth_user_email": "Email: ",
"oauth_user_not_logged_in": "Neautentificat!"
},
"svg": {
"export_to_png": "Diagrama nu a putut fi exportată în PNG."
},
"code_theme": {
"title": "Afișare",
"word_wrapping": "Încadrare text",
"color-scheme": "Temă de culori"
},
"cpu_arch_warning": {
"title": "Descărcați versiunea de ARM64",
"message_macos": "Aplicația rulează momentan sub stratul de translație Rosetta 2, ceea ce înseamnă că folosiți versiunea de Intel (x64) pe un Mac cu Apple Silicon. Acest lucru impactează semnificativ performanța aplicației și durata de viață a bateriei.",
"message_windows": "Aplicația rulează în mod de emulare, ceea ce înseamnă că folosiți versiunea de Intel (x64) pe un dispozitiv Windows pe ARM. Acest lucru impactează semnificativ performanția aplicației și durata de viață a bateriei.",
"recommendation": "Pentru cea mai bună experiență, descărcați versiunea nativă de ARM64 a aplicației de pe pagina de release-uri.",
"download_link": "Descarcă versiunea nativă",
"continue_anyway": "Continuă oricum",
"dont_show_again": "Nu mai afișa acest mesaj"
},
"editorfeatures": {
"title": "Funcții",
"emoji_completion_enabled": "Activează auto-completarea pentru emoji-uri",
"note_completion_enabled": "Activează auto-completarea pentru notițe"
},
"table_view": {
"new-row": "Rând nou",
"new-column": "Coloană nouă",
"sort-column-by": "Ordonează după „{{title}}”",
"sort-column-ascending": "Ascendent",
"sort-column-descending": "Descendent",
"sort-column-clear": "Dezactivează ordonarea",
"hide-column": "Ascunde coloana „{{title}}”",
"show-hide-columns": "Afișează/ascunde coloane",
"row-insert-above": "Inserează rând deasupra",
"row-insert-below": "Inserează rând dedesubt",
"row-insert-child": "Inserează subnotiță",
"add-column-to-the-left": "Adaugă coloană la stânga",
"add-column-to-the-right": "Adaugă coloană la dreapta",
"edit-column": "Editează coloana",
"delete_column_confirmation": "Doriți ștergerea acestei coloane? Atributul corespunzător va fi șters din toate notițele din ierarhie.",
"delete-column": "Șterge coloana",
"new-column-label": "Etichetă",
"new-column-relation": "Relație"
},
"book_properties_config": {
"hide-weekends": "Ascunde weekend-urile",
"display-week-numbers": "Afișează numărul săptămânii",
"map-style": "Stil hartă:",
"max-nesting-depth": "Nivel maxim de imbricare:",
"raster": "Raster",
"vector_light": "Vectorial (culoare deschisă)",
"vector_dark": "Vectorial (culoare închisă)",
"show-scale": "Afișează scara hărții"
},
"table_context_menu": {
"delete_row": "Șterge rândul"
},
"board_view": {
"delete-note": "Șterge notița",
"move-to": "Mută la",
"insert-above": "Inserează deasupra",
"insert-below": "Inserează dedesubt",
"delete-column": "Șterge coloana",
"delete-column-confirmation": "Doriți ștergerea acestei coloane? Atributul corespunzător va fi șters din notițele din acest tabel.",
"new-item": "Intrare nouă",
"add-column": "Adaugă coloană"
},
"command_palette": {
"tree-action-name": "Listă de notițe: {{name}}",
"export_note_title": "Exportă notița",
"export_note_description": "Exportă notița curentă",
"show_attachments_title": "Afișează atașamentele",
"show_attachments_description": "Vedeți lista de atașamente corespunzătoare notiței",
"search_notes_title": "Căutare notițe",
"search_notes_description": "Deschide căutare avansată",
"search_subtree_title": "Caută în ierarhie",
"search_subtree_description": "Caută în notițele din ierarhia curentă",
"search_history_title": "Afișează istoricul de căutare",
"search_history_description": "Afișează căutarile anterioare",
"configure_launch_bar_title": "Configurează bara de lansare",
"configure_launch_bar_description": "Deschide configurația barei de lansare, pentru a putea adăuga sau ștergere intrări."
},
"content_renderer": {
"open_externally": "Deschide în afara programului"
},
"modal": {
"close": "Închide"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
{
"about": {
"title": "Podrobnosti Trilium Notes",
"homepage": "Domača stran:",
"app_version": "Verzija aplikacije:",
"db_version": "Verzija DB:",
"sync_version": "Verzija Sync:"
}
}

View File

@@ -0,0 +1,497 @@
{
"about": {
"title": "O Trilium Belеškama",
"homepage": "Početna stranica:",
"app_version": "Verzija aplikacije:",
"db_version": "Verzija baze podataka:",
"sync_version": "Verzija sinhronizacije:",
"build_date": "Datum izgradnje:",
"build_revision": "Revizija izgradnje:",
"data_directory": "Direktorijum sa podacima:"
},
"toast": {
"critical-error": {
"title": "Kritična greška",
"message": "Došlo je do kritične greške koja sprečava pokretanje klijentske aplikacije.\n\n{{message}}\n\nOva greška je najverovatnije izazvana neočekivanim problemom prilikom izvršavanja skripte. Pokušajte da pokrenete aplikaciju u bezbednom režimu i da pronađete šta izaziva grešku."
},
"widget-error": {
"title": "Pokretanje vidžeta nije uspelo",
"message-custom": "Prilagođeni viđet sa beleške sa ID-jem \"{{id}}\", nazivom \"{{title}}\" nije uspeo da se pokrene zbog:\n\n{{message}}",
"message-unknown": "Nepoznati vidžet nije mogao da se pokrene zbog:\n\n{{message}}"
},
"bundle-error": {
"title": "Pokretanje prilagođene skripte neuspešno",
"message": "Skripta iz beleške sa ID-jem \"{{id}}\", naslovom \"{{title}}\" nije mogla da se izvrši zbog:\n\n{{message}}"
}
},
"add_link": {
"add_link": "Dodaj link",
"help_on_links": "Pomoć na linkovima",
"note": "Beleška",
"search_note": "potražite belešku po njenom imenu",
"link_title_mirrors": "naziv linka preslikava trenutan naziv beleške",
"link_title_arbitrary": "naziv linka se može proizvoljno menjati",
"link_title": "Naziv linka",
"button_add_link": "Dodaj link <kbd>enter</kbd>"
},
"branch_prefix": {
"edit_branch_prefix": "Izmeni prefiks grane",
"help_on_tree_prefix": "Pomoć na prefiksu Drveta",
"prefix": "Prefiks: ",
"save": "Sačuvaj",
"branch_prefix_saved": "Prefiks grane je sačuvan."
},
"bulk_actions": {
"bulk_actions": "Grupne akcije",
"affected_notes": "Pogođene beleške",
"include_descendants": "Obuhvati potomke izabranih beleški",
"available_actions": "Dostupne akcije",
"chosen_actions": "Izabrane akcije",
"execute_bulk_actions": "Izvrši grupne akcije",
"bulk_actions_executed": "Grupne akcije su uspešno izvršene.",
"none_yet": "Nijedna za sad... dodajte akciju tako što ćete pritisnuti na neku od dostupnih akcija iznad.",
"labels": "Oznake",
"relations": "Odnosi",
"notes": "Beleške",
"other": "Ostalo"
},
"clone_to": {
"clone_notes_to": "Klonirajte beleške u...",
"help_on_links": "Pomoć na linkovima",
"notes_to_clone": "Beleške za kloniranje",
"target_parent_note": "Ciljna nadređena beleška",
"search_for_note_by_its_name": "potražite belešku po njenom imenu",
"cloned_note_prefix_title": "Klonirana beleška će biti prikazana u drvetu beleški sa datim prefiksom",
"prefix_optional": "Prefiks (opciono)",
"clone_to_selected_note": "Kloniranje u izabranu belešku <kbd>enter</kbd>",
"no_path_to_clone_to": "Nema putanje za kloniranje.",
"note_cloned": "Beleška \"{{clonedTitle}}\" je klonirana u \"{{targetTitle}}\""
},
"confirm": {
"confirmation": "Potvrda",
"cancel": "Otkaži",
"ok": "U redu",
"are_you_sure_remove_note": "Da li ste sigurni da želite da uklonite belešku \"{{title}}\" iz mape odnosa? ",
"if_you_dont_check": "Ako ne izaberete ovo, beleška će biti uklonjena samo sa mape odnosa.",
"also_delete_note": "Takođe obriši belešku"
},
"delete_notes": {
"delete_notes_preview": "Obriši pregled beleške",
"close": "Zatvori",
"delete_all_clones_description": "Obriši i sve klonove (može biti poništeno u skorašnjim izmenama)",
"erase_notes_description": "Normalno (blago) brisanje samo označava beleške kao obrisane i one mogu biti vraćene (u dijalogu skorašnjih izmena) u određenom vremenskom periodu. Biranje ove opcije će momentalno obrisati beleške i ove beleške neće biti moguće vratiti.",
"erase_notes_warning": "Trajno obriši beleške (ne može se opozvati), uključujući sve klonove. Ovo će prisiliti aplikaciju da se ponovo pokrene.",
"notes_to_be_deleted": "Sledeće beleške će biti obrisane ({{- noteCount}})",
"no_note_to_delete": "Nijedna beleška neće biti obrisana (samo klonovi).",
"broken_relations_to_be_deleted": "Sledeći odnosi će biti prekinuti i obrisani ({{- relationCount}})",
"cancel": "Otkaži",
"ok": "U redu",
"deleted_relation_text": "Beleška {{- note}} (za brisanje) je referencirana sa odnosom {{- relation}} koji potiče iz {{- source}}."
},
"export": {
"export_note_title": "Izvezi belešku",
"close": "Zatvori",
"export_type_subtree": "Ova beleška i svi njeni potomci",
"format_html": "HTML - preporučuje se jer čuva formatiranje",
"format_html_zip": "HTML u ZIP arhivi - ovo se preporučuje jer se na taj način čuva celokupno formatiranje.",
"format_markdown": "Markdown - ovo čuva većinu formatiranja.",
"format_opml": "OPML - format za razmenu okvira samo za tekst. Formatiranje, slike i datoteke nisu uključeni.",
"opml_version_1": "OPML v1.0 - samo običan tekst",
"opml_version_2": "OPML v2.0 - dozvoljava i HTML",
"export_type_single": "Samo ovu belešku bez njenih potomaka",
"export": "Izvoz",
"choose_export_type": "Molimo vas da prvo izaberete tip izvoza",
"export_status": "Status izvoza",
"export_in_progress": "Izvoz u toku: {{progressCount}}",
"export_finished_successfully": "Izvoz je uspešno završen.",
"format_pdf": "PDF - za namene štampanja ili deljenja."
},
"help": {
"noteNavigation": "Navigacija beleški",
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - kretanje gore/dole u listi sa beleškama",
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - sakupi/proširi čvor",
"notSet": "nije podešeno",
"goBackForwards": "idi u nazad/napred kroz istoriju",
"showJumpToNoteDialog": "prikaži <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Idi na\" dijalog</a>",
"scrollToActiveNote": "skroluj do aktivne beleške",
"jumpToParentNote": "idi do nadređene beleške",
"collapseWholeTree": "sakupi celo drvo beleški",
"collapseSubTree": "sakupi pod-drvo",
"tabShortcuts": "Prečice na karticama",
"newTabNoteLink": "na link beleške otvara belešku u novoj kartici",
"newTabWithActivationNoteLink": "na link beleške otvara i aktivira belešku u novoj kartici",
"onlyInDesktop": "Samo na dektop-u (Electron verzija)",
"openEmptyTab": "otvori praznu karticu",
"closeActiveTab": "zatvori aktivnu karticu",
"activateNextTab": "aktiviraj narednu karticu",
"activatePreviousTab": "aktiviraj prethodnu karticu",
"creatingNotes": "Pravljenje beleški",
"createNoteAfter": "napravi novu belešku nakon aktivne beleške",
"createNoteInto": "napravi novu pod-belešku u aktivnoj belešci",
"editBranchPrefix": "izmeni <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/tree-concepts.html#prefix\">prefiks</a> klona aktivne beleške",
"movingCloningNotes": "Premeštanje / kloniranje beleški",
"moveNoteUpDown": "pomeri belešku gore/dole u listi beleški",
"moveNoteUpHierarchy": "pomeri belešku na gore u hijerarhiji",
"multiSelectNote": "višestruki izbor beleški iznad/ispod",
"selectAllNotes": "izaberi sve beleške u trenutnom nivou",
"selectNote": "izaberi belešku",
"copyNotes": "kopiraj aktivnu belešku (ili trenutni izbor) u privremenu memoriju (koristi se za <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">kloniranje</a>)",
"cutNotes": "iseci trenutnu belešku (ili trenutni izbor) u privremenu memoriju (koristi se za premeštanje beleški)",
"pasteNotes": "nalepi belešku/e kao podbelešku u aktivnoj belešci (koja se ili premešta ili klonira u zavisnosti od toga da li je beleška kopirana ili isečena u privremenu memoriju)",
"deleteNotes": "obriši belešku / podstablo",
"editingNotes": "Izmena beleški",
"editNoteTitle": "u ravni drveta će se prebaciti sa ravni drveta na naslov beleške. Ulaz sa naslova beleške će prebaciti fokus na uređivač teksta. <kbd>Ctrl+.</kbd> će se vratiti sa uređivača na ravan drveta.",
"createEditLink": "napravi / izmeni spoljašnji link",
"createInternalLink": "napravi unutrašnji link",
"followLink": "prati link ispod kursora",
"insertDateTime": "ubaci trenutan datum i vreme na poziciju kursora",
"jumpToTreePane": "idi na ravan stabla i pomeri se do aktivne beleške",
"markdownAutoformat": "Autoformatiranje kao u Markdown-u",
"headings": "<code>##</code>, <code>###</code>, <code>####</code> itd. praćeno razmakom za naslove",
"bulletList": "<code>*</code> ili <code>-</code> praćeno razmakom za listu sa tačkama",
"numberedList": "<code>1.</code> ili <code>1)</code> praćeno razmakom za numerisanu listu",
"blockQuote": "započnite liniju sa <code>></code> praćeno sa razmakom za blok citat",
"troubleshooting": "Rešavanje problema",
"reloadFrontend": "ponovo učitaj Trilium frontend",
"showDevTools": "prikaži alate za programere",
"showSQLConsole": "prikaži SQL konzolu",
"other": "Ostalo",
"quickSearch": "fokus na unos za brzu pretragu",
"inPageSearch": "pretraga unutar stranice"
},
"import": {
"importIntoNote": "Uvezi u belešku",
"chooseImportFile": "Izaberi datoteku za uvoz",
"importDescription": "Sadržaj izabranih datoteka će biti uvezen kao podbeleške u",
"options": "Opcije",
"safeImportTooltip": "Trilium <code>.zip</code> izvozne datoteke mogu da sadrže izvršne skripte koje mogu imati štetno ponašanje. Bezbedan uvoz će deaktivirati automatsko izvršavanje svih uvezenih skripti. Isključite \"Bezbedan uvoz\" samo ako uvezena arhiva treba da sadrži izvršne skripte i ako potpuno verujete sadržaju uvezene datoteke.",
"safeImport": "Bezbedan uvoz",
"explodeArchivesTooltip": "Ako je ovo označeno onda će Trilium pročitati <code>.zip</code>, <code>.enex</code> i <code>.opml</code> datoteke i napraviti beleške od datoteka unutar tih arhiva. Ako nije označeno, Trilium će same arhive priložiti belešci.",
"explodeArchives": "Pročitaj sadržaj <code>.zip</code>, <code>.enex</code> i <code>.opml</code> arhiva.",
"shrinkImagesTooltip": "<p>Ako označite ovu opciju, Trilium će pokušati da smanji uvezene slike skaliranjem i optimizacijom što će možda uticati na kvalitet slike. Ako nije označeno, slike će biti uvezene bez promena.</p><p>Ovo se ne primenjuje na <code>.zip</code> uvoze sa metapodacima jer se tada podrazumeva da su te datoteke već optimizovane.</p>",
"shrinkImages": "Smanji slike",
"textImportedAsText": "Uvezi HTML, Markdown i TXT kao tekstualne beleške ako je nejasno iz metapodataka",
"codeImportedAsCode": "Uvezi prepoznate datoteke sa kodom (poput <code>.json</code>) ako beleške sa kodom ako nije jasno iz metapodataka",
"replaceUnderscoresWithSpaces": "Zameni podvlake sa razmacima u nazivima uvezenih beleški",
"import": "Uvezi",
"failed": "Uvoz nije uspeo: {{message}}.",
"html_import_tags": {
"title": "HTML oznake za uvoz",
"description": "Podesite koje HTML oznake trebaju biti sačuvane kada se uvoze beleške. Oznake koje se ne nalaze na listi će biti uklonjene tokom uvoza. Pojedine oznake (poput 'script') se uvek uklanjaju zbog bezbednosti.",
"placeholder": "Unesite HTML oznake, po jednu u svaki red",
"reset_button": "Vrati na podrazumevanu listu"
},
"import-status": "Status uvoza",
"in-progress": "Uvoz u toku: {{progress}}",
"successful": "Uvoz je uspešno završen."
},
"include_note": {
"dialog_title": "Uključi belešku",
"label_note": "Beleška",
"placeholder_search": "pretraži belešku po njenom imenu",
"box_size_prompt": "Veličina kutije priložene beleške:",
"box_size_small": "mala (~ 10 redova)",
"box_size_medium": "srednja (~ 30 redova)",
"box_size_full": "puna (kutija prikazuje ceo tekst)",
"button_include": "Uključi belešku"
},
"info": {
"modalTitle": "Informativna poruka",
"closeButton": "Zatvori",
"okButton": "U redu"
},
"jump_to_note": {
"search_placeholder": "Pretraži belešku po njenom imenu ili unesi > za komande...",
"search_button": "Pretraga u punom tekstu <kbd>Ctrl+Enter</kbd>"
},
"markdown_import": {
"dialog_title": "Uvoz za Markdown",
"modal_body_text": "Zbog Sandbox-a pretraživača nije moguće direktno učitati privremenu memoriju iz JavaScript-a. Molimo vas da nalepite Markdown za uvoz u tekstualno polje ispod i kliknete na dugme za uvoz",
"import_button": "Uvoz",
"import_success": "Markdown sadržaj je učitan u dokument."
},
"move_to": {
"dialog_title": "Premesti beleške u ...",
"notes_to_move": "Beleške za premeštanje",
"target_parent_note": "Ciljana nadbeleška",
"search_placeholder": "potraži belešku po njenom imenu",
"move_button": "Pređi na izabranu belešku",
"error_no_path": "Nema putanje za premeštanje.",
"move_success_message": "Izabrane beleške su premeštene u "
},
"note_type_chooser": {
"change_path_prompt": "Promenite gde će se napraviti nova beleška:",
"search_placeholder": "pretraži putanju po njenom imenu (podrazumevano ako je prazno)",
"modal_title": "Izaberite tip beleške",
"modal_body": "Izaberite tip beleške / šablon za novu belešku:",
"templates": "Šabloni"
},
"password_not_set": {
"title": "Lozinka nije podešena",
"body1": "Zaštićene beleške su enkriptovane sa korisničkom lozinkom, ali lozinka još uvek nije podešena.",
"body2": "Za biste mogli da sačuvate beleške, kliknite <a class=\"open-password-options-button\" href=\"javascript:\">ovde</a> da otvorite dijalog sa Opcijama i podesite svoju lozinku."
},
"prompt": {
"title": "Upit",
"ok": "U redu <kbd>enter</kbd>",
"defaultTitle": "Upit"
},
"protected_session_password": {
"modal_title": "Zaštićena sesija",
"help_title": "Pomoć za Zaštićene beleške",
"close_label": "Zatvori",
"form_label": "Da biste nastavili sa traženom akcijom moraćete započeti zaštićenu sesiju tako što ćete uneti lozinku:",
"start_button": "Započni zaštićenu sesiju"
},
"recent_changes": {
"title": "Nedavne promene",
"erase_notes_button": "Obriši izabrane beleške odmah",
"deleted_notes_message": "Obrisane beleške su uklonjene.",
"no_changes_message": "Još uvek nema izmena...",
"undelete_link": "poništi brisanje",
"confirm_undelete": "Da li želite da poništite brisanje ove beleške i njenih podbeleški?"
},
"revisions": {
"note_revisions": "Revizije beleški",
"delete_all_revisions": "Obriši sve revizije ove beleške",
"delete_all_button": "Obriši sve revizije",
"help_title": "Pomoć za Revizije beleški",
"revision_last_edited": "Ova revizija je poslednji put izmenjena {{date}}",
"confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?",
"no_revisions": "Još uvek nema revizija za ovu belešku...",
"restore_button": "Vrati",
"confirm_restore": "Da li želite da vratite ovu reviziju? Ovo će prepisati trenutan naslov i sadržaj beleške sa ovom revizijom.",
"delete_button": "Obriši",
"confirm_delete": "Da li želite da obrišete ovu reviziju?",
"revisions_deleted": "Revizije beleške su obrisane.",
"revision_restored": "Revizija beleške je vraćena.",
"revision_deleted": "Revizija beleške je obrisana.",
"snapshot_interval": "Interval snimanja revizije beleške: {{seconds}}s.",
"maximum_revisions": "Ograničenje broja slika revizije beleške: {{number}}.",
"settings": "Podešavanja revizija beleški",
"download_button": "Preuzmi",
"mime": "MIME: ",
"file_size": "Veličina datoteke:",
"preview": "Pregled:",
"preview_not_available": "Pregled nije dostupan za ovaj tip beleške."
},
"sort_child_notes": {
"sort_children_by": "Sortiranje podbeleški po...",
"sorting_criteria": "Kriterijum za sortiranje",
"title": "naslov",
"date_created": "datum kreiranja",
"date_modified": "datum izmene",
"sorting_direction": "Smer sortiranja",
"ascending": "uzlazni",
"descending": "silazni",
"folders": "Fascikle",
"sort_folders_at_top": "sortiraj fascikle na vrh",
"natural_sort": "Prirodno sortiranje",
"sort_with_respect_to_different_character_sorting": "sortiranje sa poštovanjem različitih pravila sortiranja karaktera i kolacija u različitim jezicima ili regionima.",
"natural_sort_language": "Jezik za prirodno sortiranje",
"the_language_code_for_natural_sort": "Kod jezika za prirodno sortiranje, npr. \"zh-CN\" za Kineski.",
"sort": "Sortiraj"
},
"upload_attachments": {
"upload_attachments_to_note": "Otpremite priloge uz belešku",
"choose_files": "Izaberite datoteke",
"files_will_be_uploaded": "Datoteke će biti otpremljene kao prilozi u {{noteTitle}}",
"options": "Opcije",
"shrink_images": "Smanji slike",
"upload": "Otpremi",
"tooltip": "Ako je označeno, Trilium će pokušati da smanji otpremljene slike skaliranjem i optimizacijom što može uticati na kvalitet slike. Ako nije označeno, slike će biti otpremljene bez izmena."
},
"attribute_detail": {
"attr_detail_title": "Naslov detalja atributa",
"close_button_title": "Otkaži izmene i zatvori",
"attr_is_owned_by": "Atribut je u vlasništvu",
"attr_name_title": "Naziv atributa može biti sastavljen samo od alfanumeričkih znakova, dvotačke i donje crte",
"name": "Naziv",
"value": "Vrednost",
"target_note_title": "Relacija je imenovana veza između izvorne beleške i ciljne beleške.",
"target_note": "Ciljna beleška",
"promoted_title": "Promovisani atribut je istaknut na belešci.",
"promoted": "Promovisan",
"promoted_alias_title": "Naziv koji će biti prikazan u korisničkom interfejsu promovisanih atributa.",
"promoted_alias": "Pseudonim",
"multiplicity_title": "Multiplicitet definiše koliko atributa sa istim nazivom se može napraviti - najviše 1 ili više od 1.",
"multiplicity": "Multiplicitet",
"single_value": "Jednostruka vrednost",
"multi_value": "Višestruka vrednost",
"label_type_title": "Tip oznake će pomoći Triliumu da izabere odgovarajući interfejs za unos vrednosti oznake.",
"label_type": "Tip",
"text": "Tekst",
"number": "Broj",
"boolean": "Boolean",
"date": "Datum",
"date_time": "Datum i vreme",
"time": "Vreme",
"url": "URL",
"precision_title": "Broj cifara posle zareza treba biti dostupan u interfejsu za postavljanje vrednosti.",
"precision": "Preciznost",
"digits": "cifre",
"inverse_relation_title": "Opciono podešavanje za definisanje kojoj relaciji je ova suprotna. Primer: Otac - Sin su inverzne relacije jedna drugoj.",
"inverse_relation": "Inverzna relacija",
"inheritable_title": "Atributi koji mogu da se nasleđuju će biti nasleđeni od strane svih potomaka unutar ovog stabla.",
"inheritable": "Nasledno",
"save_and_close": "Sačuvaj i zatvori <kbd>Ctrl+Enter</kbd>",
"delete": "Obriši",
"related_notes_title": "Druge beleške sa ovom oznakom",
"more_notes": "Još beleški",
"label": "Detalji oznake",
"label_definition": "Detalji definicije oznake",
"relation": "Detalji relacije",
"relation_definition": "Detalji definicije relacije",
"disable_versioning": "onemogućava auto-verzionisanje. Korisno za npr. velike, ali nebitne beleške - poput velikih JS biblioteka koje se koriste za skripte",
"calendar_root": "obeležava belešku koju treba koristiti kao osnova za dnevne beleške. Samo jedna beleška treba da bude označena kao takva.",
"archived": "beleške sa ovom oznakom neće biti podrazumevano vidljive u rezultatima pretrage (kao ni u dijalozima za Idi na, Dodaj link, itd.).",
"exclude_from_export": "beleške (sa svojim podstablom) neće biti uključene u bilo koji izvoz beleški",
"run": "definiše u kojim događajima se skripta pokreće. Moguće vrednosti su:\n<ul>\n<li>frontendStartup - kada se pokrene Trilium frontend (ili se osveži), ali ne na mobilnom uređaju.</li>\n<li>mobileStartup - kada se pokrene Trilium frontend (ili se osveži), na mobilnom uređaju..</li>\n<li>backendStartup - kada se Trilium backend pokrene</li>\n<li>hourly - pokreće se svaki sat. Može se koristiti dodatna oznaka <code>runAtHour</code> da se označi u kom satu.</li>\n<li>daily - pokreće se jednom dnevno</li>\n</ul>",
"run_on_instance": "Definiše u kojoj instanci Trilium-a ovo treba da se pokreće. Podrazumevano podešavanje je na svim instancama.",
"run_at_hour": "U kom satu ovo treba da se pokreće. Treba se koristiti zajedno sa <code>#run=hourly</code>. Može biti definisano više puta za više pokretanja u toku dana.",
"disable_inclusion": "skripte sa ovom oznakom neće biti uključene u izvršavanju nadskripte.",
"sorted": "čuva podbeleške sortirane alfabetski po naslovu",
"sort_direction": "Uzlazno (podrazumevano) ili silazno",
"sort_folders_first": "Fascikle (beleške sa podbeleškama) treba da budu sortirane na vrhu",
"top": "zadrži datu belešku na vrhu njene nadbeleške (primenjuje se samo na sortiranim nadbeleškama)",
"hide_promoted_attributes": "Sakrij promovisane atribute na ovoj belešci",
"read_only": "uređivač je u režimu samo za čitanje. Radi samo za tekst i beleške sa kodom.",
"auto_read_only_disabled": "beleške sa tekstom/kodom se mogu automatski podesiti u režim za čitanje kada su prevelike. Ovo ponašanje možete onemogućiti pojedinačno za belešku dodavanjem ove oznake na belešku",
"app_css": "označava CSS beleške koje nisu učitane u Trilium aplikaciju i zbog toga se mogu koristiti za menjanje izgleda Triliuma.",
"app_theme": "označava CSS beleške koje su pune Trilium teme i stoga su dostupne u Trilium podešavanjima.",
"app_theme_base": "podesite na „sledeće“, „sledeće-svetlo“ ili „sledeće-tamno“ da biste koristili odgovarajuću TriliumNext temu (automatsku, svetlu ili tamnu) kao osnovu za prilagođenu temu, umesto podrazumevane teme.",
"css_class": "vrednost ove oznake se zatim dodaje kao CSS klasa čvoru koji predstavlja datu belešku u stablu. Ovo može biti korisno za napredno temiranje. Može se koristiti u šablonima beleški.",
"workspace": "označava ovu belešku kao radni prostor što omogućava lako podizanje",
"workspace_icon_class": "definiše CSS klasu ikone okvira koja će se koristiti u kartici kada se podigne na ovoj belešci",
"workspace_tab_background_color": "CSS boja korišćena u kartici beleške kada se prebaci na ovu belešku",
"workspace_calendar_root": "Definiše koren kalendara za svaki radni prostor",
"workspace_template": "Ova beleška će se pojaviti u izboru dostupnih šablona prilikom kreiranja nove beleške, ali samo kada se podigne u radni prostor koji sadrži ovaj šablon",
"search_home": "nove beleške o pretrazi biće kreirane kao podređeni delovi ove beleške",
"workspace_search_home": "nove beleške o pretrazi biće kreirane kao podređeni delovi ove beleške kada se podignu na nekog pretka ove beleške iz radnog prostora",
"inbox": "podrazumevana lokacija u prijemnom sandučetu za nove beleške - kada kreirate belešku pomoću dugmeta „nova beleška“ u bočnoj traci, beleške će biti kreirane kao podbeleške u belešci označenoj sa oznakom <code>#inbox</code>.",
"workspace_inbox": "podrazumevana lokacija prijemnog sandučeta za nove beleške kada se prebace na nekog pretka ove beleške iz radnog prostora",
"sql_console_home": "podrazmevana lokacija beleški SQL konzole",
"bookmark_folder": "beleška sa ovom oznakom će se pojaviti u obeleživačima kao fascikla (omogućavajući pristup njenim podređenim fasciklama)",
"share_hidden_from_tree": "ova beleška je skrivena u levom navigacionom stablu, ali je i dalje dostupna preko svoje URL adrese",
"share_external_link": "beleška će služiti kao veza ka eksternoj veb stranici u stablu deljenja",
"share_alias": "definišite alias pomoću kog će beleška biti dostupna na https://your_trilium_host/share/[your_alias]",
"share_omit_default_css": "CSS kod podrazumevane stranice za deljenje će biti izostavljen. Koristite ga kada pravite opsežne promene stila.",
"share_root": "obeležava belešku koja se prikazuje na /share korenu.",
"share_description": "definišite tekst koji će se dodati HTML meta oznaci za opis",
"share_raw": "beleška će biti prikazana u svom sirovom (raw) formatu, bez HTML omotača",
"share_disallow_robot_indexing": "zabraniće robotsko indeksiranje ove beleške putem zaglavlja <code>X-Robots-Tag: noindex</code>",
"share_credentials": "potrebni su kredencijali za pristup ovoj deljenoj belešci. Očekuje se da vrednost bude u formatu „korisničko ime:lozinka“. Ne zaboravite da ovo označite kao nasledno da bi se primenilo na podbeleške/slike.",
"share_index": "beleška sa ovom oznakom će izlistati sve korene deljenih beleški",
"display_relations": "imena relacija razdvojenih zarezima koja treba da budu prikazana. Sva ostala će biti skrivena.",
"hide_relations": "imena relacija razdvojenih zarezima koja treba da budu skrivena. Sva ostala će biti prikazana.",
"title_template": "podrazumevani naslov beleški kreiranih kao deca ove beleške. Vrednost se procenjuje kao JavaScript string \n i stoga se može obogatiti dinamičkim sadržajem putem ubrizganih promenljivih <code>now</code> and <code>parentNote</code>. Primeri:\n \n <ul>\n <li><code>${parentNote.getLabelValue('authorName')}'s literary works</code></li>\n <li><code>Log for ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Pogledati <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki sa detaljima</a>, API dokumentacija za <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> i <a href=\"https://day.js.org/docs/en/display/format\">now</a> za detalje.",
"template": "Ova beleška će biti prikazana u izboru dostupnih šablona prilikom pravljenja nove beleške",
"toc": "<code>#toc</code> ili <code>#toc=show</code> će pristiliti Sadržaj (Table of Contents) da bude prikazan, <code>#toc=hide</code> prisiliti njegovo sakrivanje. Ako oznaka ne postoji, ponašanje će biti usklađeno sa globalnim podešavanjem",
"color": "definiše boju beleške u stablu beleški, linkovima itd. Koristite bilo koju važeću CSS vrednost boje kao što je „crvena“ ili #a13d5f",
"keyboard_shortcut": "Definiše prečicu na tastaturi koja će odmah preći na ovu belešku. Primer: „ctrl+alt+e“. Potrebno je ponovno učitavanje frontenda da bi promena stupila na snagu.",
"keep_current_hoisting": "Otvaranje ove veze neće promeniti podizanje čak i ako beleška nije prikazana u trenutno podignutom podstablu.",
"execute_button": "Naslov dugmeta koje će izvršiti trenutnu belešku sa kodom",
"execute_description": "Duži opis trenutne beleške sa kodom prikazan je zajedno sa dugmetom za izvršavanje",
"exclude_from_note_map": "Beleške sa ovom oznakom biće skrivene sa mape beleški",
"new_notes_on_top": "Nove beleške će biti napravljene na vrhu matične beleške, a ne na dnu.",
"hide_highlight_widget": "Sakrij vidžet sa listom istaknutih",
"run_on_note_creation": "izvršava se kada se beleška napravi na serverskoj strani. Koristite ovu relaciju ako želite da pokrenete skriptu za sve beleške napravljene u okviru određenog podstabla. U tom slučaju, kreirajte je na korenu beleške podstabla i učinite je naslednom. Nova beleška napravljena unutar podstabla (bilo koje dubine) pokrenuće skriptu.",
"run_on_child_note_creation": "izvršava se kada se napravi nova beleška ispod beleške gde je ova relacija definisana",
"run_on_note_title_change": "izvršava se kada se promeni naslov beleške (uključuje i pravljenje beleške)",
"run_on_note_content_change": "izvršava se kada se promeni sadržaj beleške (uključuje i pravljenje beleške).",
"run_on_note_change": "izvršava se kada se promeni beleška (uključuje i pravljenje beleške). Ne uključuje promene sadržaja",
"icon_class": "vrednost ove oznake se dodaje kao CSS klasa ikoni na stablu što može pomoći u vizuelnom razlikovanju beleški u stablu. Primer može biti bx bx-home - ikone su preuzete iz boxicons. Može se koristiti u šablonima beleški.",
"page_size": "broj stavki po stranici u listi beleški",
"custom_request_handler": "pogledajte <a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">Prilagođeni obrađivač zahteva</a>",
"custom_resource_provider": "pogledajte <a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">Prilagođeni obrađivač zahteva</a>",
"widget": "označava ovu belešku kao prilagođeni vidžet koji će biti dodat u stablo komponenti Trilijuma",
"run_on_note_deletion": "izvršava se kada se beleška briše",
"run_on_branch_creation": "izvršava se kada se pravi grana. Grana je veza između matične i podređene beleške i pravi se npr. prilikom kloniranja ili premeštanja beleške.",
"run_on_branch_change": "izvršava se kada se grana ažurira.",
"run_on_branch_deletion": "izvršava se kada se grana briše. Grana je veza između nadređene beleške i podređene beleške i briše se npr. prilikom premeštanja beleške (stara grana/veza se briše).",
"run_on_attribute_creation": "izvršava se kada se pravi novi atribut za belešku koji definiše ovu relaciju",
"run_on_attribute_change": " izvršava se kada se promeni atribut beleške koja definiše ovu relaciju. Ovo se pokreće i kada se atribut obriše",
"relation_template": "atributi beleške će biti nasleđeni čak i bez odnosa roditelj-dete, sadržaj i podstablo beleške će biti dodati instanci beleške ako je prazna. Pogledajte dokumentaciju za detalje.",
"inherit": "Atributi beleške će biti nasleđeni čak i bez odnosa roditelj-dete. Pogledajte relaciju šablona za sličan koncept. Pogledajte nasleđivanje atributa u dokumentaciji.",
"render_note": "Beleške tipa „render HTML note“ će biti prikazane korišćenjem beleške za kod (HTML ili skripte) i potrebno je pomoću ove relacije ukazati na to koja beleška treba da se prikaže",
"widget_relation": "meta ove relacije će biti izvršena i prikazana kao vidžet u bočnoj traci",
"share_css": "CSS napomena koja će biti ubrizgana na stranicu za deljenje. CSS napomena mora biti i u deljenom podstablu. Razmotrite i korišćenje „share_hidden_from_tree“ i „share_omit_default_css“.",
"share_js": "JavaScript beleška koja će biti ubrizgana na stranicu za deljenje. JS beleška takođe mora biti u deljenom podstablu. Razmislite o korišćenju „share_hidden_from_tree“.",
"share_template": "Ugrađena JavaScript beleška koja će se koristiti kao šablon za prikazivanje deljene beleške. U slučaju neuspeha vraća se na podrazumevani šablon. Razmislite o korišćenju „share_hidden_from_tree“.",
"share_favicon": "Favicon beleška koju treba postaviti na deljenu stranicu. Obično je potrebno da je podesite da deli koren i učinite je naslednom. Favicon beleška takođe mora biti u deljenom podstablu. Razmislite o korišćenju „share_hidden_from_tree“.",
"is_owned_by_note": "je u vlasništvu beleške",
"other_notes_with_name": "Ostale beleške sa {{attributeType}} nazivom „{{attributeName}}“",
"and_more": "... i još {{count}}.",
"print_landscape": "Prilikom izvoza u PDF, menja orijentaciju stranice u pejzažnu umesto uspravne.",
"print_page_size": "Prilikom izvoza u PDF, menja veličinu stranice. Podržane vrednosti: <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": "Boja"
},
"ai_llm": {
"n_notes_queued_0": "{{ count }} beleška stavljena u red za indeksiranje",
"n_notes_queued_1": "{{ count }} beleški stavljeno u red za indeksiranje",
"n_notes_queued_2": "{{ count }} beleški stavljeno u red za indeksiranje",
"notes_indexed_0": "{{ count }} beleška je indeksirana",
"notes_indexed_1": "{{ count }} beleški je indeksirano",
"notes_indexed_2": "{{ count }} beleški je indeksirano"
},
"attribute_editor": {
"help_text_body1": "Da biste dodali oznaku, samo unesite npr. <code>#rock</code> ili ako želite da dodate i vrednost, onda npr. <code>#year = 2020</code>",
"help_text_body2": "Za relaciju, unesite <code>~author = @</code> što bi trebalo da otvori automatsko dovršavanje gde možete potražiti željenu belešku.",
"help_text_body3": "Alternativno, možete dodati oznaku i relaciju pomoću dugmeta <code>+</code> sa desne strane.",
"save_attributes": "Sačuvaj atribute <enter>",
"add_a_new_attribute": "Dodajte novi atribut",
"add_new_label": "Dodajte novu oznaku <kbd data-command=\"addNewLabel\"></kbd>",
"add_new_relation": "Dodajte novu relaciju <kbd data-command=\"addNewRelation\"></kbd>",
"add_new_label_definition": "Dodajte novu definiciju oznake",
"add_new_relation_definition": "Dodajte novu definiciju relacije",
"placeholder": "Ovde unesite oznake i relacije"
},
"abstract_bulk_action": {
"remove_this_search_action": "Ukloni ovu radnju pretrage"
},
"execute_script": {
"execute_script": "Izvrši skriptu",
"help_text": "Možete izvršiti jednostavne skripte na podudarnim beleškama.",
"example_1": "Na primer, da biste dodali string u naslov beleške, koristite ovu malu skriptu:",
"example_2": "Složeniji primer bi bio brisanje svih atributa podudarnih beleški:"
},
"add_label": {
"add_label": "Dodaj oznaku",
"label_name_placeholder": "ime oznake",
"label_name_title": "Alfanumerički znakovi, donja crta i dvotačka su dozvoljeni znakovi.",
"to_value": "za vrednost",
"new_value_placeholder": "nova vrednost",
"help_text": "Na svim podudarnim beleškama:",
"help_text_item1": "dodajte datu oznaku ako beleška još uvek nema jednu",
"help_text_item2": "ili izmenite vrednost postojeće oznake",
"help_text_note": "Takođe možete pozvati ovu metodu bez vrednosti, u tom slučaju će oznaka biti dodeljena belešci bez vrednosti."
},
"delete_label": {
"delete_label": "Obriši oznaku",
"label_name_placeholder": "ime oznake",
"label_name_title": "Alfanumerički znakovi, donja crtica i dvotačka su dozvoljeni znakovi."
},
"rename_label": {
"rename_label": "Preimenuj oznaku",
"rename_label_from": "Preimenuj oznaku iz",
"old_name_placeholder": "stari naziv",
"to": "U",
"new_name_placeholder": "novi naziv",
"name_title": "Alfanumerički znakovi, donja crtica i dvotačka su dozvoljeni znakovi."
},
"update_label_value": {
"update_label_value": "Ažuriraj vrednost oznake",
"label_name_placeholder": "ime oznake",
"label_name_title": "Alfanumerički znakovi, donja crtica i dvotačka su dozvoljeni znakovi.",
"to_value": "u vrednost",
"new_value_placeholder": "nova vrednost",
"help_text": "Na svim podudarnim beleškama, promenite vrednost postojeće oznake.",
"help_text_note": "Takođe možete pozvati ovu metodu bez vrednosti, u tom slučaju će oznaka biti dodeljena belešci bez vrednosti."
},
"delete_note": {
"delete_note": "Obriši belešku",
"delete_matched_notes": "Obriši podudarne beleške",
"delete_matched_notes_description": "Ovo će obrisati podudarne beleške.",
"undelete_notes_instruction": "Nakon brisanja, moguće ga je poništiti iz dijaloga Nedavne izmene."
}
}

View File

@@ -0,0 +1,26 @@
{
"about": {
"homepage": "Giriş sayfası:",
"app_version": "Uygulama versiyonu:",
"db_version": "Veritabanı versiyonu:"
},
"branch_prefix": {
"save": "Kaydet"
},
"delete_notes": {
"close": "Kapat"
},
"export": {
"close": "Kapat"
},
"import": {
"chooseImportFile": "İçe aktarım dosyası",
"importDescription": "Seçilen dosya(lar) alt not olarak içe aktarılacaktır"
},
"info": {
"closeButton": "Kapat"
},
"protected_session_password": {
"close_label": "Kapat"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,69 @@
{
"about": {
"homepage": "Trang chủ:",
"title": "Về Trilium Notes"
},
"add_link": {
"add_link": "Thêm liên kết",
"button_add_link": "Thêm liên kết"
},
"bulk_actions": {
"other": "Khác"
},
"branch_prefix": {
"save": "Lưu"
},
"confirm": {
"ok": "OK",
"cancel": "Huỷ"
},
"delete_notes": {
"close": "Đóng",
"ok": "OK",
"cancel": "Huỷ"
},
"export": {
"close": "Đóng"
},
"help": {
"other": "Khác"
},
"toast": {
"critical-error": {
"title": "Lỗi nghiêm trọng"
}
},
"import": {
"options": "Tuỳ chọn"
},
"info": {
"okButton": "OK",
"closeButton": "Đóng"
},
"move_to": {
"dialog_title": "Chuyển ghi chép tới..."
},
"prompt": {
"ok": "OK"
},
"protected_session_password": {
"close_label": "Đóng"
},
"revisions": {
"restore_button": "Khôi phục",
"delete_button": "Xoá"
},
"upload_attachments": {
"options": "Tuỳ chọn"
},
"attribute_detail": {
"name": "Tên",
"value": "Giá trị",
"text": "Văn bản",
"number": "Số",
"delete": "Xoá"
},
"rename_note": {
"rename_note": "Đổi tên ghi chép"
}
}

View File

@@ -97,16 +97,6 @@ declare global {
setNote(noteId: string);
}
interface JQueryStatic {
hotkeys: {
options: {
filterInputAcceptingElements: boolean;
filterContentEditable: boolean;
filterTextInputs: boolean;
}
}
}
var logError: (message: string, e?: Error | string) => void;
var logInfo: (message: string) => void;
var glob: CustomGlobals;

View File

@@ -0,0 +1,54 @@
import { ComponentChildren } from "preact";
import { memo } from "preact/compat";
import AbstractBulkAction from "./abstract_bulk_action";
interface BulkActionProps {
label: string | ComponentChildren;
children?: ComponentChildren;
helpText?: ComponentChildren;
bulkAction: AbstractBulkAction;
}
// Define styles as constants to prevent recreation
const flexContainerStyle = { display: "flex", alignItems: "center" } as const;
const labelStyle = { marginRight: "10px" } as const;
const textStyle = { marginRight: "10px", marginLeft: "10px" } as const;
const BulkAction = memo(({ label, children, helpText, bulkAction }: BulkActionProps) => {
return (
<tr>
<td colSpan={2}>
<div style={flexContainerStyle}>
<div style={labelStyle} className="text-nowrap">{label}</div>
{children}
</div>
</td>
<td className="button-column">
{helpText && <div className="dropdown help-dropdown">
<span className="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div className="dropdown-menu dropdown-menu-right p-4">
{helpText}
</div>
</div>}
<span
className="bx bx-x icon-action action-conf-del"
onClick={() => bulkAction?.deleteAction()}
/>
</td>
</tr>
);
});
export default BulkAction;
export const BulkActionText = memo(({ text }: { text: string }) => {
return (
<div
style={textStyle}
className="text-nowrap">
{text}
</div>
);
});

View File

@@ -1,10 +1,9 @@
import { t } from "../../services/i18n.js";
import server from "../../services/server.js";
import ws from "../../services/ws.js";
import utils from "../../services/utils.js";
import type FAttribute from "../../entities/fattribute.js";
import { VNode } from "preact";
interface ActionDefinition {
export interface ActionDefinition {
script: string;
relationName: string;
targetNoteId: string;
@@ -27,26 +26,9 @@ export default abstract class AbstractBulkAction {
this.actionDef = actionDef;
}
render() {
try {
const $rendered = this.doRender();
$rendered
.find(".action-conf-del")
.on("click", () => this.deleteAction())
.attr("title", t("abstract_bulk_action.remove_this_search_action"));
utils.initHelpDropdown($rendered);
return $rendered;
} catch (e: any) {
logError(`Failed rendering search action: ${JSON.stringify(this.attribute.dto)} with error: ${e.message} ${e.stack}`);
return null;
}
}
// to be overridden
abstract doRender(): JQuery<HTMLElement>;
abstract doRender(): VNode;
static get actionName() {
return "";
}
@@ -66,9 +48,6 @@ export default abstract class AbstractBulkAction {
async deleteAction() {
await server.remove(`notes/${this.attribute.noteId}/attributes/${this.attribute.attributeId}`);
await ws.waitForMaxKnownEntityChangeId();
//await this.triggerCommand('refreshSearchDefinition');
}
}

View File

@@ -1,58 +0,0 @@
import { t } from "../../services/i18n.js";
import SpacedUpdate from "../../services/spaced_update.js";
import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = /*html*/`
<tr>
<td>
${t("execute_script.execute_script")}
</td>
<td>
<input type="text"
class="form-control script"
placeholder="note.title = note.title + '- suffix';"/>
</td>
<td class="button-column">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
${t("execute_script.help_text")}
${t("execute_script.example_1")}
<pre>note.title = note.title + ' - suffix';</pre>
${t("execute_script.example_2")}
<pre>for (const attr of note.getOwnedAttributes) { attr.markAsDeleted(); }</pre>
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</div>
</td>
</tr>`;
export default class ExecuteScriptBulkAction extends AbstractBulkAction {
static get actionName() {
return "executeScript";
}
static get actionTitle() {
return t("execute_script.execute_script");
}
doRender() {
const $action = $(TPL);
const $script = $action.find(".script");
$script.val(this.actionDef.script || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({ script: $script.val() });
}, 1000);
$script.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,50 @@
import { useEffect, useState } from "preact/hooks";
import { t } from "../../services/i18n.js";
import FormTextBox from "../react/FormTextBox.jsx";
import AbstractBulkAction, { ActionDefinition } from "./abstract_bulk_action.js";
import BulkAction from "./BulkAction.jsx";
import { useSpacedUpdate } from "../react/hooks.jsx";
function ExecuteScriptBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ script, setScript ] = useState(actionDef.script);
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ script }));
useEffect(() => spacedUpdate.scheduleUpdate(), [ script ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("execute_script.execute_script")}
helpText={<>
{t("execute_script.help_text")}
{t("execute_script.example_1")}
<pre>note.title = note.title + ' - suffix';</pre>
{t("execute_script.example_2")}
<pre>{"for (const attr of note.getOwnedAttributes) { attr.markAsDeleted(); }"}</pre>
</>}
>
<FormTextBox
placeholder="note.title = note.title + '- suffix';"
currentValue={script} onChange={setScript}
/>
</BulkAction>
);
}
export default class ExecuteScriptBulkAction extends AbstractBulkAction {
static get actionName() {
return "executeScript";
}
static get actionTitle() {
return t("execute_script.execute_script");
}
doRender() {
return <ExecuteScriptBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,70 +0,0 @@
import { t } from "../../../services/i18n.js";
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px;" class="text-nowrap">${t("add_label.add_label")}</div>
<input type="text"
class="form-control label-name"
placeholder="${t("add_label.label_name_placeholder")}"
pattern="[\\p{L}\\p{N}_:]+"
title="${t("add_label.label_name_title")}"/>
<div style="margin-right: 10px; margin-left: 10px;" class="text-nowrap">${t("add_label.to_value")}</div>
<input type="text" class="form-control label-value" placeholder="${t("add_label.new_value_placeholder")}"/>
</div>
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
<p>${t("add_label.help_text")}</p>
<ul>
<li>${t("add_label.help_text_item1")}</li>
<li>${t("add_label.help_text_item2")}</li>
</ul>
${t("add_label.help_text_note")}
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class AddLabelBulkAction extends AbstractBulkAction {
static get actionName() {
return "addLabel";
}
static get actionTitle() {
return t("add_label.add_label");
}
doRender() {
const $action = $(TPL);
const $labelName = $action.find(".label-name");
$labelName.val(this.actionDef.labelName || "");
const $labelValue = $action.find(".label-value");
$labelValue.val(this.actionDef.labelValue || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
labelName: $labelName.val(),
labelValue: $labelValue.val()
});
}, 1000);
$labelName.on("input", () => spacedUpdate.scheduleUpdate());
$labelValue.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,57 @@
import { useEffect, useState } from "preact/hooks";
import { t } from "../../../services/i18n";
import FormTextBox from "../../react/FormTextBox";
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action";
import BulkAction, { BulkActionText } from "../BulkAction";
import { useSpacedUpdate } from "../../react/hooks";
function AddLabelBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ labelName, setLabelName ] = useState<string>(actionDef.labelName ?? "");
const [ labelValue, setLabelValue ] = useState<string>(actionDef.labelValue ?? "");
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ labelName, labelValue }));
useEffect(() => spacedUpdate.scheduleUpdate(), [labelName, labelValue]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("add_label.add_label")}
helpText={<>
<p>{t("add_label.help_text")}</p>
<ul>
<li>{t("add_label.help_text_item1")}</li>
<li>{t("add_label.help_text_item2")}</li>
</ul>
{t("add_label.help_text_note")}
</>}
>
<FormTextBox
placeholder={t("add_label.label_name_placeholder")}
pattern="[\\p{L}\\p{N}_:]+"
title={t("add_label.label_name_title")}
currentValue={labelName} onChange={setLabelName}
/>
<BulkActionText text={t("add_label.to_value")} />
<FormTextBox
placeholder={t("add_label.new_value_placeholder")}
currentValue={labelValue} onChange={setLabelValue}
/>
</BulkAction>
)
}
export default class AddLabelBulkAction extends AbstractBulkAction {
doRender() {
return <AddLabelBulkActionComponent bulkAction={this} actionDef={this.actionDef} />;
}
static get actionName() {
return "addLabel";
}
static get actionTitle() {
return t("add_label.add_label");
}
}

View File

@@ -1,43 +0,0 @@
import { t } from "../../../services/i18n.js";
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
const TPL = /*html*/`
<tr>
<td>
${t("delete_label.delete_label")}
</td>
<td>
<input type="text"
class="form-control label-name"
pattern="[\\p{L}\\p{N}_:]+"
title="${t("delete_label.label_name_title")}"
placeholder="${t("delete_label.label_name_placeholder")}"/>
</td>
<td class="button-column">
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class DeleteLabelBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteLabel";
}
static get actionTitle() {
return t("delete_label.delete_label");
}
doRender() {
const $action = $(TPL);
const $labelName = $action.find(".label-name");
$labelName.val(this.actionDef.labelName || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({ labelName: $labelName.val() });
}, 1000);
$labelName.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,39 @@
import { useEffect, useState } from "preact/hooks";
import { t } from "../../../services/i18n.js";
import FormTextBox from "../../react/FormTextBox.jsx";
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import { useSpacedUpdate } from "../../react/hooks.jsx";
import BulkAction from "../BulkAction.jsx";
function DeleteLabelBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition}) {
const [ labelName, setLabelName ] = useState<string>(actionDef.labelName ?? "");
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ labelName }));
useEffect(() => spacedUpdate.scheduleUpdate(), [labelName]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("delete_label.delete_label")}
>
<FormTextBox
pattern="[\\p{L}\\p{N}_:]+"
title={t("delete_label.label_name_title")}
placeholder={t("delete_label.label_name_placeholder")}
currentValue={labelName} onChange={setLabelName}
/>
</BulkAction>
);
}
export default class DeleteLabelBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteLabel";
}
static get actionTitle() {
return t("delete_label.delete_label");
}
doRender() {
return <DeleteLabelBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,60 +0,0 @@
import { t } from "../../../services/i18n.js";
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px; flex-shrink: 0;">${t("rename_label.rename_label_from")}</div>
<input type="text"
class="form-control old-label-name"
placeholder="${t("rename_label.old_name_placeholder")}"
pattern="[\\p{L}\\p{N}_:]+"
title="${t("rename_label.name_title")}"/>
<div style="margin-right: 10px; margin-left: 10px;" class="text-nowrap">${t("rename_label.to")}</div>
<input type="text"
class="form-control new-label-name"
placeholder="${t("rename_label.new_name_placeholder")}"
pattern="[\\p{L}\\p{N}_:]+"
title="${t("rename_label.name_title")}"/>
</div>
</td>
<td class="button-column">
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class RenameLabelBulkAction extends AbstractBulkAction {
static get actionName() {
return "renameLabel";
}
static get actionTitle() {
return t("rename_label.rename_label");
}
doRender() {
const $action = $(TPL);
const $oldLabelName = $action.find(".old-label-name");
$oldLabelName.val(this.actionDef.oldLabelName || "");
const $newLabelName = $action.find(".new-label-name");
$newLabelName.val(this.actionDef.newLabelName || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
oldLabelName: $oldLabelName.val(),
newLabelName: $newLabelName.val()
});
}, 1000);
$oldLabelName.on("input", () => spacedUpdate.scheduleUpdate());
$newLabelName.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,49 @@
import { useEffect, useState } from "preact/hooks";
import { t } from "../../../services/i18n.js";
import FormTextBox from "../../react/FormTextBox.jsx";
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import BulkAction, { BulkActionText } from "../BulkAction.jsx";
import { useSpacedUpdate } from "../../react/hooks.jsx";
function RenameLabelBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition}) {
const [ oldLabelName, setOldLabelName ] = useState(actionDef.oldLabelName);
const [ newLabelName, setNewLabelName ] = useState(actionDef.newLabelName);
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ oldLabelName, newLabelName }));
useEffect(() => spacedUpdate.scheduleUpdate(), [ oldLabelName, newLabelName ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("rename_label.rename_label_from")}
>
<FormTextBox
placeholder={t("rename_label.old_name_placeholder")}
pattern="[\\p{L}\\p{N}_:]+"
title={t("rename_label.name_title")}
currentValue={oldLabelName} onChange={setOldLabelName}
/>
<BulkActionText text={t("rename_label.to")} />
<FormTextBox
placeholder={t("rename_label.new_name_placeholder")}
pattern="[\\p{L}\\p{N}_:]+"
title={t("rename_label.name_title")}
currentValue={newLabelName} onChange={setNewLabelName}
/>
</BulkAction>
)
}
export default class RenameLabelBulkAction extends AbstractBulkAction {
static get actionName() {
return "renameLabel";
}
static get actionTitle() {
return t("rename_label.rename_label");
}
doRender() {
return <RenameLabelBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,65 +0,0 @@
import { t } from "../../../services/i18n.js";
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px;" class="text-nowrap">${t("update_label_value.update_label_value")}</div>
<input type="text"
class="form-control label-name"
placeholder="${t("update_label_value.label_name_placeholder")}"
pattern="[\\p{L}\\p{N}_:]+"
title="${t("update_label_value.label_name_title")}"/>
<div style="margin-right: 10px; margin-left: 10px;" class="text-nowrap">${t("update_label_value.to_value")}</div>
<input type="text" class="form-control label-value" placeholder="${t("update_label_value.new_value_placeholder")}"/>
</div>
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
<p>${t("update_label_value.help_text")}</p>
${t("update_label_value.help_text_note")}
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class UpdateLabelValueBulkAction extends AbstractBulkAction {
static get actionName() {
return "updateLabelValue";
}
static get actionTitle() {
return t("update_label_value.update_label_value");
}
doRender() {
const $action = $(TPL);
const $labelName = $action.find(".label-name");
$labelName.val(this.actionDef.labelName || "");
const $labelValue = $action.find(".label-value");
$labelValue.val(this.actionDef.labelValue || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
labelName: $labelName.val(),
labelValue: $labelValue.val()
});
}, 1000);
$labelName.on("input", () => spacedUpdate.scheduleUpdate());
$labelValue.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,50 @@
import { t } from "../../../services/i18n.js";
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import FormTextBox from "../../react/FormTextBox.jsx";
import BulkAction, { BulkActionText } from "../BulkAction.jsx";
import { useSpacedUpdate } from "../../react/hooks.jsx";
import { useEffect, useState } from "preact/hooks";
function UpdateLabelValueComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition}) {
const [ labelName, setLabelName ] = useState<string>(actionDef.labelName ?? "");
const [ labelValue, setLabelValue ] = useState<string>(actionDef.labelValue ?? "");
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ labelName, labelValue }));
useEffect(() => spacedUpdate.scheduleUpdate(), [labelName, labelValue]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("update_label_value.update_label_value")}
helpText={<>
<p>{t("update_label_value.help_text")}</p>
{t("update_label_value.help_text_note")}
</>}
>
<FormTextBox
placeholder={t("update_label_value.label_name_placeholder")}
pattern="[\\p{L}\\p{N}_:]+"
title={t("update_label_value.label_name_title")}
currentValue={labelName} onChange={setLabelName}
/>
<BulkActionText text={t("update_label_value.to_value")} />
<FormTextBox
placeholder={t("update_label_value.new_value_placeholder")}
currentValue={labelValue} onChange={setLabelValue}
/>
</BulkAction>
)
}
export default class UpdateLabelValueBulkAction extends AbstractBulkAction {
static get actionName() {
return "updateLabelValue";
}
static get actionTitle() {
return t("update_label_value.update_label_value");
}
doRender() {
return <UpdateLabelValueComponent bulkAction={this} actionDef={this.actionDef} />;
}
}

View File

@@ -1,38 +0,0 @@
import { t } from "../../../services/i18n.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<span class="bx bx-trash"></span>
${t("delete_note.delete_matched_notes")}
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
<p>${t("delete_note.delete_matched_notes_description")}</p>
<p>${t("delete_note.undelete_notes_instruction")}</p>
${t("delete_note.erase_notes_instruction")}
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class DeleteNoteBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteNote";
}
static get actionTitle() {
return t("delete_note.delete_note");
}
doRender() {
return $(TPL);
}
}

View File

@@ -0,0 +1,33 @@
import { t } from "../../../services/i18n.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
import BulkAction from "../BulkAction.jsx";
import Icon from "../../react/Icon.jsx";
function DeleteNoteBulkActionComponent({ bulkAction }: { bulkAction: AbstractBulkAction }) {
return (
<BulkAction
bulkAction={bulkAction}
label={<><Icon icon="bx bx-trash" /> {t("delete_note.delete_matched_notes")}</>}
helpText={<>
<p>{t("delete_note.delete_matched_notes_description")}</p>
<p>{t("delete_note.undelete_notes_instruction")}</p>
{t("delete_note.erase_notes_instruction")}
</>}
/>
);
}
export default class DeleteNoteBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteNote";
}
static get actionTitle() {
return t("delete_note.delete_note");
}
doRender() {
return <DeleteNoteBulkActionComponent bulkAction={this} />
}
}

View File

@@ -1,32 +0,0 @@
import { t } from "../../../services/i18n.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<span class="bx bx-trash"></span>
${t("delete_revisions.delete_note_revisions")}
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
${t("delete_revisions.all_past_note_revisions")}
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class DeleteRevisionsBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteRevisions";
}
static get actionTitle() {
return t("delete_revisions.delete_note_revisions");
}
doRender() {
return $(TPL);
}
}

View File

@@ -0,0 +1,28 @@
import { t } from "../../../services/i18n.js";
import Icon from "../../react/Icon.jsx";
import AbstractBulkAction from "../abstract_bulk_action.js";
import BulkAction from "../BulkAction.jsx";
function DeleteRevisionsBulkActionComponent({ bulkAction }: { bulkAction: AbstractBulkAction }) {
return (
<BulkAction
bulkAction={bulkAction}
label={<><Icon icon="bx bx-trash" /> {t("delete_revisions.delete_note_revisions")}</>}
helpText={t("delete_revisions.all_past_note_revisions")}
/>
)
}
export default class DeleteRevisionsBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteRevisions";
}
static get actionTitle() {
return t("delete_revisions.delete_note_revisions");
}
doRender() {
return <DeleteRevisionsBulkActionComponent bulkAction={this} />
}
}

View File

@@ -1,64 +0,0 @@
import { t } from "../../../services/i18n.js";
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
import noteAutocompleteService from "../../../services/note_autocomplete.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px;" class="text-nowrap">${t("move_note.move_note")}</div>
<div style="margin-right: 10px;" class="text-nowrap">${t("move_note.to")}</div>
<div class="input-group">
<input type="text" class="form-control target-parent-note" placeholder="${t("move_note.target_parent_note")}"/>
</div>
</div>
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
<p>${t("move_note.on_all_matched_notes")}:</p>
<ul style="margin-bottom: 0;">
<li>${t("move_note.move_note_new_parent")}</li>
<li>${t("move_note.clone_note_new_parent")}</li>
<li>${t("move_note.nothing_will_happen")}</li>
</ul>
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class MoveNoteBulkAction extends AbstractBulkAction {
static get actionName() {
return "moveNote";
}
static get actionTitle() {
return t("move_note.move_note");
}
doRender() {
const $action = $(TPL);
const $targetParentNote = $action.find(".target-parent-note");
noteAutocompleteService.initNoteAutocomplete($targetParentNote);
$targetParentNote.setNote(this.actionDef.targetParentNoteId);
$targetParentNote.on("autocomplete:closed", () => spacedUpdate.scheduleUpdate());
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
targetParentNoteId: $targetParentNote.getSelectedNoteId()
});
}, 1000);
$targetParentNote.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,50 @@
import { t } from "../../../services/i18n.js";
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import BulkAction, { BulkActionText } from "../BulkAction.jsx";
import NoteAutocomplete from "../../react/NoteAutocomplete.jsx";
import { useEffect, useState } from "preact/hooks";
import { useSpacedUpdate } from "../../react/hooks.jsx";
function MoveNoteBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ targetParentNoteId, setTargetParentNoteId ] = useState<string>();
const spacedUpdate = useSpacedUpdate(() => {
return bulkAction.saveAction({ targetParentNoteId: targetParentNoteId })
});
useEffect(() => spacedUpdate.scheduleUpdate(), [ targetParentNoteId ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("move_note.move_note")}
helpText={<>
<p>{t("move_note.on_all_matched_notes")}:</p>
<ul style="margin-bottom: 0;">
<li>{t("move_note.move_note_new_parent")}</li>
<li>{t("move_note.clone_note_new_parent")}</li>
<li>{t("move_note.nothing_will_happen")}</li>
</ul>
</>}
>
<BulkActionText text={t("move_note.to")} />
<NoteAutocomplete
placeholder={t("move_note.target_parent_note")}
noteId={targetParentNoteId} noteIdChanged={setTargetParentNoteId}
/>
</BulkAction>
)
}
export default class MoveNoteBulkAction extends AbstractBulkAction {
static get actionName() {
return "moveNote";
}
static get actionTitle() {
return t("move_note.move_note");
}
doRender() {
return <MoveNoteBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,61 +0,0 @@
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
import { t } from "../../../services/i18n.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px; flex-shrink: 0;">${t("rename_note.rename_note_title_to")}</div>
<input type="text"
class="form-control new-title"
placeholder="${t("rename_note.new_note_title")}"
title="${t("rename_note.click_help_icon")}"/>
</div>
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
<p>${t("rename_note.evaluated_as_js_string")}</p>
<ul>
<li>${t("rename_note.example_note")}</li>
<li>${t("rename_note.example_new_title")}</li>
<li>${t("rename_note.example_date_prefix")}</li>
</ul>
${t("rename_note.api_docs")}
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class RenameNoteBulkAction extends AbstractBulkAction {
static get actionName() {
return "renameNote";
}
static get actionTitle() {
return t("rename_note.rename_note");
}
doRender() {
const $action = $(TPL);
const $newTitle = $action.find(".new-title");
$newTitle.val(this.actionDef.newTitle || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
newTitle: $newTitle.val()
});
}, 1000);
$newTitle.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,53 @@
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import { t } from "../../../services/i18n.js";
import BulkAction from "../BulkAction.jsx";
import FormTextBox from "../../react/FormTextBox.jsx";
import { useEffect, useState } from "preact/hooks";
import { useSpacedUpdate } from "../../react/hooks.jsx";
import RawHtml from "../../react/RawHtml.jsx";
function RenameNoteBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition}) {
const [ newTitle, setNewTitle ] = useState<string>(actionDef.newTitle ?? "");
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ newTitle }));
useEffect(() => spacedUpdate.scheduleUpdate(), [ newTitle ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("rename_note.rename_note_title_to")}
helpText={<>
<p>{t("rename_note.evaluated_as_js_string")}</p>
<ul>
<li><RawHtml html={t("rename_note.example_note")} /></li>
<li><RawHtml html={t("rename_note.example_new_title")} /></li>
<li><RawHtml html={t("rename_note.example_date_prefix")} /></li>
</ul>
<RawHtml html={t("rename_note.api_docs")} />
</>}
>
<FormTextBox
placeholder={t("rename_note.new_note_title")}
title={("rename_note.click_help_icon")}
currentValue={newTitle} onChange={setNewTitle}
/>
</BulkAction>
)
}
export default class RenameNoteBulkAction extends AbstractBulkAction {
static get actionName() {
return "renameNote";
}
static get actionTitle() {
return t("rename_note.rename_note");
}
doRender() {
return <RenameNoteBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,70 +0,0 @@
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
import noteAutocompleteService from "../../../services/note_autocomplete.js";
import { t } from "../../../services/i18n.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px;" class="text-nowrap">${t("add_relation.add_relation")}</div>
<input type="text"
class="form-control relation-name"
placeholder="${t("add_relation.relation_name")}"
pattern="[\\p{L}\\p{N}_:]+"
style="flex-shrink: 3"
title="${t("add_relation.allowed_characters")}"/>
<div style="margin-right: 10px; margin-left: 10px;" class="text-nowrap">${t("add_relation.to")}</div>
<div class="input-group" style="flex-shrink: 2">
<input type="text" class="form-control target-note" placeholder="${t("add_relation.target_note")}"/>
</div>
</div>
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
${t("add_relation.create_relation_on_all_matched_notes")}
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class AddRelationBulkAction extends AbstractBulkAction {
static get actionName() {
return "addRelation";
}
static get actionTitle() {
return t("add_relation.add_relation");
}
doRender() {
const $action = $(TPL);
const $relationName = $action.find(".relation-name");
$relationName.val(this.actionDef.relationName || "");
const $targetNote = $action.find(".target-note");
noteAutocompleteService.initNoteAutocomplete($targetNote);
$targetNote.setNote(this.actionDef.targetNoteId);
$targetNote.on("autocomplete:closed", () => spacedUpdate.scheduleUpdate());
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
relationName: $relationName.val(),
targetNoteId: $targetNote.getSelectedNoteId()
});
}, 1000);
$relationName.on("input", () => spacedUpdate.scheduleUpdate());
$targetNote.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,53 @@
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import noteAutocompleteService from "../../../services/note_autocomplete.js";
import { t } from "../../../services/i18n.js";
import BulkAction, { BulkActionText } from "../BulkAction.jsx";
import NoteAutocomplete from "../../react/NoteAutocomplete.jsx";
import FormTextBox from "../../react/FormTextBox.jsx";
import { useEffect, useState } from "preact/hooks";
import { useSpacedUpdate } from "../../react/hooks.jsx";
function AddRelationBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ relationName, setRelationName ] = useState<string>(actionDef.relationName);
const [ targetNoteId, setTargetNoteId ] = useState<string>(actionDef.targetNoteId);
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ relationName, targetNoteId }));
useEffect(() => spacedUpdate.scheduleUpdate(), [ relationName, targetNoteId ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("add_relation.add_relation")}
helpText={t("add_relation.create_relation_on_all_matched_notes")}
>
<FormTextBox
placeholder={t("add_relation.relation_name")}
pattern="[\\p{L}\\p{N}_:]+"
style={{ flexShrink: 3 }}
title={t("add_relation.allowed_characters")}
currentValue={relationName} onChange={setRelationName}
/>
<BulkActionText text={t("add_relation.to")} />
<NoteAutocomplete
placeholder={t("add_relation.target_note")}
noteId={targetNoteId} noteIdChanged={setTargetNoteId}
/>
</BulkAction>
)
}
export default class AddRelationBulkAction extends AbstractBulkAction {
static get actionName() {
return "addRelation";
}
static get actionTitle() {
return t("add_relation.add_relation");
}
doRender() {
return <AddRelationBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,45 +0,0 @@
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
import { t } from "../../../services/i18n.js";
const TPL = /*html*/`
<tr>
<td>
${t("delete_relation.delete_relation")}
</td>
<td>
<div style="display: flex; align-items: center">
<input type="text"
class="form-control relation-name"
pattern="[\\p{L}\\p{N}_:]+"
placeholder="${t("delete_relation.relation_name")}"
title="${t("delete_relation.allowed_characters")}"/>
</div>
</td>
<td class="button-column">
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class DeleteRelationBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteRelation";
}
static get actionTitle() {
return t("delete_relation.delete_relation");
}
doRender() {
const $action = $(TPL);
const $relationName = $action.find(".relation-name");
$relationName.val(this.actionDef.relationName || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({ relationName: $relationName.val() });
}, 1000);
$relationName.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,41 @@
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import { t } from "../../../services/i18n.js";
import BulkAction from "../BulkAction.jsx";
import FormTextBox from "../../react/FormTextBox.jsx";
import { useEffect, useState } from "preact/hooks";
import { useSpacedUpdate } from "../../react/hooks.jsx";
function DeleteRelationBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ relationName, setRelationName ] = useState(actionDef.relationName);
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ relationName }));
useEffect(() => spacedUpdate.scheduleUpdate(), [ relationName ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("delete_relation.delete_relation")}
>
<FormTextBox
pattern="[\\p{L}\\p{N}_:]+"
placeholder={t("delete_relation.relation_name")}
title={t("delete_relation.allowed_characters")}
currentValue={relationName} onChange={setRelationName}
/>
</BulkAction>
)
}
export default class DeleteRelationBulkAction extends AbstractBulkAction {
static get actionName() {
return "deleteRelation";
}
static get actionTitle() {
return t("delete_relation.delete_relation");
}
doRender() {
return <DeleteRelationBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,60 +0,0 @@
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
import { t } from "../../../services/i18n.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px; flex-shrink: 0;">${t("rename_relation.rename_relation_from")}</div>
<input type="text"
class="form-control old-relation-name"
placeholder="${t("rename_relation.old_name")}"
pattern="[\\p{L}\\p{N}_:]+"
title="${t("rename_relation.allowed_characters")}"/>
<div style="margin-right: 10px; margin-left: 10px;" class="text-nowrap">${t("rename_relation.to")}</div>
<input type="text"
class="form-control new-relation-name"
placeholder="${t("rename_relation.new_name")}"
pattern="[\\p{L}\\p{N}_:]+"
title="${t("rename_relation.allowed_characters")}"/>
</div>
</td>
<td class="button-column">
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class RenameRelationBulkAction extends AbstractBulkAction {
static get actionName() {
return "renameRelation";
}
static get actionTitle() {
return t("rename_relation.rename_relation");
}
doRender() {
const $action = $(TPL);
const $oldRelationName = $action.find(".old-relation-name");
$oldRelationName.val(this.actionDef.oldRelationName || "");
const $newRelationName = $action.find(".new-relation-name");
$newRelationName.val(this.actionDef.newRelationName || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
oldRelationName: $oldRelationName.val(),
newRelationName: $newRelationName.val()
});
}, 1000);
$oldRelationName.on("input", () => spacedUpdate.scheduleUpdate());
$newRelationName.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,49 @@
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import { t } from "../../../services/i18n.js";
import BulkAction, { BulkActionText } from "../BulkAction.jsx";
import FormTextBox from "../../react/FormTextBox.jsx";
import { useEffect, useState } from "preact/hooks";
import { useSpacedUpdate } from "../../react/hooks.jsx";
function RenameRelationBulkActionComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ oldRelationName, setOldRelationName ] = useState(actionDef.oldRelationName);
const [ newRelationName, setNewRelationName ] = useState(actionDef.newRelationName);
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ oldRelationName, newRelationName }));
useEffect(() => spacedUpdate.scheduleUpdate(), [ oldRelationName, newRelationName ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("rename_relation.rename_relation_from")}
>
<FormTextBox
placeholder={t("rename_relation.old_name")}
pattern="[\\p{L}\\p{N}_:]+"
title={t("rename_relation.allowed_characters")}
currentValue={oldRelationName} onChange={setOldRelationName}
/>
<BulkActionText text={t("rename_relation.to")} />
<FormTextBox
placeholder={t("rename_relation.new_name")}
pattern="[\\p{L}\\p{N}_:]+"
title={t("rename_relation.allowed_characters")}
currentValue={newRelationName} onChange={setNewRelationName}
/>
</BulkAction>
)
}
export default class RenameRelationBulkAction extends AbstractBulkAction {
static get actionName() {
return "renameRelation";
}
static get actionTitle() {
return t("rename_relation.rename_relation");
}
doRender() {
return <RenameRelationBulkActionComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,74 +0,0 @@
import SpacedUpdate from "../../../services/spaced_update.js";
import AbstractBulkAction from "../abstract_bulk_action.js";
import noteAutocompleteService from "../../../services/note_autocomplete.js";
import { t } from "../../../services/i18n.js";
const TPL = /*html*/`
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px;" class="text-nowrap">${t("update_relation_target.update_relation")}</div>
<input type="text"
class="form-control relation-name"
placeholder="${t("update_relation_target.relation_name")}"
pattern="[\\p{L}\\p{N}_:]+"
style="flex-shrink: 3"
title="${t("update_relation_target.allowed_characters")}"/>
<div style="margin-right: 10px; margin-left: 10px;" class="text-nowrap">${t("update_relation_target.to")}</div>
<div class="input-group" style="flex-shrink: 2">
<input type="text" class="form-control target-note" placeholder="${t("update_relation_target.target_note")}"/>
</div>
</div>
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
<p>${t("update_relation_target.on_all_matched_notes")}:</p>
<ul style="margin-bottom: 0;">
<li>${t("update_relation_target.change_target_note")}</li>
</ul>
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class UpdateRelationTargetBulkAction extends AbstractBulkAction {
static get actionName() {
return "updateRelationTarget";
}
static get actionTitle() {
return t("update_relation_target.update_relation_target");
}
doRender() {
const $action = $(TPL);
const $relationName = $action.find(".relation-name");
$relationName.val(this.actionDef.relationName || "");
const $targetNote = $action.find(".target-note");
noteAutocompleteService.initNoteAutocomplete($targetNote);
$targetNote.setNote(this.actionDef.targetNoteId);
$targetNote.on("autocomplete:closed", () => spacedUpdate.scheduleUpdate());
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
relationName: $relationName.val(),
targetNoteId: $targetNote.getSelectedNoteId()
});
}, 1000);
$relationName.on("input", () => spacedUpdate.scheduleUpdate());
$targetNote.on("input", () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@@ -0,0 +1,60 @@
import AbstractBulkAction, { ActionDefinition } from "../abstract_bulk_action.js";
import { t } from "../../../services/i18n.js";
import BulkAction, { BulkActionText } from "../BulkAction.jsx";
import FormTextBox from "../../react/FormTextBox.jsx";
import NoteAutocomplete from "../../react/NoteAutocomplete.jsx";
import { useEffect, useState } from "preact/hooks";
import { useSpacedUpdate } from "../../react/hooks.jsx";
function UpdateRelationTargetComponent({ bulkAction, actionDef }: { bulkAction: AbstractBulkAction, actionDef: ActionDefinition }) {
const [ relationName, setRelationName ] = useState(actionDef.relationName);
const [ targetNoteId, setTargetNoteId ] = useState(actionDef.targetNoteId);
const spacedUpdate = useSpacedUpdate(() => bulkAction.saveAction({ relationName, targetNoteId }));
useEffect(() => spacedUpdate.scheduleUpdate(), [ relationName, targetNoteId ]);
return (
<BulkAction
bulkAction={bulkAction}
label={t("update_relation_target.update_relation")}
helpText={<>
<p>{t("update_relation_target.on_all_matched_notes")}:</p>
<ul style="margin-bottom: 0;">
<li>{t("update_relation_target.change_target_note")}</li>
</ul>
</>}
>
<FormTextBox
placeholder={t("update_relation_target.relation_name")}
pattern="[\\p{L}\\p{N}_:]+"
style={{ flexShrink: 3 }}
title={t("update_relation_target.allowed_characters")}
currentValue={relationName} onChange={setRelationName}
/>
<BulkActionText text={t("update_relation_target.to")} />
<NoteAutocomplete
placeholder={t("update_relation_target.target_note")}
containerStyle={{ flexShrink: 2 }}
noteId={targetNoteId} noteIdChanged={setTargetNoteId}
/>
</BulkAction>
)
}
export default class UpdateRelationTargetBulkAction extends AbstractBulkAction {
static get actionName() {
return "updateRelationTarget";
}
static get actionTitle() {
return t("update_relation_target.update_relation_target");
}
doRender() {
return <UpdateRelationTargetComponent bulkAction={this} actionDef={this.actionDef} />
}
}

View File

@@ -1,9 +1,10 @@
import { ActionKeyboardShortcut } from "@triliumnext/commons";
import type { CommandNames } from "../../components/app_context.js";
import keyboardActionsService, { type Action } from "../../services/keyboard_actions.js";
import keyboardActionsService from "../../services/keyboard_actions.js";
import AbstractButtonWidget, { type AbstractButtonWidgetSettings } from "./abstract_button.js";
import type { ButtonNoteIdProvider } from "./button_from_note.js";
let actions: Action[];
let actions: ActionKeyboardShortcut[];
keyboardActionsService.getActions().then((as) => (actions = as));
@@ -49,7 +50,7 @@ export default class CommandButtonWidget extends AbstractButtonWidget<CommandBut
const action = actions.find((act) => act.actionName === this._command);
if (action && action.effectiveShortcuts.length > 0) {
if (action?.effectiveShortcuts && action.effectiveShortcuts.length > 0) {
return `${title} (${action.effectiveShortcuts.join(", ")})`;
} else {
return title;

View File

@@ -363,7 +363,6 @@ export default class GlobalMenuWidget extends BasicWidget {
this.$zoomState = this.$widget.find(".zoom-state");
this.$toggleZenMode = this.$widget.find('[data-trigger-command="toggleZenMode"');
this.$toggleZenMode.toggle(!utils.isMobile());
this.$widget.on("show.bs.dropdown", () => this.#onShown());
if (this.tooltip) {
this.$widget.on("hide.bs.dropdown", () => this.tooltip.enable());

View File

@@ -186,7 +186,7 @@ export default class NoteActionsWidget extends NoteContextAwareWidget {
this.$convertNoteIntoAttachmentButton.toggle(note.isEligibleForConversionToAttachment());
this.toggleDisabled(this.$findInTextButton, ["text", "code", "book", "mindMap"].includes(note.type));
this.toggleDisabled(this.$findInTextButton, ["text", "code", "book", "mindMap", "doc"].includes(note.type));
this.toggleDisabled(this.$showAttachmentsButton, !isInOptions);
this.toggleDisabled(this.$showSourceButton, ["text", "code", "relationMap", "mermaid", "canvas", "mindMap"].includes(note.type));

View File

@@ -1,5 +1,6 @@
import BasicWidget from "./basic_widget.js";
import { t } from "../services/i18n.js";
import utils from "../services/utils.js";
const TPL = /*html*/`\
<div class="close-zen-container">
@@ -28,6 +29,10 @@ const TPL = /*html*/`\
-webkit-app-region: no-drag;
}
body.zen.mobile .close-zen-container {
top: -2px;
}
body.zen.electron:not(.platform-darwin):not(.native-titlebar) .close-zen-container {
left: calc(env(titlebar-area-width) - var(--zen-button-size) - 2px);
right: unset;

View File

@@ -268,7 +268,7 @@ export default class RibbonContainer extends NoteContextAwareWidget {
const action = actions.find((act) => act.actionName === toggleCommandName);
const title = $(this).attr("data-title");
if (action && action.effectiveShortcuts.length > 0) {
if (action?.effectiveShortcuts && action.effectiveShortcuts.length > 0) {
return `${title} (${action.effectiveShortcuts.join(", ")})`;
} else {
return title ?? "";

View File

@@ -1,117 +0,0 @@
import { formatDateTime } from "../../utils/formatters.js";
import { t } from "../../services/i18n.js";
import BasicWidget from "../basic_widget.js";
import openService from "../../services/open.js";
import server from "../../services/server.js";
import utils from "../../services/utils.js";
import { openDialog } from "../../services/dialog.js";
interface AppInfo {
appVersion: string;
dbVersion: number;
syncVersion: number;
buildDate: string;
buildRevision: string;
dataDirectory: string;
}
const TPL = /*html*/`
<div class="about-dialog modal fade mx-auto" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">${t("about.title")}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="${t("about.close")}"></button>
</div>
<div class="modal-body">
<table class="table table-borderless">
<tr>
<th>${t("about.homepage")}</th>
<td><a class="tn-link" href="https://github.com/TriliumNext/Trilium" class="external">https://github.com/TriliumNext/Trilium</a></td>
</tr>
<tr>
<th>${t("about.app_version")}</th>
<td class="app-version"></td>
</tr>
<tr>
<th>${t("about.db_version")}</th>
<td class="db-version"></td>
</tr>
<tr>
<th>${t("about.sync_version")}</th>
<td class="sync-version"></td>
</tr>
<tr>
<th>${t("about.build_date")}</th>
<td class="build-date"></td>
</tr>
<tr>
<th>${t("about.build_revision")}</th>
<td><a class="tn-link build-revision external" href="" target="_blank"></a></td>
</tr>
<tr>
<th>${t("about.data_directory")}</th>
<td class="data-directory"></td>
</tr>
</table>
</div>
</div>
</div>
</div>
<style>
.about-dialog a {
word-break: break-all;
}
</style>
`;
export default class AboutDialog extends BasicWidget {
private $appVersion!: JQuery<HTMLElement>;
private $dbVersion!: JQuery<HTMLElement>;
private $syncVersion!: JQuery<HTMLElement>;
private $buildDate!: JQuery<HTMLElement>;
private $buildRevision!: JQuery<HTMLElement>;
private $dataDirectory!: JQuery<HTMLElement>;
doRender(): void {
this.$widget = $(TPL);
this.$appVersion = this.$widget.find(".app-version");
this.$dbVersion = this.$widget.find(".db-version");
this.$syncVersion = this.$widget.find(".sync-version");
this.$buildDate = this.$widget.find(".build-date");
this.$buildRevision = this.$widget.find(".build-revision");
this.$dataDirectory = this.$widget.find(".data-directory");
}
async refresh() {
const appInfo = await server.get<AppInfo>("app-info");
this.$appVersion.text(appInfo.appVersion);
this.$dbVersion.text(appInfo.dbVersion.toString());
this.$syncVersion.text(appInfo.syncVersion.toString());
this.$buildDate.text(formatDateTime(appInfo.buildDate));
this.$buildRevision.text(appInfo.buildRevision);
this.$buildRevision.attr("href", `https://github.com/TriliumNext/Trilium/commit/${appInfo.buildRevision}`);
if (utils.isElectron()) {
this.$dataDirectory.html(
$("<a></a>", {
href: "#",
class: "tn-link",
text: appInfo.dataDirectory
}).prop("outerHTML")
);
this.$dataDirectory.find("a").on("click", (event: JQuery.ClickEvent) => {
event.preventDefault();
openService.openDirectory(appInfo.dataDirectory);
});
} else {
this.$dataDirectory.text(appInfo.dataDirectory);
}
}
async openAboutDialogEvent() {
await this.refresh();
openDialog(this.$widget);
}
}

View File

@@ -0,0 +1,92 @@
import ReactBasicWidget from "../react/ReactBasicWidget.js";
import Modal from "../react/Modal.js";
import { t } from "../../services/i18n.js";
import { formatDateTime } from "../../utils/formatters.js";
import server from "../../services/server.js";
import utils from "../../services/utils.js";
import openService from "../../services/open.js";
import { useState } from "preact/hooks";
import type { CSSProperties } from "preact/compat";
import type { AppInfo } from "@triliumnext/commons";
import useTriliumEvent from "../react/hooks.jsx";
function AboutDialogComponent() {
let [appInfo, setAppInfo] = useState<AppInfo | null>(null);
let [shown, setShown] = useState(false);
const forceWordBreak: CSSProperties = { wordBreak: "break-all" };
useTriliumEvent("openAboutDialog", () => setShown(true));
return (
<Modal className="about-dialog"
size="lg"
title={t("about.title")}
show={shown}
onShown={async () => {
const appInfo = await server.get<AppInfo>("app-info");
setAppInfo(appInfo);
}}
onHidden={() => setShown(false)}
>
<table className="table table-borderless">
<tbody>
<tr>
<th>{t("about.homepage")}</th>
<td><a className="tn-link external" href="https://github.com/TriliumNext/Trilium" style={forceWordBreak}>https://github.com/TriliumNext/Trilium</a></td>
</tr>
<tr>
<th>{t("about.app_version")}</th>
<td className="app-version">{appInfo?.appVersion}</td>
</tr>
<tr>
<th>{t("about.db_version")}</th>
<td className="db-version">{appInfo?.dbVersion}</td>
</tr>
<tr>
<th>{t("about.sync_version")}</th>
<td className="sync-version">{appInfo?.syncVersion}</td>
</tr>
<tr>
<th>{t("about.build_date")}</th>
<td className="build-date">
{appInfo?.buildDate ? formatDateTime(appInfo.buildDate) : ""}
</td>
</tr>
<tr>
<th>{t("about.build_revision")}</th>
<td>
{appInfo?.buildRevision && <a className="tn-link build-revision external" href={`https://github.com/TriliumNext/Trilium/commit/${appInfo.buildRevision}`} target="_blank" style={forceWordBreak}>{appInfo.buildRevision}</a>}
</td>
</tr>
<tr>
<th>{t("about.data_directory")}</th>
<td className="data-directory">
{appInfo?.dataDirectory && (<DirectoryLink directory={appInfo.dataDirectory} style={forceWordBreak} />)}
</td>
</tr>
</tbody>
</table>
</Modal>
);
}
function DirectoryLink({ directory, style }: { directory: string, style?: CSSProperties }) {
if (utils.isElectron()) {
const onClick = (e: MouseEvent) => {
e.preventDefault();
openService.openDirectory(directory);
};
return <a className="tn-link" href="#" onClick={onClick} style={style}></a>
} else {
return <span style={style}>{directory}</span>;
}
}
export default class AboutDialog extends ReactBasicWidget {
get component() {
return <AboutDialogComponent />;
}
}

View File

@@ -1,188 +0,0 @@
import { t } from "../../services/i18n.js";
import treeService from "../../services/tree.js";
import noteAutocompleteService from "../../services/note_autocomplete.js";
import BasicWidget from "../basic_widget.js";
import type { Suggestion } from "../../services/note_autocomplete.js";
import type { default as TextTypeWidget } from "../type_widgets/editable_text.js";
import type { EventData } from "../../components/app_context.js";
import { openDialog } from "../../services/dialog.js";
const TPL = /*html*/`
<div class="add-link-dialog modal mx-auto" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg" style="max-width: 1000px" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title flex-grow-1">${t("add_link.add_link")}</h5>
<button type="button" class="help-button" title="${t("add_link.help_on_links")}" data-help-page="links.html">?</button>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="${t("add_link.close")}"></button>
</div>
<form class="add-link-form">
<div class="modal-body">
<div class="form-group">
<label for="add-link-note-autocomplete">${t("add_link.note")}</label>
<div class="input-group">
<input class="add-link-note-autocomplete form-control" placeholder="${t("add_link.search_note")}">
</div>
</div>
<div class="add-link-title-settings">
<div class="add-link-title-radios form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="link-type" value="reference-link" checked>
${t("add_link.link_title_mirrors")}
</label>
</div>
<div class="add-link-title-radios form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="link-type" value="hyper-link">
${t("add_link.link_title_arbitrary")}
</label>
</div>
<div class="add-link-title-form-group form-group">
<br/>
<label>
${t("add_link.link_title")}
<input class="link-title form-control" style="width: 100%;">
</label>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">${t("add_link.button_add_link")}</button>
</div>
</form>
</div>
</div>
</div>`;
export default class AddLinkDialog extends BasicWidget {
private $form!: JQuery<HTMLElement>;
private $autoComplete!: JQuery<HTMLElement>;
private $linkTitle!: JQuery<HTMLElement>;
private $addLinkTitleSettings!: JQuery<HTMLElement>;
private $addLinkTitleRadios!: JQuery<HTMLElement>;
private $addLinkTitleFormGroup!: JQuery<HTMLElement>;
private textTypeWidget: TextTypeWidget | null = null;
doRender() {
this.$widget = $(TPL);
this.$form = this.$widget.find(".add-link-form");
this.$autoComplete = this.$widget.find(".add-link-note-autocomplete");
this.$linkTitle = this.$widget.find(".link-title");
this.$addLinkTitleSettings = this.$widget.find(".add-link-title-settings");
this.$addLinkTitleRadios = this.$widget.find(".add-link-title-radios");
this.$addLinkTitleFormGroup = this.$widget.find(".add-link-title-form-group");
this.$form.on("submit", () => {
if (this.$autoComplete.getSelectedNotePath()) {
this.$widget.modal("hide");
const linkTitle = this.getLinkType() === "reference-link" ? null : this.$linkTitle.val() as string;
this.textTypeWidget?.addLink(this.$autoComplete.getSelectedNotePath()!, linkTitle);
} else if (this.$autoComplete.getSelectedExternalLink()) {
this.$widget.modal("hide");
this.textTypeWidget?.addLink(this.$autoComplete.getSelectedExternalLink()!, this.$linkTitle.val() as string, true);
} else {
logError("No link to add.");
}
return false;
});
}
async showAddLinkDialogEvent({ textTypeWidget, text = "" }: EventData<"showAddLinkDialog">) {
this.textTypeWidget = textTypeWidget;
this.$addLinkTitleSettings.toggle(!this.textTypeWidget.hasSelection());
this.$addLinkTitleSettings.find("input[type=radio]").on("change", () => this.updateTitleSettingsVisibility());
// with selection hyperlink is implied
if (this.textTypeWidget.hasSelection()) {
this.$addLinkTitleSettings.find("input[value='hyper-link']").prop("checked", true);
} else {
this.$addLinkTitleSettings.find("input[value='reference-link']").prop("checked", true);
}
this.updateTitleSettingsVisibility();
await openDialog(this.$widget);
this.$autoComplete.val("");
this.$linkTitle.val("");
const setDefaultLinkTitle = async (noteId: string) => {
const noteTitle = await treeService.getNoteTitle(noteId);
this.$linkTitle.val(noteTitle);
};
noteAutocompleteService.initNoteAutocomplete(this.$autoComplete, {
allowExternalLinks: true,
allowCreatingNotes: true
});
this.$autoComplete.on("autocomplete:noteselected", (event: JQuery.Event, suggestion: Suggestion) => {
if (!suggestion.notePath) {
return false;
}
this.updateTitleSettingsVisibility();
const noteId = treeService.getNoteIdFromUrl(suggestion.notePath);
if (noteId) {
setDefaultLinkTitle(noteId);
}
});
this.$autoComplete.on("autocomplete:externallinkselected", (event: JQuery.Event, suggestion: Suggestion) => {
if (!suggestion.externalLink) {
return false;
}
this.updateTitleSettingsVisibility();
this.$linkTitle.val(suggestion.externalLink);
});
this.$autoComplete.on("autocomplete:cursorchanged", (event: JQuery.Event, suggestion: Suggestion) => {
if (suggestion.externalLink) {
this.$linkTitle.val(suggestion.externalLink);
} else {
const noteId = treeService.getNoteIdFromUrl(suggestion.notePath!);
if (noteId) {
setDefaultLinkTitle(noteId);
}
}
});
if (text && text.trim()) {
noteAutocompleteService.setText(this.$autoComplete, text);
} else {
noteAutocompleteService.showRecentNotes(this.$autoComplete);
}
this.$autoComplete.trigger("focus").trigger("select"); // to be able to quickly remove entered text
}
private getLinkType() {
if (this.$autoComplete.getSelectedExternalLink()) {
return "external-link";
}
return this.$addLinkTitleSettings.find("input[type=radio]:checked").val();
}
private updateTitleSettingsVisibility() {
const linkType = this.getLinkType();
this.$addLinkTitleFormGroup.toggle(linkType !== "reference-link");
this.$addLinkTitleRadios.toggle(linkType !== "external-link");
}
}

View File

@@ -0,0 +1,162 @@
import { t } from "../../services/i18n";
import Modal from "../react/Modal";
import ReactBasicWidget from "../react/ReactBasicWidget";
import Button from "../react/Button";
import FormRadioGroup from "../react/FormRadioGroup";
import NoteAutocomplete from "../react/NoteAutocomplete";
import { useRef, useState, useEffect } from "preact/hooks";
import tree from "../../services/tree";
import note_autocomplete, { Suggestion } from "../../services/note_autocomplete";
import { default as TextTypeWidget } from "../type_widgets/editable_text.js";
import { logError } from "../../services/ws";
import FormGroup from "../react/FormGroup.js";
import { refToJQuerySelector } from "../react/react_utils";
import useTriliumEvent from "../react/hooks";
type LinkType = "reference-link" | "external-link" | "hyper-link";
function AddLinkDialogComponent() {
const [ textTypeWidget, setTextTypeWidget ] = useState<TextTypeWidget>();
const initialText = useRef<string>();
const [ linkTitle, setLinkTitle ] = useState("");
const hasSelection = textTypeWidget?.hasSelection();
const [ linkType, setLinkType ] = useState<LinkType>(hasSelection ? "hyper-link" : "reference-link");
const [ suggestion, setSuggestion ] = useState<Suggestion | null>(null);
const [ shown, setShown ] = useState(false);
useTriliumEvent("showAddLinkDialog", ( { textTypeWidget, text }) => {
setTextTypeWidget(textTypeWidget);
initialText.current = text;
setShown(true);
});
async function setDefaultLinkTitle(noteId: string) {
const noteTitle = await tree.getNoteTitle(noteId);
setLinkTitle(noteTitle);
}
function resetExternalLink() {
if (linkType === "external-link") {
setLinkType("reference-link");
}
}
useEffect(() => {
if (!suggestion) {
resetExternalLink();
return;
}
if (suggestion.notePath) {
const noteId = tree.getNoteIdFromUrl(suggestion.notePath);
if (noteId) {
setDefaultLinkTitle(noteId);
}
resetExternalLink();
}
if (suggestion.externalLink) {
setLinkTitle(suggestion.externalLink);
setLinkType("external-link");
}
}, [suggestion]);
function onShown() {
const $autocompleteEl = refToJQuerySelector(autocompleteRef);
if (!initialText.current) {
note_autocomplete.showRecentNotes($autocompleteEl);
} else {
note_autocomplete.setText($autocompleteEl, initialText.current);
}
// to be able to quickly remove entered text
$autocompleteEl
.trigger("focus")
.trigger("select");
}
function onSubmit() {
if (suggestion?.notePath) {
// Handle note link
setShown(false);
textTypeWidget?.addLink(suggestion.notePath, linkType === "reference-link" ? null : linkTitle);
} else if (suggestion?.externalLink) {
// Handle external link
setShown(false);
textTypeWidget?.addLink(suggestion.externalLink, linkTitle, true);
} else {
logError("No link to add.");
}
}
const autocompleteRef = useRef<HTMLInputElement>(null);
return (
<Modal
className="add-link-dialog"
size="lg"
maxWidth={1000}
title={t("add_link.add_link")}
helpPageId="QEAPj01N5f7w"
footer={<Button text={t("add_link.button_add_link")} keyboardShortcut="Enter" />}
onSubmit={onSubmit}
onShown={onShown}
onHidden={() => {
setSuggestion(null);
setShown(false);
}}
show={shown}
>
<FormGroup label={t("add_link.note")}>
<NoteAutocomplete
inputRef={autocompleteRef}
onChange={setSuggestion}
opts={{
allowExternalLinks: true,
allowCreatingNotes: true
}}
/>
</FormGroup>
{!hasSelection && (
<div className="add-link-title-settings">
{(linkType !== "external-link") && (
<>
<FormRadioGroup
name="link-type"
currentValue={linkType}
values={[
{ value: "reference-link", label: t("add_link.link_title_mirrors") },
{ value: "hyper-link", label: t("add_link.link_title_arbitrary") }
]}
onChange={(newValue) => setLinkType(newValue as LinkType)}
/>
</>
)}
{(linkType !== "reference-link" && (
<div className="add-link-title-form-group form-group">
<br/>
<label>
{t("add_link.link_title")}
<input className="link-title form-control" style={{ width: "100%" }}
value={linkTitle}
onInput={e => setLinkTitle((e.target as HTMLInputElement)?.value ?? "")}
/>
</label>
</div>
))}
</div>
)}
</Modal>
);
}
export default class AddLinkDialog extends ReactBasicWidget {
get component() {
return <AddLinkDialogComponent />;
}
}

View File

@@ -1,108 +0,0 @@
import treeService from "../../services/tree.js";
import server from "../../services/server.js";
import froca from "../../services/froca.js";
import toastService from "../../services/toast.js";
import BasicWidget from "../basic_widget.js";
import appContext from "../../components/app_context.js";
import { t } from "../../services/i18n.js";
import { Modal } from "bootstrap";
import { openDialog } from "../../services/dialog.js";
const TPL = /*html*/`<div class="branch-prefix-dialog modal fade mx-auto" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg" role="document">
<form class="branch-prefix-form">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title flex-grow-1">${t("branch_prefix.edit_branch_prefix")}</h5>
<button class="help-button" type="button" data-help-page="tree-concepts.html#prefix" title="${t("branch_prefix.help_on_tree_prefix")}">?</button>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="${t("branch_prefix.close")}"></button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="branch-prefix-input">${t("branch_prefix.prefix")}</label> &nbsp;
<div class="input-group">
<input class="branch-prefix-input form-control">
<div class="branch-prefix-note-title input-group-text"></div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-primary btn-sm">${t("branch_prefix.save")}</button>
</div>
</div>
</form>
</div>
</div>`;
export default class BranchPrefixDialog extends BasicWidget {
private modal!: Modal;
private $form!: JQuery<HTMLElement>;
private $treePrefixInput!: JQuery<HTMLElement>;
private $noteTitle!: JQuery<HTMLElement>;
private branchId: string | null = null;
doRender() {
this.$widget = $(TPL);
this.modal = Modal.getOrCreateInstance(this.$widget[0]);
this.$form = this.$widget.find(".branch-prefix-form");
this.$treePrefixInput = this.$widget.find(".branch-prefix-input");
this.$noteTitle = this.$widget.find(".branch-prefix-note-title");
this.$form.on("submit", () => {
this.savePrefix();
return false;
});
this.$widget.on("shown.bs.modal", () => this.$treePrefixInput.trigger("focus"));
}
async refresh(notePath: string) {
const { noteId, parentNoteId } = treeService.getNoteIdAndParentIdFromUrl(notePath);
if (!noteId || !parentNoteId) {
return;
}
const newBranchId = await froca.getBranchId(parentNoteId, noteId);
if (!newBranchId) {
return;
}
this.branchId = newBranchId;
const branch = froca.getBranch(this.branchId);
if (!branch || branch.noteId === "root") {
return;
}
const parentNote = await froca.getNote(branch.parentNoteId);
if (!parentNote || parentNote.type === "search") {
return;
}
this.$treePrefixInput.val(branch.prefix || "");
const noteTitle = await treeService.getNoteTitle(noteId);
this.$noteTitle.text(` - ${noteTitle}`);
}
async editBranchPrefixEvent() {
const notePath = appContext.tabManager.getActiveContextNotePath();
if (!notePath) {
return;
}
await this.refresh(notePath);
openDialog(this.$widget);
}
async savePrefix() {
const prefix = this.$treePrefixInput.val();
await server.put(`branches/${this.branchId}/set-prefix`, { prefix: prefix });
this.modal.hide();
toastService.showMessage(t("branch_prefix.branch_prefix_saved"));
}
}

Some files were not shown because too many files have changed in this diff Show More