Compare commits
276 Commits
cli-v1.0.9
...
android-v1
Author | SHA1 | Date | |
---|---|---|---|
|
0c0efeac1f | ||
|
5e0f2642e3 | ||
|
93966b0fa1 | ||
|
e90abf3517 | ||
|
d3fa0dce96 | ||
|
58a7c2fa94 | ||
|
962a8700c2 | ||
|
b5c704e2bb | ||
|
e7b52b19d7 | ||
|
903c2e6d92 | ||
|
abcb1ac760 | ||
|
b6bf76cc4c | ||
|
2bf87655da | ||
|
d4b19f19a1 | ||
|
d8ccc38d5b | ||
|
4e3b8a06ea | ||
|
363632ffa7 | ||
|
994c99f47f | ||
|
96571baadc | ||
|
4ce2b2c948 | ||
|
5d69f7a0a7 | ||
|
bcb1f36ad8 | ||
|
34c65a686c | ||
|
0b32741a12 | ||
|
dbb321a3cc | ||
|
a6e4f47adf | ||
|
fb6dee32ac | ||
|
984dd6f2c0 | ||
|
02bde2c6e9 | ||
|
782d24cc04 | ||
|
4d0af575e5 | ||
|
be8bda8e73 | ||
|
1242de532e | ||
|
7d7ec7f15e | ||
|
ca112ec5d3 | ||
|
5deb8cf76d | ||
|
a2c9737c17 | ||
|
d3fca3d6cc | ||
|
d5574098f0 | ||
|
f5a683f25c | ||
|
5f04adb392 | ||
|
edd0f7e255 | ||
|
67145d9104 | ||
|
003e2afff7 | ||
|
6e9d70c5cb | ||
|
4821b4cdf2 | ||
|
734d4db431 | ||
|
317aaed0ac | ||
|
9778098d6c | ||
|
5b1755f988 | ||
|
2a772895dd | ||
|
5fbb01cf2f | ||
|
f9e0870b4e | ||
|
a58f1e9b4b | ||
|
6fc0d89b30 | ||
|
2dcadab7d2 | ||
|
bb3307e156 | ||
|
ecd07f1209 | ||
|
266cb1174f | ||
|
bfb9b77b6e | ||
|
01b1361dcb | ||
|
3a921720d6 | ||
|
cdfd3d9c31 | ||
|
9961fb64bb | ||
|
3137c355cf | ||
|
16abaf60d2 | ||
|
9004b710ea | ||
|
6ebac21c2b | ||
|
99f79faf83 | ||
|
613fa20806 | ||
|
1b5f812278 | ||
|
3a9643c1ea | ||
|
aee7f5a8ac | ||
|
d3cd378922 | ||
|
4f5e7367d0 | ||
|
2280fb5c43 | ||
|
96fb7c2087 | ||
|
6e994fd8b9 | ||
|
a7cde1e269 | ||
|
f8310ba0d5 | ||
|
b239c3faba | ||
|
3c2281dbf9 | ||
|
ac07bf784d | ||
|
067455542f | ||
|
5bfeaa357b | ||
|
fe27a64331 | ||
|
ed638612aa | ||
|
1d7ec83510 | ||
|
75c710232d | ||
|
5af52afadb | ||
|
0f4324c2f8 | ||
|
b48e1dac94 | ||
|
f0ca8e1e31 | ||
|
74b83eb71e | ||
|
28dce0fbb5 | ||
|
c12d402c7e | ||
|
014f5b123c | ||
|
58601dfc04 | ||
|
9fe7f0adae | ||
|
ea1374371f | ||
|
bce4294529 | ||
|
de409b632a | ||
|
a677b2e844 | ||
|
c63bb19cb6 | ||
|
72fd77812e | ||
|
40f3e72bd1 | ||
|
d6d86f2aff | ||
|
c71809438b | ||
|
3e6e1a0a36 | ||
|
f590ce4a34 | ||
|
67608e29c8 | ||
|
d5c2982093 | ||
|
90fad2a3ab | ||
|
bc7c82e3da | ||
|
cb824f7dd7 | ||
|
32c47a96f1 | ||
|
4e3f8893f7 | ||
|
ca3946689a | ||
|
e2ad2dfcaa | ||
|
d6f7893c56 | ||
|
8c65a7cc31 | ||
|
aabb9be7de | ||
|
544f93bf22 | ||
|
f81dbf4a4c | ||
|
fbec8263a3 | ||
|
68d77a69e6 | ||
|
f2ef2446c6 | ||
|
875cb5387a | ||
|
ae9ecdad40 | ||
|
86a0e34975 | ||
|
1141074745 | ||
|
efc46d9989 | ||
|
2b45f745b6 | ||
|
37fb81e9b2 | ||
|
255a4fac93 | ||
|
3e3fb88de8 | ||
|
e4cf03ae46 | ||
|
554a3eb10d | ||
|
61881b528a | ||
|
c2507cbc4e | ||
|
ed0f6d165c | ||
|
8e22d38eb3 | ||
|
2599c425c3 | ||
|
0e15821a81 | ||
|
c1bb51c12b | ||
|
1532b6d159 | ||
|
945018b698 | ||
|
df7b981e5e | ||
|
4fe495675b | ||
|
7828eef2ad | ||
|
694f81b75f | ||
|
8364b6e08d | ||
|
3f4328ce9d | ||
|
9e0bf1acb2 | ||
|
c9e130a771 | ||
|
26331f61e1 | ||
|
694672859a | ||
|
858ead40b9 | ||
|
b07fe5cc34 | ||
|
0317171097 | ||
|
9741a3a53d | ||
|
7937fab5ff | ||
|
f595be07d4 | ||
|
eef106c99b | ||
|
dbe1833f92 | ||
|
520dc0ae21 | ||
|
c9be287f4a | ||
|
711f5dcaba | ||
|
ebc0aa9809 | ||
|
dcaaf50a5a | ||
|
3370b57134 | ||
|
55c5ddedf4 | ||
|
5e8b09f5af | ||
|
1acffce62d | ||
|
8555ecce87 | ||
|
4df5f668dc | ||
|
cceebeebef | ||
|
c4f19465a6 | ||
|
e868102c98 | ||
|
0d4a1837f5 | ||
|
d6a4436313 | ||
|
03b5c6aa5e | ||
|
250cd47e02 | ||
|
943fef32e7 | ||
|
408634671c | ||
|
570b5856ba | ||
|
d114d14e87 | ||
|
32791f502e | ||
|
083ab0c788 | ||
|
003c4c4e26 | ||
|
f08f89ebd4 | ||
|
3c973144c4 | ||
|
82e99ca658 | ||
|
b04d750cec | ||
|
c804e9f541 | ||
|
7753f3f842 | ||
|
c985b7c682 | ||
|
4509919c22 | ||
|
89b164c7ca | ||
|
e52d17b39a | ||
|
5014914dc9 | ||
|
122ab83a84 | ||
|
7a985c2c8a | ||
|
b11ad30a31 | ||
|
5914fc97df | ||
|
e41ae1832d | ||
|
89b50909ed | ||
|
edccd7412f | ||
|
c76beae057 | ||
|
23c5934a7d | ||
|
a078947d6d | ||
|
0faaf660b4 | ||
|
5ba98b4200 | ||
|
c36513b99d | ||
|
97814531fa | ||
|
fd3e335a02 | ||
|
e676fa2b57 | ||
|
122cbbf673 | ||
|
271793b324 | ||
|
134b31933b | ||
|
0ec5518a62 | ||
|
76931370d7 | ||
|
8cf0e4517a | ||
|
e75c62bf0f | ||
|
058285e0b9 | ||
|
795568d8c2 | ||
|
df4933fddd | ||
|
4046a51472 | ||
|
45845f645d | ||
|
d7fd8944f7 | ||
|
3cee671f25 | ||
|
8f2e5faff3 | ||
|
39ddd934f6 | ||
|
9f8a46b9d9 | ||
|
c6698eaea6 | ||
|
8a96cf3434 | ||
|
74d255c056 | ||
|
71aa841265 | ||
|
14a93a9f26 | ||
|
e1fd9c6922 | ||
|
b9db747b5c | ||
|
4a56c76901 | ||
|
6bb3184a72 | ||
|
7fb8fbd450 | ||
|
9d5bba472e | ||
|
e6d821a45f | ||
|
72f0027e21 | ||
|
29a13a9943 | ||
|
3691ae4d13 | ||
|
4dda397c29 | ||
|
b4b058998d | ||
|
10919e415e | ||
|
4966d74864 | ||
|
c70ecb30a5 | ||
|
acc0d17e0f | ||
|
b509b878bf | ||
|
322ec2efa1 | ||
|
1232661b1e | ||
|
c46d123503 | ||
|
8f4060999f | ||
|
0addd86069 | ||
|
760086307b | ||
|
fc6558a64c | ||
|
eca500880d | ||
|
90bcd7c977 | ||
|
cca0c6eaf3 | ||
|
b0736002be | ||
|
51fc2d8e51 | ||
|
d87c192ff1 | ||
|
52ccf398a6 | ||
|
344d0e2687 | ||
|
dfbe37fdaf | ||
|
37e7ea0b52 | ||
|
44bf518244 | ||
|
63cb9b4968 | ||
|
a6cecc103c |
@@ -3,6 +3,14 @@ if: tag IS present
|
||||
|
||||
rvm: 2.3.3
|
||||
|
||||
# It's important to only build production branches otherwise Electron Builder
|
||||
# might take assets from dev branches and overwrite those of production.
|
||||
# https://docs.travis-ci.com/user/customizing-the-build/#Building-Specific-Branches
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: osx
|
||||
|
62
Assets/JoplinLetter.svg
Normal 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 |
19
BUILD.md
@@ -8,7 +8,7 @@
|
||||
brew install yarn node
|
||||
echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
|
||||
source ~/.bash_profile
|
||||
|
||||
|
||||
If you get a node-gyp related error you might need to manually install it: `npm install -g node-gyp`
|
||||
|
||||
## Linux and Windows (WSL) dependencies
|
||||
@@ -37,12 +37,25 @@ 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.
|
||||
|
||||
## Building Electron application on Windows
|
||||
|
||||
```
|
||||
cd Tools
|
||||
npm install
|
||||
cd ..\ElectronClient\app
|
||||
xcopy /C /I /H /R /Y /S ..\..\ReactNativeClient\lib lib
|
||||
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.
|
||||
|
@@ -1,20 +1,19 @@
|
||||
# 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.
|
||||
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.
|
||||
|
||||
If possible, **please provide a screenshot**. A screenshot showing the problem is often more useful than a paragraph describing it as it can make it immediately clear what the issue is.
|
||||
|
||||
# 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
|
||||
|
||||
If you want to add a new feature, consider asking about it before implementing it to make sure it is within the scope of the project. Of course you are free to create the pull request directly but it is not guaranteed it is going to be accepted.
|
||||
If you want to add a new feature, consider asking about it before implementing it or checking existing discussions to make sure it is within the scope of the project. Of course you are free to create the pull request directly but it is not guaranteed it is going to be accepted.
|
||||
|
||||
Building the apps is relatively easy - please [see the build instructions](https://github.com/laurent22/joplin/blob/master/BUILD.md) for more details.
|
||||
|
||||
# Coding style
|
||||
|
||||
- Only use tabs for indentation, not spaces.
|
||||
- Do not remove or add optional characters from other lines (such as colons or new line characters) as it can make the commit needlessly big, and create conflicts with other changes.
|
||||
|
3
CliClient/.gitignore
vendored
@@ -18,4 +18,5 @@ tests/cli-integration/
|
||||
tests/sync
|
||||
out.txt
|
||||
linkToLocal.sh
|
||||
yarn-error.log
|
||||
yarn-error.log
|
||||
tests/support/dropbox-auth.txt
|
@@ -287,6 +287,8 @@ class AppGui {
|
||||
|
||||
addCommandToConsole(cmd) {
|
||||
if (!cmd) return;
|
||||
const isConfigPassword = cmd.indexOf('config ') >= 0 && cmd.indexOf('password') >= 0;
|
||||
if (isConfigPassword) return;
|
||||
this.stdout(chalk.cyan.bold('> ' + cmd));
|
||||
}
|
||||
|
||||
@@ -494,7 +496,7 @@ class AppGui {
|
||||
cmd = cmd.trim();
|
||||
if (!cmd.length) return;
|
||||
|
||||
this.logger().info('Got command: ' + cmd);
|
||||
// this.logger().debug('Got command: ' + cmd);
|
||||
|
||||
try {
|
||||
let note = this.widget('noteList').currentItem;
|
||||
@@ -755,7 +757,7 @@ class AppGui {
|
||||
if (statusBar.promptActive) processShortcutKeys = false;
|
||||
|
||||
if (processShortcutKeys) {
|
||||
this.logger().info('Shortcut:', shortcutKey, keymapItem);
|
||||
this.logger().debug('Shortcut:', shortcutKey, keymapItem);
|
||||
|
||||
this.currentShortcutKeys_ = [];
|
||||
|
||||
|
@@ -5,6 +5,7 @@ const { JoplinDatabase } = require('lib/joplin-database.js');
|
||||
const { Database } = require('lib/database.js');
|
||||
const { FoldersScreenUtils } = require('lib/folders-screen-utils.js');
|
||||
const { DatabaseDriverNode } = require('lib/database-driver-node.js');
|
||||
const ResourceService = require('lib/services/ResourceService');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const BaseItem = require('lib/models/BaseItem.js');
|
||||
@@ -283,7 +284,7 @@ class Application extends BaseApplication {
|
||||
exit: () => {},
|
||||
showModalOverlay: (text) => {},
|
||||
hideModalOverlay: () => {},
|
||||
stdoutMaxWidth: () => { return 78; },
|
||||
stdoutMaxWidth: () => { return 100; },
|
||||
forceRender: () => {},
|
||||
termSaveState: () => {},
|
||||
termRestoreState: (state) => {},
|
||||
@@ -292,7 +293,7 @@ class Application extends BaseApplication {
|
||||
|
||||
async execCommand(argv) {
|
||||
if (!argv.length) return this.execCommand(['help']);
|
||||
reg.logger().info('execCommand()', argv);
|
||||
// reg.logger().debug('execCommand()', argv);
|
||||
const commandName = argv[0];
|
||||
this.activeCommand_ = this.findCommandByName(commandName);
|
||||
|
||||
@@ -387,10 +388,11 @@ class Application extends BaseApplication {
|
||||
await this.execCommand(argv);
|
||||
} catch (error) {
|
||||
if (this.showStackTraces_) {
|
||||
console.info(error);
|
||||
console.error(error);
|
||||
} else {
|
||||
console.info(error.message);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
} else { // Otherwise open the GUI
|
||||
this.initRedux();
|
||||
@@ -411,6 +413,8 @@ class Application extends BaseApplication {
|
||||
|
||||
const tags = await Tag.allWithNotes();
|
||||
|
||||
ResourceService.runInBackground();
|
||||
|
||||
this.dispatch({
|
||||
type: 'TAG_UPDATE_ALL',
|
||||
items: tags,
|
||||
|
@@ -32,10 +32,6 @@ class BaseCommand {
|
||||
return this.compatibleUis().indexOf(ui) >= 0;
|
||||
}
|
||||
|
||||
aliases() {
|
||||
return [];
|
||||
}
|
||||
|
||||
options() {
|
||||
return [];
|
||||
}
|
||||
|
@@ -102,7 +102,7 @@ function getFooter() {
|
||||
|
||||
output.push('WEBSITE');
|
||||
output.push('');
|
||||
output.push(INDENT + 'http://joplin.cozic.net');
|
||||
output.push(INDENT + 'https://joplin.cozic.net');
|
||||
|
||||
output.push('');
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { Exporter } = require('lib/services/exporter.js');
|
||||
const InteropService = require('lib/services/InteropService.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const { reg } = require('lib/registry.js');
|
||||
@@ -10,15 +10,21 @@ const fs = require('fs-extra');
|
||||
class Command extends BaseCommand {
|
||||
|
||||
usage() {
|
||||
return 'export <directory>';
|
||||
return 'export <path>';
|
||||
}
|
||||
|
||||
description() {
|
||||
return _('Exports Joplin data to the given directory. By default, it will export the complete database including notebooks, notes, tags and resources.');
|
||||
return _('Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.');
|
||||
}
|
||||
|
||||
options() {
|
||||
const service = new InteropService();
|
||||
const formats = service.modules()
|
||||
.filter(m => m.type === 'exporter')
|
||||
.map(m => m.format + (m.description ? ' (' + m.description + ')' : ''));
|
||||
|
||||
return [
|
||||
['--format <format>', _('Destination format: %s', formats.join(', '))],
|
||||
['--note <note>', _('Exports only the given note.')],
|
||||
['--notebook <notebook>', _('Exports only the given notebook.')],
|
||||
];
|
||||
@@ -26,13 +32,9 @@ class Command extends BaseCommand {
|
||||
|
||||
async action(args) {
|
||||
let exportOptions = {};
|
||||
exportOptions.destDir = args.directory;
|
||||
exportOptions.writeFile = (filePath, data) => {
|
||||
return fs.writeFile(filePath, data);
|
||||
};
|
||||
exportOptions.copyFile = (source, dest) => {
|
||||
return fs.copy(source, dest, { overwrite: true });
|
||||
};
|
||||
exportOptions.path = args.path;
|
||||
|
||||
exportOptions.format = args.options.format ? args.options.format : 'jex';
|
||||
|
||||
if (args.options.note) {
|
||||
|
||||
@@ -48,10 +50,10 @@ class Command extends BaseCommand {
|
||||
|
||||
}
|
||||
|
||||
const exporter = new Exporter();
|
||||
const result = await exporter.export(exportOptions);
|
||||
const service = new InteropService();
|
||||
const result = await service.export(exportOptions);
|
||||
|
||||
reg.logger().info('Export result: ', result);
|
||||
result.warnings.map((w) => this.stdout(w));
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -37,6 +37,9 @@ class Command extends BaseCommand {
|
||||
const stdoutWidth = app().commandStdoutMaxWidth();
|
||||
|
||||
if (args.command === 'shortcuts' || args.command === 'keymap') {
|
||||
this.stdout(_('For information on how to customise the shortcuts please visit %s', 'https://joplin.cozic.net/terminal/#shortcuts'));
|
||||
this.stdout('');
|
||||
|
||||
if (app().gui().isDummy()) {
|
||||
throw new Error(_('Shortcuts are not available in CLI mode.'));
|
||||
}
|
||||
@@ -73,10 +76,10 @@ 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 complete list of available keyboard shortcuts, type `help keymap`'));
|
||||
this.stdout(_('For the list of keyboard shortcuts and config options, type `help keymap`'));
|
||||
}
|
||||
|
||||
app().gui().showConsole();
|
||||
|
@@ -1,68 +0,0 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const { importEnex } = require('lib/import-enex');
|
||||
const { filename, basename } = require('lib/path-utils.js');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
|
||||
usage() {
|
||||
return 'import-enex <file> [notebook]';
|
||||
}
|
||||
|
||||
description() {
|
||||
return _('Imports an Evernote notebook file (.enex file).');
|
||||
}
|
||||
|
||||
options() {
|
||||
return [
|
||||
['-f, --force', _('Do not ask for confirmation.')],
|
||||
];
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let filePath = args.file;
|
||||
let folder = null;
|
||||
let folderTitle = args['notebook'];
|
||||
let force = args.options.force === true;
|
||||
|
||||
if (!folderTitle) folderTitle = filename(filePath);
|
||||
folder = await Folder.loadByField('title', folderTitle);
|
||||
const msg = folder ? _('File "%s" will be imported into existing notebook "%s". Continue?', basename(filePath), folderTitle) : _('New notebook "%s" will be created and file "%s" will be imported into it. Continue?', folderTitle, basename(filePath));
|
||||
const ok = force ? true : await this.prompt(msg);
|
||||
if (!ok) return;
|
||||
|
||||
let lastProgress = '';
|
||||
|
||||
let options = {
|
||||
onProgress: (progressState) => {
|
||||
let line = [];
|
||||
line.push(_('Found: %d.', progressState.loaded));
|
||||
line.push(_('Created: %d.', progressState.created));
|
||||
if (progressState.updated) line.push(_('Updated: %d.', progressState.updated));
|
||||
if (progressState.skipped) line.push(_('Skipped: %d.', progressState.skipped));
|
||||
if (progressState.resourcesCreated) line.push(_('Resources: %d.', progressState.resourcesCreated));
|
||||
if (progressState.notesTagged) line.push(_('Tagged: %d.', progressState.notesTagged));
|
||||
lastProgress = line.join(' ');
|
||||
cliUtils.redraw(lastProgress);
|
||||
},
|
||||
onError: (error) => {
|
||||
let s = error.trace ? error.trace : error.toString();
|
||||
this.stdout(s);
|
||||
},
|
||||
}
|
||||
|
||||
folder = !folder ? await Folder.save({ title: folderTitle }) : folder;
|
||||
|
||||
app().gui().showConsole();
|
||||
this.stdout(_('Importing notes...'));
|
||||
await importEnex(folder.id, filePath, options);
|
||||
cliUtils.redrawDone();
|
||||
this.stdout(_('The notes have been imported: %s', lastProgress));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = Command;
|
75
CliClient/app/command-import.js
Normal file
@@ -0,0 +1,75 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const InteropService = require('lib/services/InteropService.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const { filename, basename, fileExtension } = require('lib/path-utils.js');
|
||||
const { importEnex } = require('lib/import-enex');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
const { reg } = require('lib/registry.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const fs = require('fs-extra');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
|
||||
usage() {
|
||||
return 'import <path> [notebook]';
|
||||
}
|
||||
|
||||
description() {
|
||||
return _('Imports data into Joplin.');
|
||||
}
|
||||
|
||||
options() {
|
||||
const service = new InteropService();
|
||||
const formats = service.modules().filter(m => m.type === 'importer').map(m => m.format);
|
||||
|
||||
return [
|
||||
['--format <format>', _('Source format: %s', (['auto'].concat(formats)).join(', '))],
|
||||
['-f, --force', _('Do not ask for confirmation.')],
|
||||
];
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let folder = await app().loadItem(BaseModel.TYPE_FOLDER, args.notebook);
|
||||
|
||||
if (args.notebook && !folder) throw new Error(_('Cannot find "%s".', args.notebook));
|
||||
|
||||
const importOptions = {};
|
||||
importOptions.path = args.path;
|
||||
importOptions.format = args.options.format ? args.options.format : 'auto';
|
||||
importOptions.destinationFolderId = folder ? folder.id : null;
|
||||
|
||||
let lastProgress = '';
|
||||
|
||||
// onProgress/onError supported by Enex import only
|
||||
|
||||
importOptions.onProgress = (progressState) => {
|
||||
let line = [];
|
||||
line.push(_('Found: %d.', progressState.loaded));
|
||||
line.push(_('Created: %d.', progressState.created));
|
||||
if (progressState.updated) line.push(_('Updated: %d.', progressState.updated));
|
||||
if (progressState.skipped) line.push(_('Skipped: %d.', progressState.skipped));
|
||||
if (progressState.resourcesCreated) line.push(_('Resources: %d.', progressState.resourcesCreated));
|
||||
if (progressState.notesTagged) line.push(_('Tagged: %d.', progressState.notesTagged));
|
||||
lastProgress = line.join(' ');
|
||||
cliUtils.redraw(lastProgress);
|
||||
};
|
||||
|
||||
importOptions.onError = (error) => {
|
||||
let s = error.trace ? error.trace : error.toString();
|
||||
this.stdout(s);
|
||||
};
|
||||
|
||||
app().gui().showConsole();
|
||||
this.stdout(_('Importing notes...'));
|
||||
const service = new InteropService();
|
||||
const result = await service.import(importOptions);
|
||||
result.warnings.map((w) => this.stdout(w));
|
||||
cliUtils.redrawDone();
|
||||
if (lastProgress) this.stdout(_('The notes have been imported: %s', lastProgress));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = Command;
|
@@ -14,10 +14,6 @@ class Command extends BaseCommand {
|
||||
return _('Creates a new notebook.');
|
||||
}
|
||||
|
||||
aliases() {
|
||||
return ['mkdir'];
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let folder = await Folder.save({ title: args['new-notebook'] }, { userSideValidation: true });
|
||||
app().switchCurrentFolder(folder);
|
||||
|
@@ -10,7 +10,6 @@ const { cliUtils } = require('./cli-utils.js');
|
||||
const md5 = require('md5');
|
||||
const locker = require('proper-lockfile');
|
||||
const fs = require('fs-extra');
|
||||
const osTmpdir = require('os-tmpdir');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -79,10 +78,26 @@ class Command extends BaseCommand {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} else if (syncTargetMd.name === 'dropbox') { // Dropbox
|
||||
const api = await syncTarget.api();
|
||||
const loginUrl = api.loginUrl();
|
||||
this.stdout(_('To allow Joplin to synchronise with Dropbox, please follow the steps below:'));
|
||||
this.stdout(_('Step 1: Open this URL in your browser to authorise the application:'));
|
||||
this.stdout(loginUrl);
|
||||
const authCode = await this.prompt(_('Step 2: Enter the code provided by Dropbox:'), { type: 'string' });
|
||||
if (!authCode) {
|
||||
this.stdout(_('Authentication was not completed (did not receive an authentication token).'));
|
||||
return false;
|
||||
}
|
||||
|
||||
const response = await api.execAuthToken(authCode);
|
||||
Setting.setValue('sync.' + this.syncTargetId_ + '.auth', response.access_token);
|
||||
api.setAuthToken(response.access_token);
|
||||
return true;
|
||||
}
|
||||
|
||||
this.stdout(_('Not authentified with %s. Please provide any missing credentials.', syncTarget.label()));
|
||||
this.stdout(_('Not authentified with %s. Please provide any missing credentials.', syncTargetMd.label));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -101,7 +116,8 @@ class Command extends BaseCommand {
|
||||
this.releaseLockFn_ = null;
|
||||
|
||||
// Lock is unique per profile/database
|
||||
const lockFilePath = osTmpdir() + '/synclock_' + md5(escape(Setting.value('profileDir'))); // https://github.com/pvorb/node-md5/issues/41
|
||||
// TODO: use SQLite database to do lock?
|
||||
const lockFilePath = require('os').tmpdir() + '/synclock_' + md5(escape(Setting.value('profileDir'))); // https://github.com/pvorb/node-md5/issues/41
|
||||
if (!await fs.pathExists(lockFilePath)) await fs.writeFile(lockFilePath, 'synclock');
|
||||
|
||||
try {
|
||||
@@ -131,7 +147,7 @@ class Command extends BaseCommand {
|
||||
|
||||
const syncTarget = reg.syncTarget(this.syncTargetId_);
|
||||
|
||||
if (!syncTarget.isAuthenticated()) {
|
||||
if (!await syncTarget.isAuthenticated()) {
|
||||
app().gui().showConsole();
|
||||
app().gui().maximizeConsole();
|
||||
|
||||
@@ -198,7 +214,7 @@ class Command extends BaseCommand {
|
||||
|
||||
const syncTarget = reg.syncTarget(syncTargetId);
|
||||
|
||||
if (syncTarget.isAuthenticated()) {
|
||||
if (await syncTarget.isAuthenticated()) {
|
||||
const sync = await syncTarget.synchronizer();
|
||||
if (sync) await sync.cancel();
|
||||
} else {
|
||||
|
@@ -133,7 +133,8 @@ class StatusBarWidget extends BaseWidget {
|
||||
resolveResult = input ? input.trim() : input;
|
||||
// Add the command to history but only if it's longer than one character.
|
||||
// Below that it's usually an answer like "y"/"n", etc.
|
||||
if (!isSecurePrompt && input && input.length > 1) this.history_.push(input);
|
||||
const isConfigPassword = input.indexOf('config ') >= 0 && input.indexOf('password') >= 0;
|
||||
if (!isSecurePrompt && input && input.length > 1 && !isConfigPassword) this.history_.push(input);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -53,9 +53,8 @@ function renderCommandHelp(cmd, width = null) {
|
||||
desc.push(label);
|
||||
}
|
||||
|
||||
if (md.description) {
|
||||
desc.push(md.description());
|
||||
}
|
||||
const description = Setting.keyDescription(md.key, 'cli');
|
||||
if (description) desc.push(description);
|
||||
|
||||
desc.push(_('Type: %s.', md.isEnum ? _('Enum') : Setting.typeToString(md.type)));
|
||||
if (md.isEnum) desc.push(_('Possible values: %s.', Setting.enumOptionsDoc(md.key, '%s (%s)')));
|
||||
|
@@ -71,37 +71,10 @@ process.stdout.on('error', function( err ) {
|
||||
|
||||
|
||||
// async function main() {
|
||||
// const WebDavApi = require('lib/WebDavApi');
|
||||
// const api = new WebDavApi('http://nextcloud.local/remote.php/dav/files/admin/Joplin', { username: 'admin', password: '1234567' });
|
||||
// const { FileApiDriverWebDav } = new require('lib/file-api-driver-webdav');
|
||||
// const driver = new FileApiDriverWebDav(api);
|
||||
|
||||
// const stat = await driver.stat('');
|
||||
// console.info(stat);
|
||||
|
||||
// // const stat = await driver.stat('testing.txt');
|
||||
// // console.info(stat);
|
||||
|
||||
|
||||
// // const content = await driver.get('testing.txta');
|
||||
// // console.info(content);
|
||||
|
||||
// // const content = await driver.get('testing.txta', { target: 'file', path: '/var/www/joplin/CliClient/testing-file.txt' });
|
||||
// // console.info(content);
|
||||
|
||||
// // const content = await driver.mkdir('newdir5');
|
||||
// // console.info(content);
|
||||
|
||||
// //await driver.put('myfile4.md', 'this is my content');
|
||||
|
||||
// // await driver.put('testimg.jpg', null, { source: 'file', path: '/mnt/d/test.jpg' });
|
||||
|
||||
// // await driver.delete('myfile4.md');
|
||||
|
||||
// // const deltaResult = await driver.delta('', {
|
||||
// // allItemIdsHandler: () => { return []; }
|
||||
// // });
|
||||
// // console.info(deltaResult);
|
||||
// const InteropService = require('lib/services/InteropService');
|
||||
// const service = new InteropService();
|
||||
// console.info(service.moduleByFormat('importer', 'enex'));
|
||||
// //await service.modules();
|
||||
// }
|
||||
|
||||
// main().catch((error) => { console.error(error); });
|
||||
@@ -114,6 +87,13 @@ process.stdout.on('error', function( err ) {
|
||||
|
||||
|
||||
application.start(process.argv).catch((error) => {
|
||||
console.error(_('Fatal error:'));
|
||||
console.error(error);
|
||||
if (error.code == 'flagError') {
|
||||
console.error(error.message);
|
||||
console.error(_('Type `joplin help` for usage information.'));
|
||||
} else {
|
||||
console.error(_('Fatal error:'));
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
process.exit(1);
|
||||
});
|
1417
CliClient/locales/cs_CZ.po
Normal file
1433
CliClient/locales/da_DK.po
Normal file
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: Tobias Strobel <git@strobeltobias.de>\n"
|
||||
"Last-Translator: Tobias Grasse <mail@tobias-grasse.net>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: de_DE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -16,82 +16,29 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Das nächste Fenster fokussieren"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Das vorherige Fenster fokussieren"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Zum Terminal-Modus wechseln"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Den Terminal-Modus verlassen"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Die ausgewählte Notiz bearbeiten"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Den momentanen Befehl abbrechen."
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Das Programm verlassen."
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Die/das momentan ausgewählte Notiz(-buch) löschen."
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr ""
|
||||
"Hebe die Markierungen zugehöriger Notizen auf, um eine Markierung zu löschen."
|
||||
"Um eine Markierung zu löschen, entferne diese bei allen damit verbundenen "
|
||||
"Notizen."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr ""
|
||||
"Wähle bitte zuerst eine Notiz oder ein Notizbuch aus, das gelöscht werden "
|
||||
"soll."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Ein To-Do als abgeschlossen / nicht abgeschlossen markieren"
|
||||
|
||||
#, fuzzy
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr ""
|
||||
"Schal[t]e das Terminal zwischen maximiert/minimiert/versteckt/sichtbar um."
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Suchen"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "Notiz-[M]etadata einschal[t]en."
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "Eine neue [N]otiz [m]achen"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "Ein neues [T]o-Do [m]achen"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "Ein neues Notiz[b]uch [m]achen"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "Die Notiz zu einem Notizbuch kopieren."
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Die Notiz zu einem Notizbuch verschieben."
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Drücke Strg+D oder tippe \"exit\", um das Programm zu verlassen"
|
||||
msgstr "Drücke Strg+D oder tippe \"exit\" um das Programm zu verlassen"
|
||||
|
||||
#, javascript-format
|
||||
msgid "More than one item match \"%s\". Please narrow down your query."
|
||||
msgstr ""
|
||||
"Mehr als eine Notiz stimmt mit \"%s\" überein. Bitte schränke deine Suche "
|
||||
"ein."
|
||||
"Mehr als eine Notiz stimmt mit \"%s\" überein. Bitte die Suche einschränken."
|
||||
|
||||
msgid "No notebook selected."
|
||||
msgstr "Kein Notizbuch ausgewählt."
|
||||
|
||||
msgid "No notebook has been specified."
|
||||
msgstr "Kein Notizbuch wurde angegeben."
|
||||
msgstr "Es wurde kein Notizbuch festgelegt."
|
||||
|
||||
msgid "Y"
|
||||
msgstr "J"
|
||||
@@ -121,7 +68,7 @@ msgstr "Kann verschlüsseltes Objekt nicht ändern"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Missing required argument: %s"
|
||||
msgstr "Fehlendes benötigtes Argument: %s"
|
||||
msgstr "Fehlendes erforderliches Argument: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s: %s"
|
||||
@@ -157,8 +104,7 @@ msgstr ""
|
||||
"gegeben sind, wird eine Liste der momentanen Konfiguration angezeigt."
|
||||
|
||||
msgid "Also displays unset and hidden config variables."
|
||||
msgstr ""
|
||||
"Zeigt auch nicht angegebene oder versteckte Konfigurationsvariablen an."
|
||||
msgstr "Zeigt auch nicht gesetzte und versteckte Konfigurationsvariablen an."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s = %s (%s)"
|
||||
@@ -172,12 +118,12 @@ msgid ""
|
||||
"Duplicates the notes matching <note> to [notebook]. If no notebook is "
|
||||
"specified the note is duplicated in the current notebook."
|
||||
msgstr ""
|
||||
"Dupliziert die Notizen die mit <note> übereinstimmen zu [Notizbuch]. Wenn "
|
||||
"kein Notizbuch angegeben ist, wird die Notiz in das momentane Notizbuch "
|
||||
"Dupliziert die Notizen die mit <note> übereinstimmen in [Notizbuch]. Wenn "
|
||||
"kein Notizbuch angegeben ist, wird die Notiz in das aktuelle Notizbuch "
|
||||
"kopiert."
|
||||
|
||||
msgid "Marks a to-do as done."
|
||||
msgstr "Markiert ein To-Do als abgeschlossen."
|
||||
msgstr "Markiert ein To-Do als erledigt."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
@@ -187,7 +133,7 @@ msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
msgstr ""
|
||||
"Verwaltet die E2EE-Konfiguration. Die Befehle sind `enable`, `disable`, "
|
||||
"Verwaltet die E2EE-Konfiguration. Die Befehle lauten `enable`, `disable`, "
|
||||
"`decrypt`, `status` und `target-status`."
|
||||
|
||||
msgid "Enter master password:"
|
||||
@@ -200,8 +146,8 @@ msgid ""
|
||||
"Starting decryption... Please wait as it may take several minutes depending "
|
||||
"on how much there is to decrypt."
|
||||
msgstr ""
|
||||
"Entschlüsselung starten.... Warte bitte, da es einige Minuten dauern kann, "
|
||||
"je nachdem, wie viel es zu entschlüsseln gibt."
|
||||
"Starte Entschlüsselung.... Bitte warten, da dies je nach Anzahl der "
|
||||
"betreffenden Objekte einige Minuten dauern kann."
|
||||
|
||||
msgid "Completed decryption."
|
||||
msgstr "Entschlüsselung abgeschlossen."
|
||||
@@ -214,7 +160,7 @@ msgstr "Deaktiviert"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Encryption is: %s"
|
||||
msgstr "Die Verschlüsselung ist: %s"
|
||||
msgstr "Verschlüsselung ist: %s"
|
||||
|
||||
msgid "Edit note."
|
||||
msgstr "Notiz bearbeiten."
|
||||
@@ -222,8 +168,8 @@ msgstr "Notiz bearbeiten."
|
||||
msgid ""
|
||||
"No text editor is defined. Please set it using `config editor <editor-path>`"
|
||||
msgstr ""
|
||||
"Kein Textverarbeitungsprogramm angegeben. Bitte lege eines mit `config "
|
||||
"editor <Pfad-Zum-Textverarbeitungsprogramm>` fest"
|
||||
"Kein Texteditor definiert. Bitte lege einen mit `config editor <Pfad-Zum-"
|
||||
"Texteditor>` fest"
|
||||
|
||||
msgid "No active notebook."
|
||||
msgstr "Kein aktives Notizbuch."
|
||||
@@ -245,16 +191,20 @@ msgid "Note has been saved."
|
||||
msgstr "Die Notiz wurde gespeichert."
|
||||
|
||||
msgid "Exits the application."
|
||||
msgstr "Schließt das Programm."
|
||||
msgstr "Beendet das Programm."
|
||||
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Exportiert Joplins Dateien zu dem angegebenen Pfad. Standardmäßig wird die "
|
||||
"Exportiert Joplin Dateien in den angegebenen Pfad. Standardmäßig wird die "
|
||||
"komplette Datenbank inklusive Notizbüchern, Notizen, Markierungen und "
|
||||
"Anhängen exportiert."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Zielformat: %s"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Exportiert nur die angegebene Notiz."
|
||||
|
||||
@@ -267,6 +217,12 @@ msgstr "Zeigt die Standort-URL der Notiz an."
|
||||
msgid "Displays usage information."
|
||||
msgstr "Zeigt die Nutzungsstatistik an."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
"Für weitere Informationen über die Anpassung von Tastenkürzel besuche bitte "
|
||||
"%s"
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "Tastenkürzel sind im CLI Modus nicht verfügbar."
|
||||
|
||||
@@ -274,11 +230,12 @@ msgid ""
|
||||
"Type `help [command]` for more information about a command; or type `help "
|
||||
"all` for the complete usage information."
|
||||
msgstr ""
|
||||
"Tippe `help [Befehl]` für weitere Informationen über einen Befehl; oder "
|
||||
"tippe `help all` für die vollständigen Informationen zur Befehlsverwendung."
|
||||
"Tippe `help [Befehl]` um weitere Informationen über einen Befehl zu erhalten "
|
||||
"oder tippe `help all` für die vollständigen Informationen zur "
|
||||
"Befehlsverwendung."
|
||||
|
||||
msgid "The possible commands are:"
|
||||
msgstr "Mögliche Befehle sind:"
|
||||
msgstr "Mögliche Befehle lauten:"
|
||||
|
||||
msgid ""
|
||||
"In any command, a note or notebook can be refered to by title or ID, or "
|
||||
@@ -287,13 +244,13 @@ msgid ""
|
||||
msgstr ""
|
||||
"In jedem Befehl können Notizen oder Notizbücher durch ihren Titel oder ihre "
|
||||
"ID spezifiziert werden, oder durch die Abkürzung `$n` oder `$b` um entweder "
|
||||
"das momentan ausgewählte Notizbuch oder die momentan ausgewählte Notiz zu "
|
||||
"wählen. `$c` kann benutzt werden, um auf die momentane Auswahl zu verweisen."
|
||||
"das momentan ausgewählte Notizbuch oder die momentan ausgewählte Notiz "
|
||||
"auszuwählen. `$c` kann benutzt werden, um auf die momentane Auswahl zu "
|
||||
"verweisen."
|
||||
|
||||
msgid "To move from one pane to another, press Tab or Shift+Tab."
|
||||
msgstr ""
|
||||
"Um ein von einem Fenster zu einem anderen zu wechseln, drücke Tab oder Shift"
|
||||
"+Tab."
|
||||
"Um von einem Fenster zu einem anderen zu wechseln, drücke Tab oder Shift+Tab."
|
||||
|
||||
msgid ""
|
||||
"Use the arrows and page up/down to scroll the lists and text areas "
|
||||
@@ -302,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 \":\""
|
||||
@@ -312,31 +270,21 @@ msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Um den Kommandozeilen Modus zu beenden, drücke ESCAPE"
|
||||
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
"Um die komplette Liste von verfügbaren Tastenkürzeln anzuzeigen, tippe `help "
|
||||
"shortcuts` ein"
|
||||
"Um die komplette Liste aller verfügbaren Tastenkürzeln anzuzeigen, tippe "
|
||||
"`help keymap` ein"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Importiert eine Evernote Notizbuch-Datei (.enex Datei)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr "Importiert Daten in Joplin."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Quellformat: %s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "Nicht nach einer Bestätigung fragen."
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
"Datei \"%s\" wird in das existierende Notizbuch \"%s\" importiert. "
|
||||
"Fortfahren?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"Neues Notizbuch \"%s\" wird erstellt und die Datei \"%s\" wird hinein "
|
||||
"importiert. Fortfahren?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "Gefunden: %d."
|
||||
@@ -482,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 ""
|
||||
@@ -511,7 +469,7 @@ msgid "Starting synchronisation..."
|
||||
msgstr "Starte Synchronisation..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "Abbrechen... Bitte warten."
|
||||
msgstr "Abbrechen… Bitte warten."
|
||||
|
||||
msgid ""
|
||||
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
||||
@@ -573,6 +531,10 @@ msgstr "Standard: %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Mögliche Werte:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Zeigt die Nutzungsstatistik an."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Schwerwiegender Fehler:"
|
||||
|
||||
@@ -627,6 +589,17 @@ msgstr ""
|
||||
"Wenn du das Passwort bereits eingegeben hast, werden die verschlüsselten "
|
||||
"Objekte im Hintergrund entschlüsselt und stehen in Kürze zur Verfügung."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportiere „%s“ ins „%s“ Format. Bitte warten..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten…"
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-Datei"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Datei"
|
||||
|
||||
@@ -639,15 +612,18 @@ msgstr "Neues To-Do"
|
||||
msgid "New notebook"
|
||||
msgstr "Neues Notizbuch"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Evernote Notizen importieren"
|
||||
msgid "Import"
|
||||
msgstr "Importieren"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Evernote Export Dateien"
|
||||
msgid "Export"
|
||||
msgstr "Exportieren"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Drucken"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
msgstr ""
|
||||
msgstr "%s ausblenden"
|
||||
|
||||
msgid "Quit"
|
||||
msgstr "Verlassen"
|
||||
@@ -668,10 +644,13 @@ msgid "Search in all the notes"
|
||||
msgstr "Alle Notizen durchsuchen"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Ansicht"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
msgstr "Editor Layout umschalten"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Werkzeuge"
|
||||
@@ -680,7 +659,7 @@ msgid "Synchronisation status"
|
||||
msgstr "Status der Synchronisation"
|
||||
|
||||
msgid "Encryption options"
|
||||
msgstr "Verschlüsselungsoptionen"
|
||||
msgstr "Verschlüsselung"
|
||||
|
||||
msgid "General Options"
|
||||
msgstr "Allgemeine Einstellungen"
|
||||
@@ -691,8 +670,11 @@ msgstr "Hilfe"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Webseite und Dokumentation"
|
||||
|
||||
msgid "Make a donation"
|
||||
msgstr "Spenden"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
msgstr "Überprüfe auf Updates..."
|
||||
|
||||
msgid "About Joplin"
|
||||
msgstr "Über Joplin"
|
||||
@@ -701,12 +683,12 @@ msgstr "Über Joplin"
|
||||
msgid "%s %s (%s, %s)"
|
||||
msgstr "%s %s (%s, %s)"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Open %s"
|
||||
msgstr "Auf %s: %s"
|
||||
msgstr "Öffne %s"
|
||||
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
msgstr "Verlassen"
|
||||
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
@@ -714,37 +696,31 @@ msgstr "OK"
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr "Notizen löschen?"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Die aktuelle Version ist up-to-date."
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
msgstr "Es ist ein Update verfügbar! Soll dies jetzt heruntergeladen werden?"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
msgstr "Ja"
|
||||
|
||||
#, fuzzy
|
||||
msgid "No"
|
||||
msgstr "N"
|
||||
msgstr "Nein"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Synchronisation abbrechen"
|
||||
msgstr "Überprüfen der Synchronisationseinstellungen"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Notizen und Einstellungen gespeichert in: %s"
|
||||
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 "
|
||||
@@ -806,14 +782,18 @@ msgstr ""
|
||||
"verwendet werden, abhängig davon, wie die jeweiligen Notizen oder "
|
||||
"Notizbücher ursprünglich verschlüsselt wurden."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Missing Master Keys"
|
||||
msgstr "Hauptschlüssel"
|
||||
msgstr "Fehlender Master-Key"
|
||||
|
||||
msgid ""
|
||||
"The master keys with these IDs are used to encrypt some of your items, "
|
||||
"however the application does not currently have access to them. It is likely "
|
||||
"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"
|
||||
@@ -829,7 +809,7 @@ msgstr "Zurück"
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into it"
|
||||
msgstr ""
|
||||
"Neues Notizbuch \"%s\" wird erstellt und die Datei \"%s\" wird hinein "
|
||||
"Neues Notizbuch \"%s\" wird erstellt und die Datei \"%s\" wird dort hinein "
|
||||
"importiert"
|
||||
|
||||
msgid "Please create a notebook first."
|
||||
@@ -848,7 +828,7 @@ msgid "Separate each tag by a comma."
|
||||
msgstr "Trenne jede Markierung mit einem Komma."
|
||||
|
||||
msgid "Rename notebook:"
|
||||
msgstr "Benne Notizbuch um:"
|
||||
msgstr "Notizbuch umbenennen:"
|
||||
|
||||
msgid "Set alarm:"
|
||||
msgstr "Alarm erstellen:"
|
||||
@@ -856,6 +836,10 @@ msgstr "Alarm erstellen:"
|
||||
msgid "Layout"
|
||||
msgstr "Layout"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search..."
|
||||
msgstr "Suchen"
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "Manche Objekte können nicht synchronisiert werden."
|
||||
|
||||
@@ -892,11 +876,10 @@ msgstr ""
|
||||
"(+) Knopf drückst."
|
||||
|
||||
msgid "Open..."
|
||||
msgstr ""
|
||||
msgstr "Öffne..."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Save as..."
|
||||
msgstr "Änderungen speichern"
|
||||
msgstr "Sichern unter..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -911,17 +894,23 @@ msgstr "Markierungen"
|
||||
msgid "Set alarm"
|
||||
msgstr "Alarm erstellen"
|
||||
|
||||
#, fuzzy
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
"Diese Notiz hat keinen Inhalt. Klicke auf „%s“ um den Editor zu aktivieren "
|
||||
"und die Notiz zu bearbeiten."
|
||||
|
||||
msgid "to-do"
|
||||
msgstr "Neues To-Do"
|
||||
msgstr "To-Do"
|
||||
|
||||
#, fuzzy
|
||||
msgid "note"
|
||||
msgstr "Neue Notiz"
|
||||
msgstr "Notiz"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Creating new %s..."
|
||||
msgstr "Importiere Notizen..."
|
||||
msgstr "Erstelle neue %s..."
|
||||
|
||||
msgid "Refresh"
|
||||
msgstr "Aktualisieren"
|
||||
@@ -932,8 +921,8 @@ msgstr "Leeren"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "OneDrive Login"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importieren"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Optionen"
|
||||
@@ -959,9 +948,6 @@ msgstr "Synchronisieren"
|
||||
msgid "Notebooks"
|
||||
msgstr "Notizbücher"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Suchen"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
"Bitte wähle aus, wohin der Synchronisations Status exportiert werden soll"
|
||||
@@ -974,12 +960,14 @@ msgstr "Nutzung: %s"
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr "Unbekanntes Argument: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr "Dateisystem"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Nextcloud"
|
||||
msgstr "Nextcloud (Beta)"
|
||||
msgstr "Nextcloud"
|
||||
|
||||
msgid "OneDrive"
|
||||
msgstr "OneDrive"
|
||||
@@ -987,9 +975,8 @@ msgstr "OneDrive"
|
||||
msgid "OneDrive Dev (For testing only)"
|
||||
msgstr "OneDrive Dev (Nur für Tests)"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgstr "WebDAV"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unknown log level: %s"
|
||||
@@ -1053,8 +1040,8 @@ msgstr "Remote Objekte gelöscht: %d."
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr "Geladene Objekte: %d/%d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
#, fuzzy, javascript-format
|
||||
msgid "State: %s."
|
||||
msgstr "Status: \"%s\"."
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1064,6 +1051,16 @@ msgstr "Abbrechen..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Abgeschlossen: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Letzte Fehlermeldung: %s"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr "wartend"
|
||||
|
||||
msgid "In progress"
|
||||
msgstr "In Bearbeitung"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "Synchronisation ist bereits im Gange. Status: %s"
|
||||
@@ -1072,7 +1069,7 @@ msgid "Encrypted"
|
||||
msgstr "Verschlüsselt"
|
||||
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Verschlüsselte Objekte können nicht verändert werden."
|
||||
msgstr "Verschlüsselte Objekte können nicht verändert werden"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Konflikte"
|
||||
@@ -1129,33 +1126,48 @@ msgstr "Hell"
|
||||
msgid "Dark"
|
||||
msgstr "Dunkel"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgstr "Zeige unvollständige To-Dos oben in der Liste"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Zeige unvollständige To-Dos an oberster Stelle"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr "Sortiere Notizen nach"
|
||||
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Sortierreihenfolge umdrehen"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Momentanen Standort zusammen mit Notizen speichern"
|
||||
|
||||
#, fuzzy
|
||||
msgid "When creating a new to-do:"
|
||||
msgstr "Erstellt ein neues To-Do."
|
||||
msgstr "Wenn eine neue To-Do erstellt wird:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus title"
|
||||
msgstr "Notiz Titel:"
|
||||
msgstr "Fokussiere Titel"
|
||||
|
||||
msgid "Focus body"
|
||||
msgstr ""
|
||||
msgstr "Fokussiere Inhalt"
|
||||
|
||||
#, fuzzy
|
||||
msgid "When creating a new note:"
|
||||
msgstr "Erstellt eine neue Notiz."
|
||||
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 "Set application zoom percentage"
|
||||
msgstr "Einstellen des Anwendungszooms"
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Zoomstufe der Benutzeroberfläche"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Editor Schriftenfamilie"
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
"Der Name der Schrift wird nicht überprüft. Ist dieser inkorrekt oder leer "
|
||||
"wird eine generische Monospace Schrift verwendet."
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Die Applikation automatisch aktualisieren"
|
||||
@@ -1199,31 +1211,66 @@ msgstr ""
|
||||
"Der Pfad, mit dem synchronisiert werden soll, wenn die Dateisystem-"
|
||||
"Synchronisation aktiviert ist. Siehe `sync.target`."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr "Nextcloud WebDAV URL"
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgstr "Nexcloud Benutzername"
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Nextcloud Benutzername"
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgstr "Nexcloud Passwort"
|
||||
msgid "Nextcloud password"
|
||||
msgstr "Nextcloud Passwort"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV URL"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgstr "WebDAV URL"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV username"
|
||||
msgstr "Nexcloud Benutzername"
|
||||
msgstr "WebDAV Benutzername"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV password"
|
||||
msgstr "Setze ein Passwort"
|
||||
msgstr "WebDAV Passwort"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ungültiger Optionswert: \"%s\". Mögliche Werte sind: %s."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Joplin Export Datei"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr "Joplin Export Verzeichnis"
|
||||
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote Export Datei"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Verzeichnis"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr "Das Modul „%s“ für das Format „%s“ kann nicht geladen werden"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr "Bitte das Exportformat für %s angeben"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
"Dieses Objekt ist zur Zeit verschlüsselt: %s „%s“. Bitte warten bis alle "
|
||||
"Objekte entschlüsselt wurden und versuche es dann erneut."
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr "Keine Daten für den Export vorhanden."
|
||||
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr ""
|
||||
"Bitte wähle aus, wohin der Synchronisations-Status exportiert werden soll."
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Objekte können nicht synchronisiert werden"
|
||||
|
||||
@@ -1312,6 +1359,19 @@ msgstr "Bestätigen"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Synchronisation abbrechen"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
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"
|
||||
@@ -1337,10 +1397,10 @@ msgid "Edit notebook"
|
||||
msgstr "Notizbuch bearbeiten"
|
||||
|
||||
msgid "Show all"
|
||||
msgstr ""
|
||||
msgstr "Zeige Alles"
|
||||
|
||||
msgid "Errors only"
|
||||
msgstr ""
|
||||
msgstr "Nur Fehler"
|
||||
|
||||
msgid "This note has been modified:"
|
||||
msgstr "Diese Notiz wurde verändert:"
|
||||
@@ -1382,6 +1442,9 @@ msgstr "Notizbuch löschen"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Mit OneDrive anmelden"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Suchen"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1398,6 +1461,87 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Willkommen"
|
||||
|
||||
#~ msgid "Searches"
|
||||
#~ msgstr "Suchen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr ""
|
||||
#~ "Versionshinweise:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Importiert eine Evernote Notizbuch-Datei (.enex Datei)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Datei \"%s\" wird in das existierende Notizbuch \"%s\" importiert. "
|
||||
#~ "Fortfahren?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Neues Notizbuch \"%s\" wird erstellt und die Datei \"%s\" wird hinein "
|
||||
#~ "importiert. Fortfahren?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Evernote Notizen importieren"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Das nächste Fenster fokussieren"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Das vorherige Fenster fokussieren"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Zum Terminal-Modus wechseln"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Den Terminal-Modus verlassen"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Die ausgewählte Notiz bearbeiten"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Den momentanen Befehl abbrechen."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Das Programm verlassen."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Die/das momentan ausgewählte Notiz(-buch) löschen."
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Ein To-Do als abgeschlossen / nicht abgeschlossen markieren"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr ""
|
||||
#~ "Schal[t]e das Terminal zwischen maximiert/minimiert/versteckt/sichtbar um."
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "Notiz-[M]etadata einschal[t]en."
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "Eine neue [N]otiz [m]achen"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "Ein neues [T]o-Do [m]achen"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "Ein neues Notiz[b]uch [m]achen"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "Die Notiz zu einem Notizbuch kopieren."
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Die Notiz zu einem Notizbuch verschieben."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The target to synchonise to. If synchronising with the file system, set "
|
||||
#~ "`sync.2.path` to specify the target directory."
|
||||
|
@@ -15,63 +15,12 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr ""
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr ""
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr ""
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr ""
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr ""
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr ""
|
||||
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr ""
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr ""
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr ""
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr ""
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr ""
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr ""
|
||||
|
||||
@@ -225,10 +174,14 @@ msgid "Exits the application."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr ""
|
||||
|
||||
@@ -241,6 +194,10 @@ msgstr ""
|
||||
msgid "Displays usage information."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr ""
|
||||
|
||||
@@ -266,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 \":\""
|
||||
@@ -276,25 +233,19 @@ msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr ""
|
||||
@@ -421,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 ""
|
||||
@@ -498,6 +459,9 @@ msgstr ""
|
||||
msgid "Possible keys/values:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr ""
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr ""
|
||||
|
||||
@@ -535,6 +499,17 @@ msgid ""
|
||||
"background and will be available soon."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr ""
|
||||
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
@@ -547,10 +522,13 @@ msgstr ""
|
||||
msgid "New notebook"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
@@ -578,6 +556,9 @@ msgstr ""
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
@@ -599,6 +580,9 @@ msgstr ""
|
||||
msgid "Website and documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Make a donation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
|
||||
@@ -622,11 +606,7 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
@@ -638,9 +618,6 @@ msgstr ""
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
@@ -651,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 "
|
||||
@@ -709,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 ""
|
||||
|
||||
@@ -747,6 +732,9 @@ msgstr ""
|
||||
msgid "Layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Search..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr ""
|
||||
|
||||
@@ -797,6 +785,12 @@ msgstr ""
|
||||
msgid "Set alarm"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "to-do"
|
||||
msgstr ""
|
||||
|
||||
@@ -816,7 +810,7 @@ msgstr ""
|
||||
msgid "OneDrive Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
@@ -843,9 +837,6 @@ msgstr ""
|
||||
msgid "Notebooks"
|
||||
msgstr ""
|
||||
|
||||
msgid "Searches"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
@@ -857,6 +848,9 @@ msgstr ""
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr ""
|
||||
|
||||
@@ -927,7 +921,7 @@ msgid "Fetched items: %d/%d."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
msgid "State: %s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -937,6 +931,16 @@ msgstr ""
|
||||
msgid "Completed: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
|
||||
msgid "In progress"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr ""
|
||||
@@ -998,7 +1002,13 @@ msgstr ""
|
||||
msgid "Dark"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reverse sort order"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
@@ -1019,7 +1029,18 @@ msgstr ""
|
||||
msgid "Show tray icon"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically update the application"
|
||||
@@ -1059,13 +1080,13 @@ msgid ""
|
||||
"See `sync.target`."
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgid "Nextcloud username"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgid "Nextcloud password"
|
||||
msgstr ""
|
||||
|
||||
msgid "WebDAV URL"
|
||||
@@ -1081,6 +1102,41 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "Evernote Export File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr ""
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr ""
|
||||
|
||||
@@ -1164,6 +1220,18 @@ msgstr ""
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr ""
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1234,6 +1302,9 @@ msgstr ""
|
||||
msgid "Login with OneDrive"
|
||||
msgstr ""
|
||||
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
|
@@ -17,63 +17,12 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Enfocar el siguiente panel"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Enfocar el panel anterior"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Entrar en modo línea de comandos"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Salir del modo línea de comandos"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Editar la nota seleccionada"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Cancelar el comando actual."
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Salir de la aplicación."
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Eliminar la nota o libreta seleccionada."
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Desmarque las notas asociadas para eliminar una etiqueta."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "Seleccione primero la nota o libreta que desea eliminar."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Marca una tarea como completada/no completada"
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr "in[t]ercambia la [c]onsola entre maximizada/minimizada/oculta/visible."
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "in[t]ercambia los [m]etadatos de una nota."
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "[C]rear una [n]ota nueva"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "[C]rear una [t]area nueva"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "[C]rear una li[b]reta nueva"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "Copiar ([Y]ank) la [n]ota a una libreta."
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Mover la nota a una libreta."
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Pulse Ctrl+D o escriba «salir» para salir de la aplicación"
|
||||
|
||||
@@ -86,7 +35,7 @@ msgid "No notebook selected."
|
||||
msgstr "No se ha seleccionado ninguna libreta."
|
||||
|
||||
msgid "No notebook has been specified."
|
||||
msgstr "Ninguna libre fue especificada"
|
||||
msgstr "Ninguna libreta fue especificada"
|
||||
|
||||
msgid "Y"
|
||||
msgstr "Y"
|
||||
@@ -123,7 +72,7 @@ msgid "%s: %s"
|
||||
msgstr "%s: %s"
|
||||
|
||||
msgid "Your choice: "
|
||||
msgstr "Tu elección: "
|
||||
msgstr "Su elección: "
|
||||
|
||||
#, javascript-format
|
||||
msgid "Invalid answer: %s"
|
||||
@@ -148,7 +97,7 @@ msgid ""
|
||||
"current configuration."
|
||||
msgstr ""
|
||||
"Obtener o configurar un valor. Si no se provee el [valor], se mostrará el "
|
||||
"valor de [nombre]. Si no se provee [nombre] ni [valor], se listara la "
|
||||
"valor de [nombre]. Si no se provee [nombre] ni [valor], se listará la "
|
||||
"configuración actual."
|
||||
|
||||
msgid "Also displays unset and hidden config variables."
|
||||
@@ -180,11 +129,11 @@ msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
msgstr ""
|
||||
"Manejar la configuración E2EE. Comandos disponibles `enable`, `disable`, "
|
||||
"Maneja la configuración E2EE. Comandos disponibles `enable`, `disable`, "
|
||||
"`decrypt`, `status` y `target-status`."
|
||||
|
||||
msgid "Enter master password:"
|
||||
msgstr "Introduce la contraseña maestra:"
|
||||
msgstr "Introduzca la contraseña maestra:"
|
||||
|
||||
msgid "Operation cancelled"
|
||||
msgstr "Operación cancelada"
|
||||
@@ -223,10 +172,11 @@ msgstr "No hay libreta activa."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Note does not exist: \"%s\". Create it?"
|
||||
msgstr "La nota no existe: \"%s\". Crearla?"
|
||||
msgstr "La nota no existe: \"%s\". ¿Crearla?"
|
||||
|
||||
msgid "Starting to edit note. Close the editor to get back to the prompt."
|
||||
msgstr "Iniciando a editar una nota. Cierra el editor para regresar al prompt."
|
||||
msgstr ""
|
||||
"Iniciando la edición de una nota. Cierre el editor para regresar al prompt."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Error opening note in editor: %s"
|
||||
@@ -239,24 +189,32 @@ msgid "Exits the application."
|
||||
msgstr "Sale de la aplicación."
|
||||
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Exportar datos de Joplin al directorio indicado. Por defecto, se exportará "
|
||||
"la base de datos completa incluyendo libretas, notas, etiquetas y recursos."
|
||||
"Exporta datos de Joplin al directorio indicado. Por defecto, se exportará la "
|
||||
"base de datos completa incluyendo libretas, notas, etiquetas y recursos."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Formato de destino: %s"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Exportar unicamente la nota indicada."
|
||||
msgstr "Exporta únicamente la nota indicada."
|
||||
|
||||
msgid "Exports only the given notebook."
|
||||
msgstr "Exportar unicamente la libreta indicada."
|
||||
msgstr "Exporta únicamente la libreta indicada."
|
||||
|
||||
msgid "Displays a geolocation URL for the note."
|
||||
msgstr "Mostrar geolocalización de la URL para la nota."
|
||||
msgstr "Muestra la URL de la geolocalización de la nota."
|
||||
|
||||
msgid "Displays usage information."
|
||||
msgstr "Muestra información de uso."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr "Para información de cómo personalizar los atajos por favor visite %s"
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "Atajos no disponibles en modo CLI."
|
||||
|
||||
@@ -276,55 +234,46 @@ msgid ""
|
||||
"using the shortcuts `$n` or `$b` for, respectively, the currently selected "
|
||||
"note or notebook. `$c` can be used to refer to the currently selected item."
|
||||
msgstr ""
|
||||
"Con cualquier comando, una nota o libreta puede ser referida por titulo o "
|
||||
"Con cualquier comando, una nota o libreta puede ser referida por su título o "
|
||||
"ID, o utilizando atajos `$n` o `$b`, respectivamente, para la nota o libreta "
|
||||
"seleccionada se puede usar `$c` para hacer referencia al artículo "
|
||||
"seleccionada. Se puede utilizar `$c` para hacer referencia al elemento "
|
||||
"seleccionado."
|
||||
|
||||
msgid "To move from one pane to another, press Tab or Shift+Tab."
|
||||
msgstr "Para mover desde un panel a otro, presiona Tab o Shift+Tab."
|
||||
msgstr ""
|
||||
"Para mover desde un panel a otro, presione Tabulador o Mayúsuclas+Tabulador."
|
||||
|
||||
msgid ""
|
||||
"Use the arrows and page up/down to scroll the lists and text areas "
|
||||
"(including this console)."
|
||||
msgstr ""
|
||||
"Para desplazar en las listas y areas de texto ( incluyendo la consola ) "
|
||||
"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, presiona \"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 linea de comando, presiona \":\""
|
||||
msgstr "Para entrar a modo línea de comando, presione \":\""
|
||||
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Para salir de modo linea de comando, presiona ESCAPE"
|
||||
msgstr "Para salir de modo línea de comando, presione ESCAPE"
|
||||
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
"Para una lista completa de los atajos de teclado disponibles, escribe `help "
|
||||
"shortcuts`"
|
||||
"Para una lista de los atajos de teclado disponibles, escriba `help keymap`"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Importar una libreta de Evernote (archivo .enex)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr "Importa los datos en Joplin."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Formato de origen: %s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "No preguntar por confirmación."
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
"El archivo \"%s\" será importado dentro de la libreta existente \"%s\". "
|
||||
"Continuar?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"Nueva libreta \"%s\" será creada y el archivo \"%s\" será importado dentro "
|
||||
"de ella. Continuar?"
|
||||
msgstr "No requiere confirmación."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
@@ -369,8 +318,7 @@ msgstr "Muestra las primeras <num> notas."
|
||||
|
||||
msgid "Sorts the item by <field> (eg. title, updated_time, created_time)."
|
||||
msgstr ""
|
||||
"Ordena los artículos por campo ( ej. título, fecha de actualización, fecha "
|
||||
"de creación)."
|
||||
"Ordena los elementos por campo ( ej. title, updated_time, created_time)."
|
||||
|
||||
msgid "Reverses the sorting order."
|
||||
msgstr "Invierte el orden."
|
||||
@@ -380,7 +328,7 @@ msgid ""
|
||||
"for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the "
|
||||
"to-dos, while `-ttd` would display notes and to-dos."
|
||||
msgstr ""
|
||||
"Muestra unicamente los artículos de los tipos especificados. Pueden ser `n` "
|
||||
"Muestra únicamente los elementos de los tipos especificados. Pueden ser `n` "
|
||||
"para notas, `t` para tareas, o `nt` para libretas y tareas (ej. `-tt` "
|
||||
"mostrará unicamente las tareas, mientras `-ttd` mostrará notas y tareas)."
|
||||
|
||||
@@ -395,7 +343,7 @@ msgstr ""
|
||||
"DATE,TODO_CHECKED ( para tareas), TITLE"
|
||||
|
||||
msgid "Please select a notebook first."
|
||||
msgstr "Por favor selecciona la libreta."
|
||||
msgstr "Por favor seleccione la libreta."
|
||||
|
||||
msgid "Creates a new notebook."
|
||||
msgstr "Crea una nueva libreta."
|
||||
@@ -410,10 +358,10 @@ msgid "Creates a new to-do."
|
||||
msgstr "Crea una nueva lista de tareas."
|
||||
|
||||
msgid "Moves the notes matching <note> to [notebook]."
|
||||
msgstr "Mueve las notas que coincidan con <note> para la [libreta]."
|
||||
msgstr "Mueve las notas que coincidan con <note> a la [libreta]."
|
||||
|
||||
msgid "Renames the given <item> (note or notebook) to <name>."
|
||||
msgstr "Renombre el artículo dado <item> (nota o libreta) a <name>."
|
||||
msgstr "Renombra el elemento dado <item> (nota o libreta) a <name>."
|
||||
|
||||
msgid "Deletes the given notebook."
|
||||
msgstr "Elimina la libreta dada."
|
||||
@@ -434,13 +382,13 @@ msgstr "Elimina las notas sin pedir confirmación."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%d notes match this pattern. Delete them?"
|
||||
msgstr "%d notas coinciden con el patron. Eliminarlas?"
|
||||
msgstr "%d notas coinciden con el patrón. ¿Eliminarlas?"
|
||||
|
||||
msgid "Delete note?"
|
||||
msgstr "¿Eliminar nota?"
|
||||
|
||||
msgid "Searches for the given <pattern> in all the notes."
|
||||
msgstr "Buscar el patron <pattern> en todas las notas."
|
||||
msgstr "Buscar el patrón <pattern> en todas las notas."
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -458,20 +406,32 @@ msgid "Displays summary about the notes and notebooks."
|
||||
msgstr "Muestra un resumen acerca de las notas y las libretas."
|
||||
|
||||
msgid "Synchronises with remote storage."
|
||||
msgstr "Sincronizar con almacenamiento remoto."
|
||||
msgstr "Sincroniza con el almacenamiento remoto."
|
||||
|
||||
msgid "Sync to provided target (defaults to sync.target config value)"
|
||||
msgstr ""
|
||||
"Sincronizar con objetivo proveído ( por defecto al valor de configuración "
|
||||
"Sincroniza con el destino indicado (por defecto al valor de configuración "
|
||||
"sync.target)"
|
||||
|
||||
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 autentificado con %s. Por favor provea las credenciales."
|
||||
msgstr "No autenticado con %s. Por favor provea las credenciales."
|
||||
|
||||
msgid "Synchronisation is already in progress."
|
||||
msgstr "Sincronzación en progreso."
|
||||
@@ -488,7 +448,7 @@ msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation target: %s (%s)"
|
||||
msgstr "Objetivo de sincronización: %s (%s)"
|
||||
msgstr "Destino de la sincronización: %s (%s)"
|
||||
|
||||
msgid "Cannot initialize synchroniser."
|
||||
msgstr "No se puede inicializar sincronizador."
|
||||
@@ -519,12 +479,12 @@ msgid ""
|
||||
"convert the to-do back to a regular note."
|
||||
msgstr ""
|
||||
"<todo-command> puede ser \"toggle\" o \"clear\". Usa \"toggle\" para cambiar "
|
||||
"la tarea dada entre estado completado y sin completar. ( Si el objetivo es "
|
||||
"la tarea dada entre estado completado y sin completar. (Si el objetivo es "
|
||||
"una nota regular se convertirá en una tarea). Usa \"clear\" para convertir "
|
||||
"la tarea a una nota regular. "
|
||||
"la tarea a una nota regular."
|
||||
|
||||
msgid "Marks a to-do as non-completed."
|
||||
msgstr "Marcar una tarea como no completada."
|
||||
msgstr "Marca una tarea como no completada."
|
||||
|
||||
msgid ""
|
||||
"Switches to [notebook] - all further operations will happen within this "
|
||||
@@ -541,7 +501,7 @@ msgid "%s %s (%s)"
|
||||
msgstr "%s %s (%s)"
|
||||
|
||||
msgid "Enum"
|
||||
msgstr "Enumerar"
|
||||
msgstr "Enumeración"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Type: %s."
|
||||
@@ -556,7 +516,10 @@ msgid "Default: %s"
|
||||
msgstr "Por defecto: %s"
|
||||
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Teclas/valores posbiles:"
|
||||
msgstr "Claves/valores posbiles:"
|
||||
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Escriba `joplin help` para mostrar información de uso."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Error fatal:"
|
||||
@@ -564,11 +527,11 @@ msgstr "Error fatal:"
|
||||
msgid ""
|
||||
"The application has been authorised - you may now close this browser tab."
|
||||
msgstr ""
|
||||
"La aplicación ha sido autorizada - ahora puedes cerrar esta pestaña de tu "
|
||||
"La aplicación ha sido autorizada - ahora puede cerrar esta pestaña de su "
|
||||
"navegador."
|
||||
|
||||
msgid "The application has been successfully authorised."
|
||||
msgstr "La aplicacion ha sido autorizada exitosamente."
|
||||
msgstr "La aplicacion ha sido autorizada éxitosamente."
|
||||
|
||||
msgid ""
|
||||
"Please open the following URL in your browser to authenticate the "
|
||||
@@ -579,7 +542,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Abra la siguiente URL en su navegador para autenticar la aplicación. La "
|
||||
"aplicación creará un directorio en «Apps/Joplin» y solo leerá y escribirá "
|
||||
"archivos en este directorio. No tendrá acceso a ningún archivo fuera de este "
|
||||
"archivos en ese directorio. No tendrá acceso a ningún archivo fuera de ese "
|
||||
"directorio ni a ningún otro archivo personal. No se compartirá información "
|
||||
"con terceros."
|
||||
|
||||
@@ -608,32 +571,46 @@ msgid ""
|
||||
"supplied the password, the encrypted items are being decrypted in the "
|
||||
"background and will be available soon."
|
||||
msgstr ""
|
||||
"Uno o más elementos están cifrados y debes proporcionar la contraseña "
|
||||
"maestra. Para hacerlo por favor escribe `e2ee decrypt`. Si ya has "
|
||||
"Uno o más elementos están cifrados y debe proporcionar la contraseña "
|
||||
"maestra. Para hacerlo por favor escriba `e2ee decrypt`. Si ya ha "
|
||||
"proporcionado la contraseña, los elementos están siendo descifrados en "
|
||||
"segundo plano y estarán disponibles en breve."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportando el formato de \"%s\" a \"%s\". Por favor espere..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importando el formato de \"%s\" a \"%s\". Por favor espere..."
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr "Archivo PDF"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Archivo"
|
||||
|
||||
msgid "New note"
|
||||
msgstr "Nota nueva"
|
||||
msgstr "Nueva nota"
|
||||
|
||||
msgid "New to-do"
|
||||
msgstr "Lista de tareas nueva"
|
||||
msgstr "Nueva lista de tareas"
|
||||
|
||||
msgid "New notebook"
|
||||
msgstr "Libreta nueva"
|
||||
msgstr "Nueva libreta"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Importar notas de Evernote"
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Archivos exportados de Evernote"
|
||||
msgid "Export"
|
||||
msgstr "Exportar"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Imprimir"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
msgstr ""
|
||||
msgstr "Oculta %s"
|
||||
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
@@ -654,10 +631,13 @@ msgid "Search in all the notes"
|
||||
msgstr "Buscar en todas las notas"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Ver"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
msgstr "Cambia el diseño del editor"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Herramientas"
|
||||
@@ -677,6 +657,9 @@ msgstr "Ayuda"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Sitio web y documentación"
|
||||
|
||||
msgid "Make a donation"
|
||||
msgstr "Hacer una donación"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr "Comprobar actualizaciones..."
|
||||
|
||||
@@ -700,15 +683,8 @@ msgstr "OK"
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Notas de la versión:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versión actual está actualizada."
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hay disponible una actualización. ¿Quiere descargarla ahora?"
|
||||
@@ -719,9 +695,6 @@ msgstr "Sí"
|
||||
msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versión actual está actualizada."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprobar sincronización"
|
||||
|
||||
@@ -732,13 +705,16 @@ 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 "
|
||||
"continue?"
|
||||
msgstr ""
|
||||
"Deshabilitar el cifrado significa que *todas* tus notas y adjuntos van a ser "
|
||||
"re-sincronizados y se enviarán descifrados al destino. ¿Deseas continuar?"
|
||||
"Deshabilitar el cifrado significa que *todas* sus notas y adjuntos van a ser "
|
||||
"re-sincronizados y se enviarán descifrados al destino. ¿Desea continuar?"
|
||||
|
||||
msgid ""
|
||||
"Enabling encryption means *all* your notes and attachments are going to be "
|
||||
@@ -746,10 +722,10 @@ msgid ""
|
||||
"password as, for security purposes, this will be the *only* way to decrypt "
|
||||
"the data! To enable encryption, please enter your password below."
|
||||
msgstr ""
|
||||
"Habilitar el cifrado significa que *todas* tus notas y adjuntos van a ser re-"
|
||||
"sincronizados y se enviarán cifrados al destino. No pierdas la contraseña, "
|
||||
"Habilitar el cifrado significa que *todas* sus notas y adjuntos van a ser re-"
|
||||
"sincronizados y se enviarán cifrados al destino. No pierda la contraseña, "
|
||||
"por cuestiones de seguridad, ¡es la *única* forma de descifrar los datos! "
|
||||
"Para habilitar el cifrado, por favor introduce tu contraseña más abajo."
|
||||
"Para habilitar el cifrado, por favor introduzca su contraseña más abajo."
|
||||
|
||||
msgid "Disable encryption"
|
||||
msgstr "Deshabilitar cifrado"
|
||||
@@ -803,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"
|
||||
|
||||
@@ -818,10 +801,10 @@ msgid ""
|
||||
msgstr "Se creará la nueva libreta «%s» y se importará en ella el archivo «%s»"
|
||||
|
||||
msgid "Please create a notebook first."
|
||||
msgstr "Cree primero una libreta."
|
||||
msgstr "Por favor cree una libreta primero."
|
||||
|
||||
msgid "Please create a notebook first"
|
||||
msgstr "Por favor crea una libreta primero"
|
||||
msgstr "Por favor cree una libreta primero"
|
||||
|
||||
msgid "Notebook title:"
|
||||
msgstr "Título de libreta:"
|
||||
@@ -841,6 +824,9 @@ msgstr "Ajustar alarma:"
|
||||
msgid "Layout"
|
||||
msgstr "Diseño"
|
||||
|
||||
msgid "Search..."
|
||||
msgstr "Buscar..."
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "No se han podido sincronizar algunos de los elementos."
|
||||
|
||||
@@ -891,6 +877,14 @@ msgstr "Etiquetas"
|
||||
msgid "Set alarm"
|
||||
msgstr "Establecer alarma"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
"Esta nota no tiene contenido. Pulse en \"%s\" para cambiar al editor y "
|
||||
"editar la nota."
|
||||
|
||||
msgid "to-do"
|
||||
msgstr "lista de tareas"
|
||||
|
||||
@@ -910,8 +904,8 @@ msgstr "Limpiar"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "Inicio de sesión de OneDrive"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
msgid "Dropbox Login"
|
||||
msgstr "Inicio de sesión de Dropbox"
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Opciones"
|
||||
@@ -937,9 +931,6 @@ msgstr "Sincronizar"
|
||||
msgid "Notebooks"
|
||||
msgstr "Libretas"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Búsquedas"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Seleccione a dónde se debería exportar el estado de sincronización"
|
||||
|
||||
@@ -951,12 +942,14 @@ msgstr "Uso: %s"
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr "Etiqueta desconocida: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr "Dropbox"
|
||||
|
||||
msgid "File system"
|
||||
msgstr "Sistema de archivos"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Nextcloud"
|
||||
msgstr "Nextcloud (Beta)"
|
||||
msgstr "Nextcloud"
|
||||
|
||||
msgid "OneDrive"
|
||||
msgstr "OneDrive"
|
||||
@@ -964,9 +957,8 @@ msgstr "OneDrive"
|
||||
msgid "OneDrive Dev (For testing only)"
|
||||
msgstr "OneDrive Dev (Solo para pruebas)"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV"
|
||||
msgstr "Servidor WebDAV"
|
||||
msgstr "WebDAV"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unknown log level: %s"
|
||||
@@ -1031,7 +1023,7 @@ msgid "Fetched items: %d/%d."
|
||||
msgstr "Elementos obtenidos: %d/%d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
msgid "State: %s."
|
||||
msgstr "Estado: «%s»."
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1041,6 +1033,16 @@ msgstr "Cancelando..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Completado: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Último error: %s"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr "Espera"
|
||||
|
||||
msgid "In progress"
|
||||
msgstr "En progreso"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "La sincronización ya está en progreso. Estado: %s"
|
||||
@@ -1049,7 +1051,7 @@ msgid "Encrypted"
|
||||
msgstr "Cifrado"
|
||||
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Los elementos cifrados no puedes ser modificados"
|
||||
msgstr "Los elementos cifrados no pueden ser modificados"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflictos"
|
||||
@@ -1105,10 +1107,15 @@ msgstr "Claro"
|
||||
msgid "Dark"
|
||||
msgstr "Oscuro"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Mostrar tareas incompletas al inicio de las listas"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr "Ordenar notas por"
|
||||
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Invierte el orden"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Guardar geolocalización en las notas"
|
||||
|
||||
@@ -1116,7 +1123,7 @@ msgid "When creating a new to-do:"
|
||||
msgstr "Al crear una nueva lista de tareas:"
|
||||
|
||||
msgid "Focus title"
|
||||
msgstr "Foco en el título:"
|
||||
msgstr "Foco en el título"
|
||||
|
||||
msgid "Focus body"
|
||||
msgstr "Foco en el cuerpo"
|
||||
@@ -1127,9 +1134,22 @@ msgstr "Cuando se crear una nota nueva:"
|
||||
msgid "Show tray icon"
|
||||
msgstr "Mostrar icono en la bandeja"
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Establecer el porcentaje de aumento de la aplicación"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Fuente del editor"
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
"El nombre de la fuente no se comprobado. Si es incorrecto o está vacío, se "
|
||||
"utilizará una fuente genérica monoespaciada."
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualizar la aplicación automáticamente"
|
||||
|
||||
@@ -1172,14 +1192,14 @@ msgstr ""
|
||||
"La ruta a la que sincronizar cuando se activa la sincronización con sistema "
|
||||
"de archivos. Vea «sync.target»."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgstr "Servidor Nexcloud WebDAV"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr "Servidor WebDAV de Nextcloud"
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgstr "Usuario de Nexcloud"
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Usuario de Nextcloud"
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgstr "Contraseña de Nexcloud"
|
||||
msgid "Nextcloud password"
|
||||
msgstr "Contraseña de Nextcloud"
|
||||
|
||||
msgid "WebDAV URL"
|
||||
msgstr "Servidor WebDAV"
|
||||
@@ -1194,6 +1214,43 @@ msgstr "Contraseña de WebDAV"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Opción inválida: «%s». Los valores posibles son: %s."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Archivo de exportación de Joplin"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr "Directorio para exportar de Joplin"
|
||||
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Archivo exportado de Evernote"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Directorio"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr "No se puede cargar el módulo \"%s\" para el formato \"%s\""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr "Por favor especifique el formato para importar de %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
"El elemento se encuentra cifrado: %s \"%s\". Por favor espere a que todos "
|
||||
"los elementos estén descifrados y pruebe de nuevo."
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr "No hay datos para exportar."
|
||||
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr "Por favor especifique la libreta donde las notas deben ser importadas."
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Elementos que no se pueden sincronizar"
|
||||
|
||||
@@ -1230,14 +1287,14 @@ msgid "To delete: %d"
|
||||
msgstr "Borrar: %d"
|
||||
|
||||
msgid "Folders"
|
||||
msgstr "Directorios"
|
||||
msgstr "Carpetas"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s: %d notes"
|
||||
msgstr "%s: %d notas"
|
||||
|
||||
msgid "Coming alarms"
|
||||
msgstr "Alarmas inminentes"
|
||||
msgstr "Alarmas próximas"
|
||||
|
||||
#, javascript-format
|
||||
msgid "On %s: %s"
|
||||
@@ -1269,7 +1326,7 @@ msgid "Move %d notes to notebook \"%s\"?"
|
||||
msgstr "¿Desea mover %d notas a libreta «%s»?"
|
||||
|
||||
msgid "Press to set the decryption password."
|
||||
msgstr "Presiona para establecer la contraseña de descifrado."
|
||||
msgstr "Presione para establecer la contraseña de descifrado."
|
||||
|
||||
msgid "Select date"
|
||||
msgstr "Seleccione fecha"
|
||||
@@ -1280,6 +1337,18 @@ msgstr "Confirmar"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Cancelar sincronización"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr "Nuevas etiquetas:"
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
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"
|
||||
@@ -1350,6 +1419,9 @@ msgstr "Borrar libreta"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Acceder con OneDrive"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1364,6 +1436,93 @@ 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"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr ""
|
||||
#~ "Notas de la versión:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Importar una libreta de Evernote (archivo .enex)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "El archivo \"%s\" será importado dentro de la libreta existente \"%s\". "
|
||||
#~ "¿Continuar?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Nueva libreta \"%s\" será creada y el archivo \"%s\" será importado "
|
||||
#~ "dentro de ella. ¿Continuar?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Importar notas de Evernote"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Enfocar el siguiente panel"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Enfocar el panel anterior"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Entrar en modo línea de comandos"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Salir del modo línea de comandos"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Editar la nota seleccionada"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Cancelar el comando actual."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Salir de la aplicación."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Eliminar la nota o libreta seleccionada."
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Marca una tarea como completada/no completada"
|
||||
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr ""
|
||||
#~ "in[t]ercambia la [c]onsola entre maximizada/minimizada/oculta/visible."
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "in[t]ercambia los [m]etadatos de una nota."
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "[C]rear una [n]ota nueva"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "[C]rear una [t]area nueva"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "[C]rear una li[b]reta nueva"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "Copiar ([Y]ank) la [n]ota a una libreta."
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Mover la nota a una libreta."
|
||||
|
||||
#~ msgid "Error"
|
||||
#~ msgstr "Error"
|
||||
|
||||
|
@@ -2,7 +2,7 @@
|
||||
# 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"
|
||||
@@ -16,63 +16,12 @@ msgstr ""
|
||||
"X-Generator: Poedit 1.8.7.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Eraman fokua hurrengo panelera"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Eraman fokua aurreko panelera"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Sartu komando-lerro moduan "
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Irten komando-lerro modutik"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Editatu aukeratutako oharra"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Utzi uneko komandoa"
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Irten aplikaziotik"
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Ezabatu aukeratutako oharra edo koadernoa"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Etiketa ezabatzeko, kendu etiketa duten oharrei"
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "Aurretik aukeratu ezabatzeko oharra edo koadernoa, mesedez."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Zeregina eginda / ez-eginda markatu"
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr "[t]xandakatu [k]ontsola maximizatu/minimizatu/ezkutatu/ikusgai artean"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Bilatu"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "[t]xandakatu oharra eta [m]etadatuak"
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "[S]ortu [o]har berria"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "[S]ortu [z]ereginen zerrenda"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "[S]ortu koa[d]erno berria"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "Kopiatu ([E]raman) [o]harra koadernora"
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Eraman oharra koadernora"
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Sakatu Ktrl+D edo idatzi \"exit\" aplikaziotik irteteko"
|
||||
|
||||
@@ -240,10 +189,14 @@ msgstr "Irten aplikaziotik."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr "Esportatu Joplineko datuak esandako karpetara"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Data-formatua"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Esportatu emandako oharra soilik."
|
||||
|
||||
@@ -256,6 +209,10 @@ msgstr "Erakutsi URL geolokalizazioa oharrean."
|
||||
msgid "Displays usage information."
|
||||
msgstr "Erakutsi erabilera datuak."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "CLI moduan ez dago lasterbiderik erabilgarri."
|
||||
|
||||
@@ -289,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 \":\""
|
||||
@@ -298,30 +256,21 @@ msgstr "Komando lerroa sartzeko, idatzi \":\""
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Komando lerrotik irteteko, sakatu ESC, mesedez"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr "Laster bideen zerrenda osoa ikusteko, idatzi `help shortcuts`"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Inportatu Evernote koaderno fitxategia (.enex fitxategia)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Ez dago komandorik: %s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "Ez galdetu berresteko."
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
" \"%s\" izeneko fitxategia \"%s\" izeneko koadernoan inportatzekotan zaude. "
|
||||
"Jarraitu nahi duzu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
" \"%s\" izeneko koaderno berria sortzekotan zaude eta bertan \"%s\" "
|
||||
"fitxategia bertara inportatzekotan zaude. Jarraitu nahi duzu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "Aurkitua: %d"
|
||||
@@ -466,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."
|
||||
@@ -555,6 +514,10 @@ msgstr "Lehenetsia: %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Litezkeen balioak:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Erakutsi erabilera datuak."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Aio! Agur! :_( "
|
||||
|
||||
@@ -608,6 +571,18 @@ msgstr ""
|
||||
"Dagoeneko pasahitza ordezkatua baduzu, itemak deszifratzen ari izango dira "
|
||||
"atzeko planoan eta laster izango dira eskuragarri."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "PDF File"
|
||||
msgstr "Fitxategia"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fitxategia"
|
||||
|
||||
@@ -620,11 +595,15 @@ msgstr "Zeregin berria"
|
||||
msgid "New notebook"
|
||||
msgstr "Koaderno berria"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Inportatu Evernoteko oharrak"
|
||||
msgid "Import"
|
||||
msgstr "Inportatu"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Evernotetik esportatutako fitxategiak"
|
||||
#, fuzzy
|
||||
msgid "Export"
|
||||
msgstr "Inportatu"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -651,6 +630,9 @@ msgstr "Bilatu ohar guztietan"
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
@@ -672,6 +654,10 @@ msgstr "Laguntza"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Web orria eta dokumentazioa (en)"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Make a donation"
|
||||
msgstr "Web orria eta dokumentazioa (en)"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
|
||||
@@ -695,12 +681,8 @@ msgstr "OK"
|
||||
msgid "Cancel"
|
||||
msgstr "Utzi"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr "Oharrak ezabatu?"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
@@ -712,9 +694,6 @@ msgstr ""
|
||||
msgid "No"
|
||||
msgstr "E"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Sinkronizazioa utzi"
|
||||
@@ -726,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 "
|
||||
@@ -796,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"
|
||||
|
||||
@@ -836,6 +823,10 @@ msgstr "Ezarri alarma:"
|
||||
msgid "Layout"
|
||||
msgstr "Diseinua"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search..."
|
||||
msgstr "Bilatu"
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "Zenbait item ezin dira sinkronizatu."
|
||||
|
||||
@@ -887,6 +878,12 @@ msgstr "Etiketak"
|
||||
msgid "Set alarm"
|
||||
msgstr "Ezarri alarma"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "to-do"
|
||||
msgstr "Zeregin berria"
|
||||
@@ -909,8 +906,8 @@ msgstr "Garbitu"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "Logeatu OneDriven"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Inportatu"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Aukerak"
|
||||
@@ -936,9 +933,6 @@ msgstr "Sinkronizatu"
|
||||
msgid "Notebooks"
|
||||
msgstr "Koadernoak"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Bilaketak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Aukeratu nora esportatu sinkronizazioaren egoera, mesedez"
|
||||
@@ -951,6 +945,9 @@ msgstr "Erabili: %s"
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr "Marka ezezaguna: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr "Fitxategi sistema"
|
||||
|
||||
@@ -966,7 +963,7 @@ msgstr "OneDrive Dev (aprobetarako soilik)"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgstr "Nextcloud WebDAV URL"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unknown log level: %s"
|
||||
@@ -1029,8 +1026,8 @@ msgstr "Urruneko itemak ezabatuta: %d."
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr "Itemak eskuratuta: %d%d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
#, fuzzy, javascript-format
|
||||
msgid "State: %s."
|
||||
msgstr "Egoera: \"%s\"."
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1040,6 +1037,16 @@ msgstr "Bertan behera uzten..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Osatuta: %s"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Aio! Agur! :_( "
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
|
||||
msgid "In progress"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "Sinkronizazioa hasita dago. Egoera: %s"
|
||||
@@ -1105,9 +1112,16 @@ msgid "Dark"
|
||||
msgstr "Iluna"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Bete gabeko zereginak erakutsi zerrendaren goiko partean"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Alderantziz antolatzen du."
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Gore geokokapena oharrekin"
|
||||
|
||||
@@ -1128,9 +1142,21 @@ msgstr "Ohar berria sortzen du."
|
||||
msgid "Show tray icon"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Ezarri aplikazioaren zoomaren ehunekoa"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automatikoki eguneratu aplikazioa"
|
||||
|
||||
@@ -1172,22 +1198,22 @@ msgid ""
|
||||
msgstr ""
|
||||
"Sinkronizazio sistema gaituta dagoenerako bide-izena. Ikus `sync.target`."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr "Nextcloud WebDAV URL"
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgstr "Nexcloud erabiltzaile-izena"
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Nextcloud erabiltzaile-izena"
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgstr "Nexcloud pasahitza"
|
||||
msgid "Nextcloud password"
|
||||
msgstr "Nextcloud pasahitza"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV URL"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgstr "Nextcloud WebDAV URL"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV username"
|
||||
msgstr "Nexcloud erabiltzaile-izena"
|
||||
msgstr "Nextcloud erabiltzaile-izena"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV password"
|
||||
@@ -1197,6 +1223,44 @@ msgstr "Ezarri pasahitza"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Balio aukera baliogabea: \"%s\". Litezkeen balioak: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Evernotetik esportatutako fitxategiak"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernotetik esportatutako fitxategiak"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr "Aukeratu nora esportatu sinkronizazioaren egoera, mesedez"
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Itemok ezin sinkronizatu"
|
||||
|
||||
@@ -1282,6 +1346,19 @@ msgstr "Baieztatu"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Sinkronizazioa utzi"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Login with OneDrive"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Pasahitz Nagusia %s"
|
||||
@@ -1352,6 +1429,9 @@ msgstr "Ezabatu koadernoa"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Login with OneDrive"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Bilatu"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1364,3 +1444,81 @@ msgstr "Oraindik ez duzu koadernorik. Sortu bat (+) botoian sakatuta."
|
||||
|
||||
msgid "Welcome"
|
||||
msgstr "Ongi etorri!"
|
||||
|
||||
#~ msgid "Searches"
|
||||
#~ msgstr "Bilaketak"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr "Oharrak ezabatu?"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Inportatu Evernote koaderno fitxategia (.enex fitxategia)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ " \"%s\" izeneko fitxategia \"%s\" izeneko koadernoan inportatzekotan "
|
||||
#~ "zaude. Jarraitu nahi duzu?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ " \"%s\" izeneko koaderno berria sortzekotan zaude eta bertan \"%s\" "
|
||||
#~ "fitxategia bertara inportatzekotan zaude. Jarraitu nahi duzu?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Inportatu Evernoteko oharrak"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Eraman fokua hurrengo panelera"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Eraman fokua aurreko panelera"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Sartu komando-lerro moduan "
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Irten komando-lerro modutik"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Editatu aukeratutako oharra"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Utzi uneko komandoa"
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Irten aplikaziotik"
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Ezabatu aukeratutako oharra edo koadernoa"
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Zeregina eginda / ez-eginda markatu"
|
||||
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr ""
|
||||
#~ "[t]xandakatu [k]ontsola maximizatu/minimizatu/ezkutatu/ikusgai artean"
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "[t]xandakatu oharra eta [m]etadatuak"
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "[S]ortu [o]har berria"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "[S]ortu [z]ereginen zerrenda"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "[S]ortu koa[d]erno berria"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "Kopiatu ([E]raman) [o]harra koadernora"
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Eraman oharra koadernora"
|
||||
|
@@ -15,63 +15,12 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Activer le volet suivant"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Activer le volet précédent"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Démarrer le mode de ligne de commande"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Sortir du mode de ligne de commande"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Éditer la note sélectionnée"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Annuler la commande en cours."
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Quitter le logiciel."
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Supprimer la note ou carnet sélectionné."
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Pour supprimer une vignette, enlever là des notes associées."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "Veuillez d'abord sélectionner un carnet."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Marquer une tâches comme complétée / non-complétée"
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr "Maximiser, minimiser, cacher ou rendre visible la console."
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Chercher"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "Afficher/Cacher les métadonnées des notes."
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "Créer une nouvelle note"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "Créer une nouvelle tâche"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "Créer un nouveau carnet"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "Copier la note dans un autre carnet."
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Déplacer la note vers un carnet."
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Appuyez sur Ctrl+D ou tapez \"exit\" pour sortir du logiciel"
|
||||
|
||||
@@ -146,8 +95,8 @@ msgid ""
|
||||
"current configuration."
|
||||
msgstr ""
|
||||
"Obtient ou modifie une valeur de configuration. Si la [valeur] n'est pas "
|
||||
"fournie, la valeur de [nom] est affichée. Si ni le [nom] ni la [valeur] ne "
|
||||
"sont fournis, la configuration complète est affichée."
|
||||
"fournie, la valeur de [nom] sera affichée. Si ni le [nom] ni la [valeur] ne "
|
||||
"sont fournis, la configuration complète sera affichée."
|
||||
|
||||
msgid "Also displays unset and hidden config variables."
|
||||
msgstr "Afficher également les variables cachées."
|
||||
@@ -239,12 +188,15 @@ msgid "Exits the application."
|
||||
msgstr "Quitter le logiciel."
|
||||
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Exporter les données de Joplin vers le dossier fourni. Par défaut, la base "
|
||||
"de donnée complète sera exportée, y compris les carnets, notes, tags et "
|
||||
"resources."
|
||||
"Exporter les données de Joplin. Par défaut, la base de donnée complète sera "
|
||||
"exportée, y compris les carnets, notes, tags et ressources."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Format de la destination : %s"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Exporter uniquement la note spécifiée."
|
||||
@@ -258,6 +210,11 @@ msgstr "Afficher l'URL de l'emplacement de la note."
|
||||
msgid "Displays usage information."
|
||||
msgstr "Affiche les informations d'utilisation."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
"Pour personnaliser les raccourcis veuillez consulter la documentation à %s"
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "Les raccourcis ne sont pas disponible en mode de ligne de commande."
|
||||
|
||||
@@ -291,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 \":\""
|
||||
@@ -301,29 +258,19 @@ msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Pour sortir du mode ligne de commande, pressez ECHAP"
|
||||
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
msgstr ""
|
||||
"Pour la liste complète des raccourcis disponibles, tapez `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr "Pour la liste complète des raccourcis disponibles, tapez `help keymap`"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Importer un carnet Evernote (fichier .enex)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr "Importer des données dans Joplin."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Format de la source : %s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "Ne pas demander de confirmation."
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
"Le fichier \"%s\" va être importé dans le carnet existant \"%s\". Continuer ?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"Un nouveau carnet \"%s\" va être créé et le fichier \"%s\" va être importé "
|
||||
"dedans. Continuer ?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "Trouvés : %d."
|
||||
@@ -466,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 ""
|
||||
@@ -557,6 +518,9 @@ msgstr "Défaut : %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Clefs/Valeurs possibles :"
|
||||
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Tapez `Joplin help` pour afficher l'aide."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Erreur fatale :"
|
||||
|
||||
@@ -610,6 +574,17 @@ msgstr ""
|
||||
"decrypt`. Si vous avez déjà fourni ce mot de passe, les objets cryptés vont "
|
||||
"être décrypté en tâche de fond et seront disponible prochainement."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exporter vers \"%s\" au format \"%s\". Veuillez patienter..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importer depuis \"%s\" au format \"%s\". Veuillez patienter..."
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr "Fichier PDF"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fichier"
|
||||
|
||||
@@ -622,11 +597,14 @@ msgstr "Nouvelle tâche"
|
||||
msgid "New notebook"
|
||||
msgstr "Nouveau carnet"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Importer notes d'Evernote"
|
||||
msgid "Import"
|
||||
msgstr "Importer"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Fichiers d'export Evernote"
|
||||
msgid "Export"
|
||||
msgstr "Exporter"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Imprimer"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -653,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"
|
||||
|
||||
@@ -674,6 +655,9 @@ msgstr "Aide"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Documentation en ligne"
|
||||
|
||||
msgid "Make a donation"
|
||||
msgstr "Faire un don"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr "Vérifier les mises à jour..."
|
||||
|
||||
@@ -697,15 +681,8 @@ msgstr "OK"
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Notes de version :\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La version actuelle est à jour."
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
@@ -717,9 +694,6 @@ msgstr "Oui"
|
||||
msgid "No"
|
||||
msgstr "Non"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La version actuelle est à jour."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Vérifier config synchronisation"
|
||||
|
||||
@@ -730,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 "
|
||||
@@ -803,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"
|
||||
|
||||
@@ -843,6 +827,9 @@ msgstr "Régler alarme :"
|
||||
msgid "Layout"
|
||||
msgstr "Disposition"
|
||||
|
||||
msgid "Search..."
|
||||
msgstr "Chercher..."
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "Certains objets ne peuvent être synchronisés."
|
||||
|
||||
@@ -896,6 +883,14 @@ msgstr "Étiquettes"
|
||||
msgid "Set alarm"
|
||||
msgstr "Régler alarme"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
"Cette note n'a pas de contenu. Cliquer sur \"%s\" pour basculer vers "
|
||||
"l'éditeur et éditer cette note."
|
||||
|
||||
msgid "to-do"
|
||||
msgstr "tâche"
|
||||
|
||||
@@ -915,8 +910,8 @@ msgstr "Supprimer"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "Connexion OneDrive"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importer"
|
||||
msgid "Dropbox Login"
|
||||
msgstr "Connection à Dropbox"
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Options"
|
||||
@@ -942,9 +937,6 @@ msgstr "Synchroniser"
|
||||
msgid "Notebooks"
|
||||
msgstr "Carnets"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Recherches"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
"Veuillez sélectionner un répertoire ou exporter l'état de la synchronisation"
|
||||
@@ -957,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"
|
||||
|
||||
@@ -1035,8 +1030,8 @@ msgid "Fetched items: %d/%d."
|
||||
msgstr "Téléchargés : %d/%d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
msgstr "État : \"%s\"."
|
||||
msgid "State: %s."
|
||||
msgstr "État : %s."
|
||||
|
||||
msgid "Cancelling..."
|
||||
msgstr "Annulation..."
|
||||
@@ -1045,6 +1040,16 @@ msgstr "Annulation..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Terminé : %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Dernière erreur : %s"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr "Arrêté"
|
||||
|
||||
msgid "In progress"
|
||||
msgstr "En cours"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "La synchronisation est déjà en cours. État : %s"
|
||||
@@ -1108,8 +1113,14 @@ msgstr "Clair"
|
||||
msgid "Dark"
|
||||
msgstr "Sombre"
|
||||
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgstr "Tâches non-terminées en haut des listes"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Tâches non-terminées en haut"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr "Trier les notes par"
|
||||
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Inverser l'ordre"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Enregistrer l'emplacement avec les notes"
|
||||
@@ -1129,9 +1140,22 @@ msgstr "Lors de la création d'une note :"
|
||||
msgid "Show tray icon"
|
||||
msgstr "Afficher icône dans la zone de notifications"
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
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"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Police de l'éditeur"
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
"Le nom de la police ne sera pas vérifié. Si incorrect ou vide une police "
|
||||
"monospace sera utilisée par défaut."
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Mettre à jour le logiciel automatiquement"
|
||||
|
||||
@@ -1174,13 +1198,13 @@ msgstr ""
|
||||
"Le chemin du répertoire avec lequel synchroniser lorsque la synchronisation "
|
||||
"par système de fichier est activée. Voir `sync.target`."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr "Nextcloud : URL WebDAV"
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Nextcloud : Nom utilisateur"
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgid "Nextcloud password"
|
||||
msgstr "Nextcloud : Mot de passe"
|
||||
|
||||
msgid "WebDAV URL"
|
||||
@@ -1196,6 +1220,43 @@ msgstr "WebDAV : Mot de passe"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Option invalide: \"%s\". Les valeurs possibles sont : %s."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Fichier d'export Joplin"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr "Dossier d'export Joplin"
|
||||
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Fichiers d'export Evernote"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Dossier"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr "Impossible de charger module \"%s\" pour le format \"%s\""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr "Veuillez spécifier le format d'import pour %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
"Cet objet est crypté : %s \"%s\". Veuillez attendre que tout soit décrypté "
|
||||
"et réessayez."
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr "Il n'y a pas de données à exporter."
|
||||
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr "Veuillez sélectionner le carnet où les notes doivent être importées."
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Objets qui ne peuvent pas être synchronisés"
|
||||
|
||||
@@ -1284,6 +1345,18 @@ msgstr "Confirmer"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Annuler synchronisation"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr "Nouvelles étiquettes :"
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
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"
|
||||
@@ -1354,6 +1427,9 @@ msgstr "Supprimer le carnet"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Se connecter à OneDrive"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Chercher"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1369,6 +1445,92 @@ 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"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr ""
|
||||
#~ "Notes de version :\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Importer un carnet Evernote (fichier .enex)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Le fichier \"%s\" va être importé dans le carnet existant \"%s\". "
|
||||
#~ "Continuer ?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Un nouveau carnet \"%s\" va être créé et le fichier \"%s\" va être "
|
||||
#~ "importé dedans. Continuer ?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Importer notes d'Evernote"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Activer le volet suivant"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Activer le volet précédent"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Démarrer le mode de ligne de commande"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Sortir du mode de ligne de commande"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Éditer la note sélectionnée"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Annuler la commande en cours."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Quitter le logiciel."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Supprimer la note ou carnet sélectionné."
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Marquer une tâches comme complétée / non-complétée"
|
||||
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr "Maximiser, minimiser, cacher ou rendre visible la console."
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "Afficher/Cacher les métadonnées des notes."
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "Créer une nouvelle note"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "Créer une nouvelle tâche"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "Créer un nouveau carnet"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "Copier la note dans un autre carnet."
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Déplacer la note vers un carnet."
|
||||
|
||||
#~ msgid "Error"
|
||||
#~ msgstr "Erreur"
|
||||
|
||||
@@ -1480,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
@@ -17,69 +17,12 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Fokusiraj sljedeće okno"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Fokusiraj prethodno okno"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Otvori naredbeni redak"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Napusti naredbeni redak"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Uredi odabranu bilješku"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Prekini trenutnu naredbu."
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Izađi iz aplikacije."
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Obriši odabranu bilješku ili bilježnicu."
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Da bi mogao obrisati oznaku, skini oznaku s povezanih bilješki."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "Odaberi bilješku ili bilježnicu za brisanje."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Postavi zadatak kao završen/nezavršen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Traži"
|
||||
|
||||
#, fuzzy
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "[t]oggle note [m]etadata."
|
||||
|
||||
#, fuzzy
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "[M]ake a new [n]ote"
|
||||
|
||||
#, fuzzy
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "[M]ake a new [t]odo"
|
||||
|
||||
#, fuzzy
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "[M]ake a new note[b]ook"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Premjesti bilješku u bilježnicu."
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Pritisni Ctrl+D ili napiši \"exit\" za izlazak iz aplikacije"
|
||||
|
||||
@@ -245,13 +188,18 @@ msgstr "Bilješka je spremljena."
|
||||
msgid "Exits the application."
|
||||
msgstr "Izlaz iz aplikacije."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Izvozi podatke u dati direktorij. Po defaultu izvozi sve podatke uključujući "
|
||||
"bilježnice, bilješke, zadatke i resurse."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Format datuma"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Izvozi samo datu bilješku."
|
||||
|
||||
@@ -264,6 +212,10 @@ msgstr "Prikazuje geolokacijski URL bilješke."
|
||||
msgid "Displays usage information."
|
||||
msgstr "Prikazuje informacije o korištenju."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "Prečaci nisu podržani u naredbenom retku."
|
||||
|
||||
@@ -298,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 \":\""
|
||||
@@ -307,29 +260,21 @@ msgstr "Za ulaz u naredbeni redak, pritisni \":\""
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Za izlaz iz naredbenog retka, pritisni Esc"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr "Za potpunu listu mogućih prečaca, upiši `help shortcuts`"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Uvozi Evernote bilježnicu (.enex datoteku)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Ne postoji naredba: %s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "Ne pitaj za potvrdu."
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
"Datoteka \"%s\" će biti uvezena u postojeću bilježnicu \"%s\". Nastavi?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"Nova bilježnica \"%s\" će biti stvorena i datoteka \"%s\" će biti uvezena u "
|
||||
"nju. Nastavi?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "Nađeno: %d."
|
||||
@@ -476,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 ""
|
||||
@@ -566,6 +521,10 @@ msgstr "Default: %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Mogući ključevi/vrijednosti:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Prikazuje informacije o korištenju."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Fatalna greška:"
|
||||
|
||||
@@ -614,6 +573,18 @@ msgid ""
|
||||
"background and will be available soon."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "PDF File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
@@ -626,11 +597,15 @@ msgstr "Novi zadatak"
|
||||
msgid "New notebook"
|
||||
msgstr "Nova bilježnica"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Uvezi Evernote bilješke"
|
||||
msgid "Import"
|
||||
msgstr "Uvoz"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Evernote izvozne datoteke"
|
||||
#, fuzzy
|
||||
msgid "Export"
|
||||
msgstr "Uvoz"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -657,6 +632,9 @@ msgstr "Pretraži u svim bilješkama"
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
@@ -679,6 +657,10 @@ msgstr "Pomoć"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Website i dokumentacija"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Make a donation"
|
||||
msgstr "Website i dokumentacija"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
|
||||
@@ -702,12 +684,8 @@ msgstr "U redu"
|
||||
msgid "Cancel"
|
||||
msgstr "Odustani"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr "Obriši bilješke?"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
@@ -719,9 +697,6 @@ msgstr ""
|
||||
msgid "No"
|
||||
msgstr "N"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Prekini sinkronizaciju"
|
||||
@@ -733,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 "
|
||||
@@ -791,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"
|
||||
|
||||
@@ -831,6 +814,10 @@ msgstr "Postavi upozorenje:"
|
||||
msgid "Layout"
|
||||
msgstr "Izgled"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search..."
|
||||
msgstr "Traži"
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "Neke stavke se ne mogu sinkronizirati."
|
||||
|
||||
@@ -883,6 +870,12 @@ msgstr "Oznake"
|
||||
msgid "Set alarm"
|
||||
msgstr "Postavi upozorenje"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "to-do"
|
||||
msgstr "Novi zadatak"
|
||||
@@ -904,8 +897,8 @@ msgstr "Očisti"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "OneDrive Login"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Uvoz"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Opcije"
|
||||
@@ -931,9 +924,6 @@ msgstr "Sinkroniziraj"
|
||||
msgid "Notebooks"
|
||||
msgstr "Bilježnice"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Pretraživanja"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Odaberi lokaciju za izvoz statusa sinkronizacije"
|
||||
|
||||
@@ -945,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"
|
||||
|
||||
@@ -1020,8 +1013,8 @@ msgstr "Obrisane udaljene stavke: %d."
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr "Stvorene lokalne stavke: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
#, fuzzy, javascript-format
|
||||
msgid "State: %s."
|
||||
msgstr "Stanje: \"%s\"."
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1031,6 +1024,16 @@ msgstr "Prekidam..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Dovršeno: %s"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Fatalna greška:"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
|
||||
msgid "In progress"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "Sinkronizacija je već u toku. Stanje: %s"
|
||||
@@ -1096,9 +1099,16 @@ msgid "Dark"
|
||||
msgstr "Tamna"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Prikaži nezavršene zadatke na vrhu liste"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Mijenja redoslijed."
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Spremi geolokacijske podatke sa bilješkama"
|
||||
|
||||
@@ -1120,7 +1130,18 @@ msgstr "Stvara novu bilješku."
|
||||
msgid "Show tray icon"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically update the application"
|
||||
@@ -1162,13 +1183,13 @@ msgstr ""
|
||||
"Putanja do direktorija za sinkronizaciju u slučaju kad je sinkronizacija sa "
|
||||
"datotečnim sustavom omogućena. Vidi `sync.target`."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgid "Nextcloud username"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgid "Nextcloud password"
|
||||
msgstr ""
|
||||
|
||||
msgid "WebDAV URL"
|
||||
@@ -1184,6 +1205,44 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Nevažeća vrijednost: \"%s\". Moguće vrijednosti su: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Evernote izvozne datoteke"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote izvozne datoteke"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr "Odaberi lokaciju za izvoz statusa sinkronizacije"
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Stavke koje se ne mogu sinkronizirati"
|
||||
|
||||
@@ -1267,6 +1326,19 @@ msgstr "Potvrdi"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Prekini sinkronizaciju"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Prijavi se u OneDrive"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1338,6 +1410,9 @@ msgstr "Obriši bilježnicu"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Prijavi se u OneDrive"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Traži"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1351,6 +1426,88 @@ msgstr "Trenutno nemaš nijednu bilježnicu. Stvori novu klikom na (+) gumb."
|
||||
msgid "Welcome"
|
||||
msgstr "Dobro došli"
|
||||
|
||||
#~ msgid "Searches"
|
||||
#~ msgstr "Pretraživanja"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr "Obriši bilješke?"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Uvozi Evernote bilježnicu (.enex datoteku)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Datoteka \"%s\" će biti uvezena u postojeću bilježnicu \"%s\". Nastavi?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Nova bilježnica \"%s\" će biti stvorena i datoteka \"%s\" će biti uvezena "
|
||||
#~ "u nju. Nastavi?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Uvezi Evernote bilješke"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Fokusiraj sljedeće okno"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Fokusiraj prethodno okno"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Otvori naredbeni redak"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Napusti naredbeni redak"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Uredi odabranu bilješku"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Prekini trenutnu naredbu."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Izađi iz aplikacije."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Obriši odabranu bilješku ili bilježnicu."
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Postavi zadatak kao završen/nezavršen"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "[t]oggle note [m]etadata."
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "[M]ake a new [n]ote"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "[M]ake a new [t]odo"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "[M]ake a new note[b]ook"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Premjesti bilješku u bilježnicu."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The target to synchonise to. If synchronising with the file system, set "
|
||||
#~ "`sync.2.path` to specify the target directory."
|
||||
|
@@ -16,65 +16,12 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Pannello successivo"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Pannello precedente"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Accedi alla modalità linea di comando"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Esci dalla modalità linea di comando"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Modifica la nota selezionata"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Cancella il comando corrente."
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Esci dall'applicazione."
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Elimina la nota o il blocco note selezionato."
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Elimina un'etichetta, togli l'etichetta associata alle note."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "Per favore seleziona la nota o il blocco note da eliminare."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Imposta un'attività come completata / non completata"
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr ""
|
||||
"Scegli lo s[t]ato della [c]onsole: massimizzato/minimizzato/nascosto/"
|
||||
"visibile."
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Cerca"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "mos[t]ra/nascondi i [m]etadata nelle note."
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "Crea ([M]ake) una nuova [n]ota"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "Crea ([M]ake) una nuova at[t]ività"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "Crea ([M]ake) un nuovo [b]locco note"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "Copia ([Y]) la [n]ota in un blocco note."
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Sposta la nota in un blocco note."
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Premi Ctrl+D o digita \"exit\" per uscire dall'applicazione"
|
||||
|
||||
@@ -236,14 +183,19 @@ msgstr "La nota è stata salvata."
|
||||
msgid "Exits the application."
|
||||
msgstr "Esci dall'applicazione."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Esporta i dati da Joplin nella directory selezionata. Come impostazione "
|
||||
"predefinita verrà esportato il database completo, inclusi blocchi note, "
|
||||
"note, etichette e risorse."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Formato della data"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Esporta solo la seguente nota."
|
||||
|
||||
@@ -256,6 +208,10 @@ msgstr "Mostra l'URL di geolocalizzazione per la nota."
|
||||
msgid "Displays usage information."
|
||||
msgstr "Mostra le informazioni di utilizzo."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "Le scorciatoie non sono disponibili nella modalità CLI."
|
||||
|
||||
@@ -289,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 \":\""
|
||||
@@ -298,30 +255,22 @@ msgstr "Per entrare nella modalità command line, premi \":\""
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Per uscire dalla modalità command line, premi ESC"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
"Per la lista completa delle scorciatoie disponibili, digita `help shortcuts`"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Importa un file blocco note di Evernote (.enex file)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Nessun comando: %s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "Non chiedere conferma."
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
"Il file \"%s\" sarà importato nel blocco note esistente \"%s\". Continuare?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"Un nuovo blocco note \"%s\" sarà creato e al suo interno verrà importato il "
|
||||
"file \"%s\" . Continuare?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "Trovato: %d."
|
||||
@@ -459,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 ""
|
||||
@@ -548,6 +507,10 @@ msgstr "Predefinito: %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Chiave/valore possibili:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Mostra le informazioni di utilizzo."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Errore fatale:"
|
||||
|
||||
@@ -592,6 +555,18 @@ msgid ""
|
||||
"background and will be available soon."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "PDF File"
|
||||
msgstr "File"
|
||||
|
||||
msgid "File"
|
||||
msgstr "File"
|
||||
|
||||
@@ -604,11 +579,15 @@ msgstr "Nuova attività"
|
||||
msgid "New notebook"
|
||||
msgstr "Nuovo blocco note"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Importa le note da Evernote"
|
||||
msgid "Import"
|
||||
msgstr "Importa"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Esposta i files di Evernote"
|
||||
#, fuzzy
|
||||
msgid "Export"
|
||||
msgstr "Importa"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -635,6 +614,9 @@ msgstr "Cerca in tutte le note"
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
@@ -657,6 +639,10 @@ msgstr "Aiuto"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Sito web e documentazione"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Make a donation"
|
||||
msgstr "Sito web e documentazione"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
|
||||
@@ -680,12 +666,8 @@ msgstr "OK"
|
||||
msgid "Cancel"
|
||||
msgstr "Cancella"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr "Eliminare le note?"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
@@ -697,9 +679,6 @@ msgstr ""
|
||||
msgid "No"
|
||||
msgstr "N"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Cancella la sincronizzazione"
|
||||
@@ -711,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 "
|
||||
@@ -771,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"
|
||||
|
||||
@@ -809,6 +796,10 @@ msgstr "Imposta allarme:"
|
||||
msgid "Layout"
|
||||
msgstr "Disposizione"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search..."
|
||||
msgstr "Cerca"
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "Alcuni elementi non possono essere sincronizzati."
|
||||
|
||||
@@ -862,6 +853,12 @@ msgstr "Etichette"
|
||||
msgid "Set alarm"
|
||||
msgstr "Imposta allarme"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "to-do"
|
||||
msgstr "Nuova attività"
|
||||
@@ -883,8 +880,8 @@ msgstr "Pulisci"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "Login OneDrive"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importa"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Opzioni"
|
||||
@@ -910,9 +907,6 @@ msgstr "Sincronizza"
|
||||
msgid "Notebooks"
|
||||
msgstr "Blocchi note"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Ricerche"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Per favore seleziona la nota o il blocco note da eliminare."
|
||||
@@ -925,6 +919,9 @@ msgstr "Uso: %s"
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr "Etichetta sconosciuta: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr "File system"
|
||||
|
||||
@@ -1002,8 +999,8 @@ msgstr "Elementi remoti eliminati: %d."
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr "Elementi locali creati: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
#, fuzzy, javascript-format
|
||||
msgid "State: %s."
|
||||
msgstr "Stato: \"%s\"."
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1013,6 +1010,16 @@ msgstr "Cancellazione..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Completata: %s"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Errore fatale:"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
|
||||
msgid "In progress"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "La sincronizzazione è già in corso. Stato: %s"
|
||||
@@ -1078,9 +1085,16 @@ msgid "Dark"
|
||||
msgstr "Scuro"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Mostra todo inclompleti in cima alla lista"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Inverti l'ordine."
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Salva geo-localizzazione con le note"
|
||||
|
||||
@@ -1102,7 +1116,18 @@ msgstr "Crea una nuova nota."
|
||||
msgid "Show tray icon"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically update the application"
|
||||
@@ -1144,13 +1169,13 @@ msgstr ""
|
||||
"Il percorso di sincronizzazione quando la sincronizzazione è abilitata. Vedi "
|
||||
"`sync.target`."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgid "Nextcloud username"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgid "Nextcloud password"
|
||||
msgstr ""
|
||||
|
||||
msgid "WebDAV URL"
|
||||
@@ -1166,6 +1191,44 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Oprione non valida: \"%s\". I valori possibili sono: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Esposta i files di Evernote"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Esposta i files di Evernote"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr "Per favore seleziona la nota o il blocco note da eliminare."
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Elementi che non possono essere sincronizzati"
|
||||
|
||||
@@ -1249,6 +1312,19 @@ msgstr "Conferma"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Cancella la sincronizzazione"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Accedi a OneDrive"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1320,6 +1396,9 @@ msgstr "Cancella blocco note"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Accedi a OneDrive"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Cerca"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1335,6 +1414,85 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Benvenuto"
|
||||
|
||||
#~ msgid "Searches"
|
||||
#~ msgstr "Ricerche"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr "Eliminare le note?"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Importa un file blocco note di Evernote (.enex file)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Il file \"%s\" sarà importato nel blocco note esistente \"%s\". "
|
||||
#~ "Continuare?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Un nuovo blocco note \"%s\" sarà creato e al suo interno verrà importato "
|
||||
#~ "il file \"%s\" . Continuare?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Importa le note da Evernote"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Pannello successivo"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Pannello precedente"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Accedi alla modalità linea di comando"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Esci dalla modalità linea di comando"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Modifica la nota selezionata"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Cancella il comando corrente."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Esci dall'applicazione."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Elimina la nota o il blocco note selezionato."
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Imposta un'attività come completata / non completata"
|
||||
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr ""
|
||||
#~ "Scegli lo s[t]ato della [c]onsole: massimizzato/minimizzato/nascosto/"
|
||||
#~ "visibile."
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "mos[t]ra/nascondi i [m]etadata nelle note."
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "Crea ([M]ake) una nuova [n]ota"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "Crea ([M]ake) una nuova at[t]ività"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "Crea ([M]ake) un nuovo [b]locco note"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "Copia ([Y]) la [n]ota in un blocco note."
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Sposta la nota in un blocco note."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The target to synchonise to. If synchronising with the file system, set "
|
||||
#~ "`sync.2.path` to specify the target directory."
|
||||
|
@@ -16,63 +16,12 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.0.5\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "次のペインへ"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "前のペインへ"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "コマンドラインモードに入る"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "コマンドラインモードの終了"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "選択したノートを編集"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "現在のコマンドをキャンセル"
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "アプリケーションを終了する"
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "選択中のノートまたはノートブックを削除"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "タグを削除するには、関連するノートからタグを外してください。"
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "ます削除するノートかノートブックを選択してください。"
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "ToDoを完了/未完に設定"
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr "コンソールを最大表示/最小表示/非表示/可視で切り替える([t][c])"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "検索"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "ノートのメタ情報を切り替える [tm]"
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "新しいノートの作成 [mn]"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "新しいToDoの作成 [mt]"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "新しいノートブックの作成 [mb]"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "ノートをノートブックにコピー [yn]"
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "ノートをノートブックに移動"
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "アプリケーションを終了するには、Ctrl+Dまたは\"exit\"と入力してください"
|
||||
|
||||
@@ -233,13 +182,18 @@ msgstr "ノートは保存されました。"
|
||||
msgid "Exits the application."
|
||||
msgstr "アプリケーションの終了。"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Joplinのデータを選択されたディレクトリに出力する。標準では、ノートブック・"
|
||||
"ノート・タグ・添付データを含むすべてのデータベースを出力します。"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "日付の形式"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "選択されたノートのみを出力する。"
|
||||
|
||||
@@ -252,6 +206,10 @@ msgstr "ノートの位置情報URLを表示する。"
|
||||
msgid "Displays usage information."
|
||||
msgstr "使い方を表示する。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "CLIモードではショートカットは使用できません。"
|
||||
|
||||
@@ -282,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 \":\""
|
||||
@@ -291,31 +250,23 @@ msgstr "コマンドラインモードに入るには、\":\"を入力してく
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "コマンドラインモードを終了するには、ESCキーを押してください。"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
"有効なすべてのキーボードショートカットを表示するには、`help shortcuts`と入力"
|
||||
"してください。"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Evernoteノートブックファイル(.enex)のインポート"
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "コマンドが違います:%s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "確認を行わない。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
"ファイル \"%s\" はノートブック \"%s\"に取り込まれます。よろしいですか?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"新しいノートブック\"%s\"が作成され、ファイル\"%s\"が取り込まれます。よろしい"
|
||||
"ですか?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "見つかりました:%d"
|
||||
@@ -454,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 ""
|
||||
@@ -542,6 +503,10 @@ msgstr "規定値: %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "取り得るキーバリュー: "
|
||||
|
||||
#, fuzzy
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "使い方を表示する。"
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "致命的なエラー: "
|
||||
|
||||
@@ -591,6 +556,18 @@ msgid ""
|
||||
"background and will be available soon."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "PDF File"
|
||||
msgstr "ファイル"
|
||||
|
||||
msgid "File"
|
||||
msgstr "ファイル"
|
||||
|
||||
@@ -603,11 +580,15 @@ msgstr "新しいToDo"
|
||||
msgid "New notebook"
|
||||
msgstr "新しいノートブック"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Evernoteのインポート"
|
||||
msgid "Import"
|
||||
msgstr "インポート"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Evernote Exportファイル"
|
||||
#, fuzzy
|
||||
msgid "Export"
|
||||
msgstr "インポート"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -634,6 +615,9 @@ msgstr "すべてのノートを検索"
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
@@ -656,6 +640,10 @@ msgstr "ヘルプ"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Webサイトとドキュメント"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Make a donation"
|
||||
msgstr "Webサイトとドキュメント"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
|
||||
@@ -679,12 +667,8 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr "キャンセル"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr "ノートを削除しますか?"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
@@ -695,9 +679,6 @@ msgstr ""
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "同期の中止"
|
||||
@@ -709,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 "
|
||||
@@ -771,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 "状態"
|
||||
|
||||
@@ -811,6 +800,10 @@ msgstr "アラームをセット:"
|
||||
msgid "Layout"
|
||||
msgstr "レイアウト"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search..."
|
||||
msgstr "検索"
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "いくつかの項目は同期されませんでした。"
|
||||
|
||||
@@ -863,6 +856,12 @@ msgstr "タグ"
|
||||
msgid "Set alarm"
|
||||
msgstr "アラームをセット"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "to-do"
|
||||
msgstr "新しいToDo"
|
||||
@@ -884,8 +883,8 @@ msgstr "クリア"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "OneDriveログイン"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "インポート"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
msgstr "オプション"
|
||||
@@ -911,9 +910,6 @@ msgstr "同期"
|
||||
msgid "Notebooks"
|
||||
msgstr "ノートブック"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "検索"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "同期状況の出力先を選択してください"
|
||||
|
||||
@@ -925,6 +921,9 @@ msgstr "使用方法: %s"
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr "不明なフラグ: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr "ファイルシステム"
|
||||
|
||||
@@ -1002,8 +1001,8 @@ msgstr "リモートアイテムの削除: %d."
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr "ローカルアイテムの作成: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
#, fuzzy, javascript-format
|
||||
msgid "State: %s."
|
||||
msgstr "状態: \"%s\"。"
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1013,6 +1012,16 @@ msgstr "中止中..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "完了: %s"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "致命的なエラー: "
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
|
||||
msgid "In progress"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "同期作業はすでに実行中です。状態: %s"
|
||||
@@ -1080,9 +1089,16 @@ msgid "Dark"
|
||||
msgstr "暗い"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "未完のToDoをリストの上部に表示"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Reverse sort order"
|
||||
msgstr "逆順に並び替える。"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "ノートに位置情報を保存"
|
||||
|
||||
@@ -1104,7 +1120,18 @@ msgstr "あたらしいノートを作成します。"
|
||||
msgid "Show tray icon"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically update the application"
|
||||
@@ -1146,13 +1173,13 @@ msgstr ""
|
||||
"ファイルシステム同期の有効時に同期を行うパスです。`sync.target`も参考にしてく"
|
||||
"ださい。"
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgid "Nextcloud username"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgid "Nextcloud password"
|
||||
msgstr ""
|
||||
|
||||
msgid "WebDAV URL"
|
||||
@@ -1168,6 +1195,44 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "無効な設定値: \"%s\"。有効な値は: %sです。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Evernote Exportファイル"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote Exportファイル"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr "同期状況の出力先を選択してください"
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "同期が出来なかったアイテム"
|
||||
|
||||
@@ -1251,6 +1316,19 @@ msgstr "確認"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "同期の中止"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "OneDriveログイン"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1322,6 +1400,9 @@ msgstr "ノートブックを削除"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "OneDriveログイン"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "検索"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1337,6 +1418,82 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "ようこそ"
|
||||
|
||||
#~ msgid "Searches"
|
||||
#~ msgstr "検索"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr "ノートを削除しますか?"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Evernoteノートブックファイル(.enex)のインポート"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "ファイル \"%s\" はノートブック \"%s\"に取り込まれます。よろしいですか?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "新しいノートブック\"%s\"が作成され、ファイル\"%s\"が取り込まれます。よろし"
|
||||
#~ "いですか?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Evernoteのインポート"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "次のペインへ"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "前のペインへ"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "コマンドラインモードに入る"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "コマンドラインモードの終了"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "選択したノートを編集"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "現在のコマンドをキャンセル"
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "アプリケーションを終了する"
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "選択中のノートまたはノートブックを削除"
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "ToDoを完了/未完に設定"
|
||||
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr "コンソールを最大表示/最小表示/非表示/可視で切り替える([t][c])"
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "ノートのメタ情報を切り替える [tm]"
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "新しいノートの作成 [mn]"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "新しいToDoの作成 [mt]"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "新しいノートブックの作成 [mb]"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "ノートをノートブックにコピー [yn]"
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "ノートをノートブックに移動"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The target to synchonise to. If synchronising with the file system, set "
|
||||
#~ "`sync.2.path` to specify the target directory."
|
||||
|
@@ -15,63 +15,12 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr ""
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr ""
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr ""
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr ""
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr ""
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr ""
|
||||
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr ""
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr ""
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr ""
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr ""
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr ""
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr ""
|
||||
|
||||
@@ -225,10 +174,14 @@ msgid "Exits the application."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr ""
|
||||
|
||||
@@ -241,6 +194,10 @@ msgstr ""
|
||||
msgid "Displays usage information."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr ""
|
||||
|
||||
@@ -266,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 \":\""
|
||||
@@ -276,25 +233,19 @@ msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr ""
|
||||
@@ -421,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 ""
|
||||
@@ -498,6 +459,9 @@ msgstr ""
|
||||
msgid "Possible keys/values:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr ""
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr ""
|
||||
|
||||
@@ -535,6 +499,17 @@ msgid ""
|
||||
"background and will be available soon."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr ""
|
||||
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
@@ -547,10 +522,13 @@ msgstr ""
|
||||
msgid "New notebook"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
@@ -578,6 +556,9 @@ msgstr ""
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
@@ -599,6 +580,9 @@ msgstr ""
|
||||
msgid "Website and documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Make a donation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
|
||||
@@ -622,11 +606,7 @@ msgstr ""
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
@@ -638,9 +618,6 @@ msgstr ""
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
@@ -651,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 "
|
||||
@@ -709,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 ""
|
||||
|
||||
@@ -747,6 +732,9 @@ msgstr ""
|
||||
msgid "Layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Search..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr ""
|
||||
|
||||
@@ -797,6 +785,12 @@ msgstr ""
|
||||
msgid "Set alarm"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "to-do"
|
||||
msgstr ""
|
||||
|
||||
@@ -816,7 +810,7 @@ msgstr ""
|
||||
msgid "OneDrive Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
@@ -843,9 +837,6 @@ msgstr ""
|
||||
msgid "Notebooks"
|
||||
msgstr ""
|
||||
|
||||
msgid "Searches"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
@@ -857,6 +848,9 @@ msgstr ""
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr ""
|
||||
|
||||
@@ -927,7 +921,7 @@ msgid "Fetched items: %d/%d."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
msgid "State: %s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -937,6 +931,16 @@ msgstr ""
|
||||
msgid "Completed: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
|
||||
msgid "In progress"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr ""
|
||||
@@ -998,7 +1002,13 @@ msgstr ""
|
||||
msgid "Dark"
|
||||
msgstr ""
|
||||
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reverse sort order"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
@@ -1019,7 +1029,18 @@ msgstr ""
|
||||
msgid "Show tray icon"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically update the application"
|
||||
@@ -1059,13 +1080,13 @@ msgid ""
|
||||
"See `sync.target`."
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgid "Nextcloud username"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgid "Nextcloud password"
|
||||
msgstr ""
|
||||
|
||||
msgid "WebDAV URL"
|
||||
@@ -1081,6 +1102,41 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "Evernote Export File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr ""
|
||||
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr ""
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr ""
|
||||
|
||||
@@ -1164,6 +1220,18 @@ msgstr ""
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr ""
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1234,6 +1302,9 @@ msgstr ""
|
||||
msgid "Login with OneDrive"
|
||||
msgstr ""
|
||||
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
|
@@ -16,64 +16,12 @@ msgstr ""
|
||||
"X-Generator: Poedit 2.0.5\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Focus op het volgende paneel"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Focus op het vorige paneel"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Ga naar command line modus"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Ga uit command line modus"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Pas de geselecteerde notitie aan"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Annuleer het huidige commando."
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Sluit de applicatie."
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Verwijder de geselecteerde notitie of het geselecteerde notitieboek."
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Untag de geassocieerde notities om een tag te verwijderen."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "Selecteer eerst het notitieboek of de notitie om te verwijderen."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Zet een to-do als voltooid / niet voltooid"
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr ""
|
||||
"Wissel de console tussen gemaximaliseerd/geminimaliseerd/verborgen/zichtbaar."
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Zoeken"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "Ac[t]iveer notitie [m]etadata."
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "[M]aak een nieuwe [n]otitie"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "[M]aak een nieuwe [t]o-do"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "[M]aak een nieuw notitie[b]oek"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "Kopieer [Y] de [n]otirie in een notitieboek."
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Verplaats de notitie naar een notitieboek."
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Typ Ctrl+D of \"exit\" om de applicatie te sluiten"
|
||||
|
||||
@@ -239,14 +187,19 @@ msgstr "Notitie is opgeslaan."
|
||||
msgid "Exits the application."
|
||||
msgstr "Sluit de applicatie."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Exporteert Joplin gegevens naar de opgegeven folder. Standaard zal het de "
|
||||
"volledige database exporteren, zoals notitieboeken, notities, tags en "
|
||||
"middelen."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Datumnotatie"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Exporteert alleen de opgegeven notitie."
|
||||
|
||||
@@ -259,6 +212,10 @@ msgstr "Toont een geolocatie link voor de notitie."
|
||||
msgid "Displays usage information."
|
||||
msgstr "Toont gebruiksinformatie."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "Shortcuts zijn niet beschikbaar in command line modus."
|
||||
|
||||
@@ -292,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 \":\""
|
||||
@@ -301,31 +259,22 @@ msgstr "Om command line modus te gebruiken, duw \":\""
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Om command line modus te verlaten, duw ESCAPE"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
"Voor de volledige lijst van beschikbare shortcuts, typ `help shortcuts`"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Importeer een Evernote notitieboek (.enex bestand)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Geen commando gevonden: \"%s\""
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "Vraag niet om bevestiging. "
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr ""
|
||||
"Bestand \"%s\" zal toegevoegd worden aan bestaand notitieboek \"%s\". "
|
||||
"Doorgaan?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"Nieuw notitieboek \"%s\" zal aangemaakt worden en bestand \"%s\" zal eraan "
|
||||
"toegevoegd worden. Doorgaan?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "Gevonden: %d."
|
||||
@@ -467,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 ""
|
||||
@@ -557,6 +516,10 @@ msgstr "Standaard: %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Mogelijke sleutels/waarden:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Toont gebruiksinformatie."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Fatale fout:"
|
||||
|
||||
@@ -610,6 +573,18 @@ msgstr ""
|
||||
"hoofdsleutel al ingegeven hebt, worden de versleutelde items ontsleuteld in "
|
||||
"de achtergrond. Ze zijn binnenkort beschikbaar."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "PDF File"
|
||||
msgstr "Bestand"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Bestand"
|
||||
|
||||
@@ -622,11 +597,15 @@ msgstr "Nieuwe to-do"
|
||||
msgid "New notebook"
|
||||
msgstr "Nieuw notitieboek"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Importeer Evernote notities"
|
||||
msgid "Import"
|
||||
msgstr "Importeer"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Exporteer Evernote bestanden"
|
||||
#, fuzzy
|
||||
msgid "Export"
|
||||
msgstr "Importeer"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -653,6 +632,9 @@ msgstr "Zoek in alle notities"
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
@@ -674,6 +656,10 @@ msgstr "Help"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Website en documentatie"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Make a donation"
|
||||
msgstr "Website en documentatie"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr ""
|
||||
|
||||
@@ -697,12 +683,8 @@ msgstr "OK"
|
||||
msgid "Cancel"
|
||||
msgstr "Annuleer"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr "Notities verwijderen?"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
@@ -714,9 +696,6 @@ msgstr ""
|
||||
msgid "No"
|
||||
msgstr "N"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Annuleer synchronisatie"
|
||||
@@ -728,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 "
|
||||
@@ -798,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"
|
||||
|
||||
@@ -838,6 +825,10 @@ msgstr "Stel melding in:"
|
||||
msgid "Layout"
|
||||
msgstr "Layout"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search..."
|
||||
msgstr "Zoeken"
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "Sommige items kunnen niet gesynchroniseerd worden."
|
||||
|
||||
@@ -891,6 +882,12 @@ msgstr "Tags"
|
||||
msgid "Set alarm"
|
||||
msgstr "Zet melding"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "to-do"
|
||||
msgstr "Nieuwe to-do"
|
||||
@@ -912,8 +909,8 @@ msgstr "Vrijmaken"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "OneDrive Login"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importeer"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Opties"
|
||||
@@ -939,9 +936,6 @@ msgstr "Synchroniseer"
|
||||
msgid "Notebooks"
|
||||
msgstr "Notitieboeken"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Zoekopdrachten"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Selecteer waar de synchronisatie status naar geëxporteerd moet worden"
|
||||
|
||||
@@ -953,6 +947,9 @@ msgstr "Gebruik: %s"
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr "Onbekende optie: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr "Bestandssysteem"
|
||||
|
||||
@@ -1031,8 +1028,8 @@ msgstr "Verwijderde remote items: %d."
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr "Opgehaalde items: %d/%d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
#, fuzzy, javascript-format
|
||||
msgid "State: %s."
|
||||
msgstr "Status: \"%s\""
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1042,6 +1039,16 @@ msgstr "Annuleren..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Voltooid: %s"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Fatale fout:"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
|
||||
msgid "In progress"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "Synchronisatie is reeds bezig. Status: %s"
|
||||
@@ -1109,9 +1116,16 @@ msgid "Dark"
|
||||
msgstr "Donker"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Toon onvoltooide to-do's aan de top van de lijsten"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Draait de sorteervolgorde om."
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Sla geo-locatie op bij notities"
|
||||
|
||||
@@ -1132,7 +1146,18 @@ msgstr "Maakt een nieuwe notitie aan."
|
||||
msgid "Show tray icon"
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
|
||||
msgid "Automatically update the application"
|
||||
@@ -1174,14 +1199,14 @@ msgstr ""
|
||||
"Het pad om mee te synchroniseren als bestandssysteem synchronisatie is "
|
||||
"ingeschakeld. Zie `sync.target`."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgid "Nextcloud username"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Nexcloud password"
|
||||
msgid "Nextcloud password"
|
||||
msgstr "Stel wachtwoord in"
|
||||
|
||||
msgid "WebDAV URL"
|
||||
@@ -1198,6 +1223,44 @@ msgstr "Stel wachtwoord in"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ongeldige optie: \"%s\". Geldige waarden zijn: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Exporteer Evernote bestanden"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Exporteer Evernote bestanden"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr "Selecteer waar de synchronisatie status naar geëxporteerd moet worden"
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Items die niet gesynchroniseerd kunnen worden"
|
||||
|
||||
@@ -1285,6 +1348,19 @@ msgstr "Bevestig"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Annuleer synchronisatie"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Log in met OneDrive"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hoofdsleutel: %s"
|
||||
@@ -1355,6 +1431,9 @@ msgstr "Verwijder notitieboek"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Log in met OneDrive"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Zoeken"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1370,6 +1449,86 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Welkom"
|
||||
|
||||
#~ msgid "Searches"
|
||||
#~ msgstr "Zoekopdrachten"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr "Notities verwijderen?"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Importeer een Evernote notitieboek (.enex bestand)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Bestand \"%s\" zal toegevoegd worden aan bestaand notitieboek \"%s\". "
|
||||
#~ "Doorgaan?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Nieuw notitieboek \"%s\" zal aangemaakt worden en bestand \"%s\" zal "
|
||||
#~ "eraan toegevoegd worden. Doorgaan?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Importeer Evernote notities"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Focus op het volgende paneel"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Focus op het vorige paneel"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Ga naar command line modus"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Ga uit command line modus"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Pas de geselecteerde notitie aan"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Annuleer het huidige commando."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Sluit de applicatie."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr ""
|
||||
#~ "Verwijder de geselecteerde notitie of het geselecteerde notitieboek."
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Zet een to-do als voltooid / niet voltooid"
|
||||
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr ""
|
||||
#~ "Wissel de console tussen gemaximaliseerd/geminimaliseerd/verborgen/"
|
||||
#~ "zichtbaar."
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "Ac[t]iveer notitie [m]etadata."
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "[M]aak een nieuwe [n]otitie"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "[M]aak een nieuwe [t]o-do"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "[M]aak een nieuw notitie[b]oek"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "Kopieer [Y] de [n]otirie in een notitieboek."
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Verplaats de notitie naar een notitieboek."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The target to synchonise to. If synchronising with the file system, set "
|
||||
#~ "`sync.2.path` to specify the target directory."
|
||||
|
@@ -17,63 +17,12 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
msgid "Give focus to next pane"
|
||||
msgstr "Переключиться на следующую панель"
|
||||
|
||||
msgid "Give focus to previous pane"
|
||||
msgstr "Переключиться на предыдущую панель"
|
||||
|
||||
msgid "Enter command line mode"
|
||||
msgstr "Войти в режим командной строки"
|
||||
|
||||
msgid "Exit command line mode"
|
||||
msgstr "Выйти из режима командной строки"
|
||||
|
||||
msgid "Edit the selected note"
|
||||
msgstr "Редактировать выбранную заметку"
|
||||
|
||||
msgid "Cancel the current command."
|
||||
msgstr "Отменить текущую команду."
|
||||
|
||||
msgid "Exit the application."
|
||||
msgstr "Выйти из приложения."
|
||||
|
||||
msgid "Delete the currently selected note or notebook."
|
||||
msgstr "Удалить текущую выбранную заметку или блокнот."
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Чтобы удалить тег, уберите его с ассоциированных с ним заметок."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "Сначала выберите заметку или блокнот, которые должны быть удалены."
|
||||
|
||||
msgid "Set a to-do as completed / not completed"
|
||||
msgstr "Отметить задачу как завершённую/незавершённую"
|
||||
|
||||
msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
msgstr "[tc] переключить консоль между развёрнутой/свёрнутой/скрытой/видимой."
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Поиск"
|
||||
|
||||
msgid "[t]oggle note [m]etadata."
|
||||
msgstr "[tm] переключить отображение метаданных заметки."
|
||||
|
||||
msgid "[M]ake a new [n]ote"
|
||||
msgstr "[mn] создать новую заметку"
|
||||
|
||||
msgid "[M]ake a new [t]odo"
|
||||
msgstr "[mt] создать новую задачу"
|
||||
|
||||
msgid "[M]ake a new note[b]ook"
|
||||
msgstr "[mb] создать новый блокнот"
|
||||
|
||||
msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
msgstr "[yn] копировать заметку в блокнот."
|
||||
|
||||
msgid "Move the note to a notebook."
|
||||
msgstr "Переместить заметку в блокнот."
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "Для выхода из приложения нажмите Ctrl+D или введите «exit»"
|
||||
|
||||
@@ -241,12 +190,16 @@ msgid "Exits the application."
|
||||
msgstr "Выход из приложения."
|
||||
|
||||
msgid ""
|
||||
"Exports Joplin data to the given directory. By default, it will export the "
|
||||
"Exports Joplin data to the given path. By default, it will export the "
|
||||
"complete database including notebooks, notes, tags and resources."
|
||||
msgstr ""
|
||||
"Экспортирует данные Joplin в заданный каталог. По умолчанию экспортируется "
|
||||
"Экспортирует данные Joplin по заданному пути. По умолчанию экспортируется "
|
||||
"полная база данных, включая блокноты, заметки, теги и ресурсы."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Destination format: %s"
|
||||
msgstr "Целевой формат: %s"
|
||||
|
||||
msgid "Exports only the given note."
|
||||
msgstr "Экспортирует только заданную заметку."
|
||||
|
||||
@@ -259,6 +212,10 @@ msgstr "Выводит URL геолокации для заметки."
|
||||
msgid "Displays usage information."
|
||||
msgstr "Выводит информацию об использовании."
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
msgstr "Информацию по настройке сочетаний можно получить, посетив %s"
|
||||
|
||||
msgid "Shortcuts are not available in CLI mode."
|
||||
msgstr "Ярлыки недоступны в режиме командной строки."
|
||||
|
||||
@@ -292,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 \":\""
|
||||
@@ -302,29 +260,21 @@ msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "Чтобы выйти из режима командной строки, нажмите ESCAPE"
|
||||
|
||||
msgid ""
|
||||
"For the complete list of available keyboard shortcuts, type `help shortcuts`"
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
msgstr ""
|
||||
"Для просмотра списка доступных клавиатурных сочетаний введите `help "
|
||||
"shortcuts`"
|
||||
"Для просмотра списка клавиатурных сочетаний и настроек конфигурации введите "
|
||||
"`help keymap`"
|
||||
|
||||
msgid "Imports an Evernote notebook file (.enex file)."
|
||||
msgstr "Импортирует файл блокнотов Evernote (.enex-файл)."
|
||||
msgid "Imports data into Joplin."
|
||||
msgstr "Импортирует данные в Joplin."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Source format: %s"
|
||||
msgstr "Исходный формат: %s"
|
||||
|
||||
msgid "Do not ask for confirmation."
|
||||
msgstr "Не запрашивать подтверждение."
|
||||
|
||||
#, javascript-format
|
||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
msgstr "Файл «%s» будет импортирован в существующий блокнот «%s». Продолжить?"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
"it. Continue?"
|
||||
msgstr ""
|
||||
"Будет создан новый блокнот «%s» и в него будет импортирован файл «%s». "
|
||||
"Продолжить?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Found: %d."
|
||||
msgstr "Найдено: %d."
|
||||
@@ -465,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 ""
|
||||
@@ -556,6 +516,9 @@ msgstr "По умолчанию: %s"
|
||||
msgid "Possible keys/values:"
|
||||
msgstr "Возможные ключи/значения:"
|
||||
|
||||
msgid "Type `joplin help` for usage information."
|
||||
msgstr "Введите `joplin help` для получения информации об использовании."
|
||||
|
||||
msgid "Fatal error:"
|
||||
msgstr "Фатальная ошибка:"
|
||||
|
||||
@@ -609,6 +572,17 @@ msgstr ""
|
||||
"decrypt». Если пароль уже был вами предоставлен, зашифрованные элементы "
|
||||
"расшифруются в фоновом режиме и вскоре станут доступны."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Экспорт в «%s» в формате «%s». Пожалуйста, ожидайте..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Импорт из «%s» в формате «%s». Пожалуйста, ожидайте..."
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-файл"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Файл"
|
||||
|
||||
@@ -621,15 +595,18 @@ msgstr "Новая задача"
|
||||
msgid "New notebook"
|
||||
msgstr "Новый блокнот"
|
||||
|
||||
msgid "Import Evernote notes"
|
||||
msgstr "Импортировать заметки из Evernote"
|
||||
msgid "Import"
|
||||
msgstr "Импорт"
|
||||
|
||||
msgid "Evernote Export Files"
|
||||
msgstr "Файлы экспорта Evernote"
|
||||
msgid "Export"
|
||||
msgstr "Экспорт"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Печать"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
msgstr ""
|
||||
msgstr "Скрыть %s"
|
||||
|
||||
msgid "Quit"
|
||||
msgstr "Выход"
|
||||
@@ -650,10 +627,13 @@ msgid "Search in all the notes"
|
||||
msgstr "Поиск во всех заметках"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Вид"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
msgstr "Переключить вид редактора"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Инструменты"
|
||||
@@ -673,6 +653,9 @@ msgstr "Помощь"
|
||||
msgid "Website and documentation"
|
||||
msgstr "Сайт и документация"
|
||||
|
||||
msgid "Make a donation"
|
||||
msgstr "Сделать пожертвование"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr "Проверить обновления..."
|
||||
|
||||
@@ -683,12 +666,12 @@ msgstr "О Joplin"
|
||||
msgid "%s %s (%s, %s)"
|
||||
msgstr "%s %s (%s, %s)"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Open %s"
|
||||
msgstr "В %s: %s"
|
||||
msgstr "Открыть %s"
|
||||
|
||||
msgid "Exit"
|
||||
msgstr ""
|
||||
msgstr "Выход"
|
||||
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
@@ -696,30 +679,20 @@ msgstr "OK"
|
||||
msgid "Cancel"
|
||||
msgstr "Отмена"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Release notes:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr "Удалить заметки?"
|
||||
|
||||
#, fuzzy
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Доступно обновление. Обновить сейчас?"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "No"
|
||||
msgstr "N"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Вы используете самую свежую версию."
|
||||
|
||||
#, fuzzy
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Доступно обновление. Желаете скачать его сейчас?"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Да"
|
||||
|
||||
msgid "No"
|
||||
msgstr "Нет"
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Отменить синхронизацию"
|
||||
msgstr "Проверить настройки синхронизации"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
@@ -728,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 "
|
||||
@@ -789,15 +765,22 @@ msgstr ""
|
||||
"ключей, в зависимости от того, как изначально были зашифрованы заметки или "
|
||||
"блокноты."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Missing Master Keys"
|
||||
msgstr "Мастер-ключи"
|
||||
msgstr "Недостающие мастер-ключи"
|
||||
|
||||
msgid ""
|
||||
"The master keys with these IDs are used to encrypt some of your items, "
|
||||
"however the application does not currently have access to them. It is likely "
|
||||
"they will eventually be downloaded via synchronisation."
|
||||
msgstr ""
|
||||
"Мастер-ключи с такими ID используются для шифрования некоторых из ваших "
|
||||
"элементов, однако у приложения сейчас нет к ним доступа. Скорее всего, они "
|
||||
"загрузятся при синхронизации."
|
||||
|
||||
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 "Статус"
|
||||
@@ -837,6 +820,10 @@ msgstr "Установить напоминание:"
|
||||
msgid "Layout"
|
||||
msgstr "Вид"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search..."
|
||||
msgstr "Поиск"
|
||||
|
||||
msgid "Some items cannot be synchronised."
|
||||
msgstr "Некоторые элементы не могут быть синхронизированы."
|
||||
|
||||
@@ -869,11 +856,10 @@ msgid ""
|
||||
msgstr "Сейчас здесь нет блокнотов. Создайте новый нажав «Новый блокнот»."
|
||||
|
||||
msgid "Open..."
|
||||
msgstr ""
|
||||
msgstr "Открыть..."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Save as..."
|
||||
msgstr "Сохранить изменения"
|
||||
msgstr "Сохранить как..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -888,17 +874,23 @@ msgstr "Теги"
|
||||
msgid "Set alarm"
|
||||
msgstr "Установить напоминание"
|
||||
|
||||
#, fuzzy
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
"Заметка пуста. Нажмите на «%s», чтобы переключиться в редактор и "
|
||||
"отредактировать её."
|
||||
|
||||
msgid "to-do"
|
||||
msgstr "Новая задача"
|
||||
msgstr "задача"
|
||||
|
||||
#, fuzzy
|
||||
msgid "note"
|
||||
msgstr "Новая заметка"
|
||||
msgstr "заметка"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Creating new %s..."
|
||||
msgstr "Импорт заметок..."
|
||||
msgstr "Создание новой %s..."
|
||||
|
||||
msgid "Refresh"
|
||||
msgstr "Обновить"
|
||||
@@ -909,8 +901,8 @@ msgstr "Очистить"
|
||||
msgid "OneDrive Login"
|
||||
msgstr "Вход в OneDrive"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Импорт"
|
||||
msgid "Dropbox Login"
|
||||
msgstr ""
|
||||
|
||||
msgid "Options"
|
||||
msgstr "Настройки"
|
||||
@@ -936,9 +928,6 @@ msgstr "Синхронизировать"
|
||||
msgid "Notebooks"
|
||||
msgstr "Блокноты"
|
||||
|
||||
msgid "Searches"
|
||||
msgstr "Запросы"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Выберите, куда должен быть экспортирован статус синхронизации"
|
||||
|
||||
@@ -950,12 +939,14 @@ msgstr "Использование: %s"
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr "Неизвестный флаг: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "File system"
|
||||
msgstr "Файловая система"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Nextcloud"
|
||||
msgstr "Nextcloud (Beta)"
|
||||
msgstr "Nextcloud"
|
||||
|
||||
msgid "OneDrive"
|
||||
msgstr "OneDrive"
|
||||
@@ -963,9 +954,8 @@ msgstr "OneDrive"
|
||||
msgid "OneDrive Dev (For testing only)"
|
||||
msgstr "OneDrive Dev (только для тестирования)"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgstr "WebDAV"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unknown log level: %s"
|
||||
@@ -1029,8 +1019,8 @@ msgstr "Удалено удалённых элементов: %d."
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr "Получено элементов: %d/%d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "State: \"%s\"."
|
||||
#, fuzzy, javascript-format
|
||||
msgid "State: %s."
|
||||
msgstr "Статус: «%s»."
|
||||
|
||||
msgid "Cancelling..."
|
||||
@@ -1040,6 +1030,16 @@ msgstr "Отмена..."
|
||||
msgid "Completed: %s"
|
||||
msgstr "Завершено: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Last error: %s"
|
||||
msgstr "Последняя ошибка: %s"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr "Простой"
|
||||
|
||||
msgid "In progress"
|
||||
msgstr "Выполнение"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr "Синхронизация уже выполняется. Статус: %s"
|
||||
@@ -1103,9 +1103,14 @@ msgstr "Светлая"
|
||||
msgid "Dark"
|
||||
msgstr "Тёмная"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Show uncompleted to-dos on top of the lists"
|
||||
msgstr "Показывать незавершённые задачи вверху списков"
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "Незавершённые задачи сверху"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr "Сортировать заметки по"
|
||||
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Обратный порядок сортировки"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Сохранять информацию о геолокации в заметках"
|
||||
@@ -1123,10 +1128,23 @@ msgid "When creating a new note:"
|
||||
msgstr "При создании новой заметки:"
|
||||
|
||||
msgid "Show tray icon"
|
||||
msgstr "Показывать иконку в панели задач"
|
||||
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr ""
|
||||
|
||||
msgid "Set application zoom percentage"
|
||||
msgstr "Масштаб приложения в процентах"
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Глобальный масштаб в процентах"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Семейство шрифтов редактора"
|
||||
|
||||
msgid ""
|
||||
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||
"a generic monospace font."
|
||||
msgstr ""
|
||||
"Название шрифта не проверяется. Если оно указано некорректно или не задано, "
|
||||
"будет использоваться стандартный моноширинный шрифт."
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Автоматически обновлять приложение"
|
||||
@@ -1169,31 +1187,66 @@ msgstr ""
|
||||
"Путь для синхронизации при включённой синхронизации с файловой системой. См. "
|
||||
"`sync.target`."
|
||||
|
||||
msgid "Nexcloud WebDAV URL"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgid "Nextcloud WebDAV URL"
|
||||
msgstr "Nextcloud WebDAV URL"
|
||||
|
||||
msgid "Nexcloud username"
|
||||
msgstr "Имя пользователя Nexcloud"
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Имя пользователя Nextcloud"
|
||||
|
||||
msgid "Nexcloud password"
|
||||
msgstr "Пароль Nexcloud"
|
||||
msgid "Nextcloud password"
|
||||
msgstr "Пароль Nextcloud"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV URL"
|
||||
msgstr "Nexcloud WebDAV URL"
|
||||
msgstr "URL WebDAV"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV username"
|
||||
msgstr "Имя пользователя Nexcloud"
|
||||
msgstr "Имя пользователя WebDAV"
|
||||
|
||||
#, fuzzy
|
||||
msgid "WebDAV password"
|
||||
msgstr "Установить пароль"
|
||||
msgstr "Пароль WebDAV"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Неверное значение параметра: «%s». Доступные значения: %s."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Файл экспорта Joplin"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr "Папка экспорта Joplin"
|
||||
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Файл экспорта Evernote"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Директория"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||
msgstr "Не удалось загрузить модуль «%s» для формата «%s»"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Please specify import format for %s"
|
||||
msgstr "Пожалуйста, укажите формат импорта для %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||
"decrypted and try again."
|
||||
msgstr ""
|
||||
"Этот элемент сейчас зашифрован: %s «%s». Пожалуйста, дождитесь расшифровки "
|
||||
"всех элементов и попробуйте снова."
|
||||
|
||||
msgid "There is no data to export."
|
||||
msgstr "Нет данных для экспорта."
|
||||
|
||||
msgid "Please specify the notebook where the notes should be imported to."
|
||||
msgstr ""
|
||||
"Пожалуйста, укажите блокнот, в который должны быть импортированы заметки."
|
||||
|
||||
msgid "Items that cannot be synchronised"
|
||||
msgstr "Элементы, которые не могут быть синхронизированы"
|
||||
|
||||
@@ -1280,6 +1333,19 @@ msgstr "Подтвердить"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Отменить синхронизацию"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Type new tags or select from list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr "Сайт Joplin"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Войти в OneDrive"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Мастер-ключ %s"
|
||||
@@ -1305,11 +1371,10 @@ msgid "Edit notebook"
|
||||
msgstr "Редактировать блокнот"
|
||||
|
||||
msgid "Show all"
|
||||
msgstr ""
|
||||
msgstr "Показать всё"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Errors only"
|
||||
msgstr "Ошибка"
|
||||
msgstr "Только ошибки"
|
||||
|
||||
msgid "This note has been modified:"
|
||||
msgstr "Эта заметка была изменена:"
|
||||
@@ -1351,6 +1416,9 @@ msgstr "Удалить блокнот"
|
||||
msgid "Login with OneDrive"
|
||||
msgstr "Войти в OneDrive"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Поиск"
|
||||
|
||||
msgid ""
|
||||
"Click on the (+) button to create a new note or notebook. Click on the side "
|
||||
"menu to access your existing notebooks."
|
||||
@@ -1364,6 +1432,83 @@ msgstr "У вас сейчас нет блокнота. Создайте его
|
||||
msgid "Welcome"
|
||||
msgstr "Добро пожаловать"
|
||||
|
||||
#~ msgid "Searches"
|
||||
#~ msgstr "Запросы"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
#~ "Release notes:\n"
|
||||
#~ "\n"
|
||||
#~ "%s"
|
||||
#~ msgstr "Удалить заметки?"
|
||||
|
||||
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||
#~ msgstr "Импортирует файл блокнотов Evernote (.enex-файл)."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Файл «%s» будет импортирован в существующий блокнот «%s». Продолжить?"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||
#~ "it. Continue?"
|
||||
#~ msgstr ""
|
||||
#~ "Будет создан новый блокнот «%s» и в него будет импортирован файл «%s». "
|
||||
#~ "Продолжить?"
|
||||
|
||||
#~ msgid "Import Evernote notes"
|
||||
#~ msgstr "Импортировать заметки из Evernote"
|
||||
|
||||
#~ msgid "Give focus to next pane"
|
||||
#~ msgstr "Переключиться на следующую панель"
|
||||
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Переключиться на предыдущую панель"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Войти в режим командной строки"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Выйти из режима командной строки"
|
||||
|
||||
#~ msgid "Edit the selected note"
|
||||
#~ msgstr "Редактировать выбранную заметку"
|
||||
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Отменить текущую команду."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Выйти из приложения."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Удалить текущую выбранную заметку или блокнот."
|
||||
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Отметить задачу как завершённую/незавершённую"
|
||||
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr ""
|
||||
#~ "[tc] переключить консоль между развёрнутой/свёрнутой/скрытой/видимой."
|
||||
|
||||
#~ msgid "[t]oggle note [m]etadata."
|
||||
#~ msgstr "[tm] переключить отображение метаданных заметки."
|
||||
|
||||
#~ msgid "[M]ake a new [n]ote"
|
||||
#~ msgstr "[mn] создать новую заметку"
|
||||
|
||||
#~ msgid "[M]ake a new [t]odo"
|
||||
#~ msgstr "[mt] создать новую задачу"
|
||||
|
||||
#~ msgid "[M]ake a new note[b]ook"
|
||||
#~ msgstr "[mb] создать новый блокнот"
|
||||
|
||||
#~ msgid "Copy ([Y]ank) the [n]ote to a notebook."
|
||||
#~ msgstr "[yn] копировать заметку в блокнот."
|
||||
|
||||
#~ msgid "Move the note to a notebook."
|
||||
#~ msgstr "Переместить заметку в блокнот."
|
||||
|
||||
#~ msgid "Error"
|
||||
#~ msgstr "Ошибка"
|
||||
|
||||
|
44
CliClient/package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "joplin",
|
||||
"version": "1.0.97",
|
||||
"version": "1.0.106",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -435,6 +435,14 @@
|
||||
"universalify": "0.1.1"
|
||||
}
|
||||
},
|
||||
"fs-minipass": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
|
||||
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
|
||||
"requires": {
|
||||
"minipass": "2.2.1"
|
||||
}
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@@ -858,9 +866,9 @@
|
||||
}
|
||||
},
|
||||
"minizlib": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.0.4.tgz",
|
||||
"integrity": "sha512-sN4U9tIJtBRwKbwgFh9qJfrPIQ/GGTRr1MGqkgOeMTLy8/lM0FcWU//FqlnZ3Vb7gJ+Mxh3FOg1EklibdajbaQ==",
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
|
||||
"integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
|
||||
"requires": {
|
||||
"minipass": "2.2.1"
|
||||
}
|
||||
@@ -975,11 +983,6 @@
|
||||
"wrappy": "1.0.2"
|
||||
}
|
||||
},
|
||||
"os-tmpdir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
|
||||
},
|
||||
"parse-data-uri": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz",
|
||||
@@ -1161,6 +1164,20 @@
|
||||
"semver": "5.4.1",
|
||||
"simple-get": "2.7.0",
|
||||
"tar": "3.2.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tar": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-3.2.1.tgz",
|
||||
"integrity": "sha512-ZSzds1E0IqutvMU8HxjMaU8eB7urw2fGwTq88ukDOVuUIh0656l7/P7LiVPxhO5kS4flcRJQk8USG+cghQbTUQ==",
|
||||
"requires": {
|
||||
"chownr": "1.0.1",
|
||||
"minipass": "2.2.1",
|
||||
"minizlib": "1.1.0",
|
||||
"mkdirp": "0.5.1",
|
||||
"yallist": "3.0.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"simple-concat": {
|
||||
@@ -2005,13 +2022,14 @@
|
||||
"integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0="
|
||||
},
|
||||
"tar": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-3.2.1.tgz",
|
||||
"integrity": "sha512-ZSzds1E0IqutvMU8HxjMaU8eB7urw2fGwTq88ukDOVuUIh0656l7/P7LiVPxhO5kS4flcRJQk8USG+cghQbTUQ==",
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.0.tgz",
|
||||
"integrity": "sha512-gJlTiiErwo96K904FnoYWl+5+FBgS+FimU6GMh66XLdLa55al8+d4jeDfPoGwSNHdtWI5FJP6xurmVqhBuGJpQ==",
|
||||
"requires": {
|
||||
"chownr": "1.0.1",
|
||||
"fs-minipass": "1.2.5",
|
||||
"minipass": "2.2.1",
|
||||
"minizlib": "1.0.4",
|
||||
"minizlib": "1.1.0",
|
||||
"mkdirp": "0.5.1",
|
||||
"yallist": "3.0.2"
|
||||
}
|
||||
|
@@ -19,7 +19,7 @@
|
||||
],
|
||||
"owner": "Laurent Cozic"
|
||||
},
|
||||
"version": "1.0.97",
|
||||
"version": "1.0.106",
|
||||
"bin": {
|
||||
"joplin": "./main.js"
|
||||
},
|
||||
@@ -44,7 +44,6 @@
|
||||
"node-emoji": "^1.8.1",
|
||||
"node-fetch": "^1.7.1",
|
||||
"node-persist": "^2.1.0",
|
||||
"os-tmpdir": "^1.0.2",
|
||||
"promise": "^7.1.1",
|
||||
"proper-lockfile": "^2.0.1",
|
||||
"query-string": "4.3.4",
|
||||
@@ -57,6 +56,7 @@
|
||||
"string-padding": "^1.0.2",
|
||||
"string-to-stream": "^1.1.0",
|
||||
"strip-ansi": "^4.0.0",
|
||||
"tar": "^4.4.0",
|
||||
"tcp-port-used": "^0.1.2",
|
||||
"tkwidgets": "^0.5.25",
|
||||
"url-parse": "^1.2.0",
|
||||
|
@@ -9,7 +9,7 @@ rsync -a "$ROOT_DIR/build/locales/" "$BUILD_DIR/locales/"
|
||||
mkdir -p "$BUILD_DIR/data"
|
||||
|
||||
if [[ $TEST_FILE == "" ]]; then
|
||||
(cd "$ROOT_DIR" && npm test tests-build/synchronizer.js tests-build/encryption.js tests-build/ArrayUtils.js tests-build/models_Setting.js)
|
||||
(cd "$ROOT_DIR" && npm test tests-build/synchronizer.js tests-build/encryption.js tests-build/ArrayUtils.js tests-build/models_Setting.js tests-build/services_InteropService.js)
|
||||
else
|
||||
(cd "$ROOT_DIR" && npm test tests-build/$TEST_FILE.js)
|
||||
fi
|
252
CliClient/tests/services_InteropService.js
Normal file
@@ -0,0 +1,252 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const InteropService = require('lib/services/InteropService.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const NoteTag = require('lib/models/NoteTag.js');
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const fs = require('fs-extra');
|
||||
const ArrayUtils = require('lib/ArrayUtils');
|
||||
const ObjectUtils = require('lib/ObjectUtils');
|
||||
const { shim } = require('lib/shim.js');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
});
|
||||
|
||||
function exportDir() {
|
||||
return __dirname + '/export';
|
||||
}
|
||||
|
||||
function fieldsEqual(model1, model2, fieldNames) {
|
||||
for (let i = 0; i < fieldNames.length; i++) {
|
||||
const f = fieldNames[i];
|
||||
expect(model1[f]).toBe(model2[f], 'For key ' + f);
|
||||
}
|
||||
}
|
||||
|
||||
describe('services_InteropService', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
await setupDatabaseAndSynchronizer(1);
|
||||
await switchClient(1);
|
||||
|
||||
const dir = exportDir();
|
||||
await fs.remove(dir);
|
||||
await fs.mkdirp(dir);
|
||||
done();
|
||||
});
|
||||
|
||||
it('should export and import folders', asyncTest(async () => {
|
||||
const service = new InteropService();
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
folder1 = await Folder.load(folder1.id);
|
||||
const filePath = exportDir() + '/test.jex';
|
||||
|
||||
await service.export({ path: filePath });
|
||||
|
||||
await Folder.delete(folder1.id);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
// Check that a new folder, with a new ID, has been created
|
||||
|
||||
expect(await Folder.count()).toBe(1);
|
||||
let folder2 = (await Folder.all())[0];
|
||||
expect(folder2.id).not.toBe(folder1.id);
|
||||
expect(folder2.title).toBe(folder1.title);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
// As there was already a folder with the same title, check that the new one has been renamed
|
||||
|
||||
await Folder.delete(folder2.id);
|
||||
let folder3 = (await Folder.all())[0];
|
||||
expect(await Folder.count()).toBe(1);
|
||||
expect(folder3.title).not.toBe(folder2.title);
|
||||
|
||||
let fieldNames = Folder.fieldNames();
|
||||
fieldNames = ArrayUtils.removeElement(fieldNames, 'id');
|
||||
fieldNames = ArrayUtils.removeElement(fieldNames, 'title');
|
||||
|
||||
fieldsEqual(folder3, folder1, fieldNames);
|
||||
}));
|
||||
|
||||
it('should export and import folders and notes', asyncTest(async () => {
|
||||
const service = new InteropService();
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
note1 = await Note.load(note1.id);
|
||||
const filePath = exportDir() + '/test.jex';
|
||||
|
||||
await service.export({ path: filePath });
|
||||
|
||||
await Folder.delete(folder1.id);
|
||||
await Note.delete(note1.id);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
expect(await Note.count()).toBe(1);
|
||||
let note2 = (await Note.all())[0];
|
||||
let folder2 = (await Folder.all())[0];
|
||||
|
||||
expect(note1.parent_id).not.toBe(note2.parent_id);
|
||||
expect(note1.id).not.toBe(note2.id);
|
||||
expect(note2.parent_id).toBe(folder2.id);
|
||||
|
||||
let fieldNames = Note.fieldNames();
|
||||
fieldNames = ArrayUtils.removeElement(fieldNames, 'id');
|
||||
fieldNames = ArrayUtils.removeElement(fieldNames, 'parent_id');
|
||||
|
||||
fieldsEqual(note1, note2, fieldNames);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
note2 = (await Note.all())[0];
|
||||
let note3 = (await Note.all())[1];
|
||||
|
||||
expect(note2.id).not.toBe(note3.id);
|
||||
expect(note2.parent_id).not.toBe(note3.parent_id);
|
||||
|
||||
fieldsEqual(note2, note3, fieldNames);
|
||||
}));
|
||||
|
||||
it('should export and import notes to specific folder', asyncTest(async () => {
|
||||
const service = new InteropService();
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
note1 = await Note.load(note1.id);
|
||||
const filePath = exportDir() + '/test.jex';
|
||||
|
||||
await service.export({ path: filePath });
|
||||
|
||||
await Note.delete(note1.id);
|
||||
|
||||
await service.import({ path: filePath, destinationFolderId: folder1.id });
|
||||
|
||||
expect(await Note.count()).toBe(1);
|
||||
expect(await Folder.count()).toBe(1);
|
||||
|
||||
expect(await checkThrowAsync(async () => await service.import({ path: filePath, destinationFolderId: 'oops' }))).toBe(true);
|
||||
}));
|
||||
|
||||
it('should export and import tags', asyncTest(async () => {
|
||||
const service = new InteropService();
|
||||
const filePath = exportDir() + '/test.jex';
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
let tag1 = await Tag.save({ title: 'mon tag' });
|
||||
tag1 = await Tag.load(tag1.id);
|
||||
await Tag.addNote(tag1.id, note1.id);
|
||||
|
||||
await service.export({ path: filePath });
|
||||
|
||||
await Folder.delete(folder1.id);
|
||||
await Note.delete(note1.id);
|
||||
await Tag.delete(tag1.id);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
expect(await Tag.count()).toBe(1);
|
||||
let tag2 = (await Tag.all())[0];
|
||||
let note2 = (await Note.all())[0];
|
||||
expect(tag1.id).not.toBe(tag2.id);
|
||||
|
||||
let fieldNames = Note.fieldNames();
|
||||
fieldNames = ArrayUtils.removeElement(fieldNames, 'id');
|
||||
fieldsEqual(tag1, tag2, fieldNames);
|
||||
|
||||
let noteIds = await Tag.noteIds(tag2.id);
|
||||
expect(noteIds.length).toBe(1);
|
||||
expect(noteIds[0]).toBe(note2.id);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
// If importing again, no new tag should be created as one with
|
||||
// the same name already existed. The newly imported note should
|
||||
// however go under that already existing tag.
|
||||
expect(await Tag.count()).toBe(1);
|
||||
noteIds = await Tag.noteIds(tag2.id);
|
||||
expect(noteIds.length).toBe(2);
|
||||
}));
|
||||
|
||||
it('should export and import resources', asyncTest(async () => {
|
||||
const service = new InteropService();
|
||||
const filePath = exportDir() + '/test.jex';
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
|
||||
note1 = await Note.load(note1.id);
|
||||
let resourceIds = Note.linkedResourceIds(note1.body);
|
||||
let resource1 = await Resource.load(resourceIds[0]);
|
||||
|
||||
await service.export({ path: filePath });
|
||||
|
||||
await Note.delete(note1.id);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
expect(await Resource.count()).toBe(2);
|
||||
|
||||
let note2 = (await Note.all())[0];
|
||||
expect(note2.body).not.toBe(note1.body);
|
||||
resourceIds = Note.linkedResourceIds(note2.body);
|
||||
expect(resourceIds.length).toBe(1);
|
||||
let resource2 = await Resource.load(resourceIds[0]);
|
||||
expect(resource2.id).not.toBe(resource1.id);
|
||||
|
||||
let fieldNames = Note.fieldNames();
|
||||
fieldNames = ArrayUtils.removeElement(fieldNames, 'id');
|
||||
fieldsEqual(resource1, resource2, fieldNames);
|
||||
|
||||
const resourcePath1 = Resource.fullPath(resource1);
|
||||
const resourcePath2 = Resource.fullPath(resource2);
|
||||
|
||||
expect(resourcePath1).not.toBe(resourcePath2);
|
||||
expect(fileContentEqual(resourcePath1, resourcePath2)).toBe(true);
|
||||
}));
|
||||
|
||||
it('should export and import single notes', asyncTest(async () => {
|
||||
const service = new InteropService();
|
||||
const filePath = exportDir() + '/test.jex';
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
|
||||
await service.export({ path: filePath, sourceNoteIds: [note1.id] });
|
||||
|
||||
await Note.delete(note1.id);
|
||||
await Folder.delete(folder1.id);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
expect(await Note.count()).toBe(1);
|
||||
expect(await Folder.count()).toBe(1);
|
||||
|
||||
let folder2 = (await Folder.all())[0];
|
||||
expect(folder2.title).toBe('test');
|
||||
}));
|
||||
|
||||
it('should export and import single folders', asyncTest(async () => {
|
||||
const service = new InteropService();
|
||||
const filePath = exportDir() + '/test.jex';
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
|
||||
await service.export({ path: filePath, sourceFolderIds: [folder1.id] });
|
||||
|
||||
await Note.delete(note1.id);
|
||||
await Folder.delete(folder1.id);
|
||||
|
||||
await service.import({ path: filePath });
|
||||
|
||||
expect(await Note.count()).toBe(1);
|
||||
expect(await Folder.count()).toBe(1);
|
||||
|
||||
let folder2 = (await Folder.all())[0];
|
||||
expect(folder2.title).toBe('folder1');
|
||||
}));
|
||||
|
||||
});
|
99
CliClient/tests/services_ResourceService.js
Normal file
@@ -0,0 +1,99 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const InteropService = require('lib/services/InteropService.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const NoteTag = require('lib/models/NoteTag.js');
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const NoteResource = require('lib/models/NoteResource.js');
|
||||
const ResourceService = require('lib/services/ResourceService.js');
|
||||
const fs = require('fs-extra');
|
||||
const ArrayUtils = require('lib/ArrayUtils');
|
||||
const ObjectUtils = require('lib/ObjectUtils');
|
||||
const { shim } = require('lib/shim.js');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
});
|
||||
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
|
||||
|
||||
function exportDir() {
|
||||
return __dirname + '/export';
|
||||
}
|
||||
|
||||
function fieldsEqual(model1, model2, fieldNames) {
|
||||
for (let i = 0; i < fieldNames.length; i++) {
|
||||
const f = fieldNames[i];
|
||||
expect(model1[f]).toBe(model2[f], 'For key ' + f);
|
||||
}
|
||||
}
|
||||
|
||||
describe('services_ResourceService', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
await setupDatabaseAndSynchronizer(1);
|
||||
await switchClient(1);
|
||||
done();
|
||||
});
|
||||
|
||||
it('should delete orphaned resources', asyncTest(async () => {
|
||||
const service = new ResourceService();
|
||||
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
note1 = await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
|
||||
let resource1 = (await Resource.all())[0];
|
||||
const resourcePath = Resource.fullPath(resource1);
|
||||
|
||||
await service.indexNoteResources();
|
||||
await service.deleteOrphanResources(0);
|
||||
|
||||
expect(!!(await Resource.load(resource1.id))).toBe(true);
|
||||
|
||||
await Note.delete(note1.id);
|
||||
await service.deleteOrphanResources(0);
|
||||
|
||||
expect(!!(await Resource.load(resource1.id))).toBe(true);
|
||||
|
||||
await service.indexNoteResources();
|
||||
await service.deleteOrphanResources(1000 * 60);
|
||||
|
||||
expect(!!(await Resource.load(resource1.id))).toBe(true);
|
||||
|
||||
await service.deleteOrphanResources(0);
|
||||
|
||||
expect(!!(await Resource.load(resource1.id))).toBe(false);
|
||||
expect(await shim.fsDriver().exists(resourcePath)).toBe(false);
|
||||
expect(!(await NoteResource.all()).length).toBe(true);
|
||||
}));
|
||||
|
||||
it('should not delete resource if still associated with at least one note', asyncTest(async () => {
|
||||
const service = new ResourceService();
|
||||
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
let note2 = await Note.save({ title: 'ma deuxième note', parent_id: folder1.id });
|
||||
note1 = await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
|
||||
let resource1 = (await Resource.all())[0];
|
||||
const resourcePath = Resource.fullPath(resource1);
|
||||
|
||||
await service.indexNoteResources();
|
||||
|
||||
await Note.delete(note1.id);
|
||||
|
||||
await service.indexNoteResources();
|
||||
|
||||
await Note.save({ id: note2.id, body: Resource.markdownTag(resource1) });
|
||||
|
||||
await service.indexNoteResources();
|
||||
|
||||
await service.deleteOrphanResources(0);
|
||||
|
||||
expect(!!(await Resource.load(resource1.id))).toBe(true);
|
||||
}));
|
||||
|
||||
});
|
@@ -119,7 +119,7 @@ describe('Synchronizer', function() {
|
||||
await localItemsSameAsRemote(all, expect);
|
||||
}));
|
||||
|
||||
it('should update remote item', asyncTest(async () => {
|
||||
it('should update remote items', asyncTest(async () => {
|
||||
let folder = await Folder.save({ title: "folder1" });
|
||||
let note = await Note.save({ title: "un", parent_id: folder.id });
|
||||
await synchronizer().start();
|
||||
@@ -291,23 +291,30 @@ describe('Synchronizer', function() {
|
||||
}));
|
||||
|
||||
it('should delete local notes', asyncTest(async () => {
|
||||
// For these tests we pass the context around for each user. This is to make sure that the "deletedItemsProcessed"
|
||||
// property of the basicDelta() function is cleared properly at the end of a sync operation. If it is not cleared
|
||||
// it means items will no longer be deleted locally via sync.
|
||||
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: "un", parent_id: folder1.id });
|
||||
await synchronizer().start();
|
||||
let note2 = await Note.save({ title: "deux", parent_id: folder1.id });
|
||||
let context1 = await synchronizer().start();
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await synchronizer().start();
|
||||
let context2 = await synchronizer().start();
|
||||
await Note.delete(note1.id);
|
||||
await synchronizer().start();
|
||||
context2 = await synchronizer().start({ context: context2 });
|
||||
|
||||
await switchClient(1);
|
||||
|
||||
await synchronizer().start();
|
||||
context1 = await synchronizer().start({ context: context1 });
|
||||
let items = await allItems();
|
||||
expect(items.length).toBe(1);
|
||||
expect(items.length).toBe(2);
|
||||
let deletedItems = await BaseItem.deletedItems(syncTargetId());
|
||||
expect(deletedItems.length).toBe(0);
|
||||
await Note.delete(note2.id);
|
||||
context1 = await synchronizer().start({ context: context1 });
|
||||
}));
|
||||
|
||||
it('should delete remote folder', asyncTest(async () => {
|
||||
@@ -332,22 +339,17 @@ describe('Synchronizer', function() {
|
||||
it('should delete local folder', asyncTest(async () => {
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let folder2 = await Folder.save({ title: "folder2" });
|
||||
await synchronizer().start();
|
||||
let context1 = await synchronizer().start();
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await synchronizer().start();
|
||||
|
||||
await sleep(0.1);
|
||||
|
||||
let context2 = await synchronizer().start();
|
||||
await Folder.delete(folder2.id);
|
||||
|
||||
await synchronizer().start();
|
||||
await synchronizer().start({ context: context2 });
|
||||
|
||||
await switchClient(1);
|
||||
|
||||
await synchronizer().start();
|
||||
|
||||
await synchronizer().start({ context: context1 });
|
||||
let items = await allItems();
|
||||
await localItemsSameAsRemote(items, expect);
|
||||
}));
|
||||
@@ -370,7 +372,7 @@ describe('Synchronizer', function() {
|
||||
expect(items.length).toBe(1);
|
||||
expect(items[0].title).toBe('note1');
|
||||
expect(items[0].is_conflict).toBe(1);
|
||||
}));
|
||||
}));
|
||||
|
||||
it('should resolve conflict if note has been deleted remotely and locally', asyncTest(async () => {
|
||||
let folder = await Folder.save({ title: "folder" });
|
||||
@@ -431,7 +433,7 @@ describe('Synchronizer', function() {
|
||||
|
||||
expect(items1.length).toBe(0);
|
||||
expect(items1.length).toBe(items2.length);
|
||||
}));
|
||||
}));
|
||||
|
||||
it('should handle conflict when remote note is deleted then local note is modified', asyncTest(async () => {
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
@@ -540,11 +542,11 @@ describe('Synchronizer', function() {
|
||||
let n1 = await Note.save({ title: "mynote" });
|
||||
let n2 = await Note.save({ title: "mynote2" });
|
||||
let tag = await Tag.save({ title: 'mytag' });
|
||||
await synchronizer().start();
|
||||
let context1 = await synchronizer().start();
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await synchronizer().start();
|
||||
let context2 = await synchronizer().start();
|
||||
if (withEncryption) {
|
||||
const masterKey_2 = await MasterKey.load(masterKey.id);
|
||||
await encryptionService().loadMasterKey(masterKey_2, '123456', true);
|
||||
@@ -558,21 +560,21 @@ describe('Synchronizer', function() {
|
||||
await Tag.addNote(remoteTag.id, n2.id);
|
||||
let noteIds = await Tag.noteIds(tag.id);
|
||||
expect(noteIds.length).toBe(2);
|
||||
await synchronizer().start();
|
||||
context2 = await synchronizer().start({ context: context2 });
|
||||
|
||||
await switchClient(1);
|
||||
|
||||
await synchronizer().start();
|
||||
context1 = await synchronizer().start({ context: context1 });
|
||||
let remoteNoteIds = await Tag.noteIds(tag.id);
|
||||
expect(remoteNoteIds.length).toBe(2);
|
||||
await Tag.removeNote(tag.id, n1.id);
|
||||
remoteNoteIds = await Tag.noteIds(tag.id);
|
||||
expect(remoteNoteIds.length).toBe(1);
|
||||
await synchronizer().start();
|
||||
context1 = await synchronizer().start({ context: context1 });
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await synchronizer().start();
|
||||
context2 = await synchronizer().start({ context: context2 });
|
||||
noteIds = await Tag.noteIds(tag.id);
|
||||
expect(noteIds.length).toBe(1);
|
||||
expect(remoteNoteIds[0]).toBe(noteIds[0]);
|
||||
@@ -876,6 +878,37 @@ describe('Synchronizer', function() {
|
||||
expect(fileContentEqual(resourcePath1, resourcePath1_2)).toBe(true);
|
||||
}));
|
||||
|
||||
it('should delete resources', asyncTest(async () => {
|
||||
while (insideBeforeEach) await time.msleep(500);
|
||||
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
|
||||
let resource1 = (await Resource.all())[0];
|
||||
let resourcePath1 = Resource.fullPath(resource1);
|
||||
await synchronizer().start();
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await synchronizer().start();
|
||||
let allResources = await Resource.all();
|
||||
expect(allResources.length).toBe(1);
|
||||
let all = await fileApi().list();
|
||||
expect(all.items.length).toBe(3);
|
||||
await Resource.delete(resource1.id);
|
||||
await synchronizer().start();
|
||||
all = await fileApi().list();
|
||||
expect(all.items.length).toBe(2);
|
||||
|
||||
await switchClient(1);
|
||||
|
||||
expect(await shim.fsDriver().exists(resourcePath1)).toBe(true);
|
||||
await synchronizer().start();
|
||||
allResources = await Resource.all();
|
||||
expect(allResources.length).toBe(0);
|
||||
expect(await shim.fsDriver().exists(resourcePath1)).toBe(false);
|
||||
}));
|
||||
|
||||
it('should encryt resources', asyncTest(async () => {
|
||||
Setting.setValue('encryption.enabled', true);
|
||||
const masterKey = await loadEncryptionMasterKey();
|
||||
@@ -999,4 +1032,29 @@ describe('Synchronizer', function() {
|
||||
await localItemsSameAsRemote(all, expect);
|
||||
}));
|
||||
|
||||
});
|
||||
it("should update remote items but not pull remote changes", asyncTest(async () => {
|
||||
let folder = await Folder.save({ title: "folder1" });
|
||||
let note = await Note.save({ title: "un", parent_id: folder.id });
|
||||
await synchronizer().start();
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await synchronizer().start();
|
||||
await Note.save({ title: "deux", parent_id: folder.id });
|
||||
await synchronizer().start();
|
||||
|
||||
await switchClient(1);
|
||||
|
||||
await Note.save({ title: "un UPDATE", id: note.id });
|
||||
await synchronizer().start({ syncSteps: ["update_remote"] });
|
||||
let all = await allItems();
|
||||
expect(all.length).toBe(2);
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await synchronizer().start();
|
||||
let note2 = await Note.load(note.id);
|
||||
expect(note2.title).toBe("un UPDATE");
|
||||
}));
|
||||
|
||||
});
|
||||
|
@@ -16,6 +16,8 @@ const { FileApi } = require('lib/file-api.js');
|
||||
const { FileApiDriverMemory } = require('lib/file-api-driver-memory.js');
|
||||
const { FileApiDriverLocal } = require('lib/file-api-driver-local.js');
|
||||
const { FileApiDriverWebDav } = require('lib/file-api-driver-webdav.js');
|
||||
const { FileApiDriverDropbox } = require('lib/file-api-driver-dropbox.js');
|
||||
const BaseService = require('lib/services/BaseService.js');
|
||||
const { FsDriverNode } = require('lib/fs-driver-node.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { shimInit } = require('lib/shim-init-node.js');
|
||||
@@ -24,9 +26,11 @@ const SyncTargetMemory = require('lib/SyncTargetMemory.js');
|
||||
const SyncTargetFilesystem = require('lib/SyncTargetFilesystem.js');
|
||||
const SyncTargetOneDrive = require('lib/SyncTargetOneDrive.js');
|
||||
const SyncTargetNextcloud = require('lib/SyncTargetNextcloud.js');
|
||||
const SyncTargetDropbox = require('lib/SyncTargetDropbox.js');
|
||||
const EncryptionService = require('lib/services/EncryptionService.js');
|
||||
const DecryptionWorker = require('lib/services/DecryptionWorker.js');
|
||||
const WebDavApi = require('lib/WebDavApi');
|
||||
const DropboxApi = require('lib/DropboxApi');
|
||||
|
||||
let databases_ = [];
|
||||
let synchronizers_ = [];
|
||||
@@ -50,10 +54,12 @@ SyncTargetRegistry.addClass(SyncTargetMemory);
|
||||
SyncTargetRegistry.addClass(SyncTargetFilesystem);
|
||||
SyncTargetRegistry.addClass(SyncTargetOneDrive);
|
||||
SyncTargetRegistry.addClass(SyncTargetNextcloud);
|
||||
SyncTargetRegistry.addClass(SyncTargetDropbox);
|
||||
|
||||
const syncTargetId_ = SyncTargetRegistry.nameToId('nextcloud');
|
||||
//const syncTargetId_ = SyncTargetRegistry.nameToId('memory');
|
||||
// const syncTargetId_ = SyncTargetRegistry.nameToId("nextcloud");
|
||||
const syncTargetId_ = SyncTargetRegistry.nameToId("memory");
|
||||
//const syncTargetId_ = SyncTargetRegistry.nameToId('filesystem');
|
||||
// const syncTargetId_ = SyncTargetRegistry.nameToId('dropbox');
|
||||
const syncDir = __dirname + '/../tests/sync';
|
||||
|
||||
const sleepTime = syncTargetId_ == SyncTargetRegistry.nameToId('filesystem') ? 1001 : 100;//400;
|
||||
@@ -63,7 +69,7 @@ console.info('Testing with sync target: ' + SyncTargetRegistry.idToName(syncTarg
|
||||
const logger = new Logger();
|
||||
logger.addTarget('console');
|
||||
logger.addTarget('file', { path: logDir + '/log.txt' });
|
||||
logger.setLevel(Logger.LEVEL_WARN); // Set to INFO to display sync process in console
|
||||
logger.setLevel(Logger.LEVEL_WARN); // Set to DEBUG to display sync process in console
|
||||
|
||||
BaseItem.loadClass('Note', Note);
|
||||
BaseItem.loadClass('Folder', Folder);
|
||||
@@ -75,6 +81,8 @@ BaseItem.loadClass('MasterKey', MasterKey);
|
||||
Setting.setConstant('appId', 'net.cozic.joplin-cli');
|
||||
Setting.setConstant('appType', 'cli');
|
||||
|
||||
BaseService.logger_ = logger;
|
||||
|
||||
Setting.autoSaveEnabled = false;
|
||||
|
||||
function syncTargetId() {
|
||||
@@ -118,8 +126,9 @@ async function clearDatabase(id = null) {
|
||||
'DELETE FROM tags',
|
||||
'DELETE FROM note_tags',
|
||||
'DELETE FROM master_keys',
|
||||
'DELETE FROM settings',
|
||||
|
||||
'DELETE FROM item_changes',
|
||||
'DELETE FROM note_resources',
|
||||
'DELETE FROM settings',
|
||||
'DELETE FROM deleted_items',
|
||||
'DELETE FROM sync_items',
|
||||
];
|
||||
@@ -243,25 +252,15 @@ function fileApi() {
|
||||
|
||||
const api = new WebDavApi(options);
|
||||
fileApi_ = new FileApi('', new FileApiDriverWebDav(api));
|
||||
} else if (syncTargetId_ == SyncTargetRegistry.nameToId('dropbox')) {
|
||||
const api = new DropboxApi();
|
||||
const authTokenPath = __dirname + '/support/dropbox-auth.txt';
|
||||
const authToken = fs.readFileSync(authTokenPath, 'utf8');
|
||||
if (!authToken) throw new Error('Dropbox auth token missing in ' + authTokenPath);
|
||||
api.setAuthToken(authToken);
|
||||
fileApi_ = new FileApi('', new FileApiDriverDropbox(api));
|
||||
}
|
||||
|
||||
// } else if (syncTargetId == Setting.SYNC_TARGET_ONEDRIVE) {
|
||||
// let auth = require('./onedrive-auth.json');
|
||||
// if (!auth) {
|
||||
// const oneDriveApiUtils = new OneDriveApiNodeUtils(oneDriveApi);
|
||||
// auth = await oneDriveApiUtils.oauthDance();
|
||||
// fs.writeFileSync('./onedrive-auth.json', JSON.stringify(auth));
|
||||
// process.exit(1);
|
||||
// } else {
|
||||
// auth = JSON.parse(auth);
|
||||
// }
|
||||
|
||||
// // const oneDriveApiUtils = new OneDriveApiNodeUtils(reg.oneDriveApi());
|
||||
// // const auth = await oneDriveApiUtils.oauthDance(this);
|
||||
// // Setting.setValue('sync.3.auth', auth ? JSON.stringify(auth) : null);
|
||||
// // if (!auth) return;
|
||||
// }
|
||||
|
||||
fileApi_.setLogger(logger);
|
||||
fileApi_.setSyncTargetId(syncTargetId_);
|
||||
fileApi_.requestRepeatCount_ = 0;
|
||||
@@ -302,8 +301,9 @@ function asyncTest(callback) {
|
||||
await callback();
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
} finally {
|
||||
done();
|
||||
}
|
||||
done();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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,17 +38,22 @@ 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,
|
||||
'y': windowState.y,
|
||||
'width': windowState.width,
|
||||
'height': windowState.height,
|
||||
x: windowState.x,
|
||||
y: windowState.y,
|
||||
width: windowState.width,
|
||||
height: windowState.height,
|
||||
};
|
||||
|
||||
// Linux icon workaround for bug https://github.com/electron-userland/electron-builder/issues/2098
|
||||
@@ -78,7 +84,7 @@ class ElectronAppWrapper {
|
||||
this.win_ = null;
|
||||
} else {
|
||||
event.preventDefault();
|
||||
this.win_.hide();
|
||||
this.hide();
|
||||
}
|
||||
} else {
|
||||
if (this.trayShown() && !this.willQuitApp_) {
|
||||
@@ -109,14 +115,24 @@ class ElectronAppWrapper {
|
||||
});
|
||||
}
|
||||
|
||||
async exit() {
|
||||
async quit() {
|
||||
this.electronApp_.quit();
|
||||
}
|
||||
|
||||
exit(errorCode = 0) {
|
||||
this.electronApp_.exit(errorCode);
|
||||
}
|
||||
|
||||
trayShown() {
|
||||
return !!this.tray_;
|
||||
}
|
||||
|
||||
// This method is used in macOS only to hide the whole app (and not just the main window)
|
||||
// including the menu bar. This follows the macOS way of hidding an app.
|
||||
hide() {
|
||||
this.electronApp_.hide();
|
||||
}
|
||||
|
||||
buildDir() {
|
||||
if (this.buildDir_) return this.buildDir_;
|
||||
let dir = __dirname + '/build';
|
||||
@@ -129,10 +145,24 @@ class ElectronAppWrapper {
|
||||
return dir;
|
||||
}
|
||||
|
||||
trayIconFilename_() {
|
||||
let output = '';
|
||||
|
||||
if (process.platform === 'darwin') {
|
||||
output = 'macos-16x16Template.png'; // Electron Template Image format
|
||||
} else {
|
||||
output = '16x16.png';
|
||||
}
|
||||
|
||||
if (this.env_ === 'dev') output = '16x16-dev.png'
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
// Note: this must be called only after the "ready" event of the app has been dispatched
|
||||
createTray(contextMenu) {
|
||||
try {
|
||||
this.tray_ = new Tray(this.buildDir() + '/icons/16x16.png')
|
||||
this.tray_ = new Tray(this.buildDir() + '/icons/' + this.trayIconFilename_())
|
||||
this.tray_.setToolTip(this.electronApp_.getName())
|
||||
this.tray_.setContextMenu(contextMenu)
|
||||
|
||||
@@ -150,11 +180,32 @@ class ElectronAppWrapper {
|
||||
this.tray_ = null;
|
||||
}
|
||||
|
||||
ensureSingleInstance() {
|
||||
if (this.env_ === 'dev') return false;
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const alreadyRunning = this.electronApp_.makeSingleInstance((commandLine, workingDirectory) => {
|
||||
const win = this.window();
|
||||
if (!win) return;
|
||||
if (win.isMinimized()) win.restore();
|
||||
win.show();
|
||||
win.focus();
|
||||
});
|
||||
|
||||
if (alreadyRunning) this.electronApp_.quit();
|
||||
|
||||
resolve(alreadyRunning);
|
||||
});
|
||||
}
|
||||
|
||||
async start() {
|
||||
// Since we are doing other async things before creating the window, we might miss
|
||||
// the "ready" event. So we use the function below to make sure that the app is ready.
|
||||
await this.waitForElectronAppReady();
|
||||
|
||||
const alreadyRunning = await this.ensureSingleInstance();
|
||||
if (alreadyRunning) return;
|
||||
|
||||
this.createWindow();
|
||||
|
||||
this.electronApp_.on('before-quit', () => {
|
||||
|
51
ElectronClient/app/InteropServiceHelper.js
Normal file
@@ -0,0 +1,51 @@
|
||||
const { _ } = require('lib/locale');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const InteropService = require('lib/services/InteropService');
|
||||
|
||||
class InteropServiceHelper {
|
||||
|
||||
static async export(dispatch, module, options = null) {
|
||||
if (!options) options = {};
|
||||
|
||||
let path = null;
|
||||
|
||||
if (module.target === 'file') {
|
||||
path = bridge().showSaveDialog({
|
||||
filters: [{ name: module.description, extensions: [module.fileExtension]}]
|
||||
});
|
||||
} else {
|
||||
path = bridge().showOpenDialog({
|
||||
properties: ['openDirectory', 'createDirectory'],
|
||||
});
|
||||
}
|
||||
|
||||
if (!path || (Array.isArray(path) && !path.length)) return;
|
||||
|
||||
if (Array.isArray(path)) path = path[0];
|
||||
|
||||
dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'showModalMessage',
|
||||
message: _('Exporting to "%s" as "%s" format. Please wait...', path, module.format),
|
||||
});
|
||||
|
||||
const exportOptions = {};
|
||||
exportOptions.path = path;
|
||||
exportOptions.format = module.format;
|
||||
if (options.sourceFolderIds) exportOptions.sourceFolderIds = options.sourceFolderIds;
|
||||
if (options.sourceNoteIds) exportOptions.sourceNoteIds = options.sourceNoteIds;
|
||||
|
||||
const service = new InteropService();
|
||||
const result = await service.export(exportOptions);
|
||||
|
||||
console.info('Export result: ', result);
|
||||
|
||||
dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'hideModalMessage',
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = InteropServiceHelper;
|
@@ -20,6 +20,9 @@ const packageInfo = require('./packageInfo.js');
|
||||
const AlarmService = require('lib/services/AlarmService.js');
|
||||
const AlarmServiceDriverNode = require('lib/services/AlarmServiceDriverNode');
|
||||
const DecryptionWorker = require('lib/services/DecryptionWorker');
|
||||
const InteropService = require('lib/services/InteropService');
|
||||
const InteropServiceHelper = require('./InteropServiceHelper.js');
|
||||
const ResourceService = require('lib/services/ResourceService');
|
||||
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const Menu = bridge().Menu;
|
||||
@@ -35,6 +38,7 @@ const appDefaultState = Object.assign({}, defaultState, {
|
||||
fileToImport: null,
|
||||
windowCommand: null,
|
||||
noteVisiblePanes: ['editor', 'viewer'],
|
||||
sidebarVisibility: true,
|
||||
windowContentSize: bridge().windowContentSize(),
|
||||
});
|
||||
|
||||
@@ -82,7 +86,7 @@ class Application extends BaseApplication {
|
||||
|
||||
action = newAction;
|
||||
}
|
||||
|
||||
|
||||
if (!goingBack) newNavHistory.push(currentRoute);
|
||||
newState.navHistory = newNavHistory
|
||||
newState.route = action;
|
||||
@@ -120,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);
|
||||
@@ -144,8 +159,12 @@ class Application extends BaseApplication {
|
||||
this.updateTray();
|
||||
}
|
||||
|
||||
if (['NOTE_UPDATE_ONE', 'NOTE_DELETE', 'FOLDER_UPDATE_ONE', 'FOLDER_DELETE'].indexOf(action.type) >= 0) {
|
||||
if (!await reg.syncTarget().syncStarted()) reg.scheduleSync();
|
||||
if (action.type == 'SETTING_UPDATE_ONE' && action.key == 'style.editor.fontFamily' || action.type == 'SETTING_UPDATE_ALL') {
|
||||
this.updateEditorFont();
|
||||
}
|
||||
|
||||
if (["NOTE_UPDATE_ONE", "NOTE_DELETE", "FOLDER_UPDATE_ONE", "FOLDER_DELETE"].indexOf(action.type) >= 0) {
|
||||
if (!await reg.syncTarget().syncStarted()) reg.scheduleSync(5, { syncSteps: ["update_remote", "delete_remote"] });
|
||||
}
|
||||
|
||||
if (['EVENT_NOTE_ALARM_FIELD_CHANGE', 'NOTE_DELETE'].indexOf(action.type) >= 0) {
|
||||
@@ -163,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;
|
||||
}
|
||||
|
||||
@@ -175,6 +198,101 @@ class Application extends BaseApplication {
|
||||
updateMenu(screen) {
|
||||
if (this.lastMenuScreen_ === screen) return;
|
||||
|
||||
const sortNoteItems = [];
|
||||
const sortNoteOptions = Setting.enumOptions('notes.sortOrder.field');
|
||||
for (let field in sortNoteOptions) {
|
||||
if (!sortNoteOptions.hasOwnProperty(field)) continue;
|
||||
sortNoteItems.push({
|
||||
label: sortNoteOptions[field],
|
||||
screens: ['Main'],
|
||||
type: 'checkbox',
|
||||
checked: Setting.value('notes.sortOrder.field') === field,
|
||||
click: () => {
|
||||
Setting.setValue('notes.sortOrder.field', field);
|
||||
this.refreshMenu();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const importItems = [];
|
||||
const exportItems = [];
|
||||
const ioService = new InteropService();
|
||||
const ioModules = ioService.modules();
|
||||
for (let i = 0; i < ioModules.length; i++) {
|
||||
const module = ioModules[i];
|
||||
if (module.type === 'exporter') {
|
||||
exportItems.push({
|
||||
label: module.fullLabel(),
|
||||
screens: ['Main'],
|
||||
click: async () => {
|
||||
await InteropServiceHelper.export(this.dispatch.bind(this), module);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
for (let j = 0; j < module.sources.length; j++) {
|
||||
const moduleSource = module.sources[j];
|
||||
importItems.push({
|
||||
label: module.fullLabel(moduleSource),
|
||||
screens: ['Main'],
|
||||
click: async () => {
|
||||
let path = null;
|
||||
|
||||
const selectedFolderId = this.store().getState().selectedFolderId;
|
||||
|
||||
if (moduleSource === 'file') {
|
||||
path = bridge().showOpenDialog({
|
||||
filters: [{ name: module.description, extensions: [module.fileExtension]}]
|
||||
});
|
||||
} else {
|
||||
path = bridge().showOpenDialog({
|
||||
properties: ['openDirectory', 'createDirectory'],
|
||||
});
|
||||
}
|
||||
|
||||
if (!path || (Array.isArray(path) && !path.length)) return;
|
||||
|
||||
if (Array.isArray(path)) path = path[0];
|
||||
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'showModalMessage',
|
||||
message: _('Importing from "%s" as "%s" format. Please wait...', path, module.format),
|
||||
});
|
||||
|
||||
const importOptions = {};
|
||||
importOptions.path = path;
|
||||
importOptions.format = module.format;
|
||||
importOptions.destinationFolderId = !module.isNoteArchive && moduleSource === 'file' ? selectedFolderId : null;
|
||||
|
||||
const service = new InteropService();
|
||||
try {
|
||||
const result = await service.import(importOptions);
|
||||
console.info('Import result: ', result);
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
}
|
||||
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'hideModalMessage',
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exportItems.push({
|
||||
label: 'PDF - ' + _('PDF File'),
|
||||
screens: ['Main'],
|
||||
click: async () => {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'exportPdf',
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const template = [
|
||||
{
|
||||
label: _('File'),
|
||||
@@ -211,22 +329,21 @@ class Application extends BaseApplication {
|
||||
}, {
|
||||
type: 'separator',
|
||||
}, {
|
||||
label: _('Import Evernote notes'),
|
||||
label: _('Import'),
|
||||
submenu: importItems,
|
||||
}, {
|
||||
label: _('Export'),
|
||||
submenu: exportItems,
|
||||
}, {
|
||||
type: 'separator',
|
||||
}, {
|
||||
label: _('Print'),
|
||||
accelerator: 'CommandOrControl+P',
|
||||
screens: ['Main'],
|
||||
click: () => {
|
||||
const filePaths = bridge().showOpenDialog({
|
||||
properties: ['openFile', 'createDirectory'],
|
||||
filters: [
|
||||
{ name: _('Evernote Export Files'), extensions: ['enex'] },
|
||||
]
|
||||
});
|
||||
if (!filePaths || !filePaths.length) return;
|
||||
|
||||
this.dispatch({
|
||||
type: 'NAV_GO',
|
||||
routeName: 'Import',
|
||||
props: {
|
||||
filePath: filePaths[0],
|
||||
},
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'print',
|
||||
});
|
||||
}
|
||||
}, {
|
||||
@@ -236,29 +353,29 @@ class Application extends BaseApplication {
|
||||
label: _('Hide %s', 'Joplin'),
|
||||
platforms: ['darwin'],
|
||||
accelerator: 'CommandOrControl+H',
|
||||
click: () => { bridge().window().hide() }
|
||||
click: () => { bridge().electronApp().hide() }
|
||||
}, {
|
||||
type: 'separator',
|
||||
}, {
|
||||
label: _('Quit'),
|
||||
accelerator: 'CommandOrControl+Q',
|
||||
click: () => { bridge().electronApp().exit() }
|
||||
click: () => { bridge().electronApp().quit() }
|
||||
}]
|
||||
}, {
|
||||
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',
|
||||
}, {
|
||||
@@ -267,17 +384,27 @@ class Application extends BaseApplication {
|
||||
}, {
|
||||
label: _('Search in all the notes'),
|
||||
screens: ['Main'],
|
||||
accelerator: 'F6',
|
||||
accelerator: 'CommandOrControl+F',
|
||||
click: () => {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'search',
|
||||
name: 'focus_search',
|
||||
});
|
||||
},
|
||||
}],
|
||||
}, {
|
||||
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',
|
||||
@@ -287,6 +414,29 @@ class Application extends BaseApplication {
|
||||
name: 'toggleVisiblePanes',
|
||||
});
|
||||
}
|
||||
}, {
|
||||
type: 'separator',
|
||||
screens: ['Main'],
|
||||
}, {
|
||||
label: Setting.settingMetadata('notes.sortOrder.field').label(),
|
||||
screens: ['Main'],
|
||||
submenu: sortNoteItems,
|
||||
}, {
|
||||
label: Setting.settingMetadata('notes.sortOrder.reverse').label(),
|
||||
type: 'checkbox',
|
||||
checked: Setting.value('notes.sortOrder.reverse'),
|
||||
screens: ['Main'],
|
||||
click: () => {
|
||||
Setting.setValue('notes.sortOrder.reverse', !Setting.value('notes.sortOrder.reverse'));
|
||||
},
|
||||
}, {
|
||||
label: Setting.settingMetadata('uncompletedTodosOnTop').label(),
|
||||
type: 'checkbox',
|
||||
checked: Setting.value('uncompletedTodosOnTop'),
|
||||
screens: ['Main'],
|
||||
click: () => {
|
||||
Setting.setValue('uncompletedTodosOnTop', !Setting.value('uncompletedTodosOnTop'));
|
||||
},
|
||||
}],
|
||||
}, {
|
||||
label: _('Tools'),
|
||||
@@ -324,12 +474,18 @@ class Application extends BaseApplication {
|
||||
submenu: [{
|
||||
label: _('Website and documentation'),
|
||||
accelerator: 'F1',
|
||||
click () { bridge().openExternal('http://joplin.cozic.net') }
|
||||
click () { bridge().openExternal('https://joplin.cozic.net') }
|
||||
}, {
|
||||
label: _('Make a donation'),
|
||||
click () { bridge().openExternal('https://joplin.cozic.net/donate') }
|
||||
}, {
|
||||
label: _('Check for updates...'),
|
||||
click: () => {
|
||||
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath());
|
||||
}
|
||||
}, {
|
||||
type: 'separator',
|
||||
screens: ['Main'],
|
||||
}, {
|
||||
label: _('About Joplin'),
|
||||
click: () => {
|
||||
@@ -340,8 +496,8 @@ class Application extends BaseApplication {
|
||||
'Copyright © 2016-2018 Laurent Cozic',
|
||||
_('%s %s (%s, %s)', p.name, p.version, Setting.value('env'), process.platform),
|
||||
];
|
||||
bridge().showMessageBox({
|
||||
message: message.join('\n'),
|
||||
bridge().showInfoMessageBox(message.join('\n'), {
|
||||
icon: bridge().electronApp().buildDir() + '/icons/32x32.png',
|
||||
});
|
||||
}
|
||||
}]
|
||||
@@ -380,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;
|
||||
@@ -395,13 +546,34 @@ class Application extends BaseApplication {
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{ label: _('Open %s', app.electronApp().getName()), click: () => { app.window().show(); } },
|
||||
{ type: 'separator' },
|
||||
{ label: _('Exit'), click: () => { app.exit() } },
|
||||
{ label: _('Exit'), click: () => { app.quit() } },
|
||||
])
|
||||
app.createTray(contextMenu);
|
||||
}
|
||||
}
|
||||
|
||||
updateEditorFont() {
|
||||
const fontFamilies = [];
|
||||
if (Setting.value('style.editor.fontFamily')) fontFamilies.push('"' + Setting.value('style.editor.fontFamily') + '"');
|
||||
fontFamilies.push('monospace');
|
||||
|
||||
// The '*' and '!important' parts are necessary to make sure Russian text is displayed properly
|
||||
// https://github.com/laurent22/joplin/issues/155
|
||||
|
||||
const css = '.ace_editor * { font-family: ' + fontFamilies.join(', ') + ' !important; }';
|
||||
const styleTag = document.createElement('style');
|
||||
styleTag.type = 'text/css';
|
||||
styleTag.appendChild(document.createTextNode(css));
|
||||
document.head.appendChild(styleTag);
|
||||
}
|
||||
|
||||
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 }));
|
||||
@@ -451,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
|
||||
@@ -464,6 +636,8 @@ class Application extends BaseApplication {
|
||||
AlarmService.garbageCollect();
|
||||
}, 1000 * 60 * 60);
|
||||
|
||||
ResourceService.runInBackground();
|
||||
|
||||
if (Setting.value('env') === 'dev') {
|
||||
AlarmService.updateAllNotifications();
|
||||
} else {
|
||||
@@ -486,4 +660,4 @@ function app() {
|
||||
return application_;
|
||||
}
|
||||
|
||||
module.exports = { app };
|
||||
module.exports = { app };
|
||||
|
@@ -62,20 +62,23 @@ class Bridge {
|
||||
return filePaths;
|
||||
}
|
||||
|
||||
showMessageBox(window, options) {
|
||||
// Don't use this directly - call one of the showXxxxxxxMessageBox() instead
|
||||
showMessageBox_(window, options) {
|
||||
const {dialog} = require('electron');
|
||||
const nativeImage = require('electron').nativeImage
|
||||
if (!window) window = this.window();
|
||||
return dialog.showMessageBox(window, options);
|
||||
}
|
||||
|
||||
showErrorMessageBox(message) {
|
||||
return this.showMessageBox(this.window(), {
|
||||
return this.showMessageBox_(this.window(), {
|
||||
type: 'error',
|
||||
message: message,
|
||||
});
|
||||
}
|
||||
|
||||
showConfirmMessageBox(message) {
|
||||
const result = this.showMessageBox(this.window(), {
|
||||
const result = this.showMessageBox_(this.window(), {
|
||||
type: 'question',
|
||||
message: message,
|
||||
buttons: [_('OK'), _('Cancel')],
|
||||
@@ -83,12 +86,12 @@ class Bridge {
|
||||
return result === 0;
|
||||
}
|
||||
|
||||
showInfoMessageBox(message) {
|
||||
const result = this.showMessageBox(this.window(), {
|
||||
showInfoMessageBox(message, options = {}) {
|
||||
const result = this.showMessageBox_(this.window(), Object.assign({}, {
|
||||
type: 'info',
|
||||
message: message,
|
||||
buttons: [_('OK')],
|
||||
});
|
||||
}, options));
|
||||
return result === 0;
|
||||
}
|
||||
|
||||
@@ -108,23 +111,6 @@ class Bridge {
|
||||
return require('electron').shell.openItem(fullPath)
|
||||
}
|
||||
|
||||
// async checkForUpdatesAndNotify(logFilePath) {
|
||||
// if (!this.autoUpdater_) {
|
||||
// this.autoUpdateLogger_ = new Logger();
|
||||
// this.autoUpdateLogger_.addTarget('file', { path: logFilePath });
|
||||
// this.autoUpdateLogger_.setLevel(Logger.LEVEL_DEBUG);
|
||||
// this.autoUpdateLogger_.info('checkForUpdatesAndNotify: Initializing...');
|
||||
// this.autoUpdater_ = require("electron-updater").autoUpdater;
|
||||
// this.autoUpdater_.logger = this.autoUpdateLogger_;
|
||||
// }
|
||||
|
||||
// try {
|
||||
// await this.autoUpdater_.checkForUpdatesAndNotify();
|
||||
// } catch (error) {
|
||||
// this.autoUpdateLogger_.error(error);
|
||||
// }
|
||||
// }
|
||||
|
||||
checkForUpdates(inBackground, window, logFilePath) {
|
||||
const { checkForUpdates } = require('./checkForUpdates.js');
|
||||
checkForUpdates(inBackground, window, logFilePath);
|
||||
|
BIN
ElectronClient/app/build/icons/16x16-dev.png
Normal file
After Width: | Height: | Size: 611 B |
BIN
ElectronClient/app/build/icons/16x16@2x.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
ElectronClient/app/build/icons/16x16@3x.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
ElectronClient/app/build/icons/32x32@3.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
ElectronClient/app/build/icons/macos-16x16Template.png
Normal file
After Width: | Height: | Size: 348 B |
BIN
ElectronClient/app/build/icons/macos-16x16Template@2x.png
Normal file
After Width: | Height: | Size: 504 B |
@@ -1,31 +1,15 @@
|
||||
const { dialog } = require('electron')
|
||||
const { autoUpdater } = require('electron-updater')
|
||||
const { Logger } = require('lib/logger.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const fetch = require('node-fetch');
|
||||
const packageInfo = require('./packageInfo.js');
|
||||
const compareVersions = require('compare-versions');
|
||||
|
||||
let autoUpdateLogger_ = new Logger();
|
||||
let checkInBackground_ = false;
|
||||
let isCheckingForUpdate_ = false;
|
||||
let parentWindow_ = null;
|
||||
|
||||
// Note: Electron Builder's autoUpdater is incredibly buggy so currently it's only used
|
||||
// to detect if a new version is present. If it is, the download link is simply opened
|
||||
// in a new browser window.
|
||||
autoUpdater.autoDownload = false;
|
||||
|
||||
function htmlToText_(html) {
|
||||
let output = html.replace(/\n/g, '');
|
||||
output = output.replace(/<li>/g, '- ');
|
||||
output = output.replace(/<p>/g, '');
|
||||
output = output.replace(/<\/p>/g, '\n');
|
||||
output = output.replace(/<\/li>/g, '\n');
|
||||
output = output.replace(/<ul>/g, '');
|
||||
output = output.replace(/<\/ul>/g, '');
|
||||
output = output.replace(/<.*?>/g, '');
|
||||
output = output.replace(/<\/.*?>/g, '');
|
||||
return output;
|
||||
}
|
||||
|
||||
function showErrorMessageBox(message) {
|
||||
return dialog.showMessageBox(parentWindow_, {
|
||||
type: 'error',
|
||||
@@ -43,75 +27,45 @@ function onCheckEnded() {
|
||||
isCheckingForUpdate_ = false;
|
||||
}
|
||||
|
||||
autoUpdater.on('error', (error) => {
|
||||
autoUpdateLogger_.error(error);
|
||||
if (checkInBackground_) return onCheckEnded();
|
||||
showErrorMessageBox(error == null ? "unknown" : (error.stack || error).toString())
|
||||
onCheckEnded();
|
||||
})
|
||||
async function fetchLatestRelease() {
|
||||
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
|
||||
|
||||
function findDownloadFilename_(info) {
|
||||
// { version: '1.0.64',
|
||||
// files:
|
||||
// [ { url: 'Joplin-1.0.64-mac.zip',
|
||||
// sha512: 'OlemXqhq/fSifx7EutvMzfoCI/1kGNl10i8nkvACEDfVXwP8hankDBXEC0+GxSArsZuxOh3U1+C+4j72SfIUew==' },
|
||||
// { url: 'Joplin-1.0.64.dmg',
|
||||
// sha512: 'jAewQQoJ3nCaOj8hWDgf0sc3LBbAWQtiKqfTflK8Hc3Dh7fAy9jRHfFAZKFUZ9ll95Bun0DVsLq8wLSUrdsMXw==',
|
||||
// size: 77104485 } ],
|
||||
// path: 'Joplin-1.0.64-mac.zip',
|
||||
// sha512: 'OlemXqhq/fSifx7EutvMzfoCI/1kGNl10i8nkvACEDfVXwP8hankDBXEC0+GxSArsZuxOh3U1+C+4j72SfIUew==',
|
||||
// releaseDate: '2018-02-16T00:13:01.634Z',
|
||||
// releaseName: 'v1.0.64',
|
||||
// releaseNotes: '<p>Still more fixes and im...' }
|
||||
|
||||
if (!info) return null;
|
||||
|
||||
if (!info.files) {
|
||||
// info.path seems to contain a default, though not a good one,
|
||||
// so the loop below if preferable to find the right file.
|
||||
return info.path;
|
||||
if (!response.ok) {
|
||||
const responseText = await response.text();
|
||||
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
}
|
||||
|
||||
for (let i = 0; i < info.files.length; i++) {
|
||||
const f = info.files[i].url; // Annoyingly this is called "url" but it's obviously not a url, so hopefully it won't change later on and become one.
|
||||
if (f.indexOf('.exe') >= 0) return f;
|
||||
if (f.indexOf('.dmg') >= 0) return f;
|
||||
const json = await response.json();
|
||||
|
||||
const version = json.tag_name.substr(1);
|
||||
let downloadUrl = null;
|
||||
const platform = process.platform;
|
||||
for (let i = 0; i < json.assets.length; i++) {
|
||||
const asset = json.assets[i];
|
||||
let found = false;
|
||||
if (platform === 'win32' && asset.name.indexOf('.exe') >= 0) {
|
||||
found = true;
|
||||
} else if (platform === 'darwin' && asset.name.indexOf('.dmg') >= 0) {
|
||||
found = true;
|
||||
} else if (platform === 'linux' && asset.name.indexOf('.AppImage') >= 0) {
|
||||
found = true;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
downloadUrl = asset.browser_download_url;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return info.path;
|
||||
if (!downloadUrl) throw new Error('Cannot find download Url: ' + JSON.stringify(json).substr(0,500));
|
||||
|
||||
return {
|
||||
version: version,
|
||||
downloadUrl: downloadUrl,
|
||||
notes: json.body,
|
||||
};
|
||||
}
|
||||
|
||||
autoUpdater.on('update-available', (info) => {
|
||||
const filename = findDownloadFilename_(info);
|
||||
|
||||
if (!info.version || !filename) {
|
||||
if (checkInBackground_) return onCheckEnded();
|
||||
showErrorMessageBox(('Could not get version info: ' + JSON.stringify(info)));
|
||||
return onCheckEnded();
|
||||
}
|
||||
|
||||
const downloadUrl = 'https://github.com/laurent22/joplin/releases/download/v' + info.version + '/' + filename;
|
||||
|
||||
let releaseNotes = info.releaseNotes + '';
|
||||
if (releaseNotes) releaseNotes = '\n\n' + _('Release notes:\n\n%s', htmlToText_(releaseNotes));
|
||||
|
||||
const buttonIndex = dialog.showMessageBox(parentWindow_, {
|
||||
type: 'info',
|
||||
message: _('An update is available, do you want to download it now?' + releaseNotes),
|
||||
buttons: [_('Yes'), _('No')]
|
||||
});
|
||||
|
||||
onCheckEnded();
|
||||
|
||||
if (buttonIndex === 0) require('electron').shell.openExternal(downloadUrl);
|
||||
})
|
||||
|
||||
autoUpdater.on('update-not-available', () => {
|
||||
if (checkInBackground_) return onCheckEnded();
|
||||
dialog.showMessageBox({ message: _('Current version is up-to-date.') })
|
||||
onCheckEnded();
|
||||
})
|
||||
|
||||
function checkForUpdates(inBackground, window, logFilePath) {
|
||||
if (isCheckingForUpdate_) {
|
||||
autoUpdateLogger_.info('checkForUpdates: Skipping check because it is already running');
|
||||
@@ -127,18 +81,30 @@ function checkForUpdates(inBackground, window, logFilePath) {
|
||||
autoUpdateLogger_.addTarget('file', { path: logFilePath });
|
||||
autoUpdateLogger_.setLevel(Logger.LEVEL_DEBUG);
|
||||
autoUpdateLogger_.info('checkForUpdates: Initializing...');
|
||||
autoUpdater.logger = autoUpdateLogger_;
|
||||
}
|
||||
|
||||
checkInBackground_ = inBackground;
|
||||
|
||||
try {
|
||||
autoUpdater.checkForUpdates()
|
||||
} catch (error) {
|
||||
fetchLatestRelease().then(release => {
|
||||
if (compareVersions(release.version, packageInfo.version) <= 0) {
|
||||
if (!checkInBackground_) dialog.showMessageBox({ message: _('Current version is up-to-date.') })
|
||||
} else {
|
||||
const releaseNotes = release.notes.trim() ? "\n\n" + release.notes.trim() : '';
|
||||
|
||||
const buttonIndex = dialog.showMessageBox(parentWindow_, {
|
||||
type: 'info',
|
||||
message: _('An update is available, do you want to download it now?' + releaseNotes),
|
||||
buttons: [_('Yes'), _('No')]
|
||||
});
|
||||
|
||||
if (buttonIndex === 0) require('electron').shell.openExternal(release.downloadUrl);
|
||||
}
|
||||
}).catch(error => {
|
||||
autoUpdateLogger_.error(error);
|
||||
if (!checkInBackground_) showErrorMessageBox(error.message);
|
||||
}).then(() => {
|
||||
onCheckEnded();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports.checkForUpdates = checkForUpdates
|
@@ -40,10 +40,6 @@ class ConfigScreenComponent extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
output.sort((a, b) => {
|
||||
return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : +1;
|
||||
});
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
@@ -63,6 +59,12 @@ class ConfigScreenComponent extends React.Component {
|
||||
display: 'inline-block',
|
||||
};
|
||||
|
||||
const descriptionStyle = Object.assign({}, theme.textStyle, {
|
||||
color: theme.colorFaded,
|
||||
marginTop: 5,
|
||||
fontStyle: 'italic',
|
||||
});
|
||||
|
||||
const updateSettingValue = (key, value) => {
|
||||
return shared.updateSettingValue(this, key, value);
|
||||
}
|
||||
@@ -71,6 +73,13 @@ class ConfigScreenComponent extends React.Component {
|
||||
|
||||
const md = Setting.settingMetadata(key);
|
||||
|
||||
const descriptionText = Setting.keyDescription(key, 'desktop');
|
||||
const descriptionComp = descriptionText ? (
|
||||
<div style={descriptionStyle}>
|
||||
{descriptionText}
|
||||
</div>
|
||||
) : null;
|
||||
|
||||
if (md.isEnum) {
|
||||
let items = [];
|
||||
const settingOptions = md.options();
|
||||
@@ -86,6 +95,7 @@ class ConfigScreenComponent extends React.Component {
|
||||
<select value={value} style={controlStyle} onChange={(event) => { updateSettingValue(key, event.target.value) }}>
|
||||
{items}
|
||||
</select>
|
||||
{ descriptionComp }
|
||||
</div>
|
||||
);
|
||||
} else if (md.type === Setting.TYPE_BOOL) {
|
||||
@@ -100,6 +110,7 @@ class ConfigScreenComponent extends React.Component {
|
||||
<div key={key+value.toString()} style={rowStyle}>
|
||||
<div style={controlStyle}>
|
||||
<input id={'setting_checkbox_' + key} type="checkbox" checked={!!value} onChange={(event) => { onCheckboxClick(event) }}/><label onClick={(event) => { onCheckboxClick(event) }} style={labelStyle} htmlFor={'setting_checkbox_' + key}>{md.label()}</label>
|
||||
{ descriptionComp }
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
@@ -115,6 +126,7 @@ class ConfigScreenComponent extends React.Component {
|
||||
<div key={key} style={rowStyle}>
|
||||
<div style={labelStyle}><label>{md.label()}</label></div>
|
||||
<input type={inputType} style={inputStyle} value={this.state.settings[key]} onChange={(event) => {onTextChange(event)}} />
|
||||
{ descriptionComp }
|
||||
</div>
|
||||
);
|
||||
} else if (md.type === Setting.TYPE_INT) {
|
||||
@@ -126,6 +138,7 @@ class ConfigScreenComponent extends React.Component {
|
||||
<div key={key} style={rowStyle}>
|
||||
<div style={labelStyle}><label>{md.label()}</label></div>
|
||||
<input type="number" style={controlStyle} value={this.state.settings[key]} onChange={(event) => {onNumChange(event)}} min={md.minimum} max={md.maximum} step={md.step}/>
|
||||
{ descriptionComp }
|
||||
</div>
|
||||
);
|
||||
} else {
|
||||
|
62
ElectronClient/app/gui/DropboxLoginScreen.jsx
Normal file
@@ -0,0 +1,62 @@
|
||||
const React = require('react');
|
||||
const { connect } = require('react-redux');
|
||||
const { reg } = require('lib/registry.js');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const { Header } = require('./Header.min.js');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const Shared = require('lib/components/shared/dropbox-login-shared');
|
||||
|
||||
class DropboxLoginScreenComponent extends React.Component {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.shared_ = new Shared(
|
||||
this,
|
||||
(msg) => bridge().showInfoMessageBox(msg),
|
||||
(msg) => bridge().showErrorMessageBox(msg)
|
||||
);
|
||||
}
|
||||
|
||||
componentWillMount() {
|
||||
this.shared_.refreshUrl();
|
||||
}
|
||||
|
||||
render() {
|
||||
const style = this.props.style;
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
const headerStyle = {
|
||||
width: style.width,
|
||||
};
|
||||
|
||||
const inputStyle = Object.assign({}, theme.inputStyle, { width: 500 });
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Header style={headerStyle} />
|
||||
<div style={{padding: theme.margin}}>
|
||||
<p style={theme.textStyle}>{_('To allow Joplin to synchronise with Dropbox, please follow the steps below:')}</p>
|
||||
<p style={theme.textStyle}>{_('Step 1: Open this URL in your browser to authorise the application:')}</p>
|
||||
<a style={theme.textStyle} href="#" onClick={this.shared_.loginUrl_click}>{this.state.loginUrl}</a>
|
||||
<p style={theme.textStyle}>{_('Step 2: Enter the code provided by Dropbox:')}</p>
|
||||
<p><input type="text" value={this.state.authCode} onChange={this.shared_.authCodeInput_change} style={inputStyle}/></p>
|
||||
<button disabled={this.state.checkingAuthToken} onClick={this.shared_.submit_click}>{_('Submit')}</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
return {
|
||||
theme: state.settings.theme,
|
||||
};
|
||||
};
|
||||
|
||||
const DropboxLoginScreen = connect(mapStateToProps)(DropboxLoginScreenComponent);
|
||||
|
||||
module.exports = { DropboxLoginScreen };
|
@@ -182,17 +182,11 @@ class EncryptionConfigScreenComponent extends React.Component {
|
||||
<div>
|
||||
<Header style={headerStyle} />
|
||||
<div style={containerStyle}>
|
||||
{/*<div style={{backgroundColor: theme.warningBackgroundColor, paddingLeft: 10, paddingRight: 10, paddingTop: 2, paddingBottom: 2 }}>
|
||||
{<div style={{backgroundColor: theme.warningBackgroundColor, paddingLeft: 10, paddingRight: 10, paddingTop: 2, paddingBottom: 2 }}>
|
||||
<p style={theme.textStyle}>
|
||||
Important: This is a <b>beta</b> feature. It has been extensively tested and is already in use by some users, but it is possible that some bugs remain.
|
||||
<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>
|
||||
<p style={theme.textStyle}>
|
||||
If you wish to you use it, it is recommended that you keep a backup of your data. The simplest way is to regularly backup <b>{pathUtils.toSystemSlashes(Setting.value('profileDir'), process.platform)}</b>
|
||||
</p>
|
||||
<p style={theme.textStyle}>
|
||||
For more information about End-To-End Encryption (E2EE) and how it is going to work, please check the documentation: <a onClick={() => {bridge().openExternal('http://joplin.cozic.net/help/e2ee.html')}} href="#">http://joplin.cozic.net/help/e2ee.html</a>
|
||||
</p>
|
||||
</div>*/}
|
||||
</div>}
|
||||
<h1 style={theme.h1Style}>{_('Status')}</h1>
|
||||
<p style={theme.textStyle}>{_('Encryption is:')} <strong>{this.props.encryptionEnabled ? _('Enabled') : _('Disabled')}</strong></p>
|
||||
{decryptedItemsInfo}
|
||||
|
@@ -6,6 +6,63 @@ const { _ } = require('lib/locale.js');
|
||||
|
||||
class HeaderComponent extends React.Component {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.state = {
|
||||
searchQuery: '',
|
||||
};
|
||||
|
||||
this.scheduleSearchChangeEventIid_ = null;
|
||||
this.searchOnQuery_ = null;
|
||||
this.searchElement_ = null;
|
||||
|
||||
const triggerOnQuery = (query) => {
|
||||
clearTimeout(this.scheduleSearchChangeEventIid_);
|
||||
if (this.searchOnQuery_) this.searchOnQuery_(query);
|
||||
this.scheduleSearchChangeEventIid_ = null;
|
||||
}
|
||||
|
||||
this.search_onChange = (event) => {
|
||||
this.setState({ searchQuery: event.target.value });
|
||||
|
||||
if (this.scheduleSearchChangeEventIid_) clearTimeout(this.scheduleSearchChangeEventIid_);
|
||||
|
||||
this.scheduleSearchChangeEventIid_ = setTimeout(() => {
|
||||
triggerOnQuery(this.state.searchQuery);
|
||||
}, 500);
|
||||
};
|
||||
|
||||
this.search_onClear = (event) => {
|
||||
this.setState({ searchQuery: '' });
|
||||
triggerOnQuery('');
|
||||
}
|
||||
}
|
||||
|
||||
async componentWillReceiveProps(nextProps) {
|
||||
if (nextProps.windowCommand) {
|
||||
this.doCommand(nextProps.windowCommand);
|
||||
}
|
||||
}
|
||||
|
||||
async doCommand(command) {
|
||||
if (!command) return;
|
||||
|
||||
let commandProcessed = true;
|
||||
|
||||
if (command.name === 'focus_search' && this.searchElement_) {
|
||||
this.searchElement_.focus();
|
||||
} else {
|
||||
commandProcessed = false;
|
||||
}
|
||||
|
||||
if (commandProcessed) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
back_click() {
|
||||
this.props.dispatch({ type: 'NAV_BACK' });
|
||||
}
|
||||
@@ -15,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>
|
||||
}
|
||||
|
||||
@@ -40,6 +98,59 @@ class HeaderComponent extends React.Component {
|
||||
</a>
|
||||
}
|
||||
|
||||
makeSearch(key, style, options, state) {
|
||||
const inputStyle = {
|
||||
display: 'flex',
|
||||
flex: 1,
|
||||
paddingLeft: 4,
|
||||
paddingRight: 4,
|
||||
color: style.color,
|
||||
fontSize: style.fontSize,
|
||||
fontFamily: style.fontFamily,
|
||||
};
|
||||
|
||||
const searchButton = {
|
||||
paddingLeft: 4,
|
||||
paddingRight: 4,
|
||||
paddingTop: 2,
|
||||
paddingBottom: 2,
|
||||
textDecoration: 'none',
|
||||
};
|
||||
|
||||
const iconStyle = {
|
||||
display: 'flex',
|
||||
fontSize: Math.round(style.fontSize) * 1.2,
|
||||
color: style.color,
|
||||
};
|
||||
|
||||
const containerStyle = {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
};
|
||||
|
||||
const iconName = state.searchQuery ? 'fa-times' : 'fa-search';
|
||||
const icon = <i style={iconStyle} className={"fa " + iconName}></i>
|
||||
if (options.onQuery) this.searchOnQuery_ = options.onQuery;
|
||||
|
||||
return (
|
||||
<div key={key} style={containerStyle}>
|
||||
<input
|
||||
type="text"
|
||||
style={inputStyle}
|
||||
placeholder={options.title}
|
||||
value={state.searchQuery}
|
||||
onChange={this.search_onChange}
|
||||
ref={elem => this.searchElement_ = elem}
|
||||
/>
|
||||
<a
|
||||
href="#"
|
||||
style={searchButton}
|
||||
onClick={this.search_onClear}
|
||||
>{icon}</a>
|
||||
</div>);
|
||||
}
|
||||
|
||||
render() {
|
||||
const style = Object.assign({}, this.props.style);
|
||||
const theme = themeStyle(this.props.theme);
|
||||
@@ -50,9 +161,9 @@ class HeaderComponent extends React.Component {
|
||||
style.borderBottom = '1px solid ' + theme.dividerColor;
|
||||
style.boxSizing = 'border-box';
|
||||
|
||||
const buttons = [];
|
||||
const items = [];
|
||||
|
||||
const buttonStyle = {
|
||||
const itemStyle = {
|
||||
height: theme.headerHeight,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
@@ -67,19 +178,24 @@ class HeaderComponent extends React.Component {
|
||||
};
|
||||
|
||||
if (showBackButton) {
|
||||
buttons.push(this.makeButton('back', buttonStyle, { title: _('Back'), onClick: () => this.back_click(), iconName: 'fa-chevron-left ' }));
|
||||
items.push(this.makeButton('back', itemStyle, { title: _('Back'), onClick: () => this.back_click(), iconName: 'fa-chevron-left ' }));
|
||||
}
|
||||
|
||||
if (this.props.buttons) {
|
||||
for (let i = 0; i < this.props.buttons.length; i++) {
|
||||
const o = this.props.buttons[i];
|
||||
buttons.push(this.makeButton('btn_' + i + '_' + o.title, buttonStyle, o));
|
||||
if (this.props.items) {
|
||||
for (let i = 0; i < this.props.items.length; i++) {
|
||||
const item = this.props.items[i];
|
||||
|
||||
if (item.type === 'search') {
|
||||
items.push(this.makeSearch('item_' + i + '_search', itemStyle, item, this.state));
|
||||
} else {
|
||||
items.push(this.makeButton('item_' + i + '_' + item.title, itemStyle, item));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="header" style={style}>
|
||||
{ buttons }
|
||||
{ items }
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -87,7 +203,10 @@ class HeaderComponent extends React.Component {
|
||||
}
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
return { theme: state.settings.theme };
|
||||
return {
|
||||
theme: state.settings.theme,
|
||||
windowCommand: state.windowCommand,
|
||||
};
|
||||
};
|
||||
|
||||
const Header = connect(mapStateToProps)(HeaderComponent);
|
||||
|
@@ -22,6 +22,10 @@ class MainScreenComponent extends React.Component {
|
||||
componentWillMount() {
|
||||
this.setState({
|
||||
promptOptions: null,
|
||||
modalLayer: {
|
||||
visible: false,
|
||||
message: '',
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -37,6 +41,12 @@ class MainScreenComponent extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
toggleSidebar() {
|
||||
this.props.dispatch({
|
||||
type: 'SIDEBAR_VISIBILITY_TOGGLE',
|
||||
});
|
||||
}
|
||||
|
||||
async doCommand(command) {
|
||||
if (!command) return;
|
||||
|
||||
@@ -79,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);
|
||||
}
|
||||
@@ -136,35 +146,35 @@ class MainScreenComponent extends React.Component {
|
||||
},
|
||||
});
|
||||
} else if (command.name === 'search') {
|
||||
this.setState({
|
||||
promptOptions: {
|
||||
label: _('Search:'),
|
||||
onClose: async (answer) => {
|
||||
if (answer !== null) {
|
||||
const searchId = uuid.create();
|
||||
|
||||
this.props.dispatch({
|
||||
type: 'SEARCH_ADD',
|
||||
search: {
|
||||
id: searchId,
|
||||
title: answer,
|
||||
query_pattern: answer,
|
||||
query_folder_id: null,
|
||||
type_: BaseModel.TYPE_SEARCH,
|
||||
},
|
||||
});
|
||||
if (!this.searchId_) this.searchId_ = uuid.create();
|
||||
|
||||
this.props.dispatch({
|
||||
type: 'SEARCH_SELECT',
|
||||
id: searchId,
|
||||
});
|
||||
}
|
||||
this.setState({ promptOptions: null });
|
||||
}
|
||||
this.props.dispatch({
|
||||
type: 'SEARCH_UPDATE',
|
||||
search: {
|
||||
id: this.searchId_,
|
||||
title: command.query,
|
||||
query_pattern: command.query,
|
||||
query_folder_id: null,
|
||||
type_: BaseModel.TYPE_SEARCH,
|
||||
},
|
||||
});
|
||||
|
||||
if (command.query) {
|
||||
this.props.dispatch({
|
||||
type: 'SEARCH_SELECT',
|
||||
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') {
|
||||
this.setState({ modalLayer: { visible: false, message: '' } });
|
||||
} else if (command.name === 'editAlarm') {
|
||||
const note = await Note.load(command.noteId);
|
||||
|
||||
@@ -201,7 +211,7 @@ class MainScreenComponent extends React.Component {
|
||||
this.setState({ promptOptions: null });
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
} else {
|
||||
commandProcessed = false;
|
||||
}
|
||||
@@ -214,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);
|
||||
@@ -244,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)),
|
||||
@@ -265,6 +280,17 @@ class MainScreenComponent extends React.Component {
|
||||
height: height,
|
||||
};
|
||||
|
||||
this.styles_.modalLayer = Object.assign({}, theme.textStyle, {
|
||||
zIndex: 10000,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: 0,
|
||||
backgroundColor: theme.backgroundColor,
|
||||
width: width - 20,
|
||||
height: height - 20,
|
||||
padding: 10,
|
||||
});
|
||||
|
||||
return this.styles_;
|
||||
}
|
||||
|
||||
@@ -274,46 +300,55 @@ 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 headerButtons = [];
|
||||
const headerItems = [];
|
||||
|
||||
headerButtons.push({
|
||||
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' }) },
|
||||
});
|
||||
|
||||
headerButtons.push({
|
||||
|
||||
headerItems.push({
|
||||
title: _('New to-do'),
|
||||
iconName: 'fa-check-square-o',
|
||||
enabled: !!folders.length && !onConflictFolder,
|
||||
onClick: () => { this.doCommand({ name: 'newTodo' }) },
|
||||
});
|
||||
|
||||
headerButtons.push({
|
||||
headerItems.push({
|
||||
title: _('New notebook'),
|
||||
iconName: 'fa-folder-o',
|
||||
onClick: () => { this.doCommand({ name: 'newNotebook' }) },
|
||||
});
|
||||
|
||||
headerButtons.push({
|
||||
title: _('Search'),
|
||||
iconName: 'fa-search',
|
||||
onClick: () => { this.doCommand({ name: 'search' }) },
|
||||
});
|
||||
|
||||
headerButtons.push({
|
||||
headerItems.push({
|
||||
title: _('Layout'),
|
||||
iconName: 'fa-columns',
|
||||
enabled: !!notes.length,
|
||||
onClick: () => { this.doCommand({ name: 'toggleVisiblePanes' }) },
|
||||
});
|
||||
|
||||
headerItems.push({
|
||||
title: _('Search...'),
|
||||
iconName: 'fa-search',
|
||||
onQuery: (query) => { this.doCommand({ name: 'search', query: query }) },
|
||||
type: 'search',
|
||||
});
|
||||
|
||||
if (!this.promptOnClose_) {
|
||||
this.promptOnClose_ = (answer, buttonType) => {
|
||||
return this.state.promptOptions.onClose(answer, buttonType);
|
||||
@@ -353,8 +388,12 @@ class MainScreenComponent extends React.Component {
|
||||
);
|
||||
}
|
||||
|
||||
const modalLayerStyle = Object.assign({}, styles.modalLayer, { display: this.state.modalLayer.visible ? 'block' : 'none' });
|
||||
|
||||
return (
|
||||
<div style={style}>
|
||||
<div style={modalLayerStyle}>{this.state.modalLayer.message}</div>
|
||||
|
||||
<PromptDialog
|
||||
autocomplete={promptOptions && ('autocomplete' in promptOptions) ? promptOptions.autocomplete : null}
|
||||
defaultValue={promptOptions && promptOptions.value ? promptOptions.value : ''}
|
||||
@@ -366,7 +405,7 @@ class MainScreenComponent extends React.Component {
|
||||
visible={!!this.state.promptOptions}
|
||||
buttons={promptOptions && ('buttons' in promptOptions) ? promptOptions.buttons : null}
|
||||
inputType={promptOptions && ('inputType' in promptOptions) ? promptOptions.inputType : null} />
|
||||
<Header style={styles.header} showBackButton={false} buttons={headerButtons} />
|
||||
<Header style={styles.header} showBackButton={false} items={headerItems} />
|
||||
{messageComp}
|
||||
<SideBar style={styles.sideBar} />
|
||||
<NoteList style={styles.noteList} />
|
||||
@@ -382,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 };
|
||||
|
@@ -9,6 +9,10 @@ const { bridge } = require('electron').remote.require('./bridge');
|
||||
const Menu = bridge().Menu;
|
||||
const MenuItem = bridge().MenuItem;
|
||||
const eventManager = require('../eventManager');
|
||||
const InteropService = require('lib/services/InteropService');
|
||||
const InteropServiceHelper = require('../InteropServiceHelper.js');
|
||||
const Search = require('lib/models/Search');
|
||||
const Mark = require('mark.js/dist/mark.min.js');
|
||||
|
||||
class NoteListComponent extends React.Component {
|
||||
|
||||
@@ -91,6 +95,23 @@ class NoteListComponent extends React.Component {
|
||||
eventManager.emit('noteTypeToggle', { noteId: note.id });
|
||||
}
|
||||
}}));
|
||||
|
||||
const exportMenu = new Menu();
|
||||
|
||||
const ioService = new InteropService();
|
||||
const ioModules = ioService.modules();
|
||||
for (let i = 0; i < ioModules.length; i++) {
|
||||
const module = ioModules[i];
|
||||
if (module.type !== 'exporter') continue;
|
||||
|
||||
exportMenu.append(new MenuItem({ label: module.fullLabel() , click: async () => {
|
||||
await InteropServiceHelper.export(this.props.dispatch.bind(this), module, { sourceNoteIds: noteIds });
|
||||
}}));
|
||||
}
|
||||
|
||||
const exportMenuItem = new MenuItem({label: _('Export'), submenu: exportMenu});
|
||||
|
||||
menu.append(exportMenuItem);
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Delete'), click: async () => {
|
||||
@@ -145,6 +166,12 @@ class NoteListComponent extends React.Component {
|
||||
|
||||
const hPadding = 10;
|
||||
|
||||
let highlightedWords = [];
|
||||
if (this.props.notesParentType === 'Search') {
|
||||
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
|
||||
highlightedWords = search ? Search.keywords(search.query_pattern) : [];
|
||||
}
|
||||
|
||||
let style = Object.assign({ width: width }, this.style().listItem);
|
||||
|
||||
if (this.props.selectedNoteIds.indexOf(item.id) >= 0) {
|
||||
@@ -163,8 +190,30 @@ class NoteListComponent extends React.Component {
|
||||
listItemTitleStyle.paddingLeft = !checkbox ? hPadding : 4;
|
||||
if (item.is_todo && !!item.todo_completed) listItemTitleStyle = Object.assign(listItemTitleStyle, this.style().listItemTitleCompleted);
|
||||
|
||||
let displayTitle = Note.displayTitle(item);
|
||||
let titleComp = null;
|
||||
|
||||
if (highlightedWords.length) {
|
||||
const titleElement = document.createElement('span');
|
||||
titleElement.textContent = displayTitle;
|
||||
const mark = new Mark(titleElement, {
|
||||
exclude: ['img'],
|
||||
acrossElements: true,
|
||||
});
|
||||
mark.mark(highlightedWords);
|
||||
|
||||
// Note: in this case it is safe to use dangerouslySetInnerHTML because titleElement
|
||||
// is a span tag that we created and that contains data that's been inserted as plain text
|
||||
// with `textContent` so it cannot contain any XSS attacks. We use this feature because
|
||||
// mark.js can only deal with DOM elements.
|
||||
// https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml
|
||||
titleComp = <span dangerouslySetInnerHTML={{ __html: titleElement.outerHTML }}></span>
|
||||
} else {
|
||||
titleComp = <span>{displayTitle}</span>
|
||||
}
|
||||
|
||||
// Need to include "todo_completed" in key so that checkbox is updated when
|
||||
// item is changed via sync.
|
||||
// item is changed via sync.
|
||||
return <div key={item.id + '_' + item.todo_completed} style={style}>
|
||||
{checkbox}
|
||||
<a
|
||||
@@ -177,7 +226,7 @@ class NoteListComponent extends React.Component {
|
||||
onDragStart={(event) => onDragStart(event) }
|
||||
data-id={item.id}
|
||||
>
|
||||
{Note.displayTitle(item)}
|
||||
{titleComp}
|
||||
</a>
|
||||
</div>
|
||||
}
|
||||
@@ -220,7 +269,9 @@ const mapStateToProps = (state) => {
|
||||
folders: state.folders,
|
||||
selectedNoteIds: state.selectedNoteIds,
|
||||
theme: state.settings.theme,
|
||||
// uncompletedTodosOnTop: state.settings.uncompletedTodosOnTop,
|
||||
notesParentType: state.notesParentType,
|
||||
searches: state.searches,
|
||||
selectedSearchId: state.selectedSearchId,
|
||||
};
|
||||
};
|
||||
|
||||
|
47
ElectronClient/app/gui/NoteStatusBar.jsx
Normal file
@@ -0,0 +1,47 @@
|
||||
const React = require('react');
|
||||
const { connect } = require('react-redux');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
|
||||
class NoteStatusBarComponent extends React.Component {
|
||||
|
||||
style() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
const itemHeight = 34;
|
||||
|
||||
let style = {
|
||||
root: Object.assign({}, theme.textStyle, {
|
||||
backgroundColor: theme.backgroundColor,
|
||||
color: theme.colorFaded,
|
||||
}),
|
||||
};
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
render() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const style = this.props.style;
|
||||
const note = this.props.note;
|
||||
|
||||
return (
|
||||
<div style={this.style().root}>{time.formatMsToLocal(note.user_updated_time)}</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
return {
|
||||
// notes: state.notes,
|
||||
// folders: state.folders,
|
||||
// selectedNoteIds: state.selectedNoteIds,
|
||||
theme: state.settings.theme,
|
||||
};
|
||||
};
|
||||
|
||||
const NoteStatusBar = connect(mapStateToProps)(NoteStatusBarComponent);
|
||||
|
||||
module.exports = { NoteStatusBar };
|
@@ -1,5 +1,7 @@
|
||||
const React = require('react');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Search = require('lib/models/Search.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { IconButton } = require('./IconButton.min.js');
|
||||
@@ -195,7 +197,9 @@ class NoteTextComponent extends React.Component {
|
||||
this.editorSetScrollTop(1);
|
||||
this.restoreScrollTop_ = 0;
|
||||
|
||||
if (note) {
|
||||
// If a search is in progress we don't focus any field otherwise it will
|
||||
// take the focus out of the search box.
|
||||
if (note && this.props.notesParentType !== 'Search') {
|
||||
const focusSettingName = !!note.is_todo ? 'newTodoFocus' : 'newNoteFocus';
|
||||
|
||||
if (Setting.value(focusSettingName) === 'title') {
|
||||
@@ -240,6 +244,10 @@ class NoteTextComponent extends React.Component {
|
||||
if ('syncStarted' in nextProps && !nextProps.syncStarted && !this.isModified()) {
|
||||
await this.reloadNote(nextProps, { noReloadIfLocalChanges: true });
|
||||
}
|
||||
|
||||
if (nextProps.windowCommand) {
|
||||
this.doCommand(nextProps.windowCommand);
|
||||
}
|
||||
}
|
||||
|
||||
isModified() {
|
||||
@@ -292,7 +300,7 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
const menu = new Menu()
|
||||
|
||||
if (itemType === 'image') {
|
||||
if (itemType === "image" || itemType === "link") {
|
||||
const resource = await Resource.load(arg0.resourceId);
|
||||
const resourcePath = Resource.fullPath(resource);
|
||||
|
||||
@@ -320,10 +328,7 @@ class NoteTextComponent extends React.Component {
|
||||
bridge().openItem(filePath);
|
||||
});
|
||||
} else {
|
||||
bridge().showMessageBox({
|
||||
type: 'error',
|
||||
message: _('Unsupported link or message: %s', msg),
|
||||
});
|
||||
bridge().showErrorMessageBox(_('Unsupported link or message: %s', msg));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -392,6 +397,18 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
if (this.editor_) {
|
||||
this.editor_.editor.renderer.on('afterRender', this.onAfterEditorRender_);
|
||||
|
||||
const cancelledKeys = ['Ctrl+F', 'Ctrl+T', 'Ctrl+P', 'Ctrl+Q', 'Ctrl+L', 'Ctrl+,'];
|
||||
for (let i = 0; i < cancelledKeys.length; i++) {
|
||||
const k = cancelledKeys[i];
|
||||
this.editor_.editor.commands.bindKey(k, () => {
|
||||
// HACK: Ace doesn't seem to provide a way to override its shortcuts, but throwing
|
||||
// an exception from this undocumented function seems to cancel it without any
|
||||
// side effect.
|
||||
// https://stackoverflow.com/questions/36075846
|
||||
throw new Error('HACK: Overriding Ace Editor shortcut: ' + k);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -429,6 +446,38 @@ class NoteTextComponent extends React.Component {
|
||||
this.scheduleSave();
|
||||
}
|
||||
|
||||
async doCommand(command) {
|
||||
if (!command) return;
|
||||
|
||||
let commandProcessed = true;
|
||||
|
||||
if (command.name === 'exportPdf' && this.webview_) {
|
||||
const path = bridge().showSaveDialog({
|
||||
filters: [{ name: _('PDF File'), extensions: ['pdf']}]
|
||||
});
|
||||
|
||||
if (path) {
|
||||
this.webview_.printToPDF({}, (error, data) => {
|
||||
if (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
} else {
|
||||
shim.fsDriver().writeFile(path, data, 'buffer');
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (command.name === 'print' && this.webview_) {
|
||||
this.webview_.print();
|
||||
} else {
|
||||
commandProcessed = false;
|
||||
}
|
||||
|
||||
if (commandProcessed) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async commandAttachFile() {
|
||||
const filePaths = bridge().showOpenDialog({
|
||||
@@ -533,6 +582,7 @@ class NoteTextComponent extends React.Component {
|
||||
marginBottom: 0,
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
};
|
||||
|
||||
const titleEditorStyle = {
|
||||
@@ -600,8 +650,19 @@ class NoteTextComponent extends React.Component {
|
||||
},
|
||||
postMessageSyntax: 'ipcRenderer.sendToHost',
|
||||
};
|
||||
const html = this.mdToHtml().render(body, theme, mdOptions);
|
||||
|
||||
let bodyToRender = body;
|
||||
if (!bodyToRender.trim() && visiblePanes.indexOf('viewer') >= 0 && visiblePanes.indexOf('editor') < 0) {
|
||||
// Fixes https://github.com/laurent22/joplin/issues/217
|
||||
bodyToRender = '*' + _('This note has no content. Click on "%s" to toggle the editor and edit the note.', _('Layout')) + '*';
|
||||
}
|
||||
|
||||
const html = this.mdToHtml().render(bodyToRender, theme, mdOptions);
|
||||
this.webview_.send('setHtml', html);
|
||||
|
||||
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
|
||||
const keywords = search ? Search.keywords(search.query_pattern) : [];
|
||||
this.webview_.send('setMarkers', keywords);
|
||||
}
|
||||
|
||||
const toolbarItems = [];
|
||||
@@ -645,6 +706,8 @@ class NoteTextComponent extends React.Component {
|
||||
display: 'flex',
|
||||
}} iconName="fa-caret-down" theme={this.props.theme} onClick={() => { this.itemContextMenu() }} />
|
||||
|
||||
const titleBarDate = <span style={Object.assign({}, theme.textStyle, {color: theme.colorFaded})}>{time.formatMsToLocal(note.user_updated_time)}</span>
|
||||
|
||||
const viewer = <webview
|
||||
style={viewerStyle}
|
||||
nodeintegration="1"
|
||||
@@ -652,6 +715,24 @@ class NoteTextComponent extends React.Component {
|
||||
ref={(elem) => { this.webview_ref(elem); } }
|
||||
/>
|
||||
|
||||
// const markers = [{
|
||||
// startRow: 2,
|
||||
// startCol: 3,
|
||||
// endRow: 2,
|
||||
// endCol: 6,
|
||||
// type: 'text',
|
||||
// className: 'test-marker'
|
||||
// }];
|
||||
|
||||
// markers={markers}
|
||||
// editorProps={{$useWorker: false}}
|
||||
|
||||
// #note-editor .test-marker {
|
||||
// background-color: red;
|
||||
// color: yellow;
|
||||
// position: absolute;
|
||||
// }
|
||||
|
||||
const editorRootStyle = Object.assign({}, editorStyle);
|
||||
delete editorRootStyle.width;
|
||||
delete editorRootStyle.height;
|
||||
@@ -678,14 +759,15 @@ class NoteTextComponent extends React.Component {
|
||||
editorProps={{$blockScrolling: true}}
|
||||
|
||||
// This is buggy (gets outside the container)
|
||||
highlightActiveLine={false}
|
||||
highlightActiveLine={false}
|
||||
/>
|
||||
|
||||
return (
|
||||
<div style={rootStyle}>
|
||||
<div style={titleBarStyle}>
|
||||
{ titleEditor }
|
||||
{ titleBarMenuButton }
|
||||
{ titleBarDate }
|
||||
{ false ? titleBarMenuButton : null }
|
||||
</div>
|
||||
{ toolbar }
|
||||
{ editor }
|
||||
@@ -706,6 +788,10 @@ const mapStateToProps = (state) => {
|
||||
showAdvancedOptions: state.settings.showAdvancedOptions,
|
||||
syncStarted: state.syncStarted,
|
||||
newNote: state.newNote,
|
||||
windowCommand: state.windowCommand,
|
||||
notesParentType: state.notesParentType,
|
||||
searches: state.searches,
|
||||
selectedSearchId: state.selectedSearchId,
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -54,10 +54,7 @@ class OneDriveLoginScreenComponent extends React.Component {
|
||||
this.props.dispatch({ type: 'NAV_BACK' });
|
||||
reg.scheduleSync(0);
|
||||
} catch (error) {
|
||||
bridge().showMessageBox({
|
||||
type: 'error',
|
||||
message: 'Could not login to OneDrive. Please try again.\n\n' + error.message + "\n\n" + url.match(/.{1,64}/g).join('\n'),
|
||||
});
|
||||
bridge().showErrorMessageBox('Could not login to OneDrive. Please try again.\n\n' + error.message + "\n\n" + url.match(/.{1,64}/g).join('\n'));
|
||||
}
|
||||
|
||||
this.authCode_ = null;
|
||||
|
@@ -8,6 +8,7 @@ const Setting = require('lib/models/Setting.js');
|
||||
|
||||
const { MainScreen } = require('./MainScreen.min.js');
|
||||
const { OneDriveLoginScreen } = require('./OneDriveLoginScreen.min.js');
|
||||
const { DropboxLoginScreen } = require('./DropboxLoginScreen.min.js');
|
||||
const { StatusScreen } = require('./StatusScreen.min.js');
|
||||
const { ImportScreen } = require('./ImportScreen.min.js');
|
||||
const { ConfigScreen } = require('./ConfigScreen.min.js');
|
||||
@@ -46,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 {
|
||||
@@ -75,6 +81,7 @@ class RootComponent extends React.Component {
|
||||
const screens = {
|
||||
Main: { screen: MainScreen },
|
||||
OneDriveLogin: { screen: OneDriveLoginScreen, title: () => _('OneDrive Login') },
|
||||
DropboxLogin: { screen: DropboxLoginScreen, title: () => _('Dropbox Login') },
|
||||
Import: { screen: ImportScreen, title: () => _('Import') },
|
||||
Config: { screen: ConfigScreen, title: () => _('Options') },
|
||||
Status: { screen: StatusScreen, title: () => _('Synchronisation Status') },
|
||||
|
@@ -1,19 +1,19 @@
|
||||
const React = require('react');
|
||||
const { connect } = require('react-redux');
|
||||
const shared = require('lib/components/shared/side-menu-shared.js');
|
||||
const { Synchronizer } = require('lib/synchronizer.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const React = require("react");
|
||||
const { connect } = require("react-redux");
|
||||
const shared = require("lib/components/shared/side-menu-shared.js");
|
||||
const { Synchronizer } = require("lib/synchronizer.js");
|
||||
const BaseModel = require("lib/BaseModel.js");
|
||||
const Folder = require("lib/models/Folder.js");
|
||||
const Note = require("lib/models/Note.js");
|
||||
const Tag = require("lib/models/Tag.js");
|
||||
const { _ } = require("lib/locale.js");
|
||||
const { themeStyle } = require("../theme.js");
|
||||
const { bridge } = require("electron").remote.require("./bridge");
|
||||
const Menu = bridge().Menu;
|
||||
const MenuItem = bridge().MenuItem;
|
||||
const InteropServiceHelper = require("../InteropServiceHelper.js");
|
||||
|
||||
class SideBarComponent extends React.Component {
|
||||
|
||||
style() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
@@ -27,63 +27,65 @@ class SideBarComponent extends React.Component {
|
||||
height: itemHeight,
|
||||
fontFamily: theme.fontFamily,
|
||||
fontSize: theme.fontSize,
|
||||
textDecoration: 'none',
|
||||
boxSizing: 'border-box',
|
||||
textDecoration: "none",
|
||||
boxSizing: "border-box",
|
||||
color: theme.color2,
|
||||
paddingLeft: 14,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
cursor: 'default',
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
cursor: "default",
|
||||
opacity: 0.8,
|
||||
whiteSpace: 'nowrap',
|
||||
whiteSpace: "nowrap",
|
||||
},
|
||||
listItemSelected: {
|
||||
backgroundColor: theme.selectedColor2,
|
||||
},
|
||||
conflictFolder: {
|
||||
color: theme.colorError2,
|
||||
fontWeight: 'bold',
|
||||
fontWeight: "bold",
|
||||
},
|
||||
header: {
|
||||
height: itemHeight * 1.8,
|
||||
fontFamily: theme.fontFamily,
|
||||
fontSize: theme.fontSize * 1.3,
|
||||
textDecoration: 'none',
|
||||
boxSizing: 'border-box',
|
||||
textDecoration: "none",
|
||||
boxSizing: "border-box",
|
||||
color: theme.color2,
|
||||
paddingLeft: 8,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
},
|
||||
button: {
|
||||
padding: 6,
|
||||
fontFamily: theme.fontFamily,
|
||||
fontSize: theme.fontSize,
|
||||
textDecoration: 'none',
|
||||
boxSizing: 'border-box',
|
||||
textDecoration: "none",
|
||||
boxSizing: "border-box",
|
||||
color: theme.color2,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
border: "1px solid rgba(255,255,255,0.2)",
|
||||
marginTop: 10,
|
||||
marginLeft: 5,
|
||||
marginRight: 5,
|
||||
cursor: 'default',
|
||||
cursor: "default",
|
||||
},
|
||||
syncReport: {
|
||||
fontFamily: theme.fontFamily,
|
||||
fontSize: Math.round(theme.fontSize * .9),
|
||||
fontSize: Math.round(theme.fontSize * 0.9),
|
||||
color: theme.color2,
|
||||
opacity: .5,
|
||||
display: 'flex',
|
||||
alignItems: 'left',
|
||||
justifyContent: 'top',
|
||||
flexDirection: 'column',
|
||||
opacity: 0.5,
|
||||
display: "flex",
|
||||
alignItems: "left",
|
||||
justifyContent: "top",
|
||||
flexDirection: "column",
|
||||
marginTop: 10,
|
||||
marginLeft: 5,
|
||||
marginRight: 5,
|
||||
minHeight: 70,
|
||||
wordWrap: "break-word",
|
||||
width: "100%",
|
||||
},
|
||||
};
|
||||
|
||||
@@ -91,19 +93,19 @@ class SideBarComponent extends React.Component {
|
||||
}
|
||||
|
||||
itemContextMenu(event) {
|
||||
const itemId = event.target.getAttribute('data-id');
|
||||
const itemId = event.target.getAttribute("data-id");
|
||||
if (itemId === Folder.conflictFolderId()) return;
|
||||
|
||||
const itemType = Number(event.target.getAttribute('data-type'));
|
||||
if (!itemId || !itemType) throw new Error('No data on element');
|
||||
|
||||
let deleteMessage = '';
|
||||
const itemType = Number(event.target.getAttribute("data-type"));
|
||||
if (!itemId || !itemType) throw new Error("No data on element");
|
||||
|
||||
let deleteMessage = "";
|
||||
if (itemType === BaseModel.TYPE_FOLDER) {
|
||||
deleteMessage = _('Delete notebook? All notes within this notebook will also be deleted.');
|
||||
deleteMessage = _("Delete notebook? All notes within this notebook will also be deleted.");
|
||||
} else if (itemType === BaseModel.TYPE_TAG) {
|
||||
deleteMessage = _('Remove this tag from all the notes?');
|
||||
deleteMessage = _("Remove this tag from all the notes?");
|
||||
} else if (itemType === BaseModel.TYPE_SEARCH) {
|
||||
deleteMessage = _('Remove this search from the sidebar?');
|
||||
deleteMessage = _("Remove this search from the sidebar?");
|
||||
}
|
||||
|
||||
const menu = new Menu();
|
||||
@@ -113,30 +115,55 @@ class SideBarComponent extends React.Component {
|
||||
item = BaseModel.byId(this.props.folders, itemId);
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Delete'), click: async () => {
|
||||
const ok = bridge().showConfirmMessageBox(deleteMessage);
|
||||
if (!ok) return;
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: _("Delete"),
|
||||
click: async () => {
|
||||
const ok = bridge().showConfirmMessageBox(deleteMessage);
|
||||
if (!ok) return;
|
||||
|
||||
if (itemType === BaseModel.TYPE_FOLDER) {
|
||||
await Folder.delete(itemId);
|
||||
} else if (itemType === BaseModel.TYPE_TAG) {
|
||||
await Tag.untagAll(itemId);
|
||||
} else if (itemType === BaseModel.TYPE_SEARCH) {
|
||||
this.props.dispatch({
|
||||
type: 'SEARCH_DELETE',
|
||||
id: itemId,
|
||||
});
|
||||
}
|
||||
}}))
|
||||
if (itemType === BaseModel.TYPE_FOLDER) {
|
||||
await Folder.delete(itemId);
|
||||
} else if (itemType === BaseModel.TYPE_TAG) {
|
||||
await Tag.untagAll(itemId);
|
||||
} else if (itemType === BaseModel.TYPE_SEARCH) {
|
||||
this.props.dispatch({
|
||||
type: "SEARCH_DELETE",
|
||||
id: itemId,
|
||||
});
|
||||
}
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
if (itemType === BaseModel.TYPE_FOLDER && !item.encryption_applied) {
|
||||
menu.append(new MenuItem({label: _('Rename'), click: async () => {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'renameFolder',
|
||||
id: itemId,
|
||||
});
|
||||
}}))
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: _("Rename"),
|
||||
click: async () => {
|
||||
this.props.dispatch({
|
||||
type: "WINDOW_COMMAND",
|
||||
name: "renameFolder",
|
||||
id: itemId,
|
||||
});
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
menu.append(new MenuItem({ type: "separator" }));
|
||||
|
||||
const InteropService = require("lib/services/InteropService.js");
|
||||
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: _("Export"),
|
||||
click: async () => {
|
||||
const ioService = new InteropService();
|
||||
const module = ioService.moduleByFormat_("exporter", "jex");
|
||||
await InteropServiceHelper.export(this.props.dispatch.bind(this), module, { sourceFolderIds: [itemId] });
|
||||
},
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
menu.popup(bridge().window());
|
||||
@@ -144,21 +171,21 @@ class SideBarComponent extends React.Component {
|
||||
|
||||
folderItem_click(folder) {
|
||||
this.props.dispatch({
|
||||
type: 'FOLDER_SELECT',
|
||||
type: "FOLDER_SELECT",
|
||||
id: folder ? folder.id : null,
|
||||
});
|
||||
}
|
||||
|
||||
tagItem_click(tag) {
|
||||
this.props.dispatch({
|
||||
type: 'TAG_SELECT',
|
||||
type: "TAG_SELECT",
|
||||
id: tag ? tag.id : null,
|
||||
});
|
||||
}
|
||||
|
||||
searchItem_click(search) {
|
||||
this.props.dispatch({
|
||||
type: 'SEARCH_SELECT',
|
||||
type: "SEARCH_SELECT",
|
||||
id: search ? search.id : null,
|
||||
});
|
||||
}
|
||||
@@ -173,105 +200,180 @@ class SideBarComponent extends React.Component {
|
||||
if (folder.id === Folder.conflictFolderId()) style = Object.assign(style, this.style().conflictFolder);
|
||||
|
||||
const onDragOver = (event, folder) => {
|
||||
if (event.dataTransfer.types.indexOf('text/x-jop-note-ids') >= 0) event.preventDefault();
|
||||
}
|
||||
if (event.dataTransfer.types.indexOf("text/x-jop-note-ids") >= 0) event.preventDefault();
|
||||
};
|
||||
|
||||
const onDrop = async (event, folder) => {
|
||||
if (event.dataTransfer.types.indexOf('text/x-jop-note-ids') < 0) return;
|
||||
if (event.dataTransfer.types.indexOf("text/x-jop-note-ids") < 0) return;
|
||||
event.preventDefault();
|
||||
|
||||
const noteIds = JSON.parse(event.dataTransfer.getData('text/x-jop-note-ids'));
|
||||
const noteIds = JSON.parse(event.dataTransfer.getData("text/x-jop-note-ids"));
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
await Note.moveToFolder(noteIds[i], folder.id);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const itemTitle = Folder.displayTitle(folder);
|
||||
|
||||
return <a
|
||||
className="list-item"
|
||||
onDragOver={(event) => { onDragOver(event, folder) } }
|
||||
onDrop={(event) => { onDrop(event, folder) } }
|
||||
href="#"
|
||||
data-id={folder.id}
|
||||
data-type={BaseModel.TYPE_FOLDER}
|
||||
onContextMenu={(event) => this.itemContextMenu(event)}
|
||||
key={folder.id}
|
||||
style={style} onClick={() => {this.folderItem_click(folder)}}>{itemTitle}
|
||||
</a>
|
||||
return (
|
||||
<a
|
||||
className="list-item"
|
||||
onDragOver={event => {
|
||||
onDragOver(event, folder);
|
||||
}}
|
||||
onDrop={event => {
|
||||
onDrop(event, folder);
|
||||
}}
|
||||
href="#"
|
||||
data-id={folder.id}
|
||||
data-type={BaseModel.TYPE_FOLDER}
|
||||
onContextMenu={event => this.itemContextMenu(event)}
|
||||
key={folder.id}
|
||||
style={style}
|
||||
onClick={() => {
|
||||
this.folderItem_click(folder);
|
||||
}}
|
||||
>
|
||||
{itemTitle}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
tagItem(tag, selected) {
|
||||
let style = Object.assign({}, this.style().listItem);
|
||||
if (selected) style = Object.assign(style, this.style().listItemSelected);
|
||||
return <a className="list-item" href="#" data-id={tag.id} data-type={BaseModel.TYPE_TAG} onContextMenu={(event) => this.itemContextMenu(event)} key={tag.id} style={style} onClick={() => {this.tagItem_click(tag)}}>{Tag.displayTitle(tag)}</a>
|
||||
return (
|
||||
<a
|
||||
className="list-item"
|
||||
href="#"
|
||||
data-id={tag.id}
|
||||
data-type={BaseModel.TYPE_TAG}
|
||||
onContextMenu={event => this.itemContextMenu(event)}
|
||||
key={tag.id}
|
||||
style={style}
|
||||
onClick={() => {
|
||||
this.tagItem_click(tag);
|
||||
}}
|
||||
>
|
||||
{Tag.displayTitle(tag)}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
searchItem(search, selected) {
|
||||
let style = Object.assign({}, this.style().listItem);
|
||||
if (selected) style = Object.assign(style, this.style().listItemSelected);
|
||||
return <a className="list-item" href="#" data-id={search.id} data-type={BaseModel.TYPE_SEARCH} onContextMenu={(event) => this.itemContextMenu(event)} key={search.id} style={style} onClick={() => {this.searchItem_click(search)}}>{search.title}</a>
|
||||
return (
|
||||
<a
|
||||
className="list-item"
|
||||
href="#"
|
||||
data-id={search.id}
|
||||
data-type={BaseModel.TYPE_SEARCH}
|
||||
onContextMenu={event => this.itemContextMenu(event)}
|
||||
key={search.id}
|
||||
style={style}
|
||||
onClick={() => {
|
||||
this.searchItem_click(search);
|
||||
}}
|
||||
>
|
||||
{search.title}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
makeDivider(key) {
|
||||
return <div style={{height:2, backgroundColor:'blue' }} key={key}></div>
|
||||
return <div style={{ height: 2, backgroundColor: "blue" }} key={key} />;
|
||||
}
|
||||
|
||||
makeHeader(key, label, iconName) {
|
||||
const style = this.style().header;
|
||||
const icon = <i style={{fontSize: style.fontSize * 1.2, marginRight: 5}} className={"fa " + iconName}></i>
|
||||
return <div style={style} key={key}>{icon}{label}</div>
|
||||
const icon = <i style={{ fontSize: style.fontSize * 1.2, marginRight: 5 }} className={"fa " + iconName} />;
|
||||
return (
|
||||
<div style={style} key={key}>
|
||||
{icon}
|
||||
{label}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
synchronizeButton(type) {
|
||||
const style = this.style().button;
|
||||
const iconName = type === 'sync' ? 'fa-refresh' : 'fa-times';
|
||||
const label = type === 'sync' ? _('Synchronise') : _('Cancel');
|
||||
const icon = <i style={{fontSize: style.fontSize, marginRight: 5}} className={"fa " + iconName}></i>
|
||||
return <a className="synchronize-button" style={style} href="#" key="sync_button" onClick={() => {this.sync_click()}}>{icon}{label}</a>
|
||||
const iconName = type === "sync" ? "fa-refresh" : "fa-times";
|
||||
const label = type === "sync" ? _("Synchronise") : _("Cancel");
|
||||
const icon = <i style={{ fontSize: style.fontSize, marginRight: 5 }} className={"fa " + iconName} />;
|
||||
return (
|
||||
<a
|
||||
className="synchronize-button"
|
||||
style={style}
|
||||
href="#"
|
||||
key="sync_button"
|
||||
onClick={() => {
|
||||
this.sync_click();
|
||||
}}
|
||||
>
|
||||
{icon}
|
||||
{label}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const style = Object.assign({}, this.style().root, this.props.style, {
|
||||
overflowX: 'hidden',
|
||||
overflowY: 'auto',
|
||||
overflowX: "hidden",
|
||||
overflowY: "auto",
|
||||
});
|
||||
|
||||
let items = [];
|
||||
|
||||
items.push(this.makeHeader('folderHeader', _('Notebooks'), 'fa-folder-o'));
|
||||
items.push(this.makeHeader("folderHeader", _("Notebooks"), "fa-folder-o"));
|
||||
|
||||
if (this.props.folders.length) {
|
||||
const folderItems = shared.renderFolders(this.props, this.folderItem.bind(this));
|
||||
items = items.concat(folderItems);
|
||||
}
|
||||
|
||||
items.push(this.makeHeader('tagHeader', _('Tags'), 'fa-tags'));
|
||||
items.push(this.makeHeader("tagHeader", _("Tags"), "fa-tags"));
|
||||
|
||||
if (this.props.tags.length) {
|
||||
const tagItems = shared.renderTags(this.props, this.tagItem.bind(this));
|
||||
|
||||
items.push(<div className="tags" key="tag_items">{tagItems}</div>);
|
||||
items.push(
|
||||
<div className="tags" key="tag_items">
|
||||
{tagItems}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (this.props.searches.length) {
|
||||
items.push(this.makeHeader('searchHeader', _('Searches'), 'fa-search'));
|
||||
// if (this.props.searches.length) {
|
||||
// items.push(this.makeHeader("searchHeader", _("Searches"), "fa-search"));
|
||||
|
||||
const searchItems = shared.renderSearches(this.props, this.searchItem.bind(this));
|
||||
// const searchItems = shared.renderSearches(this.props, this.searchItem.bind(this));
|
||||
|
||||
items.push(<div className="searches" key="search_items">{searchItems}</div>);
|
||||
}
|
||||
// items.push(
|
||||
// <div className="searches" key="search_items">
|
||||
// {searchItems}
|
||||
// </div>
|
||||
// );
|
||||
// }
|
||||
|
||||
let lines = Synchronizer.reportToLines(this.props.syncReport);
|
||||
const syncReportText = [];
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
syncReportText.push(<div key={i}>{lines[i]}</div>);
|
||||
syncReportText.push(
|
||||
<div key={i} style={{ wordWrap: "break-word", width: "100%" }}>
|
||||
{lines[i]}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
items.push(this.synchronizeButton(this.props.syncStarted ? 'cancel' : 'sync'));
|
||||
items.push(this.synchronizeButton(this.props.syncStarted ? "cancel" : "sync"));
|
||||
|
||||
items.push(<div style={this.style().syncReport} key='sync_report'>{syncReportText}</div>);
|
||||
items.push(
|
||||
<div style={this.style().syncReport} key="sync_report">
|
||||
{syncReportText}
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="side-bar" style={style}>
|
||||
@@ -279,10 +381,9 @@ class SideBarComponent extends React.Component {
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const mapStateToProps = state => {
|
||||
return {
|
||||
folders: state.folders,
|
||||
tags: state.tags,
|
||||
@@ -300,4 +401,4 @@ const mapStateToProps = (state) => {
|
||||
|
||||
const SideBar = connect(mapStateToProps)(SideBarComponent);
|
||||
|
||||
module.exports = { SideBar };
|
||||
module.exports = { SideBar };
|
||||
|
@@ -1,6 +1,8 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
|
||||
<style>
|
||||
body {
|
||||
overflow: hidden;
|
||||
@@ -13,12 +15,18 @@
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
mark {
|
||||
background: #CF3F00;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.katex { font-size: 1.3em; } /* This controls the global Katex font size*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body id="body">
|
||||
<div id="hlScriptContainer"></div>
|
||||
<div id="markScriptContainer"></div>
|
||||
<div id="content" ondragstart="return false;" ondrop="return false;"></div>
|
||||
|
||||
<script>
|
||||
@@ -38,7 +46,7 @@
|
||||
const script = document.createElement('script');
|
||||
script.onload = function () {
|
||||
hljsLoaded = true;
|
||||
applyHljs();
|
||||
applyHljs();
|
||||
};
|
||||
script.src = 'highlight/highlight.pack.js';
|
||||
document.getElementById('hlScriptContainer').appendChild(script);
|
||||
@@ -160,6 +168,36 @@
|
||||
setPercentScroll(percent);
|
||||
});
|
||||
|
||||
let mark_ = null;
|
||||
function setMarkers(keywords) {
|
||||
if (!mark_) {
|
||||
mark_ = new Mark(document.getElementById('content'), {
|
||||
exclude: ['img'],
|
||||
acrossElements: true,
|
||||
});
|
||||
}
|
||||
|
||||
mark_.mark(keywords);
|
||||
}
|
||||
|
||||
let markLoaded_ = false;
|
||||
ipcRenderer.on('setMarkers', (event, keywords) => {
|
||||
if (!keywords.length && !markLoaded_) return;
|
||||
|
||||
if (!markLoaded_) {
|
||||
const script = document.createElement('script');
|
||||
script.onload = function() {
|
||||
setMarkers(keywords);
|
||||
};
|
||||
|
||||
script.src = '../../node_modules/mark.js/dist/mark.min.js';
|
||||
document.getElementById('markScriptContainer').appendChild(script);
|
||||
markLoaded_ = true;
|
||||
} else {
|
||||
setMarkers(keywords);
|
||||
}
|
||||
});
|
||||
|
||||
function maxScrollTop() {
|
||||
return Math.max(0, contentElement.scrollHeight - contentElement.clientHeight);
|
||||
}
|
||||
@@ -181,7 +219,11 @@
|
||||
});
|
||||
|
||||
document.addEventListener('contextmenu', function(event) {
|
||||
const element = event.target;
|
||||
let element = event.target;
|
||||
|
||||
// To handle right clicks on resource icons
|
||||
if (element && !element.getAttribute('data-resource-id')) element = element.parentElement;
|
||||
|
||||
if (element && element.getAttribute('data-resource-id')) {
|
||||
ipcRenderer.sendToHost('contextMenu', {
|
||||
type: element.getAttribute('src') ? 'image' : 'link',
|
||||
|
@@ -17,10 +17,9 @@
|
||||
.smalltalk .page {
|
||||
max-width: 30em;
|
||||
}
|
||||
.ace_editor * {
|
||||
/* Necessary to make sure Russian text is displayed properly */
|
||||
/* https://github.com/laurent22/joplin/issues/155 */
|
||||
font-family: monospace !important;
|
||||
mark {
|
||||
background: #CF3F00;
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
1
ElectronClient/app/locales/cs_CZ.json
Normal file
1
ElectronClient/app/locales/da_DK.json
Normal file
1
ElectronClient/app/locales/gl_ES.json
Normal file
@@ -1,10 +1,12 @@
|
||||
var locales = {};
|
||||
locales['en_GB'] = require('./en_GB.json');
|
||||
locales['cs_CZ'] = require('./cs_CZ.json');
|
||||
locales['da_DK'] = require('./da_DK.json');
|
||||
locales['de_DE'] = require('./de_DE.json');
|
||||
locales['es_CR'] = require('./es_CR.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');
|
||||
|
@@ -64,11 +64,17 @@ document.addEventListener('click', (event) => event.preventDefault());
|
||||
app().start(bridge().processArgv()).then(() => {
|
||||
require('./gui/Root.min.js');
|
||||
}).catch((error) => {
|
||||
// If something goes wrong at this stage we don't have a console or a log file
|
||||
// so display the error in a message box.
|
||||
let msg = ['Fatal error:', error.message];
|
||||
if (error.fileName) msg.push(error.fileName);
|
||||
if (error.lineNumber) msg.push(error.lineNumber);
|
||||
if (error.stack) msg.push(error.stack);
|
||||
bridge().showErrorMessageBox(msg.join('\n'));
|
||||
if (error.code == 'flagError') {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
} else {
|
||||
// If something goes wrong at this stage we don't have a console or a log file
|
||||
// so display the error in a message box.
|
||||
let msg = ['Fatal error:', error.message];
|
||||
if (error.fileName) msg.push(error.fileName);
|
||||
if (error.lineNumber) msg.push(error.lineNumber);
|
||||
if (error.stack) msg.push(error.stack);
|
||||
bridge().showErrorMessageBox(msg.join('\n\n'));
|
||||
}
|
||||
|
||||
bridge().electronApp().exit(1);
|
||||
});
|
@@ -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);
|
||||
|
||||
|
2480
ElectronClient/app/package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Joplin",
|
||||
"version": "1.0.64",
|
||||
"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,
|
||||
@@ -43,10 +59,12 @@
|
||||
},
|
||||
"homepage": "https://github.com/laurent22/joplin#readme",
|
||||
"devDependencies": {
|
||||
"ajv": "^6.2.0",
|
||||
"app-builder-bin": "^1.5.0",
|
||||
"babel-cli": "^6.26.0",
|
||||
"babel-preset-react": "^6.24.1",
|
||||
"electron": "^1.7.11",
|
||||
"electron-builder": "^19.45.4"
|
||||
"electron-builder": "^20.10.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"7zip-bin-mac": "^1.0.1",
|
||||
@@ -57,9 +75,9 @@
|
||||
"app-module-path": "^2.2.0",
|
||||
"async-mutex": "^0.1.3",
|
||||
"base-64": "^0.1.0",
|
||||
"compare-versions": "^3.1.0",
|
||||
"electron-context-menu": "^0.9.1",
|
||||
"electron-log": "^2.2.11",
|
||||
"electron-updater": "^2.16.1",
|
||||
"electron-is-dev": "^0.3.0",
|
||||
"electron-window-state": "^4.1.1",
|
||||
"follow-redirects": "^1.2.5",
|
||||
"form-data": "^2.3.1",
|
||||
@@ -70,6 +88,7 @@
|
||||
"katex": "^0.9.0-beta1",
|
||||
"levenshtein": "^1.0.5",
|
||||
"lodash": "^4.17.4",
|
||||
"mark.js": "^8.11.1",
|
||||
"markdown-it": "^8.4.0",
|
||||
"markdown-it-katex": "^2.0.3",
|
||||
"md5": "^2.2.1",
|
||||
@@ -85,12 +104,12 @@
|
||||
"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",
|
||||
"string-padding": "^1.0.2",
|
||||
"string-to-stream": "^1.1.0",
|
||||
"tar": "^4.4.0",
|
||||
"tcp-port-used": "^0.1.2",
|
||||
"url-parse": "^1.2.0",
|
||||
"uuid": "^3.1.0",
|
||||
|
@@ -36,12 +36,14 @@ table td, table th {
|
||||
|
||||
.side-bar .list-item:hover,
|
||||
.side-bar .synchronize-button:hover {
|
||||
background-color: #453E53;
|
||||
/*background-color: #453E53;*/
|
||||
background-color: #01427B;
|
||||
}
|
||||
|
||||
.side-bar .list-item:active,
|
||||
.side-bar .synchronize-button:active {
|
||||
background-color: #564B6C;
|
||||
/*background-color: #564B6C;*/
|
||||
background-color: #0465BB;
|
||||
}
|
||||
|
||||
.editor-toolbar .button:not(.disabled):hover,
|
||||
|
@@ -1,12 +1,13 @@
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
|
||||
const globalStyle = {
|
||||
fontSize: 12 * Setting.value('style.zoom')/100,
|
||||
fontSize: 12 * Setting.value('style.zoom') / 100,
|
||||
fontFamily: 'sans-serif',
|
||||
margin: 15, // No text and no interactive component should be within this margin
|
||||
itemMarginTop: 10,
|
||||
itemMarginBottom: 10,
|
||||
backgroundColor: "#ffffff",
|
||||
backgroundColorTransparent: 'rgba(255,255,255,0.9)',
|
||||
oddBackgroundColor: "#dddddd",
|
||||
color: "#222222", // For regular text
|
||||
colorError: "red",
|
||||
@@ -20,9 +21,11 @@ const globalStyle = {
|
||||
buttonMinHeight: 30,
|
||||
textAreaLineHeight: 17,
|
||||
|
||||
backgroundColor2: "#2B2634",
|
||||
//backgroundColor2: "#2B2634",
|
||||
backgroundColor2: "#162B3D",
|
||||
color2: "#ffffff",
|
||||
selectedColor2: "#5A4D70",
|
||||
//selectedColor2: "#5A4D70",
|
||||
selectedColor2: "#0269C2",
|
||||
colorError2: "#ff6c6c",
|
||||
|
||||
warningBackgroundColor: "#FFD08D",
|
||||
@@ -59,6 +62,7 @@ globalStyle.icon = {
|
||||
globalStyle.lineInput = {
|
||||
color: globalStyle.color,
|
||||
backgroundColor: globalStyle.backgroundColor,
|
||||
fontFamily: globalStyle.fontFamily,
|
||||
};
|
||||
|
||||
globalStyle.textStyle = {
|
||||
|
@@ -90,6 +90,8 @@ async function main(argv) {
|
||||
if (linuxUrl) content = content.replace(/(https:\/\/github.com\/laurent22\/joplin\/releases\/download\/.*?\.AppImage)/, linuxUrl);
|
||||
|
||||
setReadmeContent(content);
|
||||
|
||||
console.info("git pull && git add -A && git commit -m 'Update readme downloads' && git push")
|
||||
}
|
||||
|
||||
main(process.argv).catch((error) => {
|
||||
|
@@ -1,9 +0,0 @@
|
||||
License MIT
|
||||
|
||||
Copyright (c) 2016-2018 Laurent Cozic
|
||||
|
||||
L'autorisation est accordée, gracieusement, à toute personne acquérant une copie de ce logiciel et des fichiers de documentation associés (le "Logiciel"), de commercialiser le Logiciel sans restriction, notamment les droits d'utiliser, de copier, de modifier, de fusionner, de publier, de distribuer, de sous-licencier et/ou de vendre des copies du Logiciel, ainsi que d'autoriser les personnes auxquelles le Logiciel est fourni à le faire, sous réserve des conditions suivantes :
|
||||
|
||||
La déclaration de copyright ci-dessus et la présente autorisation doivent être incluses dans toutes copies ou parties substantielles du Logiciel.
|
||||
|
||||
LE LOGICIEL EST FOURNI "TEL QUEL", SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE, NOTAMMENT SANS GARANTIE DE QUALITÉ MARCHANDE, D’ADÉQUATION À UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON. EN AUCUN CAS, LES AUTEURS OU TITULAIRES DU DROIT D'AUTEUR NE SERONT RESPONSABLES DE TOUT DOMMAGE, RÉCLAMATION OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS LE CADRE D'UN CONTRAT, D'UN DÉLIT OU AUTRE, EN PROVENANCE DE, CONSÉCUTIF À OU EN RELATION AVEC LE LOGICIEL OU SON UTILISATION, OU AVEC D'AUTRES ÉLÉMENTS DU LOGICIEL.
|
210
README.md
@@ -1,14 +1,16 @@
|
||||
# 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](https://daringfireball.net/projects/markdown/basics).
|
||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted) [](https://joplin.cozic.net/donate/#bitcoin) [](https://travis-ci.org/laurent22/joplin) [](https://ci.appveyor.com/project/laurent22/joplin)
|
||||
|
||||
Notes exported from Evernote via .enex files [can be imported](#importing-notes-from-evernote) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.).
|
||||
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).
|
||||
|
||||
The notes can be [synchronised](#synchronisation) with various targets 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.
|
||||
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/), 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
|
||||
|
||||
@@ -16,55 +18,75 @@ Three types of applications are available: for the **desktop** (Windows, macOS a
|
||||
|
||||
## Desktop applications
|
||||
|
||||
Operating System | Download
|
||||
-----------------|--------
|
||||
Windows | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.64/Joplin-Setup-1.0.64.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.64/Joplin-1.0.64.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.64/Joplin-1.0.64-x86_64.AppImage'><img alt='Get it on macOS' 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.98/joplin-v1.0.98.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.119/joplin-v1.0.119.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](http://joplin.cozic.net/terminal).
|
||||
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.
|
||||
- Import Enex files (Evernote export format)
|
||||
- End To End Encryption (E2EE)
|
||||
- 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.
|
||||
- Sort notes by multiple criteria - title, updated time, etc.
|
||||
- Support for alarms (notifications) in mobile and desktop applications.
|
||||
- Offline first, so the entire data is always available on the device even without an internet connection.
|
||||
- Synchronisation with various services, including NextCloud, WebDAV and OneDrive. Dropbox is planned.
|
||||
- End To End Encryption (E2EE)
|
||||
- Synchronises to a plain text format, which can be easily manipulated, backed up, or exported to a different format.
|
||||
- Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes.
|
||||
- File attachment support - images are displayed, and other files are linked and can be opened in the relevant application.
|
||||
- Search functionality.
|
||||
- Geo-location support.
|
||||
- Supports multiple languages
|
||||
|
||||
# Importing notes from Evernote
|
||||
# Importing
|
||||
|
||||
## Importing from Evernote
|
||||
|
||||
Joplin was designed as a replacement for Evernote and so can import complete Evernote notebooks, as well as notes, tags, resources (attached files) and note metadata (such as author, geo-location, etc.) via ENEX files. In terms of data, the only two things that might slightly differ are:
|
||||
|
||||
@@ -74,67 +96,95 @@ Joplin was designed as a replacement for Evernote and so can import complete Eve
|
||||
|
||||
To import Evernote data, first export your Evernote notebooks to ENEX files as described [here](https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks). Then follow these steps:
|
||||
|
||||
On the **desktop application**, open the "File" menu, click "Import Evernote notes" and select your ENEX file. This will open a new screen which will display the import progress. The notes will be imported into a new separate notebook (so that, in case of a mistake, the notes are not mixed up with any existing notes). If needed then can then be moved to a different notebook, or the notebook can be renamed, etc.
|
||||
On the **desktop application**, open File > Import > ENEX and select your file. The notes will be imported into a new separate notebook. If needed they can then be moved to a different notebook, or the notebook can be renamed, etc.
|
||||
|
||||
On the **terminal application**, in [command-line mode](/terminal#command-line-mode), type `import-enex /path/to/file.enex`. This will import the notes into a new notebook named after the filename.
|
||||
On the **terminal application**, in [command-line mode](https://joplin.cozic.net/terminal#command-line-mode), type `import /path/to/file.enex`. This will import the notes into a new notebook named after the filename.
|
||||
|
||||
# Importing notes from other applications
|
||||
## Importing from Markdown files
|
||||
|
||||
Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.
|
||||
|
||||
On the **desktop application**, open File > Import > MD and select your Markdown file or directory.
|
||||
|
||||
On the **terminal application**, in [command-line mode](https://joplin.cozic.net/terminal#command-line-mode), type `import --format md /path/to/file.md` or `import --format md /path/to/directory/`.
|
||||
|
||||
## Importing from other applications
|
||||
|
||||
In general the way to import notes from any application into Joplin is to convert the notes to ENEX files (Evernote format) and to import these ENEX files into Joplin using the method above. Most note-taking applications support ENEX files so it should be relatively straightforward. For help about specific applications, see below:
|
||||
|
||||
* Standard Notes: Please see [this tutorial](https://programadorwebvalencia.com/migrate-notes-from-standard-notes-to-joplin/)
|
||||
* Tomboy Notes: Export the notes to ENEX files [as described here](https://askubuntu.com/questions/243691/how-can-i-export-my-tomboy-notes-into-evernote/608551) for example, and import these ENEX files into Joplin.
|
||||
* OneNote: First [import the notes from OneNote into Evernote](https://discussion.evernote.com/topic/107736-is-there-a-way-to-import-from-onenote-into-evernote-on-the-mac/). Then export the ENEX file from Evernote and import it into Joplin.
|
||||
|
||||
# Exporting
|
||||
|
||||
Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A "raw" format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file.
|
||||
|
||||
# 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
|
||||
|
||||
On the **desktop application** or **mobile application**, go to the config screen and select Nextcloud as the synchronisation target. Then input [the WebDAV URL](https://docs.nextcloud.com/server/9/user_manual/files/access_webdav.html), this is normally `https://example.com/nextcloud/remote.php/dav/files/USERNAME/Joplin` (make sure to create the "Joplin" directory in Nextcloud and to replace USERNAME by your Nextcloud username), and set the username and password.
|
||||
<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.
|
||||
|
||||
Known compatible services that use WebDAV:
|
||||
WebDAV-compatible services that are known to work with Joplin.
|
||||
|
||||
- [Box.com](https://www.box.com/)
|
||||
- [DriveHQ](https://www.drivehq.com)
|
||||
- [Zimbra](https://www.zimbra.com/)
|
||||
- [HiDrive](https://www.strato.fr/stockage-en-ligne/) from Strato. [Setup help](https://github.com/laurent22/joplin/issues/309)
|
||||
- [OwnCloud](https://owncloud.org/)
|
||||
- [Seafile](https://www.seafile.com/)
|
||||
- [Stack](https://www.transip.nl/stack/)
|
||||
- [Zimbra](https://www.zimbra.com/)
|
||||
|
||||
## OneDrive synchronisation
|
||||
|
||||
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](http://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](http://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:
|
||||
@@ -157,32 +207,44 @@ 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.
|
||||
|
||||
# Donations
|
||||
|
||||
Donations to Joplin support the development of the project. Developing quality applications mostly takes time, but there are also some expenses, such as digital certificates to sign the applications, app store fees, hosting, etc. Most of all, your donation will make it possible to keep up the current development standard.
|
||||
|
||||
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
|
||||
@@ -205,28 +267,32 @@ Current translations:
|
||||
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
||||
| Language | Po File | Last translator | Percent done
|
||||
---|---|---|---|---
|
||||
 | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 88%
|
||||
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić <trbuhom@net.hr> | 71%
|
||||
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Tobias Strobel <git@strobeltobias.de> | 90%
|
||||
 | English | [en_GB](https://github.com/laurent22/joplin/blob/master/CliClient/locales/en_GB.po) | | 100%
|
||||
 | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín <f@mrtn.es> | 98%
|
||||
 | Español (Costa Rica) | [es_CR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_CR.po) | | 67%
|
||||
 | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 100%
|
||||
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 75%
|
||||
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 88%
|
||||
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | | 73%
|
||||
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov <artyom.karlov@gmail.com> | 92%
|
||||
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | RCJacH <RCJacH@outlook.com> | 75%
|
||||
 | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 73%
|
||||
 | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 76%
|
||||
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić <trbuhom@net.hr> | 62%
|
||||
 | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt <lukas@aiya.cz> | 96%
|
||||
 | 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%
|
||||
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Tobias Grasse <mail@tobias-grasse.net> | 95%
|
||||
 | English | [en_GB](https://github.com/laurent22/joplin/blob/master/CliClient/locales/en_GB.po) | | 100%
|
||||
 | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín <f@mrtn.es> | 99%
|
||||
 | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 100%
|
||||
 | Galician | [gl_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/gl_ES.po) | Marcos Lans <marcoslansgarza@gmail.com> | 97%
|
||||
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 63%
|
||||
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 77%
|
||||
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos <rnbastos@gmail.com> | 99%
|
||||
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov <artyom.karlov@gmail.com> | 95%
|
||||
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 92%
|
||||
 | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 62%
|
||||
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
||||
|
||||
# Known bugs
|
||||
|
||||
- Non-alphabetical characters such as Chinese or Arabic might create glitches in the terminal on Windows. This is a limitation of the current Windows console.
|
||||
- While the mobile can sync and load tags, it is not currently possible to create new ones. The desktop and terminal apps can create, delete and edit tags.
|
||||
- It is only possible to upload files of up to 4MB to OneDrive due to a limitation of [the API](https://docs.microsoft.com/en-gb/onedrive/developer/rest-api/api/driveitem_put_content) being currently used. There is currently no plan to support OneDrive "large file" API.
|
||||
|
||||
# License
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016-2018 Laurent Cozic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
@@ -1 +0,0 @@
|
||||
<img src="https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/DemoDesktop.png" style="max-width: 100%">
|
@@ -1,4 +0,0 @@
|
||||
# When I open a note in vim, the cursor is not visible
|
||||
|
||||
It seems to be due to the setting `set term=ansi` in .vimrc. Removing it should fix the issue. See https://github.com/laurent22/joplin/issues/147 for more information.
|
||||
|
@@ -90,8 +90,8 @@ android {
|
||||
applicationId "net.cozic.joplin"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 22
|
||||
versionCode 2097276
|
||||
versionName "1.0.98"
|
||||
versionCode 2097297
|
||||
versionName "1.0.119"
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "x86"
|
||||
}
|
||||
|
@@ -1,51 +1,3 @@
|
||||
const { main } = require('./main.js');
|
||||
|
||||
main();
|
||||
|
||||
// const React = require('react'); const Component = React.Component;
|
||||
// import {
|
||||
// AppRegistry,
|
||||
// StyleSheet,
|
||||
// Text,
|
||||
// View
|
||||
// } from 'react-native';
|
||||
|
||||
// module.exports = default class Joplin extends Component {;
|
||||
// render() {
|
||||
// return (
|
||||
// <View style={styles.container}>
|
||||
// <Text style={styles.welcome}>
|
||||
// Welcome to React Native!
|
||||
// </Text>
|
||||
// <Text style={styles.instructions}>
|
||||
// To get started, edit index.ios.js
|
||||
// </Text>
|
||||
// <Text style={styles.instructions}>
|
||||
// Press Cmd+R to reload,{'\n'}
|
||||
// Cmd+D or shake for dev menu
|
||||
// </Text>
|
||||
// </View>
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// const styles = StyleSheet.create({
|
||||
// container: {
|
||||
// flex: 1,
|
||||
// justifyContent: 'center',
|
||||
// alignItems: 'center',
|
||||
// backgroundColor: '#F5FCFF',
|
||||
// },
|
||||
// welcome: {
|
||||
// fontSize: 20,
|
||||
// textAlign: 'center',
|
||||
// margin: 10,
|
||||
// },
|
||||
// instructions: {
|
||||
// textAlign: 'center',
|
||||
// color: '#333333',
|
||||
// marginBottom: 5,
|
||||
// },
|
||||
// });
|
||||
|
||||
// AppRegistry.registerComponent('Joplin', () => Joplin);
|
||||
main();
|
@@ -1302,7 +1302,7 @@
|
||||
PRODUCT_NAME = Joplin;
|
||||
PROVISIONING_PROFILE = "";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Debug;
|
||||
@@ -1342,7 +1342,7 @@
|
||||
PRODUCT_NAME = Joplin;
|
||||
PROVISIONING_PROFILE = "";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Release;
|
||||
|
@@ -17,11 +17,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0.12</string>
|
||||
<string>10.0.20</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>12</string>
|
||||
<string>20</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
@@ -67,6 +67,13 @@
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
</dict>
|
||||
|
@@ -15,7 +15,6 @@ ArrayUtils.removeElement = function(array, element) {
|
||||
|
||||
// https://stackoverflow.com/a/10264318/561309
|
||||
ArrayUtils.binarySearch = function(items, value) {
|
||||
|
||||
var startIndex = 0,
|
||||
stopIndex = items.length - 1,
|
||||
middle = Math.floor((stopIndex + startIndex)/2);
|
||||
@@ -37,4 +36,13 @@ ArrayUtils.binarySearch = function(items, value) {
|
||||
return (items[middle] != value) ? -1 : middle;
|
||||
}
|
||||
|
||||
ArrayUtils.findByKey = function(array, key, value) {
|
||||
for (let i = 0; i < array.length; i++) {
|
||||
const o = array[i];
|
||||
if (typeof o !== 'object') continue;
|
||||
if (o[key] === value) return o;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
module.exports = ArrayUtils;
|
@@ -1,5 +1,5 @@
|
||||
const { createStore, applyMiddleware } = require('redux');
|
||||
const { reducer, defaultState } = require('lib/reducer.js');
|
||||
const { reducer, defaultState, stateUtils } = require('lib/reducer.js');
|
||||
const { JoplinDatabase } = require('lib/joplin-database.js');
|
||||
const { Database } = require('lib/database.js');
|
||||
const { FoldersScreenUtils } = require('lib/folders-screen-utils.js');
|
||||
@@ -21,6 +21,7 @@ const { shim } = require('lib/shim.js');
|
||||
const { _, setLocale, defaultLocale, closestSupportedLocale } = require('lib/locale.js');
|
||||
const os = require('os');
|
||||
const fs = require('fs-extra');
|
||||
const JoplinError = require('lib/JoplinError');
|
||||
const EventEmitter = require('events');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
||||
const SyncTargetFilesystem = require('lib/SyncTargetFilesystem.js');
|
||||
@@ -28,14 +29,17 @@ const SyncTargetOneDrive = require('lib/SyncTargetOneDrive.js');
|
||||
const SyncTargetOneDriveDev = require('lib/SyncTargetOneDriveDev.js');
|
||||
const SyncTargetNextcloud = require('lib/SyncTargetNextcloud.js');
|
||||
const SyncTargetWebDAV = require('lib/SyncTargetWebDAV.js');
|
||||
const SyncTargetDropbox = require('lib/SyncTargetDropbox.js');
|
||||
const EncryptionService = require('lib/services/EncryptionService');
|
||||
const DecryptionWorker = require('lib/services/DecryptionWorker');
|
||||
const BaseService = require('lib/services/BaseService');
|
||||
|
||||
SyncTargetRegistry.addClass(SyncTargetFilesystem);
|
||||
SyncTargetRegistry.addClass(SyncTargetOneDrive);
|
||||
SyncTargetRegistry.addClass(SyncTargetOneDriveDev);
|
||||
SyncTargetRegistry.addClass(SyncTargetNextcloud);
|
||||
SyncTargetRegistry.addClass(SyncTargetWebDAV);
|
||||
SyncTargetRegistry.addClass(SyncTargetDropbox);
|
||||
|
||||
class BaseApplication {
|
||||
|
||||
@@ -95,14 +99,14 @@ class BaseApplication {
|
||||
let nextArg = argv.length >= 2 ? argv[1] : null;
|
||||
|
||||
if (arg == '--profile') {
|
||||
if (!nextArg) throw new Error(_('Usage: %s', '--profile <dir-path>'));
|
||||
if (!nextArg) throw new JoplinError(_('Usage: %s', '--profile <dir-path>'), 'flagError');
|
||||
matched.profileDir = nextArg;
|
||||
argv.splice(0, 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg == '--env') {
|
||||
if (!nextArg) throw new Error(_('Usage: %s', '--env <dev|prod>'));
|
||||
if (!nextArg) throw new JoplinError(_('Usage: %s', '--env <dev|prod>'), 'flagError');
|
||||
matched.env = nextArg;
|
||||
argv.splice(0, 2);
|
||||
continue;
|
||||
@@ -133,14 +137,14 @@ class BaseApplication {
|
||||
}
|
||||
|
||||
if (arg == '--log-level') {
|
||||
if (!nextArg) throw new Error(_('Usage: %s', '--log-level <none|error|warn|info|debug>'));
|
||||
if (!nextArg) throw new JoplinError(_('Usage: %s', '--log-level <none|error|warn|info|debug>'), 'flagError');
|
||||
matched.logLevel = Logger.levelStringToId(nextArg);
|
||||
argv.splice(0, 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.length && arg[0] == '-') {
|
||||
throw new Error(_('Unknown flag: %s', arg));
|
||||
throw new JoplinError(_('Unknown flag: %s', arg), 'flagError');
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -184,8 +188,9 @@ class BaseApplication {
|
||||
this.logger().debug('Refreshing notes:', parentType, parentId);
|
||||
|
||||
let options = {
|
||||
order: state.notesOrder,
|
||||
order: stateUtils.notesOrder(state.settings),
|
||||
uncompletedTodosOnTop: Setting.value('uncompletedTodosOnTop'),
|
||||
caseInsensitive: true,
|
||||
};
|
||||
|
||||
const source = JSON.stringify({
|
||||
@@ -255,14 +260,31 @@ class BaseApplication {
|
||||
|
||||
const result = next(action);
|
||||
const newState = store.getState();
|
||||
let refreshNotes = false;
|
||||
|
||||
if (action.type == 'FOLDER_SELECT' || action.type === 'FOLDER_DELETE') {
|
||||
if (action.type == 'FOLDER_SELECT' || action.type === 'FOLDER_DELETE' || (action.type === 'SEARCH_UPDATE' && newState.notesParentType === 'Folder')) {
|
||||
Setting.setValue('activeFolderId', newState.selectedFolderId);
|
||||
this.currentFolder_ = newState.selectedFolderId ? await Folder.load(newState.selectedFolderId) : null;
|
||||
await this.refreshNotes(newState);
|
||||
refreshNotes = true;
|
||||
}
|
||||
|
||||
if (this.hasGui() && action.type == 'SETTING_UPDATE_ONE' && action.key == 'uncompletedTodosOnTop' || action.type == 'SETTING_UPDATE_ALL') {
|
||||
if (this.hasGui() && ((action.type == 'SETTING_UPDATE_ONE' && action.key == 'uncompletedTodosOnTop') || action.type == 'SETTING_UPDATE_ALL')) {
|
||||
refreshNotes = true;
|
||||
}
|
||||
|
||||
if (this.hasGui() && ((action.type == 'SETTING_UPDATE_ONE' && action.key.indexOf('notes.sortOrder') === 0) || action.type == 'SETTING_UPDATE_ALL')) {
|
||||
refreshNotes = true;
|
||||
}
|
||||
|
||||
if (action.type == 'TAG_SELECT' || action.type === 'TAG_DELETE') {
|
||||
refreshNotes = true;
|
||||
}
|
||||
|
||||
if (action.type == 'SEARCH_SELECT' || action.type === 'SEARCH_DELETE') {
|
||||
refreshNotes = true;
|
||||
}
|
||||
|
||||
if (refreshNotes) {
|
||||
await this.refreshNotes(newState);
|
||||
}
|
||||
|
||||
@@ -288,14 +310,6 @@ class BaseApplication {
|
||||
}
|
||||
}
|
||||
|
||||
if (action.type == 'TAG_SELECT' || action.type === 'TAG_DELETE') {
|
||||
await this.refreshNotes(newState);
|
||||
}
|
||||
|
||||
if (action.type == 'SEARCH_SELECT' || action.type === 'SEARCH_DELETE') {
|
||||
await this.refreshNotes(newState);
|
||||
}
|
||||
|
||||
if (action.type === 'NOTE_UPDATE_ONE') {
|
||||
// If there is a conflict, we refresh the folders so as to display "Conflicts" folder
|
||||
if (action.note && action.note.is_conflict) {
|
||||
@@ -303,11 +317,6 @@ class BaseApplication {
|
||||
}
|
||||
}
|
||||
|
||||
// if (action.type === 'NOTE_DELETE') {
|
||||
// // Update folders if a note is deleted in case the deleted note was a conflict
|
||||
// await FoldersScreenUtils.refreshFolders();
|
||||
// }
|
||||
|
||||
if (this.hasGui() && action.type == 'SETTING_UPDATE_ONE' && action.key == 'sync.interval' || action.type == 'SETTING_UPDATE_ALL') {
|
||||
reg.setupRecurrentSync();
|
||||
}
|
||||
@@ -359,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';
|
||||
@@ -414,12 +423,19 @@ class BaseApplication {
|
||||
if (Setting.value('firstStart')) {
|
||||
const locale = shim.detectAndSetLocale(Setting);
|
||||
reg.logger().info('First start: detected locale as ' + locale);
|
||||
if (Setting.value('env') === 'dev') Setting.setValue('sync.target', SyncTargetRegistry.nameToId('onedrive_dev'));
|
||||
Setting.setValue('firstStart', 0)
|
||||
|
||||
if (Setting.value('env') === 'dev') {
|
||||
Setting.setValue('showTrayIcon', 0);
|
||||
Setting.setValue('autoUpdateEnabled', 0);
|
||||
Setting.setValue('sync.interval', 3600);
|
||||
}
|
||||
|
||||
Setting.setValue('firstStart', 0);
|
||||
} else {
|
||||
setLocale(Setting.value('locale'));
|
||||
}
|
||||
|
||||
BaseService.logger_ = this.logger_;
|
||||
EncryptionService.instance().setLogger(this.logger_);
|
||||
BaseItem.encryptionService_ = EncryptionService.instance();
|
||||
DecryptionWorker.instance().setLogger(this.logger_);
|
||||
|