1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-08-24 20:19:10 +02:00

Compare commits

...

188 Commits

Author SHA1 Message Date
Laurent Cozic
5710e3fad0 CLI v1.0.122 2019-02-10 16:34:41 +00:00
Laurent Cozic
a03aa62d58 Desktop: Moved buttons up on Config screen for consistency with other screens 2019-02-10 16:29:06 +00:00
Laurent Cozic
2203a39917 Desktop: Disable userstyle.css when printing or exporting to PDF 2019-02-10 16:11:41 +00:00
Laurent Cozic
bc58668483 Desktop: Fixes #1200: Note list was hidden when minimizing and
maximizing window
2019-02-10 15:59:28 +00:00
Ladislav Benc
0b4650f355 Suggesting some language improvements for the Welcome page (#1199)
I'm not sure about the "Joplin has three main columns" part. While it would be more correct to put definite articles
2019-02-10 15:44:43 +00:00
Laurent Cozic
aecdec48ad Electron release v1.0.126 2019-02-09 19:32:04 +00:00
Laurent Cozic
e49198a0d4 oops 2019-02-09 19:31:07 +00:00
Laurent Cozic
6aa4553dd3 Updated translations 2019-02-09 19:28:19 +00:00
Laurent Cozic
860e8a8f5a Desktop: Added a few more shortcuts for macOS and other platforms 2019-02-09 19:13:23 +00:00
Laurent Cozic
434037d793 Done Welcome integration on mobile and CLI 2019-02-09 19:04:34 +00:00
Laurent Cozic
214eae27da CLI: Fixed performance issue which was causing CLI to wait up to 10 seconds when closing the app 2019-02-09 19:04:00 +00:00
Laurent Cozic
0567188fa8 Desktop: Select Welcome notebook the first time it is created 2019-02-08 23:38:29 +00:00
Laurent Cozic
4326902683 Desktop: Fixes #1196: Moved webview to separate component to more precisely handle lifecycle events and precent uncessary reloading 2019-02-08 23:07:01 +00:00
Laurent Cozic
da3589149d Desktop: Fixed restored scroll position when only viewer is visible 2019-02-08 08:28:27 +00:00
Laurent Cozic
69b4b4d1f4 Deskop: Integrated Welcome notes to desktop 2019-02-07 23:27:50 +00:00
Laurent Cozic
dd4b46a88b All: Finished Welcome notebook 2019-02-07 23:17:58 +00:00
Laurent Cozic
6f2253b2f4 Updated Chinese translation (Thanks HongSen) 2019-02-07 22:25:50 +00:00
Laurent Cozic
4c00d9512e Desktop: Resolves #1041: Go back to previous note after clicking link 2019-02-07 18:17:09 +00:00
Laurent Cozic
6f511cb1e6 All: Tweaked blockquote CSS to make it fit more with styling update 2019-02-07 08:23:44 +00:00
Caleb John
029e84f538 Add new styling to tables and blockquote (#1185)
* Add new styling to tables and blockquote

* Update styling to tables
2019-02-07 08:01:38 +00:00
Laurent Cozic
42b1db1d08 Desktop: Use Arial for note viewer in Windows 2019-02-07 00:00:08 +00:00
Laurent Cozic
9d4b34cad7 All: Applied styles to mobile too 2019-02-06 23:52:29 +00:00
Laurent Cozic
cd9aff0f59 Desktop: Make default editor font a bit bigger 2019-02-06 23:06:37 +00:00
Laurent Cozic
032816fffc All: Made note font slightly smaller 2019-02-06 22:48:02 +00:00
Laurent Cozic
1408f06c8d All: darker text 2019-02-06 22:39:03 +00:00
Laurent Cozic
49f8d0c6d8 API: Allow specifying item ID for any item 2019-02-06 22:36:39 +00:00
Laurent Cozic
0d6443c30a All: Improve styling and layout of notes in note viewer 2019-02-05 23:55:09 +00:00
Laurent Cozic
e62d91dda8 Desktop: Allow using macOS App bundle as external editor, and improved error handling 2019-02-05 22:00:25 +00:00
Laurent Cozic
0e122c9dc5 Merge branch 'welcome' 2019-02-05 21:14:43 +00:00
Laurent Cozic
c2bd453e8c Updated welcome notes 2019-02-05 21:14:32 +00:00
Laurent Cozic
949ea7afb7 Merge branch 'welcome' of github.com:laurent22/joplin into welcome 2019-02-05 18:46:41 +00:00
Laurent Cozic
9f575101d2 Updated doc 2019-02-05 18:46:32 +00:00
Laurent Cozic
2b4470054e Merge branch 'welcome' of github.com:laurent22/joplin into welcome 2019-02-05 18:45:24 +00:00
Laurent Cozic
b220613e54 Remove logo 2019-02-05 18:45:16 +00:00
Laurent Cozic
11328babe8 Add NC logo 2019-02-05 18:26:49 +00:00
Laurent Cozic
735bc92bc4 Mobile: Added shim.createResourceFromPath to support Welcome assets 2019-02-05 18:11:03 +00:00
Laurent Cozic
6894b9b1b7 All: Added tests for Welcome asset handling 2019-02-05 17:39:10 +00:00
Laurent Cozic
4de7815f31 doc 2019-02-05 17:08:25 +00:00
Laurent Cozic
4ce7b48468 Merge branch 'master' of github.com:laurent22/joplin 2019-02-05 17:07:41 +00:00
Laurent Cozic
77e4cb87ad iOS v29 2019-02-05 17:06:36 +00:00
Laurent Cozic
dd6b43035e Link between notes on Welcome notes 2019-02-03 20:30:59 +00:00
Laurent Cozic
e76094c546 Also set tags on Welcome notes 2019-02-03 20:19:17 +00:00
Laurent Cozic
9c00dc4cab All: Added script to build welcome assets and to import them on startup 2019-02-03 18:58:44 +00:00
Laurent Cozic
fc416de348 Doc: Removed note 'tags' property from doc as not fully supported (only used in Web Clipper) 2019-02-03 17:01:49 +00:00
Laurent Cozic
a2156be4ec Mobile: Fixed search screen 2019-02-03 16:57:29 +00:00
Laurent Cozic
cf427eba0f Mobile: Fixed sidebar error 2019-02-03 16:15:07 +00:00
Laurent Cozic
0050c90678 Update translations 2019-02-03 15:57:10 +00:00
Laurent Cozic
5eeff02dbe Revert "Исправлен и обновлен перевод (#1175)"
This reverts commit eb283efc20.
2019-02-03 15:56:20 +00:00
0ndrey
eb283efc20 Исправлен и обновлен перевод (#1175) 2019-02-03 15:50:30 +00:00
Laurent Cozic
87121c9c21 All: Fixed importing ENEX file when note incorrectly contains a reminder tag 2019-02-02 13:04:42 +00:00
Laurent Cozic
a2dbbbf832 Merge branch 'master' of github.com:laurent22/joplin 2019-02-02 10:54:07 +00:00
Laurent Cozic
fd251cd9a9 Desktop: started writing welcome notes 2019-02-02 10:53:57 +00:00
Laurent Cozic
8ced2d288e Desktop: Note reloading issue 2019-02-02 10:47:26 +00:00
Laurent Cozic
242926d381 Fixed regressions in test units 2019-01-31 09:48:48 +00:00
Laurent Cozic
8c9a148e71 All: Better handle search queries that include dashes 2019-01-31 08:35:41 +00:00
Laurent Cozic
9e165fc7dc Desktop: Fixes #1161: Display highlighted text and other background colours and images when exporting to PDF or printing 2019-01-31 08:23:47 +00:00
Laurent Cozic
f46e4e0cec Desktop: Fixes #1142: Disallow dropping notes on sidebar Notebook header 2019-01-31 08:02:12 +00:00
Laurent Cozic
efcf5ecef4 Desktop: When deleting note, display title or number of notes 2019-01-31 07:55:51 +00:00
Laurent Cozic
b6ba843d09 Desktop: Added 'Insert date time' option to menu 2019-01-30 22:45:49 +00:00
Laurent Cozic
915112e274 Desktop: Restore scroll position when switching notes 2019-01-30 22:45:28 +00:00
Laurent Cozic
cc8f8fcd2c Desktop: Allow selecting editor path with dialog window 2019-01-30 19:19:06 +00:00
Laurent Cozic
bda3ea9a35 Desktop: Improve how new notes are created to make it more reliable 2019-01-30 18:06:47 +00:00
Laurent Cozic
a7aed1f93a Desktop: Fixed scrolling issue 2019-01-30 17:35:41 +00:00
Laurent Cozic
a33f602f3b Desktop: Record last selected note IDs and restore it when opening notebook 2019-01-29 18:32:52 +00:00
Laurent Cozic
4d08b49578 Desktop: Added Usage link next to search box 2019-01-29 18:11:31 +00:00
Laurent Cozic
21e049ab45 Desktop: When selecting multiple notes, display possible actions as buttons 2019-01-29 18:02:34 +00:00
Helmut K. C. Tessarek
1d4234caea Merge pull request #1155 from chenlhlinux/patch-1
Update zh_CN.po
2019-01-29 01:10:48 -05:00
Laurent Cozic
d1269de3a7 Desktop: Made confirmation buttons sticky on Config screen 2019-01-27 23:44:16 +00:00
Laurent Cozic
8c19fcf8fc Merge branch 'master' of github.com:laurent22/joplin 2019-01-27 23:16:37 +00:00
Laurent Cozic
beaba2be55 Desktop: Group config options into sections 2019-01-27 23:15:56 +00:00
chenlhlinux
32c9ad1d59 Update zh_CN.po 2019-01-27 19:35:10 +08:00
Helmut K. C. Tessarek
a194513252 de_DE.po: remove the last 2 occurences of fuzzy
Both 2 translations are accurate, thus I'm removing the fuzzy flag.
2019-01-26 22:22:09 -05:00
Helmut K. C. Tessarek
cd93a1d1e1 Merge pull request #1157 from xissy/patch-2
All: Update Korean translations
2019-01-26 21:53:36 -05:00
Taeho Kim
2867728996 Update ko.po
Added proper Korean translations into empty messages and fuzzy translations.
2019-01-26 17:34:57 -08:00
Laurent Cozic
394cc78851 Desktop: Use ENTER and ESCAPE to go to next search result or to close search bar 2019-01-26 18:40:43 +00:00
Laurent Cozic
76f0a26322 Desktop: Keep synchronise button and status at bottom of side bar 2019-01-26 18:36:20 +00:00
Laurent Cozic
92d7a577a0 Desktop: Use SPACE to collapse or expand a folder in sidebar 2019-01-26 18:09:09 +00:00
Laurent Cozic
9c1219b188 Desktop: Use arrow to move between items, and added shortcuts to focus different elements 2019-01-26 18:04:32 +00:00
Laurent Cozic
f62bbfe286 Desktop: Toggle todo checkbox using SPACE key 2019-01-26 15:33:45 +00:00
Laurent Cozic
fef176eb96 Merge branch 'master' of github.com:laurent22/joplin 2019-01-26 15:15:35 +00:00
Laurent Cozic
ed541dac3b Desktop: Delete note using keyboard 2019-01-26 15:15:16 +00:00
chenlhlinux
4a175b2158 Update zh_CN.po 2019-01-26 20:06:08 +08:00
Helmut K. C. Tessarek
4076899e11 Merge pull request #1149 from matsest/update-norwegian-190125
All: Update norwegian translations
2019-01-26 02:43:15 -05:00
Laurent Cozic
998bdf3b56 Desktop: Move up and down in note list using arrow keys 2019-01-25 19:59:36 +00:00
Laurent Cozic
76b211eb6d Electron release v1.0.125 2019-01-25 18:03:43 +00:00
Laurent Cozic
f781cb3922 Android release v1.0.236 2019-01-25 18:00:24 +00:00
Laurent Cozic
ced3e5d623 Android: Trying to remove Firebase libraries 2019-01-25 17:54:43 +00:00
Mats Estensen
2a4812cb87 update norwegian translations 2019-01-25 18:35:08 +01:00
Laurent Cozic
1f384c7ae4 Merge branch 'master' of github.com:laurent22/joplin 2019-01-25 17:14:26 +00:00
Laurent Cozic
01a3285636 Updated doc 2019-01-25 17:14:17 +00:00
Laurent Cozic
53166cb3f5 All: Fixes #1137: Fixed regression on SeaFile sync 2019-01-21 17:34:41 +00:00
Laurent Cozic
893462ae87 Check that resource could be loaded 2019-01-20 16:28:10 +00:00
Laurent Cozic
949dbf45f1 Desktop: Resolves #1099: Show Markdown images in external editor 2019-01-20 16:27:33 +00:00
Laurent Cozic
d7dc625042 Clipper: Fixes #1058: Import images at correct size 2019-01-20 15:26:43 +00:00
Laurent Cozic
cc91c77f9e Mobile: Prevent search box from being cleared when updated from somewhere else 2019-01-19 18:40:21 +00:00
Laurent Cozic
4847fd76de Android release v1.0.235 2019-01-19 18:26:17 +00:00
Laurent Cozic
25b711a8da Electron release v1.0.124 2019-01-19 18:23:00 +00:00
Laurent Cozic
b5e50fa62e Update translations 2019-01-19 18:22:18 +00:00
Laurent Cozic
28e40a5c86 Disable a few more tags when renderering to HTML 2019-01-19 18:14:01 +00:00
Laurent Cozic
a8a7b7c07b Merge branch 'master' into search_engine_fts_fix 2019-01-19 18:08:45 +00:00
Laurent Cozic
299008688d All: Search: Integration to CLI and mobile apps 2019-01-19 18:03:05 +00:00
Laurent Cozic
42a674008f All: Search: More multi-language support, and started updating mobile app 2019-01-18 18:31:07 +00:00
Laurent Cozic
8fdc0bf17c All: Search: More multi-language support 2019-01-18 17:56:56 +00:00
Laurent Cozic
4e3896c108 iOS: Fixes #792: Fix "Network request failed" error that some users were having 2019-01-18 17:42:46 +00:00
Laurent Cozic
96cd56548e Desktop: Improve search keyword highlighting 2019-01-17 19:01:35 +00:00
Joybin Chen
739fb2c3d2 Desktop: handle ESC key press to cancel the NotePropertiesDialog (#1125)
* Electron: enable ESC key press to dismiss NotePropertyDialog, when no editedKey.

* Desktop: handle ESC key press to cancel the NotePropertiesDialog
2019-01-16 20:19:48 +00:00
Laurent Cozic
0c98573700 All: Fixes #769: Disable META tags in Markdown viewers 2019-01-15 20:12:53 +00:00
Laurent Cozic
8dc0b34fdc Desktop: Search engine: Improved support for JA, KO, ZH scripts 2019-01-15 19:55:58 +00:00
Laurent Cozic
384ca09842 Merge branch 'master' into search_engine_fts_fix 2019-01-15 19:33:42 +00:00
Laurent Cozic
97d86825c2 Desktop: Fixes #1126: Open Katex link in external browser instead of inside app 2019-01-15 19:30:45 +00:00
Laurent Cozic
f5a824b1e6 Removing CLI demo 2019-01-15 19:12:19 +00:00
Laurent Cozic
4fc11e77e8 Removing CLI demo 2019-01-15 19:11:35 +00:00
Laurent Cozic
8d16ad7035 Updated dates 2019-01-15 19:10:27 +00:00
Laurent Cozic
3b1d84b00b Merge branch 'master' of github.com:laurent22/joplin 2019-01-15 18:37:54 +00:00
Laurent Cozic
3f540da31b Desktop: Improved local search by highlighting even partial matches 2019-01-15 18:37:44 +00:00
Laurent Cozic
3a20f1c245 Merge pull request #1119 from abonte/update-italian-translation
update Italian
2019-01-15 18:18:48 +00:00
Laurent Cozic
e803f0c545 update new strings to nb_NO (#1121) 2019-01-15 18:18:34 +00:00
Philipp Zumstein
c9495c23a6 Update de_DE.po (#1124) 2019-01-15 18:18:17 +00:00
Laurent Cozic
26aae9eea5 Merge branch 'master' of github.com:laurent22/joplin 2019-01-15 18:17:56 +00:00
Laurent Cozic
7d92136467 Added version info to auto-update dialog 2019-01-15 18:17:45 +00:00
Laurent Cozic
a7896b43d7 More search engine improvements 2019-01-15 18:10:22 +00:00
Laurent Cozic
2e12b2655b More fixes to search engine and better handling of non-ASCII searches 2019-01-14 19:11:54 +00:00
Laurent Cozic
a1f0bd1e6c Search engine: normalize text 2019-01-13 16:05:07 +00:00
Laurent Cozic
4472590133 Merge branch 'master' into search_engine_fts_fix 2019-01-13 15:52:41 +00:00
Laurent Cozic
64f1214ad9 Merge branch 'master' of github.com:laurent22/joplin 2019-01-13 15:50:37 +00:00
Laurent Cozic
bd465a72cf iOS v10.0.28 2019-01-13 15:50:19 +00:00
Mats Estensen
1d1c2a6925 update new strings to nb_NO 2019-01-12 14:40:57 +01:00
abonte
d68ba32533 fix typo 2019-01-12 14:28:49 +01:00
Laurent Cozic
d1a316032d Update website 2019-01-12 00:02:23 +00:00
Laurent Cozic
b465042a56 Fixed stats page 2019-01-12 00:01:58 +00:00
Laurent Cozic
8ff2418b02 Desktop: Added support for pre-releases 2019-01-11 23:40:05 +00:00
Laurent Cozic
f6640bcc32 Electron release v1.0.123 2019-01-11 22:07:23 +00:00
Laurent Cozic
fa3c0fd18a Android release v1.0.234 2019-01-11 17:14:19 +00:00
Laurent Cozic
2ac03c18c4 Revert "replace markdown-it-katex with markdown-it-texmath, this makes using $ much better (#1116)"
This reverts commit 46b82f877b.
2019-01-11 17:02:04 +00:00
abonte
51ee6128f3 update italian 2019-01-11 17:47:17 +01:00
Laurent Cozic
53478056de Update website 2019-01-10 21:43:25 +00:00
Laurent Cozic
83c791564a Android release v1.0.233 2019-01-10 19:14:32 +00:00
Laurent Cozic
65d0032995 Electron release v1.0.120 2019-01-10 19:04:35 +00:00
Laurent Cozic
37c4f99341 CLI v1.0.120 2019-01-10 19:00:42 +00:00
Laurent Cozic
adbc873b2a Update translations 2019-01-10 18:59:56 +00:00
Laurent Cozic
3567a57d6a Update for mac 2019-01-10 18:53:18 +00:00
Caleb John
b4e9fb157f Apply zoom and editorfont updates without needing to restart (#1109)
* Apply zoom and editorfont updates without needing to restart
fixes #1106

* Combine zoomRatio and editorFontSize into the theme cache
2019-01-10 18:34:58 +00:00
Helmut K. C. Tessarek
1be3646a04 fix PR template (#1114)
If someone does not delete the 'Attention' line, it will show up in the pull request.
Comments and information should be enclosed in comment markers.
2019-01-10 18:34:24 +00:00
Caleb John
46b82f877b replace markdown-it-katex with markdown-it-texmath, this makes using $ much better (#1116) 2019-01-10 18:33:49 +00:00
Helmut K. C. Tessarek
ef56eb4a52 fix markdown code for checked checkbox (#1113)
fixes #1067
2019-01-10 18:32:45 +00:00
Laurent Cozic
6989f9fd16 CLI: Fixes #1096: Fixed search function in terminal app 2019-01-10 19:25:21 +00:00
Laurent Cozic
7c3e8547de CLI: Fixes #1100: New folders were no longer being shown in list 2019-01-10 19:17:38 +00:00
Laurent Cozic
8268c3edba Desktop: Resolves #1059: Fixed behaviour of export to PDF and print 2019-01-10 18:58:58 +00:00
Laurent Cozic
a8cc8763b0 Android: Fixes #321: Removed dependency to Firebase 2019-01-10 18:49:26 +00:00
Laurent Cozic
09b4acf087 Merge branch 'master' of github.com:laurent22/joplin 2019-01-10 18:04:20 +00:00
Laurent Cozic
3b719ce53b Fixed keyword highlighting bug and other minor issues 2019-01-09 17:33:52 +00:00
Abijeet Patro
83281197f1 Adds functionality to toggle the notebooks and tags on the sidebar. (#1002)
* Adds functionality to toggle the notebooks and tags on the sidebar.

Signed-off-by: Abijeet <abijeetpatro@gmail.com>

* Modified to not use an anonymous function.

Signed-off-by: abijeetpatro <abijeetpatro@gmail.com>

* Updated the code to be cleaner.

Signed-off-by: abijeet <abijeetpatro@gmail.com>
2019-01-09 17:25:44 +00:00
tfinnberg
ffda04f9b4 fixed file url issue (#1054) 2019-01-09 17:21:32 +00:00
Ikuya AWASHIRO
606893286a Update Japanese Translation. (#1102) 2019-01-09 17:16:49 +00:00
Laurent Cozic
075b71746a Update CONTRIBUTING.md 2019-01-09 17:07:43 +00:00
Laurent Cozic
01f1f3e957 Update PULL_REQUEST_TEMPLATE 2019-01-09 17:06:59 +00:00
Caleb John
88a9d5e802 Fix window manager icon on linux (#1110) 2019-01-09 17:05:28 +00:00
Laurent Cozic
7eebfae1c3 Updated pt_BR translation 2019-01-09 16:49:27 +00:00
Jacob Herrington
340fe76b8f Remove S (#1101)
Noticed this while reading!
2019-01-06 01:54:30 +01:00
Helmut K. C. Tessarek
e83678df3a Merge pull request #1098 from rasperepodvipodvert/patch-1
Update ru_RU translation
2019-01-04 18:07:09 -05:00
Helmut K. C. Tessarek
0bbbb49a31 Merge pull request #1079 from y-usuzumi/master
Update zh_CN translations
2019-01-04 18:06:23 -05:00
Ettore Atalan
0e61115857 Update de_DE.po (#1076)
* Update de_DE.po

Translated last untranslated strings and removed anglicisms.
2019-01-04 18:05:50 -05:00
Mats Estensen
8d3ac6f6fe Update Norwegian translation (#1061)
* Update norwegian translation

* correct plural words and some menu items

* update nb_NO
2019-01-04 18:05:13 -05:00
filatovzru
86e644be9a Добавил перевода 2019-01-04 20:32:59 +03:00
Laurent Cozic
30201249b5 Mobile: Fixes #1068: Handle case where notebook has a parent that no longer exists 2018-12-31 17:33:20 +01:00
Laurent Cozic
41155f5ef4 Started rewriting search engine to better support unicode 2018-12-29 20:19:18 +01:00
Laurent Cozic
f308fe71f9 Mobile: Fixes #1082: Highlight correct keywords when doing a search 2018-12-29 18:24:02 +01:00
Laurent Cozic
5a00214fd2 Android release v1.0.232 2018-12-29 03:14:34 +01:00
Laurent Cozic
1b3e0f65e1 Mobile: Fixes #1057: Handle more cases where the title text field disappear 2018-12-29 03:12:23 +01:00
Laurent Cozic
7cfc537870 Android release v1.0.225 2018-12-28 21:42:58 +01:00
Laurent Cozic
53513db5b5 Mobile: Fixes #1066: Disable use of FTS when not present on device 2018-12-28 21:40:29 +01:00
Laurent Cozic
59402cf198 Android: Fixes #1062: Don t display Play Service alert when Play Service unavailable 2018-12-28 20:38:40 +01:00
Laurent Cozic
12efc02d91 Android release v1.0.224 2018-12-27 22:51:38 +01:00
Laurent Cozic
f38b907680 Mobile: Fixes #1057: Fix missing title field issue in Android 2018-12-27 22:49:19 +01:00
Laurent Cozic
8fcb46ca4a Revert "Revert "Upgrade React Native" - Fixes #1057"
This reverts commit 50ad4d05f2.
2018-12-27 20:14:20 +01:00
Kenneth Zhao
71ec9a193f Update zh_CN translations 2018-12-27 14:27:15 +08:00
Laurent Cozic
393a545548 Android release v1.0.201 2018-12-23 20:28:03 +01:00
Laurent Cozic
f88449fbb0 Android release v1.0.200 2018-12-23 20:18:24 +01:00
Laurent Cozic
50ad4d05f2 Revert "Upgrade React Native" - Fixes #1057
This reverts commit 32c02275a2.
2018-12-23 20:11:12 +01:00
Laurent Cozic
8d0e562c8a Android release v1.0.181 2018-12-20 14:58:35 +01:00
Laurent Cozic
c98e67c003 /bin/bash: qa: command not found 2018-12-20 14:53:10 +01:00
Laurent Cozic
5565538b80 Android: Trying to get notifications to work in Android 8.x 2018-12-20 14:52:56 +01:00
Helmut K. C. Tessarek
958979e1d7 CLI v1.0.119 2018-12-19 11:13:18 +01:00
Laurent Cozic
685845e097 Update website 2018-12-17 23:47:35 +01:00
Laurent Cozic
3813f9e417 Clipper release v1.0.8 2018-12-17 23:42:13 +01:00
Laurent Cozic
40cf3fb4d0 Android release v1.0.179 2018-12-17 23:25:21 +01:00
Laurent Cozic
3f88b16603 iOS v10.0.27 2018-12-17 23:12:35 +01:00
Laurent Cozic
32c02275a2 Upgrade React Native 2018-12-17 23:11:53 +01:00
216 changed files with 9329 additions and 5957 deletions

1
.gitignore vendored
View File

@@ -40,4 +40,5 @@ Tools/github_oauth_token.txt
_releases
ReactNativeClient/lib/csstojs/
ElectronClient/app/gui/note-viewer/fonts/
ElectronClient/app/gui/note-viewer/lib.js
Tools/commit_hook.txt

View File

@@ -1,3 +1,7 @@
**IMPORTANT:** At the moment pull requests for new features are no longer being accepted. More info there: https://github.com/laurent22/joplin/issues/1112
* * *
# User support
For general discussion about Joplin, user support, software development questions, and to discuss new features, please go to the [Joplin Forum](https://discourse.joplin.cozic.net/). It is possible to login with your GitHub account.
@@ -12,14 +16,16 @@ If possible, **please provide a screenshot**. A screenshot showing the problem i
Again, please check that it has not already been requested. If it has, simply **up-vote the issue** - the ones with the most up-votes are likely to be implemented. "+1" comments are not tracked.
# Adding new features
# Creating a pull request
If you want to add a new feature, consider asking about it before implementing it or checking existing discussions to make sure it is within the scope of the project. Of course you are free to create the pull request directly but it is not guaranteed it is going to be accepted.
- If you want to add a new feature, consider asking about it before implementing it or checking existing discussions to make sure it is within the scope of the project. That scope, due to limited resources, might be narrower than you think. As a rule of thumb **if your change is likely to involve more than 50 lines of code, you should discuss it in the forum**, just so that you don't waste your time implementing something that might not be accepted.
- Bug fixes have a very high change of being accepted.
- A pull request that is relevant to the current roadmap has a very high change of being accepted.
Building the apps is relatively easy - please [see the build instructions](https://github.com/laurent22/joplin/blob/master/BUILD.md) for more details.
Pull requests that automatically change many files tend to be rejected (for example changes that automatically update the code styling, or to add new lines to many files, or to automatically convert images to a different format) so if you have such a pull request in mind, please discuss it first in the forum.
# Coding style
There are only two rules, but not following them means the pull request will not be accepted (it can be accepted once the issues are fixed):

View File

@@ -22,6 +22,7 @@ const os = require('os');
const fs = require('fs-extra');
const { cliUtils } = require('./cli-utils.js');
const Cache = require('lib/Cache');
const WelcomeUtils = require('lib/WelcomeUtils');
class Application extends BaseApplication {
@@ -376,6 +377,8 @@ class Application extends BaseApplication {
return this.stdout(object);
});
await WelcomeUtils.install(this.dispatch.bind(this));
// If we have some arguments left at this point, it's a command
// so execute it.
if (argv.length) {
@@ -393,6 +396,12 @@ class Application extends BaseApplication {
}
process.exit(1);
}
await Setting.saveAll();
// Need to call exit() explicitely, otherwise Node wait for any timeout to complete
// https://stackoverflow.com/questions/18050095
process.exit(0);
} else { // Otherwise open the GUI
this.initRedux();

View File

@@ -154,11 +154,11 @@ class Command extends BaseCommand {
type: Database.enumId('fieldType', 'text'),
description: 'If an image is provided, you can also specify an optional rectangle that will be used to crop the image. In format `{ x: x, y: y, width: width, height: height }`',
});
tableFields.push({
name: 'tags',
type: Database.enumId('fieldType', 'text'),
description: 'Comma-separated list of tags. eg. `tag1,tag2`.',
});
// tableFields.push({
// name: 'tags',
// type: Database.enumId('fieldType', 'text'),
// description: 'Comma-separated list of tags. eg. `tag1,tag2`.',
// });
}
lines.push('# ' + toTitleCase(tableName));

View File

@@ -49,35 +49,6 @@ class Command extends BaseCommand {
type: 'SEARCH_SELECT',
id: searchId,
});
// let fields = Note.previewFields();
// fields.push('body');
// const notes = await Note.previews(folder ? folder.id : null, {
// fields: fields,
// anywherePattern: '*' + pattern + '*',
// });
// const fragmentLength = 50;
// let parents = {};
// for (let i = 0; i < notes.length; i++) {
// const note = notes[i];
// const parent = parents[note.parent_id] ? parents[note.parent_id] : await Folder.load(note.parent_id);
// parents[note.parent_id] = parent;
// const idx = note.body.indexOf(pattern);
// let line = '';
// if (idx >= 0) {
// let fragment = note.body.substr(Math.max(0, idx - fragmentLength / 2), fragmentLength);
// fragment = fragment.replace(/\n/g, ' ');
// line = sprintf('%s: %s / %s: %s', BaseModel.shortId(note.id), parent.title, note.title, fragment);
// } else {
// line = sprintf('%s: %s / %s', BaseModel.shortId(note.id), parent.title, note.title);
// }
// this.stdout(line);
// }
}
}

View File

@@ -117,7 +117,6 @@ class Command extends BaseCommand {
this.releaseLockFn_ = null;
// Lock is unique per profile/database
// TODO: use SQLite database to do lock?
const lockFilePath = require('os').tmpdir() + '/synclock_' + md5(escape(Setting.value('profileDir'))); // https://github.com/pvorb/node-md5/issues/41
if (!await fs.pathExists(lockFilePath)) await fs.writeFile(lockFilePath, 'synclock');

View File

@@ -139,7 +139,8 @@ class FolderListWidget extends ListWidget {
const orderFolders = (parentId) => {
for (let i = 0; i < this.folders.length; i++) {
const f = this.folders[i];
if (f.parent_id === parentId) {
const folderParentId = f.parent_id ? f.parent_id : '';
if (folderParentId === parentId) {
newItems.push(f);
if (this.folderHasChildren_(this.folders, f.id)) orderFolders(f.id);
}

View File

@@ -1,5 +1,8 @@
#!/usr/bin/env node
// Use njstrace to find out what Node.js might be spending time on
// var njstrace = require('njstrace').inject();
// Make it possible to require("/lib/...") without specifying full path
require('app-module-path').addPath(__dirname);

View File

@@ -589,6 +589,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "S'està exportant a «%s» com a format «%s». Espereu..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Títol del bloc de notes:"
#, fuzzy
msgid "Note body"
msgstr "Blocs de notes"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "S'està important des de «%s» com a format «%s». Espereu..."
@@ -646,6 +660,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -668,6 +685,10 @@ msgstr "Mostra o amaga la barra lateral"
msgid "Toggle editor layout"
msgstr "Canvia el disseny de l'editor"
#, fuzzy
msgid "Focus"
msgstr "Vés al cos"
msgid "Tools"
msgstr "Eines"
@@ -718,9 +739,21 @@ msgstr "Cancel·la"
msgid "Current version is up-to-date."
msgstr "La versió actual està actualitzada"
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Hi ha disponible una actualització. Voleu baixar-la ara?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Sí"
@@ -795,13 +828,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Comprova la configuració de la sincronització"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Les notes i la configuració es desen a: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Comprova la configuració de la sincronització"
msgid "Apply"
msgstr ""
@@ -896,6 +932,10 @@ msgstr "Estat"
msgid "Encryption is:"
msgstr "El xifratge és:"
#, fuzzy
msgid "Usage"
msgstr "Ús: %s"
msgid "Back"
msgstr "Enrere"
@@ -946,36 +986,6 @@ msgstr "Alguns elements no s'han pogut desxifrar."
msgid "Set the password"
msgstr "Establiu la contrasenya"
msgid "Add or remove tags"
msgstr "Afegeix o suprimeix etiquetes"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Copia"
msgid "Switch between note and to-do type"
msgstr "Alterna entre el tipus nota i tasques pendents"
#, fuzzy
msgid "Switch to note type"
msgstr "Alterna entre el tipus nota i tasques pendents"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Alterna entre el tipus nota i tasques pendents"
msgid "Copy Markdown link"
msgstr "Copia l'enllaç Markdown"
msgid "Delete"
msgstr "Suprimeix"
msgid "Delete notes?"
msgstr "Voleu suprimir les notes?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "No hi ha cap nota aquí. Creeu-ne una fent clic a «Nota nova»."
@@ -1025,6 +1035,9 @@ msgstr ""
"Aquesta nota no té contingut. Feu clic a «%s» per a anar a l'editor i "
"modificar-la."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1118,6 +1131,9 @@ msgstr "Voleu suprimir aquesta etiqueta de totes les notes?"
msgid "Remove this search from the sidebar?"
msgstr "Voleu suprimir aquesta cerca de la barra laterla?"
msgid "Delete"
msgstr "Suprimeix"
msgid "Rename"
msgstr "Canvia el nom"
@@ -1367,6 +1383,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Actualitza automàticament l'aplicació"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Interval de sincronització"
@@ -1459,6 +1482,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "El valor de l'opció no és vàlid: «%s». Els valors possibles són: %s."
#, fuzzy
msgid "General"
msgstr "Opcions generals"
#, fuzzy
msgid "Synchronisation"
msgstr "Estat de la sincronització"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Blocs de notes"
#, fuzzy
msgid "Application"
msgstr "Surt de l'aplicació"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1665,9 +1707,24 @@ msgstr ""
msgid "Joplin website"
msgstr "Lloc web del Joplin"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Lloc web del Joplin"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Per suprimir: %d"
msgid "Login with Dropbox"
msgstr "Inicia sessió amb Dropbox"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "Clau mestra %s"
@@ -1739,6 +1796,9 @@ msgstr "Converteix a nota"
msgid "Convert to todo"
msgstr "Converteix a llistat de tasques pendents"
msgid "Copy Markdown link"
msgstr "Copia l'enllaç Markdown"
msgid "Hide metadata"
msgstr "Amaga les metadades"
@@ -1774,6 +1834,27 @@ msgstr ""
msgid "Welcome"
msgstr "Benvingut"
#~ msgid "Add or remove tags"
#~ msgstr "Afegeix o suprimeix etiquetes"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Copia"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Alterna entre el tipus nota i tasques pendents"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Alterna entre el tipus nota i tasques pendents"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Alterna entre el tipus nota i tasques pendents"
#~ msgid "Delete notes?"
#~ msgstr "Voleu suprimir les notes?"
#~ msgid "State: %s."
#~ msgstr "Estat: %s"

View File

@@ -571,6 +571,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exportuji do \"%s\" jako formát \"%s\". Chvíli strpení..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Název zápisníku:"
#, fuzzy
msgid "Note body"
msgstr "Zápisníky"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importuji z \"%s\" jako formát \"%s\". Chvíli strpení..."
@@ -628,6 +642,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -650,6 +667,10 @@ msgstr ""
msgid "Toggle editor layout"
msgstr "Změňit layout editoru"
#, fuzzy
msgid "Focus"
msgstr "Vybrat text poznámky"
msgid "Tools"
msgstr "Nástroje"
@@ -700,9 +721,21 @@ msgstr "Zrušit"
msgid "Current version is up-to-date."
msgstr "Současná verze je aktuální."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Je k dispozici update, chcete jej stáhnout?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Ano"
@@ -770,13 +803,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Zkontrolujte nastavení synchronizace"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Poznámky a nastavení uloženo v: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Zkontrolujte nastavení synchronizace"
msgid "Apply"
msgstr ""
@@ -866,6 +902,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Šifrování je:"
#, fuzzy
msgid "Usage"
msgstr "Použití: %s"
msgid "Back"
msgstr "Zpět"
@@ -918,37 +958,6 @@ msgstr "Některé položky nelze rozšifrovat."
msgid "Set the password"
msgstr "Nastavit heslo"
msgid "Add or remove tags"
msgstr "Přidat či odebrat tagy"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Kopírovat"
msgid "Switch between note and to-do type"
msgstr "Přepnout mezi poznámkou a to-do"
#, fuzzy
msgid "Switch to note type"
msgstr "Přepnout mezi poznámkou a to-do"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Přepnout mezi poznámkou a to-do"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Delete"
msgstr "Smazat"
msgid "Delete notes?"
msgstr "Smazat poznámky?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Žádné poznámky. Vytvořte jednu kliknutím na \"Nová poznámka\"."
@@ -994,6 +1003,9 @@ msgid ""
"note."
msgstr "Tato poznámka je prázdný. Klikněte na \"%s\" pro otevření editoru."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1088,6 +1100,9 @@ msgstr "Odebrat tento tag ze všech poznámek?"
msgid "Remove this search from the sidebar?"
msgstr "Smazat tento hledaný výraz z panelu?"
msgid "Delete"
msgstr "Smazat"
msgid "Rename"
msgstr "Přejmenovat"
@@ -1342,6 +1357,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Automaticky updatovat aplikaci"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Interval synchronizace"
@@ -1434,6 +1456,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Neplatná hodnota: \"%s\". Přípustné hodnoty jsou: %s."
#, fuzzy
msgid "General"
msgstr "Obecná nastavení"
#, fuzzy
msgid "Synchronisation"
msgstr "Stav synchronizace"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Zápisníky"
#, fuzzy
msgid "Application"
msgstr "Ukončí aplikaci."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1634,10 +1675,25 @@ msgstr ""
msgid "Joplin website"
msgstr "Web Joplinu"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Web Joplinu"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "K smazání: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Přihlásit se pomocí OneDrive"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "Master heslo %s"
@@ -1708,6 +1764,10 @@ msgstr "Konvertovat na poznámku"
msgid "Convert to todo"
msgstr "Konvertovat na todo"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Hide metadata"
msgstr "Schovat metadata"
@@ -1742,6 +1802,27 @@ msgstr "Nemáte žádný zápisník. Vytvořte jeden kliknutím na tlačítko (+
msgid "Welcome"
msgstr "Vítejte"
#~ msgid "Add or remove tags"
#~ msgstr "Přidat či odebrat tagy"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Kopírovat"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Přepnout mezi poznámkou a to-do"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Přepnout mezi poznámkou a to-do"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Přepnout mezi poznámkou a to-do"
#~ msgid "Delete notes?"
#~ msgstr "Smazat poznámky?"
#~ msgid "State: %s."
#~ msgstr "Stav: %s."

View File

@@ -576,6 +576,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Eksporterer til \"%s\" som \"%s\"-format. Vent venligst..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Notesbogs titel:"
#, fuzzy
msgid "Note body"
msgstr "Notesbøger"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importerer fra \"%s\" som \"%s\"-format. Vent venligst..."
@@ -633,6 +647,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -655,6 +672,10 @@ msgstr ""
msgid "Toggle editor layout"
msgstr "Skift editor layout"
#, fuzzy
msgid "Focus"
msgstr "Fokuser på brødtekst"
msgid "Tools"
msgstr "Værktøjer"
@@ -705,9 +726,21 @@ msgstr "Fortryd"
msgid "Current version is up-to-date."
msgstr "Aktuel version er nyeste."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Opdatering er til rådighed, vil du hente den nu?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Ja"
@@ -775,13 +808,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Check synkroniserings Indstillinger"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Noter og indstillinger er gemt i: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Check synkroniserings Indstillinger"
msgid "Apply"
msgstr ""
@@ -875,6 +911,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Kryptering er:"
#, fuzzy
msgid "Usage"
msgstr "Forbrug: %s"
msgid "Back"
msgstr "Tilbage"
@@ -927,37 +967,6 @@ msgstr "Nogle emner kan ikke krypteres."
msgid "Set the password"
msgstr "Indstil kodeord"
msgid "Add or remove tags"
msgstr "Tilføj eller slet mærker"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Kopier"
msgid "Switch between note and to-do type"
msgstr "Skift mellem note- og opgave type"
#, fuzzy
msgid "Switch to note type"
msgstr "Skift mellem note- og opgave type"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Skift mellem note- og opgave type"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Delete"
msgstr "Slet"
msgid "Delete notes?"
msgstr "Slet noter?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Der er ingen noter her. Opret en ved at klikke på \"Ny note\"."
@@ -1003,6 +1012,9 @@ msgid ""
"note."
msgstr "Denne note er tom. Klik på \"%s\" for at starte editor og rette noten."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1097,6 +1109,9 @@ msgstr "Slet denne markering fra alle noter?"
msgid "Remove this search from the sidebar?"
msgstr "Slet denne søgning fra sidebjælke?"
msgid "Delete"
msgstr "Slet"
msgid "Rename"
msgstr "Omdøb"
@@ -1351,6 +1366,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Automatisk app update"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Synkroniserings interval"
@@ -1443,6 +1465,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ulovlig værdi: \"%s\". Mulige valg er: %s."
#, fuzzy
msgid "General"
msgstr "Generelle indstillinger"
#, fuzzy
msgid "Synchronisation"
msgstr "Synkroniserings status"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Notesbøger"
#, fuzzy
msgid "Application"
msgstr "Forlad/luk program."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1643,10 +1684,25 @@ msgstr ""
msgid "Joplin website"
msgstr "Joplin hjemmeside"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Joplin hjemmeside"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Til sletning: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Log på med OneDrive"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "Hoved nøgle %s"
@@ -1717,6 +1773,10 @@ msgstr "Konverter til note"
msgid "Convert to todo"
msgstr "Konverter til opgave"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Hide metadata"
msgstr "Skjul metadata"
@@ -1751,6 +1811,27 @@ msgstr "Du har ingen notesbøger. Opret en ved at klikke på (+) knappen."
msgid "Welcome"
msgstr "Velkommen"
#~ msgid "Add or remove tags"
#~ msgstr "Tilføj eller slet mærker"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Kopier"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Skift mellem note- og opgave type"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Skift mellem note- og opgave type"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Skift mellem note- og opgave type"
#~ msgid "Delete notes?"
#~ msgstr "Slet noter?"
#~ msgid "State: %s."
#~ msgstr "Tilstand: %s."

View File

@@ -472,10 +472,10 @@ msgid "Starting synchronisation..."
msgstr "Starte Synchronisation..."
msgid "Downloading resources..."
msgstr ""
msgstr "Lade Anhänge herunter..."
msgid "Cancelling... Please wait."
msgstr "Abbrechen Bitte warten."
msgstr "Abbrechen... Bitte warten."
msgid ""
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
@@ -598,9 +598,23 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exportiere „%s“ ins „%s“ Format. Bitte warten..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Notizbuch-Titel:"
#, fuzzy
msgid "Note body"
msgstr "Notizbücher"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten"
msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten..."
msgid "PDF File"
msgstr "PDF-Datei"
@@ -654,6 +668,9 @@ msgstr "Fett"
msgid "Italic"
msgstr "Kursiv"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "Datum / Uhrzeit einfügen"
@@ -663,19 +680,22 @@ msgstr "Im externen Editor bearbeiten"
msgid "Search in all the notes"
msgstr "Alle Notizen durchsuchen"
#, fuzzy
msgid "Search in current note"
msgstr "Alle Notizen durchsuchen"
msgstr "Aktuelle Notiz durchsuchen"
msgid "View"
msgstr "Ansicht"
msgid "Toggle sidebar"
msgstr "Seitenleiste ein/aus"
msgstr "Seitenleiste umschalten"
msgid "Toggle editor layout"
msgstr "Editor-Layout umschalten"
#, fuzzy
msgid "Focus"
msgstr "Fokussiere Inhalt"
msgid "Tools"
msgstr "Werkzeuge"
@@ -701,7 +721,7 @@ msgid "Make a donation"
msgstr "Spenden"
msgid "Check for updates..."
msgstr "Überprüfe auf Updates…"
msgstr "Überprüfe auf Aktualisierungen..."
msgid "About Joplin"
msgstr "Über Joplin"
@@ -724,10 +744,23 @@ msgid "Cancel"
msgstr "Abbrechen"
msgid "Current version is up-to-date."
msgstr "Die aktuelle Version ist up-to-date."
msgstr "Die aktuelle Version ist auf dem neuesten Stand."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Es ist ein Update verfügbar. Soll es jetzt heruntergeladen werden?"
msgstr ""
"Es ist eine Aktualisierung verfügbar. Soll sie jetzt heruntergeladen werden?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Ja"
@@ -805,13 +838,16 @@ msgstr ""
"Dieses Autorisierung-Token wird nur benötigt, um Drittanbieter-Anwendungen "
"Zugriff auf Joplin zu gewähren."
msgid "Check synchronisation configuration"
msgstr "Überprüfen der Synchronisationseinstellungen"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Notizen und Einstellungen werden gespeichert in: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Überprüfen der Synchronisationseinstellungen"
msgid "Apply"
msgstr "Anwenden"
@@ -883,7 +919,7 @@ msgstr ""
"Notizbücher ursprünglich verschlüsselt wurden."
msgid "Missing Master Keys"
msgstr "Fehlender Hauptschlüssel"
msgstr "Fehlende Hauptschlüssel"
msgid ""
"The master keys with these IDs are used to encrypt some of your items, "
@@ -905,6 +941,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Die Verschlüsselung ist:"
#, fuzzy
msgid "Usage"
msgstr "Nutzung: %s"
msgid "Back"
msgstr "Zurück"
@@ -957,34 +997,6 @@ msgstr "Einige Objekte können nicht entschlüsselt werden."
msgid "Set the password"
msgstr "Setze ein Passwort"
msgid "Add or remove tags"
msgstr "Schlagwörter hinzufügen oder entfernen"
msgid "Duplicate"
msgstr "Duplizieren"
#, javascript-format
msgid "%s - Copy"
msgstr "%s kopieren"
msgid "Switch between note and to-do type"
msgstr "Zwischen Notiz und To-Do Typ wechseln"
msgid "Switch to note type"
msgstr "Zu Notiz-Typ wechseln"
msgid "Switch to to-do type"
msgstr "Zu To-Do-Typ wechseln"
msgid "Copy Markdown link"
msgstr "Markdown-Link kopieren"
msgid "Delete"
msgstr "Löschen"
msgid "Delete notes?"
msgstr "Notizen löschen?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr ""
"Keine Notizen vorhanden. Erstelle eine, indem du auf \"Neue Notiz\" drückst."
@@ -1023,6 +1035,7 @@ msgstr "Link-Adresse kopieren"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
"Dieser Anhang wurde nicht heruntergeladen oder noch nicht entschlüsselt."
#, javascript-format
msgid "Unsupported link or message: %s"
@@ -1036,6 +1049,9 @@ msgstr ""
"Diese Notiz hat keinen Inhalt. Klicke auf „%s“ um den Editor zu aktivieren "
"und die Notiz zu bearbeiten."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "Fetter Text"
@@ -1128,6 +1144,9 @@ msgstr "Dieses Schlagwort von allen Notizen entfernen?"
msgid "Remove this search from the sidebar?"
msgstr "Diese Suche von der Seitenleiste entfernen?"
msgid "Delete"
msgstr "Löschen"
msgid "Rename"
msgstr "Umbenennen"
@@ -1141,9 +1160,9 @@ msgstr "Notizbücher"
msgid "Decrypting items: %d/%d"
msgstr "Entschlüsselte Objekte: %d/%d"
#, fuzzy, javascript-format
#, javascript-format
msgid "Fetching resources: %d"
msgstr "Anhänge: %d."
msgstr "Ressourcen abrufen: %d"
msgid "Please select where the sync status should be exported to"
msgstr ""
@@ -1354,6 +1373,9 @@ msgid ""
"this setting so that your notes are constantly being synchronised, thus "
"reducing the number of conflicts."
msgstr ""
"Dadurch kann Joplin im Hintergrund laufen. Es wird empfohlen,diese "
"Einstellung zu aktivieren, damit deine Notizen ständig synchronisiertwerden "
"und somit die Anzahl der Konflikte reduziert wird."
msgid "Start application minimised in the tray icon"
msgstr "Starte die Anwendung minimiert im Tray"
@@ -1361,12 +1383,11 @@ msgstr "Starte die Anwendung minimiert im Tray"
msgid "Global zoom percentage"
msgstr "Zoomstufe der Benutzeroberfläche"
#, fuzzy
msgid "Editor font size"
msgstr "Editor Schriftenfamilie"
msgstr "Schriftgröße im Editor"
msgid "Editor font family"
msgstr "Editor Schriftenfamilie"
msgstr "Schriftfamilie im Editor"
msgid ""
"This must be *monospace* font or it will not work properly. If the font is "
@@ -1379,6 +1400,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Die Applikation automatisch aktualisieren"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Synchronisationsinterval"
@@ -1478,6 +1506,26 @@ msgstr "Ignoriere TLS-Zertifikatfehler"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ungültiger Optionswert: \"%s\". Mögliche Werte sind: %s."
#, fuzzy
msgid "General"
msgstr "Allgemeine Einstellungen"
#, fuzzy
msgid "Synchronisation"
msgstr "Status der Synchronisation"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Notizbücher"
# Please note: The term 'Location' is assumed to be the geographical location where the note has been created. For this the german word 'Standort' fits better than the previously used 'Ablageort'. The latter one is used for the folder where files are stored.
#, fuzzy
msgid "Application"
msgstr "Standort"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1495,9 +1543,8 @@ msgstr "Joplin Export Verzeichnis"
msgid "Evernote Export File"
msgstr "Evernote Export Datei"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin Export Verzeichnis"
msgstr "Json Export Verzeichnis"
msgid "Directory"
msgstr "Verzeichnis"
@@ -1575,10 +1622,10 @@ msgid "On %s: %s"
msgstr "Auf %s: %s"
msgid "Permission to use camera"
msgstr ""
msgstr "Berechtigung zur Verwendung der Kamera"
msgid "Your permission to use your camera is required."
msgstr ""
msgstr "Deine Zustimmung zur Verwendung deiner Kamera ist erforderlich."
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
@@ -1691,9 +1738,24 @@ msgstr ""
msgid "Joplin website"
msgstr "Website von Joplin"
#, javascript-format
msgid "Joplin v%s"
msgstr "Joplin v%s"
#, javascript-format
msgid "Database v%s"
msgstr "Datenbank v%s"
#, javascript-format
msgid "FTS enabled: %d"
msgstr "FTS aktiviert: %d"
msgid "Login with Dropbox"
msgstr "Mit Dropbox anmelden"
msgid "Enter code here"
msgstr "Hier Code eingeben"
#, javascript-format
msgid "Master Key %s"
msgstr "Hauptschlüssel %s"
@@ -1746,9 +1808,8 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Nicht unterstütztes Fotoformat: %s"
#, fuzzy
msgid "Take photo"
msgstr "Foto anhängen"
msgstr "Foto aufnehmen"
msgid "Attach photo"
msgstr "Foto anhängen"
@@ -1765,6 +1826,9 @@ msgstr "In eine Notiz umwandeln"
msgid "Convert to todo"
msgstr "In ein To-Do umwandeln"
msgid "Copy Markdown link"
msgstr "Markdown-Link kopieren"
msgid "Hide metadata"
msgstr "Metadaten verstecken"
@@ -1775,7 +1839,7 @@ msgid "View on map"
msgstr "Auf der Karte anzeigen"
msgid "Go to source URL"
msgstr ""
msgstr "Zur Quell-URL gehen"
msgid "Delete notebook"
msgstr "Notizbuch löschen"
@@ -1802,6 +1866,27 @@ msgstr ""
msgid "Welcome"
msgstr "Willkommen"
#~ msgid "Add or remove tags"
#~ msgstr "Schlagwörter hinzufügen oder entfernen"
#~ msgid "Duplicate"
#~ msgstr "Duplizieren"
#~ msgid "%s - Copy"
#~ msgstr "%s - Kopieren"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Zwischen Notiz und To-Do Typ wechseln"
#~ msgid "Switch to note type"
#~ msgstr "Zu Notiz-Typ wechseln"
#~ msgid "Switch to to-do type"
#~ msgstr "Zu To-Do-Typ wechseln"
#~ msgid "Delete notes?"
#~ msgstr "Notizen löschen?"
#~ msgid "State: %s."
#~ msgstr "Status: %s."
@@ -1845,9 +1930,6 @@ msgstr "Willkommen"
#~ msgid "Give focus to previous pane"
#~ msgstr "Das vorherige Fenster fokussieren"
#~ msgid "Enter command line mode"
#~ msgstr "Zum Terminal-Modus wechseln"
#~ msgid "Exit command line mode"
#~ msgstr "Den Terminal-Modus verlassen"
@@ -1866,7 +1948,6 @@ msgstr "Willkommen"
#~ msgid "Set a to-do as completed / not completed"
#~ msgstr "Ein To-Do als abgeschlossen / nicht abgeschlossen markieren"
#, fuzzy
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
#~ msgstr ""
#~ "Schal[t]e das Terminal zwischen maximiert/minimiert/versteckt/sichtbar um."

View File

@@ -508,6 +508,18 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr ""
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
msgid "Note title"
msgstr ""
msgid "Note body"
msgstr ""
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr ""
@@ -564,6 +576,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -585,6 +600,9 @@ msgstr ""
msgid "Toggle editor layout"
msgstr ""
msgid "Focus"
msgstr ""
msgid "Tools"
msgstr ""
@@ -635,9 +653,21 @@ msgstr ""
msgid "Current version is up-to-date."
msgstr ""
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr ""
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr ""
@@ -704,13 +734,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr ""
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr ""
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr ""
msgid "Apply"
msgstr ""
@@ -789,6 +822,9 @@ msgstr ""
msgid "Encryption is:"
msgstr ""
msgid "Usage"
msgstr ""
msgid "Back"
msgstr ""
@@ -839,34 +875,6 @@ msgstr ""
msgid "Set the password"
msgstr ""
msgid "Add or remove tags"
msgstr ""
msgid "Duplicate"
msgstr ""
#, javascript-format
msgid "%s - Copy"
msgstr ""
msgid "Switch between note and to-do type"
msgstr ""
msgid "Switch to note type"
msgstr ""
msgid "Switch to to-do type"
msgstr ""
msgid "Copy Markdown link"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Delete notes?"
msgstr ""
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr ""
@@ -912,6 +920,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1004,6 +1015,9 @@ msgstr ""
msgid "Remove this search from the sidebar?"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Rename"
msgstr ""
@@ -1241,6 +1255,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr ""
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr ""
@@ -1325,6 +1346,21 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr ""
msgid "General"
msgstr ""
msgid "Synchronisation"
msgstr ""
msgid "Appearance"
msgstr ""
msgid "Note"
msgstr ""
msgid "Application"
msgstr ""
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1514,9 +1550,24 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, javascript-format
msgid "Joplin v%s"
msgstr ""
#, javascript-format
msgid "Database v%s"
msgstr ""
#, javascript-format
msgid "FTS enabled: %d"
msgstr ""
msgid "Login with Dropbox"
msgstr ""
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr ""
@@ -1586,6 +1637,9 @@ msgstr ""
msgid "Convert to todo"
msgstr ""
msgid "Copy Markdown link"
msgstr ""
msgid "Hide metadata"
msgstr ""

View File

@@ -585,6 +585,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exportando el formato de \"%s\" a \"%s\". Por favor espere..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Título de libreta:"
#, fuzzy
msgid "Note body"
msgstr "Libretas"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importando el formato de \"%s\" a \"%s\". Por favor espere..."
@@ -642,6 +656,9 @@ msgstr "Negrita"
msgid "Italic"
msgstr "Cursiva"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "Introduce fecha"
@@ -664,6 +681,10 @@ msgstr "Cambia la barra lateral"
msgid "Toggle editor layout"
msgstr "Cambia el diseño del editor"
#, fuzzy
msgid "Focus"
msgstr "Foco en el cuerpo"
msgid "Tools"
msgstr "Herramientas"
@@ -714,9 +735,21 @@ msgstr "Cancelar"
msgid "Current version is up-to-date."
msgstr "La versión actual está actualizada."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Hay disponible una actualización. ¿Quiere descargarla ahora?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Sí"
@@ -791,13 +824,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Comprobar sincronización"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Las notas y los ajustes se guardan en: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Comprobar sincronización"
msgid "Apply"
msgstr "Aplicar"
@@ -891,6 +927,10 @@ msgstr "Estado"
msgid "Encryption is:"
msgstr "El cifrado está:"
#, fuzzy
msgid "Usage"
msgstr "Uso: %s"
msgid "Back"
msgstr "Atrás"
@@ -941,36 +981,6 @@ msgstr "No se han podido descifrar algunos elementos."
msgid "Set the password"
msgstr "Establecer la contraseña"
msgid "Add or remove tags"
msgstr "Añadir o borrar etiquetas"
msgid "Duplicate"
msgstr "Duplicado"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - Copiar"
msgid "Switch between note and to-do type"
msgstr "Cambiar entre nota y lista de tareas"
#, fuzzy
msgid "Switch to note type"
msgstr "Cambiar entre nota y lista de tareas"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Cambiar entre nota y lista de tareas"
msgid "Copy Markdown link"
msgstr "Copiar el enlace de Markdown"
msgid "Delete"
msgstr "Eliminar"
msgid "Delete notes?"
msgstr "¿Desea eliminar notas?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "No hay ninguna nota. Cree una pulsando «Nota nueva»."
@@ -1018,6 +1028,9 @@ msgstr ""
"Esta nota no tiene contenido. Pulse en \"%s\" para cambiar al editor y "
"editar la nota."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "texto destacado"
@@ -1110,6 +1123,9 @@ msgstr "¿Desea eliminar esta etiqueta de todas las notas?"
msgid "Remove this search from the sidebar?"
msgstr "¿Desea eliminar esta búsqueda de la barra lateral?"
msgid "Delete"
msgstr "Eliminar"
msgid "Rename"
msgstr "Renombrar"
@@ -1360,6 +1376,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Actualizar la aplicación automáticamente"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Intervalo de sincronización"
@@ -1457,6 +1480,25 @@ msgstr "Ignorar errores en certificados TLS"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Opción inválida: «%s». Los valores posibles son: %s."
#, fuzzy
msgid "General"
msgstr "Opciones generales"
#, fuzzy
msgid "Synchronisation"
msgstr "Estado de la sincronización"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Libretas"
#, fuzzy
msgid "Application"
msgstr "Salir de la aplicación."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1663,9 +1705,25 @@ msgstr ""
msgid "Joplin website"
msgstr "Sitio web de Joplin"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Sitio web de Joplin"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Borrar: %d"
msgid "Login with Dropbox"
msgstr "Acceder con Dropbox"
#, fuzzy
msgid "Enter code here"
msgstr "Entrar en modo línea de comandos"
#, javascript-format
msgid "Master Key %s"
msgstr "Clave maestra %s"
@@ -1737,6 +1795,9 @@ msgstr "Convertir a nota"
msgid "Convert to todo"
msgstr "Convertir a lista de tareas"
msgid "Copy Markdown link"
msgstr "Copiar el enlace de Markdown"
msgid "Hide metadata"
msgstr "Ocultar metadatos"
@@ -1772,6 +1833,29 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenido"
#~ msgid "Add or remove tags"
#~ msgstr "Añadir o borrar etiquetas"
#~ msgid "Duplicate"
#~ msgstr "Duplicado"
#~ msgid "%s - Copy"
#~ msgstr "%s - Copiar"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Cambiar entre nota y lista de tareas"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Cambiar entre nota y lista de tareas"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Cambiar entre nota y lista de tareas"
#~ msgid "Delete notes?"
#~ msgstr "¿Desea eliminar notas?"
#~ msgid "State: %s."
#~ msgstr "Estado: «%s»."
@@ -1822,9 +1906,6 @@ msgstr "Bienvenido"
#~ msgid "Give focus to previous pane"
#~ msgstr "Enfocar el panel anterior"
#~ msgid "Enter command line mode"
#~ msgstr "Entrar en modo línea de comandos"
#~ msgid "Exit command line mode"
#~ msgstr "Salir del modo línea de comandos"
@@ -1834,9 +1915,6 @@ msgstr "Bienvenido"
#~ msgid "Cancel the current command."
#~ msgstr "Cancelar el comando actual."
#~ msgid "Exit the application."
#~ msgstr "Salir de la aplicación."
#~ msgid "Delete the currently selected note or notebook."
#~ msgstr "Eliminar la nota o libreta seleccionada."

View File

@@ -582,6 +582,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr ""
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Koadernoaren izenburua: "
#, fuzzy
msgid "Note body"
msgstr "Koadernoak"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr ""
@@ -641,6 +655,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -663,6 +680,9 @@ msgstr ""
msgid "Toggle editor layout"
msgstr ""
msgid "Focus"
msgstr ""
msgid "Tools"
msgstr "Tresnak"
@@ -714,9 +734,21 @@ msgstr "Utzi"
msgid "Current version is up-to-date."
msgstr ""
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr ""
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr ""
@@ -785,14 +817,17 @@ msgid ""
"access Joplin."
msgstr ""
#, fuzzy
msgid "Check synchronisation configuration"
msgstr "Sinkronizazioa utzi"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Oharrak eta ezarpenak hemen daude gordeta: %s"
msgid "Browse..."
msgstr ""
#, fuzzy
msgid "Check synchronisation configuration"
msgstr "Sinkronizazioa utzi"
msgid "Apply"
msgstr ""
@@ -883,6 +918,10 @@ msgstr "Egoera"
msgid "Encryption is:"
msgstr "Zifratua da:"
#, fuzzy
msgid "Usage"
msgstr "Erabili: %s"
msgid "Back"
msgstr "Atzera"
@@ -937,36 +976,6 @@ msgstr "Zenbait item ezin dira deszifratu."
msgid "Set the password"
msgstr "Ezarri pasahitza"
msgid "Add or remove tags"
msgstr "Gehitu edo ezabatu etiketak"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Kopiatu"
msgid "Switch between note and to-do type"
msgstr "Aldatu oharra eta zeregin eren artean."
#, fuzzy
msgid "Switch to note type"
msgstr "Aldatu oharra eta zeregin eren artean."
#, fuzzy
msgid "Switch to to-do type"
msgstr "Aldatu oharra eta zeregin eren artean."
msgid "Copy Markdown link"
msgstr ""
msgid "Delete"
msgstr "Ezabatu"
msgid "Delete notes?"
msgstr "Oharrak ezabatu?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Hemen ez dago oharrik. Sortu bat \"Ohar berria\" sakatuta."
@@ -1013,6 +1022,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1110,6 +1122,9 @@ msgstr "Kendu etiketa hori ohar guztietatik?"
msgid "Remove this search from the sidebar?"
msgstr "Kendu bilaketa hori ohar guztietatik?"
msgid "Delete"
msgstr "Ezabatu"
msgid "Rename"
msgstr "Berrizendatu"
@@ -1369,6 +1384,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Automatikoki eguneratu aplikazioa"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Sinkronizazio tartea"
@@ -1464,6 +1486,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Balio aukera baliogabea: \"%s\". Litezkeen balioak: %s."
#, fuzzy
msgid "General"
msgstr "Ezarpenak"
#, fuzzy
msgid "Synchronisation"
msgstr "Sinkronizazioaren egoera"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Koadernoak"
#, fuzzy
msgid "Application"
msgstr "Irten aplikaziotik"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1664,10 +1705,26 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, javascript-format
msgid "Joplin v%s"
msgstr ""
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Ezabatzeko: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Login with OneDrive"
#, fuzzy
msgid "Enter code here"
msgstr "Sartu komando-lerro moduan "
#, javascript-format
msgid "Master Key %s"
msgstr "Pasahitz Nagusia %s"
@@ -1738,6 +1795,9 @@ msgstr "Oharra bihurtu"
msgid "Convert to todo"
msgstr "Zeregina bihurtu"
msgid "Copy Markdown link"
msgstr ""
msgid "Hide metadata"
msgstr "Ezkutatu metadatuak"
@@ -1772,6 +1832,27 @@ msgstr "Oraindik ez duzu koadernorik. Sortu bat (+) botoian sakatuta."
msgid "Welcome"
msgstr "Ongi etorri!"
#~ msgid "Add or remove tags"
#~ msgstr "Gehitu edo ezabatu etiketak"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Kopiatu"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Aldatu oharra eta zeregin eren artean."
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Aldatu oharra eta zeregin eren artean."
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Aldatu oharra eta zeregin eren artean."
#~ msgid "Delete notes?"
#~ msgstr "Oharrak ezabatu?"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Egoera: \"%s\"."
@@ -1814,9 +1895,6 @@ msgstr "Ongi etorri!"
#~ msgid "Give focus to previous pane"
#~ msgstr "Eraman fokua aurreko panelera"
#~ msgid "Enter command line mode"
#~ msgstr "Sartu komando-lerro moduan "
#~ msgid "Exit command line mode"
#~ msgstr "Irten komando-lerro modutik"
@@ -1826,9 +1904,6 @@ msgstr "Ongi etorri!"
#~ msgid "Cancel the current command."
#~ msgstr "Utzi uneko komandoa"
#~ msgid "Exit the application."
#~ msgstr "Irten aplikaziotik"
#~ msgid "Delete the currently selected note or notebook."
#~ msgstr "Ezabatu aukeratutako oharra edo koadernoa"

View File

@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.3\n"
"X-Generator: Poedit 2.2.1\n"
msgid "To delete a tag, untag the associated notes."
msgstr "Pour supprimer une vignette, enlever là des notes associées."
@@ -583,6 +583,18 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exporter vers \"%s\" au format \"%s\". Veuillez patienter..."
msgid "Sidebar"
msgstr "Barre latérale"
msgid "Note list"
msgstr "Liste de notes"
msgid "Note title"
msgstr "Titre de la note"
msgid "Note body"
msgstr "Corps de la note"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importer depuis \"%s\" au format \"%s\". Veuillez patienter..."
@@ -639,6 +651,9 @@ msgstr "Gras"
msgid "Italic"
msgstr "Italique"
msgid "Link"
msgstr "Lien"
msgid "Insert Date Time"
msgstr "Insérer la date et l'heure"
@@ -660,6 +675,9 @@ msgstr "Basculer barre latérale"
msgid "Toggle editor layout"
msgstr "Basculer l'agencement de l'éditeur"
msgid "Focus"
msgstr "Naviguer"
msgid "Tools"
msgstr "Outils"
@@ -710,10 +728,22 @@ msgstr "Annuler"
msgid "Current version is up-to-date."
msgstr "La version actuelle est à jour."
#, javascript-format
msgid "%s (pre-release)"
msgstr "%s (pré-release)"
msgid "An update is available, do you want to download it now?"
msgstr ""
"Une mise à jour est disponible, souhaitez vous la télécharger maintenant ?"
#, javascript-format
msgid "Your version: v%s"
msgstr "Votre version : v%s"
#, javascript-format
msgid "New version: v%s"
msgstr "Nouvelle version : v%s"
msgid "Yes"
msgstr "Oui"
@@ -789,13 +819,16 @@ msgstr ""
"Ce code d'authentification est nécessaire uniquement pour permettre aux "
"logiciels tiers d'accéder aux données de Joplin."
msgid "Check synchronisation configuration"
msgstr "Vérifier config synchronisation"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Les notes et paramètres se trouve dans : %s"
msgid "Browse..."
msgstr "Parcourir…"
msgid "Check synchronisation configuration"
msgstr "Vérifier config synchronisation"
msgid "Apply"
msgstr "Appliquer"
@@ -891,6 +924,9 @@ msgstr "État"
msgid "Encryption is:"
msgstr "Le chiffrement est :"
msgid "Usage"
msgstr "Utilisation"
msgid "Back"
msgstr "Retour"
@@ -943,34 +979,6 @@ msgstr "Certains objets ne peuvent être déchiffrés."
msgid "Set the password"
msgstr "Définir le mot de passe"
msgid "Add or remove tags"
msgstr "Gérer les étiquettes"
msgid "Duplicate"
msgstr "Dupliquer"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - Copie"
msgid "Switch between note and to-do type"
msgstr "Alterner entre note et tâche"
msgid "Switch to note type"
msgstr "Convertir en note"
msgid "Switch to to-do type"
msgstr "Convertir en tâche"
msgid "Copy Markdown link"
msgstr "Copier lien Markdown"
msgid "Delete"
msgstr "Supprimer"
msgid "Delete notes?"
msgstr "Supprimer les notes ?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr ""
"Pas de notes ici. Créez-en une en pressant le bouton \"Nouvelle note\"."
@@ -1021,6 +1029,11 @@ msgstr ""
"Cette note n'a pas de contenu. Cliquer sur \"%s\" pour basculer vers "
"l'éditeur et éditer cette note."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
"Les notes ne peuvent être imprimées ou exportées en PDF qu'une seule à la "
"fois."
msgid "strong text"
msgstr "texte en gras"
@@ -1113,6 +1126,9 @@ msgstr "Enlever cette étiquette de toutes les notes ?"
msgid "Remove this search from the sidebar?"
msgstr "Enlever cette recherche de la barre latérale ?"
msgid "Delete"
msgstr "Supprimer"
msgid "Rename"
msgstr "Renommer"
@@ -1365,6 +1381,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Mettre à jour le logiciel automatiquement"
msgid "Get pre-releases when checking for updates"
msgstr "Recevoir les pré-release lors de la vérification des mises à jour"
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr "Voir la page des pré-release pour plus de détails : %s"
msgid "Synchronisation interval"
msgstr "Intervalle de synchronisation"
@@ -1464,6 +1487,21 @@ msgstr "Ignorer les erreurs de certificats TLS"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Option invalide: \"%s\". Les valeurs possibles sont : %s."
msgid "General"
msgstr "Général"
msgid "Synchronisation"
msgstr "Synchronisation"
msgid "Appearance"
msgstr "Apparence"
msgid "Note"
msgstr "Note"
msgid "Application"
msgstr "Application"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr "L'étiquette \"%s\" existe déjà. Veuillez choisir un autre nom."
@@ -1673,9 +1711,24 @@ msgstr "- Position : Pour attacher à une note les coordonnées GPS."
msgid "Joplin website"
msgstr "Site web de Joplin"
#, javascript-format
msgid "Joplin v%s"
msgstr "Joplin v%s"
#, javascript-format
msgid "Database v%s"
msgstr "Base de données v%s"
#, javascript-format
msgid "FTS enabled: %d"
msgstr "FTS activé : %d"
msgid "Login with Dropbox"
msgstr "Se connecter à Dropbox"
msgid "Enter code here"
msgstr "Entrez le code ici"
#, javascript-format
msgid "Master Key %s"
msgstr "Clef maître %s"
@@ -1746,6 +1799,9 @@ msgstr "Convertir en note"
msgid "Convert to todo"
msgstr "Convertir en tâche"
msgid "Copy Markdown link"
msgstr "Copier lien Markdown"
msgid "Hide metadata"
msgstr "Cacher les métadonnées"
@@ -1782,6 +1838,27 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenue"
#~ msgid "Add or remove tags"
#~ msgstr "Gérer les étiquettes"
#~ msgid "Duplicate"
#~ msgstr "Dupliquer"
#~ msgid "%s - Copy"
#~ msgstr "%s - Copie"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Alterner entre note et tâche"
#~ msgid "Switch to note type"
#~ msgstr "Convertir en note"
#~ msgid "Switch to to-do type"
#~ msgstr "Convertir en tâche"
#~ msgid "Delete notes?"
#~ msgstr "Supprimer les notes ?"
#~ msgid "State: %s."
#~ msgstr "État : %s."
@@ -1832,9 +1909,6 @@ msgstr "Bienvenue"
#~ msgid "Give focus to previous pane"
#~ msgstr "Activer le volet précédent"
#~ msgid "Enter command line mode"
#~ msgstr "Démarrer le mode de ligne de commande"
#~ msgid "Exit command line mode"
#~ msgstr "Sortir du mode de ligne de commande"

View File

@@ -576,6 +576,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exportando a «%s» como formato «%s». Agarde..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Título do caderno:"
#, fuzzy
msgid "Note body"
msgstr "Cadernos"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importando de «%s» como formato «%s». Agarde..."
@@ -633,6 +647,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -655,6 +672,10 @@ msgstr ""
msgid "Toggle editor layout"
msgstr "Cambiar a disposición do editor"
#, fuzzy
msgid "Focus"
msgstr "Focar no corpo"
msgid "Tools"
msgstr "Ferramentas"
@@ -705,9 +726,21 @@ msgstr "Cancelar"
msgid "Current version is up-to-date."
msgstr "A versión actual está actualizada."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Hai unha actualización dispoñíbel, desexa descargala agora?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Si"
@@ -775,13 +808,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Comprobar a configuración da sincronización"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "As notas e axustes gardáronse en: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Comprobar a configuración da sincronización"
msgid "Apply"
msgstr ""
@@ -873,6 +909,10 @@ msgstr "Estado"
msgid "Encryption is:"
msgstr "O cifrado é:"
#, fuzzy
msgid "Usage"
msgstr "Uso: %s"
msgid "Back"
msgstr "Anterior"
@@ -924,37 +964,6 @@ msgstr "Non é posíbel descifrar algúns elementos."
msgid "Set the password"
msgstr "Estabelecer un contrasinal"
msgid "Add or remove tags"
msgstr "Engadir ou eliminar etiquetas"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Copiar"
msgid "Switch between note and to-do type"
msgstr "Cambiar entre notas e tarefas"
#, fuzzy
msgid "Switch to note type"
msgstr "Cambiar entre notas e tarefas"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Cambiar entre notas e tarefas"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Delete"
msgstr "Eliminar"
msgid "Delete notes?"
msgstr "Desexa eliminar as notas?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Aquí non hai notas. Cree unha premendo en «Nova nota»."
@@ -1002,6 +1011,9 @@ msgstr ""
"Esta nota non ten contido. Prema en «%s» para ir ao editor e modificar a "
"nota."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1096,6 +1108,9 @@ msgstr "Desexa eliminar esta etiqueta de todas as notas?"
msgid "Remove this search from the sidebar?"
msgstr "Desexa eliminar esta busca da barra lateral?"
msgid "Delete"
msgstr "Eliminar"
msgid "Rename"
msgstr "Renomear"
@@ -1350,6 +1365,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Actualizar automaticamente o aplicativo"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Intervalo de sincronización"
@@ -1442,6 +1464,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Valor incorrecto de opción: «%s». Os valores posíbeis son: %s."
#, fuzzy
msgid "General"
msgstr "Opcións xerais"
#, fuzzy
msgid "Synchronisation"
msgstr "Estado da sincronización"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Cadernos"
#, fuzzy
msgid "Application"
msgstr "Sae do aplicativo."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1642,10 +1683,25 @@ msgstr ""
msgid "Joplin website"
msgstr "Sitio web de Joplin"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Sitio web de Joplin"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Borrar: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Acceder con OneDrive"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "Chave mestra %s"
@@ -1716,6 +1772,10 @@ msgstr "Converter para nota"
msgid "Convert to todo"
msgstr "Converter para tarefa"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Hide metadata"
msgstr "Ocultar metadados"
@@ -1750,6 +1810,27 @@ msgstr "Non ten cadernos actualmente. Cree un premendo no botón (+)."
msgid "Welcome"
msgstr "Benvido/a"
#~ msgid "Add or remove tags"
#~ msgstr "Engadir ou eliminar etiquetas"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Copiar"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Cambiar entre notas e tarefas"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Cambiar entre notas e tarefas"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Cambiar entre notas e tarefas"
#~ msgid "Delete notes?"
#~ msgstr "Desexa eliminar as notas?"
#~ msgid "State: %s."
#~ msgstr "Estado: %s."

View File

@@ -579,6 +579,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr ""
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Naslov bilježnice:"
#, fuzzy
msgid "Note body"
msgstr "Bilježnice"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr ""
@@ -638,6 +652,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -660,6 +677,10 @@ msgstr ""
msgid "Toggle editor layout"
msgstr ""
#, fuzzy
msgid "Focus"
msgstr "Naslov bilješke:"
msgid "Tools"
msgstr "Alati"
@@ -712,9 +733,21 @@ msgstr "Odustani"
msgid "Current version is up-to-date."
msgstr ""
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr ""
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr ""
@@ -783,14 +816,17 @@ msgid ""
"access Joplin."
msgstr ""
#, fuzzy
msgid "Check synchronisation configuration"
msgstr "Prekini sinkronizaciju"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Bilješke i postavke su pohranjene u: %s"
msgid "Browse..."
msgstr ""
#, fuzzy
msgid "Check synchronisation configuration"
msgstr "Prekini sinkronizaciju"
msgid "Apply"
msgstr ""
@@ -869,6 +905,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr ""
#, fuzzy
msgid "Usage"
msgstr "Korištenje: %s"
msgid "Back"
msgstr "Natrag"
@@ -924,36 +964,6 @@ msgstr "Neke stavke se ne mogu sinkronizirati."
msgid "Set the password"
msgstr ""
msgid "Add or remove tags"
msgstr "Dodaj ili makni oznake"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Kopiraj"
msgid "Switch between note and to-do type"
msgstr "Zamijeni bilješku i zadatak"
#, fuzzy
msgid "Switch to note type"
msgstr "Zamijeni bilješku i zadatak"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Zamijeni bilješku i zadatak"
msgid "Copy Markdown link"
msgstr ""
msgid "Delete"
msgstr "Obriši"
msgid "Delete notes?"
msgstr "Obriši bilješke?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Ovdje nema bilješki. Stvori novu pritiskom na \"Nova bilješka\"."
@@ -1000,6 +1010,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1096,6 +1109,9 @@ msgstr "Makni ovu oznaku iz svih bilješki?"
msgid "Remove this search from the sidebar?"
msgstr "Makni ovu pretragu iz izbornika?"
msgid "Delete"
msgstr "Obriši"
msgid "Rename"
msgstr "Preimenuj"
@@ -1351,6 +1367,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Automatsko instaliranje nove verzije"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Interval sinkronizacije"
@@ -1441,6 +1464,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Nevažeća vrijednost: \"%s\". Moguće vrijednosti su: %s."
#, fuzzy
msgid "General"
msgstr "Opcije"
#, fuzzy
msgid "Synchronisation"
msgstr "Status sinkronizacije"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Bilježnice"
#, fuzzy
msgid "Application"
msgstr "Izađi iz aplikacije."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1639,10 +1681,26 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, javascript-format
msgid "Joplin v%s"
msgstr ""
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Za brisanje: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Prijavi se u OneDrive"
#, fuzzy
msgid "Enter code here"
msgstr "Otvori naredbeni redak"
#, javascript-format
msgid "Master Key %s"
msgstr ""
@@ -1714,6 +1772,9 @@ msgstr "Pretvori u bilješku"
msgid "Convert to todo"
msgstr "Pretvori u zadatak"
msgid "Copy Markdown link"
msgstr ""
msgid "Hide metadata"
msgstr "Sakrij metapodatke"
@@ -1748,6 +1809,27 @@ msgstr "Trenutno nemaš nijednu bilježnicu. Stvori novu klikom na (+) gumb."
msgid "Welcome"
msgstr "Dobro došli"
#~ msgid "Add or remove tags"
#~ msgstr "Dodaj ili makni oznake"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Kopiraj"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Zamijeni bilješku i zadatak"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Zamijeni bilješku i zadatak"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Zamijeni bilješku i zadatak"
#~ msgid "Delete notes?"
#~ msgstr "Obriši bilješke?"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Stanje: \"%s\"."
@@ -1789,9 +1871,6 @@ msgstr "Dobro došli"
#~ msgid "Give focus to previous pane"
#~ msgstr "Fokusiraj prethodno okno"
#~ msgid "Enter command line mode"
#~ msgstr "Otvori naredbeni redak"
#~ msgid "Exit command line mode"
#~ msgstr "Napusti naredbeni redak"
@@ -1801,9 +1880,6 @@ msgstr "Dobro došli"
#~ msgid "Cancel the current command."
#~ msgstr "Prekini trenutnu naredbu."
#~ msgid "Exit the application."
#~ msgstr "Izađi iz aplikacije."
#~ msgid "Delete the currently selected note or notebook."
#~ msgstr "Obriši odabranu bilješku ili bilježnicu."

View File

@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.1.1\n"
"X-Generator: Poedit 2.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "To delete a tag, untag the associated notes."
@@ -462,7 +462,7 @@ msgid "Starting synchronisation..."
msgstr "Inizio sincronizzazione..."
msgid "Downloading resources..."
msgstr ""
msgstr "Scaricamento risorse…"
msgid "Cancelling... Please wait."
msgstr "Cancellazione... Attendere per favore."
@@ -566,6 +566,13 @@ msgid ""
"\n"
"For example, to create a notebook press `mb`; to create a note press `mn`."
msgstr ""
"Benvenuto in Joplin!\n"
"\n"
"Digita `:help shortcuts` per la lista delle scorciatoie da tastiera, oppure "
"solo `:help` per le informazioni di utilizzo.\n"
"\n"
"Per esempio, per creare un taccuino digita `mb`; per creare una nota digita "
"`mn`."
msgid ""
"One or more items are currently encrypted and you may need to supply a "
@@ -582,6 +589,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Esportazione da \"%s\" come formato \"%s\". Si prega di attendere..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Titolo del Taccuino:"
#, fuzzy
msgid "Note body"
msgstr "Taccuini"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importazione da \"%s\" come formato \"%s\". Si prega di attendere..."
@@ -629,9 +650,8 @@ msgstr "Taglia"
msgid "Paste"
msgstr "Incolla"
#, fuzzy
msgid "Select all"
msgstr "Seleziona la data"
msgstr "Seleziona tutto"
msgid "Bold"
msgstr "Grasseto"
@@ -639,6 +659,9 @@ msgstr "Grasseto"
msgid "Italic"
msgstr "Corsivo"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "Inserisci data e ora"
@@ -648,9 +671,8 @@ msgstr "Modifica in un editor esterno"
msgid "Search in all the notes"
msgstr "Cerca in tutte le note"
#, fuzzy
msgid "Search in current note"
msgstr "Cerca in tutte le note"
msgstr "Cerca nella nota corrente"
msgid "View"
msgstr "Vista"
@@ -661,6 +683,10 @@ msgstr "Attiva / disattiva barra laterale"
msgid "Toggle editor layout"
msgstr "Attiva / disattiva il layout dell'editor"
#, fuzzy
msgid "Focus"
msgstr "Focus sul testo"
msgid "Tools"
msgstr "Strumenti"
@@ -711,9 +737,21 @@ msgstr "Cancella"
msgid "Current version is up-to-date."
msgstr "La versione attuale è aggiornata."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "È disponibile un aggiornamento, vuoi scaricarlo ora?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Sì"
@@ -787,13 +825,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Controlla la configurazione della sincronizzazione"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Le note e le impostazioni sono memorizzate in: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Controlla la configurazione della sincronizzazione"
msgid "Apply"
msgstr "Applica"
@@ -889,6 +930,10 @@ msgstr "Stato"
msgid "Encryption is:"
msgstr "La crittografia è:"
#, fuzzy
msgid "Usage"
msgstr "Uso: %s"
msgid "Back"
msgstr "Indietro"
@@ -939,36 +984,6 @@ msgstr "Alcuni elementi non possono essere decodificati."
msgid "Set the password"
msgstr "Imposta la password"
msgid "Add or remove tags"
msgstr "Aggiungi o rimuovi etichetta"
msgid "Duplicate"
msgstr "Duplicare"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - Copia"
msgid "Switch between note and to-do type"
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
#, fuzzy
msgid "Switch to note type"
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
msgid "Copy Markdown link"
msgstr "Copia il link Markdown"
msgid "Delete"
msgstr "Elimina"
msgid "Delete notes?"
msgstr "Eliminare le note?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Non è presente nessuna nota. Creane una cliccando \"Nuova nota\"."
@@ -1004,7 +1019,7 @@ msgid "Copy Link Address"
msgstr "Copia l'indirizzo del link"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
msgstr "Questo allegato non è ancora stato scaricato o decriptato."
#, javascript-format
msgid "Unsupported link or message: %s"
@@ -1018,6 +1033,9 @@ msgstr ""
"Questa nota non ha contenuto. Fai clic su \"%s\" per attivare l'editor e "
"modificare la nota."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "Testo grasseto"
@@ -1111,6 +1129,9 @@ msgstr "Rimuovere questa etichetta da tutte le note?"
msgid "Remove this search from the sidebar?"
msgstr "Rimuovere questa ricerca dalla barra laterale?"
msgid "Delete"
msgstr "Elimina"
msgid "Rename"
msgstr "Rinomina"
@@ -1316,10 +1337,10 @@ msgid "When creating a new to-do:"
msgstr "Quando crei un nuovo \"Cose-da-fare\":"
msgid "Focus title"
msgstr ""
msgstr "Focus sul titolo"
msgid "Focus body"
msgstr ""
msgstr "Focus sul testo"
msgid "When creating a new note:"
msgstr "Quando si crea una nuova nota:"
@@ -1335,6 +1356,9 @@ msgid ""
"this setting so that your notes are constantly being synchronised, thus "
"reducing the number of conflicts."
msgstr ""
"Questo consentirà Joplin di essere in esecuzione in background. E’ "
"raccomandata l’attivazione di questa impostazione per sincronizzare "
"costantemente le tue note e quindi ridurre il numero di conflitti."
msgid "Start application minimised in the tray icon"
msgstr ""
@@ -1342,12 +1366,11 @@ msgstr ""
msgid "Global zoom percentage"
msgstr "Percentuale di zoom globale"
#, fuzzy
msgid "Editor font size"
msgstr "Editor Famiglia Caratteri"
msgstr "Editor dimensione caratteri"
msgid "Editor font family"
msgstr "Editor Famiglia Caratteri"
msgstr "Editor famiglia caratteri"
msgid ""
"This must be *monospace* font or it will not work properly. If the font is "
@@ -1360,6 +1383,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Aggiorna automaticamente l'applicazione"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Intervallo di sincronizzazione"
@@ -1454,14 +1484,33 @@ msgstr "Ignora gli errori del certificato TLS"
#, javascript-format
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Oprione non valida: \"%s\". I valori possibili sono: %s."
msgstr "Opzione non valida: \"%s\". I valori possibili sono: %s."
#, fuzzy
msgid "General"
msgstr "Opzioni Generali"
#, fuzzy
msgid "Synchronisation"
msgstr "Stato di sincronizzazione"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Taccuini"
#, fuzzy
msgid "Application"
msgstr "Esci dall'applicazione."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgstr "Il tag \"%s\" esiste già. Scegliere un nome differente."
msgid "Joplin Export File"
msgstr "Esposta files di Joplin"
msgstr "Esporta file di Joplin"
msgid "Markdown"
msgstr "Markdown"
@@ -1472,9 +1521,8 @@ msgstr "Cartella di esportazione di Joplin"
msgid "Evernote Export File"
msgstr "Esporta files di Evernote"
#, fuzzy
msgid "Json Export Directory"
msgstr "Cartella di esportazione di Joplin"
msgstr "Cartella di esportazione JSON"
msgid "Directory"
msgstr "Cartella"
@@ -1551,7 +1599,7 @@ msgid "On %s: %s"
msgstr "Su %s: %s"
msgid "Permission to use camera"
msgstr ""
msgstr "Permesso di usare la fotocamera"
msgid "Your permission to use your camera is required."
msgstr ""
@@ -1661,11 +1709,26 @@ msgstr ""
"geografica ad una nota."
msgid "Joplin website"
msgstr "Siro web Joplin"
msgstr "Sito web Joplin"
#, javascript-format
msgid "Joplin v%s"
msgstr "Joplin v%s"
#, javascript-format
msgid "Database v%s"
msgstr "Database v%s"
#, javascript-format
msgid "FTS enabled: %d"
msgstr "FTS attivato: %d"
msgid "Login with Dropbox"
msgstr "Login Dropbox"
msgid "Enter code here"
msgstr "Inserisci qui il codice"
#, javascript-format
msgid "Master Key %s"
msgstr "Chiave Master %s"
@@ -1718,9 +1781,8 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Tipo di immagine non supportata: %s"
#, fuzzy
msgid "Take photo"
msgstr "Allega foto"
msgstr "Scatta foto"
msgid "Attach photo"
msgstr "Allega foto"
@@ -1737,6 +1799,9 @@ msgstr "Converti in nota"
msgid "Convert to todo"
msgstr "Converti in Todo"
msgid "Copy Markdown link"
msgstr "Copia il link Markdown"
msgid "Hide metadata"
msgstr "Nascondi i Metadati"
@@ -1772,6 +1837,27 @@ msgstr ""
msgid "Welcome"
msgstr "Benvenuto"
#~ msgid "Add or remove tags"
#~ msgstr "Aggiungi o rimuovi etichetta"
#~ msgid "Duplicate"
#~ msgstr "Duplicare"
#~ msgid "%s - Copy"
#~ msgstr "%s - Copia"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
#~ msgid "Switch to note type"
#~ msgstr "Converti in nota"
#~ msgid "Switch to to-do type"
#~ msgstr "Converti in \"Cose-da-fare\""
#~ msgid "Delete notes?"
#~ msgstr "Eliminare le note?"
#~ msgid "State: %s."
#~ msgstr "Stato: %s."
@@ -1829,9 +1915,6 @@ msgstr "Benvenuto"
#~ msgid "Give focus to previous pane"
#~ msgstr "Pannello precedente"
#~ msgid "Enter command line mode"
#~ msgstr "Accedi alla modalità linea di comando"
#~ msgid "Exit command line mode"
#~ msgstr "Esci dalla modalità linea di comando"
@@ -1841,9 +1924,6 @@ msgstr "Benvenuto"
#~ msgid "Cancel the current command."
#~ msgstr "Cancella il comando corrente."
#~ msgid "Exit the application."
#~ msgstr "Esci dall'applicazione."
#~ msgid "Delete the currently selected note or notebook."
#~ msgstr "Elimina la nota o il taccuino selezionato."

View File

@@ -236,7 +236,7 @@ msgstr ""
"ムを参照できます。"
msgid "To move from one pane to another, press Tab or Shift+Tab."
msgstr "ペイン間を移動するには、TabかShift+Tabをしてください。"
msgstr "ペイン間を移動するには、TabかShift+Tabをしてください。"
msgid ""
"Use the arrows and page up/down to scroll the lists and text areas "
@@ -446,7 +446,7 @@ msgid "Starting synchronisation..."
msgstr "同期を開始中..."
msgid "Downloading resources..."
msgstr ""
msgstr "リソースをダウンロード中..."
msgid "Cancelling... Please wait."
msgstr "中止中...お待ちください。"
@@ -570,6 +570,20 @@ msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr ""
"\"%s\" を \"%s\" フォーマットにエクスポート中。しばらくお待ちください..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "ノートブックの題名:"
#, fuzzy
msgid "Note body"
msgstr "ノートブック"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr ""
@@ -618,9 +632,8 @@ msgstr "切り取り"
msgid "Paste"
msgstr "貼り付け"
#, fuzzy
msgid "Select all"
msgstr "日付の選択"
msgstr "すべて選択"
msgid "Bold"
msgstr "太字"
@@ -628,6 +641,9 @@ msgstr "太字"
msgid "Italic"
msgstr "斜体"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "日付の入力"
@@ -637,9 +653,8 @@ msgstr "外部エディターで編集"
msgid "Search in all the notes"
msgstr "すべてのノートを検索"
#, fuzzy
msgid "Search in current note"
msgstr "すべてのノートを検索"
msgstr "現在のノートを検索"
msgid "View"
msgstr "表示"
@@ -650,6 +665,10 @@ msgstr "サイドバーの表示切り替え"
msgid "Toggle editor layout"
msgstr "エディターレイアウトの表示切り替え"
#, fuzzy
msgid "Focus"
msgstr "本文にフォーカス"
msgid "Tools"
msgstr "ツール"
@@ -700,9 +719,21 @@ msgstr "キャンセル"
msgid "Current version is up-to-date."
msgstr "現在のバージョンは最新版です。"
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "アップデートがあります。すぐにダウンロードしますか?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Yes"
@@ -710,7 +741,7 @@ msgid "No"
msgstr "No"
msgid "Token has been copied to the clipboard!"
msgstr ""
msgstr "トークンをクリップボードにコピーしました!"
msgid "The web clipper service is enabled and set to auto-start."
msgstr "Webクリッパーサービスは有効で、自動起動します。"
@@ -760,28 +791,32 @@ msgstr "ステップ2: 拡張機能のインストール"
msgid "Download and install the relevant extension for your browser:"
msgstr "関連する拡張機能をブラウザーにインストールします:"
#, fuzzy
msgid "Advanced options"
msgstr "詳細な設定の表示"
msgstr "詳細な設定"
msgid "Authorisation token:"
msgstr ""
msgstr "認証するトークン:"
msgid "Copy token"
msgstr ""
msgstr "トークンのコピー"
msgid ""
"This authorisation token is only needed to allow third-party applications to "
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "同期の設定を確認する"
"この認証トークンはサードパーティアプリケーションがJoplinにアクセスするためだ"
"けに必要です。"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "ノートと設定は次の場所に保存されます: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "同期の設定を確認する"
msgid "Apply"
msgstr "適用"
@@ -873,6 +908,10 @@ msgstr "状態"
msgid "Encryption is:"
msgstr "暗号化の状態:"
#, fuzzy
msgid "Usage"
msgstr "使用方法: %s"
msgid "Back"
msgstr "戻る"
@@ -925,36 +964,6 @@ msgstr "いくつかの項目は復号されませんでした。"
msgid "Set the password"
msgstr "パスワードの設定"
msgid "Add or remove tags"
msgstr "タグの追加と削除"
msgid "Duplicate"
msgstr "複製"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - コピー"
msgid "Switch between note and to-do type"
msgstr "ノートとToDoを切り替え"
#, fuzzy
msgid "Switch to note type"
msgstr "ノートとToDoを切り替え"
#, fuzzy
msgid "Switch to to-do type"
msgstr "ノートとToDoを切り替え"
msgid "Copy Markdown link"
msgstr "Markdownのリンクをコピー"
msgid "Delete"
msgstr "削除"
msgid "Delete notes?"
msgstr "ノートを削除しますか?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "ノートがありません。新しいノートを作成して下さい。"
@@ -963,13 +972,13 @@ msgid ""
msgstr "ノートブックがありません。新しいノートブックを作成してください。"
msgid "Location"
msgstr ""
msgstr "場所"
msgid "URL"
msgstr ""
msgstr "URL"
msgid "Note properties"
msgstr ""
msgstr "ノートのプロパティ"
msgid "Open..."
msgstr "開く..."
@@ -988,7 +997,7 @@ msgid "Copy Link Address"
msgstr "リンクアドレスをコピー"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
msgstr "この添付ファイルはダウンロードできないか、まだ復号できません。"
#, javascript-format
msgid "Unsupported link or message: %s"
@@ -1002,6 +1011,9 @@ msgstr ""
"このノートには中身がありません。 \"%s\" をクリックしてエディターを表示し、"
"ノートを編集してください。"
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "文字を太字に"
@@ -1015,7 +1027,7 @@ msgid "Insert Hyperlink"
msgstr "ハイパーリンクの挿入"
msgid "Attach file"
msgstr "ファイルを添付"
msgstr "ファイルを添付する"
msgid "Tags"
msgstr "タグ"
@@ -1094,6 +1106,9 @@ msgstr "すべてのノートからこのタグを削除しますか?"
msgid "Remove this search from the sidebar?"
msgstr "サイドバーからこの検索を削除しますか?"
msgid "Delete"
msgstr "削除"
msgid "Rename"
msgstr "名前の変更"
@@ -1107,9 +1122,9 @@ msgstr "ノートブック"
msgid "Decrypting items: %d/%d"
msgstr "復号中のアイテム: %d/%d"
#, fuzzy, javascript-format
#, javascript-format
msgid "Fetching resources: %d"
msgstr "リソース: %d."
msgstr "取得中のリソース: %d"
msgid "Please select where the sync status should be exported to"
msgstr "同期状況の出力先を選択してください"
@@ -1320,6 +1335,8 @@ msgid ""
"this setting so that your notes are constantly being synchronised, thus "
"reducing the number of conflicts."
msgstr ""
"有効にすると、Joplinがバックグラウンドで動作するようになります。ノートを定期"
"的に同期し、衝突を減らすために強くおすすめする設定です。"
msgid "Start application minimised in the tray icon"
msgstr "アプリケーションをトレイアンコンで最小化して起動"
@@ -1327,9 +1344,8 @@ msgstr "アプリケーションをトレイアンコンで最小化して起動
msgid "Global zoom percentage"
msgstr "全体ズームの割合"
#, fuzzy
msgid "Editor font size"
msgstr "エディターのフォントファミリー"
msgstr "エディターのフォントサイズ"
msgid "Editor font family"
msgstr "エディターのフォントファミリー"
@@ -1342,7 +1358,14 @@ msgstr ""
"誤っているか空の場合は、一般的な等幅フォントが指定されるでしょう。"
msgid "Automatically update the application"
msgstr "アプリケーション自動更新"
msgstr "アプリケーション自動的にアップデート"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "同期間隔"
@@ -1441,6 +1464,25 @@ msgstr "TLS証明書のエラーを無視"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "無効な設定値: \"%s\"。有効な値は: %sです。"
#, fuzzy
msgid "General"
msgstr "全般のオプション"
#, fuzzy
msgid "Synchronisation"
msgstr "同期状況"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "ノートブック"
#, fuzzy
msgid "Application"
msgstr "場所"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr "タグ \"%s\" はすでにあります。ほかの名前を選択してください。"
@@ -1457,9 +1499,8 @@ msgstr "Joplin エクスポートディレクトリ"
msgid "Evernote Export File"
msgstr "Evernote エクスポートファイル"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin エクスポートディレクトリ"
msgstr "Json エクスポートディレクトリ"
msgid "Directory"
msgstr "ディレクトリ"
@@ -1536,10 +1577,10 @@ msgid "On %s: %s"
msgstr "日時 %s: %s"
msgid "Permission to use camera"
msgstr ""
msgstr "カメラ使用の許可"
msgid "Your permission to use your camera is required."
msgstr ""
msgstr "カメラを使用するには権限が必要です。"
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "ノートがありません。(+)ボタンを押して新しいノートを作成してください。"
@@ -1569,9 +1610,8 @@ msgstr "%d個のノートを\"%s\"に移動しますか?"
msgid "Press to set the decryption password."
msgstr "復号するパスワードを入力してください。"
#, fuzzy
msgid "Clear alarm"
msgstr "アラームをセット"
msgstr "アラームをクリア"
msgid "Save alarm"
msgstr "アラームの保存"
@@ -1585,22 +1625,21 @@ msgstr "確認"
msgid "Cancel synchronisation"
msgstr "同期の中止"
#, fuzzy
msgid "Checking... Please wait."
msgstr "中止中...お待ちください。"
msgstr "確認中...お待ちください。"
#, fuzzy
msgid "Success! Synchronisation configuration appears to be correct."
msgstr "同期の設定を確認する"
msgstr "成功です! 同期の設定は正しいようです。"
msgid ""
"Error. Please check that URL, username, password, etc. are correct and that "
"the sync target is accessible. The reported error was:"
msgstr ""
"エラーです。URL、ユーザー名、パスワードなどを修正し、同期するターゲットにアク"
"セスできるかを確認してください。次が報告されたエラーです:"
#, fuzzy
msgid "The application has been authorised!"
msgstr "アプリケーションは問題なく認証されました"
msgstr "アプリケーションは問題なく認証されました"
#, javascript-format
msgid ""
@@ -1610,10 +1649,15 @@ msgid ""
"\n"
"Please try again."
msgstr ""
"アプリケーションが認証できません:\n"
"\n"
"%s\n"
"\n"
"やり直してください。"
#, fuzzy, javascript-format
#, javascript-format
msgid "Decrypted items: %s / %s"
msgstr "復号中のアイテム: %d/%d"
msgstr "復号中のアイテム: %s/%s"
msgid "New tags:"
msgstr "新しいタグ:"
@@ -1644,9 +1688,25 @@ msgstr "- 位置情報: ノートに位置情報を添付するのに必要で
msgid "Joplin website"
msgstr "JoplinのWebサイト"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "JoplinのWebサイト"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "削除予定: %d"
msgid "Login with Dropbox"
msgstr "Dropboxでログイン"
#, fuzzy
msgid "Enter code here"
msgstr "コマンドラインモードに入る"
#, javascript-format
msgid "Master Key %s"
msgstr "マスターキー %s"
@@ -1698,9 +1758,8 @@ msgstr "Joplinモバイルアプリは次のタイプのリンクをまだサポ
msgid "Unsupported image type: %s"
msgstr "サポートされていない画像の形式: %s"
#, fuzzy
msgid "Take photo"
msgstr "写真を添付"
msgstr "写真を撮影する"
msgid "Attach photo"
msgstr "写真を添付"
@@ -1717,6 +1776,9 @@ msgstr "ノートに変換"
msgid "Convert to todo"
msgstr "ToDoに変換"
msgid "Copy Markdown link"
msgstr "Markdownのリンクをコピー"
msgid "Hide metadata"
msgstr "メタデータを隠す"
@@ -1727,7 +1789,7 @@ msgid "View on map"
msgstr "地図上に表示"
msgid "Go to source URL"
msgstr ""
msgstr "ソースURLに行く"
msgid "Delete notebook"
msgstr "ノートブックを削除"
@@ -1753,6 +1815,27 @@ msgstr ""
msgid "Welcome"
msgstr "ようこそ"
#~ msgid "Add or remove tags"
#~ msgstr "タグの追加と削除"
#~ msgid "Duplicate"
#~ msgstr "複製"
#~ msgid "%s - Copy"
#~ msgstr "%s - コピー"
#~ msgid "Switch between note and to-do type"
#~ msgstr "ノートとToDoを切り替え"
#~ msgid "Switch to note type"
#~ msgstr "ノートに切り替え"
#~ msgid "Switch to to-do type"
#~ msgstr "ToDoに切り替え"
#~ msgid "Delete notes?"
#~ msgstr "ノートを削除しますか?"
#~ msgid "State: %s."
#~ msgstr "状態: \"%s\"."
@@ -1793,9 +1876,6 @@ msgstr "ようこそ"
#~ msgid "Give focus to previous pane"
#~ msgstr "前のペインへ"
#~ msgid "Enter command line mode"
#~ msgstr "コマンドラインモードに入る"
#~ msgid "Exit command line mode"
#~ msgstr "コマンドラインモードの終了"

View File

@@ -508,6 +508,18 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr ""
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
msgid "Note title"
msgstr ""
msgid "Note body"
msgstr ""
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr ""
@@ -564,6 +576,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -585,6 +600,9 @@ msgstr ""
msgid "Toggle editor layout"
msgstr ""
msgid "Focus"
msgstr ""
msgid "Tools"
msgstr ""
@@ -635,9 +653,21 @@ msgstr ""
msgid "Current version is up-to-date."
msgstr ""
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr ""
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr ""
@@ -704,13 +734,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr ""
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr ""
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr ""
msgid "Apply"
msgstr ""
@@ -789,6 +822,9 @@ msgstr ""
msgid "Encryption is:"
msgstr ""
msgid "Usage"
msgstr ""
msgid "Back"
msgstr ""
@@ -839,34 +875,6 @@ msgstr ""
msgid "Set the password"
msgstr ""
msgid "Add or remove tags"
msgstr ""
msgid "Duplicate"
msgstr ""
#, javascript-format
msgid "%s - Copy"
msgstr ""
msgid "Switch between note and to-do type"
msgstr ""
msgid "Switch to note type"
msgstr ""
msgid "Switch to to-do type"
msgstr ""
msgid "Copy Markdown link"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Delete notes?"
msgstr ""
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr ""
@@ -912,6 +920,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1004,6 +1015,9 @@ msgstr ""
msgid "Remove this search from the sidebar?"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Rename"
msgstr ""
@@ -1241,6 +1255,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr ""
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr ""
@@ -1325,6 +1346,21 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr ""
msgid "General"
msgstr ""
msgid "Synchronisation"
msgstr ""
msgid "Appearance"
msgstr ""
msgid "Note"
msgstr ""
msgid "Application"
msgstr ""
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1514,9 +1550,24 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, javascript-format
msgid "Joplin v%s"
msgstr ""
#, javascript-format
msgid "Database v%s"
msgstr ""
#, javascript-format
msgid "FTS enabled: %d"
msgstr ""
msgid "Login with Dropbox"
msgstr ""
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr ""
@@ -1586,6 +1637,9 @@ msgstr ""
msgid "Convert to todo"
msgstr ""
msgid "Copy Markdown link"
msgstr ""
msgid "Hide metadata"
msgstr ""

View File

@@ -447,12 +447,11 @@ msgid "Starting synchronisation..."
msgstr "동기화를 시작합니다..."
msgid "Downloading resources..."
msgstr ""
msgstr "리소스 다운로드 중..."
msgid "Cancelling... Please wait."
msgstr "취소하는 중입니다... 잠시만 기다리세요."
#, fuzzy
msgid ""
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
"[tag] from [note], or to list the notes associated with [tag]. The command "
@@ -460,7 +459,8 @@ msgid ""
msgstr ""
"[note]로부터 [tag]를 지우거나 지정할 때, 아니면 [tag]와 관련된 노트의 목록을 "
"확인할 때 <tag-command>로 \"add\", \"remove\" 또는 \"list\" 를 사용할 수 있습"
"니다. `tag list` 명령어로 모든 태그의 목록을 확인할 수 있습니다."
"니다. `tag list` 명령어로 모든 태그의 목록을 확인할 수 있습니다 (옵션 -l 사"
"용 가능)."
#, javascript-format
msgid "Invalid command: \"%s\""
@@ -568,6 +568,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "\"%s\"에 \"%s\" 포맷으로 내보내는 중입니다. 잠시만 기다리세요..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "노트북 제목:"
#, fuzzy
msgid "Note body"
msgstr "노트북"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "\"%s\"에서 \"%s\" 포맷으로 가져오는 중입니다. 잠시만 기다리세요..."
@@ -615,9 +629,8 @@ msgstr "잘라내기"
msgid "Paste"
msgstr "붙여넣기"
#, fuzzy
msgid "Select all"
msgstr "날짜 선택"
msgstr "모두 선택"
msgid "Bold"
msgstr "굵게"
@@ -625,6 +638,9 @@ msgstr "굵게"
msgid "Italic"
msgstr "기울임"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "날짜와 시간 입력"
@@ -634,9 +650,8 @@ msgstr "외부 편집기에서 편집하기"
msgid "Search in all the notes"
msgstr "모든 노트에서 검색"
#, fuzzy
msgid "Search in current note"
msgstr "모든 노트에서 검색"
msgstr "현재 노트에서 검색"
msgid "View"
msgstr "보기"
@@ -647,6 +662,10 @@ msgstr "사이드바 표시 전환"
msgid "Toggle editor layout"
msgstr "편집기 배치 형태 전환"
#, fuzzy
msgid "Focus"
msgstr "내용에 포커스"
msgid "Tools"
msgstr "도구"
@@ -697,9 +716,21 @@ msgstr "취소"
msgid "Current version is up-to-date."
msgstr "현재 버전은 최신입니다."
#, javascript-format
msgid "%s (pre-release)"
msgstr "%s (프리-릴리즈)"
msgid "An update is available, do you want to download it now?"
msgstr "업데이트가 있습니다. 지금 다운로드할까요?"
#, javascript-format
msgid "Your version: v%s"
msgstr "현재 버전: v%s"
#, javascript-format
msgid "New version: v%s"
msgstr "새 버전: v%s"
msgid "Yes"
msgstr "예"
@@ -707,7 +738,7 @@ msgid "No"
msgstr "아니오"
msgid "Token has been copied to the clipboard!"
msgstr ""
msgstr "토큰이 클립보드로 복사되었습니다!"
msgid "The web clipper service is enabled and set to auto-start."
msgstr "웹 수집기 서비스가 활성화되었고 자동으로 시작하도록 설정되었습니다."
@@ -756,28 +787,32 @@ msgstr "2단계: 확장 기능 설치"
msgid "Download and install the relevant extension for your browser:"
msgstr "브라우저에 적절한 확장 기능을 다운로드 및 설치하세요:"
#, fuzzy
msgid "Advanced options"
msgstr "고급 옵션"
msgid "Authorisation token:"
msgstr ""
msgstr "인증 토큰:"
msgid "Copy token"
msgstr ""
msgstr "토큰 복사"
msgid ""
"This authorisation token is only needed to allow third-party applications to "
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "동기화 설정 확인"
"이 인증 토큰은 오직 서드파티 애플리케이션에서 조플린을 접근할 때만 필요합니"
"다."
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "노트와 설정값이 다음에 저장되었습니다: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "동기화 설정 확인"
msgid "Apply"
msgstr "적용"
@@ -869,6 +904,10 @@ msgstr "상태"
msgid "Encryption is:"
msgstr "암호화는 다음과 같습니다:"
#, fuzzy
msgid "Usage"
msgstr "사용량: %s"
msgid "Back"
msgstr "뒤로 가기"
@@ -919,36 +958,6 @@ msgstr "일부 항목들은 암호화할 수 없습니다."
msgid "Set the password"
msgstr "암호 설정"
msgid "Add or remove tags"
msgstr "태그 추가 및 제거"
msgid "Duplicate"
msgstr "복제"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - 복사"
msgid "Switch between note and to-do type"
msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
#, fuzzy
msgid "Switch to note type"
msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
#, fuzzy
msgid "Switch to to-do type"
msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
msgid "Copy Markdown link"
msgstr "마크다운 링크 복사"
msgid "Delete"
msgstr "삭제"
msgid "Delete notes?"
msgstr "노트를 삭제할까요?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "노트가 없습니다. '새 노트'를 선택해서 노트를 새로 만드세요."
@@ -957,13 +966,13 @@ msgid ""
msgstr "노트북이 없습니다. '새 노트북'을 선택해서 노트북을 새로 만드세요."
msgid "Location"
msgstr ""
msgstr "위치"
msgid "URL"
msgstr ""
msgstr "URL"
msgid "Note properties"
msgstr ""
msgstr "노트 속성"
msgid "Open..."
msgstr "열기..."
@@ -982,7 +991,7 @@ msgid "Copy Link Address"
msgstr "링크 주소 복사"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
msgstr "이 첨부는 아직 다운로드 또는 복호화 되지 않았습니다."
#, javascript-format
msgid "Unsupported link or message: %s"
@@ -996,6 +1005,9 @@ msgstr ""
"비어있는 노트입니다. \"%s\" 항목을 선택해서 편집기를 전환하고 노트를 편집하세"
"요."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr "한 번에 오직 하나의 노트만 출력하거나 내보내기 할 수 있습니다."
msgid "strong text"
msgstr "중요 텍스트"
@@ -1088,6 +1100,9 @@ msgstr "모든 노트에서 이 태그를 제거할까요?"
msgid "Remove this search from the sidebar?"
msgstr "사이드바에서 이 검색 항목을 제거할까요?"
msgid "Delete"
msgstr "삭제"
msgid "Rename"
msgstr "이름 바꾸기"
@@ -1101,9 +1116,9 @@ msgstr "노트북"
msgid "Decrypting items: %d/%d"
msgstr "복호화 항목: %d/%d"
#, fuzzy, javascript-format
#, javascript-format
msgid "Fetching resources: %d"
msgstr "리소스: %d."
msgstr "리소스 가져오는 중: %d."
msgid "Please select where the sync status should be exported to"
msgstr "동기화 상태를 내보낼 대상을 선택하세요"
@@ -1312,16 +1327,17 @@ msgid ""
"this setting so that your notes are constantly being synchronised, thus "
"reducing the number of conflicts."
msgstr ""
"조플린을 백그라운드에서 구동합니다. 노트가 정기적으로 동기화 되어 충돌 횟수"
"를 줄이기 위해 이 옵션을 활성화 하는 것을 추천합니다."
msgid "Start application minimised in the tray icon"
msgstr ""
msgstr "트레이 아이콘에 최소화 된 상태로 애플리케이션 시작"
msgid "Global zoom percentage"
msgstr "전체적 확대 비율"
#, fuzzy
msgid "Editor font size"
msgstr "편집기 글꼴 집합"
msgstr "편집기 글꼴 크기"
msgid "Editor font family"
msgstr "편집기 글꼴 집합"
@@ -1337,6 +1353,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "애플리케이션을 자동으로 업데이트"
msgid "Get pre-releases when checking for updates"
msgstr "업데이트 확인 시 프리-릴리즈 받기"
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr "자세한 내용은 프리-릴리즈 페이지를 참조하세요: %s"
msgid "Synchronisation interval"
msgstr "동기화 간격"
@@ -1394,6 +1417,8 @@ msgid ""
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
"주의: 이 위치를 변경하시려면, 동기화 전에 모든 컨텐트를 복사했는지 확인하세"
"요, 그렇지 않으면 모든 파일이 삭제됩니다! 자세한 정보는 FAQ를 참조하세요: %s"
msgid "Nextcloud username"
msgstr "Nextcloud 사용자 이름"
@@ -1431,9 +1456,28 @@ msgstr "TLS 인증서 오류 무시"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "올바르지 않은 옵션 값: \"%s\". 가능한 값은 다음과 같습니다: \"%s\"."
#, fuzzy
msgid "General"
msgstr "일반 옵션"
#, fuzzy
msgid "Synchronisation"
msgstr "동기화 상태"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "노트북"
#, fuzzy
msgid "Application"
msgstr "위치"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgstr "태그 \"%s\"(이)가 이미 존재합니다. 다른 이름을 선택해 주세요."
msgid "Joplin Export File"
msgstr "조플린 내보내기 파일"
@@ -1447,9 +1491,8 @@ msgstr "조플린 내보내기 폴더"
msgid "Evernote Export File"
msgstr "에버노트 내보내기 파일"
#, fuzzy
msgid "Json Export Directory"
msgstr "조플린 내보내기 폴더"
msgstr "Json 내보내기 폴더"
msgid "Directory"
msgstr "폴더"
@@ -1526,10 +1569,10 @@ msgid "On %s: %s"
msgstr "%s: %s"
msgid "Permission to use camera"
msgstr ""
msgstr "카메라 사용 허가"
msgid "Your permission to use your camera is required."
msgstr ""
msgstr "카메라 사용을 허가가 요구됩니다."
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "노트가 없습니다. (+) 버튼을 선택해 새로 만드세요."
@@ -1559,9 +1602,8 @@ msgstr "%d 노트를 \"%s\" 노트북으로 옮길까요?"
msgid "Press to set the decryption password."
msgstr "복호화 암호를 설정하려면 누르세요."
#, fuzzy
msgid "Clear alarm"
msgstr "알람 설정"
msgstr "알람 취소"
msgid "Save alarm"
msgstr "알람 저장"
@@ -1575,20 +1617,19 @@ msgstr "확인"
msgid "Cancel synchronisation"
msgstr "동기화 취소"
#, fuzzy
msgid "Checking... Please wait."
msgstr "취소하는 중입니다... 잠시만 기다리세요."
msgstr "확인 중입니다... 잠시만 기다리세요."
#, fuzzy
msgid "Success! Synchronisation configuration appears to be correct."
msgstr "동기화 설정 확인"
msgstr "성공! 동기화 설정이 올바릅니다."
msgid ""
"Error. Please check that URL, username, password, etc. are correct and that "
"the sync target is accessible. The reported error was:"
msgstr ""
"Error. Please check that URL, username, password, etc. are correct and that "
"the sync target is accessible. The reported error was:"
#, fuzzy
msgid "The application has been authorised!"
msgstr "애플리케이션이 성공적으로 허가되었습니다."
@@ -1600,10 +1641,15 @@ msgid ""
"\n"
"Please try again."
msgstr ""
"애플리케이션을 허가할 수 없습니다:\n"
"\n"
"%s\n"
"\n"
"다시 시도해 주세요."
#, fuzzy, javascript-format
#, javascript-format
msgid "Decrypted items: %s / %s"
msgstr "복호화 항목: %d/%d"
msgstr "복호화 항목: %s / %s"
msgid "New tags:"
msgstr "새 태그:"
@@ -1634,9 +1680,24 @@ msgstr "- 위치: 지리적 위치 정보를 노트에 첨부하기 위해서
msgid "Joplin website"
msgstr "조플린 웹사이트"
#, javascript-format
msgid "Joplin v%s"
msgstr "조플린 v%s"
#, javascript-format
msgid "Database v%s"
msgstr "데이터베이스 v%s"
#, javascript-format
msgid "FTS enabled: %d"
msgstr "FTS 활성됨: %d"
msgid "Login with Dropbox"
msgstr "Dropbox로 로그인"
msgid "Enter code here"
msgstr "여기에 코드를 입력하세요"
#, javascript-format
msgid "Master Key %s"
msgstr "관리자 키 %s"
@@ -1688,9 +1749,8 @@ msgstr "조플린 모바일 앱은 현재 해당 형식의 링크를 지원하
msgid "Unsupported image type: %s"
msgstr "지원하지 않는 이미지 형식: %s"
#, fuzzy
msgid "Take photo"
msgstr "사진 첨부"
msgstr "사진 찍기"
msgid "Attach photo"
msgstr "사진 첨부"
@@ -1707,6 +1767,9 @@ msgstr "노트로 변환"
msgid "Convert to todo"
msgstr "'할 일'로 변환"
msgid "Copy Markdown link"
msgstr "마크다운 링크 복사"
msgid "Hide metadata"
msgstr "메타데이터 숨김"
@@ -1717,7 +1780,7 @@ msgid "View on map"
msgstr "지도에 표시"
msgid "Go to source URL"
msgstr ""
msgstr "소스 URL로 이동"
msgid "Delete notebook"
msgstr "노트북 삭제"
@@ -1741,6 +1804,27 @@ msgstr "노트북이 없습니다. (+) 버튼을 눌러 새로 만드세요."
msgid "Welcome"
msgstr "환영합니다"
#~ msgid "Add or remove tags"
#~ msgstr "태그 추가 및 제거"
#~ msgid "Duplicate"
#~ msgstr "복제"
#~ msgid "%s - Copy"
#~ msgstr "%s - 복사"
#~ msgid "Switch between note and to-do type"
#~ msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
#~ msgid "Switch to note type"
#~ msgstr "'노트' 형식으로 전환합니다."
#~ msgid "Switch to to-do type"
#~ msgstr "'할 일' 형식으로 전환합니다."
#~ msgid "Delete notes?"
#~ msgstr "노트를 삭제할까요?"
#~ msgid "State: %s."
#~ msgstr "상태: %s."

View File

@@ -1,13 +1,13 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Laurent Cozic
# This file is distributed under the same license as the Joplin-CLI package.
# Mats Estensen <matsest@mxe.no>, 2018
# Mats Estensen <code@mxe.no>, 2018
#
msgid ""
msgstr ""
"Project-Id-Version: Joplin-CLI 1.0.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Mats Estensen <matsest@mxe.no>\n"
"Last-Translator: Mats Estensen <code@mxe.no>\n"
"Language-Team: \n"
"Language: nb_NO\n"
"MIME-Version: 1.0\n"
@@ -164,7 +164,7 @@ msgstr "Rediger notat."
msgid ""
"No text editor is defined. Please set it using `config editor <editor-path>`"
msgstr ""
"Inger teksteditor er valgt. Velg en ved å bruke `config editor <editor-path>`"
"Ingen teksteditor er valgt. Velg en ved å bruke `config editor <editor-path>`"
msgid "No active notebook."
msgstr "Ingen aktiv notatbok."
@@ -576,6 +576,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Eksporterer til \"%s\" i \"%s\" format. Vennligst vent..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Tittel på notatbok:"
#, fuzzy
msgid "Note body"
msgstr "Notatbøker"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importerer fra \"%s\" i \"%s\"-format. Vennligst vent..."
@@ -602,7 +616,7 @@ msgid "Export"
msgstr "Eksport"
msgid "Print"
msgstr "Skriv Ut"
msgstr "Skriv ut"
#, javascript-format
msgid "Hide %s"
@@ -624,7 +638,7 @@ msgid "Paste"
msgstr "Lim inn"
msgid "Select all"
msgstr "Velg alle"
msgstr "Marker alt"
msgid "Bold"
msgstr "Fet"
@@ -632,6 +646,9 @@ msgstr "Fet"
msgid "Italic"
msgstr "Kursiv"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "Sett inn dato/tid"
@@ -643,10 +660,10 @@ msgstr "Søk i alle notater"
#, fuzzy
msgid "Search in current note"
msgstr "Søk i alle notater"
msgstr "Søk i nåværende notat"
msgid "View"
msgstr "Utseende"
msgstr "Vis"
msgid "Toggle sidebar"
msgstr "Vis/skjul sidepanel"
@@ -654,6 +671,10 @@ msgstr "Vis/skjul sidepanel"
msgid "Toggle editor layout"
msgstr "Bytt editorutseende"
#, fuzzy
msgid "Focus"
msgstr "Fokuser på brødtekst"
msgid "Tools"
msgstr "Verktøy"
@@ -693,7 +714,7 @@ msgid "Open %s"
msgstr "Åpne %s"
msgid "Exit"
msgstr "Gå ut"
msgstr "Avslutt"
msgid "OK"
msgstr "OK"
@@ -704,9 +725,21 @@ msgstr "Avbryt"
msgid "Current version is up-to-date."
msgstr "Nåværende versjon er den siste tilgjengelige."
#, javascript-format
msgid "%s (pre-release)"
msgstr "%s (førutgivelse)"
msgid "An update is available, do you want to download it now?"
msgstr "En oppdatering er tilgjengelig, vil du laste den ned nå?"
#, javascript-format
msgid "Your version: v%s"
msgstr "Din versjon: v%s"
#, javascript-format
msgid "New version: v%s"
msgstr "Ny versjon: v%s"
msgid "Yes"
msgstr "Ja"
@@ -777,16 +810,19 @@ msgid ""
"This authorisation token is only needed to allow third-party applications to "
"access Joplin."
msgstr ""
"Denne autentiseringsbeviset er det eneste nødvendig for å gi "
"Denne autoriseringsbeviset er det eneste nødvendig for å gi "
"tredjepartsapplikasjoner tilgang til Joplin."
msgid "Check synchronisation configuration"
msgstr "Sjekk synkroniseringskonfigurasjon"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Notater og innstillinger er lagret i: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Sjekk synkroniseringskonfigurasjon"
msgid "Apply"
msgstr "Bruk"
@@ -881,6 +917,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Kryptering er:"
#, fuzzy
msgid "Usage"
msgstr "Bruk: %s"
msgid "Back"
msgstr "Tilbake"
@@ -933,34 +973,6 @@ msgstr "Noen elementer kan ikke dekrypteres."
msgid "Set the password"
msgstr "Sett passord"
msgid "Add or remove tags"
msgstr "Legg til eller fjern merkelapper"
msgid "Duplicate"
msgstr "Dupliser"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - Kopier"
msgid "Switch between note and to-do type"
msgstr "Bytt mellom notat og gjøremål"
msgid "Switch to note type"
msgstr "Bytt til notatmodus"
msgid "Switch to to-do type"
msgstr "Bytt til gjøremålmodus"
msgid "Copy Markdown link"
msgstr "Kopier Markdown-link"
msgid "Delete"
msgstr "Slett"
msgid "Delete notes?"
msgstr "Slette notater?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Ingen notater her enda. Opprett et ved å klikke på \"Nytt notat\"."
@@ -1008,6 +1020,9 @@ msgid ""
msgstr ""
"Dette notatet har ikke noe innhold. Klikk på \"%s\" for å redigere notatet."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "fet tekst"
@@ -1024,7 +1039,7 @@ msgid "Attach file"
msgstr "Legg ved fil"
msgid "Tags"
msgstr "Merkelapp"
msgstr "Merkelapper"
msgid "Set alarm"
msgstr "Angi alarm"
@@ -1100,6 +1115,9 @@ msgstr "Fjern denne merkelappen fra alle notater?"
msgid "Remove this search from the sidebar?"
msgstr "Fjerne dette søket fra sidepanelet?"
msgid "Delete"
msgstr "Slett"
msgid "Rename"
msgstr "Gi nytt navn"
@@ -1302,7 +1320,7 @@ msgid "Save geo-location with notes"
msgstr "Lagre stedsinformasjon med notater"
msgid "When creating a new to-do:"
msgstr "Når nytt gjøre mål opprettes:"
msgstr "Når nytt gjøremål opprettes:"
msgid "Focus title"
msgstr "Fokuser på tittel"
@@ -1336,7 +1354,7 @@ msgstr "Global forstørrelse"
#, fuzzy
msgid "Editor font size"
msgstr "Editor skrifttype"
msgstr "Editor skriftstørrelse"
msgid "Editor font family"
msgstr "Editor skrifttype"
@@ -1352,6 +1370,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Oppdater applikasjonen automatisk"
msgid "Get pre-releases when checking for updates"
msgstr "Få førutgivelse når du sjekker etter oppdateringer"
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr "Se førutgivelsessiden for flere detaljer: %s"
msgid "Synchronisation interval"
msgstr "Synkroniserinsintervall"
@@ -1449,24 +1474,43 @@ msgstr "Ignorer TLS-sertifikatfeil"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ugyldig verdi: \"%s\". Mulige verdier er: %s."
#, fuzzy
msgid "General"
msgstr "Generelle innstillinger"
#, fuzzy
msgid "Synchronisation"
msgstr "Synkroniseringsstatus"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Notatbøker"
#, fuzzy
msgid "Application"
msgstr "Lokasjon"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr "Merkelappen \"%s\" eksiterer allerede. Vennligst velg et annet navn."
msgid "Joplin Export File"
msgstr "Joplin Eksporter Fil"
msgstr "Joplin-eksportert fil"
msgid "Markdown"
msgstr "Markdown"
msgid "Joplin Export Directory"
msgstr "Joplin Eksporter Katalog"
msgstr "Joplin-eksportert katalog"
msgid "Evernote Export File"
msgstr "Evernote Eksporter Fil"
msgstr "Evernote-eksportert fil"
msgid "Json Export Directory"
msgstr "Json Eksporter Katalog"
msgstr "Json-eksportert katalog"
msgid "Directory"
msgstr "Katalog"
@@ -1654,9 +1698,24 @@ msgstr "- Sted: for å legge ved stedsinformation til notatet."
msgid "Joplin website"
msgstr "Joplins nettsted"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Joplin v%s"
#, javascript-format
msgid "Database v%s"
msgstr "Database v%s"
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Fulltekstsøk aktivert: %d"
msgid "Login with Dropbox"
msgstr "Innlogging med Dropbox"
msgid "Enter code here"
msgstr "Skriv inn kode her"
#, javascript-format
msgid "Master Key %s"
msgstr "Masternøkkel: %s"
@@ -1710,7 +1769,7 @@ msgstr "Bildetypen er ikke støttet: %s"
#, fuzzy
msgid "Take photo"
msgstr "Legg ved et bilde"
msgstr "Ta et bilde"
msgid "Attach photo"
msgstr "Legg ved et bilde"
@@ -1727,6 +1786,9 @@ msgstr "Konverter til notat"
msgid "Convert to todo"
msgstr "Konverter til gjøremål"
msgid "Copy Markdown link"
msgstr "Kopier Markdown-link"
msgid "Hide metadata"
msgstr "Skjul metadata"
@@ -1760,3 +1822,24 @@ msgstr "Du har enda ingen notatbok. Lag en ved å klikke på (+)-knappen."
msgid "Welcome"
msgstr "Velkommen"
#~ msgid "Add or remove tags"
#~ msgstr "Legg til eller fjern merkelapper"
#~ msgid "Duplicate"
#~ msgstr "Dupliser"
#~ msgid "%s - Copy"
#~ msgstr "%s - Kopier"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Bytt mellom notat og gjøremål"
#~ msgid "Switch to note type"
#~ msgstr "Bytt til notatmodus"
#~ msgid "Switch to to-do type"
#~ msgstr "Bytt til gjøremålmodus"
#~ msgid "Delete notes?"
#~ msgstr "Slette notater?"

View File

@@ -584,6 +584,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr ""
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Notitieboek titel:"
#, fuzzy
msgid "Note body"
msgstr "Notitieboeken"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr ""
@@ -643,6 +657,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -665,6 +682,9 @@ msgstr ""
msgid "Toggle editor layout"
msgstr ""
msgid "Focus"
msgstr ""
msgid "Tools"
msgstr "Tools"
@@ -716,9 +736,21 @@ msgstr "Annuleer"
msgid "Current version is up-to-date."
msgstr ""
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr ""
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr ""
@@ -787,14 +819,17 @@ msgid ""
"access Joplin."
msgstr ""
#, fuzzy
msgid "Check synchronisation configuration"
msgstr "Annuleer synchronisatie"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Notities en instellingen zijn opgeslaan in %s"
msgid "Browse..."
msgstr ""
#, fuzzy
msgid "Check synchronisation configuration"
msgstr "Annuleer synchronisatie"
msgid "Apply"
msgstr ""
@@ -885,6 +920,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Versleuteling is:"
#, fuzzy
msgid "Usage"
msgstr "Gebruik: %s"
msgid "Back"
msgstr "Terug"
@@ -939,36 +978,6 @@ msgstr "Sommige items kunnen niet gedecodeerd worden."
msgid "Set the password"
msgstr "Stel wachtwoord in"
msgid "Add or remove tags"
msgstr "Voeg tag toe of verwijder tag"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Kopieer"
msgid "Switch between note and to-do type"
msgstr "Wissel tussen notitie en to-do type"
#, fuzzy
msgid "Switch to note type"
msgstr "Wissel tussen notitie en to-do type"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Wissel tussen notitie en to-do type"
msgid "Copy Markdown link"
msgstr ""
msgid "Delete"
msgstr "Verwijderen"
msgid "Delete notes?"
msgstr "Notities verwijderen?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Geen notities. Maak een notitie door op \"Nieuwe notitie\" te klikken."
@@ -1017,6 +1026,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1113,6 +1125,9 @@ msgstr "Deze tag verwijderen van alle notities?"
msgid "Remove this search from the sidebar?"
msgstr "Dit item verwijderen van de zijbalk?"
msgid "Delete"
msgstr "Verwijderen"
msgid "Rename"
msgstr "Hernoem"
@@ -1371,6 +1386,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Update de applicatie automatisch"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Synchronisatie interval"
@@ -1464,6 +1486,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ongeldige optie: \"%s\". Geldige waarden zijn: %s."
#, fuzzy
msgid "General"
msgstr "Algemene opties"
#, fuzzy
msgid "Synchronisation"
msgstr "Synchronisatie status"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Notitieboeken"
#, fuzzy
msgid "Application"
msgstr "Sluit de applicatie."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1666,10 +1707,26 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, javascript-format
msgid "Joplin v%s"
msgstr ""
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Verwijderen: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Log in met OneDrive"
#, fuzzy
msgid "Enter code here"
msgstr "Ga naar command line modus"
#, javascript-format
msgid "Master Key %s"
msgstr "Hoofdsleutel: %s"
@@ -1740,6 +1797,9 @@ msgstr "Converteer naar notitie"
msgid "Convert to todo"
msgstr "Converteer naar to-do"
msgid "Copy Markdown link"
msgstr ""
msgid "Hide metadata"
msgstr "Verberg metadata"
@@ -1776,6 +1836,27 @@ msgstr ""
msgid "Welcome"
msgstr "Welkom"
#~ msgid "Add or remove tags"
#~ msgstr "Voeg tag toe of verwijder tag"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Kopieer"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Wissel tussen notitie en to-do type"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Wissel tussen notitie en to-do type"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Wissel tussen notitie en to-do type"
#~ msgid "Delete notes?"
#~ msgstr "Notities verwijderen?"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Status: \"%s\""
@@ -1818,9 +1899,6 @@ msgstr "Welkom"
#~ msgid "Give focus to previous pane"
#~ msgstr "Focus op het vorige paneel"
#~ msgid "Enter command line mode"
#~ msgstr "Ga naar command line modus"
#~ msgid "Exit command line mode"
#~ msgstr "Ga uit command line modus"
@@ -1830,9 +1908,6 @@ msgstr "Welkom"
#~ msgid "Cancel the current command."
#~ msgstr "Annuleer het huidige commando."
#~ msgid "Exit the application."
#~ msgstr "Sluit de applicatie."
#~ msgid "Delete the currently selected note or notebook."
#~ msgstr ""
#~ "Verwijder de geselecteerde notitie of het geselecteerde notitieboek."

View File

@@ -585,6 +585,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Bezig met exporteren van \"%s\" in het formaat \"%s\". Even geduld..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Titel van notitieboek:"
#, fuzzy
msgid "Note body"
msgstr "Notitieboeken"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Bezig met importeren van \"%s\" in het formaat \"%s\". Even geduld..."
@@ -642,6 +656,9 @@ msgstr "Vetgedrukt"
msgid "Italic"
msgstr "Cursief"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "Datum en tijd invoegen"
@@ -664,6 +681,10 @@ msgstr "Zijbalk tonen/verbergen"
msgid "Toggle editor layout"
msgstr "Bewerkindeling tonen/verbergen"
#, fuzzy
msgid "Focus"
msgstr "Inhoud focussen"
msgid "Tools"
msgstr "Hulpmiddelen"
@@ -714,9 +735,21 @@ msgstr "Annuleren"
msgid "Current version is up-to-date."
msgstr "De huidige versie is up-to-date."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Er is een update beschikbaar. Wil je deze nu downloaden?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Ja"
@@ -790,13 +823,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Synchronisatieconfiguratie controleren"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Notities en instellingen worden opgeslagen in: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Synchronisatieconfiguratie controleren"
msgid "Apply"
msgstr "Toepassen"
@@ -891,6 +927,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Gebruikte versleuteling:"
#, fuzzy
msgid "Usage"
msgstr "Gebruik: %s"
msgid "Back"
msgstr "Terug"
@@ -943,36 +983,6 @@ msgstr "Sommige items kunnen niet worden ontsleuteled."
msgid "Set the password"
msgstr "Wachtwoord instellen"
msgid "Add or remove tags"
msgstr "Labels toevoegen of verwijderen"
msgid "Duplicate"
msgstr "Dupliceren"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - kopiëren"
msgid "Switch between note and to-do type"
msgstr "Schakelen tussen notitie en taak"
#, fuzzy
msgid "Switch to note type"
msgstr "Schakelen tussen notitie en taak"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Schakelen tussen notitie en taak"
msgid "Copy Markdown link"
msgstr "Markdownlink kopiëren"
msgid "Delete"
msgstr "Verwijderen"
msgid "Delete notes?"
msgstr "Notities verwijderen?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr ""
"Er zijn hier geen notities. Creëer een notitie door de klikken op \"Nieuwe "
@@ -1024,6 +1034,9 @@ msgstr ""
"Deze notitie bevat geen inhoud. Klik op \"%s\" om de bewerker te openen en "
"de notitie te bewerken."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "vetgedrukte tekst"
@@ -1116,6 +1129,9 @@ msgstr "Wil je dit label verwijderen van alle notities?"
msgid "Remove this search from the sidebar?"
msgstr "Wil je deze zoekopdracht verwijderen uit de zijbalk?"
msgid "Delete"
msgstr "Verwijderen"
msgid "Rename"
msgstr "Naam wijzigen"
@@ -1365,6 +1381,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Applicatie automatisch bijwerken"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Synchronisatietussenpoos"
@@ -1462,6 +1485,25 @@ msgstr "TLS-certificaatfouten negeren"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ongeldige optie: \"%s\". Geldige waarden zijn: %s."
#, fuzzy
msgid "General"
msgstr "Algemene opties"
#, fuzzy
msgid "Synchronisation"
msgstr "Synchronisatiestatus"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Notitieboeken"
#, fuzzy
msgid "Application"
msgstr "Sluit de applicatie af."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1670,9 +1712,24 @@ msgstr "- Locatie: zodat je locatie-informatie kunt toevoegen aan een notitie."
msgid "Joplin website"
msgstr "Joplin-website"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Joplin-website"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Te verwijderen: %d"
msgid "Login with Dropbox"
msgstr "Inloggen met Dropbox"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "Hoofdsleutel %s"
@@ -1743,6 +1800,9 @@ msgstr "Omzetten naar notitie"
msgid "Convert to todo"
msgstr "Omzetten naar taak"
msgid "Copy Markdown link"
msgstr "Markdownlink kopiëren"
msgid "Hide metadata"
msgstr "Metagegevens verbergen"
@@ -1779,6 +1839,29 @@ msgstr ""
msgid "Welcome"
msgstr "Welkom"
#~ msgid "Add or remove tags"
#~ msgstr "Labels toevoegen of verwijderen"
#~ msgid "Duplicate"
#~ msgstr "Dupliceren"
#~ msgid "%s - Copy"
#~ msgstr "%s - kopiëren"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Schakelen tussen notitie en taak"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Schakelen tussen notitie en taak"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Schakelen tussen notitie en taak"
#~ msgid "Delete notes?"
#~ msgstr "Notities verwijderen?"
#~ msgid "State: %s."
#~ msgstr "Status: %s."

View File

@@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2\n"
"X-Generator: Poedit 2.0.7\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "To delete a tag, untag the associated notes."
@@ -582,6 +582,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exportando para \"%s\" com o formato \"%s\". Por favor, aguarde..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Título do caderno:"
#, fuzzy
msgid "Note body"
msgstr "Cadernos"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importando de \"%s\" com o formato \"%s\". Por favor, aguarde..."
@@ -638,6 +652,9 @@ msgstr "Negrito"
msgid "Italic"
msgstr "Itálico"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "Inserir Data e Hora"
@@ -647,9 +664,8 @@ msgstr "Editar com editor externo"
msgid "Search in all the notes"
msgstr "Pesquisar em todas as notas"
#, fuzzy
msgid "Search in current note"
msgstr "Pesquisar em todas as notas"
msgstr "Pesquisar na nota atual"
msgid "View"
msgstr "Visualizar"
@@ -660,6 +676,10 @@ msgstr "Alternar barra lateral"
msgid "Toggle editor layout"
msgstr "Alternar layout do editor"
#, fuzzy
msgid "Focus"
msgstr "Focar no corpo"
msgid "Tools"
msgstr "Ferramentas"
@@ -710,9 +730,21 @@ msgstr "Cancelar"
msgid "Current version is up-to-date."
msgstr "A versão atual está atualizada."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Uma atualização está disponível, você quer baixar agora?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Sim"
@@ -787,13 +819,16 @@ msgstr ""
"Esse token de autoriza\\u00e7\\u00e3o só é necess\\u00e1rio para permitir "
"que aplicativos de terceiros acessem o Joplin."
msgid "Check synchronisation configuration"
msgstr "Verificar a configuração da sincronização"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Notas e configurações estão armazenadas em: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Verificar a configuração da sincronização"
msgid "Apply"
msgstr "Aplicar"
@@ -887,6 +922,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Encriptação está:"
#, fuzzy
msgid "Usage"
msgstr "Uso: %s"
msgid "Back"
msgstr "Voltar"
@@ -938,34 +977,6 @@ msgstr "Alguns itens não podem ser decriptados."
msgid "Set the password"
msgstr "Configurar a senha"
msgid "Add or remove tags"
msgstr "Adicionar ou remover tags"
msgid "Duplicate"
msgstr "Duplicar"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - Copiar"
msgid "Switch between note and to-do type"
msgstr "Alternar entre os tipos Nota e Tarefa"
msgid "Switch to note type"
msgstr "Alternar para o tipo Nota"
msgid "Switch to to-do type"
msgstr "Alternar para o tipo Tarefa"
msgid "Copy Markdown link"
msgstr "Copiar link de Markdown"
msgid "Delete"
msgstr "Excluir"
msgid "Delete notes?"
msgstr "Excluir notas?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Não há notas aqui. Crie uma, clicando em \"Nova nota\"."
@@ -1013,6 +1024,9 @@ msgstr ""
"Esta nota não possui conteúdo. Clique em \"%s\" para alternar para o editor, "
"e edite a nota."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "texto forte"
@@ -1105,6 +1119,9 @@ msgstr "Remover esta tag de todas as notas?"
msgid "Remove this search from the sidebar?"
msgstr "Remover essa pesquisa da barra lateral?"
msgid "Delete"
msgstr "Excluir"
msgid "Rename"
msgstr "Renomear"
@@ -1260,7 +1277,7 @@ msgid "title"
msgstr "título"
msgid "updated date"
msgstr "data de ataualização"
msgstr "data de atualização"
msgid "created date"
msgstr "data de criação"
@@ -1342,9 +1359,8 @@ msgstr "Iniciar aplicativo minimizado na barra de tarefas"
msgid "Global zoom percentage"
msgstr "Porcentagem global do zoom"
#, fuzzy
msgid "Editor font size"
msgstr "Família de fontes do editor"
msgstr "Tamanho da fonte no Editor"
msgid "Editor font family"
msgstr "Família de fontes do editor"
@@ -1359,6 +1375,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Atualizar automaticamente o aplicativo"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Intervalo de sincronização"
@@ -1458,6 +1481,25 @@ msgstr "Ignorar erros de certificados TLS"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Valor da opção inválida: \"%s\". Os valores possíveis são: %s."
#, fuzzy
msgid "General"
msgstr "Opções Gerais"
#, fuzzy
msgid "Synchronisation"
msgstr "Status de sincronização"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Cadernos"
#, fuzzy
msgid "Application"
msgstr "Localização"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr "A tag \"%s\" já existe. Escolha um nome diferente."
@@ -1668,9 +1710,25 @@ msgstr ""
msgid "Joplin website"
msgstr "Site do Joplin"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Site do Joplin"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Para excluir: %d"
msgid "Login with Dropbox"
msgstr "Login com Dropbox"
#, fuzzy
msgid "Enter code here"
msgstr "Entrar no modo de linha de comando"
#, javascript-format
msgid "Master Key %s"
msgstr "Chave Master %s"
@@ -1722,9 +1780,8 @@ msgstr "O app mobile do Joplin não suporta, atualmente, esse tipo de link: %s"
msgid "Unsupported image type: %s"
msgstr "Tipo de imagem não suportada: %s"
#, fuzzy
msgid "Take photo"
msgstr "Anexar foto"
msgstr "Tirar foto"
msgid "Attach photo"
msgstr "Anexar foto"
@@ -1741,6 +1798,9 @@ msgstr "Converter para nota"
msgid "Convert to todo"
msgstr "Converter para tarefa"
msgid "Copy Markdown link"
msgstr "Copiar link de Markdown"
msgid "Hide metadata"
msgstr "Ocultar metadados"
@@ -1775,6 +1835,27 @@ msgstr "Você não possui cadernos. Crie um clicando no botão (+)."
msgid "Welcome"
msgstr "Bem-vindo"
#~ msgid "Add or remove tags"
#~ msgstr "Adicionar ou remover tags"
#~ msgid "Duplicate"
#~ msgstr "Duplicar"
#~ msgid "%s - Copy"
#~ msgstr "%s - Copiar"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Alternar entre os tipos Nota e Tarefa"
#~ msgid "Switch to note type"
#~ msgstr "Alternar para o tipo Nota"
#~ msgid "Switch to to-do type"
#~ msgstr "Alternar para o tipo Tarefa"
#~ msgid "Delete notes?"
#~ msgstr "Excluir notas?"
#~ msgid "State: %s."
#~ msgstr "Estado: \"%s\"."
@@ -1818,9 +1899,6 @@ msgstr "Bem-vindo"
#~ msgid "Give focus to previous pane"
#~ msgstr "Dar o foco para o painel anterior"
#~ msgid "Enter command line mode"
#~ msgstr "Entrar no modo de linha de comando"
#~ msgid "Exit command line mode"
#~ msgstr "Sair do modo de linha de comando"

View File

@@ -521,6 +521,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Se exportă către \"%s\" în format \"%s\". Vă rugăm să așteotați..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Titlul caietului de notițe:"
#, fuzzy
msgid "Note body"
msgstr "Caiete de notițe"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr ""
@@ -578,6 +592,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -600,6 +617,9 @@ msgstr ""
msgid "Toggle editor layout"
msgstr ""
msgid "Focus"
msgstr ""
msgid "Tools"
msgstr "Unelte"
@@ -650,9 +670,21 @@ msgstr "Anulați"
msgid "Current version is up-to-date."
msgstr "Versiunea curentă este actualizată."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr ""
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Da"
@@ -720,13 +752,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr ""
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr ""
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr ""
msgid "Apply"
msgstr "Aplicați"
@@ -805,6 +840,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Criptarea este:"
#, fuzzy
msgid "Usage"
msgstr "Utilizare: %s"
msgid "Back"
msgstr "Înapoi"
@@ -855,36 +894,6 @@ msgstr "Câțiva itemi nu pot fi descriptați."
msgid "Set the password"
msgstr "Setați parola"
msgid "Add or remove tags"
msgstr "Adăugați ori eliminați etichete"
msgid "Duplicate"
msgstr "Duplicați"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - Copiați"
msgid "Switch between note and to-do type"
msgstr "Schimbați între notiță și sarcină"
#, fuzzy
msgid "Switch to note type"
msgstr "Schimbați între notiță și sarcină"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Schimbați între notiță și sarcină"
msgid "Copy Markdown link"
msgstr "Copiați link-ul Markdown"
msgid "Delete"
msgstr "Ștergeți"
msgid "Delete notes?"
msgstr "Ștergeți notițele?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr ""
@@ -930,6 +939,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1022,6 +1034,9 @@ msgstr ""
msgid "Remove this search from the sidebar?"
msgstr ""
msgid "Delete"
msgstr "Ștergeți"
msgid "Rename"
msgstr "Redenumiți"
@@ -1260,6 +1275,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Actualizați automat aplicația"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Intervalul de sincronizare"
@@ -1344,6 +1366,25 @@ msgstr "Ignoră erorile de certificat TLS"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr ""
#, fuzzy
msgid "General"
msgstr "Opțiuni Generale"
#, fuzzy
msgid "Synchronisation"
msgstr "Statusul sincronizării"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Caiete de notițe"
#, fuzzy
msgid "Application"
msgstr "Duplicați"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1535,9 +1576,24 @@ msgstr ""
msgid "Joplin website"
msgstr "Website Joplin"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Website Joplin"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "De șters: %d"
msgid "Login with Dropbox"
msgstr "Autentificați-vă cu Dropbox"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr ""
@@ -1608,6 +1664,9 @@ msgstr ""
msgid "Convert to todo"
msgstr ""
msgid "Copy Markdown link"
msgstr "Copiați link-ul Markdown"
msgid "Hide metadata"
msgstr "Ascundeți metadatele"
@@ -1643,6 +1702,26 @@ msgstr ""
msgid "Welcome"
msgstr "Bine ați venit"
#~ msgid "Add or remove tags"
#~ msgstr "Adăugați ori eliminați etichete"
#~ msgid "%s - Copy"
#~ msgstr "%s - Copiați"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Schimbați între notiță și sarcină"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Schimbați între notiță și sarcină"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Schimbați între notiță și sarcină"
#~ msgid "Delete notes?"
#~ msgstr "Ștergeți notițele?"
#~ msgid "State: %s."
#~ msgstr "Statut: %s."

View File

@@ -583,6 +583,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Экспорт в «%s» в формате «%s». Пожалуйста, ожидайте..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Название блокнота:"
#, fuzzy
msgid "Note body"
msgstr "Блокноты"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Импорт из «%s» в формате «%s». Пожалуйста, ожидайте..."
@@ -640,6 +654,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -657,11 +674,15 @@ msgid "View"
msgstr "Вид"
msgid "Toggle sidebar"
msgstr ""
msgstr "Переключить панель"
msgid "Toggle editor layout"
msgstr "Переключить вид редактора"
#, fuzzy
msgid "Focus"
msgstr "Фокус на содержимом"
msgid "Tools"
msgstr "Инструменты"
@@ -669,7 +690,7 @@ msgid "Synchronisation status"
msgstr "Статус синхронизации"
msgid "Web clipper options"
msgstr ""
msgstr "Настройки веб-клиппера"
msgid "Encryption options"
msgstr "Настройки шифрования"
@@ -712,9 +733,21 @@ msgstr "Отмена"
msgid "Current version is up-to-date."
msgstr "Вы используете самую свежую версию."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Доступно обновление. Желаете скачать его сейчас?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Да"
@@ -725,7 +758,7 @@ msgid "Token has been copied to the clipboard!"
msgstr ""
msgid "The web clipper service is enabled and set to auto-start."
msgstr ""
msgstr "Веб-клиппер включен"
#, javascript-format
msgid "Status: Started on port %d"
@@ -736,13 +769,13 @@ msgid "Status: %s"
msgstr "Статус: «%s»."
msgid "Disable Web Clipper Service"
msgstr ""
msgstr "Выключить веб-клиппер"
msgid "The web clipper service is not enabled."
msgstr ""
msgstr "Веб-клиппер остановлен"
msgid "Enable Web Clipper Service"
msgstr ""
msgstr "Включить веб-клиппер"
msgid ""
"Joplin Web Clipper allows saving web pages and screenshots from your browser "
@@ -753,7 +786,7 @@ msgid "In order to use the web clipper, you need to do the following:"
msgstr ""
msgid "Step 1: Enable the clipper service"
msgstr ""
msgstr "Шаг 1: включить веб-клиппер"
msgid ""
"This service allows the browser extension to communicate with Joplin. When "
@@ -762,38 +795,41 @@ msgid ""
msgstr ""
msgid "Step 2: Install the extension"
msgstr ""
msgstr "Шаг 2: установить расширение"
msgid "Download and install the relevant extension for your browser:"
msgstr ""
msgstr "Скачайте и установите расширение для вашего браузера"
#, fuzzy
msgid "Advanced options"
msgstr "Показывать расширенные настройки"
msgid "Authorisation token:"
msgstr ""
msgstr "Токен авторизации"
msgid "Copy token"
msgstr ""
msgstr "Скопировать токен"
msgid ""
"This authorisation token is only needed to allow third-party applications to "
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Проверить настройки синхронизации"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Заметки и настройки сохранены в: %s"
msgid "Apply"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Проверить настройки синхронизации"
msgid "Apply"
msgstr "Применить"
msgid "Submit"
msgstr ""
msgstr "Отправить"
msgid "Save"
msgstr "Сохранить"
@@ -882,6 +918,10 @@ msgstr "Статус"
msgid "Encryption is:"
msgstr "Шифрование:"
#, fuzzy
msgid "Usage"
msgstr "Использование: %s"
msgid "Back"
msgstr "Назад"
@@ -934,37 +974,6 @@ msgstr "Некоторые элементы не могут быть расши
msgid "Set the password"
msgstr "Установить пароль"
msgid "Add or remove tags"
msgstr "Добавить или удалить теги"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Копировать"
msgid "Switch between note and to-do type"
msgstr "Переключить тип между заметкой и задачей"
#, fuzzy
msgid "Switch to note type"
msgstr "Переключить тип между заметкой и задачей"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Переключить тип между заметкой и задачей"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Delete"
msgstr "Удалить"
msgid "Delete notes?"
msgstr "Удалить заметки?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Здесь нет заметок. Создайте новую нажатием на «Новая заметка»."
@@ -1012,6 +1021,9 @@ msgstr ""
"Заметка пуста. Нажмите на «%s», чтобы переключиться в редактор и "
"отредактировать её."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1106,6 +1118,9 @@ msgstr "Убрать этот тег со всех заметок?"
msgid "Remove this search from the sidebar?"
msgstr "Убрать этот запрос с боковой панели?"
msgid "Delete"
msgstr "Удалить"
msgid "Rename"
msgstr "Переименовать"
@@ -1360,6 +1375,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Автоматически обновлять приложение"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Интервал синхронизации"
@@ -1452,6 +1474,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Неверное значение параметра: «%s». Доступные значения: %s."
#, fuzzy
msgid "General"
msgstr "Основные настройки"
#, fuzzy
msgid "Synchronisation"
msgstr "Статус синхронизации"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Блокноты"
#, fuzzy
msgid "Application"
msgstr "Выйти из приложения."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1653,10 +1694,26 @@ msgstr ""
msgid "Joplin website"
msgstr "Сайт Joplin"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Сайт Joplin"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "К удалению: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Войти в OneDrive"
#, fuzzy
msgid "Enter code here"
msgstr "Войти в режим командной строки"
#, javascript-format
msgid "Master Key %s"
msgstr "Мастер-ключ %s"
@@ -1727,6 +1784,10 @@ msgstr "Преобразовать в заметку"
msgid "Convert to todo"
msgstr "Преобразовать в задачу"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Markdown"
msgid "Hide metadata"
msgstr "Скрыть метаданные"
@@ -1761,6 +1822,27 @@ msgstr "У вас сейчас нет блокнота. Создайте его
msgid "Welcome"
msgstr "Добро пожаловать"
#~ msgid "Add or remove tags"
#~ msgstr "Добавить или удалить теги"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Копировать"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Переключить тип между заметкой и задачей"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Переключить тип между заметкой и задачей"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Переключить тип между заметкой и задачей"
#~ msgid "Delete notes?"
#~ msgstr "Удалить заметки?"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Статус: «%s»."
@@ -1802,9 +1884,6 @@ msgstr "Добро пожаловать"
#~ msgid "Give focus to previous pane"
#~ msgstr "Переключиться на предыдущую панель"
#~ msgid "Enter command line mode"
#~ msgstr "Войти в режим командной строки"
#~ msgid "Exit command line mode"
#~ msgstr "Выйти из режима командной строки"
@@ -1814,9 +1893,6 @@ msgstr "Добро пожаловать"
#~ msgid "Cancel the current command."
#~ msgstr "Отменить текущую команду."
#~ msgid "Exit the application."
#~ msgstr "Выйти из приложения."
#~ msgid "Delete the currently selected note or notebook."
#~ msgstr "Удалить текущую выбранную заметку или блокнот."

View File

@@ -582,6 +582,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Izvažam v \"%s\" kot \"%s\" format. Prosim počakajte..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Naslov beležnice:"
#, fuzzy
msgid "Note body"
msgstr "Beležnice"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Uvažam v \"%s\" kot \"%s\" format. Prosim počakajte..."
@@ -639,6 +653,9 @@ msgstr ""
msgid "Italic"
msgstr ""
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr ""
@@ -661,6 +678,10 @@ msgstr ""
msgid "Toggle editor layout"
msgstr "Spremeni izgled urejevalnika"
#, fuzzy
msgid "Focus"
msgstr "Fokusiraj vsebino"
msgid "Tools"
msgstr "Orodja"
@@ -711,9 +732,21 @@ msgstr "Prekliči"
msgid "Current version is up-to-date."
msgstr "Sedanja verzija je najnovejša."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "Posodobitev je na voljo, jo želite prenesti sedaj?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Da"
@@ -781,13 +814,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Preveri nastavitve sinhronizacije"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Zabeležke in nastavitve so shranjene v: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Preveri nastavitve sinhronizacije"
msgid "Apply"
msgstr ""
@@ -881,6 +917,10 @@ msgstr "Status"
msgid "Encryption is:"
msgstr "Enkripcija je:"
#, fuzzy
msgid "Usage"
msgstr "Uporaba: %s"
msgid "Back"
msgstr "Nazaj"
@@ -934,37 +974,6 @@ msgstr "Nekateri predmeti ne morejo biti dekriptirani."
msgid "Set the password"
msgstr "Nastavi geslo"
msgid "Add or remove tags"
msgstr "Dodaj ali odstrani oznake"
msgid "Duplicate"
msgstr ""
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "Kopiraj"
msgid "Switch between note and to-do type"
msgstr "Menjaj med zabeležko in seznamom opravil"
#, fuzzy
msgid "Switch to note type"
msgstr "Menjaj med zabeležko in seznamom opravil"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Menjaj med zabeležko in seznamom opravil"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Sistem označevanja"
msgid "Delete"
msgstr "Izbriši"
msgid "Delete notes?"
msgstr "Izbriši zabeležke?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr ""
"Trenutno ni tukaj nobene zabeležke. Ustvarite jo z klikom na \"Nova zabeležka"
@@ -1016,6 +1025,9 @@ msgstr ""
"Ta zabeležka nima vsebine. Kliknite na \"%s\" da menjate med urejevalnikom "
"in urejanje zabeležke."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1110,6 +1122,9 @@ msgstr "Odstranite to oznako iz vseh zabeležk?"
msgid "Remove this search from the sidebar?"
msgstr "Odstranite ta iskalni niz iz stranske vrstice?"
msgid "Delete"
msgstr "Izbriši"
msgid "Rename"
msgstr "Preimenuj"
@@ -1364,6 +1379,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Samodejno posodobi aplikacijo"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Časovni interval sinhronizacije"
@@ -1456,6 +1478,25 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Neveljavna vrednost: \"%s\". Možne vrednosti so : %s."
#, fuzzy
msgid "General"
msgstr "Splošne možnosti"
#, fuzzy
msgid "Synchronisation"
msgstr "Status sinhronizacije"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Beležnice"
#, fuzzy
msgid "Application"
msgstr "Izhod iz aplikacije."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1656,10 +1697,25 @@ msgstr ""
msgid "Joplin website"
msgstr "Joplin spletna stran"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Joplin spletna stran"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "Za izbris: %d"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Prijavi se z OneDrive"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "Glavno geslo %s"
@@ -1730,6 +1786,10 @@ msgstr "Pretvori v zabeležko"
msgid "Convert to todo"
msgstr "Pretvori v za narediti"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Sistem označevanja"
msgid "Hide metadata"
msgstr "Skrij meta podatke"
@@ -1764,6 +1824,27 @@ msgstr "Trenutno nimate nobene beležnice. Ustvarite jo s klikom na (+) gumb."
msgid "Welcome"
msgstr "Dobrodošli"
#~ msgid "Add or remove tags"
#~ msgstr "Dodaj ali odstrani oznake"
#, fuzzy
#~ msgid "%s - Copy"
#~ msgstr "Kopiraj"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Menjaj med zabeležko in seznamom opravil"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Menjaj med zabeležko in seznamom opravil"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Menjaj med zabeležko in seznamom opravil"
#~ msgid "Delete notes?"
#~ msgstr "Izbriši zabeležke?"
#~ msgid "State: %s."
#~ msgstr "Stanje: %s."

View File

@@ -589,6 +589,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "Exportera till \"%s\" som \"%s\" format. Vänta..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "Titel på anteckningsbok:"
#, fuzzy
msgid "Note body"
msgstr "Anteckningsböcker"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importerar från \"%s\" som \"%s\" format. Vänta..."
@@ -646,6 +660,9 @@ msgstr "Fet"
msgid "Italic"
msgstr "Kursiv"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "Infoga datumtid"
@@ -668,6 +685,10 @@ msgstr "Växla sidofältet"
msgid "Toggle editor layout"
msgstr "Växla redigeringslayout"
#, fuzzy
msgid "Focus"
msgstr "Fokus på huvuddel"
msgid "Tools"
msgstr "Verktyg"
@@ -718,9 +739,21 @@ msgstr "Avbryt"
msgid "Current version is up-to-date."
msgstr "Nuvarande version är uppdaterad."
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "En uppdatering är tillgänglig, vill du hämta den nu?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "Ja"
@@ -793,13 +826,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Kontrollera synkroniseringskonfigurationen"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "Anteckningar och inställningar lagras i: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Kontrollera synkroniseringskonfigurationen"
msgid "Apply"
msgstr "Tillämpa"
@@ -894,6 +930,10 @@ msgstr "Tillstånd"
msgid "Encryption is:"
msgstr "Kryptering är:"
#, fuzzy
msgid "Usage"
msgstr "Användning: %s"
msgid "Back"
msgstr "Tillbaka"
@@ -946,36 +986,6 @@ msgstr "Några objekt kan inte dekrypteras."
msgid "Set the password"
msgstr "Ställ in lösenord"
msgid "Add or remove tags"
msgstr "Lägg till eller ta bort taggar"
msgid "Duplicate"
msgstr "Duplikat"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - Kopiera"
msgid "Switch between note and to-do type"
msgstr "Växla mellan antecknings- och att-göra-typ"
#, fuzzy
msgid "Switch to note type"
msgstr "Växla mellan antecknings- och att-göra-typ"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Växla mellan antecknings- och att-göra-typ"
msgid "Copy Markdown link"
msgstr "Kopiera Markdown-länk"
msgid "Delete"
msgstr "Ta bort"
msgid "Delete notes?"
msgstr "Ta bort anteckningar?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "Inga anteckningar här. Skapa en genom att klicka på \"Ny anteckning\"."
@@ -1025,6 +1035,9 @@ msgstr ""
"Den här anteckningen har inget innehåll. Klicka på \"%s\" för att växla "
"redigeraren och redigera anteckningen."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "stark text"
@@ -1117,6 +1130,9 @@ msgstr "Ta bort den här taggen från alla anteckningar?"
msgid "Remove this search from the sidebar?"
msgstr "Ta bort den här sökningen från sidofältet?"
msgid "Delete"
msgstr "Ta bort"
msgid "Rename"
msgstr "Byt namn"
@@ -1367,6 +1383,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "Uppdatera programmet automatiskt"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "Synkroniseringsintervall"
@@ -1463,6 +1486,25 @@ msgstr "Ignorera TLS-certifikatfel"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ogiltigt inställningsvärde: \"%s\". Möjliga värden är: %s."
#, fuzzy
msgid "General"
msgstr "Allmänna inställningar"
#, fuzzy
msgid "Synchronisation"
msgstr "Synkroniseringstillstånd"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "Anteckningsböcker"
#, fuzzy
msgid "Application"
msgstr "Avslutar programmet."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1672,9 +1714,24 @@ msgstr ""
msgid "Joplin website"
msgstr "Joplin-webbplats"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Joplin-webbplats"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "För att ta bort: %d"
msgid "Login with Dropbox"
msgstr "Logga in med Dropbox"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "Huvudnyckel %s"
@@ -1746,6 +1803,9 @@ msgstr "Konvertera till anteckning"
msgid "Convert to todo"
msgstr "Konvertera till att-göra"
msgid "Copy Markdown link"
msgstr "Kopiera Markdown-länk"
msgid "Hide metadata"
msgstr "Dölj metadata"
@@ -1783,6 +1843,29 @@ msgstr ""
msgid "Welcome"
msgstr "Välkommen"
#~ msgid "Add or remove tags"
#~ msgstr "Lägg till eller ta bort taggar"
#~ msgid "Duplicate"
#~ msgstr "Duplikat"
#~ msgid "%s - Copy"
#~ msgstr "%s - Kopiera"
#~ msgid "Switch between note and to-do type"
#~ msgstr "Växla mellan antecknings- och att-göra-typ"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "Växla mellan antecknings- och att-göra-typ"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "Växla mellan antecknings- och att-göra-typ"
#~ msgid "Delete notes?"
#~ msgstr "Ta bort anteckningar?"
#~ msgid "State: %s."
#~ msgstr "Tillstånd: %s."

File diff suppressed because it is too large Load Diff

View File

@@ -548,6 +548,20 @@ msgstr ""
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "匯出到 \"%s\" 為 \"%s\" 格式。請稍候..."
msgid "Sidebar"
msgstr ""
msgid "Note list"
msgstr ""
#, fuzzy
msgid "Note title"
msgstr "記事本標題:"
#, fuzzy
msgid "Note body"
msgstr "記事本"
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "從 \"%s\" 匯入為 \"%s\" 格式。請稍候..."
@@ -605,6 +619,9 @@ msgstr "粗體"
msgid "Italic"
msgstr "斜體"
msgid "Link"
msgstr ""
msgid "Insert Date Time"
msgstr "插入日期時間"
@@ -627,6 +644,10 @@ msgstr "顯示 / 隱藏側邊欄"
msgid "Toggle editor layout"
msgstr "切換編輯器佈局"
#, fuzzy
msgid "Focus"
msgstr "游標置於內文"
msgid "Tools"
msgstr "工具"
@@ -677,9 +698,21 @@ msgstr "取消"
msgid "Current version is up-to-date."
msgstr "此版本是最新的。"
#, javascript-format
msgid "%s (pre-release)"
msgstr ""
msgid "An update is available, do you want to download it now?"
msgstr "有可用的更新,您需要立即下載嗎?"
#, javascript-format
msgid "Your version: v%s"
msgstr ""
#, javascript-format
msgid "New version: v%s"
msgstr ""
msgid "Yes"
msgstr "是"
@@ -749,13 +782,16 @@ msgid ""
"access Joplin."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "檢測同步設置"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "所有記事和設置均儲存於: %s"
msgid "Browse..."
msgstr ""
msgid "Check synchronisation configuration"
msgstr "檢測同步設置"
msgid "Apply"
msgstr "套用"
@@ -843,6 +879,10 @@ msgstr "狀態"
msgid "Encryption is:"
msgstr "加密:"
#, fuzzy
msgid "Usage"
msgstr "使用資訊: %s"
msgid "Back"
msgstr "返回"
@@ -893,36 +933,6 @@ msgstr "有些項目不能解密。"
msgid "Set the password"
msgstr "設置密碼"
msgid "Add or remove tags"
msgstr "新增或移除標籤"
msgid "Duplicate"
msgstr "新增複本"
#, javascript-format
msgid "%s - Copy"
msgstr "%s - 複本"
msgid "Switch between note and to-do type"
msgstr "切換到記事 / 待辦事項"
#, fuzzy
msgid "Switch to note type"
msgstr "切換到記事 / 待辦事項"
#, fuzzy
msgid "Switch to to-do type"
msgstr "切換到記事 / 待辦事項"
msgid "Copy Markdown link"
msgstr "複製 Markdown 連結"
msgid "Delete"
msgstr "刪除"
msgid "Delete notes?"
msgstr "刪除此記事?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "當前沒有任何筆記。通過按一下 \"新增筆記\" 去建立。"
@@ -968,6 +978,9 @@ msgid ""
"note."
msgstr "此筆記沒有內容。按一下 \"%s\" 切換到編輯模式並編輯筆記。"
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "重要文字 <strong>"
@@ -1060,6 +1073,9 @@ msgstr "是否從所有記事中刪除此標籤?"
msgid "Remove this search from the sidebar?"
msgstr "是否從側邊欄中刪除此搜索?"
msgid "Delete"
msgstr "刪除"
msgid "Rename"
msgstr "重新命名"
@@ -1305,6 +1321,13 @@ msgstr ""
msgid "Automatically update the application"
msgstr "自動更新應用程式"
msgid "Get pre-releases when checking for updates"
msgstr ""
#, javascript-format
msgid "See the pre-release page for more details: %s"
msgstr ""
msgid "Synchronisation interval"
msgstr "同步時間間隔"
@@ -1396,6 +1419,25 @@ msgstr "忽略 TLS 證書錯誤"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "不正確選項值: \"%s\"。可能的值為: %s。"
#, fuzzy
msgid "General"
msgstr "一般選項"
#, fuzzy
msgid "Synchronisation"
msgstr "顯示同步狀態"
msgid "Appearance"
msgstr ""
#, fuzzy
msgid "Note"
msgstr "記事本"
#, fuzzy
msgid "Application"
msgstr "離開本程式。"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
@@ -1594,9 +1636,24 @@ msgstr "- 位置: 允許將地理位置資訊附加到筆記。"
msgid "Joplin website"
msgstr "Joplin 官方網站"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "Joplin 官方網站"
#, javascript-format
msgid "Database v%s"
msgstr ""
#, fuzzy, javascript-format
msgid "FTS enabled: %d"
msgstr "標示刪除: %d"
msgid "Login with Dropbox"
msgstr "以 Dropbox 登錄"
msgid "Enter code here"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr "主密碼 %s"
@@ -1667,6 +1724,9 @@ msgstr "轉換為記事"
msgid "Convert to todo"
msgstr "轉換為待辦事項"
msgid "Copy Markdown link"
msgstr "複製 Markdown 連結"
msgid "Hide metadata"
msgstr "隱藏後設資料 (metadata)"
@@ -1699,6 +1759,29 @@ msgstr "您當前沒有任何筆記本。通過按一下 (+) 鍵去建立一本
msgid "Welcome"
msgstr "歡迎"
#~ msgid "Add or remove tags"
#~ msgstr "新增或移除標籤"
#~ msgid "Duplicate"
#~ msgstr "新增複本"
#~ msgid "%s - Copy"
#~ msgstr "%s - 複本"
#~ msgid "Switch between note and to-do type"
#~ msgstr "切換到記事 / 待辦事項"
#, fuzzy
#~ msgid "Switch to note type"
#~ msgstr "切換到記事 / 待辦事項"
#, fuzzy
#~ msgid "Switch to to-do type"
#~ msgstr "切換到記事 / 待辦事項"
#~ msgid "Delete notes?"
#~ msgstr "刪除此記事?"
#~ msgid "State: %s."
#~ msgstr "狀態: %s。"

View File

@@ -1,6 +1,6 @@
{
"name": "joplin",
"version": "1.0.118",
"version": "1.0.122",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -29,16 +29,16 @@
},
"dependencies": {
"acorn": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz",
"integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg=="
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz",
"integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA=="
}
}
},
"acorn-walk": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.0.1.tgz",
"integrity": "sha512-PqVQ8c6a3kyqdsUZlC7nljp3FFuxipBRHKu+7C1h8QygBFlzTaDX5HD383jej3Peed+1aDG8HwkfB1Z1HMNPkw=="
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
"integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw=="
},
"ajv": {
"version": "5.5.2",
@@ -488,12 +488,12 @@
"integrity": "sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo="
},
"data-urls": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz",
"integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
"integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
"requires": {
"abab": "^2.0.0",
"whatwg-mimetype": "^2.1.0",
"whatwg-mimetype": "^2.2.0",
"whatwg-url": "^7.0.0"
},
"dependencies": {
@@ -555,6 +555,11 @@
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
},
"diacritics": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
"integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E="
},
"domexception": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
@@ -1422,9 +1427,9 @@
"dev": true
},
"joplin-turndown": {
"version": "4.0.9",
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.9.tgz",
"integrity": "sha512-8MOxX4t5Ai22muHhXPMGNoKc/AB7gSo0eUvNh6dyd6b3vcSiMIRZE8UHpMjS9ruJQ+8e+8TtJXc0nfbexeHwrA==",
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.11.tgz",
"integrity": "sha512-2oiwWX0nKYi1NVcaprSsrXQkYdGoRtPWFmnXdWQnQW44jlgjFV38B4VrgliwX5ZMq7cbx6A9IBwfXcBL2YV2NA==",
"requires": {
"jsdom": "^11.9.0"
}
@@ -1483,6 +1488,17 @@
"xml-name-validator": "^3.0.0"
},
"dependencies": {
"ajv": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz",
"integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"aws4": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
@@ -1501,46 +1517,46 @@
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"fast-deep-equal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
},
"form-data": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "1.0.6",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
},
"dependencies": {
"combined-stream": {
"version": "1.0.6",
"resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"requires": {
"delayed-stream": "~1.0.0"
}
}
}
},
"har-validator": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
"integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
"requires": {
"ajv": "^5.3.0",
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
}
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"mime-db": {
"version": "1.36.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
"integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
"version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
},
"mime-types": {
"version": "2.1.20",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
"integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
"version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"requires": {
"mime-db": "~1.36.0"
"mime-db": "~1.37.0"
}
},
"oauth-sign": {
@@ -2788,7 +2804,7 @@
"requires": {
"chalk": "^2.1.0",
"emphasize": "^1.5.0",
"node-emoji": "git+https://github.com/laurent22/node-emoji.git#9fa01eac463e94dde1316ef8c53089eeef4973b5",
"node-emoji": "git+https://github.com/laurent22/node-emoji.git",
"slice-ansi": "^1.0.0",
"string-width": "^2.1.1",
"terminal-kit": "^1.13.11",
@@ -2910,6 +2926,21 @@
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
"integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
},
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"requires": {
"punycode": "^2.1.0"
},
"dependencies": {
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
}
}
},
"url-parse": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz",
@@ -2958,17 +2989,17 @@
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
},
"whatwg-encoding": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz",
"integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
"integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
"requires": {
"iconv-lite": "0.4.23"
"iconv-lite": "0.4.24"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
@@ -2976,9 +3007,9 @@
}
},
"whatwg-mimetype": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz",
"integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw=="
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
"integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
},
"whatwg-url": {
"version": "6.5.0",

View File

@@ -15,11 +15,12 @@
"years": [
2016,
2017,
2018
2018,
2019
],
"owner": "Laurent Cozic"
},
"version": "1.0.118",
"version": "1.0.122",
"bin": {
"joplin": "./main.js"
},
@@ -31,6 +32,7 @@
"async-mutex": "^0.1.3",
"base-64": "^0.1.0",
"compare-version": "^0.1.2",
"diacritics": "^1.3.0",
"es6-promise-pool": "^2.5.0",
"follow-redirects": "^1.2.4",
"form-data": "^2.1.4",
@@ -39,7 +41,7 @@
"html-minifier": "^3.5.15",
"image-data-uri": "^2.0.0",
"image-type": "^3.0.0",
"joplin-turndown": "^4.0.9",
"joplin-turndown": "^4.0.11",
"joplin-turndown-plugin-gfm": "^1.0.7",
"jssha": "^2.3.0",
"levenshtein": "^1.0.5",

View File

@@ -22,18 +22,22 @@ trap finish EXIT
cd "$ROOT_DIR"
npm test tests-build/ArrayUtils.js
npm test tests-build/encryption.js
npm test tests-build/EnexToMd.js
npm test tests-build/HtmlToMd.js
npm test tests-build/markdownUtils.js
npm test tests-build/models_BaseItem.js
npm test tests-build/models_Folder.js
npm test tests-build/models_ItemChange.js
npm test tests-build/models_Note.js
npm test tests-build/models_Tag.js
npm test tests-build/models_Resource.js
npm test tests-build/models_Setting.js
npm test tests-build/models_Tag.js
npm test tests-build/pathUtils.js
npm test tests-build/services_InteropService.js
npm test tests-build/services_ResourceService.js
npm test tests-build/urlUtils.js
npm test tests-build/encryption.js
npm test tests-build/services_rest_Api.js
npm test tests-build/synchronizer.js
npm test tests-build/services_SearchEngine.js
npm test tests-build/StringUtils.js
npm test tests-build/synchronizer.js
npm test tests-build/urlUtils.js

View File

@@ -37,7 +37,7 @@ describe('HtmlToMd', function() {
const htmlPath = basePath + '/' + htmlFilename;
const mdPath = basePath + '/' + filename(htmlFilename) + '.md';
// if (htmlFilename !== 'anchor_with_url_with_spaces.html') continue;
// if (htmlFilename !== 'picture.html') continue;
const html = await shim.fsDriver().readFile(htmlPath);
let expectedMd = await shim.fsDriver().readFile(mdPath);

View File

@@ -0,0 +1,45 @@
require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-utils.js');
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
const StringUtils = require('lib/string-utils');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
describe('StringUtils', function() {
beforeEach(async (done) => {
done();
});
it('should surround keywords with strings', async (done) => {
const testCases = [
[[], 'test', 'a', 'b', 'test'],
[['test'], 'test', 'a', 'b', 'atestb'],
[['test'], 'Test', 'a', 'b', 'aTestb'],
[['te[]st'], 'Te[]st', 'a', 'b', 'aTe[]stb'],
// [['test1', 'test2'], 'bla test1 blabla test1 bla test2 not this one - test22', 'a', 'b', 'bla atest1b blabla atest1b bla atest2b not this one - test22'],
[['test1', 'test2'], 'bla test1 test1 bla test2', '<span class="highlighted-keyword">', '</span>', 'bla <span class="highlighted-keyword">test1</span> <span class="highlighted-keyword">test1</span> bla <span class="highlighted-keyword">test2</span>'],
// [[{ type:'regex', value:'test.*?'}], 'bla test1 test1 bla test2 test tttest', 'a', 'b', 'bla atest1b atest1b bla atest2b atestb tttest'],
];
for (let i = 0; i < testCases.length; i++) {
const t = testCases[i];
const keywords = t[0];
const input = t[1];
const prefix = t[2];
const suffix = t[3];
const expected = t[4];
const actual = StringUtils.surroundKeywords(keywords, input, prefix, suffix);
expect(actual).toBe(expected, 'Test case ' + i);
}
done();
});
});

View File

@@ -0,0 +1,47 @@
<figure itemprop="associatedMedia image" itemscope="" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="75583fcfe2eb74f1e89ea320355ff4156f4ade7b" id="img-1">
<meta itemprop="representativeOfPage" content="true">
<meta itemprop="url" content="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2a6a7ba9738c6a6a79eab39ba46c34cd">
<meta itemprop="width" content="3904">
<meta itemprop="height" content="2342">
<a href="#img-1" data-link-name="Launch Article Lightbox" data-is-ajax="">
<div>
<picture>
<!--[if IE 9]><video style="display: none;"><![endif]-->
<source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=bacff59339e5ba117f957c24218ef76b 1240w">
<source media="(min-width: 980px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f1427ce6689688d3d6e0087fe9cb5c18 620w">
<source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="700px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=700&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=70accd3c6e7d2c36f5ccc7321eab097e 1400w">
<source media="(min-width: 740px)" sizes="700px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2a6a7ba9738c6a6a79eab39ba46c34cd 700w">
<source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=bacff59339e5ba117f957c24218ef76b 1240w">
<source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f1427ce6689688d3d6e0087fe9cb5c18 620w">
<source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="645px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=645&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=6751fcff1b880acc45ed5aab6511a2ca 1290w">
<source media="(min-width: 480px)" sizes="645px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=645&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d18702564383ce5d613d22b96ec6d726 645w">
<source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="465px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=465&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=a7b87fb26b9813d197f3c236a5282ca4 930w">
<source media="(min-width: 0px)" sizes="465px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=465&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=821ae9e950ae92371b40a35e98a31116 465w">
<!--[if IE 9]></video><![endif]-->
<img itemprop="contentUrl" alt="A blood moon" src="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1e9b643d2c109a1e271f50046eac1324">
</picture>
</div>
<span>
<svg width="22" height="22" viewBox="0 0 22 22">
<path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path>
</svg>
</span>
</a>
<label for="show-caption">
<span>
<svg width="6" height="14" viewBox="0 0 6 14">
<path d="M4.6 12l-.4 1.4c-.7.2-1.9.6-3 .6-.7 0-1.2-.2-1.2-.9 0-.2 0-.3.1-.5l2-6.7H.7l.4-1.5 4.2-.6h.2L3 12h1.6zm-.3-9.2c-.9 0-1.4-.5-1.4-1.3C2.9.5 3.7 0 4.6 0 5.4 0 6 .5 6 1.3c0 1-.8 1.5-1.7 1.5z"></path>
</svg>
</span>
</label>
<figcaption itemprop="description">
<span>
<svg width="11" height="10" viewBox="0 0 11 10">
<path fill-rule="evenodd" d="M5.5 0L11 10H0z"></path>
</svg>
</span>
A blood moon last occurred in July 2018, though clouds largely obscured the celestial phenomenon in the UK.
Photograph: JM F Almeida/Getty Images
</figcaption>
</figure>

View File

@@ -0,0 +1,3 @@
[![A blood moon](https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=300&quality=85&auto=format&fit=max&s=1e9b643d2c109a1e271f50046eac1324)](#img-1)
A blood moon last occurred in July 2018, though clouds largely obscured the celestial phenomenon in the UK. Photograph: JM F Almeida/Getty Images

View File

@@ -0,0 +1,53 @@
require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-utils.js');
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
const SearchEngine = require('lib/services/SearchEngine');
const ResourceService = require('lib/services/ResourceService');
const ItemChangeUtils = require('lib/services/ItemChangeUtils');
const Note = require('lib/models/Note');
const Setting = require('lib/models/Setting');
const ItemChange = require('lib/models/ItemChange');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
let searchEngine = null;
describe('models_ItemChange', function() {
beforeEach(async (done) => {
await setupDatabaseAndSynchronizer(1);
searchEngine = new SearchEngine();
searchEngine.setDb(db());
done();
});
it('should delete old changes that have been processed', asyncTest(async () => {
const n1 = await Note.save({ title: "abcd efgh" }); // 3
await ItemChange.waitForAllSaved();
expect(await ItemChange.lastChangeId()).toBe(1);
const resourceService = new ResourceService();
await searchEngine.syncTables();
// If we run this now, it should not delete any change because
// the resource service has not yet processed the change
await ItemChangeUtils.deleteProcessedChanges();
expect(await ItemChange.lastChangeId()).toBe(1);
await resourceService.indexNoteResources();
// Now that the resource service has processed the change,
// the change can be deleted.
await ItemChangeUtils.deleteProcessedChanges();
expect(await ItemChange.lastChangeId()).toBe(0);
}));
});

View File

@@ -1,6 +1,6 @@
require('app-module-path').addPath(__dirname);
const { friendlySafeFilename } = require('lib/path-utils.js');
const { extractExecutablePath, quotePath, unquotePath, friendlySafeFilename } = require('lib/path-utils.js');
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
process.on('unhandledRejection', (reason, p) => {
@@ -36,4 +36,41 @@ describe('pathUtils', function() {
done();
});
it('should quote and unquote paths', async (done) => {
const testCases = [
['', ''],
['/my/path', '/my/path'],
['/my/path with spaces', '"/my/path with spaces"'],
['/my/weird"path', '"/my/weird\\"path"'],
['c:\\Windows\\test.dll', 'c:\\Windows\\test.dll'],
['c:\\Windows\\test test.dll', '"c:\\Windows\\test test.dll"'],
];
for (let i = 0; i < testCases.length; i++) {
const t = testCases[i];
expect(quotePath(t[0])).toBe(t[1]);
expect(unquotePath(quotePath(t[0]))).toBe(t[0]);
}
done();
});
it('should extract executable path from command', async (done) => {
const testCases = [
['', ''],
['/my/cmd -some -args', '/my/cmd'],
['"/my/cmd" -some -args', '"/my/cmd"'],
['"/my/cmd"', '"/my/cmd"'],
['"/my/cmd and space" -some -flags', '"/my/cmd and space"'],
['"" -some -flags', '""'],
];
for (let i = 0; i < testCases.length; i++) {
const t = testCases[i];
expect(extractExecutablePath(t[0])).toBe(t[1]);
}
done();
});
});

View File

@@ -1,9 +1,11 @@
require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-utils.js');
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
const SearchEngine = require('lib/services/SearchEngine');
const Note = require('lib/models/Note');
const ItemChange = require('lib/models/ItemChange');
const Setting = require('lib/models/Setting');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
@@ -23,53 +25,71 @@ describe('services_SearchEngine', function() {
done();
});
it('should keep the content and FTS table in sync', async (done) => {
it('should keep the content and FTS table in sync', asyncTest(async () => {
let rows, n1, n2, n3;
n1 = await Note.save({ title: "a" });
n2 = await Note.save({ title: "b" });
await engine.syncTables();
rows = await engine.search('a');
expect(rows.length).toBe(1);
expect(rows[0].title).toBe('a');
await Note.delete(n1.id);
await engine.syncTables();
rows = await engine.search('a');
expect(rows.length).toBe(0);
rows = await engine.search('b');
expect(rows[0].title).toBe('b');
await Note.save({ id: n2.id, title: 'c' });
await engine.syncTables();
rows = await engine.search('b');
expect(rows.length).toBe(0);
rows = await engine.search('c');
expect(rows[0].title).toBe('c');
await Note.save({ id: n2.id, encryption_applied: 1 });
await engine.syncTables();
rows = await engine.search('c');
expect(rows.length).toBe(0);
await Note.save({ id: n2.id, encryption_applied: 0 });
await engine.syncTables();
rows = await engine.search('c');
expect(rows.length).toBe(1);
}));
done();
});
it('should, after initial indexing, save the last change ID', asyncTest(async () => {
const n1 = await Note.save({ title: "abcd efgh" }); // 3
const n2 = await Note.save({ title: "abcd aaaaa abcd abcd" }); // 1
it('should order search results by relevance (1)', async (done) => {
expect(Setting.value('searchEngine.initialIndexingDone')).toBe(false);
await ItemChange.waitForAllSaved();
const lastChangeId = await ItemChange.lastChangeId();
await engine.syncTables();
expect(Setting.value('searchEngine.lastProcessedChangeId')).toBe(lastChangeId);
expect(Setting.value('searchEngine.initialIndexingDone')).toBe(true);
}));
it('should order search results by relevance (1)', asyncTest(async () => {
const n1 = await Note.save({ title: "abcd efgh" }); // 3
const n2 = await Note.save({ title: "abcd aaaaa abcd abcd" }); // 1
const n3 = await Note.save({ title: "abcd aaaaa bbbb eeee abcd" }); // 2
await engine.syncTables();
const rows = await engine.search('abcd');
expect(rows[0].id).toBe(n2.id);
expect(rows[1].id).toBe(n3.id);
expect(rows[2].id).toBe(n1.id);
}));
done();
});
it('should order search results by relevance (2)', async (done) => {
it('should order search results by relevance (2)', asyncTest(async () => {
// 1
const n1 = await Note.save({ title: "abcd efgh", body: "XX abcd XX efgh" });
// 4
@@ -81,6 +101,7 @@ describe('services_SearchEngine', function() {
// 5
const n5 = await Note.save({ title: "occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh" });
await engine.syncTables();
const rows = await engine.search('abcd efgh');
expect(rows[0].id).toBe(n1.id);
@@ -88,15 +109,18 @@ describe('services_SearchEngine', function() {
expect(rows[2].id).toBe(n3.id);
expect(rows[3].id).toBe(n2.id);
expect(rows[4].id).toBe(n5.id);
}));
done();
});
it('should supports various query types', async (done) => {
it('should supports various query types', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: "abcd efgh ijkl", body: "aaaa bbbb" });
const n2 = await Note.save({ title: "iiii efgh bbbb", body: "aaaa bbbb" });
const n3 = await Note.save({ title: "Агентство Рейтер" });
const n4 = await Note.save({ title: "Dog" });
const n5 = await Note.save({ title: "СООБЩИЛО" });
await engine.syncTables();
rows = await engine.search('abcd ijkl');
expect(rows.length).toBe(1);
@@ -122,10 +146,65 @@ describe('services_SearchEngine', function() {
rows = await engine.search('body:bbbb iiii');
expect(rows.length).toBe(1);
done();
});
rows = await engine.search('Рейтер');
expect(rows.length).toBe(1);
it('should parse normal query strings', async (done) => {
rows = await engine.search('рейтер');
expect(rows.length).toBe(1);
rows = await engine.search('Dog');
expect(rows.length).toBe(1);
rows = await engine.search('dog');
expect(rows.length).toBe(1);
rows = await engine.search('сообщило');
expect(rows.length).toBe(1);
}));
it('should support queries with or without accents', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: "père noël" });
await engine.syncTables();
expect((await engine.search('père')).length).toBe(1);
expect((await engine.search('pere')).length).toBe(1);
expect((await engine.search('noe*')).length).toBe(1);
expect((await engine.search('noë*')).length).toBe(1);
}));
it('should support queries with Chinese characters', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: "我是法国人" });
await engine.syncTables();
expect((await engine.search('我')).length).toBe(1);
expect((await engine.search('法国人')).length).toBe(1);
}));
it('should support queries with Japanese characters', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: "私は日本語を話すことができません" });
await engine.syncTables();
expect((await engine.search('日本')).length).toBe(1);
expect((await engine.search('できません')).length).toBe(1);
}));
it('should support queries with Korean characters', asyncTest(async () => {
let rows;
const n1 = await Note.save({ title: "이것은 한국말이다" });
await engine.syncTables();
expect((await engine.search('이것은')).length).toBe(1);
expect((await engine.search('말')).length).toBe(1);
}));
it('should parse normal query strings', asyncTest(async () => {
let rows;
const testCases = [
@@ -142,47 +221,63 @@ describe('services_SearchEngine', function() {
const expected = t[1];
const actual = engine.parseQuery(input);
expect(JSON.stringify(actual.terms._)).toBe(JSON.stringify(expected._));
expect(JSON.stringify(actual.terms.title)).toBe(JSON.stringify(expected.title));
expect(JSON.stringify(actual.terms.body)).toBe(JSON.stringify(expected.body));
const _Values = actual.terms._ ? actual.terms._.map(v => v.value) : undefined;
const titleValues = actual.terms.title ? actual.terms.title.map(v => v.value) : undefined;
const bodyValues = actual.terms.body ? actual.terms.body.map(v => v.value) : undefined;
expect(JSON.stringify(_Values)).toBe(JSON.stringify(expected._), 'Test case (_) ' + i);
expect(JSON.stringify(titleValues)).toBe(JSON.stringify(expected.title), 'Test case (title) ' + i);
expect(JSON.stringify(bodyValues)).toBe(JSON.stringify(expected.body), 'Test case (body) ' + i);
}
}));
done();
});
// it('should parse query strings with wildcards', asyncTest(async () => {
// let rows;
it('should parse query strings with wildcards', async (done) => {
// const testCases = [
// ['do*', ['do', 'dog', 'domino'], [] ],
// // "*" is a wildcard only when used at the end (to search for documents with the specified prefix)
// // If it's at the beginning, it's ignored, if it's in the middle, it's treated as a litteral "*".
// ['*an*', ['an', 'anneau'], ['piano', 'plan'] ],
// ['no*no', ['no*no'], ['nonono'] ],
// ];
// for (let i = 0; i < testCases.length; i++) {
// const t = testCases[i];
// const input = t[0];
// const shouldMatch = t[1];
// const shouldNotMatch = t[2];
// const regex = new RegExp(engine.parseQuery(input).terms._[0].value, 'gmi');
// for (let j = 0; j < shouldMatch.length; j++) {
// const r = shouldMatch[j].match(regex);
// expect(!!r).toBe(true, '"' + input + '" should match "' + shouldMatch[j] + '"');
// }
// }
// expect(engine.parseQuery('*').termCount).toBe(0);
// }));
it('should handle queries with special characters', asyncTest(async () => {
let rows;
const testCases = [
['do*', ['do', 'dog', 'domino'], [] ],
// "*" is a wildcard only when used at the end (to searhc for documents with the specified prefix)
// If it's at the beginning, it's ignored, if it's in the middle, it's treated as a litteral "*".
['*an*', ['an', 'anneau'], ['piano', 'plan'] ],
['no*no', ['no*no'], ['nonono'] ],
['did-not-match', 'did-not-match'],
['does match', 'does match'],
];
for (let i = 0; i < testCases.length; i++) {
const t = testCases[i];
const input = t[0];
const shouldMatch = t[1];
const shouldNotMatch = t[2];
const regex = new RegExp(engine.parseQuery(input).terms._[0].value, 'gmi');
const content = t[0];
const query = t[1];
for (let j = 0; j < shouldMatch.length; j++) {
const r = shouldMatch[j].match(regex);
expect(!!r).toBe(true, '"' + input + '" should match "' + shouldMatch[j] + '"');
}
const n = await Note.save({ title: content });
await engine.syncTables();
rows = await engine.search(query);
expect(rows.length).toBe(1);
// for (let j = 0; j < shouldNotMatch.length; j++) {
// const r = shouldNotMatch[j].match(regex);
// // console.info(input, shouldNotMatch)
// expect(!!r).toBe(false, '"' + input + '" should not match "' + shouldNotMatch[j] + '"');
// }
await Note.delete(n.id);
}
expect(engine.parseQuery('*').termCount).toBe(0);
done();
});
}));
});

View File

@@ -170,6 +170,17 @@ describe('services_rest_Api', function() {
done();
});
it('should create folders with supplied ID', async (done) => {
const response = await api.route('POST', 'folders', null, JSON.stringify({
id: '12345678123456781234567812345678',
title: 'from api',
}));
expect(response.id).toBe('12345678123456781234567812345678');
done();
});
it('should create notes with images', async (done) => {
let response = null;
const f = await Folder.save({ title: "mon carnet" });

View File

@@ -15,6 +15,7 @@ const MasterKey = require('lib/models/MasterKey');
const BaseItem = require('lib/models/BaseItem.js');
const BaseModel = require('lib/BaseModel.js');
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
const WelcomeUtils = require('lib/WelcomeUtils');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
@@ -1099,4 +1100,44 @@ describe('Synchronizer', function() {
expect(note2.title).toBe("un UPDATE");
}));
it("should sync Welcome notebook and not duplicate it", asyncTest(async () => {
// Create the Welcome items on two separate clients and verify
// that they appear only once (due to having hard-coded IDs), that they are not duplicated.
Setting.setConstant('env', 'prod');
await WelcomeUtils.createWelcomeItems();
await synchronizer().start();
await switchClient(2);
await WelcomeUtils.createWelcomeItems();
const beforeFolderCount = (await Folder.all()).length;
const beforeNoteCount = (await Note.all()).length;
expect(beforeFolderCount >= 1).toBe(true);
expect(beforeNoteCount > 1).toBe(true);
await synchronizer().start();
const afterFolderCount = (await Folder.all()).length;
const afterNoteCount = (await Note.all()).length;
expect(afterFolderCount).toBe(beforeFolderCount);
expect(afterNoteCount).toBe(beforeNoteCount);
// Changes to the Welcome items should be synced to all clients
const f1 = (await Folder.all())[0];
await Folder.save({ id: f1.id, title: 'Welcome MOD' });
await synchronizer().start();
await switchClient(1);
await synchronizer().start();
const f1_1 = (await Folder.all())[0];
expect(f1_1.title).toBe('Welcome MOD');
}));
});

View File

@@ -137,6 +137,7 @@ async function clearDatabase(id = null) {
'DELETE FROM settings',
'DELETE FROM deleted_items',
'DELETE FROM sync_items',
'DELETE FROM notes_normalized',
];
await databases_[id].transactionExecBatch(queries);

View File

@@ -1 +0,0 @@
node_modules

Binary file not shown.

View File

@@ -1,31 +0,0 @@
#!/usr/bin/env node
'use strict';
const spawn = require('child_process').spawn;
const os = require('os');
const fs = require('fs-extra');
const joplinPath = __dirname + '/node_modules/.bin/joplin';
const profileDir = os.homedir() + '/.config/demo-joplin';
const dbFilename = 'database.sqlite';
fs.ensureDirSync(profileDir);
if (!fs.pathExistsSync(profileDir + '/' + dbFilename)) {
fs.copySync(__dirname + '/' + dbFilename, profileDir + '/' + dbFilename);
}
const opt = {
cwd: __dirname,
env: (function() {
process.env.NODE_PATH = '.';
return process.env;
}()),
stdio: [process.stdin, process.stdout, process.stderr]
};
const app = spawn(joplinPath, ['--is-demo', '--profile', profileDir], opt);
app.on('close', (code) => {
process.exit(code);
});

File diff suppressed because it is too large Load Diff

View File

@@ -1,33 +0,0 @@
{
"name": "demo-joplin",
"version": "1.0.8",
"description": "Demo for Joplin CLI",
"bin": {
"demo-joplin": "./index.js"
},
"bugs": {
"url": "https://github.com/laurent22/joplin/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/laurent22/joplin"
},
"engines": {
"node": ">=8.7.0"
},
"copyright": {
"title": "Demo for Joplin CLI",
"years": [
2016,
2017,
2018
],
"owner": "Laurent Cozic"
},
"dependencies": {
"fs-extra": "^4.0.2",
"joplin": "^0.10.69"
},
"author": "Laurent Cozic",
"license": "MIT"
}

View File

@@ -1,5 +0,0 @@
#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
npm version patch
npm publish

View File

@@ -30,6 +30,21 @@
return output;
}
function getImageSizes(element) {
const images = element.getElementsByTagName('img');
const output = {};
for (let i = 0; i < images.length; i++) {
const img = images[i];
output[img.src] = {
width: img.width,
height: img.height,
naturalWidth: img.naturalWidth,
naturalHeight: img.naturalHeight,
};
}
return output;
}
// Cleans up element by removing all its invisible children (which we don't want to render as Markdown)
function cleanUpElement(element) {
const childNodes = element.childNodes;
@@ -74,7 +89,7 @@
async function prepareCommandResponse(command) {
console.info('Got command: ' + command.name);
const clippedContentResponse = (title, html) => {
const clippedContentResponse = (title, html, imageSizes) => {
return {
name: 'clippedContent',
title: title,
@@ -83,6 +98,7 @@
url: location.origin + location.pathname + location.search,
parent_id: command.parent_id,
tags: command.tags || '',
image_sizes: imageSizes,
};
}
@@ -99,20 +115,20 @@
response.warning = 'Could not retrieve simplified version of page - full page has been saved instead.';
return response;
}
return clippedContentResponse(article.title, article.body);
return clippedContentResponse(article.title, article.body, getImageSizes(document));
} else if (command.name === "completePageHtml") {
const cleanDocument = document.body.cloneNode(true);
cleanUpElement(cleanDocument);
return clippedContentResponse(pageTitle(), cleanDocument.innerHTML);
return clippedContentResponse(pageTitle(), cleanDocument.innerHTML, getImageSizes(document));
} else if (command.name === "selectedHtml") {
const range = window.getSelection().getRangeAt(0);
const container = document.createElement('div');
container.appendChild(range.cloneContents());
return clippedContentResponse(pageTitle(), container.innerHTML);
return clippedContentResponse(pageTitle(), container.innerHTML, getImageSizes(document));
} else if (command.name === 'screenshot') {

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Joplin Web Clipper [DEV]",
"version": "1.0.7",
"version": "1.0.8",
"description": "Capture and save web pages and screenshots from your browser to Joplin.",
"homepage_url": "https://joplin.cozic.net",
"icons": {

View File

@@ -29,6 +29,7 @@ class Bridge {
source_url: command.url,
parent_id: command.parent_id,
tags: command.tags || '',
image_sizes: command.image_sizes || {},
};
this.dispatch({ type: 'CLIPPED_CONTENT_SET', content: content });

View File

@@ -58,7 +58,7 @@ class ElectronAppWrapper {
// Linux icon workaround for bug https://github.com/electron-userland/electron-builder/issues/2098
// Fix: https://github.com/electron-userland/electron-builder/issues/2269
if (shim.isLinux()) windowOptions.icon = __dirname + '/build/icons/128x128.png';
if (shim.isLinux()) windowOptions.icon = path.join(__dirname, '..', 'build/icons/128x128.png');
require('electron-context-menu')({
shouldShowMenu: (event, params) => {
@@ -231,4 +231,4 @@ class ElectronAppWrapper {
}
module.exports = { ElectronAppWrapper };
module.exports = { ElectronAppWrapper };

View File

@@ -23,7 +23,6 @@ const DecryptionWorker = require('lib/services/DecryptionWorker');
const InteropService = require('lib/services/InteropService');
const InteropServiceHelper = require('./InteropServiceHelper.js');
const ResourceService = require('lib/services/ResourceService');
const SearchEngine = require('lib/services/SearchEngine');
const ClipperServer = require('lib/ClipperServer');
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
const { bridge } = require('electron').remote.require('./bridge');
@@ -43,6 +42,7 @@ const appDefaultState = Object.assign({}, defaultState, {
sidebarVisibility: true,
windowContentSize: bridge().windowContentSize(),
watchedNoteFiles: [],
lastEditorScrollPercents: {},
});
class Application extends BaseApplication {
@@ -172,6 +172,14 @@ class Application extends BaseApplication {
}
break;
case 'EDITOR_SCROLL_PERCENT_SET':
newState = Object.assign({}, state);
const newPercents = Object.assign({}, newState.lastEditorScrollPercents);
newPercents[action.noteId] = action.percent;
newState.lastEditorScrollPercents = newPercents;
break;
}
} catch (error) {
error.message = 'In reducer: ' + error.message + ' Action: ' + JSON.stringify(action);
@@ -198,10 +206,6 @@ class Application extends BaseApplication {
this.updateEditorFont();
}
if (["NOTE_UPDATE_ONE", "NOTE_DELETE", "FOLDER_UPDATE_ONE", "FOLDER_DELETE"].indexOf(action.type) >= 0) {
if (!await reg.syncTarget().syncStarted()) reg.scheduleSync(30 * 1000, { syncSteps: ["update_remote", "delete_remote"] });
}
if (['EVENT_NOTE_ALARM_FIELD_CHANGE', 'NOTE_DELETE'].indexOf(action.type) >= 0) {
await AlarmService.updateNoteNotification(action.id, action.type === 'NOTE_DELETE');
}
@@ -230,6 +234,14 @@ class Application extends BaseApplication {
this.updateMenu(screen);
}
focusElement_(target) {
this.dispatch({
type: 'WINDOW_COMMAND',
name: 'focusElement',
target: target,
});
}
updateMenu(screen) {
if (this.lastMenuScreen_ === screen) return;
@@ -249,6 +261,32 @@ class Application extends BaseApplication {
});
}
const focusItems = [];
focusItems.push({
label: _('Sidebar'),
click: () => { this.focusElement_('sideBar') },
accelerator: 'CommandOrControl+Shift+S',
});
focusItems.push({
label: _('Note list'),
click: () => { this.focusElement_('noteList') },
accelerator: 'CommandOrControl+Shift+L',
});
focusItems.push({
label: _('Note title'),
click: () => { this.focusElement_('noteTitle') },
accelerator: 'CommandOrControl+Shift+N',
});
focusItems.push({
label: _('Note body'),
click: () => { this.focusElement_('noteBody') },
accelerator: 'CommandOrControl+Shift+B',
});
const importItems = [];
const exportItems = [];
const ioService = new InteropService();
@@ -436,10 +474,22 @@ class Application extends BaseApplication {
name: 'textItalic',
});
},
}, {
label: _('Link'),
screens: ['Main'],
accelerator: 'CommandOrControl+K',
click: () => {
this.dispatch({
type: 'WINDOW_COMMAND',
name: 'textLink',
});
},
}, {
type: 'separator',
screens: ['Main'],
}, {
label: _('Insert Date Time'),
screens: ['Main'],
visible: false,
accelerator: 'CommandOrControl+Shift+T',
click: () => {
this.dispatch({
@@ -466,7 +516,7 @@ class Application extends BaseApplication {
}, {
label: _('Search in all the notes'),
screens: ['Main'],
accelerator: 'F6',
accelerator: shim.isMac() ? 'Shift+Command+F' : 'F6',
click: () => {
this.dispatch({
type: 'WINDOW_COMMAND',
@@ -489,7 +539,7 @@ class Application extends BaseApplication {
submenu: [{
label: _('Toggle sidebar'),
screens: ['Main'],
accelerator: 'F10',
accelerator: shim.isMac() ? 'Option+Command+S' : 'F10',
click: () => {
this.dispatch({
type: 'WINDOW_COMMAND',
@@ -537,6 +587,13 @@ class Application extends BaseApplication {
click: () => {
Setting.setValue('showCompletedTodos', !Setting.value('showCompletedTodos'));
},
}, {
type: 'separator',
screens: ['Main'],
}, {
label: _('Focus'),
screens: ['Main'],
submenu: focusItems,
}],
}, {
label: _('Tools'),
@@ -589,7 +646,7 @@ class Application extends BaseApplication {
}, {
label: _('Check for updates...'),
click: () => {
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath());
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath(), { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
}
}, {
type: 'separator',
@@ -601,7 +658,7 @@ class Application extends BaseApplication {
let message = [
p.description,
'',
'Copyright © 2016-2018 Laurent Cozic',
'Copyright © 2016-2019 Laurent Cozic',
_('%s %s (%s, %s)', p.name, p.version, Setting.value('env'), process.platform),
];
bridge().showInfoMessageBox(message.join('\n'), {
@@ -772,7 +829,7 @@ class Application extends BaseApplication {
if (shim.isWindows() || shim.isMac()) {
const runAutoUpdateCheck = () => {
if (Setting.value('autoUpdateEnabled')) {
bridge().checkForUpdates(true, bridge().window(), this.checkForUpdateLoggerPath());
bridge().checkForUpdates(true, bridge().window(), this.checkForUpdateLoggerPath(), { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
}
}
@@ -794,9 +851,6 @@ class Application extends BaseApplication {
ResourceService.runInBackground();
SearchEngine.instance().setDb(reg.db());
SearchEngine.instance().setLogger(reg.logger());
if (Setting.value('env') === 'dev') {
AlarmService.updateAllNotifications();
} else {

View File

@@ -116,9 +116,9 @@ class Bridge {
return require('electron').shell.openItem(fullPath)
}
checkForUpdates(inBackground, window, logFilePath) {
checkForUpdates(inBackground, window, logFilePath, options) {
const { checkForUpdates } = require('./checkForUpdates.js');
checkForUpdates(inBackground, window, logFilePath);
checkForUpdates(inBackground, window, logFilePath, options);
}
}

View File

@@ -29,15 +29,35 @@ function onCheckEnded() {
isCheckingForUpdate_ = false;
}
async function fetchLatestRelease() {
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
async function fetchLatestRelease(options) {
options = Object.assign({}, { includePreReleases: false }, options);
if (!response.ok) {
const responseText = await response.text();
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
let json = null;
if (options.includePreReleases) {
// This end-point will include all releases, including pre-releases (but not draft), so we take
// whatever is the latest release. It might be the same as releases/latest, or it might be
// a pre-release.
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases');
if (!response.ok) {
const responseText = await response.text();
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
}
json = await response.json();
if (!json.length) throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
json = json[0];
} else {
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
if (!response.ok) {
const responseText = await response.text();
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
}
json = await response.json();
}
const json = await response.json();
const version = json.tag_name.substr(1);
let downloadUrl = null;
@@ -69,10 +89,11 @@ async function fetchLatestRelease() {
downloadUrl: downloadUrl,
notes: json.body,
pageUrl: json.html_url,
prerelease: json.prerelease,
};
}
function checkForUpdates(inBackground, window, logFilePath) {
function checkForUpdates(inBackground, window, logFilePath, options) {
if (isCheckingForUpdate_) {
autoUpdateLogger_.info('checkForUpdates: Skipping check because it is already running');
return;
@@ -91,18 +112,22 @@ function checkForUpdates(inBackground, window, logFilePath) {
checkInBackground_ = inBackground;
fetchLatestRelease().then(release => {
autoUpdateLogger_.info('checkForUpdates: Checking with options ' + JSON.stringify(options));
fetchLatestRelease(options).then(release => {
autoUpdateLogger_.info('Current version: ' + packageInfo.version);
autoUpdateLogger_.info('Latest version: ' + release.version);
autoUpdateLogger_.info('Is Pre-release:', release.prerelease);
if (compareVersions(release.version, packageInfo.version) <= 0) {
if (!checkInBackground_) dialog.showMessageBox({ message: _('Current version is up-to-date.') })
} else {
const releaseNotes = release.notes.trim() ? "\n\n" + release.notes.trim() : '';
const newVersionString = release.prerelease ? _('%s (pre-release)', release.version) : release.version;
const buttonIndex = dialog.showMessageBox(parentWindow_, {
type: 'info',
message: _('An update is available, do you want to download it now?' + releaseNotes),
message: _('An update is available, do you want to download it now?') + '\n\n' + _('Your version: v%s', packageInfo.version) + '\n' + _('New version: v%s', newVersionString) + releaseNotes,
buttons: [_('Yes'), _('No')]
});

View File

@@ -2,6 +2,7 @@ const fs = require('fs-extra');
const spawnSync = require('child_process').spawnSync;
const babelPath = __dirname + '/node_modules/.bin/babel' + (process.platform === 'win32' ? '.cmd' : '');
const basePath = __dirname + '/../..';
const guiPath = __dirname + '/gui';
function fileIsNewerThan(path1, path2) {
@@ -27,7 +28,7 @@ fs.readdirSync(guiPath).forEach((filename) => {
if (fileIsNewerThan(jsxPath, jsPath)) {
console.info('Compiling ' + jsxPath + '...');
const result = spawnSync(babelPath, ['--presets', 'react', '--out-file',jsPath, jsxPath]);
const result = spawnSync(babelPath, ['--presets', 'react', '--out-file', jsPath, jsxPath]);
if (result.status !== 0) {
const msg = [];
if (result.stdout) msg.push(result.stdout.toString());
@@ -38,3 +39,10 @@ fs.readdirSync(guiPath).forEach((filename) => {
}
}
});
const libContent = [
fs.readFileSync(basePath + '/ReactNativeClient/lib/string-utils-common.js', 'utf8'),
fs.readFileSync(basePath + '/ReactNativeClient/lib/markJsUtils.js', 'utf8'),
];
fs.writeFileSync(__dirname + '/gui/note-viewer/lib.js', libContent.join('\n'), 'utf8');

View File

@@ -7,6 +7,7 @@ const { Header } = require('./Header.min.js');
const { themeStyle } = require('../theme.js');
const pathUtils = require('lib/path-utils.js');
const { _ } = require('lib/locale.js');
const { commandArgumentsToString } = require('lib/string-utils');
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
const shared = require('lib/components/shared/config-shared.js');
@@ -43,6 +44,49 @@ class ConfigScreenComponent extends React.Component {
return output;
}
sectionToComponent(key, section, settings) {
const theme = themeStyle(this.props.theme);
const settingComps = [];
for (let i = 0; i < section.metadatas.length; i++) {
const md = section.metadatas[i];
const settingComp = this.settingToComponent(md.key, settings[md.key]);
settingComps.push(settingComp);
}
const sectionStyle = {
marginBottom: 20,
};
const headerStyle = Object.assign({}, theme.headerStyle, {
borderBottomWidth: 1,
borderBottomColor: theme.dividerColor,
borderBottomStyle: 'solid',
paddingBottom: '.4em',
});
if (section.name === 'general') {
sectionStyle.borderTopWidth = 0;
}
const noteComp = section.name !== 'general' ? null : (
<div style={Object.assign({}, theme.textStyle, {marginBottom: 10})}>
{_('Notes and settings are stored in: %s', pathUtils.toSystemSlashes(Setting.value('profileDir'), process.platform))}
</div>
);
return (
<div key={key} style={sectionStyle}>
<h2 style={headerStyle}>{Setting.sectionNameToLabel(section.name)}</h2>
{noteComp}
<div>
{settingComps}
</div>
</div>
);
}
settingToComponent(key, value) {
const theme = themeStyle(this.props.theme);
@@ -56,6 +100,15 @@ class ConfigScreenComponent extends React.Component {
color: theme.color,
});
const subLabel = Object.assign({}, labelStyle, {
opacity: 0.7,
marginBottom: Math.round(rowStyle.marginBottom * 0.7),
});
const invisibleLabel = Object.assign({}, labelStyle, {
opacity: 0,
});
const controlStyle = {
display: 'inline-block',
color: theme.color,
@@ -70,6 +123,7 @@ class ConfigScreenComponent extends React.Component {
});
const updateSettingValue = (key, value) => {
// console.info(key + ' = ' + value);
return shared.updateSettingValue(this, key, value);
}
@@ -119,23 +173,93 @@ class ConfigScreenComponent extends React.Component {
</div>
);
} else if (md.type === Setting.TYPE_STRING) {
const onTextChange = (event) => {
updateSettingValue(key, event.target.value);
}
const inputStyle = Object.assign({}, controlStyle, {
width: '50%',
minWidth: '20em',
border: '1px solid' });
const inputType = md.secure === true ? 'password' : 'text';
return (
<div key={key} style={rowStyle}>
<div style={labelStyle}><label>{md.label()}</label></div>
<input type={inputType} style={inputStyle} value={this.state.settings[key]} onChange={(event) => {onTextChange(event)}} />
{ descriptionComp }
</div>
);
if (md.subType === 'file_path_and_args') {
inputStyle.marginBottom = subLabel.marginBottom;
const splitCmd = cmdString => {
const path = pathUtils.extractExecutablePath(cmdString);
const args = cmdString.substr(path.length + 1);
return [pathUtils.unquotePath(path), args];
}
const joinCmd = cmdArray => {
if (!cmdArray[0] && !cmdArray[1]) return '';
let cmdString = pathUtils.quotePath(cmdArray[0]);
if (!cmdString) cmdString = '""';
if (cmdArray[1]) cmdString += ' ' + cmdArray[1];
return cmdString;
}
const onPathChange = event => {
const cmd = splitCmd(this.state.settings[key]);
cmd[0] = event.target.value;
updateSettingValue(key, joinCmd(cmd));
}
const onArgsChange = event => {
const cmd = splitCmd(this.state.settings[key]);
cmd[1] = event.target.value;
updateSettingValue(key, joinCmd(cmd));
}
const browseButtonClick = () => {
const paths = bridge().showOpenDialog();
if (!paths || !paths.length) return;
const cmd = splitCmd(this.state.settings[key]);
cmd[0] = paths[0]
updateSettingValue(key, joinCmd(cmd));
}
const cmd = splitCmd(this.state.settings[key]);
return (
<div key={key} style={rowStyle}>
<div style={{display:'flex'}}>
<div style={{flex:0, whiteSpace: 'nowrap'}}>
<div style={labelStyle}><label>{md.label()}</label></div>
</div>
<div style={{flex:0}}>
<div style={subLabel}>Path:</div>
<div style={subLabel}>Arguments:</div>
</div>
<div style={{flex:1}}>
<div style={{display: 'flex', flexDirection: 'row', alignItems: 'center', marginBottom: inputStyle.marginBottom}}>
<input type={inputType} style={Object.assign({}, inputStyle, {marginBottom:0})} onChange={(event) => {onPathChange(event)}} value={cmd[0]} />
<button onClick={browseButtonClick} style={Object.assign({}, theme.buttonStyle, { marginLeft: 5, minHeight: 20, height: 20 })}>{_('Browse...')}</button>
</div>
<input type={inputType} style={inputStyle} onChange={(event) => {onArgsChange(event)}} value={cmd[1]}/>
</div>
</div>
<div style={{display:'flex'}}>
<div style={{flex:0, whiteSpace: 'nowrap'}}>
<div style={invisibleLabel}><label>{md.label()}</label></div>
</div>
<div style={{flex:1}}>
{ descriptionComp }
</div>
</div>
</div>
);
} else {
const onTextChange = (event) => {
updateSettingValue(key, event.target.value);
}
return (
<div key={key} style={rowStyle}>
<div style={labelStyle}><label>{md.label()}</label></div>
<input type={inputType} style={inputStyle} value={this.state.settings[key]} onChange={(event) => {onTextChange(event)}} />
{ descriptionComp }
</div>
);
}
} else if (md.type === Setting.TYPE_INT) {
const onNumChange = (event) => {
updateSettingValue(key, event.target.value);
@@ -170,21 +294,31 @@ class ConfigScreenComponent extends React.Component {
render() {
const theme = themeStyle(this.props.theme);
const style = Object.assign({
backgroundColor: theme.backgroundColor
}, this.props.style, { overflow: 'auto' });
const settings = this.state.settings;
}, this.props.style, {
overflow: 'hidden',
display: 'flex',
flexDirection: 'column',
});
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
let settings = this.state.settings;
const containerStyle = Object.assign({}, theme.containerStyle, { padding: 10 });
const containerStyle = Object.assign({}, theme.containerStyle, { padding: 10, paddingTop: 0 });
const hasChanges = !!this.state.changedSettingKeys.length;
const buttonStyle = Object.assign({}, theme.buttonStyle, {
display: this.state.changedSettingKeys.length ? 'inline-block' : 'none',
display: 'inline-block',
marginRight: 10,
});
const settingComps = shared.settingsToComponents(this, 'desktop', settings);
const buttonStyleApprove = Object.assign({}, buttonStyle, {
opacity: hasChanges ? 1 : theme.disabledOpacity,
});
const settingComps = shared.settingsToComponents2(this, 'desktop', settings);
const syncTargetMd = SyncTargetRegistry.idToMetadata(settings['sync.target']);
@@ -199,22 +333,29 @@ class ConfigScreenComponent extends React.Component {
settingComps.push(
<div key="check_sync_config_button" style={this.rowStyle_}>
<button style={buttonStyle} disabled={this.state.checkSyncConfigResult === 'checking'} onClick={this.checkSyncConfig_}>{_('Check synchronisation configuration')}</button>
<button disabled={this.state.checkSyncConfigResult === 'checking'} style={buttonStyle} onClick={this.checkSyncConfig_}>{_('Check synchronisation configuration')}</button>
{ statusComp }
</div>);
}
const buttonBarStyle = {
display: 'flex',
alignItems: 'center',
padding: 15,
borderBottomWidth: 1,
borderBottomStyle: 'solid',
borderBottomColor: theme.dividerColor,
};
return (
<div style={style}>
<Header style={headerStyle} />
<div style={buttonBarStyle}>
<button onClick={() => {this.onCancelClick()}} style={buttonStyle}>{'⬅ ' + _('Cancel')}</button>
<button disabled={!hasChanges} onClick={() => {this.onSaveClick()}} style={buttonStyleApprove}>{_('OK')}</button>
<button disabled={!hasChanges} onClick={() => {this.onApplyClick()}} style={buttonStyleApprove}>{_('Apply')}</button>
</div>
<div style={containerStyle}>
<div style={Object.assign({}, theme.textStyle, {marginBottom: 20})}>
{_('Notes and settings are stored in: %s', pathUtils.toSystemSlashes(Setting.value('profileDir'), process.platform))}
</div>
{ settingComps }
<button onClick={() => {this.onSaveClick()}} style={buttonStyle}>{_('OK')}</button>
<button onClick={() => {this.onCancelClick()}} style={buttonStyle}>{_('Cancel')}</button>
<button onClick={() => {this.onApplyClick()}} style={buttonStyle}>{_('Apply')}</button>
</div>
</div>
);

View File

@@ -3,6 +3,7 @@ const { connect } = require('react-redux');
const { reg } = require('lib/registry.js');
const { themeStyle } = require('../theme.js');
const { _ } = require('lib/locale.js');
const { bridge } = require('electron').remote.require('./bridge');
class HeaderComponent extends React.Component {
@@ -10,6 +11,7 @@ class HeaderComponent extends React.Component {
super();
this.state = {
searchQuery: '',
showSearchUsageLink: false,
};
this.scheduleSearchChangeEventIid_ = null;
@@ -37,6 +39,27 @@ class HeaderComponent extends React.Component {
triggerOnQuery('');
if (this.searchElement_) this.searchElement_.focus();
}
this.search_onFocus = event => {
if (this.hideSearchUsageLinkIID_) {
clearTimeout(this.hideSearchUsageLinkIID_);
this.hideSearchUsageLinkIID_ = null;
}
this.setState({ showSearchUsageLink: true });
}
this.search_onBlur = event => {
if (this.hideSearchUsageLinkIID_) return;
this.hideSearchUsageLinkIID_ = setTimeout(() => {
this.setState({ showSearchUsageLink: false });
}, 5000);
}
this.searchUsageLink_click = event => {
bridge().openExternal('https://joplin.cozic.net/#searching');
}
}
async componentWillReceiveProps(nextProps) {
@@ -45,6 +68,13 @@ class HeaderComponent extends React.Component {
}
}
componentWillUnmount() {
if (this.hideSearchUsageLinkIID_) {
clearTimeout(this.hideSearchUsageLinkIID_);
this.hideSearchUsageLinkIID_ = null;
}
}
async doCommand(command) {
if (!command) return;
@@ -100,6 +130,8 @@ class HeaderComponent extends React.Component {
}
makeSearch(key, style, options, state) {
const theme = themeStyle(this.props.theme);
const inputStyle = {
display: 'flex',
flex: 1,
@@ -137,6 +169,10 @@ class HeaderComponent extends React.Component {
const icon = <i style={iconStyle} className={"fa " + iconName}></i>
if (options.onQuery) this.searchOnQuery_ = options.onQuery;
const usageLink = !this.state.showSearchUsageLink ? null : (
<a onClick={this.searchUsageLink_click} style={theme.urlStyle} href="#">{_('Usage')}</a>
);
return (
<div key={key} style={containerStyle}>
<input
@@ -146,12 +182,15 @@ class HeaderComponent extends React.Component {
value={state.searchQuery}
onChange={this.search_onChange}
ref={elem => this.searchElement_ = elem}
onFocus={this.search_onFocus}
onBlur={this.search_onBlur}
/>
<a
href="#"
style={searchButton}
onClick={this.search_onClear}
>{icon}</a>
{usageLink}
</div>);
}

View File

@@ -6,13 +6,23 @@ class ItemList extends React.Component {
super();
this.scrollTop_ = 0;
this.listRef = React.createRef();
this.onScroll = this.onScroll.bind(this);
this.onKeyDown = this.onKeyDown.bind(this);
}
visibleItemCount(props) {
if (typeof props === 'undefined') props = this.props;
return Math.ceil(props.style.height / props.itemHeight);
}
updateStateItemIndexes(props) {
if (typeof props === 'undefined') props = this.props;
const topItemIndex = Math.floor(this.scrollTop_ / props.itemHeight);
const visibleItemCount = Math.ceil(props.style.height / props.itemHeight);
const visibleItemCount = this.visibleItemCount(props);
let bottomItemIndex = topItemIndex + visibleItemCount;
if (bottomItemIndex >= props.items.length) bottomItemIndex = props.items.length - 1;
@@ -31,8 +41,33 @@ class ItemList extends React.Component {
this.updateStateItemIndexes(newProps);
}
onScroll(scrollTop) {
onScroll(event) {
this.scrollTop_ = event.target.scrollTop;
this.updateStateItemIndexes();
}
onKeyDown(event) {
if (this.props.onKeyDown) this.props.onKeyDown(event);
}
makeItemIndexVisible(itemIndex) {
const top = Math.min(this.props.items.length - 1, this.state.topItemIndex + 1);
const bottom = Math.max(0, this.state.bottomItemIndex - 1)
if (itemIndex >= top && itemIndex <= bottom) return;
let scrollTop = 0;
if (itemIndex < top) {
scrollTop = this.props.itemHeight * itemIndex;
} else {
scrollTop = this.props.itemHeight * itemIndex - (this.visibleItemCount() - 1) * this.props.itemHeight;
}
if (scrollTop < 0) scrollTop = 0;
this.scrollTop_ = scrollTop;
this.listRef.current.scrollTop = scrollTop;
this.updateStateItemIndexes();
}
@@ -61,10 +96,8 @@ class ItemList extends React.Component {
let classes = ['item-list'];
if (this.props.className) classes.push(this.props.className);
const that = this;
return (
<div className={classes.join(' ')} style={style} onScroll={ (event) => { this.onScroll(event.target.scrollTop) }}>
<div ref={this.listRef} className={classes.join(' ')} style={style} onScroll={this.onScroll} onKeyDown={this.onKeyDown}>
{ itemComps }
</div>
);

View File

@@ -295,7 +295,7 @@ class MainScreenComponent extends React.Component {
height: rowHeight,
display: 'inline-block',
verticalAlign: 'top',
};
};
if (isSidebarVisible === false) {
this.styles_.sideBar.width = 0;
@@ -338,9 +338,9 @@ class MainScreenComponent extends React.Component {
render() {
const theme = themeStyle(this.props.theme);
const style = Object.assign({
color: theme.color,
backgroundColor: theme.backgroundColor,
}, this.props.style);
color: theme.color,
backgroundColor: theme.backgroundColor,
}, this.props.style);
const promptOptions = this.state.promptOptions;
const folders = this.props.folders;
const notes = this.props.notes;

View File

@@ -4,6 +4,7 @@ const { connect } = require('react-redux');
const { time } = require('lib/time-utils.js');
const { themeStyle } = require('../theme.js');
const BaseModel = require('lib/BaseModel');
const markJsUtils = require('lib/markJsUtils');
const { _ } = require('lib/locale.js');
const { bridge } = require('electron').remote.require('./bridge');
const Menu = bridge().Menu;
@@ -12,15 +13,22 @@ const eventManager = require('../eventManager');
const InteropService = require('lib/services/InteropService');
const InteropServiceHelper = require('../InteropServiceHelper.js');
const Search = require('lib/models/Search');
const { stateUtils } = require('lib/reducer');
const Mark = require('mark.js/dist/mark.min.js');
const SearchEngine = require('lib/services/SearchEngine');
const NoteListUtils = require('./utils/NoteListUtils');
const { replaceRegexDiacritics, pregQuote } = require('lib/string-utils');
class NoteListComponent extends React.Component {
constructor() {
super();
this.itemListRef = React.createRef();
this.itemAnchorRefs_ = {};
this.itemRenderer = this.itemRenderer.bind(this);
this.onKeyDown = this.onKeyDown.bind(this);
}
style() {
@@ -77,101 +85,10 @@ class NoteListComponent extends React.Component {
if (!noteIds.length) return;
const notes = noteIds.map((id) => BaseModel.byId(this.props.notes, id));
let hasEncrypted = false;
for (let i = 0; i < notes.length; i++) {
if (!!notes[i].encryption_applied) hasEncrypted = true;
}
const menu = new Menu()
if (!hasEncrypted) {
menu.append(new MenuItem({label: _('Add or remove tags'), enabled: noteIds.length === 1, click: async () => {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'setTags',
noteId: noteIds[0],
});
}}));
menu.append(new MenuItem({label: _('Duplicate'), click: async () => {
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
await Note.duplicate(noteIds[i], {
uniqueTitle: _('%s - Copy', note.title),
});
}
}}));
if (noteIds.length <= 1) {
menu.append(new MenuItem({label: _('Switch between note and to-do type'), click: async () => {
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
await Note.save(Note.toggleIsTodo(note), { userSideValidation: true });
eventManager.emit('noteTypeToggle', { noteId: note.id });
}
}}));
} else {
const switchNoteType = async (noteIds, type) => {
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
const newNote = Note.changeNoteType(note, type);
if (newNote === note) continue;
await Note.save(newNote, { userSideValidation: true });
eventManager.emit('noteTypeToggle', { noteId: note.id });
}
}
menu.append(new MenuItem({label: _('Switch to note type'), click: async () => {
await switchNoteType(noteIds, 'note');
}}));
menu.append(new MenuItem({label: _('Switch to to-do type'), click: async () => {
await switchNoteType(noteIds, 'todo');
}}));
}
menu.append(new MenuItem({label: _('Copy Markdown link'), click: async () => {
const { clipboard } = require('electron');
const links = [];
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
links.push(Note.markdownTag(note));
}
clipboard.writeText(links.join(' '));
}}));
const exportMenu = new Menu();
const ioService = new InteropService();
const ioModules = ioService.modules();
for (let i = 0; i < ioModules.length; i++) {
const module = ioModules[i];
if (module.type !== 'exporter') continue;
exportMenu.append(new MenuItem({ label: module.fullLabel() , click: async () => {
await InteropServiceHelper.export(this.props.dispatch.bind(this), module, { sourceNoteIds: noteIds });
}}));
}
exportMenu.append(new MenuItem({ label: 'PDF - ' + _('PDF File') , click: () => {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'exportPdf',
});
}}));
const exportMenuItem = new MenuItem({label: _('Export'), submenu: exportMenu});
menu.append(exportMenuItem);
}
menu.append(new MenuItem({label: _('Delete'), click: async () => {
const ok = bridge().showConfirmMessageBox(noteIds.length > 1 ? _('Delete notes?') : _('Delete note?'));
if (!ok) return;
await Note.batchDelete(noteIds);
}}));
const menu = NoteListUtils.makeContextMenu(noteIds, {
notes: this.props.notes,
dispatch: this.props.dispatch,
});
menu.popup(bridge().window());
}
@@ -181,7 +98,7 @@ class NoteListComponent extends React.Component {
const width = this.props.style.width;
const onTitleClick = async (event, item) => {
if (event.ctrlKey) {
if (event.ctrlKey || event.metaKey) {
event.preventDefault();
this.props.dispatch({
type: 'NOTE_SELECT_TOGGLE',
@@ -276,11 +193,10 @@ class NoteListComponent extends React.Component {
for (let i = 0; i < highlightedWords.length; i++) {
const w = highlightedWords[i];
if (w.type === 'regex') {
mark.markRegExp(new RegExp(w.value, 'gmi'), { acrossElements: true });
} else {
mark.mark([w]);
}
markJsUtils.markKeyword(mark, w, {
pregQuote: pregQuote,
replaceRegexDiacritics: replaceRegexDiacritics,
});
}
// Note: in this case it is safe to use dangerouslySetInnerHTML because titleElement
@@ -301,11 +217,15 @@ class NoteListComponent extends React.Component {
<i style={watchedIconStyle} className={"fa fa-external-link"}></i>
);
if (!this.itemAnchorRefs_[item.id]) this.itemAnchorRefs_[item.id] = React.createRef();
const ref = this.itemAnchorRefs_[item.id];
// Need to include "todo_completed" in key so that checkbox is updated when
// item is changed via sync.
return <div key={item.id + '_' + item.todo_completed} style={style}>
{checkbox}
<a
ref={ref}
className="list-item"
onContextMenu={(event) => this.itemContextMenu(event)}
href="#"
@@ -321,6 +241,142 @@ class NoteListComponent extends React.Component {
</div>
}
itemAnchorRef(itemId) {
if (this.itemAnchorRefs_[itemId] && this.itemAnchorRefs_[itemId].current) return this.itemAnchorRefs_[itemId].current;
return null;
}
doCommand(command) {
if (!command) return;
let commandProcessed = true;
if (command.name === 'focusElement' && command.target === 'noteList') {
if (this.props.selectedNoteIds.length) {
const ref = this.itemAnchorRef(this.props.selectedNoteIds[0]);
if (ref) ref.focus();
}
} else {
commandProcessed = false;
}
if (commandProcessed) {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: null,
});
}
}
componentDidUpdate(prevProps, prevState, snapshot) {
if (prevProps.windowCommand !== this.props.windowCommand) {
this.doCommand(this.props.windowCommand);
}
if (prevProps.selectedNoteIds !== this.props.selectedNoteIds && this.props.selectedNoteIds.length === 1) {
const id = this.props.selectedNoteIds[0];
for (let i = 0; i < this.props.notes.length; i++) {
if (this.props.notes[i].id === id) {
this.itemListRef.current.makeItemIndexVisible(i);
break;
}
}
}
}
async onKeyDown(event) {
const keyCode = event.keyCode;
const noteIds = this.props.selectedNoteIds;
if (noteIds.length === 1 && (keyCode === 40 || keyCode === 38)) { // DOWN / UP
const noteId = noteIds[0];
let noteIndex = BaseModel.modelIndexById(this.props.notes, noteId);
const inc = keyCode === 38 ? -1 : +1;
noteIndex += inc;
if (noteIndex < 0) noteIndex = 0;
if (noteIndex > this.props.notes.length - 1) noteIndex = this.props.notes.length - 1;
const newSelectedNote = this.props.notes[noteIndex];
this.props.dispatch({
type: 'NOTE_SELECT',
id: newSelectedNote.id,
});
this.itemListRef.current.makeItemIndexVisible(noteIndex);
this.focusNoteId_(newSelectedNote.id);
event.preventDefault();
}
if (noteIds.length && keyCode === 46) { // DELETE
event.preventDefault();
await NoteListUtils.confirmDeleteNotes(noteIds);
}
if (noteIds.length && keyCode === 32) { // SPACE
event.preventDefault();
const notes = BaseModel.modelsByIds(this.props.notes, noteIds);
const todos = notes.filter(n => !!n.is_todo);
if (!todos.length) return;
for (let i = 0; i < todos.length; i++) {
const toggledTodo = Note.toggleTodoCompleted(todos[i]);
await Note.save(toggledTodo);
}
this.focusNoteId_(todos[0].id);
}
if (keyCode === 9) { // TAB
event.preventDefault();
if (event.shiftKey) {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'focusElement',
target: 'sideBar',
});
} else {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'focusElement',
target: 'noteTitle',
});
}
}
}
focusNoteId_(noteId) {
// - We need to focus the item manually otherwise focus might be lost when the
// list is scrolled and items within it are being rebuilt.
// - We need to use an interval because when leaving the arrow pressed, the rendering
// of items might lag behind and so the ref is not yet available at this point.
if (!this.itemAnchorRef(noteId)) {
if (this.focusItemIID_) clearInterval(this.focusItemIID_);
this.focusItemIID_ = setInterval(() => {
if (this.itemAnchorRef(noteId)) {
this.itemAnchorRef(noteId).focus();
clearInterval(this.focusItemIID_)
this.focusItemIID_ = null;
}
}, 10);
} else {
this.itemAnchorRef(noteId).focus();
}
}
componentWillUnmount() {
if (this.focusItemIID_) {
clearInterval(this.focusItemIID_);
this.focusItemIID_ = null;
}
}
render() {
const theme = themeStyle(this.props.theme);
const style = this.props.style;
@@ -342,11 +398,13 @@ class NoteListComponent extends React.Component {
return (
<ItemList
ref={this.itemListRef}
itemHeight={this.style().listItem.height}
style={style}
className={"note-list"}
items={notes}
itemRenderer={this.itemRenderer}
onKeyDown={this.onKeyDown}
></ItemList>
);
}
@@ -363,6 +421,7 @@ const mapStateToProps = (state) => {
searches: state.searches,
selectedSearchId: state.selectedSearchId,
watchedNoteFiles: state.watchedNoteFiles,
windowCommand: state.windowCommand,
};
};

View File

@@ -16,6 +16,8 @@ class NotePropertiesDialog extends React.Component {
this.okButton_click = this.okButton_click.bind(this);
this.cancelButton_click = this.cancelButton_click.bind(this);
this.onKeyDown = this.onKeyDown.bind(this);
this.okButton = React.createRef();
this.state = {
formNote: null,
@@ -43,6 +45,12 @@ class NotePropertiesDialog extends React.Component {
}
}
componentDidUpdate() {
if (this.state.editedKey == null) {
this.okButton.current.focus();
}
}
async loadNote(noteId) {
if (!noteId) {
this.setState({ formNote: null });
@@ -184,6 +192,14 @@ class NotePropertiesDialog extends React.Component {
this.closeDialog(false);
}
onKeyDown(event) {
if (event.keyCode === 13) {
this.closeDialog(true);
} else if (event.keyCode === 27) {
this.closeDialog(false);
}
}
editPropertyButtonClick(key, initialValue) {
this.setState({
editedKey: key,
@@ -222,6 +238,7 @@ class NotePropertiesDialog extends React.Component {
async cancelProperty() {
return new Promise((resolve, reject) => {
this.okButton.current.focus();
this.setState({
editedKey: null,
editedValue: null
@@ -347,7 +364,17 @@ class NotePropertiesDialog extends React.Component {
const formNote = this.state.formNote;
const buttonComps = [];
buttonComps.push(<button key="ok" style={styles.button} onClick={this.okButton_click}>{_('Apply')}</button>);
buttonComps.push(
<button
key="ok"
style={styles.button}
onClick={this.okButton_click}
ref={this.okButton}
onKeyDown={this.onKeyDown}
>
{_('Apply')}
</button>
);
buttonComps.push(<button key="cancel" style={styles.button} onClick={this.cancelButton_click}>{_('Cancel')}</button>);
const noteComps = [];

View File

@@ -13,6 +13,7 @@ class NoteSearchBarComponent extends React.Component {
};
this.searchInput_change = this.searchInput_change.bind(this);
this.searchInput_keyDown = this.searchInput_keyDown.bind(this);
this.previousButton_click = this.previousButton_click.bind(this);
this.nextButton_click = this.nextButton_click.bind(this);
this.closeButton_click = this.closeButton_click.bind(this);
@@ -70,6 +71,24 @@ class NoteSearchBarComponent extends React.Component {
this.triggerOnChange(query);
}
searchInput_keyDown(event) {
if (event.keyCode === 13) { // ENTER
event.preventDefault();
if (!event.shiftKey) {
if (this.props.onNext) this.props.onNext();
} else {
if (this.props.onPrevious) this.props.onPrevious();
}
}
if (event.keyCode === 27) { // ESCAPE
event.preventDefault();
if (this.props.onClose) this.props.onClose();
}
}
previousButton_click(event) {
if (this.props.onPrevious) this.props.onPrevious();
}
@@ -101,7 +120,7 @@ class NoteSearchBarComponent extends React.Component {
<div style={this.props.style}>
<div style={{display: 'flex', flexDirection: 'row', alignItems: 'center' }}>
{ closeButton }
<input placeholder={_('Search...')} value={this.state.query} onChange={this.searchInput_change} ref="searchInput" type="text" style={{width: 200, marginRight: 5}}></input>
<input placeholder={_('Search...')} value={this.state.query} onChange={this.searchInput_change} onKeyDown={this.searchInput_keyDown} ref="searchInput" type="text" style={{width: 200, marginRight: 5}}></input>
{ nextButton }
{ previousButton }
</div>

View File

@@ -6,7 +6,7 @@ const Search = require('lib/models/Search.js');
const { time } = require('lib/time-utils.js');
const Setting = require('lib/models/Setting.js');
const { IconButton } = require('./IconButton.min.js');
const { urlDecode, escapeHtml } = require('lib/string-utils');
const { urlDecode, escapeHtml, pregQuote, scriptType } = require('lib/string-utils');
const Toolbar = require('./Toolbar.min.js');
const TagList = require('./TagList.min.js');
const { connect } = require('react-redux');
@@ -28,6 +28,7 @@ const ArrayUtils = require('lib/ArrayUtils');
const ObjectUtils = require('lib/ObjectUtils');
const urlUtils = require('lib/urlUtils');
const dialogs = require('./dialogs');
const NoteListUtils = require('./utils/NoteListUtils');
const NoteSearchBar = require('./NoteSearchBar.min.js');
const markdownUtils = require('lib/markdownUtils');
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
@@ -35,6 +36,7 @@ const ResourceFetcher = require('lib/services/ResourceFetcher');
const { toSystemSlashes, safeFilename } = require('lib/path-utils');
const { clipboard } = require('electron');
const SearchEngine = require('lib/services/SearchEngine');
const NoteTextViewer = require('./NoteTextViewer.min');
require('brace/mode/markdown');
// https://ace.c9.io/build/kitchen-sink.html
@@ -78,6 +80,8 @@ class NoteTextComponent extends React.Component {
localSearch: Object.assign({}, this.localSearchDefaultState),
};
this.webviewRef_ = React.createRef();
this.lastLoadedNoteId_ = null;
this.webviewListeners_ = null;
@@ -103,9 +107,9 @@ class NoteTextComponent extends React.Component {
}
}
this.onAlarmChange_ = (event) => { if (event.noteId === this.props.noteId) this.reloadNote(this.props); }
this.onNoteTypeToggle_ = (event) => { if (event.noteId === this.props.noteId) this.reloadNote(this.props); }
this.onTodoToggle_ = (event) => { if (event.noteId === this.props.noteId) this.reloadNote(this.props); }
this.onAlarmChange_ = (event) => { if (event.noteId === this.props.noteId) this.scheduleReloadNote(this.props); }
this.onNoteTypeToggle_ = (event) => { if (event.noteId === this.props.noteId) this.scheduleReloadNote(this.props); }
this.onTodoToggle_ = (event) => { if (event.noteId === this.props.noteId) this.scheduleReloadNote(this.props); }
this.onEditorPaste_ = async (event = null) => {
const formats = clipboard.availableFormats();
@@ -214,7 +218,7 @@ class NoteTextComponent extends React.Component {
this.externalEditWatcher_noteChange = (event) => {
if (!this.state.note || !this.state.note.id) return;
if (event.id === this.state.note.id) {
this.reloadNote(this.props);
this.scheduleReloadNote(this.props);
}
}
@@ -257,6 +261,10 @@ class NoteTextComponent extends React.Component {
showLocalSearch: false,
});
}
this.titleField_keyDown = this.titleField_keyDown.bind(this);
this.webview_ipcMessage = this.webview_ipcMessage.bind(this);
this.webview_domReady = this.webview_domReady.bind(this);
}
// Note:
@@ -357,7 +365,6 @@ class NoteTextComponent extends React.Component {
this.saveIfNeeded();
this.mdToHtml_ = null;
this.destroyWebview();
eventManager.removeListener('alarmChange', this.onAlarmChange_);
eventManager.removeListener('noteTypeToggle', this.onNoteTypeToggle_);
@@ -398,6 +405,20 @@ class NoteTextComponent extends React.Component {
}, 500);
}
scheduleReloadNote(props, options = null) {
if (this.scheduleReloadNoteIID_) {
clearTimeout(this.scheduleReloadNoteIID_);
this.scheduleReloadNoteIID_ = null;
}
this.scheduleReloadNoteIID_ = setTimeout(() => {
this.reloadNote(props, options);
}, 10);
}
// Generally, reloadNote() should not be called directly so that it's not called multiple times
// from multiple places within a short interval of time. Instead use scheduleReloadNote() to
// delay reloading a bit and make sure that only one reload operation is performed.
async reloadNote(props, options = null) {
if (!options) options = {};
if (!('noReloadIfLocalChanges' in options)) options.noReloadIfLocalChanges = false;
@@ -412,12 +433,17 @@ class NoteTextComponent extends React.Component {
let loadingNewNote = true;
let parentFolder = null;
let noteTags = [];
let scrollPercent = 0;
if (props.newNote) {
note = Object.assign({}, props.newNote);
this.lastLoadedNoteId_ = null;
} else {
noteId = props.noteId;
scrollPercent = this.props.lastEditorScrollPercents[noteId];
if (!scrollPercent) scrollPercent = 0;
loadingNewNote = stateNoteId !== noteId;
noteTags = await Tag.tagsByNoteId(noteId);
this.lastLoadedNoteId_ = noteId;
@@ -438,7 +464,7 @@ class NoteTextComponent extends React.Component {
// If we are loading nothing (noteId == null), make sure to
// set webviewReady to false too because the webview component
// is going to be removed in render().
const webviewReady = this.webview_ && this.state.webviewReady && (noteId || props.newNote);
const webviewReady = !!this.webviewRef_.current && this.state.webviewReady && (!!noteId || !!props.newNote);
// Scroll back to top when loading new note
if (loadingNewNote) {
@@ -481,6 +507,11 @@ class NoteTextComponent extends React.Component {
}
this.editor_.editor.clearSelection();
this.editor_.editor.moveCursorTo(0,0);
setTimeout(() => {
this.setEditorPercentScroll(scrollPercent ? scrollPercent : 0);
this.setViewerPercentScroll(scrollPercent ? scrollPercent : 0);
}, 10);
}
}
@@ -534,18 +565,18 @@ class NoteTextComponent extends React.Component {
}
async componentWillReceiveProps(nextProps) {
if (nextProps.newNote) {
await this.reloadNote(nextProps);
} else if ('noteId' in nextProps && nextProps.noteId !== this.props.noteId) {
await this.reloadNote(nextProps);
if (this.props.newNote !== nextProps.newNote && nextProps.newNote) {
await this.scheduleReloadNote(nextProps);
} else if (('noteId' in nextProps) && nextProps.noteId !== this.props.noteId) {
await this.scheduleReloadNote(nextProps);
} else if ('noteTags' in nextProps && this.areNoteTagsModified(nextProps.noteTags, this.state.noteTags)) {
this.setState({
noteTags: nextProps.noteTags
});
}
if ('syncStarted' in nextProps && !nextProps.syncStarted && !this.isModified()) {
await this.reloadNote(nextProps, { noReloadIfLocalChanges: true });
if ((nextProps.syncStarted !== this.props.syncStarted) && ('syncStarted' in nextProps) && !nextProps.syncStarted && !this.isModified()) {
await this.scheduleReloadNote(nextProps, { noReloadIfLocalChanges: true });
}
if (nextProps.windowCommand) {
@@ -678,6 +709,10 @@ class NoteTextComponent extends React.Component {
type: "FOLDER_AND_NOTE_SELECT",
folderId: item.parent_id,
noteId: item.id,
historyNoteAction: {
id: this.state.note.id,
parent_id: this.state.note.parent_id,
},
});
} else {
throw new Error('Unsupported item type: ' + item.type_);
@@ -710,11 +745,31 @@ class NoteTextComponent extends React.Component {
}
setEditorPercentScroll(p) {
const noteId = this.props.noteId;
if (noteId) {
this.props.dispatch({
type: 'EDITOR_SCROLL_PERCENT_SET',
noteId: noteId,
percent: p,
});
}
this.editorSetScrollTop(p * this.editorMaxScroll());
}
setViewerPercentScroll(p) {
this.webview_.send('setPercentScroll', p);
const noteId = this.props.noteId;
if (noteId) {
this.props.dispatch({
type: 'EDITOR_SCROLL_PERCENT_SET',
noteId: noteId,
percent: p,
});
}
if (this.webviewRef_.current) this.webviewRef_.current.wrappedInstance.send('setPercentScroll', p);
}
editor_scroll() {
@@ -724,11 +779,13 @@ class NoteTextComponent extends React.Component {
}
const m = this.editorMaxScroll();
this.setViewerPercentScroll(m ? this.editorScrollTop() / m : 0);
const percent = m ? this.editorScrollTop() / m : 0;
this.setViewerPercentScroll(percent);
}
webview_domReady() {
if (!this.webview_) return;
if (!this.webviewRef_.current) return;
this.setState({
webviewReady: true,
@@ -737,19 +794,6 @@ class NoteTextComponent extends React.Component {
// if (Setting.value('env') === 'dev') this.webview_.openDevTools();
}
webview_ref(element) {
if (this.webview_) {
if (this.webview_ === element) return;
this.destroyWebview();
}
if (!element) {
this.destroyWebview();
} else {
this.initWebview(element);
}
}
editor_ref(element) {
if (this.editor_ === element) return;
@@ -822,35 +866,6 @@ class NoteTextComponent extends React.Component {
}
}
initWebview(wv) {
if (!this.webviewListeners_) {
this.webviewListeners_ = {
'dom-ready': this.webview_domReady.bind(this),
'ipc-message': this.webview_ipcMessage.bind(this),
};
}
for (let n in this.webviewListeners_) {
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
const fn = this.webviewListeners_[n];
wv.addEventListener(n, fn);
}
this.webview_ = wv;
}
destroyWebview() {
if (!this.webview_) return;
for (let n in this.webviewListeners_) {
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
const fn = this.webviewListeners_[n];
this.webview_.removeEventListener(n, fn);
}
this.webview_ = null;
}
aceEditor_change(body) {
shared.noteComponent_change(this, 'body', body);
this.scheduleHtmlUpdate();
@@ -872,7 +887,10 @@ class NoteTextComponent extends React.Component {
}
}
updateHtml(body = null) {
updateHtml(body = null, options = null) {
if (!options) options = {};
if (!('useCustomCss' in options)) options.useCustomCss = true;
const mdOptions = {
onResourceLoaded: () => {
if (this.resourceLoadedTimeoutId_) {
@@ -893,7 +911,6 @@ class NoteTextComponent extends React.Component {
let bodyToRender = body;
if (bodyToRender === null) bodyToRender = this.state.note && this.state.note.body ? this.state.note.body : '';
bodyToRender = '<style>' + this.props.customCss + '</style>\n' + bodyToRender;
let bodyHtml = '';
const visiblePanes = this.props.visiblePanes || ['editor', 'viewer'];
@@ -903,30 +920,74 @@ class NoteTextComponent extends React.Component {
bodyToRender = '*' + _('This note has no content. Click on "%s" to toggle the editor and edit the note.', _('Layout')) + '*';
}
if (options.useCustomCss) bodyToRender = '<style>' + this.props.customCss + '</style>\n' + bodyToRender;
bodyHtml = this.mdToHtml().render(bodyToRender, theme, mdOptions);
this.setState({ bodyHtml: bodyHtml });
}
titleField_keyDown(event) {
const keyCode = event.keyCode;
if (keyCode === 9) { // TAB
event.preventDefault();
if (event.shiftKey) {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'focusElement',
target: 'noteList',
});
} else {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'focusElement',
target: 'noteBody',
});
}
}
}
async doCommand(command) {
if (!command || !this.state.note) return;
if (!command) return;
let fn = null;
if (command.name === 'exportPdf' && this.webview_) {
if (command.name === 'exportPdf') {
fn = this.commandSavePdf;
} else if (command.name === 'print' && this.webview_) {
} else if (command.name === 'print') {
fn = this.commandPrint;
} else if (command.name === 'textBold') {
fn = this.commandTextBold;
} else if (command.name === 'textItalic') {
fn = this.commandTextItalic;
} else if (command.name === 'insertDateTime' ) {
fn = this.commandDateTime;
} else if (command.name === 'commandStartExternalEditing') {
fn = this.commandStartExternalEditing;
} else if (command.name === 'showLocalSearch') {
fn = this.commandShowLocalSearch;
}
if (this.state.note) {
if (command.name === 'textBold') {
fn = this.commandTextBold;
} else if (command.name === 'textItalic') {
fn = this.commandTextItalic;
} else if (command.name === 'textLink') {
fn = this.commandTextLink;
} else if (command.name === 'insertDateTime') {
fn = this.commandDateTime;
} else if (command.name === 'commandStartExternalEditing') {
fn = this.commandStartExternalEditing;
} else if (command.name === 'showLocalSearch') {
fn = this.commandShowLocalSearch;
}
}
if (command.name === 'focusElement' && command.target === 'noteTitle') {
fn = () => {
if (!this.titleField_) return;
this.titleField_.focus();
}
}
if (command.name === 'focusElement' && command.target === 'noteBody') {
fn = () => {
if (!this.editor_) return;
this.editor_.editor.focus();
}
}
if (!fn) return;
@@ -998,13 +1059,17 @@ class NoteTextComponent extends React.Component {
}
printTo_(target, options) {
if (this.props.selectedNoteIds.length !== 1 || !this.webviewRef_.current) {
throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
}
const previousBody = this.state.note.body;
const tempBody = "# " + this.state.note.title + "\n\n" + previousBody;
const previousTheme = Setting.value('theme');
Setting.setValue('theme', Setting.THEME_LIGHT);
this.lastSetHtml_ = '';
this.updateHtml(tempBody);
this.updateHtml(tempBody, { useCustomCss: false });
this.forceUpdate();
const restoreSettings = () => {
@@ -1016,7 +1081,7 @@ class NoteTextComponent extends React.Component {
setTimeout(() => {
if (target === 'pdf') {
this.webview_.printToPDF({}, (error, data) => {
this.webviewRef_.current.wrappedInstance.printToPDF({}, (error, data) => {
restoreSettings();
if (error) {
@@ -1026,25 +1091,35 @@ class NoteTextComponent extends React.Component {
}
});
} else if (target === 'printer') {
this.webview_.print();
this.webviewRef_.current.wrappedInstance.print();
restoreSettings();
}
}, 100);
}
commandSavePdf() {
const path = bridge().showSaveDialog({
filters: [{ name: _('PDF File'), extensions: ['pdf']}],
defaultPath: safeFilename(this.state.note.title),
});
try {
if (!this.state.note) throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
const path = bridge().showSaveDialog({
filters: [{ name: _('PDF File'), extensions: ['pdf']}],
defaultPath: safeFilename(this.state.note.title),
});
if (!path) return;
if (path) {
this.printTo_('pdf', { path: path });
} catch (error) {
bridge().showErrorMessageBox(error.message);
}
}
commandPrint() {
this.printTo_('printer');
try {
this.printTo_('printer');
} catch (error) {
bridge().showErrorMessageBox(error.message);
}
}
async commandStartExternalEditing() {
@@ -1300,6 +1375,25 @@ class NoteTextComponent extends React.Component {
});
}
if (this.props.historyNotes.length) {
toolbarItems.push({
tooltip: _('Back'),
iconName: 'fa-arrow-left',
onClick: () => {
if (!this.props.historyNotes.length) return;
const lastItem = this.props.historyNotes[this.props.historyNotes.length - 1];
this.props.dispatch({
type: "FOLDER_AND_NOTE_SELECT",
folderId: lastItem.parent_id,
noteId: lastItem.id,
historyNoteAction: 'pop',
});
},
});
}
toolbarItems.push({
tooltip: _('Bold'),
iconName: 'fa-bold',
@@ -1435,6 +1529,61 @@ class NoteTextComponent extends React.Component {
return toolbarItems;
}
renderNoNotes(rootStyle) {
const emptyDivStyle = Object.assign({
backgroundColor: 'black',
opacity: 0.1,
}, rootStyle);
return <div style={emptyDivStyle}></div>
}
renderMultiNotes(rootStyle) {
const theme = themeStyle(this.props.theme);
const multiNotesButton_click = item => {
if (item.submenu) {
item.submenu.popup(bridge().window());
} else {
item.click();
}
}
const menu = NoteListUtils.makeContextMenu(this.props.selectedNoteIds, {
notes: this.props.notes,
dispatch: this.props.dispatch,
});
const buttonStyle = Object.assign({}, theme.buttonStyle, {
marginBottom: 10,
});
const itemComps = [];
const menuItems = menu.items;
for (let i = 0; i < menuItems.length; i++) {
const item = menuItems[i];
if (!item.enabled) continue;
itemComps.push(<button
key={item.label}
style={buttonStyle}
onClick={() => multiNotesButton_click(item)}
>{item.label}</button>);
}
rootStyle = Object.assign({}, rootStyle, {
paddingTop: rootStyle.paddingLeft,
display: 'inline-flex',
justifyContent: 'center',
});
return (<div style={rootStyle}>
<div style={{display: 'flex', flexDirection: 'column'}}>
{itemComps}
</div>
</div>);
}
render() {
const style = this.props.style;
const note = this.state.note;
@@ -1454,12 +1603,10 @@ class NoteTextComponent extends React.Component {
const innerWidth = rootStyle.width - rootStyle.paddingLeft - rootStyle.paddingRight - borderWidth;
if (!note || !!note.encryption_applied) {
const emptyDivStyle = Object.assign({
backgroundColor: 'black',
opacity: 0.1,
}, rootStyle);
return <div style={emptyDivStyle}></div>
if (this.props.selectedNoteIds.length > 1) {
return this.renderMultiNotes(rootStyle);
} else if (!note || !!note.encryption_applied) { //|| (note && !this.props.newNote && this.props.noteId && note.id !== this.props.noteId)) { // note.id !== props.noteId is when the note has not been loaded yet, and the previous one is still in the state
return this.renderNoNotes(rootStyle);
}
const titleBarStyle = {
@@ -1562,7 +1709,7 @@ class NoteTextComponent extends React.Component {
const htmlHasChanged = this.lastSetHtml_ !== html;
if (htmlHasChanged) {
let options = {codeTheme: theme.codeThemeCss};
this.webview_.send('setHtml', html, options);
this.webviewRef_.current.wrappedInstance.send('setHtml', html, options);
this.lastSetHtml_ = html;
}
@@ -1570,7 +1717,11 @@ class NoteTextComponent extends React.Component {
const markerOptions = {};
if (this.state.showLocalSearch) {
keywords = [this.state.localSearch.query];
keywords = [{
type: 'text',
value: this.state.localSearch.query,
accuracy: 'partially',
}]
markerOptions.selectedIndex = this.state.localSearch.selectedIndex;
} else {
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
@@ -1584,7 +1735,7 @@ class NoteTextComponent extends React.Component {
if (htmlHasChanged || keywordHash !== this.lastSetMarkers_ || !ObjectUtils.fieldsEqual(this.lastSetMarkersOptions_, markerOptions)) {
this.lastSetMarkers_ = keywordHash;
this.lastSetMarkersOptions_ = Object.assign({}, markerOptions);
this.webview_.send('setMarkers', keywords, markerOptions);
this.webviewRef_.current.wrappedInstance.send('setMarkers', keywords, markerOptions);
}
}
@@ -1601,6 +1752,7 @@ class NoteTextComponent extends React.Component {
style={titleEditorStyle}
value={note && note.title ? note.title : ''}
onChange={(event) => { this.title_changeText(event); }}
onKeyDown={this.titleField_keyDown}
placeholder={ this.props.newNote ? _('Creating new %s...', isTodo ? _('to-do') : _('note')) : '' }
/>
@@ -1615,32 +1767,13 @@ class NoteTextComponent extends React.Component {
const titleBarDate = <span style={Object.assign({}, theme.textStyle, {color: theme.colorFaded})}>{time.formatMsToLocal(note.user_updated_time)}</span>
const viewer = <webview
style={viewerStyle}
preload="gui/note-viewer/preload.js"
src="gui/note-viewer/index.html"
webpreferences="contextIsolation"
ref={(elem) => { this.webview_ref(elem); } }
const viewer = <NoteTextViewer
ref={this.webviewRef_}
viewerStyle={viewerStyle}
onDomReady={this.webview_domReady}
onIpcMessage={this.webview_ipcMessage}
/>
// const markers = [{
// startRow: 2,
// startCol: 3,
// endRow: 2,
// endCol: 6,
// type: 'text',
// className: 'test-marker'
// }];
// markers={markers}
// editorProps={{$useWorker: false}}
// #note-editor .test-marker {
// background-color: red;
// color: yellow;
// position: absolute;
// }
const editorRootStyle = Object.assign({}, editorStyle);
delete editorRootStyle.width;
delete editorRootStyle.height;
@@ -1662,6 +1795,7 @@ class NoteTextComponent extends React.Component {
showPrintMargin={false}
onSelectionChange={this.aceEditor_selectionChange}
onFocus={this.aceEditor_focus}
readOnly={visiblePanes.indexOf('editor') < 0}
// Disable warning: "Automatically scrolling cursor into view after
// selection change this will be disabled in the next version set
@@ -1705,6 +1839,8 @@ class NoteTextComponent extends React.Component {
const mapStateToProps = (state) => {
return {
noteId: state.selectedNoteIds.length === 1 ? state.selectedNoteIds[0] : null,
notes: state.notes,
selectedNoteIds: state.selectedNoteIds,
noteTags: state.selectedNoteTags,
folderId: state.selectedFolderId,
itemType: state.selectedItemType,
@@ -1719,6 +1855,8 @@ const mapStateToProps = (state) => {
selectedSearchId: state.selectedSearchId,
watchedNoteFiles: state.watchedNoteFiles,
customCss: state.customCss,
lastEditorScrollPercents: state.lastEditorScrollPercents,
historyNotes: state.historyNotes,
};
};

View File

@@ -0,0 +1,99 @@
const React = require('react');
const { connect } = require('react-redux');
const { themeStyle } = require('../theme.js');
const { _ } = require('lib/locale.js');
class NoteTextViewerComponent extends React.Component {
constructor() {
super();
this.initialized_ = false;
this.webviewRef_ = React.createRef();
this.webviewListeners_ = null;
this.webview_domReady = this.webview_domReady.bind(this);
this.webview_ipcMessage = this.webview_ipcMessage.bind(this);
}
webview_domReady(event) {
this.props.onDomReady(event);
}
webview_ipcMessage(event) {
this.props.onIpcMessage(event);
}
initWebview() {
const wv = this.webviewRef_.current;
if (!this.webviewListeners_) {
this.webviewListeners_ = {
'dom-ready': this.webview_domReady.bind(this),
'ipc-message': this.webview_ipcMessage.bind(this),
};
}
for (let n in this.webviewListeners_) {
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
const fn = this.webviewListeners_[n];
wv.addEventListener(n, fn);
}
}
destroyWebview() {
const wv = this.webviewRef_.current;
if (!wv || !this.initialized_) return;
for (let n in this.webviewListeners_) {
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
const fn = this.webviewListeners_[n];
wv.removeEventListener(n, fn);
}
}
componentDidUpdate() {
if (!this.initialized_ && this.webviewRef_.current) {
this.initWebview();
this.initialized_ = true;
}
}
componentWillUnmount() {
this.destroyWebview();
}
send(channel, arg0 = null, arg1 = null, arg2 = null, arg3 = null) {
return this.webviewRef_.current.send(channel, arg0, arg1, arg2, arg3);
}
printToPDF(options, callback) {
return this.webviewRef_.current.printToPDF(options, callback);
}
print(options = {}) {
return this.webviewRef_.current.print(options);
}
render() {
return <webview
ref={this.webviewRef_}
style={this.props.viewerStyle}
preload="gui/note-viewer/preload.js"
src="gui/note-viewer/index.html"
webpreferences="contextIsolation"
/>
}
}
const mapStateToProps = (state) => {
return {
theme: state.settings.theme,
};
};
const NoteTextViewer = connect(mapStateToProps, null, null, { withRef: true })(NoteTextViewerComponent);
module.exports = NoteTextViewer;

View File

@@ -15,6 +15,7 @@ const { ConfigScreen } = require('./ConfigScreen.min.js');
const { EncryptionConfigScreen } = require('./EncryptionConfigScreen.min.js');
const { ClipperConfigScreen } = require('./ClipperConfigScreen.min.js');
const { Navigator } = require('./Navigator.min.js');
const WelcomeUtils = require('lib/WelcomeUtils');
const { app } = require('../app');
@@ -71,6 +72,8 @@ class RootComponent extends React.Component {
state: 'ready',
});
}
await WelcomeUtils.install(this.props.dispatch);
}
render() {

View File

@@ -3,6 +3,7 @@ const { connect } = require("react-redux");
const shared = require("lib/components/shared/side-menu-shared.js");
const { Synchronizer } = require("lib/synchronizer.js");
const BaseModel = require("lib/BaseModel.js");
const Setting = require('lib/models/Setting.js');
const Folder = require("lib/models/Folder.js");
const Note = require("lib/models/Note.js");
const Tag = require("lib/models/Tag.js");
@@ -23,7 +24,7 @@ class SideBarComponent extends React.Component {
this.onFolderDragStart_ = (event) => {
const folderId = event.currentTarget.getAttribute('folderid');
if (!folderId) return;
event.dataTransfer.setDragImage(new Image(), 1, 1);
event.dataTransfer.clearData();
event.dataTransfer.setData('text/x-jop-folder-ids', JSON.stringify([folderId]));
@@ -39,9 +40,15 @@ class SideBarComponent extends React.Component {
const dt = event.dataTransfer;
if (!dt) return;
// folderId can be NULL when dropping on the sidebar Notebook header. In that case, it's used
// to put the dropped folder at the root. But for notes, folderId needs to always be defined
// since there's no such thing as a root note.
if (dt.types.indexOf("text/x-jop-note-ids") >= 0) {
event.preventDefault();
if (!folderId) return;
const noteIds = JSON.parse(dt.getData("text/x-jop-note-ids"));
for (let i = 0; i < noteIds.length; i++) {
await Note.moveToFolder(noteIds[i], folderId);
@@ -79,6 +86,20 @@ class SideBarComponent extends React.Component {
id: folderId,
});
};
this.folderItemsOrder_ = [];
this.tagItemsOrder_ = [];
this.onKeyDown = this.onKeyDown.bind(this);
this.rootRef = React.createRef();
this.anchorItemRefs = {};
this.state = {
tagHeaderIsExpanded: Setting.value('tagHeaderIsExpanded'),
folderHeaderIsExpanded: Setting.value('folderHeaderIsExpanded')
};
}
style() {
@@ -166,9 +187,8 @@ class SideBarComponent extends React.Component {
marginTop: 10,
marginLeft: 5,
marginRight: 5,
minHeight: 70,
marginBottom: 10,
wordWrap: "break-word",
//width: "100%",
},
};
@@ -186,11 +206,36 @@ class SideBarComponent extends React.Component {
}
}
doCommand(command) {
if (!command) return;
let commandProcessed = true;
if (command.name === 'focusElement' && command.target === 'sideBar') {
if (this.props.sidebarVisibility) {
const item = this.selectedItem();
if (item) {
const anchorRef = this.anchorItemRefs[item.type][item.id];
if (anchorRef) anchorRef.current.focus();
}
}
} else {
commandProcessed = false;
}
if (commandProcessed) {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: null,
});
}
}
componentDidUpdate(prevProps) {
if (shim.isLinux()) {
// For some reason, the UI seems to sleep in some Linux distro during
// sync. Cannot find the reason for it and cannot replicate, so here
// as a test force the update at regular intervals.
// as a test force the update at regular intervals.
// https://github.com/laurent22/joplin/issues/312#issuecomment-429472193
if (!prevProps.syncStarted && this.props.syncStarted) {
this.clearForceUpdateDuringSync();
@@ -201,13 +246,19 @@ class SideBarComponent extends React.Component {
}
if (prevProps.syncStarted && !this.props.syncStarted) this.clearForceUpdateDuringSync();
}
}
}
componentWillUnmount() {
this.clearForceUpdateDuringSync();
}
componentDidUpdate(prevProps, prevState, snapshot) {
if (prevProps.windowCommand !== this.props.windowCommand) {
this.doCommand(this.props.windowCommand);
}
}
itemContextMenu(event) {
const itemId = event.target.getAttribute("data-id");
if (itemId === Folder.conflictFolderId()) return;
@@ -303,7 +354,7 @@ class SideBarComponent extends React.Component {
);
}
if (itemType === BaseModel.TYPE_TAG) {
if (itemType === BaseModel.TYPE_TAG) {
menu.append(
new MenuItem({
label: _('Rename'),
@@ -335,17 +386,26 @@ class SideBarComponent extends React.Component {
});
}
searchItem_click(search) {
this.props.dispatch({
type: "SEARCH_SELECT",
id: search ? search.id : null,
});
}
// searchItem_click(search) {
// this.props.dispatch({
// type: "SEARCH_SELECT",
// id: search ? search.id : null,
// });
// }
async sync_click() {
await shared.synchronize_press(this);
}
anchorItemRef(type, id) {
let refs = null;
if (!this.anchorItemRefs[type]) this.anchorItemRefs[type] = {};
if (this.anchorItemRefs[type][id]) return this.anchorItemRefs[type][id];
this.anchorItemRefs[type][id] = React.createRef();
return this.anchorItemRefs[type][id];
}
folderItem(folder, selected, hasChildren, depth) {
let style = Object.assign({}, this.style().listItem);
if (folder.id === Folder.conflictFolderId()) style = Object.assign(style, this.style().conflictFolder);
@@ -353,8 +413,6 @@ class SideBarComponent extends React.Component {
const itemTitle = Folder.displayTitle(folder);
let containerStyle = Object.assign({}, this.style().listItemContainer);
// containerStyle.paddingLeft = containerStyle.paddingLeft + depth * 10;
if (selected) containerStyle = Object.assign(containerStyle, this.style().listItemSelected);
let expandLinkStyle = Object.assign({}, this.style().listItemExpandIcon);
@@ -367,10 +425,13 @@ class SideBarComponent extends React.Component {
const expandIcon = <i style={expandIconStyle} className={"fa " + iconName}></i>
const expandLink = hasChildren ? <a style={expandLinkStyle} href="#" folderid={folder.id} onClick={this.onFolderToggleClick_}>{expandIcon}</a> : <span style={expandLinkStyle}>{expandIcon}</span>
const anchorRef = this.anchorItemRef('folder', folder.id);
return (
<div className="list-item-container" style={containerStyle} key={folder.id} onDragStart={this.onFolderDragStart_} onDragOver={this.onFolderDragOver_} onDrop={this.onFolderDrop_} draggable={true} folderid={folder.id}>
{ expandLink }
<a
ref={anchorRef}
className="list-item"
href="#"
data-id={folder.id}
@@ -392,10 +453,14 @@ class SideBarComponent extends React.Component {
tagItem(tag, selected) {
let style = Object.assign({}, this.style().tagItem);
if (selected) style = Object.assign(style, this.style().listItemSelected);
const anchorRef = this.anchorItemRef('tag', tag.id);
return (
<a
className="list-item"
href="#"
ref={anchorRef}
data-id={tag.id}
data-type={BaseModel.TYPE_TAG}
onContextMenu={event => this.itemContextMenu(event)}
@@ -412,26 +477,26 @@ class SideBarComponent extends React.Component {
);
}
searchItem(search, selected) {
let style = Object.assign({}, this.style().listItem);
if (selected) style = Object.assign(style, this.style().listItemSelected);
return (
<a
className="list-item"
href="#"
data-id={search.id}
data-type={BaseModel.TYPE_SEARCH}
onContextMenu={event => this.itemContextMenu(event)}
key={search.id}
style={style}
onClick={() => {
this.searchItem_click(search);
}}
>
{search.title}
</a>
);
}
// searchItem(search, selected) {
// let style = Object.assign({}, this.style().listItem);
// if (selected) style = Object.assign(style, this.style().listItemSelected);
// return (
// <a
// className="list-item"
// href="#"
// data-id={search.id}
// data-type={BaseModel.TYPE_SEARCH}
// onContextMenu={event => this.itemContextMenu(event)}
// key={search.id}
// style={style}
// onClick={() => {
// this.searchItem_click(search);
// }}
// >
// {search.title}
// </a>
// );
// }
makeDivider(key) {
return <div style={{ height: 2, backgroundColor: "blue" }} key={key} />;
@@ -440,16 +505,138 @@ class SideBarComponent extends React.Component {
makeHeader(key, label, iconName, extraProps = {}) {
const style = this.style().header;
const icon = <i style={{ fontSize: style.fontSize * 1.2, marginRight: 5 }} className={"fa " + iconName} />;
if (extraProps.toggleblock || extraProps.onClick) {
style.cursor = "pointer";
}
let headerClick = extraProps.onClick || null;
delete extraProps.onClick;
// check if toggling option is set.
let toggleIcon = null;
const toggleKey = `${key}IsExpanded`;
if (extraProps.toggleblock) {
let isExpanded = this.state[toggleKey];
toggleIcon = <i className={`fa ${isExpanded ? 'fa-chevron-down' : 'fa-chevron-left'}`} style={{ fontSize: style.fontSize * 0.75,
marginRight: 12, marginLeft: 5, marginTop: style.fontSize * 0.125}}></i>;
}
const ref = this.anchorItemRef('headers', key);
return (
<div style={style} key={key} {...extraProps}>
<div ref={ref} style={style} key={key} {...extraProps} onClick={(event) => {
// if a custom click event is attached, trigger that.
if (headerClick) {
headerClick(key, event);
}
this.onHeaderClick_(key, event);
}}>
{icon}
{label}
<span style={{flex: 1 }}>{label}</span>
{toggleIcon}
</div>
);
}
selectedItem() {
if (this.props.notesParentType === 'Folder' && this.props.selectedFolderId) {
return { type: 'folder', id: this.props.selectedFolderId };
} else if (this.props.notesParentType === 'Tag' && this.props.selectedTagId) {
return { type: 'tag', id: this.props.selectedTagId };
} else if (this.props.notesParentType === 'Search' && this.props.selectedSearchId) {
return { type: 'search', id: this.props.selectedSearchId };
}
return null;
}
onKeyDown(event) {
const keyCode = event.keyCode;
const selectedItem = this.selectedItem();
if (keyCode === 40 || keyCode === 38) { // DOWN / UP
event.preventDefault();
const focusItems = [];
for (let i = 0; i < this.folderItemsOrder_.length; i++) {
const id = this.folderItemsOrder_[i];
focusItems.push({ id: id, ref: this.anchorItemRefs['folder'][id], type: 'folder' });
}
for (let i = 0; i < this.tagItemsOrder_.length; i++) {
const id = this.tagItemsOrder_[i];
focusItems.push({ id: id, ref: this.anchorItemRefs['tag'][id], type: 'tag' });
}
let currentIndex = 0;
for (let i = 0; i < focusItems.length; i++) {
if (!selectedItem || focusItems[i].id === selectedItem.id) {
currentIndex = i;
break;
}
}
const inc = keyCode === 38 ? -1 : +1;
let newIndex = currentIndex + inc;
if (newIndex < 0) newIndex = 0;
if (newIndex > focusItems.length - 1) newIndex = focusItems.length - 1;
const focusItem = focusItems[newIndex];
let actionName = focusItem.type.toUpperCase() + '_SELECT';
this.props.dispatch({
type: actionName,
id: focusItem.id,
});
focusItem.ref.current.focus();
}
if (keyCode === 9) { // TAB
event.preventDefault();
if (event.shiftKey) {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'focusElement',
target: 'noteBody',
});
} else {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'focusElement',
target: 'noteList',
});
}
}
if (selectedItem && selectedItem.type === 'folder' && keyCode === 32) { // SPACE
event.preventDefault();
this.props.dispatch({
type: 'FOLDER_TOGGLE',
id: selectedItem.id,
});
}
}
onHeaderClick_(key, event) {
const currentHeader = event.currentTarget;
const toggleBlock = +currentHeader.getAttribute('toggleblock');
if (toggleBlock) {
const toggleKey = `${key}IsExpanded`;
const isExpanded = this.state[toggleKey];
this.setState({ [toggleKey]: !isExpanded });
Setting.setValue(toggleKey, !isExpanded);
}
}
synchronizeButton(type) {
const style = this.style().button;
const style = Object.assign({}, this.style().button, { marginBottom: 5 });
const iconName = type === "sync" ? "fa-refresh" : "fa-times";
const label = type === "sync" ? _("Synchronise") : _("Cancel");
const icon = <i style={{ fontSize: style.fontSize, marginRight: 5 }} className={"fa " + iconName} />;
@@ -473,28 +660,37 @@ class SideBarComponent extends React.Component {
const theme = themeStyle(this.props.theme);
const style = Object.assign({}, this.style().root, this.props.style, {
overflowX: "hidden",
overflowY: "auto",
overflowY: "hidden",
display: 'inline-flex',
flexDirection: 'column',
});
let items = [];
items.push(this.makeHeader("folderHeader", _("Notebooks"), "fa-folder-o", {
onDrop: this.onFolderDrop_,
folderid: '',
toggleblock: 1
}));
if (this.props.folders.length) {
const folderItems = shared.renderFolders(this.props, this.folderItem.bind(this));
items = items.concat(folderItems);
const result = shared.renderFolders(this.props, this.folderItem.bind(this));
const folderItems = result.items;
this.folderItemsOrder_ = result.order;
items.push(<div className="folders" key="folder_items" style={{display: this.state.folderHeaderIsExpanded ? 'block': 'none'}}>
{folderItems}</div>);
}
items.push(this.makeHeader("tagHeader", _("Tags"), "fa-tags"));
items.push(this.makeHeader("tagHeader", _("Tags"), "fa-tags", {
toggleblock: 1
}));
if (this.props.tags.length) {
const tagItems = shared.renderTags(this.props, this.tagItem.bind(this));
const result = shared.renderTags(this.props, this.tagItem.bind(this));
const tagItems = result.items;
this.tagItemsOrder_ = result.order;
items.push(
<div className="tags" key="tag_items">
<div className="tags" key="tag_items" style={{display: this.state.tagHeaderIsExpanded ? 'block': 'none'}}>
{tagItems}
</div>
);
@@ -522,17 +718,23 @@ class SideBarComponent extends React.Component {
);
}
items.push(this.synchronizeButton(this.props.syncStarted ? "cancel" : "sync"));
const syncButton = this.synchronizeButton(this.props.syncStarted ? "cancel" : "sync");
items.push(
const syncReportComp = !syncReportText.length ? null : (
<div style={this.style().syncReport} key="sync_report">
{syncReportText}
</div>
);
{syncReportText}
</div>
);
return (
<div className="side-bar" style={style}>
{items}
<div ref={this.rootRef} onKeyDown={this.onKeyDown} className="side-bar" style={style}>
<div style={{flex:1, overflowY: 'auto'}}>
{items}
</div>
<div style={{flex:0}}>
{syncButton}
{syncReportComp}
</div>
</div>
);
}
@@ -554,6 +756,8 @@ const mapStateToProps = state => {
collapsedFolderIds: state.collapsedFolderIds,
decryptionWorker: state.decryptionWorker,
resourceFetcher: state.resourceFetcher,
windowCommand: state.windowCommand,
sidebarVisibility: state.sidebarVisibility,
};
};

View File

@@ -37,6 +37,7 @@
<div id="hlScriptContainer"></div>
<div id="markScriptContainer"></div>
<div id="content" ondragstart="return false;" ondrop="return false;"></div>
<script src="./lib.js"></script>
<script>
const contentElement = document.getElementById('content');
@@ -226,6 +227,8 @@
function setMarkers(keywords, options = null) {
if (!options) options = {};
// TODO: Add support for scriptType on mobile and CLI
if (!mark_) {
mark_ = new Mark(document.getElementById('content'), {
exclude: ['img'],
@@ -255,19 +258,14 @@
}
for (let i = 0; i < keywords.length; i++) {
const keyword = keywords[i];
let keyword = keywords[i];
if (keyword.type === 'regex') {
mark_.markRegExp(new RegExp(keyword.value, 'gmi'), {
each: onEachElement,
acrossElements: true,
});
} else {
mark_.mark([keyword], {
each: onEachElement,
accuracy: 'exactly',
});
}
markJsUtils.markKeyword(mark_, keyword, {
pregQuote: pregQuote,
replaceRegexDiacritics: replaceRegexDiacritics,
}, {
each: onEachElement,
});
}
ipcProxySendToHost('setMarkerCount', elementIndex);
@@ -359,22 +357,38 @@
return false;
}
function getParentAnchorElement(element) {
let counter = 0;
while (true) {
if (counter++ >= 10000) {
console.warn('been looping for too long - exiting')
return null;
}
if (!element) return null;
if (element.nodeName === 'A') return element;
element = element.parentElement;
}
}
document.addEventListener('click', function(event) {
const t = event.target;
const anchor = getParentAnchorElement(event.target);
if (!anchor) return;
// Prevent URLs added via <a> tags from being opened within the application itself
// otherwise it would open the whole website within the WebView.
if (t && t.nodeName === 'A' && !t.hasAttribute('data-from-md')) {
if (handleInternalLink(event, t)) return;
if (!anchor.hasAttribute('data-from-md')) {
if (handleInternalLink(event, anchor)) return;
event.preventDefault();
ipcProxySendToHost(t.getAttribute('href'));
ipcProxySendToHost(anchor.getAttribute('href'));
return;
}
// If this is an internal link, jump to the anchor directly
if (t && t.nodeName === 'A' && t.hasAttribute('data-from-md')) {
if (handleInternalLink(event, t)) return;
if (anchor.hasAttribute('data-from-md')) {
if (handleInternalLink(event, anchor)) return;
}
});

View File

@@ -0,0 +1,137 @@
const { time } = require('lib/time-utils.js');
const BaseModel = require('lib/BaseModel');
const markJsUtils = require('lib/markJsUtils');
const { _ } = require('lib/locale.js');
const { bridge } = require('electron').remote.require('./bridge');
const Menu = bridge().Menu;
const MenuItem = bridge().MenuItem;
const eventManager = require('../../eventManager');
const InteropService = require('lib/services/InteropService');
const InteropServiceHelper = require('../../InteropServiceHelper.js');
const Search = require('lib/models/Search');
const Note = require('lib/models/Note');
const SearchEngine = require('lib/services/SearchEngine');
const { replaceRegexDiacritics, pregQuote, substrWithEllipsis } = require('lib/string-utils');
class NoteListUtils {
static makeContextMenu(noteIds, props) {
const notes = noteIds.map((id) => BaseModel.byId(props.notes, id));
let hasEncrypted = false;
for (let i = 0; i < notes.length; i++) {
if (!!notes[i].encryption_applied) hasEncrypted = true;
}
const menu = new Menu()
if (!hasEncrypted) {
menu.append(new MenuItem({label: _('Add or remove tags'), enabled: noteIds.length === 1, click: async () => {
props.dispatch({
type: 'WINDOW_COMMAND',
name: 'setTags',
noteId: noteIds[0],
});
}}));
menu.append(new MenuItem({label: _('Duplicate'), click: async () => {
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
await Note.duplicate(noteIds[i], {
uniqueTitle: _('%s - Copy', note.title),
});
}
}}));
if (noteIds.length <= 1) {
menu.append(new MenuItem({label: _('Switch between note and to-do type'), click: async () => {
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
await Note.save(Note.toggleIsTodo(note), { userSideValidation: true });
eventManager.emit('noteTypeToggle', { noteId: note.id });
}
}}));
} else {
const switchNoteType = async (noteIds, type) => {
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
const newNote = Note.changeNoteType(note, type);
if (newNote === note) continue;
await Note.save(newNote, { userSideValidation: true });
eventManager.emit('noteTypeToggle', { noteId: note.id });
}
}
menu.append(new MenuItem({label: _('Switch to note type'), click: async () => {
await switchNoteType(noteIds, 'note');
}}));
menu.append(new MenuItem({label: _('Switch to to-do type'), click: async () => {
await switchNoteType(noteIds, 'todo');
}}));
}
menu.append(new MenuItem({label: _('Copy Markdown link'), click: async () => {
const { clipboard } = require('electron');
const links = [];
for (let i = 0; i < noteIds.length; i++) {
const note = await Note.load(noteIds[i]);
links.push(Note.markdownTag(note));
}
clipboard.writeText(links.join(' '));
}}));
const exportMenu = new Menu();
const ioService = new InteropService();
const ioModules = ioService.modules();
for (let i = 0; i < ioModules.length; i++) {
const module = ioModules[i];
if (module.type !== 'exporter') continue;
exportMenu.append(new MenuItem({ label: module.fullLabel() , click: async () => {
await InteropServiceHelper.export(props.dispatch.bind(this), module, { sourceNoteIds: noteIds });
}}));
}
if (noteIds.length === 1) {
exportMenu.append(new MenuItem({ label: 'PDF - ' + _('PDF File') , click: () => {
props.dispatch({
type: 'WINDOW_COMMAND',
name: 'exportPdf',
});
}}));
}
const exportMenuItem = new MenuItem({label: _('Export'), submenu: exportMenu});
menu.append(exportMenuItem);
}
menu.append(new MenuItem({label: _('Delete'), click: async () => {
await this.confirmDeleteNotes(noteIds);
}}));
return menu;
}
static async confirmDeleteNotes(noteIds) {
if (!noteIds.length) return;
let msg = '';
if (noteIds.length === 1) {
const note = await Note.load(noteIds[0]);
if (!note) return;
msg = _('Delete note "%s"?', substrWithEllipsis(note.title, 0, 32));
} else {
msg = _('Delete these %d notes?', noteIds.length);
}
const ok = bridge().showConfirmMessageBox(msg);
if (!ok) return;
await Note.batchDelete(noteIds);
}
}
module.exports = NoteListUtils;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "Joplin",
"version": "1.0.119",
"version": "1.0.126",
"description": "Joplin for Desktop",
"main": "main.js",
"scripts": {
@@ -8,8 +8,8 @@
"pack": "node_modules/.bin/electron-builder --dir",
"dist": "node_modules/.bin/electron-builder",
"publish": "build -p always",
"postinstall": "node compile-jsx.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts && install-app-deps",
"compile": "node compile-jsx.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts"
"postinstall": "node compile.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts && install-app-deps",
"compile": "node compile.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts"
},
"repository": {
"type": "git",
@@ -58,6 +58,9 @@
"linux": {
"asar": false,
"category": "Office",
"desktop": {
"Icon": "joplin"
},
"target": "AppImage"
}
},
@@ -81,6 +84,7 @@
"base-64": "^0.1.0",
"chokidar": "^2.0.3",
"compare-versions": "^3.2.1",
"diacritics": "^1.3.0",
"electron-context-menu": "^0.9.1",
"electron-is-dev": "^0.3.0",
"electron-window-state": "^4.1.1",
@@ -92,7 +96,7 @@
"highlight.js": "^9.12.0",
"html-entities": "^1.2.1",
"image-type": "^3.0.0",
"joplin-turndown": "^4.0.9",
"joplin-turndown": "^4.0.11",
"joplin-turndown-plugin-gfm": "^1.0.7",
"jssha": "^2.3.1",
"katex": "^0.10.0",

View File

@@ -1,12 +1,9 @@
const Setting = require('lib/models/Setting.js');
const zoomRatio = Setting.value('style.zoom') / 100;
const editorFontSize = Setting.value('style.editor.fontSize');
// globalStyle should be used for properties that do not change across themes
// i.e. should not be used for colors
const globalStyle = {
fontSize: Math.round(12 * zoomRatio),
fontSize: 12,
fontFamily: 'sans-serif',
margin: 15, // No text and no interactive component should be within this margin
itemMarginTop: 10,
@@ -15,8 +12,8 @@ const globalStyle = {
disabledOpacity: 0.3,
buttonMinWidth: 50,
buttonMinHeight: 30,
editorFontSize: editorFontSize,
textAreaLineHeight: Math.round(17 * editorFontSize / 12),
editorFontSize: 12,
textAreaLineHeight: 17,
headerHeight: 35,
headerButtonHPadding: 6,
@@ -25,10 +22,6 @@ const globalStyle = {
tagItemPadding: 3,
};
// For WebView - must correspond to the properties above
globalStyle.htmlFontSize = globalStyle.fontSize + 'px';
globalStyle.htmlLineHeight = Math.round(20 * zoomRatio) + 'px';
globalStyle.marginRight = globalStyle.margin;
globalStyle.marginLeft = globalStyle.margin;
globalStyle.marginTop = globalStyle.margin;
@@ -43,41 +36,10 @@ globalStyle.lineInput = {
fontFamily: globalStyle.fontFamily,
};
globalStyle.textStyle = {
globalStyle.headerStyle = {
fontFamily: globalStyle.fontFamily,
fontSize: globalStyle.fontSize,
lineHeight: '1.6em',
};
globalStyle.textStyle2 = Object.assign({}, globalStyle.textStyle, {});
globalStyle.urlStyle = Object.assign({}, globalStyle.textStyle, { textDecoration: 'underline' });
globalStyle.h1Style = Object.assign({}, globalStyle.textStyle);
globalStyle.h1Style.fontSize *= 1.5;
globalStyle.h1Style.fontWeight = 'bold';
globalStyle.h2Style = Object.assign({}, globalStyle.textStyle);
globalStyle.h2Style.fontSize *= 1.3;
globalStyle.h2Style.fontWeight = 'bold';
globalStyle.toolbarStyle = {
height: globalStyle.toolbarHeight,
minWidth: globalStyle.toolbarHeight,
display: 'flex',
alignItems: 'center',
paddingLeft: globalStyle.headerButtonHPadding,
paddingRight: globalStyle.headerButtonHPadding,
textDecoration: 'none',
fontFamily: globalStyle.fontFamily,
fontSize: globalStyle.fontSize,
boxSizing: 'border-box',
cursor: 'default',
justifyContent: 'center',
};
globalStyle.headerStyle = {};
globalStyle.inputStyle = {
border: '1px solid',
};
@@ -90,6 +52,11 @@ globalStyle.containerStyle = {
globalStyle.buttonStyle = {
marginRight: 10,
border: '1px solid',
minHeight: 30,
minWidth: 80,
maxWidth: 160,
paddingLeft: 12,
paddingRight: 12,
};
const lightStyle = {
@@ -114,15 +81,14 @@ const lightStyle = {
warningBackgroundColor: "#FFD08D",
codeColor: "#EFF0F1",
codeBorderColor: '#CBCBCB',
htmlColor:'black', // Note: CSS in WebView component only supports named colors or rgb() notation
htmlColor:'#222222',
htmlBackgroundColor: 'white',
htmlDividerColor: 'rgb(150,150,150)',
htmlLinkColor: 'blue',
htmlCodeColor: 'rgb(239, 240, 241)',
htmlCodeBorderColor: 'rgb(203, 203, 203)',
htmlDividerColor: 'rgb(230,230,230)',
htmlLinkColor: 'rgb(80,130,190)',
htmlTableBackgroundColor: 'rgb(247, 247, 247)',
htmlCodeBackgroundColor: 'rgb(243, 243, 243)',
htmlCodeBorderColor: 'rgb(220, 220, 220)',
htmlCodeColor: 'rgb(0,0,0)',
editorTheme: "chrome",
codeThemeCss: "atom-one-light.css",
@@ -151,14 +117,13 @@ const darkStyle = {
warningBackgroundColor: "#CC6600",
codeColor: "#2F3031",
codeBorderColor: '#464646',
htmlColor: 'rgb(220,220,220)', // Note: CSS in WebView component only supports named colors or rgb() notation
htmlColor: 'rgb(220,220,220)',
htmlBackgroundColor: 'rgb(29,32,36)',
htmlDividerColor: 'rgb(150,150,150)',
htmlDividerColor: '#3D444E',
htmlCodeColor: '#ffffff',
htmlLinkColor: 'rgb(166,166,255)',
htmlCodeColor: 'rgb(47, 48, 49)',
htmlTableBackgroundColor: 'rgb(40, 41, 42)',
htmlCodeBackgroundColor: 'rgb(47, 48, 49)',
htmlCodeBorderColor: 'rgb(70, 70, 70)',
editorTheme: 'twilight',
@@ -180,6 +145,58 @@ function addExtraStyles(style) {
color: style.raisedColor,
};
style.toolbarStyle = {
height: style.toolbarHeight,
minWidth: style.toolbarHeight,
display: 'flex',
alignItems: 'center',
paddingLeft: style.headerButtonHPadding,
paddingRight: style.headerButtonHPadding,
textDecoration: 'none',
fontFamily: style.fontFamily,
fontSize: style.fontSize,
boxSizing: 'border-box',
cursor: 'default',
justifyContent: 'center',
color: style.color,
};
style.textStyle = {
fontFamily: globalStyle.fontFamily,
fontSize: style.fontSize,
lineHeight: '1.6em',
color: style.color
};
style.textStyle2 = Object.assign({}, style.textStyle,
{ color: style.color2, }
);
style.urlStyle = Object.assign({}, style.textStyle,
{
textDecoration: 'underline',
color: style.urlColor
}
);
style.h1Style = Object.assign({},
style.textStyle,
{
color: style.color,
fontSize: style.textStyle.fontSize * 1.5,
fontWeight: 'bold'
}
);
style.h2Style = Object.assign({},
style.textStyle,
{
color: style.color,
fontSize: style.textStyle.fontSize * 1.3,
fontWeight: 'bold'
}
);
return style;
}
@@ -187,26 +204,40 @@ let themeCache_ = {};
function themeStyle(theme) {
if (!theme) throw new Error('Theme must be specified');
if (themeCache_[theme]) return themeCache_[theme];
var zoomRatio = Setting.value('style.zoom') / 100;
var editorFontSize = Setting.value('style.editor.fontSize');
const cacheKey = [theme, zoomRatio, editorFontSize].join('-');
if (themeCache_[cacheKey]) return themeCache_[cacheKey];
let fontSizes = {
fontSize: Math.round(12 * zoomRatio),
editorFontSize: editorFontSize,
textAreaLineHeight: Math.round(17 * editorFontSize / 12),
// For WebView - must correspond to the properties above
htmlFontSize: Math.round(15 * zoomRatio) + 'px',
htmlLineHeight: '1.6em', //Math.round(20 * zoomRatio) + 'px'
htmlCodeFontSize: '.9em',
}
let output = {};
output.zoomRatio = zoomRatio;
output.editorFontSize = editorFontSize;
if (theme == Setting.THEME_LIGHT) {
output = Object.assign({}, globalStyle, lightStyle);
output = Object.assign({}, globalStyle, fontSizes, lightStyle);
}
else if (theme == Setting.THEME_DARK) {
output = Object.assign({}, globalStyle, darkStyle);
output = Object.assign({}, globalStyle, fontSizes, darkStyle);
}
// TODO: All the theme specific things should go in addExtraStyles
// Note: All the theme specific things should go in addExtraStyles
// so that their definition is not split between here and the
// beginning of the file. At least new styles should go in
// addExtraStyles.
output.textStyle = Object.assign({},
output.textStyle,
{ color: output.color }
);
output.icon = Object.assign({},
output.icon,
{ color: output.color }
@@ -220,31 +251,6 @@ function themeStyle(theme) {
}
);
output.textStyle2 = Object.assign({},
output.textStyle2,
{ color: output.color2, }
);
output.urlStyle = Object.assign({},
output.urlStyle,
{ color: output.urlColor }
);
output.h1Style = Object.assign({},
output.h1Style,
{ color: output.color }
);
output.h2Style = Object.assign({},
output.h2Style,
{ color: output.color }
);
output.toolbarStyle = Object.assign({},
output.toolbarStyle,
{ color: output.color }
);
output.headerStyle = Object.assign({},
output.headerStyle,
{
@@ -281,8 +287,8 @@ function themeStyle(theme) {
output = addExtraStyles(output);
themeCache_[theme] = output;
return themeCache_[theme];
themeCache_[cacheKey] = output;
return themeCache_[cacheKey];
}
module.exports = { themeStyle };

11
ElectronClient/package-lock.json generated Normal file
View File

@@ -0,0 +1,11 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"diacritics": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
"integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E="
}
}
}

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