1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-09-05 20:56:22 +02:00

Compare commits

...

65 Commits

Author SHA1 Message Date
Laurent Cozic
5e0f2642e3 Android release v1.0.118 2018-04-30 17:41:39 +01:00
Laurent Cozic
93966b0fa1 Mobile: Trying to upgrade to React Native 0.55 2018-04-30 17:38:19 +01:00
Laurent Cozic
e90abf3517 Updated translations 2018-04-28 11:44:07 +02:00
Laurent Cozic
d3fa0dce96 Updated translations 2018-04-28 11:40:55 +02:00
Laurent Cozic
58a7c2fa94 Doc: Added forum link to website 2018-04-28 11:40:27 +02:00
Laurent Cozic
962a8700c2 Added ptBR translation 2018-04-28 11:35:28 +02:00
Laurent Cozic
b5c704e2bb Doc: Updated website 2018-04-25 20:08:59 +02:00
Laurent Cozic
e7b52b19d7 Doc: Updated website 2018-04-25 20:04:25 +02:00
Laurent Cozic
903c2e6d92 Doc: Updated website 2018-04-25 19:25:54 +02:00
Laurent Cozic
abcb1ac760 Doc: Update website 2018-04-25 19:24:13 +02:00
Laurent Cozic
b6bf76cc4c Doc: Mentioned forums and other community-related links 2018-04-25 11:59:43 +02:00
Laurent Cozic
2bf87655da Electron: Various tweaks to get PortableApps format to work 2018-04-23 21:50:29 +02:00
Laurent Cozic
d4b19f19a1 Electron: Use built-in image resizing instead of Sharp 2018-04-22 21:10:43 +02:00
Laurent Cozic
d8ccc38d5b All: Better handling of resources that are incorrectly flagged as encrypted 2018-04-22 14:33:12 +02:00
Laurent Cozic
4e3b8a06ea Merge branch 'master' of github.com:laurent22/joplin 2018-04-19 19:43:27 +02:00
Laurent Cozic
363632ffa7 Doc: Added Arch Linux package info 2018-04-19 19:42:44 +02:00
Laurent Cozic
994c99f47f Merge pull request #442 from solariz/master
Common EU Date format DD.MM.YYYY added, issue #405
2018-04-19 19:32:22 +02:00
Marco G
96571baadc Common EU Date format DD.MM.YYYY added, issue #405 2018-04-19 17:03:16 +02:00
Laurent Cozic
4ce2b2c948 Doc: Added link to AUR package 2018-04-19 11:14:43 +02:00
Laurent Cozic
5d69f7a0a7 Doc: Added link to AUR package 2018-04-19 11:13:33 +02:00
Laurent Cozic
bcb1f36ad8 Merge pull request #428 from Abijeet/master
Add the toggle sidebar option to the View app menu bar.
2018-04-17 11:17:24 +02:00
Abijeet
34c65a686c Add the toggle sidebar option to the View app menu bar.
Towards #183

Signed-off-by: Abijeet <abijeetpatro@gmail.com>
2018-04-16 22:57:36 +05:30
Laurent Cozic
0b32741a12 Electron: Resolves #252: Allow enabling tray icon in Linux 2018-04-16 19:18:28 +02:00
Laurent Cozic
dbb321a3cc CLI: Resolves #411: Fixed documentation 2018-04-16 16:29:34 +02:00
Laurent Cozic
a6e4f47adf All: Resolves #389: Documented method being used to encrypt master keys 2018-04-16 16:16:31 +02:00
Laurent Cozic
fb6dee32ac All: Resolves #380: Fixed documentation inconsitencies for webdav url 2018-04-16 16:09:38 +02:00
Laurent Cozic
984dd6f2c0 Electron: Rotate sidebar icon when it is hidden 2018-04-16 15:32:33 +02:00
Laurent Cozic
02bde2c6e9 Merge pull request #424 from Abijeet/master
Adds support to toggle the sidebar.
2018-04-16 15:24:33 +02:00
Laurent Cozic
782d24cc04 Updated Spanish translation 2018-04-16 15:16:29 +02:00
Laurent Cozic
4d0af575e5 Mobile: Resolves #360: Don't crash if theme not set and improved logging. 2018-04-16 15:15:29 +02:00
Laurent Cozic
be8bda8e73 Added Joplin letter as SVG 2018-04-16 11:20:33 +02:00
Abijeet
1242de532e Adds support to toggle the sidebar.
Closes #183

Signed-off-by: Abijeet <abijeetpatro@gmail.com>
2018-04-15 21:20:39 +05:30
Laurent Cozic
7d7ec7f15e Update translation 2018-04-11 21:39:37 +02:00
Laurent Cozic
ca112ec5d3 Merge branch 'master' of github.com:laurent22/joplin 2018-04-11 21:39:13 +02:00
Laurent Cozic
5deb8cf76d Update translation 2018-04-11 19:27:45 +02:00
Laurent Cozic
a2c9737c17 utf-8 2018-04-11 19:27:20 +02:00
Laurent Cozic
d3fca3d6cc Mobile: Fixes #358: Fix cursor color in dark mode 2018-04-11 19:25:07 +02:00
Laurent Cozic
d5574098f0 Resolves #392: Clarified deletion of resources 2018-04-09 21:00:47 +02:00
Laurent Cozic
f5a683f25c Update issue_template.md 2018-04-09 20:58:35 +02:00
Laurent Cozic
5f04adb392 Merge pull request #376 from mjjzf/master
Updated Danish translation
2018-04-05 22:41:21 +02:00
Laurent Cozic
edd0f7e255 Update issue_template.md 2018-04-04 21:50:45 +02:00
Laurent Cozic
67145d9104 Updated website 2018-04-04 21:48:42 +02:00
Laurent Cozic
003e2afff7 Update readme downloads 2018-04-04 21:44:25 +02:00
Laurent Cozic
6e9d70c5cb Electron release v1.0.83 2018-04-04 21:25:45 +02:00
Laurent Cozic
4821b4cdf2 Electron: Fixes #365: Cannot paste in Dropbox screen 2018-04-04 21:25:27 +02:00
Morten Juhl-Johansen Zölde-Fejer
734d4db431 Updated Danish translation
Translated new strings, minor corrections
2018-04-04 12:32:30 +02:00
Morten Juhl-Johansen Zölde-Fejer
317aaed0ac Updated Danish translation
New strings and minor corrections.
2018-04-04 11:52:26 +02:00
Laurent Cozic
9778098d6c Merge pull request #366 from bimlas/patch-1
Clarify Windows build dependencies
2018-04-02 21:17:10 +02:00
Bimba Laszlo
5b1755f988 Clarify Windows build dependencies 2018-04-02 19:14:04 +02:00
Laurent Cozic
2a772895dd ios v10.0.20 2018-03-31 20:24:32 +02:00
Laurent Cozic
5fbb01cf2f Electron release v1.0.82 2018-03-31 19:23:06 +01:00
Laurent Cozic
f9e0870b4e Android release v1.0.116 2018-03-31 19:21:07 +01:00
Laurent Cozic
a58f1e9b4b Update Galician translation 2018-03-31 19:19:11 +01:00
Laurent Cozic
6fc0d89b30 Update website 2018-03-29 20:55:15 +01:00
Laurent Cozic
2dcadab7d2 Update website 2018-03-29 20:50:18 +01:00
Laurent Cozic
bb3307e156 Update website 2018-03-29 20:48:22 +01:00
Laurent Cozic
ecd07f1209 Update website 2018-03-29 20:42:11 +01:00
Laurent Cozic
266cb1174f Update website 2018-03-29 20:36:34 +01:00
Laurent Cozic
bfb9b77b6e Update website 2018-03-29 20:25:37 +01:00
Laurent Cozic
01b1361dcb Update website 2018-03-29 20:21:14 +01:00
Laurent Cozic
3a921720d6 Update website 2018-03-29 20:17:11 +01:00
Laurent Cozic
cdfd3d9c31 Updated French translation and added Galician translation 2018-03-29 18:30:33 +01:00
Laurent Cozic
9961fb64bb Updated website 2018-03-29 00:52:27 +01:00
Laurent Cozic
3137c355cf Added stats and changelog document 2018-03-28 17:41:14 +00:00
Laurent Cozic
16abaf60d2 Update readme downloads 2018-03-28 09:14:24 +01:00
945 changed files with 12390 additions and 2683 deletions

62
Assets/JoplinLetter.svg Normal file
View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="116.54575mm"
height="131.19589mm"
viewBox="0 0 116.54575 131.19589"
version="1.1"
id="svg8"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="JoplinLetter.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="152.11122"
inkscape:cy="-26.090631"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-2.7903623,-2.175533)">
<path
style="fill:#000000;stroke-width:0.26458332"
d="m 43.790458,133.13317 c -8.32317,-1.11843 -12.937,-2.40956 -18.46857,-5.16822 -10.21924,-5.09644 -18.1023498,-13.95338 -21.1745998,-23.79038 -1.22214,-3.91319 -1.3607,-4.872332 -1.35685,-9.392712 0.003,-3.72804 0.0907,-4.66941 0.59927,-6.44569 1.0664,-3.7246 2.49409,-6.1704 5.19529,-8.90014 3.2574198,-3.29184 6.6565798,-4.77332 11.3929598,-4.96548 4.53189,-0.18388 7.54661,0.59927 10.40386,2.70266 1.82035,1.34007 3.67693,3.96421 4.71565,6.66525 0.65839,1.71204 0.70959,2.1839 0.90042,8.29756 0.19973,6.39855 0.36372,7.6318 1.39223,10.469902 1.40468,3.87611 3.78939,6.56189 7.33039,8.25588 3.20047,1.53108 5.63801,2.00183 9.60817,1.8556 2.58182,-0.0951 3.60332,-0.25442 5.15337,-0.80371 4.61358,-1.63493 8.46322,-5.31381 10.31326,-9.85579 1.91154,-4.693002 1.90785,-4.609372 1.90213,-43.127082 -0.005,-33.78395 -0.0106,-34.14337 -0.54484,-35.32188 -1.30698,-2.882895 -2.68223,-3.398165 -9.66971,-3.622945 l -5.12472,-0.16486 V 10.998334 2.175533 l 31.41927,0.06723 31.419272,0.06723 0.0697,8.755726 0.0697,8.755724 -5.09675,0.1793 c -2.82759,0.0995 -5.60596,0.33101 -6.24051,0.52006 -1.72896,0.5151 -2.82899,1.538795 -3.52569,3.281045 l -0.61059,1.5269 -0.16762,34.7927 c -0.16988,35.26321 -0.19381,36.08914 -1.18496,40.914372 -1.81292,8.82581 -8.301582,17.89221 -16.959672,23.69719 -6.95182,4.66099 -14.48972,7.21214 -24.82645,8.40235 -2.7431,0.31585 -14.57797,0.31433 -16.93333,-0.002 z"
id="path21"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -37,8 +37,6 @@ yarn dist
If there's an error `while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory`, run `sudo apt-get install libgconf-2-4`
For node-gyp to work, you might need to install the `windows-build-tools` using `npm install --global windows-build-tools`.
That will create the executable file in the `dist` directory.
From `/ElectronClient` you can also run `run.sh` to run the app for testing.
@@ -54,6 +52,10 @@ npm install
yarn dist
```
If node-gyp does not works (MSBUILD: error MSB3428: Could not load the Visual C++ component "VCBuild.exe"), you might need to install the `windows-build-tools` using `npm install --global windows-build-tools`.
If `yarn dist` fails, it may need administrative rights.
# 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 @@
# 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.
# Reporting a bug
Please check first that it [has not already been reported](https://github.com/laurent22/joplin/issues?utf8=%E2%9C%93&q=is%3Aissue). Also consider [enabling debug mode](https://github.com/laurent22/joplin/blob/master/readme/debugging.md) before reporting the issue so that you can provide as much details as possible to help fix it.
@@ -6,7 +10,7 @@ If possible, **please provide a screenshot**. A screenshot showing the problem i
# Feature requests
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. Adding a "+1" comment does nothing.
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

View File

@@ -76,7 +76,7 @@ class Command extends BaseCommand {
this.stdout('');
this.stdout(_('To move from one pane to another, press Tab or Shift+Tab.'));
this.stdout(_('Use the arrows and page up/down to scroll the lists and text areas (including this console).'));
this.stdout(_('To maximise/minimise the console, press "TC".'));
this.stdout(_('To maximise/minimise the console, press "tc".'));
this.stdout(_('To enter command line mode, press ":"'));
this.stdout(_('To exit command line mode, press ESCAPE'));
this.stdout(_('For the list of keyboard shortcuts and config options, type `help keymap`'));

View File

@@ -247,7 +247,8 @@ msgstr ""
"Pro pohyb v seznamech a textových polích (včetně této konzole) používejte "
"šipky a page up/down."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Pro maximalizaci/minimalizaci konzole stiskněte \"TC\"."
msgid "To enter command line mode, press \":\""
@@ -408,6 +409,16 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "Autentizace nebyla dokončena (nedostali jsme autentizační token)"
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr "Nepřihlášeno k %s. Prosím vyplňte chybějící přihlašovací údaje."
@@ -606,6 +617,9 @@ msgstr "Hledat ve všech poznámkách"
msgid "View"
msgstr "Zobrazit"
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr "Změňit layout editoru"
@@ -675,6 +689,9 @@ msgstr "Poznámky a nastavení uloženo v: %s"
msgid "Save"
msgstr "Uložit"
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -744,6 +761,11 @@ msgstr ""
"momentálně nejsou k dispozici. Je pravděpodobné, že tyto položky budou "
"staženy při synchronizaci."
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "Status"
@@ -861,6 +883,9 @@ msgstr "Vyčistit"
msgid "OneDrive Login"
msgstr "Přihlášení s OneDrive"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "Nastavení"
@@ -896,6 +921,9 @@ msgstr "Použití: %s"
msgid "Unknown flag: %s"
msgstr "Neznámý flag: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "Souborový systém"
@@ -1084,6 +1112,9 @@ msgstr "Při vytváření nové poznámky:"
msgid "Show tray icon"
msgstr "Zobrazovat ikonu v panelu"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr "Globální zoom"
@@ -1292,6 +1323,10 @@ msgstr "Zadejte nové tagy, nebo vyberte existující ze seznamu"
msgid "Joplin website"
msgstr "Web Joplinu"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Přihlásit se pomocí OneDrive"
#, javascript-format
msgid "Master Key %s"
msgstr "Master heslo %s"

View File

@@ -2,13 +2,13 @@
# Copyright (C) YEAR Laurent Cozic
# This file is distributed under the same license as the Joplin-CLI package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#
msgid ""
msgstr ""
"Project-Id-Version: Joplin-CLI 1.0.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"Last-Translator: Morten Juhl-Johansen Zölde-Fejér <mjjzf@syntaktisk."
"dk>Language-Team: \n"
"Language: da_DK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -127,7 +127,7 @@ msgid ""
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
"`status` and `target-status`."
msgstr ""
"Udfører E2EEE konfiguration. Kommandoer er `enable`(aktiver), "
"Udfører E2EE konfiguration. Kommandoer er `enable`(aktiver), "
"`disable`(sluk), `decrypt`(dekrypter), `status` og `target-status` (modtager-"
"status)."
@@ -163,8 +163,8 @@ msgstr "Rediger note."
msgid ""
"No text editor is defined. Please set it using `config editor <editor-path>`"
msgstr ""
"Ingen tekst editor er valgt. Vælg en ved at indstille `config editor "
"<editor-path>`"
"Ingen teksteditor er valgt. Vælg en ved at indstille `config editor <editor-"
"path>`"
msgid "No active notebook."
msgstr "Ingen aktiv notesbog."
@@ -247,7 +247,8 @@ msgstr ""
"Brug pilene og PageUp/PageDown for at rulle lister og tekst-områder (inkl. "
"denne konsol)"
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "For at maximere/ninimere konsollen, tryk \"TC\"."
msgid "To enter command line mode, press \":\""
@@ -410,6 +411,18 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "Godkendelse blev ikke fuldført (modtog ikke godkendelses token)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
"For at Joplin kan synkronisere med Dropbox, skal man igennem nedenstående "
"trin:"
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr "Trin 1: Åben denne URL i din browser for at autorisere applikationen:"
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr "Trin 2: Indtast koden, som er oplyst af Dropbox:"
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr "Ikke godkendt med %s. Indtast venligst manglende koder/info."
@@ -423,8 +436,8 @@ msgid ""
"taking place, you may delete the lock file at \"%s\" and resume the "
"operation."
msgstr ""
"Låse fil er allerede i brug. Hvis du ved at ingen synkronisering er i gang "
"kan du slette låse-filen \"%s\" og genoptage synkroniseringen."
"Låsefil er allerede i brug. Hvis du ved at ingen synkronisering er i gang "
"kan du slette låsefilen \"%s\" og genoptage synkroniseringen."
#, javascript-format
msgid "Synchronisation target: %s (%s)"
@@ -609,6 +622,9 @@ msgstr "Søg i alle noter"
msgid "View"
msgstr "Vis"
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr "Skift editor layout"
@@ -678,6 +694,9 @@ msgstr "Noter og indstillinger er gemt i: %s"
msgid "Save"
msgstr "Gem"
msgid "Submit"
msgstr "Gem"
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -749,6 +768,13 @@ msgstr ""
"app'en har ikke pt adgang til dem. Det er sandsynligt at de vil blive hentet "
"(på et eller andet tidspunkt) via synkroniseringen."
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
"Se dokumentationen for nærmere oplysninger om End-To-End-kryptering (E2EE) "
"og vejledning om hvordan det skal opsættes_"
msgid "Status"
msgstr "Status"
@@ -866,6 +892,9 @@ msgstr "Ryd/slet"
msgid "OneDrive Login"
msgstr "OneDrive login"
msgid "Dropbox Login"
msgstr "Dropbox Login"
msgid "Options"
msgstr "Muligheder"
@@ -901,6 +930,9 @@ msgstr "Forbrug: %s"
msgid "Unknown flag: %s"
msgstr "Ukendt flag: %s"
msgid "Dropbox"
msgstr "Dropbox"
msgid "File system"
msgstr "Fil system"
@@ -1089,6 +1121,9 @@ msgstr "Ved oprettelse af ny note:"
msgid "Show tray icon"
msgstr "Vis ikon på bundbjælke"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr "Global zoom procent"
@@ -1289,14 +1324,18 @@ msgid "Cancel synchronisation"
msgstr "Afbryd synkronisering"
msgid "New tags:"
msgstr ""
msgstr "Nye tags:"
msgid "Type new tags or select from list"
msgstr ""
msgstr "Indtast nye tags eller vælg fra listen"
msgid "Joplin website"
msgstr "Joplin hjemmeside"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Log på med OneDrive"
#, javascript-format
msgid "Master Key %s"
msgstr "Hoved nøgle %s"
@@ -1383,5 +1422,12 @@ msgstr "Du har ingen notesbøger. Opret en ved at klikke på (+) knappen."
msgid "Welcome"
msgstr "Velkommen"
#~ msgid ""
#~ "For more information about End-To-End Encryption (E2EE) and advices on "
#~ "how to enable it please check the documentation"
#~ msgstr ""
#~ "Se dokumentationen for nærmere oplysninger om End-To-End-kryptering "
#~ "(E2EE) og vejledning om hvordan det skal opsættes"
#~ msgid "Searches"
#~ msgstr "Søgninger"

View File

@@ -259,7 +259,8 @@ msgstr ""
"Benutze die Pfeiltasten und Bild hoch/runter um durch Listen und Texte zu "
"scrollen (inklusive diesem Terminal)."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Um das Terminal zu maximieren/minimieren, drücke \"TC\"."
msgid "To enter command line mode, press \":\""
@@ -429,6 +430,16 @@ msgstr ""
"Authentifizierung wurde nicht abgeschlossen (keinen Authentifizierung-Token "
"erhalten)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -635,6 +646,9 @@ msgstr "Alle Notizen durchsuchen"
msgid "View"
msgstr "Ansicht"
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr "Editor Layout umschalten"
@@ -704,6 +718,9 @@ msgstr "Notizen und Einstellungen werden gespeichert in: %s"
msgid "Save"
msgstr "Speichern"
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -774,6 +791,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr "Die Master-Keas dieser IDs werden für die Verschlüsselung einiger ..."
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "Status"
@@ -899,6 +921,9 @@ msgstr "Leeren"
msgid "OneDrive Login"
msgstr "OneDrive Login"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "Optionen"
@@ -935,6 +960,9 @@ msgstr "Nutzung: %s"
msgid "Unknown flag: %s"
msgstr "Unbekanntes Argument: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "Dateisystem"
@@ -1125,6 +1153,9 @@ msgstr "Wenn eine neue Notiz erstellt wird:"
msgid "Show tray icon"
msgstr "Zeige Tray Icon"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr "Zoomstufe der Benutzeroberfläche"
@@ -1337,6 +1368,10 @@ msgstr ""
msgid "Joplin website"
msgstr "Website von Joplin"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Mit OneDrive anmelden"
#, javascript-format
msgid "Master Key %s"
msgstr "Hauptschlüssel %s"

View File

@@ -223,7 +223,7 @@ msgid ""
"(including this console)."
msgstr ""
msgid "To maximise/minimise the console, press \"TC\"."
msgid "To maximise/minimise the console, press \"tc\"."
msgstr ""
msgid "To enter command line mode, press \":\""
@@ -372,6 +372,16 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr ""
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -546,6 +556,9 @@ msgstr ""
msgid "View"
msgstr ""
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr ""
@@ -615,6 +628,9 @@ msgstr ""
msgid "Save"
msgstr ""
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -673,6 +689,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr ""
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr ""
@@ -789,6 +810,9 @@ msgstr ""
msgid "OneDrive Login"
msgstr ""
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr ""
@@ -824,6 +848,9 @@ msgstr ""
msgid "Unknown flag: %s"
msgstr ""
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr ""
@@ -1002,6 +1029,9 @@ msgstr ""
msgid "Show tray icon"
msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1199,6 +1229,9 @@ msgstr ""
msgid "Joplin website"
msgstr ""
msgid "Login with Dropbox"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr ""

View File

@@ -250,8 +250,9 @@ msgstr ""
"Para desplazar en las listas y areas de texto (incluyendo la consola) "
"utilice las flechas y re pág/av pág."
msgid "To maximise/minimise the console, press \"TC\"."
msgstr "Para maximizar/minimizar la consola, presione \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Para maximizar/minimizar la consola, presione \"tc\"."
msgid "To enter command line mode, press \":\""
msgstr "Para entrar a modo línea de comando, presione \":\""
@@ -416,6 +417,18 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "Autenticación no completada (no se recibió token de autenticación)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
"Para permitir a Joplin sincronizar con Dropbox, por favor siga estos pasos:"
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
"Paso 1: Abra esta dirección en su navegador para autorizar a la aplicación:"
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr "Paso 2: Introduzca el código provisto por Dropbox:"
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr "No autenticado con %s. Por favor provea las credenciales."
@@ -620,6 +633,9 @@ msgstr "Buscar en todas las notas"
msgid "View"
msgstr "Ver"
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr "Cambia el diseño del editor"
@@ -689,6 +705,9 @@ msgstr "Las notas y los ajustes se guardan en: %s"
msgid "Save"
msgstr "Guardar"
msgid "Submit"
msgstr "Aceptar"
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -760,6 +779,13 @@ msgstr ""
"elementos, pero la apliación no tiene acceso a ellas. Serán descargadas a "
"través de la sincronización."
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
"Para más información acerca del cifrado extremo a extremo (E2EE) y "
"advertencias de como habilitarlo por favor revise la documentación:"
msgid "Status"
msgstr "Estado"
@@ -798,9 +824,8 @@ msgstr "Ajustar alarma:"
msgid "Layout"
msgstr "Diseño"
#, fuzzy
msgid "Search..."
msgstr "Buscar"
msgstr "Buscar..."
msgid "Some items cannot be synchronised."
msgstr "No se han podido sincronizar algunos de los elementos."
@@ -879,6 +904,9 @@ msgstr "Limpiar"
msgid "OneDrive Login"
msgstr "Inicio de sesión de OneDrive"
msgid "Dropbox Login"
msgstr "Inicio de sesión de Dropbox"
msgid "Options"
msgstr "Opciones"
@@ -914,6 +942,9 @@ msgstr "Uso: %s"
msgid "Unknown flag: %s"
msgstr "Etiqueta desconocida: %s"
msgid "Dropbox"
msgstr "Dropbox"
msgid "File system"
msgstr "Sistema de archivos"
@@ -991,7 +1022,7 @@ msgstr "Elementos remotos borrados: %d."
msgid "Fetched items: %d/%d."
msgstr "Elementos obtenidos: %d/%d."
#, fuzzy, javascript-format
#, javascript-format
msgid "State: %s."
msgstr "Estado: «%s»."
@@ -1103,6 +1134,9 @@ msgstr "Cuando se crear una nota nueva:"
msgid "Show tray icon"
msgstr "Mostrar icono en la bandeja"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr "Establecer el porcentaje de aumento de la aplicación"
@@ -1304,14 +1338,17 @@ msgid "Cancel synchronisation"
msgstr "Cancelar sincronización"
msgid "New tags:"
msgstr ""
msgstr "Nuevas etiquetas:"
msgid "Type new tags or select from list"
msgstr ""
msgstr "Escriba nuevas etiquetas o seleccionelas de la lista"
msgid "Joplin website"
msgstr "Sitio web de Joplin"
msgid "Login with Dropbox"
msgstr "Acceder con Dropbox"
#, javascript-format
msgid "Master Key %s"
msgstr "Clave maestra %s"
@@ -1399,6 +1436,13 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenido"
#~ msgid ""
#~ "For more information about End-To-End Encryption (E2EE) and advices on "
#~ "how to enable it please check the documentation"
#~ msgstr ""
#~ "Para más información acerca del cifrado extremo a extremo (E2EE) y "
#~ "advertencias de como habilitarlo por favor revise la documentación"
#~ msgid "Searches"
#~ msgstr "Búsquedas"

View File

@@ -246,7 +246,8 @@ msgstr ""
"Erabili geziak edo page up/down list eta testu guneen artean aldatzeko "
"(kontsola hau ere kontuan izanda)."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Kontsola maximizatu edo minimizatzeko, saka \"TC\" ."
msgid "To enter command line mode, press \":\""
@@ -414,6 +415,16 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "Autentifikazioa ez da egin osorik (ez du token-ik hartu)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr "Ez da autentifikatu %s -rekin. Eman galdutako kredentzialak."
@@ -619,6 +630,9 @@ msgstr "Bilatu ohar guztietan"
msgid "View"
msgstr ""
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr ""
@@ -691,6 +705,9 @@ msgstr "Oharrak eta ezarpenak hemen daude gordeta: %s"
msgid "Save"
msgstr "Gorde"
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -761,6 +778,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr ""
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "Egoera"
@@ -884,6 +906,9 @@ msgstr "Garbitu"
msgid "OneDrive Login"
msgstr "Logeatu OneDriven"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "Aukerak"
@@ -920,6 +945,9 @@ msgstr "Erabili: %s"
msgid "Unknown flag: %s"
msgstr "Marka ezezaguna: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "Fitxategi sistema"
@@ -1114,6 +1142,9 @@ msgstr "Ohar berria sortzen du."
msgid "Show tray icon"
msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
#, fuzzy
msgid "Global zoom percentage"
msgstr "Ezarri aplikazioaren zoomaren ehunekoa"
@@ -1324,6 +1355,10 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, fuzzy
msgid "Login with Dropbox"
msgstr "Login with OneDrive"
#, javascript-format
msgid "Master Key %s"
msgstr "Pasahitz Nagusia %s"

View File

@@ -248,8 +248,8 @@ msgstr ""
"Utilisez les touches fléchées et page précédente/suivante pour faire défiler "
"les listes et zones de texte (y compris cette console)."
msgid "To maximise/minimise the console, press \"TC\"."
msgstr "Pour maximiser ou minimiser la console, pressez \"TC\"."
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Pour maximiser ou minimiser la console, pressez \"tc\"."
msgid "To enter command line mode, press \":\""
msgstr "Pour démarrer le mode ligne de commande, pressez \":\""
@@ -413,6 +413,20 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "Impossible d'autoriser le logiciel (jeton d'identification non-reçu)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
"Pour permettre à Joplin de synchroniser avec Dropbox, veuillez suivre les "
"étapes ci-dessous :"
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
"Étape 1: Veuillez ouvrir cette URL dans votre navigateur internet pour "
"autoriser le logiciel :"
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr "Étape 2 : Entrez le code fourni par Dropbox :"
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -617,6 +631,9 @@ msgstr "Chercher dans toutes les notes"
msgid "View"
msgstr "Affichage"
msgid "Toggle sidebar"
msgstr "Basculer barre latérale"
msgid "Toggle editor layout"
msgstr "Basculer l'agencement de l'éditeur"
@@ -687,6 +704,9 @@ msgstr "Les notes et paramètres se trouve dans : %s"
msgid "Save"
msgstr "Enregistrer"
msgid "Submit"
msgstr "Envoyer"
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -760,6 +780,13 @@ msgstr ""
"de vos objets, cependant le logiciel n'y a pour l'instant pas accès. Il est "
"probable qu'elle vont être prochainement disponible via la synchronisation."
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
"Pour plus d'informations sur l'encryption de bout en bout, ainsi que des "
"conseils pour l'activer, veuillez consulter la documentation :"
msgid "Status"
msgstr "État"
@@ -883,6 +910,9 @@ msgstr "Supprimer"
msgid "OneDrive Login"
msgstr "Connexion OneDrive"
msgid "Dropbox Login"
msgstr "Connection à Dropbox"
msgid "Options"
msgstr "Options"
@@ -919,6 +949,9 @@ msgstr "Utilisation : %s"
msgid "Unknown flag: %s"
msgstr "Paramètre inconnu : %s"
msgid "Dropbox"
msgstr "Dropbox"
msgid "File system"
msgstr "Système de fichier"
@@ -1107,6 +1140,9 @@ msgstr "Lors de la création d'une note :"
msgid "Show tray icon"
msgstr "Afficher 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 "Global zoom percentage"
msgstr "Niveau de zoom"
@@ -1318,6 +1354,9 @@ msgstr "Entrez de nouvelles étiquettes ou sélectionnez de la liste"
msgid "Joplin website"
msgstr "Site web de Joplin"
msgid "Login with Dropbox"
msgstr "Se connecter à Dropbox"
#, javascript-format
msgid "Master Key %s"
msgstr "Clef maître %s"
@@ -1406,6 +1445,13 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenue"
#~ msgid ""
#~ "For more information about End-To-End Encryption (E2EE) and advices on "
#~ "how to enable it please check the documentation"
#~ msgstr ""
#~ "Pour plus d'informations sur l'encryption de bout en bout, ainsi que des "
#~ "conseils pour l'activer, veuillez consulter la documentation"
#~ msgid "Searches"
#~ msgstr "Recherches"
@@ -1596,12 +1642,6 @@ msgstr "Bienvenue"
#~ msgid "Done."
#~ msgstr "Terminé."
#~ msgid ""
#~ "Please open this URL in your browser to authenticate the application:"
#~ msgstr ""
#~ "Veuillez ouvrir cette URL dans votre navigateur internet pour autoriser "
#~ "le logiciel :"
#~ msgid "Note does not exist."
#~ msgstr "Cette note n'existe pas."

1422
CliClient/locales/gl_ES.po Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -250,7 +250,8 @@ msgstr ""
"Use the arrows and page up/down to scroll the lists and text areas "
"(including this console)."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Za maksimiziranje/minimiziranje konzole, pritisni \"TC\"."
msgid "To enter command line mode, press \":\""
@@ -420,6 +421,16 @@ msgid ""
msgstr ""
"Ovjera nije dovršena (nije dobivena potvrda ovjere - authentication token)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -621,6 +632,9 @@ msgstr "Pretraži u svim bilješkama"
msgid "View"
msgstr ""
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr ""
@@ -694,6 +708,9 @@ msgstr "Bilješke i postavke su pohranjene u: %s"
msgid "Save"
msgstr "Spremi"
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -752,6 +769,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr ""
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "Status"
@@ -875,6 +897,9 @@ msgstr "Očisti"
msgid "OneDrive Login"
msgstr "OneDrive Login"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "Opcije"
@@ -910,6 +935,9 @@ msgstr "Korištenje: %s"
msgid "Unknown flag: %s"
msgstr "Nepoznata zastavica: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "Datotečni sustav"
@@ -1102,6 +1130,9 @@ msgstr "Stvara novu bilješku."
msgid "Show tray icon"
msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1304,6 +1335,10 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, fuzzy
msgid "Login with Dropbox"
msgstr "Prijavi se u OneDrive"
#, javascript-format
msgid "Master Key %s"
msgstr ""

View File

@@ -245,7 +245,8 @@ msgstr ""
"Usa le frecce e pagina su/giù per scorrere le liste e le aree di testo "
"(compresa questa console)."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Per massimizzare/minimizzare la console, premi \"TC\"."
msgid "To enter command line mode, press \":\""
@@ -407,6 +408,16 @@ msgstr ""
"Autenticazione non completata (non è stato ricevuto alcun token di "
"autenticazione)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -603,6 +614,9 @@ msgstr "Cerca in tutte le note"
msgid "View"
msgstr ""
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr ""
@@ -676,6 +690,9 @@ msgstr ""
msgid "Save"
msgstr ""
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -736,6 +753,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr ""
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "Stato"
@@ -858,6 +880,9 @@ msgstr "Pulisci"
msgid "OneDrive Login"
msgstr "Login OneDrive"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "Opzioni"
@@ -894,6 +919,9 @@ msgstr "Uso: %s"
msgid "Unknown flag: %s"
msgstr "Etichetta sconosciuta: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "File system"
@@ -1088,6 +1116,9 @@ msgstr "Crea una nuova nota."
msgid "Show tray icon"
msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1290,6 +1321,10 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, fuzzy
msgid "Login with Dropbox"
msgstr "Accedi a OneDrive"
#, javascript-format
msgid "Master Key %s"
msgstr ""

View File

@@ -240,7 +240,8 @@ msgid ""
"(including this console)."
msgstr "リストや入力エリアの移動には矢印キーまたはPage Up/Downを使用します。"
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "コンソールの最大化・最小化には\"TC\"と入力してください。"
msgid "To enter command line mode, press \":\""
@@ -404,6 +405,16 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "認証は完了していません(認証トークンが得られませんでした)"
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -604,6 +615,9 @@ msgstr "すべてのノートを検索"
msgid "View"
msgstr ""
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr ""
@@ -676,6 +690,9 @@ msgstr "ノートと設定は、%sに保存されます。"
msgid "Save"
msgstr "保存"
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -738,6 +755,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr ""
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "状態"
@@ -861,6 +883,9 @@ msgstr "クリア"
msgid "OneDrive Login"
msgstr "OneDriveログイン"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "オプション"
@@ -896,6 +921,9 @@ msgstr "使用方法: %s"
msgid "Unknown flag: %s"
msgstr "不明なフラグ: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "ファイルシステム"
@@ -1092,6 +1120,9 @@ msgstr "あたらしいノートを作成します。"
msgid "Show tray icon"
msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1294,6 +1325,10 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, fuzzy
msgid "Login with Dropbox"
msgstr "OneDriveログイン"
#, javascript-format
msgid "Master Key %s"
msgstr ""

View File

@@ -223,7 +223,7 @@ msgid ""
"(including this console)."
msgstr ""
msgid "To maximise/minimise the console, press \"TC\"."
msgid "To maximise/minimise the console, press \"tc\"."
msgstr ""
msgid "To enter command line mode, press \":\""
@@ -372,6 +372,16 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr ""
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -546,6 +556,9 @@ msgstr ""
msgid "View"
msgstr ""
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr ""
@@ -615,6 +628,9 @@ msgstr ""
msgid "Save"
msgstr ""
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -673,6 +689,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr ""
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr ""
@@ -789,6 +810,9 @@ msgstr ""
msgid "OneDrive Login"
msgstr ""
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr ""
@@ -824,6 +848,9 @@ msgstr ""
msgid "Unknown flag: %s"
msgstr ""
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr ""
@@ -1002,6 +1029,9 @@ msgstr ""
msgid "Show tray icon"
msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1199,6 +1229,9 @@ msgstr ""
msgid "Joplin website"
msgstr ""
msgid "Login with Dropbox"
msgstr ""
#, javascript-format
msgid "Master Key %s"
msgstr ""

View File

@@ -249,7 +249,8 @@ msgstr ""
"Gebruik de pijltjes en page up/down om door de lijsten en de tekstvelden te "
"scrollen (ook deze console)."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Om de console te maximaliseren/minimaliseren, typ \"TC\"."
msgid "To enter command line mode, press \":\""
@@ -415,6 +416,16 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "Authenticatie was niet voltooid (geen authenticatietoken ontvangen)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -621,6 +632,9 @@ msgstr "Zoek in alle notities"
msgid "View"
msgstr ""
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr ""
@@ -693,6 +707,9 @@ msgstr "Notities en instellingen zijn opgeslaan in %s"
msgid "Save"
msgstr "Sla op"
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -763,6 +780,11 @@ msgid ""
"they will eventually be downloaded via synchronisation."
msgstr ""
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "Status"
@@ -887,6 +909,9 @@ msgstr "Vrijmaken"
msgid "OneDrive Login"
msgstr "OneDrive Login"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "Opties"
@@ -922,6 +947,9 @@ msgstr "Gebruik: %s"
msgid "Unknown flag: %s"
msgstr "Onbekende optie: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "Bestandssysteem"
@@ -1118,6 +1146,9 @@ msgstr "Maakt een nieuwe notitie aan."
msgid "Show tray icon"
msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1326,6 +1357,10 @@ msgstr ""
msgid "Joplin website"
msgstr ""
#, fuzzy
msgid "Login with Dropbox"
msgstr "Log in met OneDrive"
#, javascript-format
msgid "Master Key %s"
msgstr "Hoofdsleutel: %s"

View File

@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.6\n"
"X-Generator: Poedit 2.0.7\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "To delete a tag, untag the associated notes."
@@ -246,7 +246,8 @@ msgstr ""
"Use as setas e a Page Up/Page Down para rolar as listas e áreas de texto "
"(incluindo este console)."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Para maximizar / minimizar o console, pressione \"TC\"."
msgid "To enter command line mode, press \":\""
@@ -411,6 +412,18 @@ msgid ""
msgstr ""
"A autenticação não foi concluída (não recebeu um token de autenticação)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
"Para permitir o Joplin sincronizar com o Dropbox, por favor, execute os "
"seguintes passos:"
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr "Passo 1: Abra essa URL em seu navegador para autorizar:"
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr "Passo 2: Entre o código fornecido pelo Dropbox:"
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -567,9 +580,8 @@ msgstr "Exportando para \"%s\" com o formato \"%s\". Por favor, aguarde..."
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "Importando de \"%s\" com o formato \"%s\". Por favor, aguarde..."
#, fuzzy
msgid "PDF File"
msgstr "Arquivo"
msgstr "Arquivo PDF"
msgid "File"
msgstr "Arquivo"
@@ -590,7 +602,7 @@ msgid "Export"
msgstr "Exportar"
msgid "Print"
msgstr ""
msgstr "Imprimir"
#, javascript-format
msgid "Hide %s"
@@ -617,6 +629,9 @@ msgstr "Pesquisar em todas as notas"
msgid "View"
msgstr "Visualizar"
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr "Alternar layout do editor"
@@ -686,6 +701,9 @@ msgstr "Notas e configurações estão armazenadas em: %s"
msgid "Save"
msgstr "Salvar"
msgid "Submit"
msgstr "Enviar"
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -757,6 +775,13 @@ msgstr ""
"itens, contudo a aplicação atualmente não tem acesso a elas. Provavelmente, "
"elas serão baixadas via sincronização."
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
"Para mais informações sobre Encriptação ponto-a-ponto (E2EE) e recomendações "
"sobre como habilitar, favor verificar a documentação:"
msgid "Status"
msgstr "Status"
@@ -796,9 +821,8 @@ msgstr "Definir alarme:"
msgid "Layout"
msgstr "Layout"
#, fuzzy
msgid "Search..."
msgstr "Procurar"
msgstr "Pesquisar..."
msgid "Some items cannot be synchronised."
msgstr "Alguns itens não podem ser sincronizados."
@@ -877,6 +901,9 @@ msgstr "Limpar (clear)"
msgid "OneDrive Login"
msgstr "Login no OneDrive"
msgid "Dropbox Login"
msgstr "Login no Dropbox"
msgid "Options"
msgstr "Opções"
@@ -914,6 +941,9 @@ msgstr "Uso: %s"
msgid "Unknown flag: %s"
msgstr "Flag desconhecido: %s"
msgid "Dropbox"
msgstr "Dropbox"
msgid "File system"
msgstr "Sistema de arquivos"
@@ -991,7 +1021,7 @@ msgstr "Itens remotos excluídos: %d."
msgid "Fetched items: %d/%d."
msgstr "Itens pesquisados: %d/%d."
#, fuzzy, javascript-format
#, javascript-format
msgid "State: %s."
msgstr "Estado: \"%s\"."
@@ -1002,15 +1032,15 @@ msgstr "Cancelando..."
msgid "Completed: %s"
msgstr "Completado: %s"
#, fuzzy, javascript-format
#, javascript-format
msgid "Last error: %s"
msgstr "Erro fatal:"
msgstr "Último erro: %s"
msgid "Idle"
msgstr ""
msgstr "Inativo"
msgid "In progress"
msgstr ""
msgstr "Em andamento"
#, javascript-format
msgid "Synchronisation is already in progress. State: %s"
@@ -1103,6 +1133,9 @@ msgstr "Quando criar uma nota nova:"
msgid "Show tray icon"
msgstr "Exibir tray icon"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr "Porcentagem global do zoom"
@@ -1304,14 +1337,17 @@ msgid "Cancel synchronisation"
msgstr "Cancelar sincronização"
msgid "New tags:"
msgstr ""
msgstr "Novas tags:"
msgid "Type new tags or select from list"
msgstr ""
msgstr "Digite novsa tags, ou selecione da lista"
msgid "Joplin website"
msgstr "Site do Joplin"
msgid "Login with Dropbox"
msgstr "Login com Dropbox"
#, javascript-format
msgid "Master Key %s"
msgstr "Chave Master %s"

View File

@@ -249,7 +249,8 @@ msgstr ""
"Используйте стрелки и клавиши перелистывания страницы вверх/вниз для "
"прокрутки списков и текстовых областей (включая эту консоль)."
msgid "To maximise/minimise the console, press \"TC\"."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Чтобы развернуть/свернуть консоль, нажимайте «TC»."
msgid "To enter command line mode, press \":\""
@@ -414,6 +415,16 @@ msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "Аутентификация не была завершена (не получен токен аутентификации)."
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr ""
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr ""
msgid "Step 2: Enter the code provided by Dropbox:"
msgstr ""
#, javascript-format
msgid "Not authentified with %s. Please provide any missing credentials."
msgstr ""
@@ -618,6 +629,9 @@ msgstr "Поиск во всех заметках"
msgid "View"
msgstr "Вид"
msgid "Toggle sidebar"
msgstr ""
msgid "Toggle editor layout"
msgstr "Переключить вид редактора"
@@ -687,6 +701,9 @@ msgstr "Заметки и настройки сохранены в: %s"
msgid "Save"
msgstr "Сохранить"
msgid "Submit"
msgstr ""
msgid ""
"Disabling encryption means *all* your notes and attachments are going to be "
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
@@ -760,6 +777,11 @@ msgstr ""
"элементов, однако у приложения сейчас нет к ним доступа. Скорее всего, они "
"загрузятся при синхронизации."
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
msgid "Status"
msgstr "Статус"
@@ -879,6 +901,9 @@ msgstr "Очистить"
msgid "OneDrive Login"
msgstr "Вход в OneDrive"
msgid "Dropbox Login"
msgstr ""
msgid "Options"
msgstr "Настройки"
@@ -914,6 +939,9 @@ msgstr "Использование: %s"
msgid "Unknown flag: %s"
msgstr "Неизвестный флаг: %s"
msgid "Dropbox"
msgstr ""
msgid "File system"
msgstr "Файловая система"
@@ -1102,6 +1130,9 @@ msgstr "При создании новой заметки:"
msgid "Show tray icon"
msgstr "Показывать иконку в панели задач"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Global zoom percentage"
msgstr "Глобальный масштаб в процентах"
@@ -1311,6 +1342,10 @@ msgstr ""
msgid "Joplin website"
msgstr "Сайт Joplin"
#, fuzzy
msgid "Login with Dropbox"
msgstr "Войти в OneDrive"
#, javascript-format
msgid "Master Key %s"
msgstr "Мастер-ключ %s"

File diff suppressed because it is too large Load Diff

View File

@@ -9,9 +9,10 @@ const fs = require('fs-extra');
class ElectronAppWrapper {
constructor(electronApp, env) {
constructor(electronApp, env, profilePath) {
this.electronApp_ = electronApp;
this.env_ = env;
this.profilePath_ = profilePath;
this.win_ = null;
this.willQuitApp_ = false;
this.tray_ = null;
@@ -37,12 +38,16 @@ class ElectronAppWrapper {
createWindow() {
const windowStateKeeper = require('electron-window-state');
// Load the previous state with fallback to defaults
const windowState = windowStateKeeper({
const stateOptions = {
defaultWidth: 800,
defaultHeight: 600,
file: 'window-state-' + this.env_ + '.json',
});
}
if (this.profilePath_) stateOptions.path = this.profilePath_;
// Load the previous state with fallback to defaults
const windowState = windowStateKeeper(stateOptions);
const windowOptions = {
x: windowState.x,

View File

@@ -38,6 +38,7 @@ const appDefaultState = Object.assign({}, defaultState, {
fileToImport: null,
windowCommand: null,
noteVisiblePanes: ['editor', 'viewer'],
sidebarVisibility: true,
windowContentSize: bridge().windowContentSize(),
});
@@ -85,7 +86,7 @@ class Application extends BaseApplication {
action = newAction;
}
if (!goingBack) newNavHistory.push(currentRoute);
newState.navHistory = newNavHistory
newState.route = action;
@@ -123,11 +124,22 @@ class Application extends BaseApplication {
break;
case 'NOTE_VISIBLE_PANES_SET':
newState = Object.assign({}, state);
newState.noteVisiblePanes = action.panes;
break;
case 'SIDEBAR_VISIBILITY_TOGGLE':
newState = Object.assign({}, state);
newState.sidebarVisibility = !state.sidebarVisibility;
break;
case 'SIDEBAR_VISIBILITY_SET':
newState = Object.assign({}, state);
newState.sidebarVisibility = action.visibility;
break;
}
} catch (error) {
error.message = 'In reducer: ' + error.message + ' Action: ' + JSON.stringify(action);
@@ -170,6 +182,10 @@ class Application extends BaseApplication {
Setting.setValue('noteVisiblePanes', newState.noteVisiblePanes);
}
if (['SIDEBAR_VISIBILITY_TOGGLE', 'SIDEBAR_VISIBILITY_SET'].indexOf(action.type) >= 0) {
Setting.setValue('sidebarVisibility', newState.sidebarVisibility);
}
return result;
}
@@ -195,7 +211,7 @@ class Application extends BaseApplication {
Setting.setValue('notes.sortOrder.field', field);
this.refreshMenu();
}
});
});
}
const importItems = [];
@@ -273,7 +289,7 @@ class Application extends BaseApplication {
this.dispatch({
type: 'WINDOW_COMMAND',
name: 'exportPdf',
});
});
}
});
@@ -349,17 +365,17 @@ class Application extends BaseApplication {
label: _('Edit'),
submenu: [{
label: _('Copy'),
screens: ['Main', 'OneDriveLogin', 'Config', 'EncryptionConfig'],
//screens: ['Main', 'OneDriveLogin', 'Config', 'EncryptionConfig'],
role: 'copy',
accelerator: 'CommandOrControl+C',
}, {
label: _('Cut'),
screens: ['Main', 'OneDriveLogin', 'Config', 'EncryptionConfig'],
//screens: ['Main', 'OneDriveLogin', 'Config', 'EncryptionConfig'],
role: 'cut',
accelerator: 'CommandOrControl+X',
}, {
label: _('Paste'),
screens: ['Main', 'OneDriveLogin', 'Config', 'EncryptionConfig'],
//screens: ['Main', 'OneDriveLogin', 'Config', 'EncryptionConfig'],
role: 'paste',
accelerator: 'CommandOrControl+V',
}, {
@@ -379,6 +395,16 @@ class Application extends BaseApplication {
}, {
label: _('View'),
submenu: [{
label: _('Toggle sidebar'),
screens: ['Main'],
accelerator: 'F10',
click: () => {
this.dispatch({
type: 'WINDOW_COMMAND',
name: 'toggleSidebar',
});
}
}, {
label: _('Toggle editor layout'),
screens: ['Main'],
accelerator: 'CommandOrControl+L',
@@ -510,11 +536,6 @@ class Application extends BaseApplication {
}
updateTray() {
// Tray icon (called AppIndicator) doesn't work in Ubuntu
// http://www.webupd8.org/2017/04/fix-appindicator-not-working-for.html
// Might be fixed in Electron 18.x but no non-beta release yet.
if (!shim.isWindows() && !shim.isMac()) return;
const app = bridge().electronApp();
if (app.trayShown() === Setting.value('showTrayIcon')) return;
@@ -547,6 +568,12 @@ class Application extends BaseApplication {
}
async start(argv) {
const electronIsDev = require('electron-is-dev');
// If running inside a package, the command line, instead of being "node.exe <path> <flags>" is "joplin.exe <flags>" so
// insert an extra argument so that they can be processed in a consistent way everywhere.
if (!electronIsDev) argv.splice(1, 0, '.');
argv = await super.start(argv);
AlarmService.setDriver(new AlarmServiceDriverNode({ appName: packageInfo.build.appId }));
@@ -596,7 +623,7 @@ class Application extends BaseApplication {
bridge().checkForUpdates(true, bridge().window(), this.checkForUpdateLoggerPath());
}
}
// Initial check on startup
setTimeout(() => { runAutoUpdateCheck() }, 5000);
// Then every x hours
@@ -633,4 +660,4 @@ function app() {
return application_;
}
module.exports = { app };
module.exports = { app };

View File

@@ -184,7 +184,7 @@ class EncryptionConfigScreenComponent extends React.Component {
<div style={containerStyle}>
{<div style={{backgroundColor: theme.warningBackgroundColor, paddingLeft: 10, paddingRight: 10, paddingTop: 2, paddingBottom: 2 }}>
<p style={theme.textStyle}>
<span>{_('For more information about End-To-End Encryption (E2EE) and advices on how to enable it please check the documentation')}</span> <a onClick={() => {bridge().openExternal('https://joplin.cozic.net/help/e2ee')}} href="#">https://joplin.cozic.net/help/e2ee</a>
<span>{_('For more information about End-To-End Encryption (E2EE) and advices on how to enable it please check the documentation:')}</span> <a onClick={() => {bridge().openExternal('https://joplin.cozic.net/e2ee')}} href="#">https://joplin.cozic.net/e2ee</a>
</p>
</div>}
<h1 style={theme.h1Style}>{_('Status')}</h1>

View File

@@ -72,9 +72,10 @@ class HeaderComponent extends React.Component {
if (options.iconName) {
const iconStyle = {
fontSize: Math.round(style.fontSize * 1.4),
color: style.color
color: style.color,
};
if (options.title) iconStyle.marginRight = 5;
if (options.iconRotation) iconStyle.transform = 'rotate(' + options.iconRotation + 'deg)';
icon = <i style={iconStyle} className={"fa " + options.iconName}></i>
}

View File

@@ -25,7 +25,7 @@ class MainScreenComponent extends React.Component {
modalLayer: {
visible: false,
message: '',
},
}
});
}
@@ -41,6 +41,12 @@ class MainScreenComponent extends React.Component {
});
}
toggleSidebar() {
this.props.dispatch({
type: 'SIDEBAR_VISIBILITY_TOGGLE',
});
}
async doCommand(command) {
if (!command) return;
@@ -83,7 +89,7 @@ class MainScreenComponent extends React.Component {
if (answer) {
let folder = null;
try {
folder = await Folder.save({ title: answer }, { userSideValidation: true });
folder = await Folder.save({ title: answer }, { userSideValidation: true });
} catch (error) {
bridge().showErrorMessageBox(error.message);
}
@@ -160,9 +166,11 @@ class MainScreenComponent extends React.Component {
id: this.searchId_,
});
}
} else if (command.name === 'toggleVisiblePanes') {
this.toggleVisiblePanes();
} else if (command.name === 'toggleSidebar') {
this.toggleSidebar();
} else if (command.name === 'showModalMessage') {
this.setState({ modalLayer: { visible: true, message: command.message } });
} else if (command.name === 'hideModalMessage') {
@@ -203,7 +211,7 @@ class MainScreenComponent extends React.Component {
this.setState({ promptOptions: null });
}
},
});
});
} else {
commandProcessed = false;
}
@@ -216,8 +224,8 @@ class MainScreenComponent extends React.Component {
}
}
styles(themeId, width, height, messageBoxVisible) {
const styleKey = themeId + '_' + width + '_' + height + '_' + messageBoxVisible;
styles(themeId, width, height, messageBoxVisible, isSidebarVisible) {
const styleKey = themeId + '_' + width + '_' + height + '_' + messageBoxVisible + '_' + (+isSidebarVisible);
if (styleKey === this.styleKey_) return this.styles_;
const theme = themeStyle(themeId);
@@ -246,7 +254,12 @@ class MainScreenComponent extends React.Component {
height: rowHeight,
display: 'inline-block',
verticalAlign: 'top',
};
};
if (isSidebarVisible === false) {
this.styles_.sideBar.width = 0;
this.styles_.sideBar.display = 'none';
}
this.styles_.noteList = {
width: Math.floor(layoutUtils.size(width * .2, 150, 300)),
@@ -287,20 +300,28 @@ class MainScreenComponent extends React.Component {
const folders = this.props.folders;
const notes = this.props.notes;
const messageBoxVisible = this.props.hasDisabledSyncItems || this.props.showMissingMasterKeyMessage;
const styles = this.styles(this.props.theme, style.width, style.height, messageBoxVisible);
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();
const headerItems = [];
headerItems.push({
title: _('Toggle sidebar'),
iconName: 'fa-bars',
iconRotation: this.props.sidebarVisibility ? 0 : 90,
onClick: () => { this.doCommand({ name: 'toggleSidebar'}) }
});
headerItems.push({
title: _('New note'),
iconName: 'fa-file-o',
enabled: !!folders.length && !onConflictFolder,
onClick: () => { this.doCommand({ name: 'newNote' }) },
});
headerItems.push({
title: _('New to-do'),
iconName: 'fa-check-square-o',
@@ -400,14 +421,16 @@ const mapStateToProps = (state) => {
theme: state.settings.theme,
windowCommand: state.windowCommand,
noteVisiblePanes: state.noteVisiblePanes,
sidebarVisibility: state.sidebarVisibility,
folders: state.folders,
notes: state.notes,
hasDisabledSyncItems: state.hasDisabledSyncItems,
showMissingMasterKeyMessage: state.notLoadedMasterKeys.length && state.masterKeys.length,
selectedFolderId: state.selectedFolderId,
sidebarVisibility: state.sidebarVisibility,
};
};
const MainScreen = connect(mapStateToProps)(MainScreenComponent);
module.exports = { MainScreen };
module.exports = { MainScreen };

View File

@@ -47,6 +47,11 @@ async function initialize(dispatch) {
type: 'NOTE_VISIBLE_PANES_SET',
panes: Setting.value('noteVisiblePanes'),
});
store.dispatch({
type: 'SIDEBAR_VISIBILITY_SET',
visibility: Setting.value('sidebarVisibility')
});
}
class RootComponent extends React.Component {

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

@@ -6,6 +6,7 @@ locales['de_DE'] = require('./de_DE.json');
locales['es_ES'] = require('./es_ES.json');
locales['eu'] = require('./eu.json');
locales['fr_FR'] = require('./fr_FR.json');
locales['gl_ES'] = require('./gl_ES.json');
locales['hr_HR'] = require('./hr_HR.json');
locales['it_IT'] = require('./it_IT.json');
locales['ja_JP'] = require('./ja_JP.json');

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

@@ -24,11 +24,22 @@ function envFromArgs(args) {
return 'prod';
}
// Likewise, we want to know if a profile is specified early, in particular
// to save the window state data.
function profileFromArgs(args) {
if (!args) return null;
const profileIndex = args.indexOf('--profile');
if (profileIndex <= 0 || profileIndex >= args.length - 1) return null;
const profileValue = args[profileIndex + 1];
return profileValue ? profileValue : null;
}
Logger.fsDriver_ = new FsDriverNode();
const env = envFromArgs(process.argv);
const profilePath = profileFromArgs(process.argv);
const wrapper = new ElectronAppWrapper(electronApp, env);
const wrapper = new ElectronAppWrapper(electronApp, env, profilePath);
initBridge(wrapper);

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "Joplin",
"version": "1.0.81",
"version": "1.0.83",
"description": "Joplin for Desktop",
"main": "main.js",
"scripts": {
@@ -26,7 +26,23 @@
"build/icons/*"
],
"win": {
"icon": "../../Assets/Joplin.ico"
"icon": "../../Assets/Joplin.ico",
"target": [
{
"target": "nsis",
"arch": [
"x64",
"ia32"
]
},
{
"target": "portable",
"arch": [
"x64",
"ia32"
]
}
]
},
"nsis": {
"oneClick": false,
@@ -48,7 +64,7 @@
"babel-cli": "^6.26.0",
"babel-preset-react": "^6.24.1",
"electron": "^1.7.11",
"electron-builder": "^20.5.1"
"electron-builder": "^20.10.0"
},
"optionalDependencies": {
"7zip-bin-mac": "^1.0.1",
@@ -61,6 +77,7 @@
"base-64": "^0.1.0",
"compare-versions": "^3.1.0",
"electron-context-menu": "^0.9.1",
"electron-is-dev": "^0.3.0",
"electron-window-state": "^4.1.1",
"follow-redirects": "^1.2.5",
"form-data": "^2.3.1",
@@ -87,7 +104,6 @@
"react-dom": "^16.0.0",
"react-redux": "^5.0.6",
"redux": "^3.7.2",
"sharp": "^0.17.3",
"smalltalk": "^2.5.1",
"sprintf-js": "^1.1.1",
"sqlite3": "^3.1.13",

156
README.md
View File

@@ -1,16 +1,16 @@
# Joplin
[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted) [![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1AnbeRd5NZT1ssG93jXzaDoHwzgjQAHX3R)](https://en.cryptobadges.io/donate/1AnbeRd5NZT1ssG93jXzaDoHwzgjQAHX3R) [![Travis Build Status](https://travis-ci.org/laurent22/joplin.svg?branch=master)](https://travis-ci.org/laurent22/joplin) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/laurent22/joplin?branch=master&passingText=master%20-%20OK&svg=true)](https://ci.appveyor.com/project/laurent22/joplin)
[![Donate](https://joplin.cozic.net/images/badges/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted) [![Donate with Bitcoin](https://joplin.cozic.net/images/badges/Donate-Bitcoin.svg)](https://joplin.cozic.net/donate/#bitcoin) [![Travis Build Status](https://travis-ci.org/laurent22/joplin.svg?branch=master)](https://travis-ci.org/laurent22/joplin) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/laurent22/joplin?branch=master&passingText=master%20-%20OK&svg=true)](https://ci.appveyor.com/project/laurent22/joplin)
Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown).
Notes exported from Evernote via .enex files [can be imported](#importing) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.
The notes can be [synchronised](#synchronisation) with various cloud services including [Nextcloud](https://nextcloud.com/), the file system (for example with a network directory) or with Microsoft OneDrive. When synchronising the notes, notebooks, tags and other metadata are saved to plain text files which can be easily inspected, backed up and moved around.
The notes can be [synchronised](#synchronisation) with various cloud services including [Nextcloud](https://nextcloud.com/), Dropbox, OneDrive or the file system (for example with a network directory). When synchronising the notes, notebooks, tags and other metadata are saved to plain text files which can be easily inspected, backed up and moved around.
The UI of the terminal client is built on top of the great [terminal-kit](https://github.com/cronvel/terminal-kit) library, the desktop client using [Electron](https://electronjs.org/), and the Android client front end is done using [React Native](https://facebook.github.io/react-native/).
<div class="top-screenshot"><img src="https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/AllClients.jpg" style="max-width: 100%; max-height: 35em;"></div>
<div class="top-screenshot"><img src="https://joplin.cozic.net/images/AllClients.jpg" style="max-width: 100%; max-height: 35em;"></div>
# Installation
@@ -18,43 +18,60 @@ Three types of applications are available: for the **desktop** (Windows, macOS a
## Desktop applications
Operating System | Download
-----------------|--------
Windows (64-bit only) | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.79/Joplin-Setup-1.0.79.exe'><img alt='Get it on Windows' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/BadgeWindows.png'/></a>
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.79/Joplin-1.0.79.dmg'><img alt='Get it on macOS' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/BadgeMacOS.png'/></a>
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.79/Joplin-1.0.79-x86_64.AppImage'><img alt='Get it on Linux' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/BadgeLinux.png'/></a>
Operating System | Download | Alternative
-----------------|--------|-------------------
Windows (64-bit only) | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.83/Joplin-Setup-1.0.83.exe'><img alt='Get it on Windows' height="40px" src='https://joplin.cozic.net/images/BadgeWindows.png'/></a> |
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.83/Joplin-1.0.83.dmg'><img alt='Get it on macOS' height="40px" src='https://joplin.cozic.net/images/BadgeMacOS.png'/></a> |
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.83/Joplin-1.0.83-x86_64.AppImage'><img alt='Get it on Linux' height="40px" src='https://joplin.cozic.net/images/BadgeLinux.png'/></a> | An Arch Linux package [is also available](#terminal-application).
## Mobile applications
Operating System | Download | Alt. Download
-----------------|----------|----------------
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.115/joplin-v1.0.115.apk)
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/BadgeIOS.png'/></a> | -
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplin.cozic.net/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.118/joplin-v1.0.118.apk)
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://joplin.cozic.net/images/BadgeIOS.png'/></a> | -
## Terminal application
On macOS:
brew install joplin
On Linux or Windows (via [WSL](https://msdn.microsoft.com/en-us/commandline/wsl/faq?f=255&MSPPError=-2147217396)):
**Important:** First, [install Node 8+](https://nodejs.org/en/download/package-manager/). Node 8 is LTS but not yet available everywhere so you might need to manually install it.
NPM_CONFIG_PREFIX=~/.joplin-bin npm install -g joplin
sudo ln -s ~/.joplin-bin/bin/joplin /usr/bin/joplin
By default, the application binary will be installed under `~/.joplin-bin`. You may change this directory if needed. Alternatively, if your npm permissions are setup as described [here](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-2-change-npms-default-directory-to-another-directory) (Option 2) then simply running `npm -g install joplin` would work.
Operating system | Method
-----------------|----------------
macOS | `brew install joplin`
Linux or Windows (via [WSL](https://msdn.microsoft.com/en-us/commandline/wsl/faq?f=255&MSPPError=-2147217396)) | **Important:** First, [install Node 8+](https://nodejs.org/en/download/package-manager/). Node 8 is LTS but not yet available everywhere so you might need to manually install it.<br/><br/>`NPM_CONFIG_PREFIX=~/.joplin-bin npm install -g joplin`<br/>`sudo ln -s ~/.joplin-bin/bin/joplin /usr/bin/joplin`<br><br>By default, the application binary will be installed under `~/.joplin-bin`. You may change this directory if needed. Alternatively, if your npm permissions are setup as described [here](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-2-change-npms-default-directory-to-another-directory) (Option 2) then simply running `npm -g install joplin` would work.
Arch Linux | An Arch Linux pakage is available [here](https://aur.archlinux.org/packages/joplin/). To install it, use an AUR wrapper such as yay: `yay -S joplin`. Both the CLI tool (type `joplin`) and desktop app (type `joplin-desktop`) are packaged. For support, please go to the [GitHub repo](https://github.com/masterkorp/joplin-pkgbuild).
To start it, type `joplin`.
For usage information, please refer to the full [Joplin Terminal Application Documentation](https://joplin.cozic.net/terminal).
<!-- TOC -->
# Table of contents
- Applications
- [Desktop application](https://github.com/laurent22/joplin/blob/master/readme/desktop.md)
- [Mobile applications](https://github.com/laurent22/joplin/blob/master/readme/mobile.md)
- [Terminal application](https://github.com/laurent22/joplin/blob/master/readme/terminal.md)
- Support
- [Joplin Forum](https://discourse.joplin.cozic.net)
- [How to enable end-to-end encryption](https://github.com/laurent22/joplin/blob/master/readme/e2ee.md)
- [End-to-end encryption spec](https://github.com/laurent22/joplin/blob/master/readme/spec.md)
- [How to enable debug mode](https://github.com/laurent22/joplin/blob/master/readme/debugging.md)
- [FAQ](https://github.com/laurent22/joplin/blob/master/readme/faq.md)
- About
- [Changelog](https://github.com/laurent22/joplin/blob/master/readme/changelog.md)
- [Stats](https://github.com/laurent22/joplin/blob/master/readme/stats.md)
- [Donate](https://github.com/laurent22/joplin/blob/master/readme/donate.md)
<!-- TOC -->
# Features
- Desktop, mobile and terminal applications.
- End To End Encryption (E2EE)
- Synchronisation with various services, including NextCloud, WebDAV and OneDrive. Dropbox is planned.
- Synchronisation with various services, including NextCloud, Dropbox, WebDAV and OneDrive.
- Import Enex files (Evernote export format) and Markdown files.
- Export JEX files (Joplin Export format) and raw files.
- Support notes, to-dos, tags and notebooks.
@@ -105,25 +122,35 @@ Joplin can export to the JEX format (Joplin Export file), which is a tar file th
# Synchronisation
One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or OneDrive, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.
One of the goals of Joplin was to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.
Currently, synchronisation is possible with Nextcloud and OneDrive (by default) or the local filesystem. A Dropbox one will also be available once [this React Native bug](https://github.com/facebook/react-native/issues/14445) is fixed. To setup synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually.
Currently, synchronisation is possible with Nextcloud, Dropbox (by default) or the local filesystem. To setup synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually.
## Nextcloud synchronisation
<img src="https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/nextcloud-logo-background.png" width="100" align="left"> <a href="https://nextcloud.com/">Nextcloud</a> is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.
<img src="https://joplin.cozic.net/images/nextcloud-logo-background.png" width="100" align="left"> <a href="https://nextcloud.com/">Nextcloud</a> is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.
On the **desktop application** or **mobile application**, go to the config screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally `https://example.com/nextcloud/remote.php/webdav/Joplin` (**make sure to create the "Joplin" directory in Nextcloud**), and set the username and password. If it does not work, please [see this explanation](https://github.com/laurent22/joplin/issues/61#issuecomment-373282608) for more details.
On the **terminal application**, you will need to set the `sync.target` config variable and all the `sync.5.path`, `sync.5.username` and `sync.5.password` config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:
:config sync.5.path https://example.com/nextcloud/remote.php/dav/files/USERNAME/Joplin
:config sync.5.username YOUR_USERNAME
:config sync.5.password YOUR_PASSWORD
:config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin
:config sync.5.username YOUR_USERNAME
:config sync.5.password YOUR_PASSWORD
:config sync.target 5
If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.
## Dropbox synchronisation
When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.
On the **desktop application** or **mobile application**, select "Dropbox" as the synchronisation target in the config screen (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
On the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application. It is possible to also synchronise outside of the user interface by typing `joplin sync` from the terminal. This can be used to setup a cron script to synchronise at regular interval. For example, this would do it every 30 minutes:
*/30 * * * * /path/to/joplin sync
## WebDAV synchronisation
Select the "WebDAV" synchronisation target and follow the same instructions as for Nextcloud above.
@@ -142,22 +169,22 @@ WebDAV-compatible services that are known to work with Joplin.
When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.
On the **desktop application** or **mobile application**, select "OneDrive" as the synchronisation target in the config screen (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar. You will be asked to login to OneDrive to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).
On the **desktop application** or **mobile application**, select "OneDrive" as the synchronisation target in the config screen. Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
On the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive). It is possible to also synchronise outside of the user interface by typing `joplin sync` from the terminal. This can be used to setup a cron script to synchronise at regular interval. For example, this would do it every 30 minutes:
*/30 * * * * /path/to/joplin sync
On the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).
# Encryption
Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the [End-To-End Encryption Tutorial](https://joplin.cozic.net/help/e2ee) for more information about this feature and how to enable it.
Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the [End-To-End Encryption Tutorial](https://joplin.cozic.net/e2ee) for more information about this feature and how to enable it.
For a more technical description, mostly relevant for development or to review the method being used, please see the [Encryption specification](https://joplin.cozic.net/help/spec).
For a more technical description, mostly relevant for development or to review the method being used, please see the [Encryption specification](https://joplin.cozic.net/spec).
# Attachments / Resources
Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the resource. In the note viewer, these files, if they are images, will be displayed or, if they are other files (PDF, text files, etc.) they will be displayed as links. Clicking on this link will open the file in the default application.
Resources that are not attached to any note will be automatically deleted after a day or two.
# Notifications
On the desktop and mobile apps, an alarm can be associated with any to-do. It will be triggered at the given time by displaying a notification. How the notification will be displayed depends on the operating system since each has a different way to handle this. Please see below for the requirements for the desktop applications:
@@ -180,29 +207,29 @@ Joplin uses and renders [Github-flavoured Markdown](https://github.com/adam-p/ma
Math expressions can be added using the [Katex notation](https://khan.github.io/KaTeX/). To add an inline equation, wrap the expression in `$EXPRESSION$`, eg. `$\sqrt{3x-1}+(1+x)^2$`. To create an expression block, wrap it as follow:
$$
EXPRESSION
$$
$$
EXPRESSION
$$
For example:
$$
f(x) = \int_{-\infty}^\infty
\hat f(\xi)\,e^{2 \pi i \xi x}
\,d\xi
$$
$$
f(x) = \int_{-\infty}^\infty
\hat f(\xi)\,e^{2 \pi i \xi x}
\,d\xi
$$
Here is an example with the Markdown and rendered result side by side:
<img src="https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/Katex.png" style="max-width: 100%; max-height: 35em;">
<img src="https://joplin.cozic.net/images/Katex.png" style="max-width: 100%; max-height: 35em;">
## Checkboxes
Checkboxes can be added like so:
- [ ] Milk
- [ ] Rice
- [ ] Eggs
- [ ] Milk
- [ ] Rice
- [ ] Eggs
The checkboxes can then be ticked in the mobile and desktop applications.
@@ -212,6 +239,12 @@ Donations to Joplin support the development of the project. Developing quality a
Please see the [donation page](https://joplin.cozic.net/donate/) for information on how to support the development of Joplin.
# Community
- For general discussion about Joplin, user support, software development questions, and to discuss new features, go to the [Joplin Forum](https://discourse.joplin.cozic.net/). It is possible to login with your GitHub account.
- For bug reports and feature requests, go to the [GitHub Issue Tracker](https://github.com/laurent22/joplin/issues).
- The latest news are often posted [on this Twitter account](https://twitter.com/laurent2233).
# Contributing
Please see the guide for information on how to contribute to the development of Joplin: https://github.com/laurent22/joplin/blob/master/CONTRIBUTING.md
@@ -234,20 +267,21 @@ Current translations:
<!-- LOCALE-TABLE-AUTO-GENERATED -->
&nbsp; | Language | Po File | Last translator | Percent done
---|---|---|---|---
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/es/basque_country.png) | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 79%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/hr.png) | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić <trbuhom@net.hr> | 64%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/cz.png) | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt <lukas@aiya.cz> | 99%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/dk.png) | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | | 99%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/de.png) | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Tobias Grasse <mail@tobias-grasse.net> | 98%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/gb.png) | English | [en_GB](https://github.com/laurent22/joplin/blob/master/CliClient/locales/en_GB.po) | | 100%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/es.png) | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín <f@mrtn.es> | 98%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/fr.png) | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 100%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/it.png) | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 66%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/be.png) | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 79%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/br.png) | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos <rnbastos@gmail.com> | 97%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/ru.png) | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov <artyom.karlov@gmail.com> | 98%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/cn.png) | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | RCJacH <RCJacH@outlook.com> | 66%
![](https://raw.githubusercontent.com/stevenrskelton/flag-icon/master/png/16/country-4x3/jp.png) | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 64%
![](https://joplin.cozic.net/images/flags/es/basque_country.png) | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 76%
![](https://joplin.cozic.net/images/flags/country-4x3/hr.png) | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić <trbuhom@net.hr> | 62%
![](https://joplin.cozic.net/images/flags/country-4x3/cz.png) | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt <lukas@aiya.cz> | 96%
![](https://joplin.cozic.net/images/flags/country-4x3/dk.png) | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | Morten Juhl-Johansen Zölde-Fejér <mjjzf@syntaktisk. | 98%
![](https://joplin.cozic.net/images/flags/country-4x3/de.png) | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Tobias Grasse <mail@tobias-grasse.net> | 95%
![](https://joplin.cozic.net/images/flags/country-4x3/gb.png) | English | [en_GB](https://github.com/laurent22/joplin/blob/master/CliClient/locales/en_GB.po) | | 100%
![](https://joplin.cozic.net/images/flags/country-4x3/es.png) | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín <f@mrtn.es> | 99%
![](https://joplin.cozic.net/images/flags/country-4x3/fr.png) | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 100%
![](https://joplin.cozic.net/images/flags/country-4x3/es.png) | Galician | [gl_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/gl_ES.po) | Marcos Lans <marcoslansgarza@gmail.com> | 97%
![](https://joplin.cozic.net/images/flags/country-4x3/it.png) | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 63%
![](https://joplin.cozic.net/images/flags/country-4x3/be.png) | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 77%
![](https://joplin.cozic.net/images/flags/country-4x3/br.png) | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos <rnbastos@gmail.com> | 99%
![](https://joplin.cozic.net/images/flags/country-4x3/ru.png) | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov <artyom.karlov@gmail.com> | 95%
![](https://joplin.cozic.net/images/flags/country-4x3/cn.png) | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 92%
![](https://joplin.cozic.net/images/flags/country-4x3/jp.png) | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 62%
<!-- LOCALE-TABLE-AUTO-GENERATED -->
# Known bugs

View File

@@ -90,8 +90,8 @@ android {
applicationId "net.cozic.joplin"
minSdkVersion 16
targetSdkVersion 22
versionCode 2097293
versionName "1.0.115"
versionCode 2097296
versionName "1.0.118"
ndk {
abiFilters "armeabi-v7a", "x86"
}

View File

@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>10.0.19</string>
<string>10.0.20</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>19</string>
<string>20</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>

View File

@@ -368,11 +368,11 @@ class BaseApplication {
let initArgs = startFlags.matched;
if (argv.length) this.showPromptString_ = false;
if (process.argv[1].indexOf('joplindev') >= 0) {
if (!initArgs.profileDir) initArgs.profileDir = '/mnt/d/Temp/TestNotes2';
initArgs.logLevel = Logger.LEVEL_DEBUG;
initArgs.env = 'dev';
}
// if (process.argv[1].indexOf('joplindev') >= 0) {
// if (!initArgs.profileDir) initArgs.profileDir = '/mnt/d/Temp/TestNotes2';
// initArgs.logLevel = Logger.LEVEL_DEBUG;
// initArgs.env = 'dev';
// }
let appName = initArgs.env == 'dev' ? 'joplindev' : 'joplin';
if (Setting.value('appId').indexOf('-desktop') >= 0) appName += '-desktop';
@@ -429,7 +429,7 @@ class BaseApplication {
Setting.setValue('autoUpdateEnabled', 0);
Setting.setValue('sync.interval', 3600);
}
Setting.setValue('firstStart', 0);
} else {
setLocale(Setting.value('locale'));

View File

@@ -10,7 +10,7 @@ class Dropdown extends React.Component {
this.headerRef_ = null;
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.setState({
headerSize: { x: 0, y: 0, width: 0, height: 0 },
listVisible: false,

View File

@@ -34,7 +34,7 @@ class ItemList extends React.Component {
});
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.setState({
topItemIndex: 0,
bottomItemIndex: 0,
@@ -45,7 +45,7 @@ class ItemList extends React.Component {
this.updateStateItemIndexes();
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
if (newProps.itemHeight) {
this.setState({
itemHeight: newProps.itemHeight,

View File

@@ -26,7 +26,7 @@ class ActionButtonComponent extends React.Component {
};
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
if ('buttonIndex' in newProps) {
this.setState({ buttonIndex: newProps.buttonIndex });
}

View File

@@ -16,7 +16,7 @@ class AppNavComponent extends Component {
}
}
componentWillMount() {
UNSAFE_componentWillMount() {
if (Platform.OS === 'ios') {
this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this.keyboardDidShow.bind(this));
this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this.keyboardDidHide.bind(this));

View File

@@ -19,11 +19,11 @@ class Checkbox extends Component {
}
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.setState({ checked: this.props.checked });
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
if ('checked' in newProps) {
this.setState({ checked: newProps.checked });
}

View File

@@ -16,6 +16,7 @@ const globalStyle = {
selectedColor: '#e5e5e5',
disabledOpacity: 0.2,
colorUrl: '#000CFF',
textSelectionColor: "#0096FF",
raisedBackgroundColor: "#0080EF",
raisedColor: "#003363",
@@ -99,7 +100,10 @@ function addExtraStyles(style) {
}
function themeStyle(theme) {
if (!theme) throw new Error('Theme not set');
if (!theme) {
console.warn('Theme not set!! Defaulting to Light theme');
theme = Setting.THEME_LIGHT;
}
if (themeCache_[theme]) return themeCache_[theme];
@@ -111,6 +115,7 @@ function themeStyle(theme) {
output.colorFaded = '#777777';
output.dividerColor = '#555555';
output.selectedColor = '#333333';
output.textSelectionColor = '#00AEFF';
output.raisedBackgroundColor = "#0F2051";
output.raisedColor = "#788BC3";

View File

@@ -18,7 +18,7 @@ class NoteBodyViewer extends Component {
this.isMounted_ = false;
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.mdToHtml_ = new MdToHtml({ supportsResourceLinks: false });
this.isMounted_ = true;
}

View File

@@ -68,12 +68,12 @@ class NoteListComponent extends Component {
return output;
}
componentWillMount() {
UNSAFE_componentWillMount() {
const newDataSource = this.state.dataSource.cloneWithRows(this.filterNotes(this.props.items));
this.setState({ dataSource: newDataSource });
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
// https://stackoverflow.com/questions/38186114/react-native-redux-and-listview
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.filterNotes(newProps.items)),

View File

@@ -96,7 +96,7 @@ class NoteTagsDialogComponent extends React.Component {
}
}
componentWillMount() {
UNSAFE_componentWillMount() {
const noteId = this.props.noteId;
this.setState({ noteId: noteId });
this.loadNoteTags(noteId);
@@ -164,7 +164,7 @@ class NoteTagsDialogComponent extends React.Component {
const dialogContent = (
<View style={{flex:1}}>
<View style={this.styles().newTagBox}>
<Text style={this.styles().newTagBoxLabel}>{_('New tags:')}</Text><TextInput value={this.state.newTags} onChangeText={value => { this.setState({ newTags: value }) }} style={this.styles().newTagBoxInput}/>
<Text style={this.styles().newTagBoxLabel}>{_('New tags:')}</Text><TextInput selectionColor={theme.textSelectionColor} value={this.state.newTags} onChangeText={value => { this.setState({ newTags: value }) }} style={this.styles().newTagBoxInput}/>
</View>
<FlatList
data={this.state.tagListData}

View File

@@ -31,7 +31,7 @@ class ConfigScreenComponent extends BaseScreenComponent {
};
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.setState({ settings: this.props.settings });
}
@@ -165,7 +165,7 @@ class ConfigScreenComponent extends BaseScreenComponent {
return (
<View key={key} style={this.styles().settingContainer}>
<Text key="label" style={this.styles().settingText}>{md.label()}</Text>
<TextInput autoCapitalize="none" key="control" style={this.styles().settingControl} value={value} onChangeText={(value) => updateSettingValue(key, value)} secureTextEntry={!!md.secure} />
<TextInput selectionColor={theme.textSelectionColor} autoCapitalize="none" key="control" style={this.styles().settingControl} value={value} onChangeText={(value) => updateSettingValue(key, value)} secureTextEntry={!!md.secure} />
</View>
);
} else {

View File

@@ -23,7 +23,7 @@ class DropboxLoginScreenComponent extends BaseScreenComponent {
);
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.shared_.refreshUrl();
}
@@ -62,7 +62,7 @@ class DropboxLoginScreenComponent extends BaseScreenComponent {
</TouchableOpacity>
</View>
<Text style={this.styles().stepText}>{_('Step 2: Enter the code provided by Dropbox:')}</Text>
<TextInput value={this.state.authCode} onChangeText={this.shared_.authCodeInput_change} style={theme.lineInput}/>
<TextInput selectionColor={theme.textSelectionColor} value={this.state.authCode} onChangeText={this.shared_.authCodeInput_change} style={theme.lineInput}/>
<Button disabled={this.state.checkingAuthToken} title={_("Submit")} onPress={this.shared_.submit_click}></Button>
</View>

View File

@@ -48,11 +48,11 @@ class EncryptionConfigScreenComponent extends BaseScreenComponent {
return shared.refreshStats(this);
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.initState(this.props);
}
componentWillReceiveProps(nextProps) {
UNSAFE_componentWillReceiveProps(nextProps) {
this.initState(nextProps);
}
@@ -122,7 +122,7 @@ class EncryptionConfigScreenComponent extends BaseScreenComponent {
<Text style={this.styles().normalText}>{_('Created: %s', time.formatMsToLocal(mk.created_time))}</Text>
<View style={{flexDirection: 'row', alignItems: 'center'}}>
<Text style={{flex:0, fontSize: theme.fontSize, marginRight: 10, color: theme.color}}>{_('Password:')}</Text>
<TextInput secureTextEntry={true} value={password} onChangeText={(text) => onPasswordChange(text)} style={inputStyle}></TextInput>
<TextInput selectionColor={theme.textSelectionColor} secureTextEntry={true} value={password} onChangeText={(text) => onPasswordChange(text)} style={inputStyle}></TextInput>
<Text style={{fontSize: theme.fontSize, marginRight: 10, color: theme.color}}>{passwordOk}</Text>
<Button title={_('Save')} onPress={() => onSaveClick()}></Button>
</View>
@@ -147,7 +147,7 @@ class EncryptionConfigScreenComponent extends BaseScreenComponent {
return (
<View style={{flex:1, borderColor: theme.dividerColor, borderWidth: 1, padding: 10, marginTop: 10, marginBottom: 10}}>
<Text style={{fontSize: theme.fontSize, color: theme.color}}>{_('Enabling encryption means *all* your notes and attachments are going to be re-synchronised and sent encrypted to the sync target. Do not lose the password as, for security purposes, this will be the *only* way to decrypt the data! To enable encryption, please enter your password below.')}</Text>
<TextInput style={{margin: 10, color: theme.color, borderWidth: 1, borderColor: theme.dividerColor }} secureTextEntry={true} value={this.state.passwordPromptAnswer} onChangeText={(text) => { this.setState({ passwordPromptAnswer: text }) }}></TextInput>
<TextInput selectionColor={theme.textSelectionColor} style={{margin: 10, color: theme.color, borderWidth: 1, borderColor: theme.dividerColor }} secureTextEntry={true} value={this.state.passwordPromptAnswer} onChangeText={(text) => { this.setState({ passwordPromptAnswer: text }) }}></TextInput>
<View style={{flexDirection: 'row'}}>
<View style={{flex:1 , marginRight:10}} >
<Button title={_('Enable')} onPress={() => { onEnableClick() }}></Button>
@@ -224,7 +224,7 @@ class EncryptionConfigScreenComponent extends BaseScreenComponent {
{<View style={{backgroundColor: theme.warningBackgroundColor, paddingTop: 5, paddingBottom: 5, paddingLeft: 10, paddingRight: 10 }}>
<Text>{_('For more information about End-To-End Encryption (E2EE) and advices on how to enable it please check the documentation:')}</Text>
<TouchableOpacity onPress={() => { Linking.openURL('https://joplin.cozic.net/help/e2ee') }}><Text>https://joplin.cozic.net/help/e2ee</Text></TouchableOpacity>
<TouchableOpacity onPress={() => { Linking.openURL('https://joplin.cozic.net/e2ee') }}><Text>https://joplin.cozic.net/e2ee</Text></TouchableOpacity>
</View>}
<Text style={this.styles().titleText}>{_('Status')}</Text>

View File

@@ -43,7 +43,7 @@ class FolderScreenComponent extends BaseScreenComponent {
return this.styles_[this.props.theme];
}
componentWillMount() {
UNSAFE_componentWillMount() {
if (!this.props.folderId) {
const folder = Folder.new();
this.setState({
@@ -103,6 +103,7 @@ class FolderScreenComponent extends BaseScreenComponent {
render() {
let saveButtonDisabled = !this.isModified();
const theme = themeStyle(this.props.theme);
return (
<View style={this.rootStyle(this.props.theme).root}>
@@ -112,7 +113,7 @@ class FolderScreenComponent extends BaseScreenComponent {
saveButtonDisabled={saveButtonDisabled}
onSaveButtonPress={() => this.saveFolderButton_press()}
/>
<TextInput style={this.styles().textInput} autoFocus={true} value={this.state.folder.title} onChangeText={(text) => this.title_changeText(text)} />
<TextInput selectionColor={theme.textSelectionColor} style={this.styles().textInput} autoFocus={true} value={this.state.folder.title} onChangeText={(text) => this.title_changeText(text)} />
<dialogs.DialogBox ref={dialogbox => { this.dialogbox = dialogbox }}/>
</View>
);

View File

@@ -61,7 +61,7 @@ class LogScreenComponent extends BaseScreenComponent {
return this.styles_[this.props.theme];
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.resfreshLogEntries();
}

View File

@@ -160,7 +160,7 @@ class NoteScreenComponent extends BaseScreenComponent {
return shared.isModified(this);
}
async componentWillMount() {
async UNSAFE_componentWillMount() {
BackButtonService.addHandler(this.backHandler);
NavService.addHandler(this.navHandler);
@@ -481,6 +481,7 @@ class NoteScreenComponent extends BaseScreenComponent {
value={note.body}
onChangeText={(text) => this.body_changeText(text)}
blurOnSubmit={false}
selectionColor={theme.textSelectionColor}
/>
);
}
@@ -545,6 +546,7 @@ class NoteScreenComponent extends BaseScreenComponent {
style={titleTextInputStyle}
value={note.title}
onChangeText={(text) => this.title_changeText(text)}
selectionColor={theme.textSelectionColor}
/>
</View>
);

View File

@@ -64,7 +64,7 @@ class NotesScreenComponent extends BaseScreenComponent {
await this.refreshNotes();
}
async componentWillReceiveProps(newProps) {
async UNSAFE_componentWillReceiveProps(newProps) {
if (newProps.notesOrder !== this.props.notesOrder ||
newProps.selectedFolderId != this.props.selectedFolderId ||
newProps.selectedTagId != this.props.selectedTagId ||

View File

@@ -21,7 +21,7 @@ class OneDriveLoginScreenComponent extends BaseScreenComponent {
this.authCode_ = null;
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.setState({
webviewUrl: this.startUrl(),
});

View File

@@ -70,7 +70,7 @@ class SearchScreenComponent extends BaseScreenComponent {
this.isMounted_ = false;
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
let newState = {};
if ('query' in newProps) newState.query = newProps.query;
@@ -162,6 +162,7 @@ class SearchScreenComponent extends BaseScreenComponent {
onSubmitEditing={() => { this.searchTextInput_submit() }}
onChangeText={(text) => this.searchTextInput_changeText(text) }
value={this.state.query}
selectionColor={theme.textSelectionColor}
/>
<TouchableHighlight onPress={() => this.clearButton_press() }>
<Icon name='md-close-circle' style={this.styles().clearIcon} />

View File

@@ -34,7 +34,7 @@ class StatusScreenComponent extends BaseScreenComponent {
};
}
componentWillMount() {
UNSAFE_componentWillMount() {
this.resfreshScreen();
}

View File

@@ -25,7 +25,7 @@ class TagScreenComponent extends BaseScreenComponent {
this.refreshNotes();
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
if (newProps.selectedTagId !== this.props.selectedTagId) {
this.refreshNotes(newProps);
}

View File

@@ -14,7 +14,7 @@ class SelectDateTimeDialog extends Component {
this.state = { date: null };
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
if (newProps.date != this.state.date) {
this.setState({ date: newProps.date });
}

View File

@@ -72,7 +72,19 @@ class Resource extends BaseItem {
await this.fsDriver().move(noExtPath, encryptedPath);
}
await this.encryptionService().decryptFile(encryptedPath, plainTextPath);
try {
await this.encryptionService().decryptFile(encryptedPath, plainTextPath);
} catch (error) {
if (error.code === 'invalidIdentifier') {
// As the identifier is invalid it most likely means that this is not encrypted data
// at all. It can happen for example when there's a crash between the moment the data
// is decrypted and the resource item is updated.
this.logger().warn('Found a resource that was most likely already decrypted but was marked as encrypted. Marked it as decrypted: ' + item.id)
this.fsDriver().move(encryptedPath, plainTextPath);
} else {
throw error;
}
}
decryptedItem.encryption_blob_encrypted = 0;
return super.save(decryptedItem, { autoTimestamp: false });
@@ -151,6 +163,8 @@ class Resource extends BaseItem {
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
const resource = await Resource.load(id);
if (!resource) continue;
const path = Resource.fullPath(resource);
await this.fsDriver().remove(path);
await super.batchDelete([id], options);

View File

@@ -7,6 +7,7 @@ const { sprintf } = require('sprintf-js');
const ObjectUtils = require('lib/ObjectUtils');
const { toTitleCase } = require('lib/string-utils.js');
const { _, supportedLocalesToLanguages, defaultLocale } = require('lib/locale.js');
const { shim } = require('lib/shim');
class Setting extends BaseModel {
@@ -21,6 +22,8 @@ class Setting extends BaseModel {
static metadata() {
if (this.metadata_) return this.metadata_;
const platform = shim.platformName();
// A "public" setting means that it will show up in the various config screens (or config command for the CLI tool), however
// if if private a setting might still be handled and modified by the app. For instance, the settings related to sorting notes are not
// public for the mobile and desktop apps because they are handled separately in menus.
@@ -40,6 +43,7 @@ class Setting extends BaseModel {
options[Setting.DATE_FORMAT_3] = time.formatMsToLocal(now, Setting.DATE_FORMAT_3);
options[Setting.DATE_FORMAT_4] = time.formatMsToLocal(now, Setting.DATE_FORMAT_4);
options[Setting.DATE_FORMAT_5] = time.formatMsToLocal(now, Setting.DATE_FORMAT_5);
options[Setting.DATE_FORMAT_6] = time.formatMsToLocal(now, Setting.DATE_FORMAT_6);
return options;
}},
'timeFormat': { value: Setting.TIME_FORMAT_1, type: Setting.TYPE_STRING, isEnum: true, public: true, label: () => _('Time format'), options: () => {
@@ -79,7 +83,15 @@ class Setting extends BaseModel {
'body': _('Focus body'),
};
}},
'showTrayIcon': { value: true, type: Setting.TYPE_BOOL, public: true, appTypes: ['desktop'], label: () => _('Show tray icon') },
// Tray icon (called AppIndicator) doesn't work in Ubuntu
// http://www.webupd8.org/2017/04/fix-appindicator-not-working-for.html
// Might be fixed in Electron 18.x but no non-beta release yet. So for now
// by default we disable it on Linux.
'showTrayIcon': { value: platform !== 'linux', type: Setting.TYPE_BOOL, public: true, appTypes: ['desktop'], label: () => _('Show tray icon'), description: () => {
return platform === 'linux' ? _('Note: Does not work in all desktop environments.') : null;
}},
'encryption.enabled': { value: false, type: Setting.TYPE_BOOL, public: false },
'encryption.activeMasterKeyId': { value: '', type: Setting.TYPE_STRING, public: false },
'encryption.passwordCache': { value: {}, type: Setting.TYPE_OBJECT, public: false },
@@ -98,6 +110,7 @@ class Setting extends BaseModel {
};
}},
'noteVisiblePanes': { value: ['editor', 'viewer'], type: Setting.TYPE_ARRAY, public: false, appTypes: ['desktop'] },
'sidebarVisibility': { value: true, type: Setting.TYPE_BOOL, public: false, appTypes: ['desktop'] },
'showAdvancedOptions': { value: false, type: Setting.TYPE_BOOL, public: true, appTypes: ['mobile' ], label: () => _('Show advanced options') },
'sync.target': { value: SyncTargetRegistry.nameToId('dropbox'), type: Setting.TYPE_INT, isEnum: true, public: true, label: () => _('Synchronisation target'), description: (appType) => { return appType !== 'cli' ? null : _('The target to synchonise to. Each sync target may have additional parameters which are named as `sync.NUM.NAME` (all documented below).') }, options: () => {
return SyncTargetRegistry.idAndLabelPlainObject();
@@ -224,7 +237,7 @@ class Setting extends BaseModel {
if (!this.cache_) throw new Error('Settings have not been initialized!');
value = this.formatValue(key, value);
for (let i = 0; i < this.cache_.length; i++) {
let c = this.cache_[i];
if (c.key == key) {
@@ -291,7 +304,7 @@ class Setting extends BaseModel {
if (md.type == Setting.TYPE_OBJECT) return value ? JSON.stringify(value) : '{}';
if (md.type == Setting.TYPE_STRING) return value ? value + '' : '';
throw new Error('Unhandled value type: ' + md.type);
throw new Error('Unhandled value type: ' + md.type);
}
static formatValue(key, value) {
@@ -461,7 +474,7 @@ class Setting extends BaseModel {
}
await BaseModel.db().transactionExecBatch(queries);
this.logger().info('Settings have been saved.');
}
@@ -521,6 +534,7 @@ Setting.DATE_FORMAT_2 = 'DD/MM/YY';
Setting.DATE_FORMAT_3 = 'MM/DD/YYYY';
Setting.DATE_FORMAT_4 = 'MM/DD/YY';
Setting.DATE_FORMAT_5 = 'YYYY-MM-DD';
Setting.DATE_FORMAT_6 = 'DD.MM.YYYY';
Setting.TIME_FORMAT_1 = 'HH:mm';
Setting.TIME_FORMAT_2 = 'h:mm A';

View File

@@ -4,6 +4,7 @@ const { shim } = require('lib/shim.js');
const Setting = require('lib/models/Setting.js');
const MasterKey = require('lib/models/MasterKey');
const BaseItem = require('lib/models/BaseItem');
const JoplinError = require('lib/JoplinError');
const { _ } = require('lib/locale.js');
function hexPad(s, length) {
@@ -322,7 +323,7 @@ class EncryptionService {
async decryptAbstract_(source, destination) {
const identifier = await source.read(5);
if (!this.isValidHeaderIdentifier(identifier)) throw new Error('Invalid encryption identifier. Data is not actually encrypted? ID was: ' + identifier);
if (!this.isValidHeaderIdentifier(identifier)) throw new JoplinError('Invalid encryption identifier. Data is not actually encrypted? ID was: ' + identifier, 'invalidIdentifier');
const mdSizeHex = await source.read(6);
const mdSize = parseInt(mdSizeHex, 16);
if (isNaN(mdSize) || !mdSize) throw new Error('Invalid header metadata size: ' + mdSizeHex);

View File

@@ -34,23 +34,58 @@ function shimInit() {
return locale;
}
const resizeImage_ = async function(filePath, targetPath) {
const sharp = require('sharp');
const Resource = require('lib/models/Resource.js');
const resizeImage_ = async function(filePath, targetPath, mime) {
if (shim.isElectron()) { // For Electron
const nativeImage = require('electron').nativeImage;
let image = nativeImage.createFromPath(filePath);
if (image.isEmpty()) throw new Error('Image is invalid or does not exist: ' + filePath);
return new Promise((resolve, reject) => {
sharp(filePath)
.resize(Resource.IMAGE_MAX_DIMENSION, Resource.IMAGE_MAX_DIMENSION)
.max()
.withoutEnlargement()
.toFile(targetPath, (err, info) => {
if (err) {
reject(err);
} else {
resolve(info);
}
const maxDim = Resource.IMAGE_MAX_DIMENSION;
const size = image.getSize();
if (size.width <= maxDim && size.height <= maxDim) {
shim.fsDriver().copy(filePath, targetPath);
return;
}
const options = {};
if (size.width > size.height) {
options.width = maxDim;
} else {
options.height = maxDim;
}
image = image.resize(options);
let buffer = null;
if (mime === 'image/png') {
buffer = image.toPNG();
} else if (mime === 'image/jpg' || mime === 'image/jpeg') {
buffer = image.toJPEG(90);
}
if (!buffer) throw new Error('Cannot reisze image because mime type "' + mime + '" is not supported: ' + targetPath);
await shim.fsDriver().writeFile(targetPath, buffer, 'buffer');
} else { // For the CLI tool
const sharp = require('sharp');
const Resource = require('lib/models/Resource.js');
return new Promise((resolve, reject) => {
sharp(filePath)
.resize(Resource.IMAGE_MAX_DIMENSION, Resource.IMAGE_MAX_DIMENSION)
.max()
.withoutEnlargement()
.toFile(targetPath, (err, info) => {
if (err) {
reject(err);
} else {
resolve(info);
}
});
});
});
}
}
shim.attachFileToNote = async function(note, filePath) {
@@ -73,7 +108,7 @@ function shimInit() {
let targetPath = Resource.fullPath(resource);
if (resource.mime == 'image/jpeg' || resource.mime == 'image/jpg' || resource.mime == 'image/png') {
const result = await resizeImage_(filePath, targetPath);
const result = await resizeImage_(filePath, targetPath, resource.mime);
} else {
await fs.copy(filePath, targetPath, { overwrite: true });
}

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

@@ -6,6 +6,7 @@ locales['de_DE'] = require('./de_DE.json');
locales['es_ES'] = require('./es_ES.json');
locales['eu'] = require('./eu.json');
locales['fr_FR'] = require('./fr_FR.json');
locales['gl_ES'] = require('./gl_ES.json');
locales['hr_HR'] = require('./hr_HR.json');
locales['it_IT'] = require('./it_IT.json');
locales['ja_JP'] = require('./ja_JP.json');

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

@@ -6,6 +6,14 @@
// So there's basically still a one way flux: React => SQLite => Redux => React
// To disable warnings internal to React Native for componentWillMount and
// componentWillReceiveProps. Should be fixed at some point and at that
// time this code could be removed.
// https://github.com/facebook/react-native/issues/18165#issuecomment-369907978
require("ReactFeatureFlags").warnAboutDeprecatedLifecycles = false;
const { AppRegistry } = require('react-native');
const { Root } = require('./root.js');

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,7 @@
"prop-types": "^15.6.0",
"query-string": "4.3.4",
"react": "16.0.0-beta.5",
"react-native": "0.49.0",
"react-native": "0.55.0",
"react-native-action-button": "^2.6.9",
"react-native-datepicker": "^1.6.0",
"react-native-dialogbox": "^0.6.6",
@@ -43,8 +43,8 @@
"react-native-sqlite-storage": "3.3.*",
"react-native-vector-icons": "^4.4.2",
"react-navigation": "^1.0.0-beta.21",
"react-redux": "4.4.8",
"redux": "3.6.0",
"react-redux": "5.0.7",
"redux": "4.0.0",
"stream": "0.0.2",
"string-natural-compare": "^2.0.2",
"timers": "^0.1.1",

View File

@@ -72,8 +72,17 @@ const EncryptionService = require('lib/services/EncryptionService');
let storeDispatch = function(action) {};
const logReducerAction = function(action) {
if (['SIDE_MENU_OPEN_PERCENT', 'SYNC_REPORT_UPDATE'].indexOf(action.type) >= 0) return;
let msg = [action.type];
if (action.routeName) msg.push(action.routeName);
reg.logger().info('Reducer action', msg.join(', '));
}
const generalMiddleware = store => next => async (action) => {
if (['SIDE_MENU_OPEN_PERCENT', 'SYNC_REPORT_UPDATE'].indexOf(action.type) < 0) reg.logger().info('Reducer action', action.type);
logReducerAction(action);
PoorManIntervals.update(); // This function needs to be called regularly so put it here
const result = next(action);
@@ -526,7 +535,7 @@ class AppComponent extends React.Component {
return false;
}
componentWillReceiveProps(newProps) {
UNSAFE_componentWillReceiveProps(newProps) {
if (newProps.syncStarted != this.lastSyncStarted_) {
if (!newProps.syncStarted) FoldersScreenUtils.refreshFolders();
this.lastSyncStarted_ = newProps.syncStarted;

View File

@@ -0,0 +1,5 @@
[Launch]
ProgramExecutable=Joplin\Joplin.exe
DirectoryMoveOK=yes
SupportsUNC=yes
CommandLineArguments=--profile "%PAL:DataDir%"

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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