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

Compare commits

...

236 Commits

Author SHA1 Message Date
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
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
Laurent Cozic
c0d679b6c2 Android release v1.0.178 2018-12-16 18:41:51 +01:00
Laurent Cozic
eb789b9b9a Electron release v1.0.119 2018-12-16 18:35:37 +01:00
Laurent Cozic
b1898141c3 Mobile: Fixes #382: Implemented new search engine for mobile and highlight searched words in notes 2018-12-16 18:32:42 +01:00
Laurent Cozic
3231bfaff0 Mobile: Fixes #1045: Display notebooks as a tree in notebook dropdown 2018-12-16 17:18:24 +01:00
Laurent Cozic
6bb09c9c30 Updated FAQ with info about F-Droid and how to fix Nextcloud issues 2018-12-16 14:30:56 +01:00
Laurent Cozic
35d3fe03ab Android: Fixes #321: Changed notification library to Firebase to get more reliable notifications 2018-12-16 14:11:45 +01:00
Laurent Cozic
f05929cd17 All: Fixes #1033: Handle hard break when rendering Markdown to HTML 2018-12-16 11:41:15 +01:00
Laurent Cozic
982c9828da Desktop: Fixes #1039: Always print or export to PDF using light theme 2018-12-16 02:49:06 +01:00
Laurent Cozic
d6eacb2b33 Android release v1.0.177 2018-12-15 01:51:49 +01:00
Laurent Cozic
0abe213fc2 Merge branch 'master' of github.com:laurent22/joplin 2018-12-15 01:46:16 +01:00
Laurent Cozic
a6716d55c5 Doc: Added search engine doc 2018-12-15 01:46:06 +01:00
Laurent Cozic
fa0572de77 Mobile: Many small fixes and improvements to style and layout to make app more usable 2018-12-15 01:45:35 +01:00
Laurent Cozic
6dca4a0d6b Mobile: Optimised loading of large notes that contain many images. 2018-12-15 01:42:19 +01:00
Helmut K. C. Tessarek
eacfe1a9ac add Apache WebDAV Module to WebDAV-compatible services (#1042) 2018-12-14 22:50:50 +00:00
Laurent Cozic
c223cdf10a Electron release v1.0.118 2018-12-14 19:57:32 +01:00
Laurent Cozic
38c42b7a15 Merge branch 'full_text_search' 2018-12-14 19:56:21 +01:00
Mats Estensen
56432dc773 [Documentation] Add example editor config to FAQ (#1036)
* add external editor example config to faq

* add external editor to feature list
2018-12-14 18:04:53 +00:00
Lucas
d3b4379161 Update to make it works in Kubuntu (#1038)
The directory ~/.local/share/applications/ exists in Kubuntu 18.04 so with this change the script also work in Kubuntu.
2018-12-14 18:03:39 +00:00
Laurent Cozic
8a6fcdbcae Should be commented out by default 2018-12-14 00:00:03 +01:00
Laurent Cozic
061ce646d2 Finished search engine integration with desktop app 2018-12-13 23:57:14 +01:00
Laurent Cozic
5ec7c16e3e Fixed logic to update search engine data 2018-12-12 22:40:05 +01:00
Andros Fenollosa
5d629508c1 Fix name in Linux Desktop (#1034) 2018-12-11 21:51:47 +01:00
Laurent Cozic
0a6f8b0cfe Started integrating search engine to desktop app 2018-12-10 19:58:49 +01:00
Laurent Cozic
460f826672 Nearly finished search engine backend 2018-12-10 18:54:46 +00:00
Laurent Cozic
cb16a10121 Updated the way item changes are recorded so that info can be used by more services (including search engine) 2018-12-10 01:39:31 +01:00
Laurent Cozic
3b6131f1ca Started support for FTS search 2018-12-09 21:45:50 +01:00
Laurent Cozic
57225a36b9 Updated translations 2018-12-09 01:22:16 +01:00
Laurent Cozic
3e313399c2 Desktop: Search within current note 2018-12-09 01:18:10 +01:00
Laurent Cozic
7947e14792 Merge branch 'master' of github.com:laurent22/joplin 2018-12-08 00:42:54 +01:00
Laurent Cozic
71098102c5 Electron: Fixes #476 (maybe): Trying to fix notification flood. Added more log statements in case something goes wrong. 2018-12-08 00:42:29 +01:00
Laurent Cozic
8e601e80df All: Prevent sync infinite loop under some rare conditions 2018-12-08 00:41:39 +01:00
Caleb John
3b14cfcc54 add separate editor font size option (#1027) 2018-12-07 22:26:03 +01:00
Laurent Cozic
61a0e43092 Mobile: Fixes #999: Associate new note with default notebook when creating it from Welcome screen 2018-12-07 01:23:36 +01:00
Laurent Cozic
d08aaffe41 Mobile: Resolves #1015: (Re-)added support for selecting image from camera roll 2018-12-07 01:07:10 +01:00
Laurent Cozic
7d0def30f0 Revert "ReactNativeClient: A better NAV_BACK logic to change folder or tag. (#984)" (Was opening up side menu on first app startup)
This reverts commit fc8f53fd0e.
2018-12-07 00:45:53 +01:00
Laurent Cozic
bb45d72a56 Clipper: Fixes #1026: Handle adding tag to clipped content after content has been clipped 2018-12-06 23:50:02 +01:00
Laurent Cozic
3943192c5d All: Fixes #808 (maybe): Added fix for Nginx 404 error issue. 2018-12-06 23:09:54 +01:00
Laurent Cozic
18d76807f6 Fixing Norwegian locale 2018-12-06 22:59:08 +01:00
Laurent Cozic
01a30a7ccf Fixed renaming 'no' locale to 'nb_NO' 2018-12-05 23:30:36 +01:00
Mats Estensen
3fb35d043b Revise and complete Norwegian translation (no) and rename to correct locale: nb_NO (#1013)
* update norwegian translation and correct locale name to nb_NO

* set no to nb_NO in documentation

* Add name, email and completion to README

Norwegian translation
2018-12-05 23:21:40 +01:00
Alex Devero
9b51bd484d Fix failing Windows build (#997)
* Upgrade sqlite3 to 4.0.4

* Remove rebuild, add install-app-deps
2018-12-05 23:11:40 +01:00
Laurent Cozic
879b556845 Update website 2018-11-24 12:05:49 +00:00
Laurent Cozic
0df2a501dd Electron release v1.0.117 2018-11-24 11:44:38 +00:00
Laurent Cozic
6f64fdffcc Desktop: Fixes #995: Added flag to disable tag bar for now 2018-11-24 11:42:50 +00:00
Laurent Cozic
19252af345 Desktop: Fixes #996: Allow editing multiple notes in external editor 2018-11-21 19:50:50 +00:00
Laurent Cozic
897f53b13e All: Resolves #846: Set resource path to correct relative path so that for example images show up in Markdown viewers 2018-11-21 00:36:23 +00:00
Laurent Cozic
45cd8b7e3c Merge branch 'master' of github.com:laurent22/joplin 2018-11-20 23:19:07 +00:00
Laurent Cozic
922bbdd1b6 All: Fixes #968: Export resources specified with a title 2018-11-20 23:18:56 +00:00
rhtenhove
c24135577c Useless and error prone VERSION file removed & warn use of root (#989)
* Don't create unused VERSION file

It will throw an error if the script is run from a non-writable directory

* Warn user if running as root

This will write files as root:root

* Clearer root warning
2018-11-20 21:54:58 +00:00
Laurent Cozic
3240ff40bc Restored string to avoid invalidating all the translations. 2018-11-20 21:54:40 +00:00
Ben Fisher
58b68cab0c fix for #906, 1) windows paths like C:\a\b weren't accepted because b… (#935)
* fix for #906, 1) windows paths like C:\a\b weren't accepted because backslashes were treated as escape sequences, 2) common paths like C:\Program Files\Foo\Foo.exe weren't accepted because of the space in the path

* Using anothing approach,
a) backslashes are no longer treated as escape characters,
b) string change to remind people to add spaces

* Removing joplin.pot from the patch, it will be updated later.

* Removing unused code.
2018-11-20 21:46:18 +00:00
Helmut K. C. Tessarek
0a0afd7245 CLI v1.0.118 2018-11-20 15:38:32 -05:00
Laurent Cozic
de01606bff Update website 2018-11-20 19:09:47 +00:00
Laurent Cozic
046474b484 Android release v1.0.176 2018-11-20 00:49:27 +00:00
Laurent Cozic
277b2b9298 Electron release v1.0.116 2018-11-20 00:44:25 +00:00
Laurent Cozic
0b7296ae95 Update translations 2018-11-20 00:43:35 +00:00
Laurent Cozic
ce87dd55f0 Merge branch 'master' of github.com:laurent22/joplin 2018-11-20 00:42:33 +00:00
Laurent Cozic
07b724d65b All: Fixes #992: Allow non-ASCII chars when exporting MD and handle duplicate filenames 2018-11-20 00:42:21 +00:00
Caleb John
bc1984298f Add dark theme to note properties dialog (#991) 2018-11-19 22:48:10 +00:00
Ein Verne
9ed0bdfed2 Add more Chinese translation (#986) 2018-11-19 22:44:20 +00:00
Caleb John
57628e8986 Add missing syntax file for dark theme (#985) 2018-11-19 22:43:56 +00:00
Joybin Chen
fc8f53fd0e ReactNativeClient: A better NAV_BACK logic to change folder or tag. (#984) 2018-11-19 22:43:21 +00:00
Renato Rosa
efd7cc6a0c update-locale-pt_BR (#981)
Update missing strings and fixed flagged ones.
2018-11-19 22:40:21 +00:00
Abijeet Patro
7bfc3e1256 Fixes #979 (#980)
* Adds functionality to display tags under the open note.

Towards #469

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

* Ensured tags in the dialog box and under the note appear in the same order.

Few formatting tweaks.

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

* Fixes issues raised during code review.

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

* Refactored code to always display tags in ascending order.

This changes the order of the tags in the dialog box and below the tag title.

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

* Added the new tag height and margin bottom to the bottomRowHeight

Fixes #979

Signed-off-by: Abijeet <abijeetpatro@gmail.com>
2018-11-17 11:21:57 +00:00
FleischKarussel
7f6ca1e527 fixed typo in Aktualsierungsdatum to Aktualisierungsdatum (#974) 2018-11-17 11:17:47 +00:00
Laurent Cozic
71d9b1d441 Electron: Fixes #933: Handle internal links from HTML and from MD 2018-11-16 18:39:11 +00:00
Laurent Cozic
a3d64d0a90 Update website 2018-11-16 16:53:37 +00:00
Laurent Cozic
e7ec2ce6cf Electron release v1.0.115 2018-11-13 23:18:08 +00:00
Laurent Cozic
61dbdd5f7c Update translations 2018-11-13 23:17:56 +00:00
Laurent Cozic
e6888c451d Fixing Katex version number 2018-11-13 22:42:06 +00:00
Laurent Cozic
899219abd2 Merge branch 'master' of github.com:laurent22/joplin 2018-11-13 22:38:32 +00:00
Joybin Chen
7a4c7a13eb Fix image fetching error. For url like http://example.com/favicon.ico?ver=1.0 will be changed to http://example.com/favicon.ico?ver=1.0?ver=1.0 (#970) 2018-11-13 22:37:39 +00:00
Laurent Cozic
e8797f49b9 Mobile: Display number of resources being fetched in side bar 2018-11-13 22:27:58 +00:00
Laurent Cozic
e17f3051f0 Display number of resources being fetched in side bar 2018-11-13 22:25:23 +00:00
Laurent Cozic
06091933e1 All: Moved resource app-specific state to different table 2018-11-13 00:45:08 +00:00
Laurent Cozic
b30c65dd89 Update CONTRIBUTING.md 2018-11-11 20:23:55 +00:00
Ben Fisher
0eb18d206d Patch to implement feature, exporting notes to JSON (#912, issues/912). (#927)
* Patch to implement feature, exporting notes to JSON (#912, issues/912).

* Revising based on feedback

* Directly calling JSON.stringify on the item
2018-11-11 20:17:43 +00:00
Laurent Cozic
3a9948e528 Build doc 2018-11-08 01:21:18 +00:00
Laurent Cozic
2bcddd38b2 Update API doc 2018-11-08 01:17:46 +00:00
Laurent Cozic
5ff8808f69 API: Allow setting the ID of newly created notes. 2018-11-08 01:14:13 +00:00
Laurent Cozic
28b1d8a324 Desktop: Fixes #953 (maybe): Improved the way internal links to notes are loaded to make it more reliable 2018-11-08 00:58:06 +00:00
Laurent Cozic
5c1dd79435 All: Fixes #952: Upgraded Katex lib to fix bug 2018-11-07 23:44:59 +00:00
Laurent Cozic
706d59a6cc Doc 2018-11-07 23:43:48 +00:00
Ben Fisher
251f1bba55 Show note title in pdf export (#890) (#937)
* Show note title in pdf export (#890)

An example of a possible approach, to temporarily change the html in the webview to show the note title. Works, but there may be a more elegant fix.

* Show title in pdf export

Revising based on feedback
Also, a couple changes to tests so that they pass in Windows.
2018-11-07 23:35:14 +00:00
Caleb John
cb1fd85ca4 Add support for custom css across all notes (#925) 2018-11-07 22:52:31 +00:00
Laurent Cozic
11ddc55911 Fixed theme handling for new tag feature 2018-11-07 22:47:34 +00:00
Caleb John
ee106105d8 Joplin desktop Dark Mode (#921)
* Added support for the dark mode on desktop

* Add dark highlighting to the code tags

* Update app/theme.js to be more clear and more easily support additional themes
Update more files to conform to theming
2018-11-07 22:37:13 +00:00
Laurent Cozic
19f5a144e5 Added comment 2018-11-07 22:22:26 +00:00
Abijeet Patro
18717bac79 Adds functionality to display tags under the open note. (#893)
* Adds functionality to display tags under the open note.

Towards #469

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

* Ensured tags in the dialog box and under the note appear in the same order.

Few formatting tweaks.

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

* Fixes issues raised during code review.

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

* Refactored code to always display tags in ascending order.

This changes the order of the tags in the dialog box and below the tag title.

Signed-off-by: Abijeet <abijeetpatro@gmail.com>
2018-11-07 22:16:05 +00:00
Laurent Cozic
28fa83c406 Merge branch 'master' of github.com:laurent22/joplin 2018-11-02 19:56:18 +00:00
Laurent Cozic
258e514a91 Marked password cache as secure, and only display stars if the value is non-empty 2018-11-02 19:22:49 +00:00
Ben Fisher
f92546d6eb Adding some tips for building and debugging Joplin on Windows (#938) 2018-11-02 01:06:48 +00:00
sensor-freak
693456164b Minor fix for translation of 'Location' (#936) 2018-11-02 00:53:05 +00:00
Helmut K. C. Tessarek
7cd3e6b1f7 mobile: add version info (#930) 2018-11-02 00:43:42 +00:00
FoxMaSk
764e63d869 new French Translations (#923) 2018-11-02 00:24:28 +00:00
Laurent Cozic
2c6f47f277 Update README.md
Removed Hacktoberfest news
2018-11-01 17:45:05 +00:00
Laurent Cozic
e41896d6f3 All: Resolves #918: Skip properties that are on sync target but not handled by local client 2018-10-31 00:35:57 +00:00
Laurent Cozic
990591cc80 Minor improvments 2018-10-30 00:17:50 +00:00
Laurent Cozic
7b85c33213 CLI v1.0.117 2018-10-29 23:24:19 +00:00
Laurent Cozic
4b4d0e8b25 Update website 2018-10-24 21:14:38 +01:00
Laurent Cozic
4fb6af3c62 Android release v1.0.175 2018-10-24 19:59:37 +01:00
Laurent Cozic
d7ffe7e294 Electron release v1.0.114 2018-10-24 19:52:07 +01:00
Laurent Cozic
3ff139d445 Merge branch 'master' of github.com:laurent22/joplin 2018-10-24 19:51:16 +01:00
Laurent Cozic
40443e0134 Android v153 2018-10-24 19:50:26 +01:00
Laurent Cozic
1f927c1285 iOS v26 2018-10-24 19:48:09 +01:00
Andros Fenollosa
5e82e62335 Linux script install: implement previous updates (#905)
Avoid an erroneous update and prevent installation icon only on gnome.
2018-10-24 19:17:18 +01:00
Yannis Mitsos
de954827df Support FreeBSD in terminal (#896) 2018-10-24 19:16:15 +01:00
Laurent Cozic
2cb24bf198 Mobile: Fixes #902: Don't change existing note when sharing with mobile app 2018-10-24 19:10:05 +01:00
Laurent Cozic
739a6a4a9c Documentation 2018-10-24 18:47:04 +01:00
Laurent Cozic
dfcf1193dc Electron: Handle internal anchors 2018-10-17 08:01:18 +01:00
Laurent Cozic
c72f92e22f Additional info 2018-10-15 18:40:11 +01:00
Laurent Cozic
f6d01ce7e1 Android release v1.0.174 2018-10-15 00:01:36 +01:00
Laurent Cozic
fed9700587 Merge branch 'master' of github.com:laurent22/joplin 2018-10-15 00:00:13 +01:00
Laurent Cozic
12a3a9a89e android release 2018-10-14 23:59:42 +01:00
Laurent Cozic
590c62c371 Merge branch 'fixing_android_build' 2018-10-14 23:56:42 +01:00
Laurent Cozic
df41f64b3c Revert "trying to fix android build"
This reverts commit 621d0260f4.
2018-10-14 21:47:12 +01:00
Laurent Cozic
1849355245 Android: Tryinc to fix release builkd 2018-10-14 21:42:34 +01:00
Laurent Cozic
fa1b471ea4 Android: Tryinc to fix release builkd 2018-10-14 21:41:29 +01:00
Laurent Cozic
0a67f8c947 Revert "Android: Updated project to build on macOS"
This reverts commit b547f9aa13.
2018-10-14 20:44:05 +01:00
Laurent Cozic
621d0260f4 trying to fix android build 2018-10-14 19:57:30 +01:00
Laurent Cozic
f93fca7c5b Revert "Android: Updated project to build on macOS"
This reverts commit b547f9aa13.
2018-10-13 11:35:21 +01:00
Laurent Cozic
f4d830c2ef Android release v1.0.151 2018-10-13 11:09:03 +01:00
Laurent Cozic
1aa2844efa Android release v1.0.148 2018-10-13 10:39:55 +01:00
Laurent Cozic
f22b2adaad Mobile: Improved camera attachment 2018-10-13 10:32:44 +01:00
Laurent Cozic
b547f9aa13 Android: Updated project to build on macOS 2018-10-13 00:30:41 +01:00
Laurent Cozic
e4166e9da7 Electron: Fixes #312 (maybe): Removed power saving feature, which wasn\'t doing anything and added a possible fix to the UI freezing issue on Linux 2018-10-12 23:44:00 +01:00
Laurent Cozic
1634fdb421 Merge branch 'master' of github.com:laurent22/joplin 2018-10-12 23:26:11 +01:00
Laurent Cozic
7f51035f91 Mobile: Reload note when resource got downloaded. Also fixed Android build script to make it work in macOS. 2018-10-12 23:25:11 +01:00
ebayer
70e71cbc2a Mobile: Fixes #856: Add option to open source url (#872)
* Mobile: Fixes #856: Add option to open source url

* Mobile: Fixes #856: Change menu wording for opening source url
2018-10-12 19:30:00 +01:00
Laurent Cozic
ffd03bf34c Merge branch 'master' of github.com:laurent22/joplin 2018-10-11 17:53:40 +01:00
Christian Baer
f59a3dee78 Fixed some more inconsistencies in german language file. (#855)
* Fixed some typos and inconsistencies in the german language file and added missing translations.

* Fixed some more inconsistencies in german language file.
2018-10-11 17:21:12 +01:00
Timothy Cyrus
3ba3037242 Update README.md (#874) 2018-10-11 17:20:42 +01:00
Helmut K. C. Tessarek
dbb269fef6 add support for webp images (#858)
fixes #848
2018-10-11 17:18:33 +01:00
Laurent Cozic
e209189faa All: Added resource test units 2018-10-11 17:18:24 +01:00
251 changed files with 9908 additions and 5590 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

@@ -58,6 +58,8 @@ If node-gyp does not works (MSBUILD: error MSB3428: Could not load the Visual C+
If `yarn dist` fails, it may need administrative rights.
The [building\_win32\_tips on this page](./readme/building_win32_tips.md) might be helpful.
# Building the Mobile application
First you need to setup React Native to build projects with native code. For this, follow the instructions on the [Get Started](https://facebook.github.io/react-native/docs/getting-started.html) tutorial, in the "Building Projects with Native Code" tab.

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,9 +16,13 @@ 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.
@@ -23,4 +31,4 @@ Building the apps is relatively easy - please [see the build instructions](https
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):
- **Please use tabs, NOT spaces.**
- **Please do not add or remove optional characters, such as spaces or colons.** Please setup your editor so that it only changes what you are working on and is not making automated changes elsewhere. The reason for this is that small white space changes make diff hard to read and can cause needless conflicts.
- **Please do not add or remove optional characters, such as spaces or colons.** Please setup your editor so that it only changes what you are working on and is not making automated changes elsewhere. The reason for this is that small white space changes make diff hard to read and can cause needless conflicts.

View File

@@ -69,7 +69,8 @@ class Command extends BaseCommand {
lines.push(' }');
lines.push('}');
lines.push('```');
lines.push('');
lines.push('# Authorisation')
lines.push('');
lines.push('To prevent unauthorised applications from accessing the API, the calls must be authentified. To do so, you must provide a token as a query parameter for each API call. You can get this token from the Joplin desktop application, on the Web Clipper Options screen.');
@@ -79,6 +80,7 @@ class Command extends BaseCommand {
lines.push('\tcurl http://localhost:41184/notes?token=ABCD123ABCD123ABCD123ABCD123ABCD123');
lines.push('');
lines.push('In the documentation below, the token will not be specified every time however you will need to include it.');
lines.push('');
lines.push('# Using the API');
lines.push('');
@@ -253,6 +255,12 @@ class Command extends BaseCommand {
lines.push('');
lines.push(' curl --data \'{ "title": "Image test", "body": "Here is Joplin icon:", "image_data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUeNoAyAA3/wFwtO3K6gUB/vz2+Prw9fj/+/r+/wBZKAAExOgF4/MC9ff+MRH6Ui4E+/0Bqc/zutj6AgT+/Pz7+vv7++nu82c4DlMqCvLs8goA/gL8/fz09fb59vXa6vzZ6vjT5fbn6voD/fwC8vX4UiT9Zi//APHyAP8ACgUBAPv5APz7BPj2+DIaC2o3E+3o6ywaC5fT6gD6/QD9/QEVf9kD+/dcLQgJA/7v8vqfwOf18wA1IAIEVycAyt//v9XvAPv7APz8LhoIAPz9Ri4OAgwARgx4W/6fVeEAAAAASUVORK5CYII="}\' http://127.0.0.1:41184/notes');
lines.push('');
lines.push('### Creating a note with a specific ID');
lines.push('');
lines.push('When a new note is created, it is automatically assigned a new unique ID so **normally you do not need to set the ID**. However, if for some reason you want to set it, you can supply it as the `id` property. It needs to be a 32 characters long hexadecimal string. **Make sure it is unique**, for example by generating it using whatever GUID function is available in your programming language.');
lines.push('');
lines.push(' curl --data \'{ "id": "00a87474082744c1a8515da6aa5792d2", "title": "My note with custom ID"}\' http://127.0.0.1:41184/notes');
lines.push('');
}
lines.push('## PUT /' + tableName + '/:id');

View File

@@ -26,7 +26,7 @@ class Command extends BaseCommand {
const md = Setting.settingMetadata(name);
let value = Setting.value(name);
if (typeof value === 'object' || Array.isArray(value)) value = JSON.stringify(value);
if (md.secure) value = '********';
if (md.secure && value) value = '********';
if (Setting.isEnum(name)) {
return _('%s = %s (%s)', name, value, Setting.enumOptionsDoc(name));

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');
@@ -196,6 +195,7 @@ class Command extends BaseCommand {
// not going to be running in the background, so the resources need to be
// explicitely downloaded below.
if (!app().hasGui()) {
this.stdout(_('Downloading resources...'));
await ResourceFetcher.instance().fetchAll();
await ResourceFetcher.instance().waitForAllFinished();
}

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

@@ -460,6 +460,9 @@ msgstr "No es pot inicialitzar el sincronitzador."
msgid "Starting synchronisation..."
msgstr "Està començant la sincronització..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "S'està cancel·lant... Espereu."
@@ -652,6 +655,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Cerca a totes les notes"
#, fuzzy
msgid "Search in current note"
msgstr "Cerca a totes les notes"
msgid "View"
msgstr "Visualització"
@@ -711,9 +718,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í"
@@ -984,6 +1003,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Obre..."
@@ -1000,6 +1022,9 @@ msgstr "Copia el camí al porta-retalls"
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Missatge o enllaç no suportat: %s"
@@ -1012,6 +1037,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 ""
@@ -1037,9 +1065,6 @@ msgstr "Estableix una alarma"
msgid "In: %s"
msgstr "A: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1117,6 +1142,14 @@ msgstr "Sincronitza"
msgid "Notebooks"
msgstr "Blocs de notes"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Elements obtinguts: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Recursos: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Seleccioneu on s'hauria d'exportar l'estat de la sincronització"
@@ -1161,6 +1194,9 @@ msgstr ""
"No es pot actualitzar el testimoni: manquen les dades d'autenticació. Si "
"comenceu altre cop la sincronització, potser es corregeixi el problema."
msgid "Untitled"
msgstr "Sense títol"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1208,10 +1244,6 @@ msgstr "Elements remots suprimits: %d."
msgid "Fetched items: %d/%d."
msgstr "Elements obtinguts: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Estat: %s"
msgid "Cancelling..."
msgstr "S'està cancel·lant..."
@@ -1258,9 +1290,6 @@ msgstr "data d'actualització"
msgid "created date"
msgstr "data de creació"
msgid "Untitled"
msgstr "Sense títol"
msgid "This note does not have geolocation information."
msgstr "Aquesta nota no té informació de geolocalització."
@@ -1323,12 +1352,22 @@ msgstr "Mostra la icona a la safata"
msgid "Note: Does not work in all desktop environments."
msgstr "Nota: no funciona en tots els entorns d'escriptori."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Percentatge de zoom global"
#, fuzzy
msgid "Editor font size"
msgstr "Tipus de lletra de l'editor"
msgid "Editor font family"
msgstr "Tipus de lletra de l'editor"
@@ -1343,6 +1382,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ó"
@@ -1451,6 +1497,10 @@ msgstr "Directori d'exportació del Joplin"
msgid "Evernote Export File"
msgstr "Fitxer d'exportació de l'Evernote"
#, fuzzy
msgid "Json Export Directory"
msgstr "Directori d'exportació del Joplin"
msgid "Directory"
msgstr "Directori"
@@ -1525,6 +1575,12 @@ msgstr "Alarmes programades"
msgid "On %s: %s"
msgstr "A les %s.%s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Ara mateix no hi ha cap nota. Creeu-ne una fent clic en el botó (+)."
@@ -1569,10 +1625,6 @@ msgstr "Confirmació"
msgid "Cancel synchronisation"
msgstr "Cancel·la la sincronització"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Elements obtinguts: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "S'està cancel·lant... Espereu."
@@ -1635,9 +1687,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"
@@ -1690,6 +1757,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Tipus d'imatge no admesa: %s"
#, fuzzy
msgid "Take photo"
msgstr "Adjunta una imatge"
msgid "Attach photo"
msgstr "Adjunta una imatge"
@@ -1714,6 +1785,9 @@ msgstr "Mostra les metadades"
msgid "View on map"
msgstr "Mostra-ho al mapa"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Suprimeix el bloc de notes"
@@ -1737,5 +1811,8 @@ msgstr ""
msgid "Welcome"
msgstr "Benvingut"
#~ msgid "State: %s."
#~ msgstr "Estat: %s"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Ja existeix un bloc de notes amb aquest títol: «%s»"

View File

@@ -448,6 +448,9 @@ msgstr "Nelze zavézt synchronizátor."
msgid "Starting synchronisation..."
msgstr "Zahajuji synchronizaci..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Zastavuji, chvíli strpení."
@@ -634,6 +637,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Hledat ve všech poznámkách"
#, fuzzy
msgid "Search in current note"
msgstr "Hledat ve všech poznámkách"
msgid "View"
msgstr "Zobrazit"
@@ -693,9 +700,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"
@@ -955,6 +974,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Otevřít..."
@@ -971,6 +993,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Nepodporovaný link či zpráva: %s"
@@ -981,6 +1006,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 ""
@@ -1006,9 +1034,6 @@ msgstr "Nastavit alarm"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1087,6 +1112,14 @@ msgstr "Synchronizovat"
msgid "Notebooks"
msgstr "Zápisníky"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Získané položky: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Zdroje: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Prosím vyberte, kam má být stav synchronizace exportován"
@@ -1131,6 +1164,9 @@ msgstr ""
"Nelze obnovit token: chybí autentizační data. Restart synchronizace může "
"tento problém vyřešit. "
msgid "Untitled"
msgstr "Bez názvu"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1178,10 +1214,6 @@ msgstr "Položky smazané na vzdáleném úložišti: %d."
msgid "Fetched items: %d/%d."
msgstr "Získané položky: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Stav: %s."
msgid "Cancelling..."
msgstr "Zastavuji..."
@@ -1232,9 +1264,6 @@ msgstr "Upraveno: %d."
msgid "created date"
msgstr "Vytvořeno: %d."
msgid "Untitled"
msgstr "Bez názvu"
msgid "This note does not have geolocation information."
msgstr "Tato poznámka nemá informace o poloze."
@@ -1298,12 +1327,22 @@ msgstr "Zobrazovat ikonu v panelu"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Globální zoom"
#, fuzzy
msgid "Editor font size"
msgstr "Rodina písma v editoru"
msgid "Editor font family"
msgstr "Rodina písma v editoru"
@@ -1318,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"
@@ -1426,6 +1472,10 @@ msgstr "Složka pro export"
msgid "Evernote Export File"
msgstr "Soubor Evernote Exportu"
#, fuzzy
msgid "Json Export Directory"
msgstr "Složka pro export"
msgid "Directory"
msgstr "Adresář"
@@ -1500,6 +1550,12 @@ msgstr "Nadcházející alarmy"
msgid "On %s: %s"
msgstr "Na %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Nemáte žádné poznámky. Vytvořte jednu kliknutím na tlačítko (+)."
@@ -1545,10 +1601,6 @@ msgstr "Potvrdit"
msgid "Cancel synchronisation"
msgstr "Zrušit synchronizaci"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Získané položky: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Zastavuji, chvíli strpení."
@@ -1604,10 +1656,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"
@@ -1659,6 +1726,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Nepodporovaný formát obrázku: %s"
#, fuzzy
msgid "Take photo"
msgstr "Přiložit obrázek"
msgid "Attach photo"
msgstr "Přiložit obrázek"
@@ -1683,6 +1754,9 @@ msgstr "Zobrazit metadata"
msgid "View on map"
msgstr "Zobrazit na map+"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Smazat zápisník"
@@ -1705,6 +1779,9 @@ msgstr "Nemáte žádný zápisník. Vytvořte jeden kliknutím na tlačítko (+
msgid "Welcome"
msgstr "Vítejte"
#~ msgid "State: %s."
#~ msgstr "Stav: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Zápisník s tímto názvem již existuje: \"%s\""

View File

@@ -452,6 +452,9 @@ msgstr "Kan ikke initialisere synkroniseringen."
msgid "Starting synchronisation..."
msgstr "Starter synkronisering."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Annullerer... Vent venligst."
@@ -639,6 +642,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Søg i alle noter"
#, fuzzy
msgid "Search in current note"
msgstr "Søg i alle noter"
msgid "View"
msgstr "Vis"
@@ -698,9 +705,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"
@@ -964,6 +983,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Åben..."
@@ -980,6 +1002,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Ugyldigt- eller ulovligt link eller besked: %s"
@@ -990,6 +1015,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 ""
@@ -1015,9 +1043,6 @@ msgstr "Indstil alarm"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1096,6 +1121,14 @@ msgstr "Synkroniser"
msgid "Notebooks"
msgstr "Notesbøger"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Hentede emner: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Ressourcer: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Vælg hvor sync status skal eksporteres til"
@@ -1140,6 +1173,9 @@ msgstr ""
"Kan ikke opdatere token: Godkendelses data mangler. Prøv at starte "
"synkronisering igen, det kan løse problemet."
msgid "Untitled"
msgstr "Samlet"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1187,10 +1223,6 @@ msgstr "Slettede fjern-emner: %d."
msgid "Fetched items: %d/%d."
msgstr "Hentede emner: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Tilstand: %s."
msgid "Cancelling..."
msgstr "Annullerer..."
@@ -1241,9 +1273,6 @@ msgstr "Opdateret %d."
msgid "created date"
msgstr "Oprettet: %d."
msgid "Untitled"
msgstr "Samlet"
msgid "This note does not have geolocation information."
msgstr "Denne note har ingen geolokations oplysninger."
@@ -1307,12 +1336,22 @@ msgstr "Vis ikon på bundbjælke"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Global zoom procent"
#, fuzzy
msgid "Editor font size"
msgstr "Rediger skrifttype"
msgid "Editor font family"
msgstr "Rediger skrifttype"
@@ -1327,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"
@@ -1435,6 +1481,10 @@ msgstr "Joplin eksport mappe"
msgid "Evernote Export File"
msgstr "Evernote eksport fil"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin eksport mappe"
msgid "Directory"
msgstr "Indeks"
@@ -1509,6 +1559,12 @@ msgstr "Kommende alarmer"
msgid "On %s: %s"
msgstr "På %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Der er ingen noter. Opret note ved at klikke på (+) knappen."
@@ -1554,10 +1610,6 @@ msgstr "Bekræft"
msgid "Cancel synchronisation"
msgstr "Afbryd synkronisering"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Hentede emner: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Annullerer... Vent venligst."
@@ -1613,10 +1665,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"
@@ -1668,6 +1735,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Ulovlig billedtype: %s"
#, fuzzy
msgid "Take photo"
msgstr "Vedhæft foto"
msgid "Attach photo"
msgstr "Vedhæft foto"
@@ -1692,6 +1763,9 @@ msgstr "Vis metadata"
msgid "View on map"
msgstr "Vis på kort"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Slet notesbog"
@@ -1714,6 +1788,9 @@ msgstr "Du har ingen notesbøger. Opret en ved at klikke på (+) knappen."
msgid "Welcome"
msgstr "Velkommen"
#~ msgid "State: %s."
#~ msgstr "Tilstand: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "En notesbog bruger allerede dette navn: \"%s\""

View File

@@ -197,8 +197,8 @@ msgid ""
"complete database including notebooks, notes, tags and resources."
msgstr ""
"Exportiert Joplin-Dateien in den angegebenen Pfad. Standardmäßig wird die "
"komplette Datenbank inklusive Notizbüchern, Notizen, Tags und Anhängen "
"exportiert."
"komplette Datenbank inklusive Notizbüchern, Notizen, Schlagwörtern und "
"Anhängen exportiert."
#, javascript-format
msgid "Destination format: %s"
@@ -305,7 +305,7 @@ msgstr "Anhänge: %d."
#, javascript-format
msgid "Tagged: %d."
msgstr "Getagged: %d."
msgstr "Verschlagwortet: %d."
msgid "Importing notes..."
msgstr "Importiere Notizen..."
@@ -471,8 +471,11 @@ msgstr "Kann Synchronisierer nicht initialisieren."
msgid "Starting synchronisation..."
msgstr "Starte Synchronisation..."
msgid "Downloading resources..."
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 "
@@ -597,7 +600,7 @@ msgstr "Exportiere „%s“ ins „%s“ Format. Bitte warten..."
#, 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"
@@ -660,11 +663,14 @@ msgstr "Im externen Editor bearbeiten"
msgid "Search in all the notes"
msgstr "Alle Notizen durchsuchen"
msgid "Search in current note"
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"
@@ -694,7 +700,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"
@@ -717,10 +723,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"
@@ -876,7 +895,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, "
@@ -918,7 +937,7 @@ msgid "Notebook title:"
msgstr "Notizbuch-Titel:"
msgid "Add or remove tags:"
msgstr "Füge hinzu oder entferne Schlagwörter:"
msgstr "Schlagwörter hinzufügen oder entfernen:"
msgid "Separate each tag by a comma."
msgstr "Trenne jedes Schlagwort mit einem Komma."
@@ -958,7 +977,7 @@ msgstr "Duplizieren"
#, javascript-format
msgid "%s - Copy"
msgstr "%s kopieren"
msgstr "%s - Kopieren"
msgid "Switch between note and to-do type"
msgstr "Zwischen Notiz und To-Do Typ wechseln"
@@ -988,12 +1007,16 @@ msgstr ""
"Momentan existieren noch keine Notizbücher. Erstelle eines, indem du auf "
"\"Neues Notizbuch\" drückst."
# 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.
msgid "Location"
msgstr "Ablageort"
msgstr "Standort"
msgid "URL"
msgstr "URL"
msgid "Note properties"
msgstr "Notiz-Eigenschaften"
msgid "Open..."
msgstr "Öffne..."
@@ -1010,6 +1033,10 @@ msgstr "Pfad in Zwischenablage kopieren"
msgid "Copy Link Address"
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"
msgstr "Nicht unterstützter Link oder Nachricht: %s"
@@ -1022,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"
@@ -1047,9 +1077,6 @@ msgstr "Alarm erstellen"
msgid "In: %s"
msgstr "In: %s"
msgid "Note properties"
msgstr "Notiz-Eigenschaften"
msgid "Hyperlink"
msgstr "Weblink"
@@ -1126,6 +1153,14 @@ msgstr "Synchronisieren"
msgid "Notebooks"
msgstr "Notizbücher"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Entschlüsselte Objekte: %d/%d"
#, javascript-format
msgid "Fetching resources: %d"
msgstr "Ressourcen abrufen: %d"
msgid "Please select where the sync status should be exported to"
msgstr ""
"Bitte wähle aus, wohin der Synchronisations-Status exportiert werden soll"
@@ -1171,6 +1206,9 @@ msgstr ""
"Kann Token nicht erneuern: Authentifikationsdaten nicht vorhanden. Ein "
"Neustart der Synchronisation könnte das Problem beheben."
msgid "Untitled"
msgstr "Unbenannt"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1218,10 +1256,6 @@ msgstr "Remote-Objekte gelöscht: %d."
msgid "Fetched items: %d/%d."
msgstr "Geladene Objekte: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Status: %s."
msgid "Cancelling..."
msgstr "Breche ab…"
@@ -1264,14 +1298,11 @@ msgid "title"
msgstr "Titel"
msgid "updated date"
msgstr "Aktualsierungsdatum"
msgstr "Aktualisierungsdatum"
msgid "created date"
msgstr "Erstelldatum"
msgid "Untitled"
msgstr "Unbenannt"
msgid "This note does not have geolocation information."
msgstr "Diese Notiz hat keine Standort-Informationen."
@@ -1334,14 +1365,26 @@ msgstr "Zeige Tray-Icon"
msgid "Note: Does not work in all desktop environments."
msgstr "Hinweis: Funktioniert nicht in allen Desktopumgebungen."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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"
msgid "Global zoom percentage"
msgstr "Zoomstufe der Benutzeroberfläche"
msgid "Editor font size"
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 "
@@ -1354,6 +1397,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"
@@ -1470,6 +1520,9 @@ msgstr "Joplin Export Verzeichnis"
msgid "Evernote Export File"
msgstr "Evernote Export Datei"
msgid "Json Export Directory"
msgstr "Json Export Verzeichnis"
msgid "Directory"
msgstr "Verzeichnis"
@@ -1545,6 +1598,12 @@ msgstr "Anstehende Alarme"
msgid "On %s: %s"
msgstr "Auf %s: %s"
msgid "Permission to use camera"
msgstr "Berechtigung zur Verwendung der Kamera"
msgid "Your permission to use your camera is required."
msgstr "Deine Zustimmung zur Verwendung deiner Kamera ist erforderlich."
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
"Momentan existieren noch keine Notizen. Erstelle eine, indem du auf den (+) "
@@ -1590,10 +1649,6 @@ msgstr "Bestätigen"
msgid "Cancel synchronisation"
msgstr "Synchronisation abbrechen"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Entschlüsselte Objekte: %d/%d"
msgid "Checking... Please wait."
msgstr "Überprüfe… Bitte warten."
@@ -1660,9 +1715,25 @@ 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"
#, fuzzy
msgid "Enter code here"
msgstr "Hier Code eingeben"
#, javascript-format
msgid "Master Key %s"
msgstr "Hauptschlüssel %s"
@@ -1715,6 +1786,9 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Nicht unterstütztes Fotoformat: %s"
msgid "Take photo"
msgstr "Foto aufnehmen"
msgid "Attach photo"
msgstr "Foto anhängen"
@@ -1739,6 +1813,9 @@ msgstr "Metadaten anzeigen"
msgid "View on map"
msgstr "Auf der Karte anzeigen"
msgid "Go to source URL"
msgstr "Zur Quell-URL gehen"
msgid "Delete notebook"
msgstr "Notizbuch löschen"
@@ -1764,6 +1841,9 @@ msgstr ""
msgid "Welcome"
msgstr "Willkommen"
#~ msgid "State: %s."
#~ msgstr "Status: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Ein Notizbuch mit diesem Titel existiert bereits : \"%s\""
@@ -1804,9 +1884,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"

View File

@@ -408,6 +408,9 @@ msgstr ""
msgid "Starting synchronisation..."
msgstr ""
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr ""
@@ -570,6 +573,9 @@ msgstr ""
msgid "Search in all the notes"
msgstr ""
msgid "Search in current note"
msgstr ""
msgid "View"
msgstr ""
@@ -629,9 +635,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 ""
@@ -874,6 +892,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr ""
@@ -890,6 +911,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr ""
@@ -900,6 +924,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -925,9 +952,6 @@ msgstr ""
msgid "In: %s"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1004,6 +1028,14 @@ msgstr ""
msgid "Notebooks"
msgstr ""
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr ""
#, javascript-format
msgid "Fetching resources: %d"
msgstr ""
msgid "Please select where the sync status should be exported to"
msgstr ""
@@ -1046,6 +1078,9 @@ msgid ""
"synchronisation again may fix the problem."
msgstr ""
msgid "Untitled"
msgstr ""
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1087,10 +1122,6 @@ msgstr ""
msgid "Fetched items: %d/%d."
msgstr ""
#, javascript-format
msgid "State: %s."
msgstr ""
msgid "Cancelling..."
msgstr ""
@@ -1137,9 +1168,6 @@ msgstr ""
msgid "created date"
msgstr ""
msgid "Untitled"
msgstr ""
msgid "This note does not have geolocation information."
msgstr ""
@@ -1202,12 +1230,21 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr ""
msgid "Editor font size"
msgstr ""
msgid "Editor font family"
msgstr ""
@@ -1219,6 +1256,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 ""
@@ -1319,6 +1363,9 @@ msgstr ""
msgid "Evernote Export File"
msgstr ""
msgid "Json Export Directory"
msgstr ""
msgid "Directory"
msgstr ""
@@ -1388,6 +1435,12 @@ msgstr ""
msgid "On %s: %s"
msgstr ""
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
@@ -1431,10 +1484,6 @@ msgstr ""
msgid "Cancel synchronisation"
msgstr ""
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr ""
msgid "Checking... Please wait."
msgstr ""
@@ -1487,9 +1536,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 ""
@@ -1541,6 +1605,9 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr ""
msgid "Take photo"
msgstr ""
msgid "Attach photo"
msgstr ""
@@ -1565,6 +1632,9 @@ msgstr ""
msgid "View on map"
msgstr ""
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr ""

View File

@@ -457,6 +457,9 @@ msgstr "No se puede inicializar sincronizador."
msgid "Starting synchronisation..."
msgstr "Iniciando sincronización..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Cancelando... Por favor espere."
@@ -648,6 +651,10 @@ msgstr "Editar con un editor externo"
msgid "Search in all the notes"
msgstr "Buscar en todas las notas"
#, fuzzy
msgid "Search in current note"
msgstr "Buscar en todas las notas"
msgid "View"
msgstr "Ver"
@@ -707,9 +714,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í"
@@ -977,6 +996,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Abrir..."
@@ -993,6 +1015,9 @@ msgstr "Copiar la ruta en el portapapeles"
msgid "Copy Link Address"
msgstr "Copiar enlace"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Enlace o mensaje no soportado: %s"
@@ -1005,6 +1030,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"
@@ -1030,9 +1058,6 @@ msgstr "Establecer alarma"
msgid "In: %s"
msgstr "En: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Hipervínculo"
@@ -1109,6 +1134,14 @@ msgstr "Sincronizar"
msgid "Notebooks"
msgstr "Libretas"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Descifrando elementos: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Recursos: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Seleccione a dónde se debería exportar el estado de sincronización"
@@ -1153,6 +1186,9 @@ msgstr ""
"No se ha podido actualizar token: faltan datos de autenticación. Reiniciar "
"la sincronización podría solucionar el problema."
msgid "Untitled"
msgstr "Sin título"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1200,10 +1236,6 @@ msgstr "Elementos remotos borrados: %d."
msgid "Fetched items: %d/%d."
msgstr "Elementos obtenidos: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Estado: «%s»."
msgid "Cancelling..."
msgstr "Cancelando..."
@@ -1251,9 +1283,6 @@ msgstr "fecha de actualización"
msgid "created date"
msgstr "fecha de creación"
msgid "Untitled"
msgstr "Sin título"
msgid "This note does not have geolocation information."
msgstr "Esta nota no tiene informacion de geolocalización."
@@ -1316,12 +1345,22 @@ msgstr "Mostrar icono en la bandeja"
msgid "Note: Does not work in all desktop environments."
msgstr "Nota: No funciona en todos los entornos de escritorio."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Establecer el porcentaje de aumento de la aplicación"
#, fuzzy
msgid "Editor font size"
msgstr "Fuente del editor"
msgid "Editor font family"
msgstr "Fuente del editor"
@@ -1336,6 +1375,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"
@@ -1449,6 +1495,10 @@ msgstr "Directorio para exportar de Joplin"
msgid "Evernote Export File"
msgstr "Archivo exportado de Evernote"
#, fuzzy
msgid "Json Export Directory"
msgstr "Directorio para exportar de Joplin"
msgid "Directory"
msgstr "Directorio"
@@ -1523,6 +1573,12 @@ msgstr "Alarmas próximas"
msgid "On %s: %s"
msgstr "En %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "No hay notas. Cree una pulsando en el botón (+)."
@@ -1567,10 +1623,6 @@ msgstr "Confirmar"
msgid "Cancel synchronisation"
msgstr "Cancelar sincronización"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Descifrando elementos: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Cancelando... Por favor espere."
@@ -1633,9 +1685,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"
@@ -1688,6 +1756,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Tipo de imagen no soportado: %s"
#, fuzzy
msgid "Take photo"
msgstr "Adjuntar foto"
msgid "Attach photo"
msgstr "Adjuntar foto"
@@ -1712,6 +1784,9 @@ msgstr "Mostrar metadatos"
msgid "View on map"
msgstr "Ver en un mapa"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Borrar libreta"
@@ -1735,6 +1810,9 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenido"
#~ msgid "State: %s."
#~ msgstr "Estado: «%s»."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Ya existe una libreta con este nombre: «%s»"
@@ -1782,9 +1860,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"

View File

@@ -455,6 +455,9 @@ msgstr "Ezin has daiteke sinkronizazio prozesua."
msgid "Starting synchronisation..."
msgstr "Sinkronizazioa hasten..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Bertan behera uzten... itxaron, mesedez."
@@ -647,6 +650,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Bilatu ohar guztietan"
#, fuzzy
msgid "Search in current note"
msgstr "Bilatu ohar guztietan"
msgid "View"
msgstr ""
@@ -707,9 +714,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 ""
@@ -973,6 +992,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr ""
@@ -990,6 +1012,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Esteka edo mezu ez dago onartua: %s"
@@ -1000,6 +1025,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1025,9 +1053,6 @@ msgstr "Ezarri alarma"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1109,6 +1134,14 @@ msgstr "Sinkronizatu"
msgid "Notebooks"
msgstr "Koadernoak"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Itemak eskuratuta: %d%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Baliabideak: %d."
#, fuzzy
msgid "Please select where the sync status should be exported to"
msgstr "Aukeratu nora esportatu sinkronizazioaren egoera, mesedez"
@@ -1156,6 +1189,9 @@ msgstr ""
"Tokena ezin eguneratu daiteke: egiaztatze-datuak desagertuta daude. Agian, "
"berriro sinkronizatzeak arazoa konpon lezake."
msgid "Untitled"
msgstr "Titulu gabekoa"
#, fuzzy
msgid ""
"Could not synchronize with OneDrive.\n"
@@ -1202,10 +1238,6 @@ msgstr "Urruneko itemak ezabatuta: %d."
msgid "Fetched items: %d/%d."
msgstr "Itemak eskuratuta: %d%d."
#, fuzzy, javascript-format
msgid "State: %s."
msgstr "Egoera: \"%s\"."
msgid "Cancelling..."
msgstr "Bertan behera uzten..."
@@ -1257,9 +1289,6 @@ msgstr "Eguneratuta: %d."
msgid "created date"
msgstr "Sortuta: %d."
msgid "Untitled"
msgstr "Titulu gabekoa"
msgid "This note does not have geolocation information."
msgstr "Ohar honek ez du geokokapen informaziorik."
@@ -1327,6 +1356,12 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
@@ -1334,6 +1369,10 @@ msgstr ""
msgid "Global zoom percentage"
msgstr "Ezarri aplikazioaren zoomaren ehunekoa"
#, fuzzy
msgid "Editor font size"
msgstr "Oharra editatu."
msgid "Editor font family"
msgstr ""
@@ -1345,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"
@@ -1458,6 +1504,10 @@ msgstr ""
msgid "Evernote Export File"
msgstr "Evernotetik esportatutako fitxategiak"
#, fuzzy
msgid "Json Export Directory"
msgstr "Evernotetik esportatutako fitxategiak"
msgid "Directory"
msgstr ""
@@ -1530,6 +1580,12 @@ msgstr "Hurrengo alarmak"
msgid "On %s: %s"
msgstr "On %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Ez dago oharrik. Sortu bat (+) botoian klik eginaz."
@@ -1575,10 +1631,6 @@ msgstr "Baieztatu"
msgid "Cancel synchronisation"
msgstr "Sinkronizazioa utzi"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Itemak eskuratuta: %d%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Bertan behera uzten... itxaron, mesedez."
@@ -1634,10 +1686,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"
@@ -1689,6 +1757,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Irudi formatua ez onartua: %s"
#, fuzzy
msgid "Take photo"
msgstr "Argazkia erantsi"
msgid "Attach photo"
msgstr "Argazkia erantsi"
@@ -1713,6 +1785,9 @@ msgstr "Erakutsi metadatuak"
msgid "View on map"
msgstr "Ikusi mapan"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Ezabatu koadernoa"
@@ -1735,6 +1810,10 @@ msgstr "Oraindik ez duzu koadernorik. Sortu bat (+) botoian sakatuta."
msgid "Welcome"
msgstr "Ongi etorri!"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Egoera: \"%s\"."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Dagoeneko bada koaderno bat izen horrekin: \"%s\""
@@ -1773,9 +1852,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"

View File

@@ -458,6 +458,9 @@ msgstr "Impossible d'initialiser la synchronisation."
msgid "Starting synchronisation..."
msgstr "Commencement de la synchronisation..."
msgid "Downloading resources..."
msgstr "Téléchargement des ressources..."
msgid "Cancelling... Please wait."
msgstr "Annulation... Veuillez attendre."
@@ -645,6 +648,9 @@ msgstr "Ouvrir dans un éditeur externe"
msgid "Search in all the notes"
msgstr "Chercher dans toutes les notes"
msgid "Search in current note"
msgstr "Chercher dans la note en cours"
msgid "View"
msgstr "Affichage"
@@ -704,10 +710,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"
@@ -981,6 +999,9 @@ msgstr "Lieu"
msgid "URL"
msgstr "URL"
msgid "Note properties"
msgstr "Propriétés de la note"
msgid "Open..."
msgstr "Ouvrir..."
@@ -997,6 +1018,9 @@ msgstr "Copier le chemin"
msgid "Copy Link Address"
msgstr "Copier l'adresse du lien"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr "Cette pièce jointe n'est pas téléchargée ou pas encore déchiffrée"
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Lien ou message non géré : %s"
@@ -1009,6 +1033,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"
@@ -1034,9 +1063,6 @@ msgstr "Régler alarme"
msgid "In: %s"
msgstr "Dans : %s"
msgid "Note properties"
msgstr "Propriétés de la note"
msgid "Hyperlink"
msgstr "Lien"
@@ -1113,6 +1139,14 @@ msgstr "Synchroniser"
msgid "Notebooks"
msgstr "Carnets"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Déchiffrement des objets : %d/%d"
#, javascript-format
msgid "Fetching resources: %d"
msgstr "Tél. ressources : %d"
msgid "Please select where the sync status should be exported to"
msgstr ""
"Veuillez sélectionner un répertoire ou exporter l'état de la synchronisation"
@@ -1158,6 +1192,9 @@ msgstr ""
"Impossible de rafraîchir la connexion à OneDrive. Démarrez la "
"synchronisation à nouveau pour corriger le problème."
msgid "Untitled"
msgstr "Sans titre"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1205,10 +1242,6 @@ msgstr "Objets distants supprimés : %d."
msgid "Fetched items: %d/%d."
msgstr "Téléchargés : %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "État : %s."
msgid "Cancelling..."
msgstr "Annulation..."
@@ -1255,9 +1288,6 @@ msgstr "date de modification"
msgid "created date"
msgstr "date de création"
msgid "Untitled"
msgstr "Sans titre"
msgid "This note does not have geolocation information."
msgstr "Cette note n'a pas d'information d'emplacement."
@@ -1320,12 +1350,24 @@ msgstr "Afficher l'icône dans la zone de notifications"
msgid "Note: Does not work in all desktop environments."
msgstr "Note : Ne fonctionne pas dans tous les environnements de bureau."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"this setting so that your notes are constantly being synchronised, thus "
"reducing the number of conflicts."
msgstr ""
"Cela permettra à Joplin de s'exécuter en arrière-plan. Il est recommandé "
"d'activer ce réglage pour que vos notes soient constamment synchronisées, "
"donc réduire le nombre de conflits."
msgid "Start application minimised in the tray icon"
msgstr "Démarrer minimisé dans la zone de notification"
msgid "Global zoom percentage"
msgstr "Niveau de zoom"
msgid "Editor font size"
msgstr "Taille police éditeur"
msgid "Editor font family"
msgstr "Police de l'éditeur"
@@ -1340,6 +1382,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"
@@ -1455,6 +1504,9 @@ msgstr "Dossier d'export Joplin"
msgid "Evernote Export File"
msgstr "Fichiers d'export Evernote"
msgid "Json Export Directory"
msgstr "Dossier d'export JSON"
msgid "Directory"
msgstr "Dossier"
@@ -1529,6 +1581,12 @@ msgstr "Alarmes à venir"
msgid "On %s: %s"
msgstr "Le %s : %s"
msgid "Permission to use camera"
msgstr "Permission d'utiliser l'appareil photo"
msgid "Your permission to use your camera is required."
msgstr "Votre permission est requise pour utiliser l'appareil photo"
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
"Ce carnet ne contient aucune note. Créez-en une en appuyant sur le bouton "
@@ -1574,10 +1632,6 @@ msgstr "Confirmer"
msgid "Cancel synchronisation"
msgstr "Annuler synchronisation"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Déchiffrement des objets : %d/%d"
msgid "Checking... Please wait."
msgstr "Vérification... Veuillez attendre."
@@ -1643,9 +1697,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"
@@ -1698,6 +1767,9 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Type d'image non géré : %s"
msgid "Take photo"
msgstr "Prendre une photo"
msgid "Attach photo"
msgstr "Attacher une photo"
@@ -1722,6 +1794,9 @@ msgstr "Voir métadonnées"
msgid "View on map"
msgstr "Voir sur carte"
msgid "Go to source URL"
msgstr "Aller à l'URL source"
msgid "Delete notebook"
msgstr "Supprimer le carnet"
@@ -1746,6 +1821,9 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenue"
#~ msgid "State: %s."
#~ msgstr "État : %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Un carnet avec ce titre existe déjà : \"%s\""
@@ -1793,9 +1871,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

@@ -452,6 +452,9 @@ msgstr "Non é posíbel iniciar o sincronizador."
msgid "Starting synchronisation..."
msgstr "Iniciando sincronización..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Cancelando... Agarde."
@@ -639,6 +642,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Buscar en todas as notas"
#, fuzzy
msgid "Search in current note"
msgstr "Buscar en todas as notas"
msgid "View"
msgstr "Vista"
@@ -698,9 +705,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"
@@ -961,6 +980,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Abrir…"
@@ -977,6 +999,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Ligazón ou mensaxe incompatíbeis: %s"
@@ -989,6 +1014,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 ""
@@ -1014,9 +1042,6 @@ msgstr "Estabelecer alarma"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1095,6 +1120,14 @@ msgstr "Sincronizar"
msgid "Notebooks"
msgstr "Cadernos"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Elementos obtidos: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Recursos: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Seleccione onde exportar o estado da sincronización"
@@ -1139,6 +1172,9 @@ msgstr ""
"Non é posíbel actualizar o «token»: faltan datos da autenticación. Iniciar a "
"sincronización de novo pode arranxar o problema."
msgid "Untitled"
msgstr "Sen título"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1186,10 +1222,6 @@ msgstr "Elementos remotos borrados: %d."
msgid "Fetched items: %d/%d."
msgstr "Elementos obtidos: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Estado: %s."
msgid "Cancelling..."
msgstr "Cancelando..."
@@ -1240,9 +1272,6 @@ msgstr "Actualizado: %d."
msgid "created date"
msgstr "Creado: %d."
msgid "Untitled"
msgstr "Sen título"
msgid "This note does not have geolocation information."
msgstr "Esta nota non ten información de xeolocalización."
@@ -1306,12 +1335,22 @@ msgstr "Mostrar a icona na bandexa"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Porcentaxe de ampliación"
#, fuzzy
msgid "Editor font size"
msgstr "Familia de tipos de letra do editor"
msgid "Editor font family"
msgstr "Familia de tipos de letra do editor"
@@ -1326,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"
@@ -1434,6 +1480,10 @@ msgstr "Cartafol de exportación do Joplin"
msgid "Evernote Export File"
msgstr "Ficheiro de exportación de Evernote"
#, fuzzy
msgid "Json Export Directory"
msgstr "Cartafol de exportación do Joplin"
msgid "Directory"
msgstr "Cartafol"
@@ -1508,6 +1558,12 @@ msgstr "Alarmas próximas"
msgid "On %s: %s"
msgstr "En %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Non ten notas actualmente. Cree unha premendo no botón (+)."
@@ -1553,10 +1609,6 @@ msgstr "Confirmar"
msgid "Cancel synchronisation"
msgstr "Cancelar sincronización"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Elementos obtidos: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Cancelando... Agarde."
@@ -1612,10 +1664,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"
@@ -1667,6 +1734,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Tipo de imaxe incompatíbel: %s"
#, fuzzy
msgid "Take photo"
msgstr "Anexar foto"
msgid "Attach photo"
msgstr "Anexar foto"
@@ -1691,6 +1762,9 @@ msgstr "Mostrar metadatos"
msgid "View on map"
msgstr "Ver no mapa"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Eliminar caderno"
@@ -1713,5 +1787,8 @@ msgstr "Non ten cadernos actualmente. Cree un premendo no botón (+)."
msgid "Welcome"
msgstr "Benvido/a"
#~ msgid "State: %s."
#~ msgstr "Estado: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Xa existe un caderno con ese título: «%s»"

View File

@@ -455,6 +455,9 @@ msgstr "Ne mogu započeti sinkronizaciju."
msgid "Starting synchronisation..."
msgstr "Započinjem sinkronizaciju..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Prekidam... Pričekaj."
@@ -644,6 +647,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Pretraži u svim bilješkama"
#, fuzzy
msgid "Search in current note"
msgstr "Pretraži u svim bilješkama"
msgid "View"
msgstr ""
@@ -705,9 +712,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 ""
@@ -960,6 +979,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr ""
@@ -977,6 +999,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Nepodržana poveznica ili poruka: %s"
@@ -987,6 +1012,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1012,9 +1040,6 @@ msgstr "Postavi upozorenje"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1095,6 +1120,14 @@ msgstr "Sinkroniziraj"
msgid "Notebooks"
msgstr "Bilježnice"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Stvorene lokalne stavke: %d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Resursi: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Odaberi lokaciju za izvoz statusa sinkronizacije"
@@ -1137,6 +1170,9 @@ msgid ""
"synchronisation again may fix the problem."
msgstr "Nedostaju podaci za ovjeru. Pokušaj ponovo započeti sinkronizaciju."
msgid "Untitled"
msgstr "Nenaslovljen"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1184,10 +1220,6 @@ msgstr "Obrisane udaljene stavke: %d."
msgid "Fetched items: %d/%d."
msgstr "Stvorene lokalne stavke: %d."
#, fuzzy, javascript-format
msgid "State: %s."
msgstr "Stanje: \"%s\"."
msgid "Cancelling..."
msgstr "Prekidam..."
@@ -1239,9 +1271,6 @@ msgstr "Ažurirano: %d."
msgid "created date"
msgstr "Stvoreno: %d."
msgid "Untitled"
msgstr "Nenaslovljen"
msgid "This note does not have geolocation information."
msgstr "Ova bilješka nema geolokacijske informacije."
@@ -1310,12 +1339,22 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr ""
#, fuzzy
msgid "Editor font size"
msgstr "Uredi bilješku."
msgid "Editor font family"
msgstr ""
@@ -1327,6 +1366,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"
@@ -1435,6 +1481,10 @@ msgstr ""
msgid "Evernote Export File"
msgstr "Evernote izvozne datoteke"
#, fuzzy
msgid "Json Export Directory"
msgstr "Evernote izvozne datoteke"
msgid "Directory"
msgstr ""
@@ -1505,6 +1555,12 @@ msgstr "Nadolazeća upozorenja"
msgid "On %s: %s"
msgstr "On %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Trenutno nema bilješki. Stvori novu klikom na (+) gumb."
@@ -1550,10 +1606,6 @@ msgstr "Potvrdi"
msgid "Cancel synchronisation"
msgstr "Prekini sinkronizaciju"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Stvorene lokalne stavke: %d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Prekidam... Pričekaj."
@@ -1609,10 +1661,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 ""
@@ -1665,6 +1733,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Nepodržana vrsta slike: %s"
#, fuzzy
msgid "Take photo"
msgstr "Priloži sliku"
msgid "Attach photo"
msgstr "Priloži sliku"
@@ -1689,6 +1761,9 @@ msgstr "Prikaži metapodatke"
msgid "View on map"
msgstr "Vidi na karti"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Obriši bilježnicu"
@@ -1711,6 +1786,10 @@ msgstr "Trenutno nemaš nijednu bilježnicu. Stvori novu klikom na (+) gumb."
msgid "Welcome"
msgstr "Dobro došli"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Stanje: \"%s\"."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Bilježnica s ovim naslovom već postoji: \"%s\""
@@ -1748,9 +1827,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"

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."
@@ -461,6 +461,9 @@ msgstr "Non è possibile inizializzare il sincronizzatore."
msgid "Starting synchronisation..."
msgstr "Inizio sincronizzazione..."
msgid "Downloading resources..."
msgstr "Scaricamento risorse…"
msgid "Cancelling... Please wait."
msgstr "Cancellazione... Attendere per favore."
@@ -563,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 "
@@ -626,9 +636,8 @@ msgstr "Taglia"
msgid "Paste"
msgstr "Incolla"
#, fuzzy
msgid "Select all"
msgstr "Seleziona la data"
msgstr "Seleziona tutto"
msgid "Bold"
msgstr "Grasseto"
@@ -645,6 +654,9 @@ msgstr "Modifica in un editor esterno"
msgid "Search in all the notes"
msgstr "Cerca in tutte le note"
msgid "Search in current note"
msgstr "Cerca nella nota corrente"
msgid "View"
msgstr "Vista"
@@ -704,9 +716,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ì"
@@ -945,13 +969,11 @@ 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"
msgstr "Converti in nota"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
msgstr "Converti in \"Cose-da-fare\""
msgid "Copy Markdown link"
msgstr "Copia il link Markdown"
@@ -977,6 +999,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Apri ..."
@@ -993,6 +1018,9 @@ msgstr "Copia il percorso negli appunti"
msgid "Copy Link Address"
msgstr "Copia l'indirizzo del link"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr "Questo allegato non è ancora stato scaricato o decriptato."
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Link o Messaggio non supportato: %s"
@@ -1005,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"
@@ -1030,9 +1061,6 @@ msgstr "Imposta Allarme"
msgid "In: %s"
msgstr "In: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Collegamento ipertestuale"
@@ -1110,6 +1138,14 @@ msgstr "Sincronizza"
msgid "Notebooks"
msgstr "Taccuini"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Decrittografia Elementi: %d/%d"
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Risorse: %d."
msgid "Please select where the sync status should be exported to"
msgstr ""
@@ -1154,6 +1190,9 @@ msgstr ""
"Non è possibile aggiornare il token. mancano i dati di autenticazione. "
"Ricominciare la sincronizzazione da capo potrebbe risolvere il problema."
msgid "Untitled"
msgstr "Senza titolo"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1201,10 +1240,6 @@ msgstr "Elementi remoti eliminati: %d."
msgid "Fetched items: %d/%d."
msgstr "Elementi recuperati: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Stato: %s."
msgid "Cancelling..."
msgstr "Cancellazione..."
@@ -1251,9 +1286,6 @@ msgstr "Data di aggiornamento"
msgid "created date"
msgstr "Data di creazione"
msgid "Untitled"
msgstr "Senza titolo"
msgid "This note does not have geolocation information."
msgstr "Questa nota non ha informazione sulla geolocalizzazione."
@@ -1302,10 +1334,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:"
@@ -1316,14 +1348,26 @@ msgstr "Visualizza tray icon"
msgid "Note: Does not work in all desktop environments."
msgstr "Nota: non funziona in tutti gli ambienti desktop."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Percentuale di zoom globale"
msgid "Editor font size"
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 "
@@ -1336,6 +1380,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"
@@ -1430,14 +1481,14 @@ 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."
#, 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"
@@ -1448,6 +1499,9 @@ msgstr "Cartella di esportazione di Joplin"
msgid "Evernote Export File"
msgstr "Esporta files di Evernote"
msgid "Json Export Directory"
msgstr "Cartella di esportazione JSON"
msgid "Directory"
msgstr "Cartella"
@@ -1522,6 +1576,12 @@ msgstr "Avviso imminente"
msgid "On %s: %s"
msgstr "Su %s: %s"
msgid "Permission to use camera"
msgstr "Permesso di usare la fotocamera"
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Al momento non ci sono note. Creane una cliccando sul bottone (+)."
@@ -1566,10 +1626,6 @@ msgstr "Conferma"
msgid "Cancel synchronisation"
msgstr "Cancella la sincronizzazione"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Decrittografia Elementi: %d/%d"
#, fuzzy
msgid "Checking... Please wait."
msgstr "Cancellazione... Attendere per favore."
@@ -1631,11 +1687,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"
@@ -1688,6 +1759,9 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Tipo di immagine non supportata: %s"
msgid "Take photo"
msgstr "Scatta foto"
msgid "Attach photo"
msgstr "Allega foto"
@@ -1712,6 +1786,9 @@ msgstr "Mostra i metadati"
msgid "View on map"
msgstr "Guarda sulla mappa"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Cancella Taccuino"
@@ -1735,6 +1812,9 @@ msgstr ""
msgid "Welcome"
msgstr "Benvenuto"
#~ msgid "State: %s."
#~ msgstr "Stato: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Esiste già un Taccuino col titolo \"%s\""
@@ -1789,9 +1869,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"

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 "
@@ -445,6 +445,9 @@ msgstr "同期プロセスを初期化できませんでした。"
msgid "Starting synchronisation..."
msgstr "同期を開始中..."
msgid "Downloading resources..."
msgstr "リソースをダウンロード中..."
msgid "Cancelling... Please wait."
msgstr "中止中...お待ちください。"
@@ -615,9 +618,8 @@ msgstr "切り取り"
msgid "Paste"
msgstr "貼り付け"
#, fuzzy
msgid "Select all"
msgstr "日付の選択"
msgstr "すべて選択"
msgid "Bold"
msgstr "太字"
@@ -634,6 +636,9 @@ msgstr "外部エディターで編集"
msgid "Search in all the notes"
msgstr "すべてのノートを検索"
msgid "Search in current note"
msgstr "現在のノートを検索"
msgid "View"
msgstr "表示"
@@ -693,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 "Yes"
@@ -703,7 +720,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クリッパーサービスは有効で、自動起動します。"
@@ -753,20 +770,21 @@ 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 ""
"この認証トークンはサードパーティアプリケーションがJoplinにアクセスするためだ"
"けに必要です。"
msgid "Check synchronisation configuration"
msgstr "同期の設定を確認する"
@@ -931,13 +949,11 @@ msgstr "%s - コピー"
msgid "Switch between note and to-do type"
msgstr "ノートとToDoを切り替え"
#, fuzzy
msgid "Switch to note type"
msgstr "ノートとToDoを切り替え"
msgstr "ノート切り替え"
#, fuzzy
msgid "Switch to to-do type"
msgstr "ノートとToDo切り替え"
msgstr "ToDo切り替え"
msgid "Copy Markdown link"
msgstr "Markdownのリンクをコピー"
@@ -956,10 +972,13 @@ msgid ""
msgstr "ノートブックがありません。新しいノートブックを作成してください。"
msgid "Location"
msgstr ""
msgstr "場所"
msgid "URL"
msgstr ""
msgstr "URL"
msgid "Note properties"
msgstr "ノートのプロパティ"
msgid "Open..."
msgstr "開く..."
@@ -977,6 +996,9 @@ msgstr "クリップボードにパスを保存"
msgid "Copy Link Address"
msgstr "リンクアドレスをコピー"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr "この添付ファイルはダウンロードできないか、まだ復号できません。"
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "次のリンクまたはメッセージはサポートしていません: %s"
@@ -989,6 +1011,9 @@ msgstr ""
"このノートには中身がありません。 \"%s\" をクリックしてエディターを表示し、"
"ノートを編集してください。"
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "文字を太字に"
@@ -1002,7 +1027,7 @@ msgid "Insert Hyperlink"
msgstr "ハイパーリンクの挿入"
msgid "Attach file"
msgstr "ファイルを添付"
msgstr "ファイルを添付する"
msgid "Tags"
msgstr "タグ"
@@ -1014,9 +1039,6 @@ msgstr "アラームをセット"
msgid "In: %s"
msgstr "内: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "ハイパーリンク"
@@ -1093,6 +1115,14 @@ msgstr "同期"
msgid "Notebooks"
msgstr "ノートブック"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "復号中のアイテム: %d/%d"
#, javascript-format
msgid "Fetching resources: %d"
msgstr "取得中のリソース: %d"
msgid "Please select where the sync status should be exported to"
msgstr "同期状況の出力先を選択してください"
@@ -1137,6 +1167,9 @@ msgstr ""
"トークンの更新ができませんでした。認証データがありません。同期を再度行うこと"
"で解決することがあります。"
msgid "Untitled"
msgstr "名称未設定"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1184,10 +1217,6 @@ msgstr "リモートアイテムの削除: %d."
msgid "Fetched items: %d/%d."
msgstr "取得したアイテム: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "状態: \"%s\"."
msgid "Cancelling..."
msgstr "中止中..."
@@ -1236,9 +1265,6 @@ msgstr "アップデート日"
msgid "created date"
msgstr "作成日"
msgid "Untitled"
msgstr "名称未設定"
msgid "This note does not have geolocation information."
msgstr "このノートには位置情報がありません。"
@@ -1301,12 +1327,23 @@ msgstr "トレイアイコンの表示"
msgid "Note: Does not work in all desktop environments."
msgstr "注意: すべてのデスクトップ環境で動作するわけではありません。"
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 "アプリケーションをトレイアンコンで最小化して起動"
msgid "Global zoom percentage"
msgstr "全体ズームの割合"
msgid "Editor font size"
msgstr "エディターのフォントサイズ"
msgid "Editor font family"
msgstr "エディターのフォントファミリー"
@@ -1318,7 +1355,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 "同期間隔"
@@ -1433,6 +1477,9 @@ msgstr "Joplin エクスポートディレクトリ"
msgid "Evernote Export File"
msgstr "Evernote エクスポートファイル"
msgid "Json Export Directory"
msgstr "Json エクスポートディレクトリ"
msgid "Directory"
msgstr "ディレクトリ"
@@ -1507,6 +1554,12 @@ msgstr "直近のアラーム"
msgid "On %s: %s"
msgstr "日時 %s: %s"
msgid "Permission to use camera"
msgstr "カメラ使用の許可"
msgid "Your permission to use your camera is required."
msgstr "カメラを使用するには権限が必要です。"
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "ノートがありません。(+)ボタンを押して新しいノートを作成してください。"
@@ -1535,9 +1588,8 @@ msgstr "%d個のノートを\"%s\"に移動しますか?"
msgid "Press to set the decryption password."
msgstr "復号するパスワードを入力してください。"
#, fuzzy
msgid "Clear alarm"
msgstr "アラームをセット"
msgstr "アラームをクリア"
msgid "Save alarm"
msgstr "アラームの保存"
@@ -1551,26 +1603,21 @@ msgstr "確認"
msgid "Cancel synchronisation"
msgstr "同期の中止"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "復号中のアイテム: %d/%d"
#, 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 ""
@@ -1580,10 +1627,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 "新しいタグ:"
@@ -1614,9 +1666,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"
@@ -1668,6 +1736,9 @@ msgstr "Joplinモバイルアプリは次のタイプのリンクをまだサポ
msgid "Unsupported image type: %s"
msgstr "サポートされていない画像の形式: %s"
msgid "Take photo"
msgstr "写真を撮影する"
msgid "Attach photo"
msgstr "写真を添付"
@@ -1692,6 +1763,9 @@ msgstr "メタデータを表示"
msgid "View on map"
msgstr "地図上に表示"
msgid "Go to source URL"
msgstr "ソースURLに行く"
msgid "Delete notebook"
msgstr "ノートブックを削除"
@@ -1716,6 +1790,9 @@ msgstr ""
msgid "Welcome"
msgstr "ようこそ"
#~ msgid "State: %s."
#~ msgstr "状態: \"%s\"."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "次の名前のノートブックはすでに存在しています: \"%s\""
@@ -1753,9 +1830,6 @@ msgstr "ようこそ"
#~ msgid "Give focus to previous pane"
#~ msgstr "前のペインへ"
#~ msgid "Enter command line mode"
#~ msgstr "コマンドラインモードに入る"
#~ msgid "Exit command line mode"
#~ msgstr "コマンドラインモードの終了"

View File

@@ -408,6 +408,9 @@ msgstr ""
msgid "Starting synchronisation..."
msgstr ""
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr ""
@@ -570,6 +573,9 @@ msgstr ""
msgid "Search in all the notes"
msgstr ""
msgid "Search in current note"
msgstr ""
msgid "View"
msgstr ""
@@ -629,9 +635,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 ""
@@ -874,6 +892,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr ""
@@ -890,6 +911,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr ""
@@ -900,6 +924,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -925,9 +952,6 @@ msgstr ""
msgid "In: %s"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1004,6 +1028,14 @@ msgstr ""
msgid "Notebooks"
msgstr ""
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr ""
#, javascript-format
msgid "Fetching resources: %d"
msgstr ""
msgid "Please select where the sync status should be exported to"
msgstr ""
@@ -1046,6 +1078,9 @@ msgid ""
"synchronisation again may fix the problem."
msgstr ""
msgid "Untitled"
msgstr ""
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1087,10 +1122,6 @@ msgstr ""
msgid "Fetched items: %d/%d."
msgstr ""
#, javascript-format
msgid "State: %s."
msgstr ""
msgid "Cancelling..."
msgstr ""
@@ -1137,9 +1168,6 @@ msgstr ""
msgid "created date"
msgstr ""
msgid "Untitled"
msgstr ""
msgid "This note does not have geolocation information."
msgstr ""
@@ -1202,12 +1230,21 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr ""
msgid "Editor font size"
msgstr ""
msgid "Editor font family"
msgstr ""
@@ -1219,6 +1256,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 ""
@@ -1319,6 +1363,9 @@ msgstr ""
msgid "Evernote Export File"
msgstr ""
msgid "Json Export Directory"
msgstr ""
msgid "Directory"
msgstr ""
@@ -1388,6 +1435,12 @@ msgstr ""
msgid "On %s: %s"
msgstr ""
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
@@ -1431,10 +1484,6 @@ msgstr ""
msgid "Cancel synchronisation"
msgstr ""
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr ""
msgid "Checking... Please wait."
msgstr ""
@@ -1487,9 +1536,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 ""
@@ -1541,6 +1605,9 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr ""
msgid "Take photo"
msgstr ""
msgid "Attach photo"
msgstr ""
@@ -1565,6 +1632,9 @@ msgstr ""
msgid "View on map"
msgstr ""
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr ""

View File

@@ -446,6 +446,9 @@ msgstr "동기화를 시작할 수 없습니다."
msgid "Starting synchronisation..."
msgstr "동기화를 시작합니다..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "취소하는 중입니다... 잠시만 기다리세요."
@@ -631,6 +634,10 @@ msgstr "외부 편집기에서 편집하기"
msgid "Search in all the notes"
msgstr "모든 노트에서 검색"
#, fuzzy
msgid "Search in current note"
msgstr "모든 노트에서 검색"
msgid "View"
msgstr "보기"
@@ -690,9 +697,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 "예"
@@ -955,6 +974,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "열기..."
@@ -971,6 +993,9 @@ msgstr "경로를 클립보드에 복사"
msgid "Copy Link Address"
msgstr "링크 주소 복사"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "지원하지 않는 링크 또는 메세지: %s"
@@ -983,6 +1008,9 @@ msgstr ""
"비어있는 노트입니다. \"%s\" 항목을 선택해서 편집기를 전환하고 노트를 편집하세"
"요."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "중요 텍스트"
@@ -1008,9 +1036,6 @@ msgstr "알람 설정"
msgid "In: %s"
msgstr "내부: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "하이퍼링크"
@@ -1087,6 +1112,14 @@ msgstr "동기화"
msgid "Notebooks"
msgstr "노트북"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "복호화 항목: %d/%d"
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "리소스: %d."
msgid "Please select where the sync status should be exported to"
msgstr "동기화 상태를 내보낼 대상을 선택하세요"
@@ -1131,6 +1164,9 @@ msgstr ""
"토큰 새로고침 불가: 인증 데이터를 찾을 수 없습니다. 동기화를 다시 시도하면 문"
"제가 해결될수도 있습니다."
msgid "Untitled"
msgstr "제목 없음"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1178,10 +1214,6 @@ msgstr "원격 항목 삭제됨: %d."
msgid "Fetched items: %d/%d."
msgstr "가져온 항목: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "상태: %s."
msgid "Cancelling..."
msgstr "취소하는 중..."
@@ -1228,9 +1260,6 @@ msgstr "업데이트된 날짜"
msgid "created date"
msgstr "만들어진 날짜"
msgid "Untitled"
msgstr "제목 없음"
msgid "This note does not have geolocation information."
msgstr "이 노트는 지리적 위치 정보를 포함하고 있지 않습니다."
@@ -1293,12 +1322,22 @@ msgstr "트레이 아이콘 표시"
msgid "Note: Does not work in all desktop environments."
msgstr "참고사항: 모든 데스크탑 환경에서 작동하는 것은 아닙니다."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "전체적 확대 비율"
#, fuzzy
msgid "Editor font size"
msgstr "편집기 글꼴 집합"
msgid "Editor font family"
msgstr "편집기 글꼴 집합"
@@ -1313,6 +1352,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 "동기화 간격"
@@ -1423,6 +1469,10 @@ msgstr "조플린 내보내기 폴더"
msgid "Evernote Export File"
msgstr "에버노트 내보내기 파일"
#, fuzzy
msgid "Json Export Directory"
msgstr "조플린 내보내기 폴더"
msgid "Directory"
msgstr "폴더"
@@ -1497,6 +1547,12 @@ msgstr "다가오는 예정된 알람"
msgid "On %s: %s"
msgstr "%s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "노트가 없습니다. (+) 버튼을 선택해 새로 만드세요."
@@ -1541,10 +1597,6 @@ msgstr "확인"
msgid "Cancel synchronisation"
msgstr "동기화 취소"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "복호화 항목: %d/%d"
#, fuzzy
msgid "Checking... Please wait."
msgstr "취소하는 중입니다... 잠시만 기다리세요."
@@ -1604,9 +1656,24 @@ msgstr "- 위치: 지리적 위치 정보를 노트에 첨부하기 위해서
msgid "Joplin website"
msgstr "조플린 웹사이트"
#, fuzzy, javascript-format
msgid "Joplin v%s"
msgstr "조플린 웹사이트"
#, 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"
@@ -1658,6 +1725,10 @@ msgstr "조플린 모바일 앱은 현재 해당 형식의 링크를 지원하
msgid "Unsupported image type: %s"
msgstr "지원하지 않는 이미지 형식: %s"
#, fuzzy
msgid "Take photo"
msgstr "사진 첨부"
msgid "Attach photo"
msgstr "사진 첨부"
@@ -1682,6 +1753,9 @@ msgstr "메타데이터 표시"
msgid "View on map"
msgstr "지도에 표시"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "노트북 삭제"
@@ -1704,5 +1778,8 @@ msgstr "노트북이 없습니다. (+) 버튼을 눌러 새로 만드세요."
msgid "Welcome"
msgstr "환영합니다"
#~ msgid "State: %s."
#~ msgstr "상태: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "같은 제목의 노트북이 이미 있습니다: \"%s\""

File diff suppressed because it is too large Load Diff

View File

@@ -456,6 +456,9 @@ msgstr "Kan de synchronisatie niet starten."
msgid "Starting synchronisation..."
msgstr "Synchronisatie starten..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Annuleren.. Even geduld."
@@ -649,6 +652,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Zoek in alle notities"
#, fuzzy
msgid "Search in current note"
msgstr "Zoek in alle notities"
msgid "View"
msgstr ""
@@ -709,9 +716,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 ""
@@ -977,6 +996,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr ""
@@ -994,6 +1016,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Link of bericht \"%s\" wordt niet ondersteund"
@@ -1004,6 +1029,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1029,9 +1057,6 @@ msgstr "Zet melding"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1112,6 +1137,14 @@ msgstr "Synchroniseer"
msgid "Notebooks"
msgstr "Notitieboeken"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Opgehaalde items: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Middelen: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Selecteer waar de synchronisatie status naar geëxporteerd moet worden"
@@ -1157,6 +1190,9 @@ msgstr ""
"Kan token niet vernieuwen: authenticatiedata ontbreekt. Herstarten van de "
"synchronisatie kan het probleem eventueel oplossen. "
msgid "Untitled"
msgstr "Untitled"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1204,10 +1240,6 @@ msgstr "Verwijderde remote items: %d."
msgid "Fetched items: %d/%d."
msgstr "Opgehaalde items: %d/%d."
#, fuzzy, javascript-format
msgid "State: %s."
msgstr "Status: \"%s\""
msgid "Cancelling..."
msgstr "Annuleren..."
@@ -1260,9 +1292,6 @@ msgstr "Bijgewerkt: %d."
msgid "created date"
msgstr "Aangemaakt: %d."
msgid "Untitled"
msgstr "Untitled"
msgid "This note does not have geolocation information."
msgstr "Deze notitie bevat geen geo-locatie informatie."
@@ -1330,12 +1359,22 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr ""
#, fuzzy
msgid "Editor font size"
msgstr "Bewerk notitie."
msgid "Editor font family"
msgstr ""
@@ -1347,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"
@@ -1458,6 +1504,10 @@ msgstr ""
msgid "Evernote Export File"
msgstr "Exporteer Evernote bestanden"
#, fuzzy
msgid "Json Export Directory"
msgstr "Exporteer Evernote bestanden"
msgid "Directory"
msgstr ""
@@ -1531,6 +1581,12 @@ msgstr "Meldingen"
msgid "On %s: %s"
msgstr "Op %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
"Er zijn momenteel geen notities. Maak een notitie door op (+) te klikken."
@@ -1577,10 +1633,6 @@ msgstr "Bevestig"
msgid "Cancel synchronisation"
msgstr "Annuleer synchronisatie"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Opgehaalde items: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Annuleren.. Even geduld."
@@ -1636,10 +1688,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"
@@ -1691,6 +1759,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Afbeeldingstype %s wordt niet ondersteund"
#, fuzzy
msgid "Take photo"
msgstr "Voeg foto toe"
msgid "Attach photo"
msgstr "Voeg foto toe"
@@ -1715,6 +1787,9 @@ msgstr "Toon metadata"
msgid "View on map"
msgstr "Toon op de kaart"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Verwijder notitieboek"
@@ -1739,6 +1814,10 @@ msgstr ""
msgid "Welcome"
msgstr "Welkom"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Status: \"%s\""
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Er bestaat al een notitieboek met \"%s\" als titel"
@@ -1777,9 +1856,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"

View File

@@ -457,6 +457,9 @@ msgstr "De synchronisatie kan niet worden geïnitaliseerd."
msgid "Starting synchronisation..."
msgstr "Bezig met starten van synchronisatie..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Bezig met annuleren... Even geduld."
@@ -648,6 +651,10 @@ msgstr "Bewerken in externe bewerker"
msgid "Search in all the notes"
msgstr "Alle notities doorzoeken"
#, fuzzy
msgid "Search in current note"
msgstr "Alle notities doorzoeken"
msgid "View"
msgstr "Beeld"
@@ -707,9 +714,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"
@@ -983,6 +1002,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Openen..."
@@ -999,6 +1021,9 @@ msgstr "Pad kopiëren naar klembord"
msgid "Copy Link Address"
msgstr "Linkadres kopiëren"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Niet-ondersteunde link of bericht: %s"
@@ -1011,6 +1036,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"
@@ -1036,9 +1064,6 @@ msgstr "Alarm instellen"
msgid "In: %s"
msgstr "In: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Hyperlink"
@@ -1115,6 +1140,14 @@ msgstr "Synchroniseren"
msgid "Notebooks"
msgstr "Notitieboeken"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Bezig met ontsleutelen van items: %d/%d"
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Bronnen: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Kies waar de synchronisatiestatus naar moet worden geëxporteerd"
@@ -1159,6 +1192,9 @@ msgstr ""
"Kan toegangssleutel niet verversen: de authenticatiegegevens ontbreken. "
"Probeer om de synchronisatie opnieuw te starten."
msgid "Untitled"
msgstr "Naamloos"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1206,10 +1242,6 @@ msgstr "Externe items verwijderd: %d."
msgid "Fetched items: %d/%d."
msgstr "Items opgehaald: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Status: %s."
msgid "Cancelling..."
msgstr "Bezig met annuleren..."
@@ -1256,9 +1288,6 @@ msgstr "bijgewerkt op"
msgid "created date"
msgstr "gecreëerd op"
msgid "Untitled"
msgstr "Naamloos"
msgid "This note does not have geolocation information."
msgstr "Deze notitie bevat geen locatie-informatie."
@@ -1321,12 +1350,22 @@ msgstr "Systeemvakpictogram tonen"
msgid "Note: Does not work in all desktop environments."
msgstr "Let op: dit werkt niet in alle werkomgevingen."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Globaal zoompercentage"
#, fuzzy
msgid "Editor font size"
msgstr "Lettertype van bewerker"
msgid "Editor font family"
msgstr "Lettertype van bewerker"
@@ -1341,6 +1380,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"
@@ -1454,6 +1500,10 @@ msgstr "Joplin-exportmap"
msgid "Evernote Export File"
msgstr "Evernote-exportbestand"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin-exportmap"
msgid "Directory"
msgstr "Map"
@@ -1530,6 +1580,12 @@ msgstr "Aankomende alarmen"
msgid "On %s: %s"
msgstr "Op %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
"Er zijn momenteel geen notities. Creëer een notitie door te drukken op de "
@@ -1576,10 +1632,6 @@ msgstr "Bevestigen"
msgid "Cancel synchronisation"
msgstr "Synchronisatie annuleren"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Bezig met ontsleutelen van items: %d/%d"
#, fuzzy
msgid "Checking... Please wait."
msgstr "Bezig met annuleren... Even geduld."
@@ -1640,9 +1692,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"
@@ -1694,6 +1761,10 @@ msgstr "De mobiele Joplin-app ondersteunt momenteel niet dit soort links: %s"
msgid "Unsupported image type: %s"
msgstr "Niet-ondersteunde afbeeldingssoort: %s"
#, fuzzy
msgid "Take photo"
msgstr "Foto bijvoegen"
msgid "Attach photo"
msgstr "Foto bijvoegen"
@@ -1718,6 +1789,9 @@ msgstr "Metagegevens tonen"
msgid "View on map"
msgstr "Tonen op kaart"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Notitieboek verwijderen"
@@ -1742,5 +1816,8 @@ msgstr ""
msgid "Welcome"
msgstr "Welkom"
#~ msgid "State: %s."
#~ msgstr "Status: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Er bestaat al een notitieboek met deze titel: \"%s\""

View File

@@ -1,7 +1,8 @@
# SOME DESCRIPTIVE TITLE.
# pt_BR locale strings - Joplin.
# Copyright (C) YEAR Laurent Cozic
# This file is distributed under the same license as the Joplin-CLI package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# Updated by Renato Xavier da Silveira Rosa <renatoxsr@gmail.com>, 2018.
#
msgid ""
msgstr ""
@@ -147,7 +148,7 @@ msgid "Completed decryption."
msgstr "Decriptação completada."
msgid "Enabled"
msgstr "Desabilitado"
msgstr "Habilitado"
msgid "Disabled"
msgstr "Desabilitado"
@@ -454,10 +455,12 @@ msgstr "Não é possível inicializar o sincronizador."
msgid "Starting synchronisation..."
msgstr "Iniciando sincronização..."
msgid "Downloading resources..."
msgstr "Baixando os recursos..."
msgid "Cancelling... Please wait."
msgstr "Cancelando... Aguarde."
#, 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 "
@@ -465,7 +468,8 @@ msgid ""
msgstr ""
"<tag-command> pode ser \"add\", \"remove\" ou \"list\" para atribuir ou "
"remover [tag] de [nota], ou para listar as notas associadas a [tag]. O "
"comando `taglist` pode ser usado para listar todas as tags."
"comando `tag list` pode ser usado para listar todas as tags (use -l para "
"opção longa)."
#, javascript-format
msgid "Invalid command: \"%s\""
@@ -625,9 +629,8 @@ msgstr "Cortar"
msgid "Paste"
msgstr "Colar"
#, fuzzy
msgid "Select all"
msgstr "Selecionar data"
msgstr "Selecionar tudo"
msgid "Bold"
msgstr "Negrito"
@@ -644,6 +647,9 @@ msgstr "Editar com editor externo"
msgid "Search in all the notes"
msgstr "Pesquisar em todas as notas"
msgid "Search in current note"
msgstr "Pesquisar na nota atual"
msgid "View"
msgstr "Visualizar"
@@ -703,9 +709,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"
@@ -713,7 +731,7 @@ msgid "No"
msgstr "Não"
msgid "Token has been copied to the clipboard!"
msgstr ""
msgstr "Token foi copiado para a \\u00e1rea de transfer\\u00eancia!"
msgid "The web clipper service is enabled and set to auto-start."
msgstr ""
@@ -725,7 +743,7 @@ msgstr "Status: Iniciado, na porta %d"
#, javascript-format
msgid "Status: %s"
msgstr "Status: \"%s\"."
msgstr "Status: %s"
msgid "Disable Web Clipper Service"
msgstr "Desabilitar serviço Web Clipper"
@@ -764,20 +782,21 @@ msgstr "Passo 2: Instalar a extensão"
msgid "Download and install the relevant extension for your browser:"
msgstr "Baixe e instale a extensão relevante para seu browser:"
#, fuzzy
msgid "Advanced options"
msgstr "Mostrar opções avançadas"
msgid "Authorisation token:"
msgstr ""
msgstr "Token de autoriza\\u00e7\\u00e3o:"
msgid "Copy token"
msgstr ""
msgstr "Copira token"
msgid ""
"This authorisation token is only needed to allow third-party applications to "
"access Joplin."
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"
@@ -943,13 +962,11 @@ msgstr "%s - Copiar"
msgid "Switch between note and to-do type"
msgstr "Alternar entre os tipos Nota e Tarefa"
#, fuzzy
msgid "Switch to note type"
msgstr "Alternar entre os tipos Nota e Tarefa"
msgstr "Alternar para o tipo Nota"
#, fuzzy
msgid "Switch to to-do type"
msgstr "Alternar entre os tipos Nota e Tarefa"
msgstr "Alternar para o tipo Tarefa"
msgid "Copy Markdown link"
msgstr "Copiar link de Markdown"
@@ -968,10 +985,13 @@ msgid ""
msgstr "Atualmente, não há cadernos. Crie um, clicando em \"Novo caderno\"."
msgid "Location"
msgstr ""
msgstr "Localização"
msgid "URL"
msgstr ""
msgstr "URL"
msgid "Note properties"
msgstr "Propriedades da nota"
msgid "Open..."
msgstr "Abrir..."
@@ -989,6 +1009,9 @@ msgstr "Copiar caminho para a área de transferência"
msgid "Copy Link Address"
msgstr "Copiar endereço do link"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr "O anexo ainda não foi baixado ou decriptado."
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Link ou mensagem não suportada: %s"
@@ -1001,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"
@@ -1026,9 +1052,6 @@ msgstr "Definir alarme"
msgid "In: %s"
msgstr "Em: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Hiperlink"
@@ -1054,7 +1077,7 @@ msgid "Click to stop external editing"
msgstr "Clique para encerrar edição externa"
msgid "Watching..."
msgstr "Verificando..."
msgstr "Observando alterações..."
msgid "to-do"
msgstr "tarefa"
@@ -1105,6 +1128,14 @@ msgstr "Sincronizar"
msgid "Notebooks"
msgstr "Cadernos"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Decriptando itens: %d/%d"
#, javascript-format
msgid "Fetching resources: %d"
msgstr "Buscando recursos: %d"
msgid "Please select where the sync status should be exported to"
msgstr ""
"Favor selecionar o local para onde o status de sincronia deveria ser "
@@ -1151,6 +1182,9 @@ msgstr ""
"Não é possível atualizar token: faltam dados de autenticação. Iniciar a "
"sincronização novamente pode corrigir o problema."
msgid "Untitled"
msgstr "Sem título"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1198,10 +1232,6 @@ msgstr "Itens remotos excluídos: %d."
msgid "Fetched items: %d/%d."
msgstr "Itens pesquisados: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Estado: \"%s\"."
msgid "Cancelling..."
msgstr "Cancelando..."
@@ -1244,14 +1274,11 @@ 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"
msgid "Untitled"
msgstr "Sem título"
msgid "This note does not have geolocation information."
msgstr "Esta nota não possui informações de geolocalização."
@@ -1291,7 +1318,7 @@ msgid "Sort notes by"
msgstr "Ordenar notas por"
msgid "Reverse sort order"
msgstr "Inverter ordem de classificação."
msgstr "Inverter ordem de classificação"
msgid "Save geo-location with notes"
msgstr "Salvar geolocalização com notas"
@@ -1312,14 +1339,26 @@ msgid "Show tray icon"
msgstr "Exibir tray icon"
msgid "Note: Does not work in all desktop environments."
msgstr "Nota: não funciona em todos os ambientes de desktop"
msgstr "Nota: não funciona em todos os ambientes de desktop."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"this setting so that your notes are constantly being synchronised, thus "
"reducing the number of conflicts."
msgstr ""
"Isso irá permitir que o Joplin continue sendo executado em segundo plano. É "
"recomendado que você habilita essa configuração para que suas notas "
"sejamconstantemente sincronizadas, de modo a reduzir as chances de conflitos."
msgid "Start application minimised in the tray icon"
msgstr ""
msgstr "Iniciar aplicativo minimizado na barra de tarefas"
msgid "Global zoom percentage"
msgstr "Porcentagem global do zoom"
msgid "Editor font size"
msgstr "Tamanho da fonte no Editor"
msgid "Editor font family"
msgstr "Família de fontes do editor"
@@ -1333,6 +1372,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"
@@ -1391,6 +1437,9 @@ msgid ""
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
"Atenção: Se você modificar esse local, tenha certeza de copiar todo o seu "
"conteúdo para lá antes de sincronizar, do contrário todos os seus arquivos "
"serão removidos! Veja o FAQ para mais detalhes: %s"
msgid "Nextcloud username"
msgstr "Usuário da Nextcloud"
@@ -1420,7 +1469,7 @@ msgstr ""
"os certificados, ou caminhos para arquivos cert. Por exemplo, /my/cert_dir, /"
"other/custom.pem. Note que se você fizer mudanças nas configurações de TLS, "
"você tem que salvar as mudanças antes de clicar em \"Verificar a "
"configuração da sincronização\""
"configuração da sincronização\"."
msgid "Ignore TLS certificate errors"
msgstr "Ignorar erros de certificados TLS"
@@ -1431,7 +1480,7 @@ msgstr "Valor da opção inválida: \"%s\". Os valores possíveis são: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgstr "A tag \"%s\" já existe. Escolha um nome diferente."
msgid "Joplin Export File"
msgstr "Arquivo de Exportação do Joplin"
@@ -1445,8 +1494,11 @@ msgstr "Diretório de Exportação do Joplin"
msgid "Evernote Export File"
msgstr "Arquivo de Exportação do Evernote"
msgid "Json Export Directory"
msgstr "Diretório de Exportação JSON"
msgid "Directory"
msgstr "DIretório"
msgstr "Diretório"
#, javascript-format
msgid "Cannot load \"%s\" module for format \"%s\""
@@ -1520,6 +1572,12 @@ msgstr "Próximos alarmes"
msgid "On %s: %s"
msgstr "Em %s: %s"
msgid "Permission to use camera"
msgstr "Permissão para utilizar sua c\\u00e2mera"
msgid "Your permission to use your camera is required."
msgstr "É necessária a sua permissão para utilizar sua c\\u00e2mera."
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Atualmente, não há notas. Crie uma, clicando no botão (+)."
@@ -1548,9 +1606,8 @@ msgstr "Mover %d notas para o caderno \"%s\"?"
msgid "Press to set the decryption password."
msgstr "Pressione para configurar a senha de decriptação."
#, fuzzy
msgid "Clear alarm"
msgstr "Definir alarme"
msgstr "Limpar alarme"
msgid "Save alarm"
msgstr "Salvar alarme"
@@ -1564,26 +1621,22 @@ msgstr "Confirmar"
msgid "Cancel synchronisation"
msgstr "Cancelar sincronização"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Decriptando itens: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Cancelando... Aguarde."
msgstr "Verificando... Por favor aguarde."
#, fuzzy
msgid "Success! Synchronisation configuration appears to be correct."
msgstr "Verificar a configuração da sincronização"
msgstr "Sucesso! A configuração da sincronização parece estar correta."
msgid ""
"Error. Please check that URL, username, password, etc. are correct and that "
"the sync target is accessible. The reported error was:"
msgstr ""
"Erro. Verifique se a URL, nome de usuário, senha, etc., estão corretos e "
"tenha certeza que o destino da sincronização está acessível. O erro "
"reportado foi:"
#, fuzzy
msgid "The application has been authorised!"
msgstr "O aplicativo foi autorizado com sucesso."
msgstr "O aplicativo foi autorizado!"
#, javascript-format
msgid ""
@@ -1593,10 +1646,15 @@ msgid ""
"\n"
"Please try again."
msgstr ""
"Não foi possível autorizar o aplicativo:\n"
"\n"
"%s\n"
"\n"
"Por favor tente novamente."
#, fuzzy, javascript-format
#, javascript-format
msgid "Decrypted items: %s / %s"
msgstr "Decriptando itens: %d/%d."
msgstr "Itens decriptados: %s / %s"
msgid "New tags:"
msgstr "Novas tags:"
@@ -1616,8 +1674,8 @@ msgid ""
"- Storage: to allow attaching files to notes and to enable filesystem "
"synchronisation."
msgstr ""
"- Armazenamento: para permitir anexar arquivos a notas, e para permitir a "
"sincronização do sistema de arquivos "
"- Armazenamento: para permitir anexar arquivos a notas e para permitir a "
"sincronização do sistema de arquivos."
msgid "- Camera: to allow taking a picture and attaching it to a note."
msgstr "- Câmera: para permitir tirar fotos e anexar a uma nota."
@@ -1630,9 +1688,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"
@@ -1684,6 +1758,9 @@ 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"
msgid "Take photo"
msgstr "Tirar foto"
msgid "Attach photo"
msgstr "Anexar foto"
@@ -1708,6 +1785,9 @@ msgstr "Exibir metadados"
msgid "View on map"
msgstr "Ver no mapa"
msgid "Go to source URL"
msgstr "Ir para a URL de origem"
msgid "Delete notebook"
msgstr "Excluir caderno"
@@ -1730,6 +1810,9 @@ msgstr "Você não possui cadernos. Crie um clicando no botão (+)."
msgid "Welcome"
msgstr "Bem-vindo"
#~ msgid "State: %s."
#~ msgstr "Estado: \"%s\"."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Já existe caderno com este título: \"%s\""
@@ -1770,9 +1853,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

@@ -414,6 +414,9 @@ msgstr "Nu se poate inițializa sincronizatorul."
msgid "Starting synchronisation..."
msgstr "Se începe sincronizarea..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Se anulează... Vă rugăm să așteptați."
@@ -584,6 +587,10 @@ msgstr "Editați într-un editor extern"
msgid "Search in all the notes"
msgstr "Căutați în toate notițele"
#, fuzzy
msgid "Search in current note"
msgstr "Căutați în toate notițele"
msgid "View"
msgstr "Vizualizați"
@@ -643,9 +650,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"
@@ -891,6 +910,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Deschideți..."
@@ -907,6 +929,9 @@ msgstr "Copiați locația în clipboard"
msgid "Copy Link Address"
msgstr "Copați adresa link-ului"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr ""
@@ -917,6 +942,9 @@ msgid ""
"note."
msgstr ""
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -942,9 +970,6 @@ msgstr "Setați alarma"
msgid "In: %s"
msgstr "În: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Hyperlink"
@@ -1021,6 +1046,14 @@ msgstr "Sincronizați"
msgid "Notebooks"
msgstr "Caiete de notițe"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Se decriptează itemi: %d/%d"
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Resurse: %d."
msgid "Please select where the sync status should be exported to"
msgstr ""
@@ -1063,6 +1096,9 @@ msgid ""
"synchronisation again may fix the problem."
msgstr ""
msgid "Untitled"
msgstr "Fără denumire"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1104,10 +1140,6 @@ msgstr ""
msgid "Fetched items: %d/%d."
msgstr ""
#, javascript-format
msgid "State: %s."
msgstr "Statut: %s."
msgid "Cancelling..."
msgstr "Se amână..."
@@ -1154,9 +1186,6 @@ msgstr "data actualizării"
msgid "created date"
msgstr "data creării"
msgid "Untitled"
msgstr "Fără denumire"
msgid "This note does not have geolocation information."
msgstr ""
@@ -1219,12 +1248,22 @@ msgstr "Afișați iconița coșul de gunoi"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr ""
#, fuzzy
msgid "Editor font size"
msgstr "Editează notiță."
msgid "Editor font family"
msgstr ""
@@ -1236,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"
@@ -1336,6 +1382,9 @@ msgstr ""
msgid "Evernote Export File"
msgstr ""
msgid "Json Export Directory"
msgstr ""
msgid "Directory"
msgstr ""
@@ -1405,6 +1454,12 @@ msgstr "Alarmele următoare"
msgid "On %s: %s"
msgstr "Pe %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
@@ -1449,10 +1504,6 @@ msgstr "Confirmați"
msgid "Cancel synchronisation"
msgstr "Amânați sincronizarea"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Se decriptează itemi: %d/%d"
#, fuzzy
msgid "Checking... Please wait."
msgstr "Se anulează... Vă rugăm să așteptați."
@@ -1506,9 +1557,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 ""
@@ -1560,6 +1626,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr ""
#, fuzzy
msgid "Take photo"
msgstr "Atașează imagine"
msgid "Attach photo"
msgstr "Atașează imagine"
@@ -1584,6 +1654,9 @@ msgstr "Afișați metadatele"
msgid "View on map"
msgstr "Vizualizați pe hartă"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Ștergeți caiet de notițe"
@@ -1607,5 +1680,8 @@ msgstr ""
msgid "Welcome"
msgstr "Bine ați venit"
#~ msgid "State: %s."
#~ msgstr "Statut: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Un caiet de notițe cu acest titlu există deja: \"%s\""

View File

@@ -456,6 +456,9 @@ msgstr "Не удалось инициировать синхронизацию.
msgid "Starting synchronisation..."
msgstr "Начало синхронизации..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Отмена... Пожалуйста, ожидайте."
@@ -646,11 +649,15 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Поиск во всех заметках"
#, fuzzy
msgid "Search in current note"
msgstr "Поиск во всех заметках"
msgid "View"
msgstr "Вид"
msgid "Toggle sidebar"
msgstr ""
msgstr "Переключить панель"
msgid "Toggle editor layout"
msgstr "Переключить вид редактора"
@@ -662,7 +669,7 @@ msgid "Synchronisation status"
msgstr "Статус синхронизации"
msgid "Web clipper options"
msgstr ""
msgstr "Настройки веб-клиппера"
msgid "Encryption options"
msgstr "Настройки шифрования"
@@ -705,9 +712,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 "Да"
@@ -718,7 +737,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"
@@ -729,13 +748,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 "
@@ -746,7 +765,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 "
@@ -755,20 +774,20 @@ 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 "
@@ -783,10 +802,10 @@ msgid "Notes and settings are stored in: %s"
msgstr "Заметки и настройки сохранены в: %s"
msgid "Apply"
msgstr ""
msgstr "Применить"
msgid "Submit"
msgstr ""
msgstr "Отправить"
msgid "Save"
msgstr "Сохранить"
@@ -971,6 +990,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Открыть..."
@@ -987,6 +1009,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Неподдерживаемая ссыка или сообщение: %s"
@@ -999,6 +1024,9 @@ msgstr ""
"Заметка пуста. Нажмите на «%s», чтобы переключиться в редактор и "
"отредактировать её."
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr ""
@@ -1024,9 +1052,6 @@ msgstr "Установить напоминание"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1105,6 +1130,14 @@ msgstr "Синхронизировать"
msgid "Notebooks"
msgstr "Блокноты"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Получено элементов: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Ресурсов: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Выберите, куда должен быть экспортирован статус синхронизации"
@@ -1149,6 +1182,9 @@ msgstr ""
"Не удалось обновить токен: отсутствуют данные аутентификации. Повторный "
"запуск синхронизации может решить проблему."
msgid "Untitled"
msgstr "Без имени"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1196,10 +1232,6 @@ msgstr "Удалено удалённых элементов: %d."
msgid "Fetched items: %d/%d."
msgstr "Получено элементов: %d/%d."
#, fuzzy, javascript-format
msgid "State: %s."
msgstr "Статус: «%s»."
msgid "Cancelling..."
msgstr "Отмена..."
@@ -1250,9 +1282,6 @@ msgstr "Обновлено: %d."
msgid "created date"
msgstr "Создано: %d."
msgid "Untitled"
msgstr "Без имени"
msgid "This note does not have geolocation information."
msgstr "Эта заметка не содержит информации о геолокации."
@@ -1316,12 +1345,22 @@ msgstr "Показывать иконку в панели задач"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Глобальный масштаб в процентах"
#, fuzzy
msgid "Editor font size"
msgstr "Семейство шрифтов редактора"
msgid "Editor font family"
msgstr "Семейство шрифтов редактора"
@@ -1336,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 "Интервал синхронизации"
@@ -1444,6 +1490,10 @@ msgstr "Папка экспорта Joplin"
msgid "Evernote Export File"
msgstr "Файл экспорта Evernote"
#, fuzzy
msgid "Json Export Directory"
msgstr "Папка экспорта Joplin"
msgid "Directory"
msgstr "Директория"
@@ -1519,6 +1569,12 @@ msgstr "Грядущие напоминания"
msgid "On %s: %s"
msgstr "В %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Сейчас здесь нет заметок. Создаёте новую, нажав кнопку (+)."
@@ -1564,10 +1620,6 @@ msgstr "Подтвердить"
msgid "Cancel synchronisation"
msgstr "Отменить синхронизацию"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Получено элементов: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "Отмена... Пожалуйста, ожидайте."
@@ -1623,10 +1675,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"
@@ -1678,6 +1746,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Неподдерживаемый формат изображения: %s"
#, fuzzy
msgid "Take photo"
msgstr "Прикрепить фото"
msgid "Attach photo"
msgstr "Прикрепить фото"
@@ -1702,6 +1774,9 @@ msgstr "Показать метаданные"
msgid "View on map"
msgstr "Посмотреть на карте"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Удалить блокнот"
@@ -1724,6 +1799,10 @@ msgstr "У вас сейчас нет блокнота. Создайте его
msgid "Welcome"
msgstr "Добро пожаловать"
#, fuzzy
#~ msgid "State: %s."
#~ msgstr "Статус: «%s»."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Блокнот с таким названием уже существует: «%s»"
@@ -1761,9 +1840,6 @@ msgstr "Добро пожаловать"
#~ msgid "Give focus to previous pane"
#~ msgstr "Переключиться на предыдущую панель"
#~ msgid "Enter command line mode"
#~ msgstr "Войти в режим командной строки"
#~ msgid "Exit command line mode"
#~ msgstr "Выйти из режима командной строки"

View File

@@ -455,6 +455,9 @@ msgstr "Ni moč zagnati sinhronizatorja."
msgid "Starting synchronisation..."
msgstr "Sinhronizacija se začenja."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "V preklicu...Prosim počakajte."
@@ -645,6 +648,10 @@ msgstr ""
msgid "Search in all the notes"
msgstr "Išči znotraj vseh zabeležk"
#, fuzzy
msgid "Search in current note"
msgstr "Išči znotraj vseh zabeležk"
msgid "View"
msgstr "Pogled"
@@ -704,9 +711,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"
@@ -975,6 +994,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Odpri..."
@@ -991,6 +1013,9 @@ msgstr ""
msgid "Copy Link Address"
msgstr ""
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Nepodprta povezava ali sporočilo: %s"
@@ -1003,6 +1028,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 ""
@@ -1028,9 +1056,6 @@ msgstr "Nastavi alarm"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1109,6 +1134,14 @@ msgstr "Sinhroniziraj"
msgid "Notebooks"
msgstr "Beležnice"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Preneseni predmeti: %d/%d."
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Viri: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Prosim izberite, kam želite izvoziti sinhronizacijski status"
@@ -1153,6 +1186,9 @@ msgstr ""
"Ne gre osvežiti tokena: manjkajo podatki o avtentikaciji. Ponovno zaženite "
"sinhronizacijo, da morda popravite težavo."
msgid "Untitled"
msgstr "Neimenovano"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1200,10 +1236,6 @@ msgstr "Izbrisani oddaljeni predmeti: %d."
msgid "Fetched items: %d/%d."
msgstr "Preneseni predmeti: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Stanje: %s."
msgid "Cancelling..."
msgstr "V preklicu..."
@@ -1254,9 +1286,6 @@ msgstr "Posodobljeno: %d."
msgid "created date"
msgstr "Ustvarjeno: %d."
msgid "Untitled"
msgstr "Neimenovano"
msgid "This note does not have geolocation information."
msgstr "Ta zabeležke nima geografske lokacije."
@@ -1320,12 +1349,22 @@ msgstr "Pokaži ikono v območju za obvestila(opravilna vrstica)"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Celokupen procent povečave"
#, fuzzy
msgid "Editor font size"
msgstr "Družina urejevalnika besedilnega stila"
msgid "Editor font family"
msgstr "Družina urejevalnika besedilnega stila"
@@ -1340,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"
@@ -1448,6 +1494,10 @@ msgstr "Joplin izvozno mesto"
msgid "Evernote Export File"
msgstr "Evernote izvozna datoteka"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin izvozno mesto"
msgid "Directory"
msgstr "Mesto datoteke"
@@ -1522,6 +1572,12 @@ msgstr "Prihajajoči alarmi"
msgid "On %s: %s"
msgstr "Vključeno %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "Trenutno ni zabeležk. Ustvarite jo s klikom na (+) gumb."
@@ -1567,10 +1623,6 @@ msgstr "Potrdi"
msgid "Cancel synchronisation"
msgstr "Prekliči sinhronizacijo"
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Preneseni predmeti: %d/%d."
#, fuzzy
msgid "Checking... Please wait."
msgstr "V preklicu...Prosim počakajte."
@@ -1626,10 +1678,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"
@@ -1681,6 +1748,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Nepodprt tip slike: %s"
#, fuzzy
msgid "Take photo"
msgstr "Pripni fotografijo"
msgid "Attach photo"
msgstr "Pripni fotografijo"
@@ -1705,6 +1776,9 @@ msgstr "Prikaži meta podatke"
msgid "View on map"
msgstr "Prikaži na zemljevidu"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Izbriši beležnico"
@@ -1727,6 +1801,9 @@ msgstr "Trenutno nimate nobene beležnice. Ustvarite jo s klikom na (+) gumb."
msgid "Welcome"
msgstr "Dobrodošli"
#~ msgid "State: %s."
#~ msgstr "Stanje: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Beležnica s tem naslovom že obstaja: \"%s\""

View File

@@ -461,6 +461,9 @@ msgstr "Kan inte initiera synkroniseraren."
msgid "Starting synchronisation..."
msgstr "Startar synkronisering..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "Avbryter... vänta."
@@ -652,6 +655,10 @@ msgstr "Redigera i extern redigerare"
msgid "Search in all the notes"
msgstr "Sök i alla anteckningarna"
#, fuzzy
msgid "Search in current note"
msgstr "Sök i alla anteckningarna"
msgid "View"
msgstr "Visa"
@@ -711,9 +718,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"
@@ -984,6 +1003,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "Öppna..."
@@ -1000,6 +1022,9 @@ msgstr "Kopiera sökväg till urklipp"
msgid "Copy Link Address"
msgstr "Kopiera länkadress"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "Länk eller meddelande stöds inte: %s"
@@ -1012,6 +1037,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"
@@ -1037,9 +1065,6 @@ msgstr "Sätt alarm"
msgid "In: %s"
msgstr "I: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Hyperlänk"
@@ -1116,6 +1141,14 @@ msgstr "Synkronisera"
msgid "Notebooks"
msgstr "Anteckningsböcker"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Dekrypterar objekt: %d/%d"
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "Resurser: %d."
msgid "Please select where the sync status should be exported to"
msgstr "Välj vart synkroniseringstillståndet ska exporteras till"
@@ -1160,6 +1193,9 @@ msgstr ""
"Kan inte uppdatera token: autentiseringsdata saknas. Om du startar "
"synkroniseringen igen kan det lösa problemet."
msgid "Untitled"
msgstr "Utan titel"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1207,10 +1243,6 @@ msgstr "Borttagna fjärrobjekt: %d."
msgid "Fetched items: %d/%d."
msgstr "Hämtade objekt: %d/%d."
#, javascript-format
msgid "State: %s."
msgstr "Tillstånd: %s."
msgid "Cancelling..."
msgstr "Avbryter..."
@@ -1258,9 +1290,6 @@ msgstr "uppdaterad datum"
msgid "created date"
msgstr "Skapad datum"
msgid "Untitled"
msgstr "Utan titel"
msgid "This note does not have geolocation information."
msgstr "Denna anteckning har inte geolokaliseringsinformation."
@@ -1323,12 +1352,22 @@ msgstr "Visa fältikon"
msgid "Note: Does not work in all desktop environments."
msgstr "Obs: Fungerar inte i alla skrivbordsmiljöer."
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "Global zoomprocent"
#, fuzzy
msgid "Editor font size"
msgstr "Redigerarens typsnittsfamilj"
msgid "Editor font family"
msgstr "Redigerarens typsnittsfamilj"
@@ -1343,6 +1382,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"
@@ -1455,6 +1501,10 @@ msgstr "Joplin-exporteringskatalog"
msgid "Evernote Export File"
msgstr "Evernote-exporteringsfil"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin-exporteringskatalog"
msgid "Directory"
msgstr "Katalog"
@@ -1529,6 +1579,12 @@ msgstr "Kommande larm"
msgid "On %s: %s"
msgstr "På %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr ""
"Det finns för närvarande inga anteckningar. Skapa en genom att klicka på (+)-"
@@ -1575,10 +1631,6 @@ msgstr "Bekräfta"
msgid "Cancel synchronisation"
msgstr "Avbryt synkronisering"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Dekrypterar objekt: %d/%d"
#, fuzzy
msgid "Checking... Please wait."
msgstr "Avbryter... vänta."
@@ -1642,9 +1694,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"
@@ -1697,6 +1764,10 @@ msgstr ""
msgid "Unsupported image type: %s"
msgstr "Bildstorlek som inte stöds: %s"
#, fuzzy
msgid "Take photo"
msgstr "Bifoga foto"
msgid "Attach photo"
msgstr "Bifoga foto"
@@ -1721,6 +1792,9 @@ msgstr "Visa metadata"
msgid "View on map"
msgstr "Visa på karta"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "Ta bort anteckningsbok"
@@ -1746,5 +1820,8 @@ msgstr ""
msgid "Welcome"
msgstr "Välkommen"
#~ msgid "State: %s."
#~ msgstr "Tillstånd: %s."
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "En anteckningsbok med denna titel finns redan: \"%s\""

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Laurent Cozic
# This file is distributed under the same license as the Joplin-CLI package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# Yukio Usuzumi <anohigisavay@gmail.com>, 2018.
#
msgid ""
msgstr ""
@@ -19,7 +19,7 @@ msgid "To delete a tag, untag the associated notes."
msgstr "移除相关笔记的标签后才可删除此标签。"
msgid "Please select the note or notebook to be deleted first."
msgstr "请选择最先删除的笔记或笔记本。"
msgstr "请选择需要删除的笔记或笔记本。"
msgid "Press Ctrl+D or type \"exit\" to exit the application"
msgstr "按 Ctrl+D 或输入 \"exit\" 退出程序"
@@ -32,7 +32,7 @@ msgid "No notebook selected."
msgstr "未选择笔记本。"
msgid "No notebook has been specified."
msgstr "指定笔记本。"
msgstr "指定笔记本。"
msgid "Y"
msgstr "是"
@@ -47,7 +47,7 @@ msgid "y"
msgstr "是"
msgid "Cancelling background synchronisation... Please wait."
msgstr "正在取消后台同步... 请稍。"
msgstr "正在取消后台同步... 请稍。"
#, javascript-format
msgid "No such command: %s"
@@ -431,6 +431,9 @@ msgstr "无法初始化同步。"
msgid "Starting synchronisation..."
msgstr "开始同步..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "正在取消... 请稍后。"
@@ -602,7 +605,7 @@ msgid "Italic"
msgstr "斜体"
msgid "Insert Date Time"
msgstr ""
msgstr "插入时间"
#, fuzzy
msgid "Edit in external editor"
@@ -611,6 +614,10 @@ msgstr "在外部编辑器中打开"
msgid "Search in all the notes"
msgstr "在所有笔记内搜索"
#, fuzzy
msgid "Search in current note"
msgstr "在所有笔记内搜索"
msgid "View"
msgstr "显示"
@@ -670,9 +677,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 "是"
@@ -680,7 +699,7 @@ msgid "No"
msgstr "否"
msgid "Token has been copied to the clipboard!"
msgstr ""
msgstr "Token 已被复制到粘贴板"
msgid "The web clipper service is enabled and set to auto-start."
msgstr "网页剪辑服务已启用并设置为自动启动。"
@@ -732,10 +751,10 @@ msgid "Advanced options"
msgstr "显示高级选项"
msgid "Authorisation token:"
msgstr ""
msgstr "授权码:"
msgid "Copy token"
msgstr ""
msgstr "拷贝 token"
msgid ""
"This authorisation token is only needed to allow third-party applications to "
@@ -750,7 +769,7 @@ msgid "Notes and settings are stored in: %s"
msgstr "笔记与设置文件储存目录为:%s"
msgid "Apply"
msgstr ""
msgstr "应用"
msgid "Submit"
msgstr "提交"
@@ -924,11 +943,14 @@ msgid ""
msgstr "此处没有任何笔记本。点击\"新笔记本\"创建。"
msgid "Location"
msgstr ""
msgstr "位置"
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr "笔记属性"
msgid "Open..."
msgstr "打开…"
@@ -943,7 +965,10 @@ msgid "Copy path to clipboard"
msgstr "复制路径到剪切板"
msgid "Copy Link Address"
msgstr ""
msgstr "拷贝链接地址"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr "该附件没有下载或者没有解密"
#, javascript-format
msgid "Unsupported link or message: %s"
@@ -955,6 +980,9 @@ msgid ""
"note."
msgstr "此笔记没有任何内容。点击 \"%s\" 切换至编辑器并编辑笔记。"
msgid "Only one note can be printed or exported to PDF at a time."
msgstr ""
msgid "strong text"
msgstr "加粗文本"
@@ -980,9 +1008,6 @@ msgstr "设置提醒"
msgid "In: %s"
msgstr "在: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "超链接"
@@ -1059,6 +1084,14 @@ msgstr "同步"
msgid "Notebooks"
msgstr "笔记本"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "解密项目:%d/%d"
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "资源:%d。"
msgid "Please select where the sync status should be exported to"
msgstr "请选择同步状态的导出位置"
@@ -1101,6 +1134,9 @@ msgid ""
"synchronisation again may fix the problem."
msgstr "无法刷新令牌:缺失认证数据。重新开始同步可能会修复此错误。"
msgid "Untitled"
msgstr "无标题"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1148,10 +1184,6 @@ msgstr "已删除远程项目: %d。"
msgid "Fetched items: %d/%d."
msgstr "已提取项目:%d/%d."
#, javascript-format
msgid "State: %s."
msgstr "状态:%s。"
msgid "Cancelling..."
msgstr "正在取消..."
@@ -1198,9 +1230,6 @@ msgstr "更新日期"
msgid "created date"
msgstr "创建日期"
msgid "Untitled"
msgstr "无标题"
msgid "This note does not have geolocation information."
msgstr "此笔记不包含地理定位信息。"
@@ -1261,7 +1290,15 @@ msgid "Show tray icon"
msgstr "显示托盘图标"
msgid "Note: Does not work in all desktop environments."
msgstr "注意:在所有的桌面环境中都不能工作。"
msgstr "注意:在某些桌面环境下可能无法正常工作。"
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 "启动应用程序时在托盘中最小化"
@@ -1269,6 +1306,10 @@ msgstr "启动应用程序时在托盘中最小化"
msgid "Global zoom percentage"
msgstr "全局缩放比例"
#, fuzzy
msgid "Editor font size"
msgstr "编辑器字体"
msgid "Editor font family"
msgstr "编辑器字体"
@@ -1282,6 +1323,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 "同步间隔"
@@ -1391,6 +1439,10 @@ msgstr "Joplin 导出目录"
msgid "Evernote Export File"
msgstr "Evernote 导出文件"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin 导出目录"
msgid "Directory"
msgstr "文件目录"
@@ -1462,6 +1514,12 @@ msgstr "临近提醒"
msgid "On %s: %s"
msgstr "%s:%s"
msgid "Permission to use camera"
msgstr "使用摄像头的权限"
msgid "Your permission to use your camera is required."
msgstr "使用摄像头的权限是必须的"
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "当前没有任何笔记。点击(+)按钮创建。"
@@ -1506,10 +1564,6 @@ msgstr "确认"
msgid "Cancel synchronisation"
msgstr "取消同步"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "解密项目:%d/%d"
#, fuzzy
msgid "Checking... Please wait."
msgstr "正在取消... 请稍后。"
@@ -1522,6 +1576,8 @@ 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!"
@@ -1535,6 +1591,11 @@ msgid ""
"\n"
"Please try again."
msgstr ""
"无法授权应用:\n"
"\n"
"%s\n"
"\n"
"请重新尝试"
#, fuzzy, javascript-format
msgid "Decrypted items: %s / %s"
@@ -1567,9 +1628,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"
@@ -1621,6 +1697,10 @@ msgstr "Joplin 手机应用目前不支持这种类型的链接:%s"
msgid "Unsupported image type: %s"
msgstr "不支持的图片格式:%s"
#, fuzzy
msgid "Take photo"
msgstr "附加照片"
msgid "Attach photo"
msgstr "附加照片"
@@ -1645,6 +1725,9 @@ msgstr "显示元数据"
msgid "View on map"
msgstr "查看地图"
msgid "Go to source URL"
msgstr "定位到源 URL"
msgid "Delete notebook"
msgstr "删除笔记本"
@@ -1665,6 +1748,9 @@ msgstr "您目前未有笔记本。点击(+)按钮创建。"
msgid "Welcome"
msgstr "欢迎"
#~ msgid "State: %s."
#~ msgstr "状态:%s。"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "以此标题命名的笔记本已存在:\"%s\""

View File

@@ -431,6 +431,9 @@ msgstr "無法初始化同步器。"
msgid "Starting synchronisation..."
msgstr "正在啟動同步..."
msgid "Downloading resources..."
msgstr ""
msgid "Cancelling... Please wait."
msgstr "正在取消中...請稍候。"
@@ -611,6 +614,10 @@ msgstr "使用外部編輯器編輯"
msgid "Search in all the notes"
msgstr "在所有記事中搜尋"
#, fuzzy
msgid "Search in current note"
msgstr "在所有記事中搜尋"
msgid "View"
msgstr "檢視"
@@ -670,9 +677,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 "是"
@@ -929,6 +948,9 @@ msgstr ""
msgid "URL"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Open..."
msgstr "開啟..."
@@ -945,6 +967,9 @@ msgstr "複製路徑到剪貼板"
msgid "Copy Link Address"
msgstr "複製鏈接位址"
msgid "This attachment is not downloaded or not decrypted yet."
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "不支援的鏈接或訊息: %s"
@@ -955,6 +980,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>"
@@ -980,9 +1008,6 @@ msgstr "設置提醒"
msgid "In: %s"
msgstr "在: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "超連結"
@@ -1059,6 +1084,14 @@ msgstr "進行同步"
msgid "Notebooks"
msgstr "記事本"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "正在解密項目: %d/%d 項"
#, fuzzy, javascript-format
msgid "Fetching resources: %d"
msgstr "資源: %d。"
msgid "Please select where the sync status should be exported to"
msgstr "請選擇將同步狀態導出到的位置"
@@ -1101,6 +1134,9 @@ msgid ""
"synchronisation again may fix the problem."
msgstr "無法刷新 token: 缺少身份驗證資料。再次啟動同步可能會解決此問題。"
msgid "Untitled"
msgstr "未命名"
msgid ""
"Could not synchronize with OneDrive.\n"
"\n"
@@ -1147,10 +1183,6 @@ msgstr "已刪除的遠端項目: %d 項"
msgid "Fetched items: %d/%d."
msgstr "已擷取的本地項目: %d/%d 項"
#, javascript-format
msgid "State: %s."
msgstr "狀態: %s。"
msgid "Cancelling..."
msgstr "正在取消中..."
@@ -1197,9 +1229,6 @@ msgstr "更新日期"
msgid "created date"
msgstr "建立日期"
msgid "Untitled"
msgstr "未命名"
msgid "This note does not have geolocation information."
msgstr "此記事沒有地理位置定位資訊。"
@@ -1262,12 +1291,22 @@ msgstr "顯示系統匣圖示"
msgid "Note: Does not work in all desktop environments."
msgstr "注意: 不是在全部桌面環境中都能發揮作用。"
msgid ""
"This will allow Joplin to run in the background. It is recommended to enable "
"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 ""
msgid "Global zoom percentage"
msgstr "整體縮放比例 (%)"
#, fuzzy
msgid "Editor font size"
msgstr "編輯器字型系列"
msgid "Editor font family"
msgstr "編輯器字型系列"
@@ -1281,6 +1320,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 "同步時間間隔"
@@ -1388,6 +1434,10 @@ msgstr "Joplin 匯出目錄"
msgid "Evernote Export File"
msgstr "Evernote 匯出檔"
#, fuzzy
msgid "Json Export Directory"
msgstr "Joplin 匯出目錄"
msgid "Directory"
msgstr "目錄"
@@ -1459,6 +1509,12 @@ msgstr "將會發生的提醒事項"
msgid "On %s: %s"
msgstr "在 %s: %s"
msgid "Permission to use camera"
msgstr ""
msgid "Your permission to use your camera is required."
msgstr ""
msgid "There are currently no notes. Create one by clicking on the (+) button."
msgstr "您當前沒有任何筆記。通過按一下 (+) 鍵去新增一則筆記。"
@@ -1503,10 +1559,6 @@ msgstr "確認"
msgid "Cancel synchronisation"
msgstr "取消同步"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "正在解密項目: %d/%d 項"
#, fuzzy
msgid "Checking... Please wait."
msgstr "正在取消中...請稍候。"
@@ -1564,9 +1616,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"
@@ -1618,6 +1685,10 @@ msgstr "Joplin 移動應用程式暫時不支援此類型的連結: %s"
msgid "Unsupported image type: %s"
msgstr "不支援的圖像類型: %s"
#, fuzzy
msgid "Take photo"
msgstr "附加相片"
msgid "Attach photo"
msgstr "附加相片"
@@ -1642,6 +1713,9 @@ msgstr "顯示後設資料 (metadata)"
msgid "View on map"
msgstr "在地圖上顯示"
msgid "Go to source URL"
msgstr ""
msgid "Delete notebook"
msgstr "刪除記事本"
@@ -1662,5 +1736,8 @@ msgstr "您當前沒有任何筆記本。通過按一下 (+) 鍵去建立一本
msgid "Welcome"
msgstr "歡迎"
#~ msgid "State: %s."
#~ msgstr "狀態: %s。"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "同名筆記本已經存在: \"%s\""

View File

@@ -1,6 +1,6 @@
{
"name": "joplin",
"version": "1.0.116",
"version": "1.0.120",
"lockfileVersion": 1,
"requires": true,
"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",
@@ -2890,11 +2895,6 @@
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
},
"unidecode": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz",
"integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4="
},
"uniq": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",

View File

@@ -15,11 +15,12 @@
"years": [
2016,
2017,
2018
2018,
2019
],
"owner": "Laurent Cozic"
},
"version": "1.0.116",
"version": "1.0.120",
"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",
@@ -68,7 +70,6 @@
"tar": "^4.4.0",
"tcp-port-used": "^0.1.2",
"tkwidgets": "^0.5.26",
"unidecode": "^0.1.8",
"url-parse": "^1.2.0",
"uuid": "^3.0.1",
"valid-url": "^1.0.9",

View File

@@ -25,10 +25,14 @@ npm test tests-build/ArrayUtils.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_Note.js
npm test tests-build/models_Tag.js
npm test tests-build/models_ItemChange.js
npm test tests-build/models_Setting.js
npm test tests-build/pathUtils.js
npm test tests-build/StringUtils.js
npm test tests-build/services_InteropService.js
npm test tests-build/services_ResourceService.js
npm test tests-build/urlUtils.js

View File

@@ -1,5 +1,6 @@
require('app-module-path').addPath(__dirname);
const os = require('os');
const { time } = require('lib/time-utils.js');
const { filename } = require('lib/path-utils.js');
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
@@ -37,9 +38,14 @@ describe('EnexToMd', function() {
// if (htmlFilename !== 'text2.html') continue;
const html = await shim.fsDriver().readFile(htmlPath);
const expectedMd = await shim.fsDriver().readFile(mdPath);
let expectedMd = await shim.fsDriver().readFile(mdPath);
const actualMd = await enexXmlToMd('<div>' + html + '</div>', []);
let actualMd = await enexXmlToMd('<div>' + html + '</div>', []);
if (os.EOL === '\r\n') {
expectedMd = expectedMd.replace(/\r\n/g, '\n')
actualMd = actualMd.replace(/\r\n/g, '\n')
}
if (actualMd !== expectedMd) {
console.info('');

View File

@@ -1,5 +1,6 @@
require('app-module-path').addPath(__dirname);
const os = require('os');
const { time } = require('lib/time-utils.js');
const { filename } = require('lib/path-utils.js');
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
@@ -36,12 +37,17 @@ 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);
const expectedMd = await shim.fsDriver().readFile(mdPath);
let expectedMd = await shim.fsDriver().readFile(mdPath);
const actualMd = await htmlToMd.parse('<div>' + html + '</div>', []);
let actualMd = await htmlToMd.parse('<div>' + html + '</div>', []);
if (os.EOL === '\r\n') {
expectedMd = expectedMd.replace(/\r\n/g, '\n')
actualMd = actualMd.replace(/\r\n/g, '\n')
}
if (actualMd !== expectedMd) {
console.info('');

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);
}
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,51 @@
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 Folder = require('lib/models/Folder.js');
const Note = require('lib/models/Note.js');
const BaseItem = require('lib/models/BaseItem.js');
const Resource = require('lib/models/Resource.js');
const BaseModel = require('lib/BaseModel.js');
const { shim } = require('lib/shim');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
async function allItems() {
let folders = await Folder.all();
let notes = await Note.all();
return folders.concat(notes);
}
describe('models_BaseItem', function() {
beforeEach(async (done) => {
await setupDatabaseAndSynchronizer(1);
await switchClient(1);
done();
});
// it('should be able to exclude keys when syncing', asyncTest(async () => {
// let folder1 = await Folder.save({ title: "folder1" });
// let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
// await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
// let resource1 = (await Resource.all())[0];
// console.info(await Resource.serializeForSync(resource1));
// }));
// This is to handle the case where a property is removed from a BaseItem table - in that case files in
// the sync target will still have the old property but we don't need it locally.
it('should ignore properties that are present in sync file but not in database when serialising', asyncTest(async () => {
let folder = await Folder.save({ title: "folder1" });
let serialized = await Folder.serialize(folder);
serialized += "\nignore_me: true"
let unserialized = await Folder.unserialize(serialized);
expect('ignore_me' in unserialized).toBe(false);
}));
});

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

@@ -5,6 +5,7 @@ const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer
const Folder = require('lib/models/Folder.js');
const Note = require('lib/models/Note.js');
const BaseModel = require('lib/BaseModel.js');
const ArrayUtils = require('lib/ArrayUtils.js');
const { shim } = require('lib/shim');
process.on('unhandledRejection', (reason, p) => {
@@ -35,13 +36,36 @@ describe('models_Note', function() {
expect(items[0].type_).toBe(BaseModel.TYPE_NOTE);
expect(items[1].type_).toBe(BaseModel.TYPE_RESOURCE);
const resource = items[1];
note2.body += '<img alt="bla" src=":/' + resource.id + '"/>';
note2.body += '<img src=\':/' + resource.id + '\' />';
const resource2 = await shim.createResourceFromPath(__dirname + '/../tests/support/photo.jpg');
const resource3 = await shim.createResourceFromPath(__dirname + '/../tests/support/photo.jpg');
note2.body += '<img alt="bla" src=":/' + resource2.id + '"/>';
note2.body += '<img src=\':/' + resource3.id + '\' />';
items = await Note.linkedItems(note2.body);
expect(items.length).toBe(4);
}));
it('should find linked items', asyncTest(async () => {
const testCases = [
['[](:/06894e83b8f84d3d8cbe0f1587f9e226)', ['06894e83b8f84d3d8cbe0f1587f9e226']],
['[](:/06894e83b8f84d3d8cbe0f1587f9e226) [](:/06894e83b8f84d3d8cbe0f1587f9e226)', ['06894e83b8f84d3d8cbe0f1587f9e226']],
['[](:/06894e83b8f84d3d8cbe0f1587f9e226) [](:/06894e83b8f84d3d8cbe0f1587f9e227)', ['06894e83b8f84d3d8cbe0f1587f9e226', '06894e83b8f84d3d8cbe0f1587f9e227']],
['[](:/06894e83b8f84d3d8cbe0f1587f9e226 "some title")', ['06894e83b8f84d3d8cbe0f1587f9e226']],
];
for (let i = 0; i < testCases.length; i++) {
const t = testCases[i];
const input = t[0];
const expected = t[1];
const actual = Note.linkedItemIds(input);
const contentEquals = ArrayUtils.contentEquals(actual, expected);
// console.info(contentEquals, input, expected, actual);
expect(contentEquals).toBe(true);
}
}));
it('should change the type of notes', asyncTest(async () => {
let folder1 = await Folder.save({ title: "folder1" });
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });

View File

@@ -0,0 +1,59 @@
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 Folder = require('lib/models/Folder.js');
const Note = require('lib/models/Note.js');
const Resource = require('lib/models/Resource.js');
const BaseModel = require('lib/BaseModel.js');
const { shim } = require('lib/shim');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
describe('models_Resource', function() {
beforeEach(async (done) => {
await setupDatabaseAndSynchronizer(1);
await switchClient(1);
done();
});
it('should have a "done" fetch_status when created locally', asyncTest(async () => {
let folder1 = await Folder.save({ title: "folder1" });
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
let resource1 = (await Resource.all())[0];
let ls = await Resource.localState(resource1);
expect(ls.fetch_status).toBe(Resource.FETCH_STATUS_DONE);
}));
it('should have a default local state', asyncTest(async () => {
let folder1 = await Folder.save({ title: "folder1" });
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
let resource1 = (await Resource.all())[0];
let ls = await Resource.localState(resource1);
expect(!ls.id).toBe(true);
expect(ls.resource_id).toBe(resource1.id);
expect(ls.fetch_status).toBe(Resource.FETCH_STATUS_DONE);
}));
it('should save and delete local state', asyncTest(async () => {
let folder1 = await Folder.save({ title: "folder1" });
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
let resource1 = (await Resource.all())[0];
await Resource.setLocalState(resource1, { fetch_status: Resource.FETCH_STATUS_IDLE });
let ls = await Resource.localState(resource1);
expect(!!ls.id).toBe(true);
expect(ls.fetch_status).toBe(Resource.FETCH_STATUS_IDLE);
await Resource.delete(resource1.id);
ls = await Resource.localState(resource1);
expect(!ls.id).toBe(true);
}));
});

View File

@@ -0,0 +1,39 @@
require('app-module-path').addPath(__dirname);
const { 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) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
describe('pathUtils', function() {
beforeEach(async (done) => {
done();
});
it('should create friendly safe filename', async (done) => {
const testCases = [
['生活', '生活'],
['not/good', 'not_good'],
['really/not/good', 'really_not_good'],
['con', '___'],
['no space at the end ', 'no space at the end'],
['nor dots...', 'nor dots'],
[' no space before either', 'no space before either'],
['thatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylong', 'thatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylong'],
];
for (let i = 0; i < testCases.length; i++) {
const t = testCases[i];
expect(friendlySafeFilename(t[0])).toBe(t[1]);
}
expect(!!friendlySafeFilename('')).toBe(true);
expect(!!friendlySafeFilename('...')).toBe(true);
done();
});
});

View File

@@ -310,4 +310,51 @@ describe('services_InteropService', function() {
expect(note2_2.body.indexOf(note1_2.id) >= 0).toBe(true);
}));
it('should export into json format', asyncTest(async () => {
const service = new InteropService();
let folder1 = await Folder.save({ title: 'folder1' });
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
note1 = await Note.load(note1.id);
const filePath = exportDir();
await service.export({ path: filePath, format: 'json' });
// verify that the json files exist and can be parsed
const items = [folder1, note1];
for (let i = 0; i < items.length; i++) {
const jsonFile = filePath + '/' + items[i].id + '.json';
let json = await fs.readFile(jsonFile, 'utf-8');
let obj = JSON.parse(json);
expect(obj.id).toBe(items[i].id);
expect(obj.type_).toBe(items[i].type_);
expect(obj.title).toBe(items[i].title);
expect(obj.body).toBe(items[i].body);
}
}));
it('should export MD with unicode filenames', asyncTest(async () => {
const service = new InteropService();
let folder1 = await Folder.save({ title: 'folder1' });
let folder2 = await Folder.save({ title: 'ジョプリン' });
let note1 = await Note.save({ title: '生活', parent_id: folder1.id });
let note2 = await Note.save({ title: '生活', parent_id: folder1.id });
let note2b = await Note.save({ title: '生活', parent_id: folder1.id });
let note3 = await Note.save({ title: '', parent_id: folder1.id });
let note4 = await Note.save({ title: '', parent_id: folder1.id });
let note5 = await Note.save({ title: 'salut, ça roule ?', parent_id: folder1.id });
let note6 = await Note.save({ title: 'ジョプリン', parent_id: folder2.id });
const outDir = exportDir();
await service.export({ path: outDir, format: 'md' });
expect(await shim.fsDriver().exists(outDir + '/folder1/生活.md')).toBe(true);
expect(await shim.fsDriver().exists(outDir + '/folder1/生活 (1).md')).toBe(true);
expect(await shim.fsDriver().exists(outDir + '/folder1/生活 (2).md')).toBe(true);
expect(await shim.fsDriver().exists(outDir + '/folder1/Untitled.md')).toBe(true);
expect(await shim.fsDriver().exists(outDir + '/folder1/Untitled (1).md')).toBe(true);
expect(await shim.fsDriver().exists(outDir + '/folder1/salut, ça roule _.md')).toBe(true);
expect(await shim.fsDriver().exists(outDir + '/ジョプリン/ジョプリン.md')).toBe(true);
}));
});

View File

@@ -8,6 +8,7 @@ const Note = require('lib/models/Note.js');
const Tag = require('lib/models/Tag.js');
const NoteTag = require('lib/models/NoteTag.js');
const Resource = require('lib/models/Resource.js');
const ItemChange = require('lib/models/ItemChange.js');
const NoteResource = require('lib/models/NoteResource.js');
const ResourceService = require('lib/services/ResourceService.js');
const fs = require('fs-extra');
@@ -124,4 +125,25 @@ describe('services_ResourceService', function() {
expect(!!(await Resource.load(resource1.id))).toBe(true);
}));
it('should not process twice the same change', asyncTest(async () => {
const service = new ResourceService();
let folder1 = await Folder.save({ title: "folder1" });
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
note1 = await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
let resource1 = (await Resource.all())[0];
await service.indexNoteResources();
const before = (await NoteResource.all())[0];
await time.sleep(0.1);
await service.indexNoteResources();
const after = (await NoteResource.all())[0];
expect(before.last_seen_time).toBe(after.last_seen_time);
}));
});

View File

@@ -0,0 +1,257 @@
require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-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);
});
let engine = null;
describe('services_SearchEngine', function() {
beforeEach(async (done) => {
await setupDatabaseAndSynchronizer(1);
await switchClient(1);
engine = new SearchEngine();
engine.setDb(db());
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);
}));
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
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);
}));
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
const n2 = await Note.save({ title: "abcd aaaaa bbbb eeee efgh" });
// 3
const n3 = await Note.save({ title: "abcd aaaaa efgh" });
// 2
const n4 = await Note.save({ title: "blablablabla blabla bla abcd X efgh" });
// 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);
expect(rows[1].id).toBe(n4.id);
expect(rows[2].id).toBe(n3.id);
expect(rows[3].id).toBe(n2.id);
expect(rows[4].id).toBe(n5.id);
}));
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);
rows = await engine.search('"abcd ijkl"');
expect(rows.length).toBe(0);
rows = await engine.search('"abcd efgh"');
expect(rows.length).toBe(1);
rows = await engine.search('title:abcd');
expect(rows.length).toBe(1);
rows = await engine.search('title:efgh');
expect(rows.length).toBe(2);
rows = await engine.search('body:abcd');
expect(rows.length).toBe(0);
rows = await engine.search('body:bbbb');
expect(rows.length).toBe(2);
rows = await engine.search('body:bbbb iiii');
expect(rows.length).toBe(1);
rows = await engine.search('Рейтер');
expect(rows.length).toBe(1);
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 = [
['abcd efgh', { _: ['abcd', 'efgh'] }],
['abcd efgh', { _: ['abcd', 'efgh'] }],
['title:abcd efgh', { _: ['efgh'], title: ['abcd'] }],
['title:abcd', { title: ['abcd'] }],
['"abcd efgh"', { _: ['abcd efgh'] }],
];
for (let i = 0; i < testCases.length; i++) {
const t = testCases[i];
const input = t[0];
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));
}
}));
it('should parse query strings with wildcards', 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'] ],
];
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);
}));
});

View File

@@ -156,6 +156,20 @@ describe('services_rest_Api', function() {
done();
});
it('should create notes with supplied ID', async (done) => {
let response = null;
const f = await Folder.save({ title: "mon carnet" });
response = await api.route('POST', 'notes', null, JSON.stringify({
id: '12345678123456781234567812345678',
title: 'testing',
parent_id: f.id,
}));
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

@@ -873,15 +873,17 @@ describe('Synchronizer', function() {
let allResources = await Resource.all();
expect(allResources.length).toBe(1);
let resource1_2 = allResources[0];
let ls = await Resource.localState(resource1_2);
expect(resource1_2.id).toBe(resource1.id);
expect(resource1_2.fetch_status).toBe(Resource.FETCH_STATUS_IDLE);
expect(ls.fetch_status).toBe(Resource.FETCH_STATUS_IDLE);
const fetcher = new ResourceFetcher(() => { return synchronizer().api() });
fetcher.queueDownload(resource1_2.id);
await fetcher.waitForAllFinished();
resource1_2 = await Resource.load(resource1.id);
expect(resource1_2.fetch_status).toBe(Resource.FETCH_STATUS_DONE);
ls = await Resource.localState(resource1_2);
expect(ls.fetch_status).toBe(Resource.FETCH_STATUS_DONE);
let resourcePath1_2 = Resource.fullPath(resource1_2);
expect(fileContentEqual(resourcePath1, resourcePath1_2)).toBe(true);
@@ -909,8 +911,9 @@ describe('Synchronizer', function() {
await fetcher.waitForAllFinished();
resource1 = await Resource.load(resource1.id);
expect(resource1.fetch_status).toBe(Resource.FETCH_STATUS_ERROR);
expect(resource1.fetch_error).toBe('did not work');
let ls = await Resource.localState(resource1);
expect(ls.fetch_status).toBe(Resource.FETCH_STATUS_ERROR);
expect(ls.fetch_error).toBe('did not work');
}));
it('should delete resources', asyncTest(async () => {

View File

@@ -4,6 +4,7 @@ const { DatabaseDriverNode } = require('lib/database-driver-node.js');
const BaseModel = require('lib/BaseModel.js');
const Folder = require('lib/models/Folder.js');
const Note = require('lib/models/Note.js');
const ItemChange = require('lib/models/ItemChange.js');
const Resource = require('lib/models/Resource.js');
const Tag = require('lib/models/Tag.js');
const NoteTag = require('lib/models/NoteTag.js');
@@ -122,6 +123,8 @@ async function switchClient(id) {
async function clearDatabase(id = null) {
if (id === null) id = currentClient_;
await ItemChange.waitForAllSaved();
let queries = [
'DELETE FROM notes',
'DELETE FROM folders',
@@ -134,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

@@ -18,7 +18,10 @@ class AppComponent extends Component {
});
this.confirm_click = () => {
bridge().sendContentToJoplin(this.props.clippedContent);
const content = Object.assign({}, this.props.clippedContent);
content.tags = this.state.selectedTags.join(',');
content.parent_id = this.props.selectedFolderId;
bridge().sendContentToJoplin(content);
}
this.contentTitle_change = (event) => {
@@ -31,24 +34,18 @@ class AppComponent extends Component {
this.clipSimplified_click = () => {
bridge().sendCommandToActiveTab({
name: 'simplifiedPageHtml',
parent_id: this.props.selectedFolderId,
tags: this.state.selectedTags.join(','),
});
}
this.clipComplete_click = () => {
bridge().sendCommandToActiveTab({
name: 'completePageHtml',
parent_id: this.props.selectedFolderId,
tags: this.state.selectedTags.join(','),
});
}
this.clipSelection_click = () => {
bridge().sendCommandToActiveTab({
name: 'selectedHtml',
parent_id: this.props.selectedFolderId,
tags: this.state.selectedTags.join(','),
});
}

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

@@ -1,20 +1,20 @@
function randomClipperPort(state, env) {
const startPorts = {
prod: 41184,
dev: 27583,
};
const startPorts = {
prod: 41184,
dev: 27583,
};
const startPort = env === 'prod' ? startPorts.prod : startPorts.dev;
const startPort = env === 'prod' ? startPorts.prod : startPorts.dev;
if (!state) {
state = { offset: 0 };
} else {
state.offset++;
}
if (!state) {
state = { offset: 0 };
} else {
state.offset++;
}
state.port = startPort + state.offset;
state.port = startPort + state.offset;
return state;
return state;
}
module.exports = randomClipperPort;

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

@@ -24,7 +24,7 @@ const InteropService = require('lib/services/InteropService');
const InteropServiceHelper = require('./InteropServiceHelper.js');
const ResourceService = require('lib/services/ResourceService');
const ClipperServer = require('lib/ClipperServer');
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
const { bridge } = require('electron').remote.require('./bridge');
const Menu = bridge().Menu;
const MenuItem = bridge().MenuItem;
@@ -49,7 +49,6 @@ class Application extends BaseApplication {
constructor() {
super();
this.lastMenuScreen_ = null;
this.powerSaveBlockerId_ = null;
}
hasGui() {
@@ -198,10 +197,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');
}
@@ -221,17 +216,6 @@ class Application extends BaseApplication {
Setting.setValue('sidebarVisibility', newState.sidebarVisibility);
}
if (action.type === 'SYNC_STARTED') {
if (!this.powerSaveBlockerId_) this.powerSaveBlockerId_ = bridge().powerSaveBlockerStart('prevent-app-suspension');
}
if (action.type === 'SYNC_COMPLETED') {
if (this.powerSaveBlockerId_) {
bridge().powerSaveBlockerStop(this.powerSaveBlockerId_);
this.powerSaveBlockerId_ = null;
}
}
return result;
}
@@ -471,14 +455,27 @@ class Application extends BaseApplication {
name: 'commandStartExternalEditing',
});
},
}, {
type: 'separator',
screens: ['Main'],
}, {
label: _('Search in all the notes'),
screens: ['Main'],
accelerator: 'F6',
click: () => {
this.dispatch({
type: 'WINDOW_COMMAND',
name: 'focus_search',
});
},
}, {
label: _('Search in current note'),
screens: ['Main'],
accelerator: 'CommandOrControl+F',
click: () => {
this.dispatch({
type: 'WINDOW_COMMAND',
name: 'focus_search',
name: 'showLocalSearch',
});
},
}],
@@ -587,7 +584,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',
@@ -599,7 +596,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'), {
@@ -688,6 +685,23 @@ class Application extends BaseApplication {
document.head.appendChild(styleTag);
}
async loadCustomCss(filePath) {
let cssString = '';
if (await fs.pathExists(filePath)) {
try {
cssString = await fs.readFile(filePath, 'utf-8');
} catch (error) {
let msg = error.message ? error.message : '';
msg = 'Could not load custom css from ' + filePath + '\n' + msg;
error.message = msg;
throw error;
}
}
return cssString;
}
async start(argv) {
const electronIsDev = require('electron-is-dev');
@@ -741,14 +755,19 @@ class Application extends BaseApplication {
ids: Setting.value('collapsedFolderIds'),
});
if (shim.isLinux()) bridge().setAllowPowerSaveBlockerToggle(true);
const cssString = await this.loadCustomCss(Setting.value('profileDir') + '/userstyle.css');
this.store().dispatch({
type: 'LOAD_CUSTOM_CSS',
css: cssString
});
// Note: Auto-update currently doesn't work in Linux: it downloads the update
// but then doesn't install it on exit.
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') });
}
}
@@ -792,6 +811,9 @@ class Application extends BaseApplication {
if (Setting.value('clipperServer.autoStart')) {
ClipperServer.instance().start();
}
ExternalEditWatcher.instance().setLogger(reg.logger());
ExternalEditWatcher.instance().dispatch = this.store().dispatch;
}
}

View File

@@ -1,7 +1,6 @@
const { _, setLocale } = require('lib/locale.js');
const { dirname } = require('lib/path-utils.js');
const { Logger } = require('lib/logger.js');
const { powerSaveBlocker } = require('electron');
class Bridge {
@@ -9,7 +8,6 @@ class Bridge {
this.electronWrapper_ = electronWrapper;
this.autoUpdateLogger_ = null;
this.lastSelectedPath_ = null;
this.allowPowerSaveBlockerToggle_ = false;
}
electronApp() {
@@ -24,10 +22,6 @@ class Bridge {
return this.electronWrapper_.window();
}
setAllowPowerSaveBlockerToggle(v) {
this.allowPowerSaveBlockerToggle_ = v;
}
windowContentSize() {
if (!this.window()) return { width: 0, height: 0 };
const s = this.window().getContentSize();
@@ -122,23 +116,11 @@ 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);
}
powerSaveBlockerStart(type) {
if (!this.allowPowerSaveBlockerToggle_) return null;
console.info('Enable powerSaveBlockerStart: ' + type);
return powerSaveBlocker.start(type);
}
powerSaveBlockerStop(id) {
if (!this.allowPowerSaveBlockerToggle_) return null;
console.info('Disable powerSaveBlocker: ' + id);
return powerSaveBlocker.stop(id);
}
}
let bridge_ = null;

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

@@ -45,15 +45,21 @@ class ClipperConfigScreenComponent extends React.Component {
const style = this.props.style;
const theme = themeStyle(this.props.theme);
const headerStyle = {
width: style.width,
};
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
const containerStyle = Object.assign({}, theme.containerStyle, {
overflowY: 'scroll',
height:style.height,
});
const buttonStyle = Object.assign({}, theme.buttonStyle, { marginRight: 10 });
const stepBoxStyle = {
border: "1px solid #ccc",
padding: 15,
paddingTop: 0,
marginBottom: 15,
backgroundColor: theme.backgroundColor,
};
let webClipperStatusComps = [];
@@ -68,7 +74,7 @@ class ClipperConfigScreenComponent extends React.Component {
webClipperStatusComps.push(<button key="disable_button" onClick={this.disableClipperServer_click}>{_('Disable Web Clipper Service')}</button>)
} else {
webClipperStatusComps.push(<p key="text_4" style={theme.textStyle}>{_('The web clipper service is not enabled.')}</p>)
webClipperStatusComps.push(<button key="enable_button" onClick={this.enableClipperServer_click}>{_('Enable Web Clipper Service')}</button>)
webClipperStatusComps.push(<button key="enable_button" style={buttonStyle} onClick={this.enableClipperServer_click}>{_('Enable Web Clipper Service')}</button>)
}
const apiTokenStyle = Object.assign({}, theme.textStyle, {
@@ -81,7 +87,7 @@ class ClipperConfigScreenComponent extends React.Component {
return (
<div>
<Header style={headerStyle} />
<div style={{overflowY:'scroll', height:style.height}}>
<div style={containerStyle}>
<div style={{padding: theme.margin}}>
<p style={theme.textStyle}>{_('Joplin Web Clipper allows saving web pages and screenshots from your browser to Joplin.')}</p>
<p style={theme.textStyle}>{_('In order to use the web clipper, you need to do the following:')}</p>
@@ -106,7 +112,7 @@ class ClipperConfigScreenComponent extends React.Component {
<div style={stepBoxStyle}>
<p style={theme.h1Style}>{_('Advanced options')}</p>
<p style={theme.textStyle}>{_('Authorisation token:')}</p>
<p style={apiTokenStyle}>{this.props.apiToken} <a href="#" onClick={this.copyToken_click}>{_('Copy token')}</a></p>
<p style={apiTokenStyle}>{this.props.apiToken} <a style={theme.urlStyle} href="#" onClick={this.copyToken_click}>{_('Copy token')}</a></p>
<p style={theme.textStyle}>{_('This authorisation token is only needed to allow third-party applications to access Joplin.')}</p>
</div>
</div>
@@ -128,4 +134,4 @@ const mapStateToProps = (state) => {
const ClipperConfigScreen = connect(mapStateToProps)(ClipperConfigScreenComponent);
module.exports = { ClipperConfigScreen };
module.exports = { ClipperConfigScreen };

View File

@@ -53,10 +53,13 @@ class ConfigScreenComponent extends React.Component {
const labelStyle = Object.assign({}, theme.textStyle, {
display: 'inline-block',
marginRight: 10,
color: theme.color,
});
const controlStyle = {
display: 'inline-block',
color: theme.color,
backgroundColor: theme.backgroundColor,
};
const descriptionStyle = Object.assign({}, theme.textStyle, {
@@ -120,7 +123,10 @@ class ConfigScreenComponent extends React.Component {
updateSettingValue(key, event.target.value);
}
const inputStyle = Object.assign({}, controlStyle, { width: '50%', minWidth: '20em' });
const inputStyle = Object.assign({}, controlStyle, {
width: '50%',
minWidth: '20em',
border: '1px solid' });
const inputType = md.secure === true ? 'password' : 'text';
return (
@@ -164,21 +170,19 @@ class ConfigScreenComponent extends React.Component {
render() {
const theme = themeStyle(this.props.theme);
const style = Object.assign({}, this.props.style, { overflow: 'auto' });
const style = Object.assign({
backgroundColor: theme.backgroundColor
}, this.props.style, { overflow: 'auto' });
const settings = this.state.settings;
const headerStyle = {
width: style.width,
};
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
const containerStyle = {
padding: 10,
};
const containerStyle = Object.assign({}, theme.containerStyle, { padding: 10 });
const buttonStyle = {
const buttonStyle = Object.assign({}, theme.buttonStyle, {
display: this.state.changedSettingKeys.length ? 'inline-block' : 'none',
marginRight: 10,
}
});
const settingComps = shared.settingsToComponents(this, 'desktop', settings);
@@ -228,4 +232,4 @@ const mapStateToProps = (state) => {
const ConfigScreen = connect(mapStateToProps)(ConfigScreenComponent);
module.exports = { ConfigScreen };
module.exports = { ConfigScreen };

View File

@@ -28,16 +28,18 @@ class DropboxLoginScreenComponent extends React.Component {
const style = this.props.style;
const theme = themeStyle(this.props.theme);
const headerStyle = {
width: style.width,
};
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
const containerStyle = Object.assign({}, theme.containerStyle, {
padding: theme.margin,
height: style.height - theme.headerHeight - theme.margin * 2,
});
const inputStyle = Object.assign({}, theme.inputStyle, { width: 500 });
return (
<div>
<Header style={headerStyle} />
<div style={{padding: theme.margin}}>
<div style={containerStyle}>
<p style={theme.textStyle}>{_('To allow Joplin to synchronise with Dropbox, please follow the steps below:')}</p>
<p style={theme.textStyle}>{_('Step 1: Open this URL in your browser to authorise the application:')}</p>
<a style={theme.textStyle} href="#" onClick={this.shared_.loginUrl_click}>{this.state.loginUrl}</a>
@@ -59,4 +61,4 @@ const mapStateToProps = (state) => {
const DropboxLoginScreen = connect(mapStateToProps)(DropboxLoginScreenComponent);
module.exports = { DropboxLoginScreen };
module.exports = { DropboxLoginScreen };

View File

@@ -50,6 +50,13 @@ class EncryptionConfigScreenComponent extends React.Component {
renderMasterKey(mk) {
const theme = themeStyle(this.props.theme);
const passwordStyle = {
color: theme.color,
backgroundColor: theme.backgroundColor,
border: '1px solid',
borderColor: theme.dividerColor,
}
const onSaveClick = () => {
return shared.onSavePasswordClick(this, mk);
}
@@ -69,7 +76,7 @@ class EncryptionConfigScreenComponent extends React.Component {
<td style={theme.textStyle}>{mk.source_application}</td>
<td style={theme.textStyle}>{time.formatMsToLocal(mk.created_time)}</td>
<td style={theme.textStyle}>{time.formatMsToLocal(mk.updated_time)}</td>
<td style={theme.textStyle}><input type="password" value={password} onChange={(event) => onPasswordChange(event)}/> <button onClick={() => onSaveClick()}>{_('Save')}</button></td>
<td style={theme.textStyle}><input type="password" style={passwordStyle} value={password} onChange={(event) => onPasswordChange(event)}/> <button style={theme.buttonStyle} onClick={() => onSaveClick()}>{_('Save')}</button></td>
<td style={theme.textStyle}>{passwordOk}</td>
</tr>
);
@@ -81,15 +88,13 @@ class EncryptionConfigScreenComponent extends React.Component {
const masterKeys = this.state.masterKeys;
const containerPadding = 10;
const headerStyle = {
width: style.width,
};
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
const containerStyle = {
const containerStyle = Object.assign({}, theme.containerStyle, {
padding: containerPadding,
overflow: 'auto',
height: style.height - theme.headerHeight - containerPadding * 2,
};
});
const mkComps = [];
let nonExistingMasterKeyIds = this.props.notLoadedMasterKeys.slice();
@@ -126,7 +131,7 @@ class EncryptionConfigScreenComponent extends React.Component {
}
const decryptedItemsInfo = <p style={theme.textStyle}>{shared.decryptedStatText(this)}</p>;
const toggleButton = <button onClick={() => { onToggleButtonClick() }}>{this.props.encryptionEnabled ? _('Disable encryption') : _('Enable encryption')}</button>
const toggleButton = <button style={theme.buttonStyle} onClick={() => { onToggleButtonClick() }}>{this.props.encryptionEnabled ? _('Disable encryption') : _('Enable encryption')}</button>
let masterKeySection = null;
@@ -213,4 +218,4 @@ const mapStateToProps = (state) => {
const EncryptionConfigScreen = connect(mapStateToProps)(EncryptionConfigScreenComponent);
module.exports = { EncryptionConfigScreen };
module.exports = { EncryptionConfigScreen };

View File

@@ -108,6 +108,9 @@ class HeaderComponent extends React.Component {
color: style.color,
fontSize: style.fontSize,
fontFamily: style.fontFamily,
backgroundColor: style.searchColor,
border: '1px solid',
borderColor: style.dividerColor,
};
const searchButton = {
@@ -171,6 +174,8 @@ class HeaderComponent extends React.Component {
paddingLeft: theme.headerButtonHPadding,
paddingRight: theme.headerButtonHPadding,
color: theme.color,
searchColor: theme.backgroundColor,
dividerColor: theme.dividerColor,
textDecoration: 'none',
fontFamily: theme.fontFamily,
fontSize: theme.fontSize,
@@ -212,4 +217,4 @@ const mapStateToProps = (state) => {
const Header = connect(mapStateToProps)(HeaderComponent);
module.exports = { Header };
module.exports = { Header };

View File

@@ -35,4 +35,4 @@ class IconButton extends React.Component {
}
module.exports = { IconButton };
module.exports = { IconButton };

View File

@@ -120,7 +120,7 @@ class MainScreenComponent extends React.Component {
});
} else if (command.name === 'setTags') {
const tags = await Tag.tagsByNoteId(command.noteId);
const tagTitles = tags.map((a) => { return a.title });
const tagTitles = tags.map((a) => { return a.title }).sort();
this.setState({
promptOptions: {
@@ -158,7 +158,7 @@ class MainScreenComponent extends React.Component {
},
});
} else if (command.name === 'renameTag') {
const tag = await Tag.load(command.id);
const tag = await Tag.load(command.id);
if(!tag) return;
this.setState({
@@ -173,12 +173,12 @@ class MainScreenComponent extends React.Component {
} catch (error) {
bridge().showErrorMessageBox(error.message);
}
}
}
this.setState({promptOptions: null });
}
}
})
} else if (command.name === 'search') {
if (!this.searchId_) this.searchId_ = uuid.create();
@@ -336,14 +336,17 @@ class MainScreenComponent extends React.Component {
}
render() {
const style = this.props.style;
const theme = themeStyle(this.props.theme);
const style = Object.assign({
color: theme.color,
backgroundColor: theme.backgroundColor,
}, this.props.style);
const promptOptions = this.state.promptOptions;
const folders = this.props.folders;
const notes = this.props.notes;
const messageBoxVisible = this.props.hasDisabledSyncItems || this.props.showMissingMasterKeyMessage;
const sidebarVisibility = this.props.sidebarVisibility;
const styles = this.styles(this.props.theme, style.width, style.height, messageBoxVisible, sidebarVisibility);
const theme = themeStyle(this.props.theme);
const selectedFolderId = this.props.selectedFolderId;
const onConflictFolder = this.props.selectedFolderId === Folder.conflictFolderId();

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;
@@ -13,9 +14,17 @@ const InteropService = require('lib/services/InteropService');
const InteropServiceHelper = require('../InteropServiceHelper.js');
const Search = require('lib/models/Search');
const Mark = require('mark.js/dist/mark.min.js');
const SearchEngine = require('lib/services/SearchEngine');
const { replaceRegexDiacritics, pregQuote } = require('lib/string-utils');
class NoteListComponent extends React.Component {
constructor() {
super();
this.itemRenderer = this.itemRenderer.bind(this);
}
style() {
const theme = themeStyle(this.props.theme);
@@ -148,12 +157,14 @@ class NoteListComponent extends React.Component {
}}));
}
exportMenu.append(new MenuItem({ label: 'PDF - ' + _('PDF File') , click: () => {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'exportPdf',
});
}}));
if (noteIds.length === 1) {
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});
@@ -169,7 +180,10 @@ class NoteListComponent extends React.Component {
menu.popup(bridge().window());
}
itemRenderer(item, theme, width) {
itemRenderer(item) {
const theme = themeStyle(this.props.theme);
const width = this.props.style.width;
const onTitleClick = async (event, item) => {
if (event.ctrlKey) {
event.preventDefault();
@@ -225,8 +239,11 @@ class NoteListComponent extends React.Component {
let highlightedWords = [];
if (this.props.notesParentType === 'Search') {
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
highlightedWords = search ? Search.keywords(search.query_pattern) : [];
const query = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
if (query) {
const parsedQuery = SearchEngine.instance().parseQuery(query.query_pattern);
highlightedWords = SearchEngine.instance().allParsedQueryTerms(parsedQuery);
}
}
let style = Object.assign({ width: width }, this.style().listItem);
@@ -257,7 +274,17 @@ class NoteListComponent extends React.Component {
exclude: ['img'],
acrossElements: true,
});
mark.mark(highlightedWords);
mark.unmark();
for (let i = 0; i < highlightedWords.length; i++) {
const w = highlightedWords[i];
markJsUtils.markKeyword(mark, w, {
pregQuote: pregQuote,
replaceRegexDiacritics: replaceRegexDiacritics,
});
}
// Note: in this case it is safe to use dangerouslySetInnerHTML because titleElement
// is a span tag that we created and that contains data that's been inserted as plain text
@@ -269,6 +296,14 @@ class NoteListComponent extends React.Component {
titleComp = <span>{displayTitle}</span>
}
const watchedIconStyle = {
paddingRight: 4,
color: theme.color,
};
const watchedIcon = this.props.watchedNoteFiles.indexOf(item.id) < 0 ? null : (
<i style={watchedIconStyle} className={"fa fa-external-link"}></i>
);
// 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}>
@@ -283,6 +318,7 @@ class NoteListComponent extends React.Component {
onDragStart={(event) => onDragStart(event) }
data-id={item.id}
>
{watchedIcon}
{titleComp}
</a>
</div>
@@ -313,7 +349,7 @@ class NoteListComponent extends React.Component {
style={style}
className={"note-list"}
items={notes}
itemRenderer={ (item) => { return this.itemRenderer(item, theme, style.width) } }
itemRenderer={this.itemRenderer}
></ItemList>
);
}
@@ -329,6 +365,7 @@ const mapStateToProps = (state) => {
notesParentType: state.notesParentType,
searches: state.searches,
selectedSearchId: state.selectedSearchId,
watchedNoteFiles: state.watchedNoteFiles,
};
};

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 });
@@ -110,12 +118,12 @@ class NotePropertiesDialog extends React.Component {
width: '100%',
height: '100%',
backgroundColor: 'rgba(0,0,0,0.6)',
alignItems: 'flex-start',
justifyContent: 'center',
alignItems: 'flex-start',
justifyContent: 'center',
};
this.styles_.dialogBox = {
backgroundColor: 'white',
backgroundColor: theme.backgroundColor,
padding: 16,
boxShadow: '6px 6px 20px rgba(0,0,0,0.5)',
marginTop: 20,
@@ -123,17 +131,33 @@ class NotePropertiesDialog extends React.Component {
this.styles_.controlBox = {
marginBottom: '1em',
color: 'black', //This will apply for the calendar
};
this.styles_.button = {
minWidth: theme.buttonMinWidth,
minHeight: theme.buttonMinHeight,
marginLeft: 5,
color: theme.color,
backgroundColor: theme.backgroundColor,
border: '1px solid',
borderColor: theme.dividerColor,
};
this.styles_.editPropertyButton = {
color: theme.color,
textDecoration: 'none',
backgroundColor: theme.backgroundColor,
border: '1px solid',
borderColor: theme.dividerColor,
};
this.styles_.input = {
display:'inline-block',
color: theme.color,
backgroundColor: theme.backgroundColor,
border: '1px solid',
borderColor: theme.dividerColor,
};
this.styles_.dialogTitle = Object.assign({}, theme.h1Style, { marginBottom: '1.2em' });
@@ -168,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,
@@ -206,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
@@ -239,7 +272,8 @@ class NotePropertiesDialog extends React.Component {
dateFormat={time.dateFormat()}
timeFormat={time.timeFormat()}
inputProps={{
onKeyDown: (event) => onKeyDown(event, key)
onKeyDown: (event) => onKeyDown(event, key),
style: styles.input
}}
onChange={(momentObject) => {this.setState({ editedValue: momentObject })}}
/>
@@ -254,7 +288,7 @@ class NotePropertiesDialog extends React.Component {
ref="editField"
onChange={(event) => {this.setState({ editedValue: event.target.value })}}
onKeyDown={(event) => onKeyDown(event)}
style={{display:'inline-block'}}
style={styles.input}
/>
}
} else {
@@ -330,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 = [];
@@ -349,7 +393,7 @@ class NotePropertiesDialog extends React.Component {
return (
<div style={modalLayerStyle}>
<div style={styles.dialogBox}>
<div style={styles.dialogTitle}>Note properties</div>
<div style={styles.dialogTitle}>{_('Note properties')}</div>
<div>{noteComps}</div>
<div style={{ textAlign: 'right', marginTop: 10 }}>
{buttonComps}
@@ -361,4 +405,4 @@ class NotePropertiesDialog extends React.Component {
}
module.exports = NotePropertiesDialog;
module.exports = NotePropertiesDialog;

View File

@@ -0,0 +1,122 @@
const React = require('react');
const { connect } = require('react-redux');
const { themeStyle } = require('../theme.js');
const { _ } = require('lib/locale.js');
class NoteSearchBarComponent extends React.Component {
constructor() {
super();
this.state = {
query: '',
};
this.searchInput_change = this.searchInput_change.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);
}
style() {
const theme = themeStyle(this.props.theme);
let style = {
root: Object.assign({}, theme.textStyle, {
backgroundColor: theme.backgroundColor,
color: theme.colorFaded,
}),
};
return style;
}
componentDidMount() {
this.refs.searchInput.focus();
}
buttonIconComponent(iconName, clickHandler) {
const theme = themeStyle(this.props.theme);
const searchButton = {
paddingLeft: 4,
paddingRight: 4,
paddingTop: 2,
paddingBottom: 2,
textDecoration: 'none',
marginRight: 5,
};
const iconStyle = {
display: 'flex',
fontSize: Math.round(theme.fontSize) * 1.2,
color: theme.color,
};
const icon = <i style={iconStyle} className={"fa " + iconName}></i>
return (
<a
href="#"
style={searchButton}
onClick={clickHandler}
>{icon}</a>
);
}
searchInput_change(event) {
const query = event.currentTarget.value;
this.setState({ query: query });
this.triggerOnChange(query);
}
previousButton_click(event) {
if (this.props.onPrevious) this.props.onPrevious();
}
nextButton_click(event) {
if (this.props.onNext) this.props.onNext();
}
closeButton_click(event) {
if (this.props.onClose) this.props.onClose();
}
triggerOnChange(query) {
if (this.props.onChange) this.props.onChange(query);
}
focus() {
this.refs.searchInput.focus();
}
render() {
const theme = themeStyle(this.props.theme);
const closeButton = this.buttonIconComponent('fa-times', this.closeButton_click);
const previousButton = this.buttonIconComponent('fa-chevron-up', this.previousButton_click);
const nextButton = this.buttonIconComponent('fa-chevron-down', this.nextButton_click);
return (
<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>
{ nextButton }
{ previousButton }
</div>
</div>
);
}
}
const mapStateToProps = (state) => {
return {
theme: state.settings.theme,
};
};
const NoteSearchBar = connect(mapStateToProps, null, null, { withRef: true })(NoteSearchBarComponent);
module.exports = NoteSearchBar;

View File

@@ -6,8 +6,9 @@ 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 } = 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');
const { _ } = require('lib/locale.js');
const { reg } = require('lib/registry.js');
@@ -24,24 +25,36 @@ const fs = require('fs-extra');
const md5 = require('md5');
const mimeUtils = require('lib/mime-utils.js').mime;
const ArrayUtils = require('lib/ArrayUtils');
const ObjectUtils = require('lib/ObjectUtils');
const urlUtils = require('lib/urlUtils');
const dialogs = require('./dialogs');
const NoteSearchBar = require('./NoteSearchBar.min.js');
const markdownUtils = require('lib/markdownUtils');
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
const ResourceFetcher = require('lib/services/ResourceFetcher');
const { toSystemSlashes, safeFilename } = require('lib/path-utils');
const { clipboard } = require('electron');
const SearchEngine = require('lib/services/SearchEngine');
require('brace/mode/markdown');
// https://ace.c9.io/build/kitchen-sink.html
// https://highlightjs.org/static/demo/
require('brace/theme/chrome');
require('brace/theme/twilight');
const NOTE_TAG_BAR_FEATURE_ENABLED = false;
class NoteTextComponent extends React.Component {
constructor() {
super();
this.localSearchDefaultState = {
query: '',
selectedIndex: 0,
resultCount: 0,
};
this.state = {
note: null,
noteMetadata: '',
@@ -53,6 +66,7 @@ class NoteTextComponent extends React.Component {
scrollHeight: null,
editorScrollTop: 0,
newNote: null,
noteTags: [],
// If the current note was just created, and the title has never been
// changed by the user, this variable contains that note ID. Used
@@ -60,6 +74,8 @@ class NoteTextComponent extends React.Component {
newAndNoTitleChangeNoteId: null,
bodyHtml: '',
lastKeys: [],
showLocalSearch: false,
localSearch: Object.assign({}, this.localSearchDefaultState),
};
this.lastLoadedNoteId_ = null;
@@ -69,8 +85,10 @@ class NoteTextComponent extends React.Component {
this.scheduleSaveTimeout_ = null;
this.restoreScrollTop_ = null;
this.lastSetHtml_ = '';
this.lastSetMarkers_ = [];
this.lastSetMarkers_ = '';
this.lastSetMarkersOptions_ = {};
this.selectionRange_ = null;
this.noteSearchBar_ = React.createRef();
// Complicated but reliable method to get editor content height
// https://github.com/ajaxorg/ace/issues/2046
@@ -209,11 +227,41 @@ class NoteTextComponent extends React.Component {
this.updateHtml(this.state.note.body);
}
}
this.noteSearchBar_change = (query) => {
this.setState({ localSearch: {
query: query,
selectedIndex: 0,
}});
}
const noteSearchBarNextPrevious = (inc) => {
const ls = Object.assign({}, this.state.localSearch);
ls.selectedIndex += inc;
if (ls.selectedIndex < 0) ls.selectedIndex = ls.resultCount - 1;
if (ls.selectedIndex >= ls.resultCount) ls.selectedIndex = 0;
this.setState({ localSearch: ls });
}
this.noteSearchBar_next = () => {
noteSearchBarNextPrevious(+1);
}
this.noteSearchBar_previous = () => {
noteSearchBarNextPrevious(-1);
}
this.noteSearchBar_close = () => {
this.setState({
showLocalSearch: false,
});
}
}
// Note:
// - What's called "cursor position" is expressed as { row: x, column: y } and is how Ace Editor get/set the cursor position
// - A "range" defines a selection with a start and end cusor position, expressed as { start: <CursorPos>, end: <CursorPos> }
// - A "range" defines a selection with a start and end cusor position, expressed as { start: <CursorPos>, end: <CursorPos> }
// - A "text offset" below is the absolute position of the cursor in the string, as would be used in the indexOf() function.
// The functions below are used to convert between the different types.
rangeToTextOffsets(range, body) {
@@ -261,7 +309,7 @@ class NoteTextComponent extends React.Component {
}
row++;
currentOffset += line.length + 1;
currentOffset += line.length + 1;
}
}
@@ -275,11 +323,12 @@ class NoteTextComponent extends React.Component {
async componentWillMount() {
let note = null;
let noteTags = [];
if (this.props.newNote) {
note = Object.assign({}, this.props.newNote);
} else if (this.props.noteId) {
note = await Note.load(this.props.noteId);
noteTags = this.props.noteTags || [];
}
const folder = note ? Folder.byId(this.props.folders, note.parent_id) : null;
@@ -289,6 +338,7 @@ class NoteTextComponent extends React.Component {
note: note,
folder: folder,
isLoading: false,
noteTags: noteTags
});
this.lastLoadedNoteId_ = note ? note.id : null;
@@ -300,6 +350,7 @@ class NoteTextComponent extends React.Component {
eventManager.on('todoToggle', this.onTodoToggle_);
ResourceFetcher.instance().on('downloadComplete', this.resourceFetcher_downloadComplete);
ExternalEditWatcher.instance().on('noteChange', this.externalEditWatcher_noteChange);
}
componentWillUnmount() {
@@ -313,8 +364,7 @@ class NoteTextComponent extends React.Component {
eventManager.removeListener('todoToggle', this.onTodoToggle_);
ResourceFetcher.instance().off('downloadComplete', this.resourceFetcher_downloadComplete);
this.destroyExternalEditWatcher();
ExternalEditWatcher.instance().off('noteChange', this.externalEditWatcher_noteChange);
}
async saveIfNeeded(saveIfNewNote = false) {
@@ -327,7 +377,7 @@ class NoteTextComponent extends React.Component {
}
await shared.saveNoteButton_press(this);
this.externalEditWatcherUpdateNoteFile(this.state.note);
ExternalEditWatcher.instance().updateNoteFile(this.state.note);
}
async saveOneProperty(name, value) {
@@ -361,14 +411,15 @@ class NoteTextComponent extends React.Component {
let note = null;
let loadingNewNote = true;
let parentFolder = null;
let noteTags = [];
if (props.newNote) {
note = Object.assign({}, props.newNote);
this.lastLoadedNoteId_ = null;
this.externalEditWatcherStopWatchingAll();
} else {
noteId = props.noteId;
loadingNewNote = stateNoteId !== noteId;
noteTags = await Tag.tagsByNoteId(noteId);
this.lastLoadedNoteId_ = noteId;
note = noteId ? await Note.load(noteId) : null;
if (noteId !== this.lastLoadedNoteId_) return; // Race condition - current note was changed while this one was loading
@@ -391,8 +442,6 @@ class NoteTextComponent extends React.Component {
// Scroll back to top when loading new note
if (loadingNewNote) {
this.externalEditWatcherStopWatchingAll();
this.editorMaxScrollTop_ = 0;
// HACK: To go around a bug in Ace editor, we first set the scroll position to 1
@@ -435,8 +484,7 @@ class NoteTextComponent extends React.Component {
}
}
if (note)
{
if (note) {
parentFolder = Folder.byId(props.folders, note.parent_id);
}
@@ -446,6 +494,7 @@ class NoteTextComponent extends React.Component {
webviewReady: webviewReady,
folder: parentFolder,
lastKeys: [],
noteTags: noteTags
};
if (!note) {
@@ -454,11 +503,33 @@ class NoteTextComponent extends React.Component {
newState.newAndNoTitleChangeNoteId = null;
}
if (!note || loadingNewNote) {
newState.showLocalSearch = false;
newState.localSearch = Object.assign({}, this.localSearchDefaultState);
}
this.lastSetHtml_ = '';
this.lastSetMarkers_ = [];
this.lastSetMarkers_ = '';
this.lastSetMarkersOptions_ = {};
this.setState(newState);
// https://github.com/laurent22/joplin/pull/893#discussion_r228025210
// @Abijeet: Had to add this check. If not, was going into an infinite loop where state was getting updated repeatedly.
// Since I'm updating the state, the componentWillReceiveProps was getting triggered again, where nextProps.newNote was still true, causing reloadNote to trigger again and again.
// Notes from Laurent: The selected note tags are part of the global Redux state because they need to be updated whenever tags are changed or deleted
// anywhere in the app. Thus it's not possible simple to load the tags here (as we won't have a way to know if they're updated afterwards).
// Perhaps a better way would be to move that code in the middleware, check for TAGS_DELETE, TAGS_UPDATE, etc. actions and update the
// selected note tags accordingly.
if (NOTE_TAG_BAR_FEATURE_ENABLED) {
if (!this.props.newNote) {
this.props.dispatch({
type: "SET_NOTE_TAGS",
items: noteTags,
});
}
}
this.updateHtml(newState.note ? newState.note.body : '');
}
@@ -467,6 +538,10 @@ class NoteTextComponent extends React.Component {
await this.reloadNote(nextProps);
} else if ('noteId' in nextProps && nextProps.noteId !== this.props.noteId) {
await this.reloadNote(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()) {
@@ -482,6 +557,26 @@ class NoteTextComponent extends React.Component {
return shared.isModified(this);
}
areNoteTagsModified(newTags, oldTags) {
if (!NOTE_TAG_BAR_FEATURE_ENABLED) return false;
if (!oldTags) return true;
if (newTags.length !== oldTags.length) return true;
for (let i = 0; i < newTags.length; ++i) {
let currNewTag = newTags[i];
for (let j = 0; j < oldTags.length; ++j) {
let currOldTag = oldTags[j];
if (currOldTag.id === currNewTag.id && currOldTag.updated_time !== currNewTag.updated_time) {
return true;
}
}
}
return false;
}
refreshNoteMetadata(force = null) {
return shared.refreshNoteMetadata(this, force);
}
@@ -518,6 +613,10 @@ class NoteTextComponent extends React.Component {
const newBody = this.mdToHtml_.handleCheckboxClick(msg, this.state.note.body);
this.saveOneProperty('body', newBody);
} else if (msg === 'setMarkerCount') {
const ls = Object.assign({}, this.state.localSearch);
ls.resultCount = arg0;
this.setState({ localSearch: ls });
} else if (msg === 'percentScroll') {
this.ignoreNextEditorScroll_ = true;
this.setEditorPercentScroll(arg0);
@@ -567,7 +666,8 @@ class NoteTextComponent extends React.Component {
if (!item) throw new Error('No item with ID ' + itemId);
if (item.type_ === BaseModel.TYPE_RESOURCE) {
if (item.fetch_status !== Resource.FETCH_STATUS_DONE || !!item.encryption_blob_encrypted) {
const localState = await Resource.localState(item);
if (localState.fetch_status !== Resource.FETCH_STATUS_DONE || !!item.encryption_blob_encrypted) {
bridge().showErrorMessageBox(_('This attachment is not downloaded or not decrypted yet.'));
return;
}
@@ -575,16 +675,10 @@ class NoteTextComponent extends React.Component {
bridge().openItem(filePath);
} else if (item.type_ === BaseModel.TYPE_NOTE) {
this.props.dispatch({
type: "FOLDER_SELECT",
id: item.parent_id,
type: "FOLDER_AND_NOTE_SELECT",
folderId: item.parent_id,
noteId: item.id,
});
setTimeout(() => {
this.props.dispatch({
type: 'NOTE_SELECT',
id: item.id,
});
}, 10);
} else {
throw new Error('Unsupported item type: ' + item.type_);
}
@@ -595,6 +689,8 @@ class NoteTextComponent extends React.Component {
} else {
require('electron').shell.openExternal(msg);
}
} else if (msg.indexOf('#') === 0) {
// This is an internal anchor, which is handled by the WebView so skip this case
} else {
bridge().showErrorMessageBox(_('Unsupported link or message: %s', msg));
}
@@ -797,6 +893,7 @@ 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'];
@@ -812,45 +909,54 @@ class NoteTextComponent extends React.Component {
}
async doCommand(command) {
if (!command || !this.state.note) return;
if (!command) return;
let commandProcessed = true;
let fn = null;
if (command.name === 'exportPdf' && this.webview_) {
const path = bridge().showSaveDialog({
filters: [{ name: _('PDF File'), extensions: ['pdf']}],
defaultPath: safeFilename(this.state.note.title),
});
if (command.name === 'exportPdf') {
fn = this.commandSavePdf;
} else if (command.name === 'print') {
fn = this.commandPrint;
}
if (path) {
this.webview_.printToPDF({}, (error, data) => {
if (error) {
bridge().showErrorMessageBox(error.message);
} else {
shim.fsDriver().writeFile(path, data, 'buffer');
}
});
if (this.state.note) {
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;
}
} else if (command.name === 'print' && this.webview_) {
this.webview_.print();
} else if (command.name === 'textBold') {
this.commandTextBold();
} else if (command.name === 'textItalic') {
this.commandTextItalic();
} else if (command.name === 'insertDateTime' ) {
this.commandDateTime();
} else if (command.name === 'commandStartExternalEditing') {
this.commandStartExternalEditing();
} else {
commandProcessed = false;
}
if (commandProcessed) {
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: null,
});
if (!fn) return;
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: null,
});
requestAnimationFrame(() => {
fn = fn.bind(this);
fn();
});
}
commandShowLocalSearch() {
if (this.state.showLocalSearch) {
this.noteSearchBar_.current.wrappedInstance.focus();
} else {
this.setState({ showLocalSearch: true });
}
this.props.dispatch({
type: 'NOTE_VISIBLE_PANES_SET',
panes: ['editor', 'viewer'],
});
}
async commandAttachFile(filePaths = null) {
@@ -895,42 +1001,80 @@ class NoteTextComponent extends React.Component {
});
}
externalEditWatcher() {
if (!this.externalEditWatcher_) {
this.externalEditWatcher_ = new ExternalEditWatcher((action) => { return this.props.dispatch(action) });
this.externalEditWatcher_.setLogger(reg.logger());
this.externalEditWatcher_.on('noteChange', this.externalEditWatcher_noteChange);
printTo_(target, options) {
if (this.props.selectedNoteIds.length !== 1 || !this.webview_) {
throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
}
return this.externalEditWatcher_;
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.forceUpdate();
const restoreSettings = () => {
Setting.setValue('theme', previousTheme);
this.lastSetHtml_ = '';
this.updateHtml(previousBody);
this.forceUpdate();
}
setTimeout(() => {
if (target === 'pdf') {
this.webview_.printToPDF({}, (error, data) => {
restoreSettings();
if (error) {
bridge().showErrorMessageBox(error.message);
} else {
shim.fsDriver().writeFile(options.path, data, 'buffer');
}
});
} else if (target === 'printer') {
this.webview_.print();
restoreSettings();
}
}, 100);
}
externalEditWatcherUpdateNoteFile(note) {
if (this.externalEditWatcher_) this.externalEditWatcher().updateNoteFile(note);
commandSavePdf() {
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;
this.printTo_('pdf', { path: path });
} catch (error) {
bridge().showErrorMessageBox(error.message);
}
}
externalEditWatcherStopWatchingAll() {
if (this.externalEditWatcher_) this.externalEditWatcher().stopWatchingAll();
}
destroyExternalEditWatcher() {
if (!this.externalEditWatcher_) return;
this.externalEditWatcher_.off('noteChange', this.externalEditWatcher_noteChange);
this.externalEditWatcher_.stopWatchingAll();
this.externalEditWatcher_ = null;
commandPrint() {
try {
this.printTo_('printer');
} catch (error) {
bridge().showErrorMessageBox(error.message);
}
}
async commandStartExternalEditing() {
try {
await this.externalEditWatcher().openAndWatch(this.state.note);
await ExternalEditWatcher.instance().openAndWatch(this.state.note);
} catch (error) {
bridge().showErrorMessageBox(_('Error opening note in editor: %s', error.message));
}
}
async commandStopExternalEditing() {
this.externalEditWatcherStopWatchingAll();
ExternalEditWatcher.instance().stopWatching(this.state.note.id);
}
async commandSetTags() {
@@ -1356,14 +1500,32 @@ class NoteTextComponent extends React.Component {
paddingLeft: 8,
paddingRight: 8,
marginRight: rootStyle.paddingLeft,
color: theme.color,
backgroundColor: theme.backgroundColor,
border: '1px solid',
borderColor: theme.dividerColor,
};
const toolbarStyle = {
marginBottom: 10,
};
const bottomRowHeight = rootStyle.height - titleBarStyle.height - titleBarStyle.marginBottom - titleBarStyle.marginTop - theme.toolbarHeight - toolbarStyle.marginBottom;
const tagStyle = {
marginBottom: 10,
height: 30
};
const searchBarHeight = this.state.showLocalSearch ? 35 : 0;
let bottomRowHeight = 0;
if (NOTE_TAG_BAR_FEATURE_ENABLED) {
bottomRowHeight = rootStyle.height - titleBarStyle.height - titleBarStyle.marginBottom - titleBarStyle.marginTop - theme.toolbarHeight - tagStyle.height - tagStyle.marginBottom;
} else {
toolbarStyle.marginBottom = 10;
bottomRowHeight = rootStyle.height - titleBarStyle.height - titleBarStyle.marginBottom - titleBarStyle.marginTop - theme.toolbarHeight - toolbarStyle.marginBottom;
}
bottomRowHeight -= searchBarHeight;
const viewerStyle = {
width: Math.floor(innerWidth / 2),
height: bottomRowHeight,
@@ -1383,7 +1545,10 @@ class NoteTextComponent extends React.Component {
verticalAlign: 'top',
paddingTop: paddingTop + 'px',
lineHeight: theme.textAreaLineHeight + 'px',
fontSize: theme.fontSize + 'px',
fontSize: theme.editorFontSize + 'px',
color: theme.color,
backgroundColor: theme.backgroundColor,
editorTheme: theme.editorTheme,
};
if (visiblePanes.indexOf('viewer') < 0) {
@@ -1414,16 +1579,34 @@ class NoteTextComponent extends React.Component {
const htmlHasChanged = this.lastSetHtml_ !== html;
if (htmlHasChanged) {
this.webview_.send('setHtml', html);
let options = {codeTheme: theme.codeThemeCss};
this.webview_.send('setHtml', html, options);
this.lastSetHtml_ = html;
}
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
const keywords = search ? Search.keywords(search.query_pattern) : [];
let keywords = [];
const markerOptions = {};
if (htmlHasChanged || !ArrayUtils.contentEquals(this.lastSetMarkers_, keywords)) {
this.lastSetMarkers_ = [];
this.webview_.send('setMarkers', keywords);
if (this.state.showLocalSearch) {
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);
if (search) {
const parsedQuery = SearchEngine.instance().parseQuery(search.query_pattern);
keywords = SearchEngine.instance().allParsedQueryTerms(parsedQuery);
}
}
const keywordHash = JSON.stringify(keywords);
if (htmlHasChanged || keywordHash !== this.lastSetMarkers_ || !ObjectUtils.fieldsEqual(this.lastSetMarkersOptions_, markerOptions)) {
this.lastSetMarkers_ = keywordHash;
this.lastSetMarkersOptions_ = Object.assign({}, markerOptions);
this.webview_.send('setMarkers', keywords, markerOptions);
}
}
@@ -1443,6 +1626,11 @@ class NoteTextComponent extends React.Component {
placeholder={ this.props.newNote ? _('Creating new %s...', isTodo ? _('to-do') : _('note')) : '' }
/>
const tagList = !NOTE_TAG_BAR_FEATURE_ENABLED ? null : <TagList
style={tagStyle}
items={this.state.noteTags}
/>;
const titleBarMenuButton = <IconButton style={{
display: 'flex',
}} iconName="fa-caret-down" theme={this.props.theme} onClick={() => { this.itemContextMenu() }} />
@@ -1482,7 +1670,7 @@ class NoteTextComponent extends React.Component {
const editor = <AceEditor
value={body}
mode="markdown"
theme="chrome"
theme={editorRootStyle.editorTheme}
style={editorRootStyle}
width={editorStyle.width + 'px'}
height={editorStyle.height + 'px'}
@@ -1506,6 +1694,17 @@ class NoteTextComponent extends React.Component {
highlightActiveLine={false}
/>
const noteSearchBarComp = !this.state.showLocalSearch ? null : (
<NoteSearchBar
ref={this.noteSearchBar_}
style={{display: 'flex', height:searchBarHeight,width:innerWidth, borderTop: '1px solid ' + theme.dividerColor}}
onChange={this.noteSearchBar_change}
onNext={this.noteSearchBar_next}
onPrevious={this.noteSearchBar_previous}
onClose={this.noteSearchBar_close}
/>
);
return (
<div style={rootStyle} onDrop={this.onDrop_}>
<div style={titleBarStyle}>
@@ -1514,8 +1713,11 @@ class NoteTextComponent extends React.Component {
{ false ? titleBarMenuButton : null }
</div>
{ toolbar }
{ tagList }
{ editor }
{ viewer }
<div style={{clear:'both'}}/>
{ noteSearchBarComp }
</div>
);
}
@@ -1525,6 +1727,8 @@ class NoteTextComponent extends React.Component {
const mapStateToProps = (state) => {
return {
noteId: state.selectedNoteIds.length === 1 ? state.selectedNoteIds[0] : null,
selectedNoteIds: state.selectedNoteIds,
noteTags: state.selectedNoteTags,
folderId: state.selectedFolderId,
itemType: state.selectedItemType,
folders: state.folders,
@@ -1537,9 +1741,10 @@ const mapStateToProps = (state) => {
searches: state.searches,
selectedSearchId: state.selectedSearchId,
watchedNoteFiles: state.watchedNoteFiles,
customCss: state.customCss,
};
};
const NoteText = connect(mapStateToProps)(NoteTextComponent);
module.exports = { NoteText };
module.exports = { NoteText };

View File

@@ -73,14 +73,14 @@ class OneDriveLoginScreenComponent extends React.Component {
const style = this.props.style;
const theme = themeStyle(this.props.theme);
const headerStyle = {
width: style.width,
};
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
const webviewStyle = {
width: this.props.style.width,
height: this.props.style.height - theme.headerHeight,
overflow: 'hidden',
color: theme.color,
backgroundColor: theme.backgroundColor,
};
const headerButtons = [
@@ -109,4 +109,4 @@ const mapStateToProps = (state) => {
const OneDriveLoginScreen = connect(mapStateToProps)(OneDriveLoginScreenComponent);
module.exports = { OneDriveLoginScreen };
module.exports = { OneDriveLoginScreen };

View File

@@ -59,7 +59,7 @@ class PromptDialog extends React.Component {
};
this.styles_.promptDialog = {
backgroundColor: 'white',
backgroundColor: theme.backgroundColor,
padding: 16,
display: 'inline-block',
boxShadow: '6px 6px 20px rgba(0,0,0,0.5)',
@@ -69,6 +69,10 @@ class PromptDialog extends React.Component {
minWidth: theme.buttonMinWidth,
minHeight: theme.buttonMinHeight,
marginLeft: 5,
color: theme.color,
backgroundColor: theme.backgroundColor,
border: '1px solid',
borderColor: theme.dividerColor,
};
this.styles_.label = {
@@ -82,6 +86,10 @@ class PromptDialog extends React.Component {
this.styles_.input = {
width: 0.5 * width,
maxWidth: 400,
color: theme.color,
backgroundColor: theme.backgroundColor,
border: '1px solid',
borderColor: theme.dividerColor,
};
this.styles_.desc = Object.assign({}, theme.textStyle, {
@@ -142,6 +150,7 @@ class PromptDialog extends React.Component {
if (this.props.inputType === 'datetime') {
inputComp = <Datetime
value={this.state.answer}
inputProps={{style: styles.input}}
dateFormat={time.dateFormat()}
timeFormat={time.timeFormat()}
onChange={(momentObject) => onDateTimeChange(momentObject)}
@@ -166,7 +175,7 @@ class PromptDialog extends React.Component {
<div style={styles.modalLayer}>
<div style={styles.promptDialog}>
<label style={styles.label}>{this.props.label ? this.props.label : ''}</label>
<div style={{display: 'inline-block'}}>
<div style={{display: 'inline-block', color: 'black', backgroundColor: theme.backgroundColor}}>
{inputComp}
{descComp}
</div>
@@ -180,4 +189,4 @@ class PromptDialog extends React.Component {
}
module.exports = { PromptDialog };
module.exports = { PromptDialog };

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");
@@ -12,6 +13,7 @@ const { bridge } = require("electron").remote.require("./bridge");
const Menu = bridge().Menu;
const MenuItem = bridge().MenuItem;
const InteropServiceHelper = require("../InteropServiceHelper.js");
const { shim } = require('lib/shim');
class SideBarComponent extends React.Component {
@@ -22,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]));
@@ -78,6 +80,11 @@ class SideBarComponent extends React.Component {
id: folderId,
});
};
this.state = {
tagHeaderIsExpanded: Setting.value('tagHeaderIsExpanded'),
folderHeaderIsExpanded: Setting.value('folderHeaderIsExpanded')
};
}
style() {
@@ -178,6 +185,35 @@ class SideBarComponent extends React.Component {
return style;
}
clearForceUpdateDuringSync() {
if (this.forceUpdateDuringSyncIID_) {
clearInterval(this.forceUpdateDuringSyncIID_);
this.forceUpdateDuringSyncIID_ = 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.
// https://github.com/laurent22/joplin/issues/312#issuecomment-429472193
if (!prevProps.syncStarted && this.props.syncStarted) {
this.clearForceUpdateDuringSync();
this.forceUpdateDuringSyncIID_ = setInterval(() => {
this.forceUpdate();
}, 2000);
}
if (prevProps.syncStarted && !this.props.syncStarted) this.clearForceUpdateDuringSync();
}
}
componentWillUnmount() {
this.clearForceUpdateDuringSync();
}
itemContextMenu(event) {
const itemId = event.target.getAttribute("data-id");
if (itemId === Folder.conflictFolderId()) return;
@@ -273,7 +309,7 @@ class SideBarComponent extends React.Component {
);
}
if (itemType === BaseModel.TYPE_TAG) {
if (itemType === BaseModel.TYPE_TAG) {
menu.append(
new MenuItem({
label: _('Rename'),
@@ -410,14 +446,48 @@ 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>;
}
return (
<div style={style} key={key} {...extraProps}>
<div 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>
);
}
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 iconName = type === "sync" ? "fa-refresh" : "fa-times";
@@ -447,24 +517,27 @@ class SideBarComponent extends React.Component {
});
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);
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));
items.push(
<div className="tags" key="tag_items">
<div className="tags" key="tag_items" style={{display: this.state.tagHeaderIsExpanded ? 'block': 'none'}}>
{tagItems}
</div>
);
@@ -475,7 +548,13 @@ class SideBarComponent extends React.Component {
decryptionReportText = _('Decrypting items: %d/%d', this.props.decryptionWorker.itemIndex + 1, this.props.decryptionWorker.itemCount);
}
let resourceFetcherText = '';
if (this.props.resourceFetcher && this.props.resourceFetcher.toFetchCount) {
resourceFetcherText = _('Fetching resources: %d', this.props.resourceFetcher.toFetchCount);
}
let lines = Synchronizer.reportToLines(this.props.syncReport);
if (resourceFetcherText) lines.push(resourceFetcherText);
if (decryptionReportText) lines.push(decryptionReportText);
const syncReportText = [];
for (let i = 0; i < lines.length; i++) {
@@ -517,6 +596,7 @@ const mapStateToProps = state => {
theme: state.settings.theme,
collapsedFolderIds: state.collapsedFolderIds,
decryptionWorker: state.decryptionWorker,
resourceFetcher: state.resourceFetcher,
};
};

View File

@@ -47,17 +47,14 @@ class StatusScreenComponent extends React.Component {
const theme = themeStyle(this.props.theme);
const style = this.props.style;
const headerStyle = {
width: style.width,
};
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
const containerPadding = 10;
const containerStyle = {
const containerStyle = Object.assign({}, theme.containerStyle, {
padding: containerPadding,
overflowY: 'auto',
height: style.height - theme.headerHeight - containerPadding * 2,
};
});
function renderSectionTitleHtml(key, title) {
return <h2 key={'section_' + key} style={theme.h2Style}>{title}</h2>
@@ -134,4 +131,4 @@ const mapStateToProps = (state) => {
const StatusScreen = connect(mapStateToProps)(StatusScreenComponent);
module.exports = { StatusScreen };
module.exports = { StatusScreen };

View File

@@ -0,0 +1,21 @@
const React = require('react');
const { connect } = require('react-redux');
const { themeStyle } = require('../theme.js');
class TagItemComponent extends React.Component {
render() {
const theme = themeStyle(this.props.theme);
const style = Object.assign({}, theme.tagStyle);
const title = this.props.title;
return <span style={style}>{title}</span>;
}
}
const mapStateToProps = (state) => {
return { theme: state.settings.theme };
};
const TagItem = connect(mapStateToProps)(TagItemComponent);
module.exports = TagItem;

View File

@@ -0,0 +1,50 @@
const React = require('react');
const { connect } = require('react-redux');
const { themeStyle } = require('../theme.js');
const TagItem = require('./TagItem.min.js');
class TagListComponent extends React.Component {
render() {
const style = Object.assign({}, this.props.style);
const theme = themeStyle(this.props.theme);
const tags = this.props.items;
style.display = 'flex';
style.flexDirection = 'row';
style.borderBottom = '1px solid ' + theme.dividerColor;
style.boxSizing = 'border-box';
style.fontSize = theme.fontSize;
const tagItems = [];
if (tags || tags.length > 0) {
// Sort by id for now, but probably needs to be changed in the future.
tags.sort((a, b) => { return a.title < b.title ? -1 : +1; });
for (let i = 0; i < tags.length; i++) {
const props = {
title: tags[i].title,
key: tags[i].id
};
tagItems.push(<TagItem {...props} />);
}
}
if (tagItems.length === 0) {
style.visibility = 'hidden';
}
return (
<div className="tag-list" style={style}>
{ tagItems }
</div>
)
}
}
const mapStateToProps = (state) => {
return { theme: state.settings.theme };
};
const TagList = connect(mapStateToProps)(TagListComponent);
module.exports = TagList;

View File

@@ -30,4 +30,4 @@ class Dialogs {
const dialogs = new Dialogs();
module.exports = dialogs;
module.exports = dialogs;

View File

@@ -0,0 +1,77 @@
/*
Atom One Dark With support for ReasonML by Gidi Morris, based off work by Daniel Gamage
Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
line-height: 1.3em;
color: #abb2bf;
background: #282c34;
border-radius: 5px;
}
.hljs-keyword, .hljs-operator {
color: #F92672;
}
.hljs-pattern-match {
color: #F92672;
}
.hljs-pattern-match .hljs-constructor {
color: #61aeee;
}
.hljs-function {
color: #61aeee;
}
.hljs-function .hljs-params {
color: #A6E22E;
}
.hljs-function .hljs-params .hljs-typing {
color: #FD971F;
}
.hljs-module-access .hljs-module {
color: #7e57c2;
}
.hljs-constructor {
color: #e2b93d;
}
.hljs-constructor .hljs-string {
color: #9CCC65;
}
.hljs-comment, .hljs-quote {
color: #b18eb1;
font-style: italic;
}
.hljs-doctag, .hljs-formula {
color: #c678dd;
}
.hljs-section, .hljs-name, .hljs-selector-tag, .hljs-deletion, .hljs-subst {
color: #e06c75;
}
.hljs-literal {
color: #56b6c2;
}
.hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string {
color: #98c379;
}
.hljs-built_in, .hljs-class .hljs-title {
color: #e6c07b;
}
.hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number {
color: #d19a66;
}
.hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title {
color: #61aeee;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
.hljs-link {
text-decoration: underline;
}

View File

@@ -16,6 +16,11 @@
}
mark {
background: #F3B717;
color: black;
}
.mark-selected {
background: #CF3F00;
color: white;
}
@@ -32,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');
@@ -59,7 +65,7 @@
let hljsScriptAdded = false;
let hljsLoaded = false;
function loadHljs(callback) {
function loadHljs(options) {
hljsScriptAdded = true;
const script = document.createElement('script');
@@ -74,16 +80,16 @@
link.rel = 'stylesheet';
// https://ace.c9.io/build/kitchen-sink.html
// https://highlightjs.org/static/demo/
link.href = 'highlight/styles/atom-one-light.css';
link.href = 'highlight/styles/' + options.codeTheme;
document.getElementById('hlScriptContainer').appendChild(link);
}
function loadAndApplyHljs() {
function loadAndApplyHljs(options) {
var codeElements = document.getElementsByClassName('code');
if (!codeElements.length) return;
if (!hljsScriptAdded) {
this.loadHljs();
this.loadHljs(options);
return;
}
@@ -138,11 +144,13 @@
ipc.setHtml = (event) => {
const html = event.html;
markJsHackMarkerInserted_ = false;
updateBodyHeight();
contentElement.innerHTML = html;
loadAndApplyHljs();
loadAndApplyHljs(event.options);
// Remove the bullet from "ul" for checkbox lists and extra padding
// const checkboxes = document.getElementsByClassName('checkbox');
@@ -191,8 +199,36 @@
setPercentScroll(percent);
}
// HACK for Mark.js bug - https://github.com/julmot/mark.js/issues/127
let markJsHackMarkerInserted_ = false;
function addMarkJsSpaceHack(document) {
if (markJsHackMarkerInserted_) return;
const prepareElementsForMarkJs = (elements, type) => {
// const markJsHackMarker_ = '&#8203; &#8203;'
const markJsHackMarker_ = ' ';
for (let i = 0; i < elements.length; i++) {
if (!type) {
elements[i].innerHTML = elements[i].innerHTML + markJsHackMarker_;
} else if (type === 'insertBefore') {
elements[i].insertAdjacentHTML('beforeBegin', markJsHackMarker_);
}
}
}
prepareElementsForMarkJs(document.getElementsByTagName('p'));
prepareElementsForMarkJs(document.getElementsByTagName('div'));
prepareElementsForMarkJs(document.getElementsByTagName('br'), 'insertBefore');
markJsHackMarkerInserted_ = true;
}
let mark_ = null;
function setMarkers(keywords) {
let markSelectedElement_ = null;
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'],
@@ -200,26 +236,61 @@
});
}
mark_.mark(keywords);
addMarkJsSpaceHack(document);
mark_.unmark()
if (markSelectedElement_) markSelectedElement_.classList.remove('mark-selected');
let selectedElement = null;
let elementIndex = 0;
const onEachElement = (element) => {
if (!('selectedIndex' in options)) return;
if (('selectedIndex' in options) && elementIndex === options.selectedIndex) {
markSelectedElement_ = element;
element.classList.add('mark-selected');
selectedElement = element;
}
elementIndex++;
}
for (let i = 0; i < keywords.length; i++) {
let keyword = keywords[i];
markJsUtils.markKeyword(mark_, keyword, {
pregQuote: pregQuote,
replaceRegexDiacritics: replaceRegexDiacritics,
}, {
each: onEachElement,
});
}
ipcProxySendToHost('setMarkerCount', elementIndex);
if (selectedElement) selectedElement.scrollIntoView();
}
let markLoaded_ = false;
ipc.setMarkers = (event) => {
const keywords = event.keywords;
const options = event.options;
if (!keywords.length && !markLoaded_) return;
if (!markLoaded_) {
const script = document.createElement('script');
script.onload = function() {
setMarkers(keywords);
setMarkers(keywords, options);
};
script.src = '../../node_modules/mark.js/dist/mark.min.js';
document.getElementById('markScriptContainer').appendChild(script);
markLoaded_ = true;
} else {
setMarkers(keywords);
setMarkers(keywords, options);
}
}
@@ -276,12 +347,48 @@
}
});
// Prevent URLs added via <a> tags from being opened within the application itself
document.addEventListener('click', function(event) {
const t = event.target;
if (t && t.nodeName === 'A' && !t.hasAttribute('data-from-md')) {
function handleInternalLink(event, anchorNode) {
const href = anchorNode.getAttribute('href');
if (href.indexOf('#') === 0) {
event.preventDefault();
ipcProxySendToHost(t.getAttribute('href'));
location.hash = href;
return true;
}
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 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 (!anchor.hasAttribute('data-from-md')) {
if (handleInternalLink(event, anchor)) return;
event.preventDefault();
ipcProxySendToHost(anchor.getAttribute('href'));
return;
}
// If this is an internal link, jump to the anchor directly
if (anchor.hasAttribute('data-from-md')) {
if (handleInternalLink(event, anchor)) return;
}
});
@@ -307,4 +414,4 @@
</script>
</body>
</html>
</html>

View File

@@ -5,16 +5,16 @@
const ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.on('setHtml', (event, html) => {
window.postMessage({ target: 'webview', name: 'setHtml', data: { html: html } }, '*');
ipcRenderer.on('setHtml', (event, html, options) => {
window.postMessage({ target: 'webview', name: 'setHtml', data: { html: html, options: options } }, '*');
});
ipcRenderer.on('setPercentScroll', (event, percent) => {
window.postMessage({ target: 'webview', name: 'setPercentScroll', data: { percent: percent } }, '*');
});
ipcRenderer.on('setMarkers', (event, keywords) => {
window.postMessage({ target: 'webview', name: 'setMarkers', data: { keywords: keywords } }, '*');
ipcRenderer.on('setMarkers', (event, keywords, options) => {
window.postMessage({ target: 'webview', name: 'setMarkers', data: { keywords: keywords, options: options } }, '*');
});
window.addEventListener('message', (event) => {
@@ -33,4 +33,4 @@ window.addEventListener('message', (event) => {
} else {
throw new Error('Unsupported number of args');
}
});
});

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

View File

@@ -12,9 +12,9 @@ locales['hr_HR'] = require('./hr_HR.json');
locales['it_IT'] = require('./it_IT.json');
locales['ja_JP'] = require('./ja_JP.json');
locales['ko'] = require('./ko.json');
locales['nb_NO'] = require('./nb_NO.json');
locales['nl_BE'] = require('./nl_BE.json');
locales['nl_NL'] = require('./nl_NL.json');
locales['no'] = require('./no.json');
locales['pt_BR'] = require('./pt_BR.json');
locales['ro'] = require('./ro.json');
locales['ru_RU'] = require('./ru_RU.json');

File diff suppressed because one or more lines are too long

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