You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-30 20:39:46 +02:00
Compare commits
129 Commits
ios-v1.0.1
...
v1.0.78
Author | SHA1 | Date | |
---|---|---|---|
|
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 | ||
|
dfbe37fdaf | ||
|
37e7ea0b52 | ||
|
44bf518244 | ||
|
63cb9b4968 | ||
|
a6cecc103c |
@@ -3,6 +3,14 @@ if: tag IS present
|
|||||||
|
|
||||||
rvm: 2.3.3
|
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:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: osx
|
- os: osx
|
||||||
|
13
BUILD.md
13
BUILD.md
@@ -8,7 +8,7 @@
|
|||||||
brew install yarn node
|
brew install yarn node
|
||||||
echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
|
echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
|
||||||
source ~/.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`
|
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
|
## Linux and Windows (WSL) dependencies
|
||||||
@@ -43,6 +43,17 @@ That will create the executable file in the `dist` directory.
|
|||||||
|
|
||||||
From `/ElectronClient` you can also run `run.sh` to run the app for testing.
|
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
|
||||||
|
```
|
||||||
|
|
||||||
# Building the Mobile application
|
# 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.
|
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,6 +1,6 @@
|
|||||||
# Reporting a bug
|
# 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.
|
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.
|
||||||
|
|
||||||
@@ -16,5 +16,4 @@ Building the apps is relatively easy - please [see the build instructions](https
|
|||||||
|
|
||||||
# Coding style
|
# Coding style
|
||||||
|
|
||||||
- Only use tabs for indentation, not spaces.
|
See the [prettier config](https://github.com/laurent22/joplin/blob/master/prettier.config.js).
|
||||||
- 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.
|
|
||||||
|
@@ -287,6 +287,8 @@ class AppGui {
|
|||||||
|
|
||||||
addCommandToConsole(cmd) {
|
addCommandToConsole(cmd) {
|
||||||
if (!cmd) return;
|
if (!cmd) return;
|
||||||
|
const isConfigPassword = cmd.indexOf('config ') >= 0 && cmd.indexOf('password') >= 0;
|
||||||
|
if (isConfigPassword) return;
|
||||||
this.stdout(chalk.cyan.bold('> ' + cmd));
|
this.stdout(chalk.cyan.bold('> ' + cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,7 +496,7 @@ class AppGui {
|
|||||||
cmd = cmd.trim();
|
cmd = cmd.trim();
|
||||||
if (!cmd.length) return;
|
if (!cmd.length) return;
|
||||||
|
|
||||||
this.logger().info('Got command: ' + cmd);
|
// this.logger().debug('Got command: ' + cmd);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let note = this.widget('noteList').currentItem;
|
let note = this.widget('noteList').currentItem;
|
||||||
@@ -755,7 +757,7 @@ class AppGui {
|
|||||||
if (statusBar.promptActive) processShortcutKeys = false;
|
if (statusBar.promptActive) processShortcutKeys = false;
|
||||||
|
|
||||||
if (processShortcutKeys) {
|
if (processShortcutKeys) {
|
||||||
this.logger().info('Shortcut:', shortcutKey, keymapItem);
|
this.logger().debug('Shortcut:', shortcutKey, keymapItem);
|
||||||
|
|
||||||
this.currentShortcutKeys_ = [];
|
this.currentShortcutKeys_ = [];
|
||||||
|
|
||||||
|
@@ -5,6 +5,7 @@ const { JoplinDatabase } = require('lib/joplin-database.js');
|
|||||||
const { Database } = require('lib/database.js');
|
const { Database } = require('lib/database.js');
|
||||||
const { FoldersScreenUtils } = require('lib/folders-screen-utils.js');
|
const { FoldersScreenUtils } = require('lib/folders-screen-utils.js');
|
||||||
const { DatabaseDriverNode } = require('lib/database-driver-node.js');
|
const { DatabaseDriverNode } = require('lib/database-driver-node.js');
|
||||||
|
const ResourceService = require('lib/services/ResourceService');
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const BaseItem = require('lib/models/BaseItem.js');
|
const BaseItem = require('lib/models/BaseItem.js');
|
||||||
@@ -283,7 +284,7 @@ class Application extends BaseApplication {
|
|||||||
exit: () => {},
|
exit: () => {},
|
||||||
showModalOverlay: (text) => {},
|
showModalOverlay: (text) => {},
|
||||||
hideModalOverlay: () => {},
|
hideModalOverlay: () => {},
|
||||||
stdoutMaxWidth: () => { return 78; },
|
stdoutMaxWidth: () => { return 100; },
|
||||||
forceRender: () => {},
|
forceRender: () => {},
|
||||||
termSaveState: () => {},
|
termSaveState: () => {},
|
||||||
termRestoreState: (state) => {},
|
termRestoreState: (state) => {},
|
||||||
@@ -292,7 +293,7 @@ class Application extends BaseApplication {
|
|||||||
|
|
||||||
async execCommand(argv) {
|
async execCommand(argv) {
|
||||||
if (!argv.length) return this.execCommand(['help']);
|
if (!argv.length) return this.execCommand(['help']);
|
||||||
reg.logger().info('execCommand()', argv);
|
// reg.logger().debug('execCommand()', argv);
|
||||||
const commandName = argv[0];
|
const commandName = argv[0];
|
||||||
this.activeCommand_ = this.findCommandByName(commandName);
|
this.activeCommand_ = this.findCommandByName(commandName);
|
||||||
|
|
||||||
@@ -387,10 +388,11 @@ class Application extends BaseApplication {
|
|||||||
await this.execCommand(argv);
|
await this.execCommand(argv);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (this.showStackTraces_) {
|
if (this.showStackTraces_) {
|
||||||
console.info(error);
|
console.error(error);
|
||||||
} else {
|
} else {
|
||||||
console.info(error.message);
|
console.info(error.message);
|
||||||
}
|
}
|
||||||
|
process.exit(1);
|
||||||
}
|
}
|
||||||
} else { // Otherwise open the GUI
|
} else { // Otherwise open the GUI
|
||||||
this.initRedux();
|
this.initRedux();
|
||||||
@@ -411,6 +413,8 @@ class Application extends BaseApplication {
|
|||||||
|
|
||||||
const tags = await Tag.allWithNotes();
|
const tags = await Tag.allWithNotes();
|
||||||
|
|
||||||
|
ResourceService.runInBackground();
|
||||||
|
|
||||||
this.dispatch({
|
this.dispatch({
|
||||||
type: 'TAG_UPDATE_ALL',
|
type: 'TAG_UPDATE_ALL',
|
||||||
items: tags,
|
items: tags,
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
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 BaseModel = require('lib/BaseModel.js');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
@@ -10,15 +10,21 @@ const fs = require('fs-extra');
|
|||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
return 'export <directory>';
|
return 'export <path>';
|
||||||
}
|
}
|
||||||
|
|
||||||
description() {
|
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() {
|
options() {
|
||||||
|
const service = new InteropService();
|
||||||
|
const formats = service.modules()
|
||||||
|
.filter(m => m.type === 'exporter')
|
||||||
|
.map(m => m.format + (m.description ? ' (' + m.description + ')' : ''));
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
['--format <format>', _('Destination format: %s', formats.join(', '))],
|
||||||
['--note <note>', _('Exports only the given note.')],
|
['--note <note>', _('Exports only the given note.')],
|
||||||
['--notebook <notebook>', _('Exports only the given notebook.')],
|
['--notebook <notebook>', _('Exports only the given notebook.')],
|
||||||
];
|
];
|
||||||
@@ -26,13 +32,9 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
let exportOptions = {};
|
let exportOptions = {};
|
||||||
exportOptions.destDir = args.directory;
|
exportOptions.path = args.path;
|
||||||
exportOptions.writeFile = (filePath, data) => {
|
|
||||||
return fs.writeFile(filePath, data);
|
exportOptions.format = args.options.format ? args.options.format : 'jex';
|
||||||
};
|
|
||||||
exportOptions.copyFile = (source, dest) => {
|
|
||||||
return fs.copy(source, dest, { overwrite: true });
|
|
||||||
};
|
|
||||||
|
|
||||||
if (args.options.note) {
|
if (args.options.note) {
|
||||||
|
|
||||||
@@ -48,10 +50,10 @@ class Command extends BaseCommand {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const exporter = new Exporter();
|
const service = new InteropService();
|
||||||
const result = await exporter.export(exportOptions);
|
const result = await service.export(exportOptions);
|
||||||
|
|
||||||
reg.logger().info('Export result: ', result);
|
result.warnings.map((w) => this.stdout(w));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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
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;
|
@@ -10,7 +10,6 @@ const { cliUtils } = require('./cli-utils.js');
|
|||||||
const md5 = require('md5');
|
const md5 = require('md5');
|
||||||
const locker = require('proper-lockfile');
|
const locker = require('proper-lockfile');
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const osTmpdir = require('os-tmpdir');
|
|
||||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
@@ -101,7 +100,7 @@ class Command extends BaseCommand {
|
|||||||
this.releaseLockFn_ = null;
|
this.releaseLockFn_ = null;
|
||||||
|
|
||||||
// Lock is unique per profile/database
|
// Lock is unique per profile/database
|
||||||
const lockFilePath = osTmpdir() + '/synclock_' + md5(escape(Setting.value('profileDir'))); // https://github.com/pvorb/node-md5/issues/41
|
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');
|
if (!await fs.pathExists(lockFilePath)) await fs.writeFile(lockFilePath, 'synclock');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@@ -133,7 +133,8 @@ class StatusBarWidget extends BaseWidget {
|
|||||||
resolveResult = input ? input.trim() : input;
|
resolveResult = input ? input.trim() : input;
|
||||||
// Add the command to history but only if it's longer than one character.
|
// 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.
|
// 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);
|
desc.push(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (md.description) {
|
const description = Setting.keyDescription(md.key, 'cli');
|
||||||
desc.push(md.description());
|
if (description) desc.push(description);
|
||||||
}
|
|
||||||
|
|
||||||
desc.push(_('Type: %s.', md.isEnum ? _('Enum') : Setting.typeToString(md.type)));
|
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)')));
|
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() {
|
// async function main() {
|
||||||
// const WebDavApi = require('lib/WebDavApi');
|
// const InteropService = require('lib/services/InteropService');
|
||||||
// const api = new WebDavApi('http://nextcloud.local/remote.php/dav/files/admin/Joplin', { username: 'admin', password: '1234567' });
|
// const service = new InteropService();
|
||||||
// const { FileApiDriverWebDav } = new require('lib/file-api-driver-webdav');
|
// console.info(service.moduleByFormat('importer', 'enex'));
|
||||||
// const driver = new FileApiDriverWebDav(api);
|
// //await service.modules();
|
||||||
|
|
||||||
// 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);
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// main().catch((error) => { console.error(error); });
|
// main().catch((error) => { console.error(error); });
|
||||||
@@ -114,6 +87,13 @@ process.stdout.on('error', function( err ) {
|
|||||||
|
|
||||||
|
|
||||||
application.start(process.argv).catch((error) => {
|
application.start(process.argv).catch((error) => {
|
||||||
console.error(_('Fatal error:'));
|
if (error.code == 'flagError') {
|
||||||
console.error(error);
|
console.error(error.message);
|
||||||
|
console.error(_('Type `joplin help` for usage information.'));
|
||||||
|
} else {
|
||||||
|
console.error(_('Fatal error:'));
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit(1);
|
||||||
});
|
});
|
@@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||||
"Report-Msgid-Bugs-To: \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-Team: \n"
|
||||||
"Language: de_DE\n"
|
"Language: de_DE\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -18,7 +18,8 @@ msgstr ""
|
|||||||
|
|
||||||
msgid "To delete a tag, untag the associated notes."
|
msgid "To delete a tag, untag the associated notes."
|
||||||
msgstr ""
|
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."
|
msgid "Please select the note or notebook to be deleted first."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -26,19 +27,18 @@ msgstr ""
|
|||||||
"soll."
|
"soll."
|
||||||
|
|
||||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
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
|
#, javascript-format
|
||||||
msgid "More than one item match \"%s\". Please narrow down your query."
|
msgid "More than one item match \"%s\". Please narrow down your query."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Mehr als eine Notiz stimmt mit \"%s\" überein. Bitte schränke deine Suche "
|
"Mehr als eine Notiz stimmt mit \"%s\" überein. Bitte die Suche einschränken."
|
||||||
"ein."
|
|
||||||
|
|
||||||
msgid "No notebook selected."
|
msgid "No notebook selected."
|
||||||
msgstr "Kein Notizbuch ausgewählt."
|
msgstr "Kein Notizbuch ausgewählt."
|
||||||
|
|
||||||
msgid "No notebook has been specified."
|
msgid "No notebook has been specified."
|
||||||
msgstr "Kein Notizbuch wurde angegeben."
|
msgstr "Es wurde kein Notizbuch festgelegt."
|
||||||
|
|
||||||
msgid "Y"
|
msgid "Y"
|
||||||
msgstr "J"
|
msgstr "J"
|
||||||
@@ -68,7 +68,7 @@ msgstr "Kann verschlüsseltes Objekt nicht ändern"
|
|||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Missing required argument: %s"
|
msgid "Missing required argument: %s"
|
||||||
msgstr "Fehlendes benötigtes Argument: %s"
|
msgstr "Fehlendes erforderliches Argument: %s"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "%s: %s"
|
msgid "%s: %s"
|
||||||
@@ -104,8 +104,7 @@ msgstr ""
|
|||||||
"gegeben sind, wird eine Liste der momentanen Konfiguration angezeigt."
|
"gegeben sind, wird eine Liste der momentanen Konfiguration angezeigt."
|
||||||
|
|
||||||
msgid "Also displays unset and hidden config variables."
|
msgid "Also displays unset and hidden config variables."
|
||||||
msgstr ""
|
msgstr "Zeigt auch nicht gesetzte und versteckte Konfigurationsvariablen an."
|
||||||
"Zeigt auch nicht angegebene oder versteckte Konfigurationsvariablen an."
|
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "%s = %s (%s)"
|
msgid "%s = %s (%s)"
|
||||||
@@ -119,12 +118,12 @@ msgid ""
|
|||||||
"Duplicates the notes matching <note> to [notebook]. If no notebook is "
|
"Duplicates the notes matching <note> to [notebook]. If no notebook is "
|
||||||
"specified the note is duplicated in the current notebook."
|
"specified the note is duplicated in the current notebook."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dupliziert die Notizen die mit <note> übereinstimmen zu [Notizbuch]. Wenn "
|
"Dupliziert die Notizen die mit <note> übereinstimmen in [Notizbuch]. Wenn "
|
||||||
"kein Notizbuch angegeben ist, wird die Notiz in das momentane Notizbuch "
|
"kein Notizbuch angegeben ist, wird die Notiz in das aktuelle Notizbuch "
|
||||||
"kopiert."
|
"kopiert."
|
||||||
|
|
||||||
msgid "Marks a to-do as done."
|
msgid "Marks a to-do as done."
|
||||||
msgstr "Markiert ein To-Do als abgeschlossen."
|
msgstr "Markiert ein To-Do als erledigt."
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Note is not a to-do: \"%s\""
|
msgid "Note is not a to-do: \"%s\""
|
||||||
@@ -134,7 +133,7 @@ msgid ""
|
|||||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||||
"`status` and `target-status`."
|
"`status` and `target-status`."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Verwaltet die E2EE-Konfiguration. Die Befehle sind `enable`, `disable`, "
|
"Verwaltet die E2EE-Konfiguration. Die Befehle lauten `enable`, `disable`, "
|
||||||
"`decrypt`, `status` und `target-status`."
|
"`decrypt`, `status` und `target-status`."
|
||||||
|
|
||||||
msgid "Enter master password:"
|
msgid "Enter master password:"
|
||||||
@@ -147,8 +146,8 @@ msgid ""
|
|||||||
"Starting decryption... Please wait as it may take several minutes depending "
|
"Starting decryption... Please wait as it may take several minutes depending "
|
||||||
"on how much there is to decrypt."
|
"on how much there is to decrypt."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Entschlüsselung starten.... Warte bitte, da es einige Minuten dauern kann, "
|
"Starte Entschlüsselung.... Bitte warten, da dies je nach Anzahl der "
|
||||||
"je nachdem, wie viel es zu entschlüsseln gibt."
|
"betreffenden Objekte einige Minuten dauern kann."
|
||||||
|
|
||||||
msgid "Completed decryption."
|
msgid "Completed decryption."
|
||||||
msgstr "Entschlüsselung abgeschlossen."
|
msgstr "Entschlüsselung abgeschlossen."
|
||||||
@@ -161,7 +160,7 @@ msgstr "Deaktiviert"
|
|||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Encryption is: %s"
|
msgid "Encryption is: %s"
|
||||||
msgstr "Die Verschlüsselung ist: %s"
|
msgstr "Verschlüsselung ist: %s"
|
||||||
|
|
||||||
msgid "Edit note."
|
msgid "Edit note."
|
||||||
msgstr "Notiz bearbeiten."
|
msgstr "Notiz bearbeiten."
|
||||||
@@ -169,8 +168,8 @@ msgstr "Notiz bearbeiten."
|
|||||||
msgid ""
|
msgid ""
|
||||||
"No text editor is defined. Please set it using `config editor <editor-path>`"
|
"No text editor is defined. Please set it using `config editor <editor-path>`"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Kein Textverarbeitungsprogramm angegeben. Bitte lege eines mit `config "
|
"Kein Texteditor definiert. Bitte lege einen mit `config editor <Pfad-Zum-"
|
||||||
"editor <Pfad-Zum-Textverarbeitungsprogramm>` fest"
|
"Texteditor>` fest"
|
||||||
|
|
||||||
msgid "No active notebook."
|
msgid "No active notebook."
|
||||||
msgstr "Kein aktives Notizbuch."
|
msgstr "Kein aktives Notizbuch."
|
||||||
@@ -192,16 +191,20 @@ msgid "Note has been saved."
|
|||||||
msgstr "Die Notiz wurde gespeichert."
|
msgstr "Die Notiz wurde gespeichert."
|
||||||
|
|
||||||
msgid "Exits the application."
|
msgid "Exits the application."
|
||||||
msgstr "Schließt das Programm."
|
msgstr "Beendet das Programm."
|
||||||
|
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
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 "
|
"komplette Datenbank inklusive Notizbüchern, Notizen, Markierungen und "
|
||||||
"Anhängen exportiert."
|
"Anhängen exportiert."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Zielformat: %s"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Exportiert nur die angegebene Notiz."
|
msgstr "Exportiert nur die angegebene Notiz."
|
||||||
|
|
||||||
@@ -217,6 +220,8 @@ msgstr "Zeigt die Nutzungsstatistik an."
|
|||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "For information on how to customise the shortcuts please visit %s"
|
msgid "For information on how to customise the shortcuts please visit %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Für weitere Informationen über die Anpassung von Tastenkürzel besuche bitte "
|
||||||
|
"%s"
|
||||||
|
|
||||||
msgid "Shortcuts are not available in CLI mode."
|
msgid "Shortcuts are not available in CLI mode."
|
||||||
msgstr "Tastenkürzel sind im CLI Modus nicht verfügbar."
|
msgstr "Tastenkürzel sind im CLI Modus nicht verfügbar."
|
||||||
@@ -225,11 +230,12 @@ msgid ""
|
|||||||
"Type `help [command]` for more information about a command; or type `help "
|
"Type `help [command]` for more information about a command; or type `help "
|
||||||
"all` for the complete usage information."
|
"all` for the complete usage information."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Tippe `help [Befehl]` für weitere Informationen über einen Befehl; oder "
|
"Tippe `help [Befehl]` um weitere Informationen über einen Befehl zu erhalten "
|
||||||
"tippe `help all` für die vollständigen Informationen zur Befehlsverwendung."
|
"oder tippe `help all` für die vollständigen Informationen zur "
|
||||||
|
"Befehlsverwendung."
|
||||||
|
|
||||||
msgid "The possible commands are:"
|
msgid "The possible commands are:"
|
||||||
msgstr "Mögliche Befehle sind:"
|
msgstr "Mögliche Befehle lauten:"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"In any command, a note or notebook can be refered to by title or ID, or "
|
"In any command, a note or notebook can be refered to by title or ID, or "
|
||||||
@@ -238,13 +244,13 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"In jedem Befehl können Notizen oder Notizbücher durch ihren Titel oder ihre "
|
"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 "
|
"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 "
|
"das momentan ausgewählte Notizbuch oder die momentan ausgewählte Notiz "
|
||||||
"wählen. `$c` kann benutzt werden, um auf die momentane Auswahl zu verweisen."
|
"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."
|
msgid "To move from one pane to another, press Tab or Shift+Tab."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Um ein von einem Fenster zu einem anderen zu wechseln, drücke Tab oder Shift"
|
"Um von einem Fenster zu einem anderen zu wechseln, drücke Tab oder Shift+Tab."
|
||||||
"+Tab."
|
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Use the arrows and page up/down to scroll the lists and text areas "
|
"Use the arrows and page up/down to scroll the lists and text areas "
|
||||||
@@ -262,33 +268,22 @@ msgstr "Um den Kommandozeilen Modus aufzurufen, drücke \":\""
|
|||||||
msgid "To exit command line mode, press ESCAPE"
|
msgid "To exit command line mode, press ESCAPE"
|
||||||
msgstr "Um den Kommandozeilen Modus zu beenden, drücke ESCAPE"
|
msgstr "Um den Kommandozeilen Modus zu beenden, drücke ESCAPE"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Um die komplette Liste von verfügbaren Tastenkürzeln anzuzeigen, tippe `help "
|
"Um die komplette Liste aller verfügbaren Tastenkürzeln anzuzeigen, tippe "
|
||||||
"shortcuts` ein"
|
"`help keymap` ein"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Importiert eine Evernote Notizbuch-Datei (.enex Datei)."
|
msgstr "Importiert Daten in Joplin."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Quellformat: %s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Nicht nach einer Bestätigung fragen."
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Gefunden: %d."
|
msgstr "Gefunden: %d."
|
||||||
@@ -463,7 +458,7 @@ msgid "Starting synchronisation..."
|
|||||||
msgstr "Starte Synchronisation..."
|
msgstr "Starte Synchronisation..."
|
||||||
|
|
||||||
msgid "Cancelling... Please wait."
|
msgid "Cancelling... Please wait."
|
||||||
msgstr "Abbrechen... Bitte warten."
|
msgstr "Abbrechen… Bitte warten."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
||||||
@@ -525,6 +520,10 @@ msgstr "Standard: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Mögliche Werte:"
|
msgstr "Mögliche Werte:"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Zeigt die Nutzungsstatistik an."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Schwerwiegender Fehler:"
|
msgstr "Schwerwiegender Fehler:"
|
||||||
|
|
||||||
@@ -579,6 +578,17 @@ msgstr ""
|
|||||||
"Wenn du das Passwort bereits eingegeben hast, werden die verschlüsselten "
|
"Wenn du das Passwort bereits eingegeben hast, werden die verschlüsselten "
|
||||||
"Objekte im Hintergrund entschlüsselt und stehen in Kürze zur Verfügung."
|
"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"
|
msgid "File"
|
||||||
msgstr "Datei"
|
msgstr "Datei"
|
||||||
|
|
||||||
@@ -591,15 +601,18 @@ msgstr "Neues To-Do"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Neues Notizbuch"
|
msgstr "Neues Notizbuch"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Evernote Notizen importieren"
|
msgstr "Importieren"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
msgid "Export"
|
||||||
msgstr "Evernote Export Dateien"
|
msgstr "Exportieren"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr "Drucken"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
msgstr ""
|
msgstr "%s ausblenden"
|
||||||
|
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Verlassen"
|
msgstr "Verlassen"
|
||||||
@@ -620,10 +633,10 @@ msgid "Search in all the notes"
|
|||||||
msgstr "Alle Notizen durchsuchen"
|
msgstr "Alle Notizen durchsuchen"
|
||||||
|
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr ""
|
msgstr "Ansicht"
|
||||||
|
|
||||||
msgid "Toggle editor layout"
|
msgid "Toggle editor layout"
|
||||||
msgstr ""
|
msgstr "Editor Layout umschalten"
|
||||||
|
|
||||||
msgid "Tools"
|
msgid "Tools"
|
||||||
msgstr "Werkzeuge"
|
msgstr "Werkzeuge"
|
||||||
@@ -632,7 +645,7 @@ msgid "Synchronisation status"
|
|||||||
msgstr "Status der Synchronisation"
|
msgstr "Status der Synchronisation"
|
||||||
|
|
||||||
msgid "Encryption options"
|
msgid "Encryption options"
|
||||||
msgstr "Verschlüsselungsoptionen"
|
msgstr "Verschlüsselung"
|
||||||
|
|
||||||
msgid "General Options"
|
msgid "General Options"
|
||||||
msgstr "Allgemeine Einstellungen"
|
msgstr "Allgemeine Einstellungen"
|
||||||
@@ -643,8 +656,11 @@ msgstr "Hilfe"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Webseite und Dokumentation"
|
msgstr "Webseite und Dokumentation"
|
||||||
|
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Spenden"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr "Überprüfe auf Updates..."
|
||||||
|
|
||||||
msgid "About Joplin"
|
msgid "About Joplin"
|
||||||
msgstr "Über Joplin"
|
msgstr "Über Joplin"
|
||||||
@@ -653,12 +669,12 @@ msgstr "Über Joplin"
|
|||||||
msgid "%s %s (%s, %s)"
|
msgid "%s %s (%s, %s)"
|
||||||
msgstr "%s %s (%s, %s)"
|
msgstr "%s %s (%s, %s)"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "Open %s"
|
msgid "Open %s"
|
||||||
msgstr "Auf %s: %s"
|
msgstr "Öffne %s"
|
||||||
|
|
||||||
msgid "Exit"
|
msgid "Exit"
|
||||||
msgstr ""
|
msgstr "Verlassen"
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
@@ -666,33 +682,24 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr "Die aktuelle Version ist up-to-date."
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "Notizen löschen?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
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"
|
msgid "Yes"
|
||||||
msgstr ""
|
msgstr "Ja"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "N"
|
msgstr "Nein"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Synchronisation abbrechen"
|
msgstr "Überprüfen der Synchronisationseinstellungen"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Notes and settings are stored in: %s"
|
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"
|
msgid "Save"
|
||||||
msgstr "Speichern"
|
msgstr "Speichern"
|
||||||
@@ -758,15 +765,14 @@ msgstr ""
|
|||||||
"verwendet werden, abhängig davon, wie die jeweiligen Notizen oder "
|
"verwendet werden, abhängig davon, wie die jeweiligen Notizen oder "
|
||||||
"Notizbücher ursprünglich verschlüsselt wurden."
|
"Notizbücher ursprünglich verschlüsselt wurden."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Missing Master Keys"
|
msgid "Missing Master Keys"
|
||||||
msgstr "Hauptschlüssel"
|
msgstr "Fehlender Master-Key"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The master keys with these IDs are used to encrypt some of your items, "
|
"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 "
|
"however the application does not currently have access to them. It is likely "
|
||||||
"they will eventually be downloaded via synchronisation."
|
"they will eventually be downloaded via synchronisation."
|
||||||
msgstr ""
|
msgstr "Die Master-Keas dieser IDs werden für die Verschlüsselung einiger ..."
|
||||||
|
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
@@ -781,7 +787,7 @@ msgstr "Zurück"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into it"
|
"New notebook \"%s\" will be created and file \"%s\" will be imported into it"
|
||||||
msgstr ""
|
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"
|
"importiert"
|
||||||
|
|
||||||
msgid "Please create a notebook first."
|
msgid "Please create a notebook first."
|
||||||
@@ -800,7 +806,7 @@ msgid "Separate each tag by a comma."
|
|||||||
msgstr "Trenne jede Markierung mit einem Komma."
|
msgstr "Trenne jede Markierung mit einem Komma."
|
||||||
|
|
||||||
msgid "Rename notebook:"
|
msgid "Rename notebook:"
|
||||||
msgstr "Benne Notizbuch um:"
|
msgstr "Notizbuch umbenennen:"
|
||||||
|
|
||||||
msgid "Set alarm:"
|
msgid "Set alarm:"
|
||||||
msgstr "Alarm erstellen:"
|
msgstr "Alarm erstellen:"
|
||||||
@@ -847,11 +853,10 @@ msgstr ""
|
|||||||
"(+) Knopf drückst."
|
"(+) Knopf drückst."
|
||||||
|
|
||||||
msgid "Open..."
|
msgid "Open..."
|
||||||
msgstr ""
|
msgstr "Öffne..."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Save as..."
|
msgid "Save as..."
|
||||||
msgstr "Änderungen speichern"
|
msgstr "Sichern unter..."
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Unsupported link or message: %s"
|
msgid "Unsupported link or message: %s"
|
||||||
@@ -866,17 +871,23 @@ msgstr "Markierungen"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Alarm erstellen"
|
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"
|
msgid "to-do"
|
||||||
msgstr "Neues To-Do"
|
msgstr "To-Do"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "note"
|
msgid "note"
|
||||||
msgstr "Neue Notiz"
|
msgstr "Notiz"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "Creating new %s..."
|
msgid "Creating new %s..."
|
||||||
msgstr "Importiere Notizen..."
|
msgstr "Erstelle neue %s..."
|
||||||
|
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Aktualisieren"
|
msgstr "Aktualisieren"
|
||||||
@@ -887,9 +898,6 @@ msgstr "Leeren"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "OneDrive Login"
|
msgstr "OneDrive Login"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Importieren"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Optionen"
|
msgstr "Optionen"
|
||||||
|
|
||||||
@@ -932,9 +940,8 @@ msgstr "Unbekanntes Argument: %s"
|
|||||||
msgid "File system"
|
msgid "File system"
|
||||||
msgstr "Dateisystem"
|
msgstr "Dateisystem"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Nextcloud"
|
msgid "Nextcloud"
|
||||||
msgstr "Nextcloud (Beta)"
|
msgstr "Nextcloud"
|
||||||
|
|
||||||
msgid "OneDrive"
|
msgid "OneDrive"
|
||||||
msgstr "OneDrive"
|
msgstr "OneDrive"
|
||||||
@@ -942,9 +949,8 @@ msgstr "OneDrive"
|
|||||||
msgid "OneDrive Dev (For testing only)"
|
msgid "OneDrive Dev (For testing only)"
|
||||||
msgstr "OneDrive Dev (Nur für Tests)"
|
msgstr "OneDrive Dev (Nur für Tests)"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV"
|
msgid "WebDAV"
|
||||||
msgstr "Nextcloud WebDAV URL"
|
msgstr "WebDAV"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Unknown log level: %s"
|
msgid "Unknown log level: %s"
|
||||||
@@ -1008,8 +1014,8 @@ msgstr "Remote Objekte gelöscht: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "Geladene Objekte: %d/%d."
|
msgstr "Geladene Objekte: %d/%d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "Status: \"%s\"."
|
msgstr "Status: \"%s\"."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -1019,6 +1025,16 @@ msgstr "Abbrechen..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Abgeschlossen: %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
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "Synchronisation ist bereits im Gange. Status: %s"
|
msgstr "Synchronisation ist bereits im Gange. Status: %s"
|
||||||
@@ -1027,7 +1043,7 @@ msgid "Encrypted"
|
|||||||
msgstr "Verschlüsselt"
|
msgstr "Verschlüsselt"
|
||||||
|
|
||||||
msgid "Encrypted items cannot be modified"
|
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"
|
msgid "Conflicts"
|
||||||
msgstr "Konflikte"
|
msgstr "Konflikte"
|
||||||
@@ -1084,33 +1100,45 @@ msgstr "Hell"
|
|||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Dunkel"
|
msgstr "Dunkel"
|
||||||
|
|
||||||
#, fuzzy
|
msgid "Uncompleted to-dos on top"
|
||||||
msgid "Show uncompleted to-dos on top of the lists"
|
msgstr "Zeige unvollständige To-Dos an oberster Stelle"
|
||||||
msgstr "Zeige unvollständige To-Dos oben in der Liste"
|
|
||||||
|
msgid "Sort notes by"
|
||||||
|
msgstr "Sortiere Notizen nach"
|
||||||
|
|
||||||
|
msgid "Reverse sort order"
|
||||||
|
msgstr "Sortierreihenfolge umdrehen"
|
||||||
|
|
||||||
msgid "Save geo-location with notes"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Momentanen Standort zusammen mit Notizen speichern"
|
msgstr "Momentanen Standort zusammen mit Notizen speichern"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "When creating a new to-do:"
|
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"
|
msgid "Focus title"
|
||||||
msgstr "Notiz Titel:"
|
msgstr "Fokussiere Titel"
|
||||||
|
|
||||||
msgid "Focus body"
|
msgid "Focus body"
|
||||||
msgstr ""
|
msgstr "Fokussiere Inhalt"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "When creating a new note:"
|
msgid "When creating a new note:"
|
||||||
msgstr "Erstellt eine neue Notiz."
|
msgstr "Wenn eine neue Notiz erstellt wird:"
|
||||||
|
|
||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr "Zeige Tray Icon"
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
msgid "Global zoom percentage"
|
||||||
msgstr "Einstellen des Anwendungszooms"
|
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"
|
msgid "Automatically update the application"
|
||||||
msgstr "Die Applikation automatisch aktualisieren"
|
msgstr "Die Applikation automatisch aktualisieren"
|
||||||
@@ -1163,22 +1191,57 @@ msgstr "Nextcloud Benutzername"
|
|||||||
msgid "Nextcloud password"
|
msgid "Nextcloud password"
|
||||||
msgstr "Nextcloud Passwort"
|
msgstr "Nextcloud Passwort"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV URL"
|
msgid "WebDAV URL"
|
||||||
msgstr "Nextcloud WebDAV URL"
|
msgstr "WebDAV URL"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV username"
|
msgid "WebDAV username"
|
||||||
msgstr "Nextcloud Benutzername"
|
msgstr "WebDAV Benutzername"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV password"
|
msgid "WebDAV password"
|
||||||
msgstr "Setze ein Passwort"
|
msgstr "WebDAV Passwort"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Ungültiger Optionswert: \"%s\". Mögliche Werte sind: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Objekte können nicht synchronisiert werden"
|
msgstr "Objekte können nicht synchronisiert werden"
|
||||||
|
|
||||||
@@ -1267,6 +1330,9 @@ msgstr "Bestätigen"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Synchronisation abbrechen"
|
msgstr "Synchronisation abbrechen"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr "Website von Joplin"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr "Hauptschlüssel %s"
|
msgstr "Hauptschlüssel %s"
|
||||||
@@ -1292,10 +1358,10 @@ msgid "Edit notebook"
|
|||||||
msgstr "Notizbuch bearbeiten"
|
msgstr "Notizbuch bearbeiten"
|
||||||
|
|
||||||
msgid "Show all"
|
msgid "Show all"
|
||||||
msgstr ""
|
msgstr "Zeige Alles"
|
||||||
|
|
||||||
msgid "Errors only"
|
msgid "Errors only"
|
||||||
msgstr ""
|
msgstr "Nur Fehler"
|
||||||
|
|
||||||
msgid "This note has been modified:"
|
msgid "This note has been modified:"
|
||||||
msgstr "Diese Notiz wurde verändert:"
|
msgstr "Diese Notiz wurde verändert:"
|
||||||
@@ -1353,6 +1419,34 @@ msgstr ""
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Willkommen"
|
msgstr "Willkommen"
|
||||||
|
|
||||||
|
#~ 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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Das nächste Fenster fokussieren"
|
#~ msgstr "Das nächste Fenster fokussieren"
|
||||||
|
|
||||||
|
@@ -174,10 +174,14 @@ msgid "Exits the application."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -232,22 +236,16 @@ msgid ""
|
|||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr ""
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -451,6 +449,9 @@ msgstr ""
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -488,6 +489,17 @@ msgid ""
|
|||||||
"background and will be available soon."
|
"background and will be available soon."
|
||||||
msgstr ""
|
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"
|
msgid "File"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -500,10 +512,13 @@ msgstr ""
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
@@ -552,6 +567,9 @@ msgstr ""
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -575,11 +593,7 @@ msgstr ""
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
@@ -591,9 +605,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -753,6 +764,12 @@ msgstr ""
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -772,9 +789,6 @@ msgstr ""
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -883,7 +897,7 @@ msgid "Fetched items: %d/%d."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -893,6 +907,16 @@ msgstr ""
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -954,7 +978,13 @@ msgstr ""
|
|||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Save geo-location with notes"
|
msgid "Save geo-location with notes"
|
||||||
@@ -975,7 +1005,15 @@ msgstr ""
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
@@ -1037,6 +1075,41 @@ msgstr ""
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr ""
|
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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1120,6 +1193,9 @@ msgstr ""
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@@ -189,12 +189,16 @@ msgid "Exits the application."
|
|||||||
msgstr "Sale de la aplicación."
|
msgstr "Sale de la aplicación."
|
||||||
|
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Exporta datos de Joplin al directorio indicado. Por defecto, se exportará la "
|
"Exporta datos de Joplin al directorio indicado. Por defecto, se exportará la "
|
||||||
"base de datos completa incluyendo libretas, notas, etiquetas y recursos."
|
"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."
|
msgid "Exports only the given note."
|
||||||
msgstr "Exporta únicamente la nota indicada."
|
msgstr "Exporta únicamente la nota indicada."
|
||||||
|
|
||||||
@@ -260,26 +264,16 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Para una lista de los atajos de teclado disponibles, escriba `help keymap`"
|
"Para una lista de los atajos de teclado disponibles, escriba `help keymap`"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Importar una libreta de Evernote (archivo .enex)."
|
msgstr "Importa los datos en Joplin."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Formato de origen: %s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "No requiere confirmación."
|
msgstr "No requiere 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?"
|
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Encontrado: %d."
|
msgstr "Encontrado: %d."
|
||||||
@@ -511,6 +505,9 @@ msgstr "Por defecto: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Claves/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:"
|
msgid "Fatal error:"
|
||||||
msgstr "Error fatal:"
|
msgstr "Error fatal:"
|
||||||
|
|
||||||
@@ -566,6 +563,17 @@ msgstr ""
|
|||||||
"proporcionado la contraseña, los elementos están siendo descifrados en "
|
"proporcionado la contraseña, los elementos están siendo descifrados en "
|
||||||
"segundo plano y estarán disponibles en breve."
|
"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"
|
msgid "File"
|
||||||
msgstr "Archivo"
|
msgstr "Archivo"
|
||||||
|
|
||||||
@@ -578,11 +586,14 @@ msgstr "Nueva lista de tareas"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Nueva libreta"
|
msgstr "Nueva libreta"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Importar notas de Evernote"
|
msgstr "Importar"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
msgid "Export"
|
||||||
msgstr "Archivos exportados de Evernote"
|
msgstr "Exportar"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr "Imprimir"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -630,6 +641,9 @@ msgstr "Ayuda"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Sitio web y documentación"
|
msgstr "Sitio web y documentación"
|
||||||
|
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Hacer una donación"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr "Comprobar actualizaciones..."
|
msgstr "Comprobar actualizaciones..."
|
||||||
|
|
||||||
@@ -653,15 +667,8 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr "La versión actual está actualizada."
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr ""
|
|
||||||
"Notas de la versión:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr "Hay disponible una actualización. ¿Quiere descargarla ahora?"
|
msgstr "Hay disponible una actualización. ¿Quiere descargarla ahora?"
|
||||||
@@ -672,9 +679,6 @@ msgstr "Sí"
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "No"
|
msgstr "No"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr "La versión actual está actualizada."
|
|
||||||
|
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Comprobar sincronización"
|
msgstr "Comprobar sincronización"
|
||||||
|
|
||||||
@@ -847,6 +851,14 @@ msgstr "Etiquetas"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Establecer alarma"
|
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"
|
msgid "to-do"
|
||||||
msgstr "lista de tareas"
|
msgstr "lista de tareas"
|
||||||
|
|
||||||
@@ -866,9 +878,6 @@ msgstr "Limpiar"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "Inicio de sesión de OneDrive"
|
msgstr "Inicio de sesión de OneDrive"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Importar"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Opciones"
|
msgstr "Opciones"
|
||||||
|
|
||||||
@@ -984,8 +993,8 @@ msgstr "Elementos remotos borrados: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "Elementos obtenidos: %d/%d."
|
msgstr "Elementos obtenidos: %d/%d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "Estado: «%s»."
|
msgstr "Estado: «%s»."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -995,6 +1004,16 @@ msgstr "Cancelando..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Completado: %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
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "La sincronización ya está en progreso. Estado: %s"
|
msgstr "La sincronización ya está en progreso. Estado: %s"
|
||||||
@@ -1059,9 +1078,15 @@ msgstr "Claro"
|
|||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Oscuro"
|
msgstr "Oscuro"
|
||||||
|
|
||||||
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"
|
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"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Guardar geolocalización en las notas"
|
msgstr "Guardar geolocalización en las notas"
|
||||||
|
|
||||||
@@ -1080,9 +1105,19 @@ msgstr "Cuando se crear una nota nueva:"
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr "Mostrar icono en la bandeja"
|
msgstr "Mostrar icono en la bandeja"
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
msgid "Global zoom percentage"
|
||||||
msgstr "Establecer el porcentaje de aumento de la aplicación"
|
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"
|
msgid "Automatically update the application"
|
||||||
msgstr "Actualizar la aplicación automáticamente"
|
msgstr "Actualizar la aplicación automáticamente"
|
||||||
|
|
||||||
@@ -1147,6 +1182,43 @@ msgstr "Contraseña de WebDAV"
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Opción inválida: «%s». Los valores posibles son: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Elementos que no se pueden sincronizar"
|
msgstr "Elementos que no se pueden sincronizar"
|
||||||
|
|
||||||
@@ -1233,6 +1305,9 @@ msgstr "Confirmar"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Cancelar sincronización"
|
msgstr "Cancelar sincronización"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr "Sitio web de Joplin"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr "Clave maestra %s"
|
msgstr "Clave maestra %s"
|
||||||
@@ -1317,6 +1392,34 @@ msgstr ""
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Bienvenido"
|
msgstr "Bienvenido"
|
||||||
|
|
||||||
|
#~ 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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Enfocar el siguiente panel"
|
#~ msgstr "Enfocar el siguiente panel"
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
# Copyright (C) YEAR Laurent Cozic
|
# Copyright (C) YEAR Laurent Cozic
|
||||||
# This file is distributed under the same license as the Joplin-CLI package.
|
# This file is distributed under the same license as the Joplin-CLI package.
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||||
@@ -189,10 +189,14 @@ msgstr "Irten aplikaziotik."
|
|||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr "Esportatu Joplineko datuak esandako karpetara"
|
msgstr "Esportatu Joplineko datuak esandako karpetara"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Data-formatua"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Esportatu emandako oharra soilik."
|
msgstr "Esportatu emandako oharra soilik."
|
||||||
|
|
||||||
@@ -256,26 +260,16 @@ msgid ""
|
|||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr "Laster bideen zerrenda osoa ikusteko, idatzi `help shortcuts`"
|
msgstr "Laster bideen zerrenda osoa ikusteko, idatzi `help shortcuts`"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Inportatu Evernote koaderno fitxategia (.enex fitxategia)."
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Ez dago komandorik: %s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Ez galdetu berresteko."
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Aurkitua: %d"
|
msgstr "Aurkitua: %d"
|
||||||
@@ -509,6 +503,10 @@ msgstr "Lehenetsia: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Litezkeen balioak:"
|
msgstr "Litezkeen balioak:"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Erakutsi erabilera datuak."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Aio! Agur! :_( "
|
msgstr "Aio! Agur! :_( "
|
||||||
|
|
||||||
@@ -562,6 +560,18 @@ msgstr ""
|
|||||||
"Dagoeneko pasahitza ordezkatua baduzu, itemak deszifratzen ari izango dira "
|
"Dagoeneko pasahitza ordezkatua baduzu, itemak deszifratzen ari izango dira "
|
||||||
"atzeko planoan eta laster izango dira eskuragarri."
|
"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"
|
msgid "File"
|
||||||
msgstr "Fitxategia"
|
msgstr "Fitxategia"
|
||||||
|
|
||||||
@@ -574,11 +584,15 @@ msgstr "Zeregin berria"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Koaderno berria"
|
msgstr "Koaderno berria"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Inportatu Evernoteko oharrak"
|
msgstr "Inportatu"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
#, fuzzy
|
||||||
msgstr "Evernotetik esportatutako fitxategiak"
|
msgid "Export"
|
||||||
|
msgstr "Inportatu"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -626,6 +640,10 @@ msgstr "Laguntza"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Web orria eta dokumentazioa (en)"
|
msgstr "Web orria eta dokumentazioa (en)"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Web orria eta dokumentazioa (en)"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -649,12 +667,8 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Utzi"
|
msgstr "Utzi"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr ""
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "Oharrak ezabatu?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -666,9 +680,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "E"
|
msgstr "E"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Sinkronizazioa utzi"
|
msgstr "Sinkronizazioa utzi"
|
||||||
@@ -844,6 +855,12 @@ msgstr "Etiketak"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Ezarri alarma"
|
msgstr "Ezarri alarma"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr "Zeregin berria"
|
msgstr "Zeregin berria"
|
||||||
@@ -866,9 +883,6 @@ msgstr "Garbitu"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "Logeatu OneDriven"
|
msgstr "Logeatu OneDriven"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Inportatu"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Aukerak"
|
msgstr "Aukerak"
|
||||||
|
|
||||||
@@ -986,8 +1000,8 @@ msgstr "Urruneko itemak ezabatuta: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "Itemak eskuratuta: %d%d."
|
msgstr "Itemak eskuratuta: %d%d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "Egoera: \"%s\"."
|
msgstr "Egoera: \"%s\"."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -997,6 +1011,16 @@ msgstr "Bertan behera uzten..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Osatuta: %s"
|
msgstr "Osatuta: %s"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr "Aio! Agur! :_( "
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "Sinkronizazioa hasita dago. Egoera: %s"
|
msgstr "Sinkronizazioa hasita dago. Egoera: %s"
|
||||||
@@ -1062,9 +1086,16 @@ msgid "Dark"
|
|||||||
msgstr "Iluna"
|
msgstr "Iluna"
|
||||||
|
|
||||||
#, fuzzy
|
#, 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"
|
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"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Gore geokokapena oharrekin"
|
msgstr "Gore geokokapena oharrekin"
|
||||||
|
|
||||||
@@ -1085,9 +1116,18 @@ msgstr "Ohar berria sortzen du."
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
#, fuzzy
|
||||||
|
msgid "Global zoom percentage"
|
||||||
msgstr "Ezarri aplikazioaren zoomaren ehunekoa"
|
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"
|
msgid "Automatically update the application"
|
||||||
msgstr "Automatikoki eguneratu aplikazioa"
|
msgstr "Automatikoki eguneratu aplikazioa"
|
||||||
|
|
||||||
@@ -1154,6 +1194,44 @@ msgstr "Ezarri pasahitza"
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Balio aukera baliogabea: \"%s\". Litezkeen balioak: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Itemok ezin sinkronizatu"
|
msgstr "Itemok ezin sinkronizatu"
|
||||||
|
|
||||||
@@ -1239,6 +1317,9 @@ msgstr "Baieztatu"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Sinkronizazioa utzi"
|
msgstr "Sinkronizazioa utzi"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr "Pasahitz Nagusia %s"
|
msgstr "Pasahitz Nagusia %s"
|
||||||
@@ -1322,6 +1403,32 @@ msgstr "Oraindik ez duzu koadernorik. Sortu bat (+) botoian sakatuta."
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Ongi etorri!"
|
msgstr "Ongi etorri!"
|
||||||
|
|
||||||
|
#, 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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Eraman fokua hurrengo panelera"
|
#~ msgstr "Eraman fokua hurrengo panelera"
|
||||||
|
|
||||||
|
@@ -14,6 +14,8 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Generator: Poedit 2.0.3\n"
|
"X-Generator: Poedit 2.0.3\n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
|
||||||
msgid "To delete a tag, untag the associated notes."
|
msgid "To delete a tag, untag the associated notes."
|
||||||
msgstr "Pour supprimer une vignette, enlever là des notes associées."
|
msgstr "Pour supprimer une vignette, enlever là des notes associées."
|
||||||
@@ -95,8 +97,8 @@ msgid ""
|
|||||||
"current configuration."
|
"current configuration."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Obtient ou modifie une valeur de configuration. Si la [valeur] n'est pas "
|
"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 "
|
"fournie, la valeur de [nom] sera affichée. Si ni le [nom] ni la [valeur] ne "
|
||||||
"sont fournis, la configuration complète est affichée."
|
"sont fournis, la configuration complète sera affichée."
|
||||||
|
|
||||||
msgid "Also displays unset and hidden config variables."
|
msgid "Also displays unset and hidden config variables."
|
||||||
msgstr "Afficher également les variables cachées."
|
msgstr "Afficher également les variables cachées."
|
||||||
@@ -188,12 +190,15 @@ msgid "Exits the application."
|
|||||||
msgstr "Quitter le logiciel."
|
msgstr "Quitter le logiciel."
|
||||||
|
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Exporter les données de Joplin vers le dossier fourni. Par défaut, la base "
|
"Exporter les données de Joplin. Par défaut, la base de donnée complète sera "
|
||||||
"de donnée complète sera exportée, y compris les carnets, notes, tags et "
|
"exportée, y compris les carnets, notes, tags et ressources."
|
||||||
"resources."
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Format de la destination : %s"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Exporter uniquement la note spécifiée."
|
msgstr "Exporter uniquement la note spécifiée."
|
||||||
@@ -258,25 +263,16 @@ msgid ""
|
|||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr "Pour la liste complète des raccourcis disponibles, tapez `help keymap`"
|
msgstr "Pour la liste complète des raccourcis disponibles, tapez `help keymap`"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Importer un carnet Evernote (fichier .enex)."
|
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."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Ne pas demander de 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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Trouvés : %d."
|
msgstr "Trouvés : %d."
|
||||||
@@ -510,6 +506,9 @@ msgstr "Défaut : %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Clefs/Valeurs possibles :"
|
msgstr "Clefs/Valeurs possibles :"
|
||||||
|
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Tapez `Joplin help` pour afficher l'aide."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Erreur fatale :"
|
msgstr "Erreur fatale :"
|
||||||
|
|
||||||
@@ -563,6 +562,17 @@ msgstr ""
|
|||||||
"decrypt`. Si vous avez déjà fourni ce mot de passe, les objets cryptés vont "
|
"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."
|
"ê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"
|
msgid "File"
|
||||||
msgstr "Fichier"
|
msgstr "Fichier"
|
||||||
|
|
||||||
@@ -575,11 +585,14 @@ msgstr "Nouvelle tâche"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Nouveau carnet"
|
msgstr "Nouveau carnet"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Importer notes d'Evernote"
|
msgstr "Importer"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
msgid "Export"
|
||||||
msgstr "Fichiers d'export Evernote"
|
msgstr "Exporter"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr "Imprimer"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -627,6 +640,9 @@ msgstr "Aide"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Documentation en ligne"
|
msgstr "Documentation en ligne"
|
||||||
|
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Faire un don"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr "Vérifier les mises à jour..."
|
msgstr "Vérifier les mises à jour..."
|
||||||
|
|
||||||
@@ -650,15 +666,8 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
#, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr "La version actuelle est à jour."
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr ""
|
|
||||||
"Notes de version :\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -670,9 +679,6 @@ msgstr "Oui"
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "Non"
|
msgstr "Non"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr "La version actuelle est à jour."
|
|
||||||
|
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Vérifier config synchronisation"
|
msgstr "Vérifier config synchronisation"
|
||||||
|
|
||||||
@@ -852,6 +858,14 @@ msgstr "Étiquettes"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Régler alarme"
|
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"
|
msgid "to-do"
|
||||||
msgstr "tâche"
|
msgstr "tâche"
|
||||||
|
|
||||||
@@ -871,9 +885,6 @@ msgstr "Supprimer"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "Connexion OneDrive"
|
msgstr "Connexion OneDrive"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Importer"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Options"
|
msgstr "Options"
|
||||||
|
|
||||||
@@ -991,8 +1002,8 @@ msgid "Fetched items: %d/%d."
|
|||||||
msgstr "Téléchargés : %d/%d."
|
msgstr "Téléchargés : %d/%d."
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "État : \"%s\"."
|
msgstr "État : %s."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
msgstr "Annulation..."
|
msgstr "Annulation..."
|
||||||
@@ -1001,6 +1012,16 @@ msgstr "Annulation..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Terminé : %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
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "La synchronisation est déjà en cours. État : %s"
|
msgstr "La synchronisation est déjà en cours. État : %s"
|
||||||
@@ -1064,8 +1085,14 @@ msgstr "Clair"
|
|||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Sombre"
|
msgstr "Sombre"
|
||||||
|
|
||||||
msgid "Show uncompleted to-dos on top of the lists"
|
msgid "Uncompleted to-dos on top"
|
||||||
msgstr "Tâches non-terminées en haut des listes"
|
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"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Enregistrer l'emplacement avec les notes"
|
msgstr "Enregistrer l'emplacement avec les notes"
|
||||||
@@ -1085,9 +1112,19 @@ msgstr "Lors de la création d'une note :"
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr "Afficher icône dans la zone de notifications"
|
msgstr "Afficher icône dans la zone de notifications"
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
msgid "Global zoom percentage"
|
||||||
msgstr "Niveau de zoom"
|
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"
|
msgid "Automatically update the application"
|
||||||
msgstr "Mettre à jour le logiciel automatiquement"
|
msgstr "Mettre à jour le logiciel automatiquement"
|
||||||
|
|
||||||
@@ -1152,6 +1189,43 @@ msgstr "WebDAV : Mot de passe"
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Option invalide: \"%s\". Les valeurs possibles sont : %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Objets qui ne peuvent pas être synchronisés"
|
msgstr "Objets qui ne peuvent pas être synchronisés"
|
||||||
|
|
||||||
@@ -1240,6 +1314,9 @@ msgstr "Confirmer"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Annuler synchronisation"
|
msgstr "Annuler synchronisation"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr "Site web de Joplin"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr "Clef maître %s"
|
msgstr "Clef maître %s"
|
||||||
@@ -1325,6 +1402,34 @@ msgstr ""
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Bienvenue"
|
msgstr "Bienvenue"
|
||||||
|
|
||||||
|
#~ 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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Activer le volet suivant"
|
#~ msgstr "Activer le volet suivant"
|
||||||
|
|
||||||
|
@@ -188,13 +188,18 @@ msgstr "Bilješka je spremljena."
|
|||||||
msgid "Exits the application."
|
msgid "Exits the application."
|
||||||
msgstr "Izlaz iz aplikacije."
|
msgstr "Izlaz iz aplikacije."
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Izvozi podatke u dati direktorij. Po defaultu izvozi sve podatke uključujući "
|
"Izvozi podatke u dati direktorij. Po defaultu izvozi sve podatke uključujući "
|
||||||
"bilježnice, bilješke, zadatke i resurse."
|
"bilježnice, bilješke, zadatke i resurse."
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Format datuma"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Izvozi samo datu bilješku."
|
msgstr "Izvozi samo datu bilješku."
|
||||||
|
|
||||||
@@ -259,25 +264,16 @@ msgid ""
|
|||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr "Za potpunu listu mogućih prečaca, upiši `help shortcuts`"
|
msgstr "Za potpunu listu mogućih prečaca, upiši `help shortcuts`"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Uvozi Evernote bilježnicu (.enex datoteku)."
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Ne postoji naredba: %s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Ne pitaj za potvrdu."
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Nađeno: %d."
|
msgstr "Nađeno: %d."
|
||||||
@@ -514,6 +510,10 @@ msgstr "Default: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Mogući ključevi/vrijednosti:"
|
msgstr "Mogući ključevi/vrijednosti:"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Prikazuje informacije o korištenju."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Fatalna greška:"
|
msgstr "Fatalna greška:"
|
||||||
|
|
||||||
@@ -562,6 +562,18 @@ msgid ""
|
|||||||
"background and will be available soon."
|
"background and will be available soon."
|
||||||
msgstr ""
|
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"
|
msgid "File"
|
||||||
msgstr "Datoteka"
|
msgstr "Datoteka"
|
||||||
|
|
||||||
@@ -574,11 +586,15 @@ msgstr "Novi zadatak"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Nova bilježnica"
|
msgstr "Nova bilježnica"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Uvezi Evernote bilješke"
|
msgstr "Uvoz"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
#, fuzzy
|
||||||
msgstr "Evernote izvozne datoteke"
|
msgid "Export"
|
||||||
|
msgstr "Uvoz"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -627,6 +643,10 @@ msgstr "Pomoć"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Website i dokumentacija"
|
msgstr "Website i dokumentacija"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Website i dokumentacija"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -650,12 +670,8 @@ msgstr "U redu"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Odustani"
|
msgstr "Odustani"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr ""
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "Obriši bilješke?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -667,9 +683,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "N"
|
msgstr "N"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Prekini sinkronizaciju"
|
msgstr "Prekini sinkronizaciju"
|
||||||
@@ -834,6 +847,12 @@ msgstr "Oznake"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Postavi upozorenje"
|
msgstr "Postavi upozorenje"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr "Novi zadatak"
|
msgstr "Novi zadatak"
|
||||||
@@ -855,9 +874,6 @@ msgstr "Očisti"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "OneDrive Login"
|
msgstr "OneDrive Login"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Uvoz"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Opcije"
|
msgstr "Opcije"
|
||||||
|
|
||||||
@@ -971,8 +987,8 @@ msgstr "Obrisane udaljene stavke: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "Stvorene lokalne stavke: %d."
|
msgstr "Stvorene lokalne stavke: %d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "Stanje: \"%s\"."
|
msgstr "Stanje: \"%s\"."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -982,6 +998,16 @@ msgstr "Prekidam..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Dovršeno: %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
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "Sinkronizacija je već u toku. Stanje: %s"
|
msgstr "Sinkronizacija je već u toku. Stanje: %s"
|
||||||
@@ -1047,9 +1073,16 @@ msgid "Dark"
|
|||||||
msgstr "Tamna"
|
msgstr "Tamna"
|
||||||
|
|
||||||
#, fuzzy
|
#, 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"
|
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"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Spremi geolokacijske podatke sa bilješkama"
|
msgstr "Spremi geolokacijske podatke sa bilješkama"
|
||||||
|
|
||||||
@@ -1071,7 +1104,15 @@ msgstr "Stvara novu bilješku."
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
@@ -1135,6 +1176,44 @@ msgstr ""
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Nevažeća vrijednost: \"%s\". Moguće vrijednosti su: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Stavke koje se ne mogu sinkronizirati"
|
msgstr "Stavke koje se ne mogu sinkronizirati"
|
||||||
|
|
||||||
@@ -1218,6 +1297,9 @@ msgstr "Potvrdi"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Prekini sinkronizaciju"
|
msgstr "Prekini sinkronizaciju"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1302,6 +1384,31 @@ msgstr "Trenutno nemaš nijednu bilježnicu. Stvori novu klikom na (+) gumb."
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Dobro došli"
|
msgstr "Dobro došli"
|
||||||
|
|
||||||
|
#, 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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Fokusiraj sljedeće okno"
|
#~ msgstr "Fokusiraj sljedeće okno"
|
||||||
|
|
||||||
|
@@ -183,14 +183,19 @@ msgstr "La nota è stata salvata."
|
|||||||
msgid "Exits the application."
|
msgid "Exits the application."
|
||||||
msgstr "Esci dall'applicazione."
|
msgstr "Esci dall'applicazione."
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Esporta i dati da Joplin nella directory selezionata. Come impostazione "
|
"Esporta i dati da Joplin nella directory selezionata. Come impostazione "
|
||||||
"predefinita verrà esportato il database completo, inclusi blocchi note, "
|
"predefinita verrà esportato il database completo, inclusi blocchi note, "
|
||||||
"note, etichette e risorse."
|
"note, etichette e risorse."
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Formato della data"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Esporta solo la seguente nota."
|
msgstr "Esporta solo la seguente nota."
|
||||||
|
|
||||||
@@ -255,25 +260,16 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Per la lista completa delle scorciatoie disponibili, digita `help shortcuts`"
|
"Per la lista completa delle scorciatoie disponibili, digita `help shortcuts`"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Importa un file blocco note di Evernote (.enex file)."
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Nessun comando: %s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Non chiedere conferma."
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Trovato: %d."
|
msgstr "Trovato: %d."
|
||||||
@@ -500,6 +496,10 @@ msgstr "Predefinito: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Chiave/valore possibili:"
|
msgstr "Chiave/valore possibili:"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Mostra le informazioni di utilizzo."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Errore fatale:"
|
msgstr "Errore fatale:"
|
||||||
|
|
||||||
@@ -544,6 +544,18 @@ msgid ""
|
|||||||
"background and will be available soon."
|
"background and will be available soon."
|
||||||
msgstr ""
|
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"
|
msgid "File"
|
||||||
msgstr "File"
|
msgstr "File"
|
||||||
|
|
||||||
@@ -556,11 +568,15 @@ msgstr "Nuova attività"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Nuovo blocco note"
|
msgstr "Nuovo blocco note"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Importa le note da Evernote"
|
msgstr "Importa"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
#, fuzzy
|
||||||
msgstr "Esposta i files di Evernote"
|
msgid "Export"
|
||||||
|
msgstr "Importa"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -609,6 +625,10 @@ msgstr "Aiuto"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Sito web e documentazione"
|
msgstr "Sito web e documentazione"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Sito web e documentazione"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -632,12 +652,8 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancella"
|
msgstr "Cancella"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr ""
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "Eliminare le note?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -649,9 +665,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "N"
|
msgstr "N"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Cancella la sincronizzazione"
|
msgstr "Cancella la sincronizzazione"
|
||||||
@@ -817,6 +830,12 @@ msgstr "Etichette"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Imposta allarme"
|
msgstr "Imposta allarme"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr "Nuova attività"
|
msgstr "Nuova attività"
|
||||||
@@ -838,9 +857,6 @@ msgstr "Pulisci"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "Login OneDrive"
|
msgstr "Login OneDrive"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Importa"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Opzioni"
|
msgstr "Opzioni"
|
||||||
|
|
||||||
@@ -957,8 +973,8 @@ msgstr "Elementi remoti eliminati: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "Elementi locali creati: %d."
|
msgstr "Elementi locali creati: %d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "Stato: \"%s\"."
|
msgstr "Stato: \"%s\"."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -968,6 +984,16 @@ msgstr "Cancellazione..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Completata: %s"
|
msgstr "Completata: %s"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr "Errore fatale:"
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "La sincronizzazione è già in corso. Stato: %s"
|
msgstr "La sincronizzazione è già in corso. Stato: %s"
|
||||||
@@ -1033,9 +1059,16 @@ msgid "Dark"
|
|||||||
msgstr "Scuro"
|
msgstr "Scuro"
|
||||||
|
|
||||||
#, fuzzy
|
#, 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"
|
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"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Salva geo-localizzazione con le note"
|
msgstr "Salva geo-localizzazione con le note"
|
||||||
|
|
||||||
@@ -1057,7 +1090,15 @@ msgstr "Crea una nuova nota."
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
@@ -1121,6 +1162,44 @@ msgstr ""
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Oprione non valida: \"%s\". I valori possibili sono: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Elementi che non possono essere sincronizzati"
|
msgstr "Elementi che non possono essere sincronizzati"
|
||||||
|
|
||||||
@@ -1204,6 +1283,9 @@ msgstr "Conferma"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Cancella la sincronizzazione"
|
msgstr "Cancella la sincronizzazione"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1290,6 +1372,32 @@ msgstr ""
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Benvenuto"
|
msgstr "Benvenuto"
|
||||||
|
|
||||||
|
#, 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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Pannello successivo"
|
#~ msgstr "Pannello successivo"
|
||||||
|
|
||||||
|
@@ -182,13 +182,18 @@ msgstr "ノートは保存されました。"
|
|||||||
msgid "Exits the application."
|
msgid "Exits the application."
|
||||||
msgstr "アプリケーションの終了。"
|
msgstr "アプリケーションの終了。"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Joplinのデータを選択されたディレクトリに出力する。標準では、ノートブック・"
|
"Joplinのデータを選択されたディレクトリに出力する。標準では、ノートブック・"
|
||||||
"ノート・タグ・添付データを含むすべてのデータベースを出力します。"
|
"ノート・タグ・添付データを含むすべてのデータベースを出力します。"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "日付の形式"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "選択されたノートのみを出力する。"
|
msgstr "選択されたノートのみを出力する。"
|
||||||
|
|
||||||
@@ -251,25 +256,16 @@ msgstr ""
|
|||||||
"有効なすべてのキーボードショートカットを表示するには、`help shortcuts`と入力"
|
"有効なすべてのキーボードショートカットを表示するには、`help shortcuts`と入力"
|
||||||
"してください。"
|
"してください。"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Evernoteノートブックファイル(.enex)のインポート"
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "コマンドが違います:%s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "確認を行わない。"
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "見つかりました:%d"
|
msgstr "見つかりました:%d"
|
||||||
@@ -496,6 +492,10 @@ msgstr "規定値: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "取り得るキーバリュー: "
|
msgstr "取り得るキーバリュー: "
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "使い方を表示する。"
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "致命的なエラー: "
|
msgstr "致命的なエラー: "
|
||||||
|
|
||||||
@@ -545,6 +545,18 @@ msgid ""
|
|||||||
"background and will be available soon."
|
"background and will be available soon."
|
||||||
msgstr ""
|
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"
|
msgid "File"
|
||||||
msgstr "ファイル"
|
msgstr "ファイル"
|
||||||
|
|
||||||
@@ -557,11 +569,15 @@ msgstr "新しいToDo"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "新しいノートブック"
|
msgstr "新しいノートブック"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Evernoteのインポート"
|
msgstr "インポート"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
#, fuzzy
|
||||||
msgstr "Evernote Exportファイル"
|
msgid "Export"
|
||||||
|
msgstr "インポート"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -610,6 +626,10 @@ msgstr "ヘルプ"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Webサイトとドキュメント"
|
msgstr "Webサイトとドキュメント"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Webサイトとドキュメント"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -633,12 +653,8 @@ msgstr ""
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "キャンセル"
|
msgstr "キャンセル"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr ""
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "ノートを削除しますか?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -649,9 +665,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "同期の中止"
|
msgstr "同期の中止"
|
||||||
@@ -820,6 +833,12 @@ msgstr "タグ"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "アラームをセット"
|
msgstr "アラームをセット"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr "新しいToDo"
|
msgstr "新しいToDo"
|
||||||
@@ -841,9 +860,6 @@ msgstr "クリア"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "OneDriveログイン"
|
msgstr "OneDriveログイン"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "インポート"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "オプション"
|
msgstr "オプション"
|
||||||
|
|
||||||
@@ -959,8 +975,8 @@ msgstr "リモートアイテムの削除: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "ローカルアイテムの作成: %d."
|
msgstr "ローカルアイテムの作成: %d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "状態: \"%s\"。"
|
msgstr "状態: \"%s\"。"
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -970,6 +986,16 @@ msgstr "中止中..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "完了: %s"
|
msgstr "完了: %s"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr "致命的なエラー: "
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "同期作業はすでに実行中です。状態: %s"
|
msgstr "同期作業はすでに実行中です。状態: %s"
|
||||||
@@ -1037,9 +1063,16 @@ msgid "Dark"
|
|||||||
msgstr "暗い"
|
msgstr "暗い"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Show uncompleted to-dos on top of the lists"
|
msgid "Uncompleted to-dos on top"
|
||||||
msgstr "未完のToDoをリストの上部に表示"
|
msgstr "未完のToDoをリストの上部に表示"
|
||||||
|
|
||||||
|
msgid "Sort notes by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Reverse sort order"
|
||||||
|
msgstr "逆順に並び替える。"
|
||||||
|
|
||||||
msgid "Save geo-location with notes"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "ノートに位置情報を保存"
|
msgstr "ノートに位置情報を保存"
|
||||||
|
|
||||||
@@ -1061,7 +1094,15 @@ msgstr "あたらしいノートを作成します。"
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
@@ -1125,6 +1166,44 @@ msgstr ""
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "無効な設定値: \"%s\"。有効な値は: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "同期が出来なかったアイテム"
|
msgstr "同期が出来なかったアイテム"
|
||||||
|
|
||||||
@@ -1208,6 +1287,9 @@ msgstr "確認"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "同期の中止"
|
msgstr "同期の中止"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1294,6 +1376,31 @@ msgstr ""
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "ようこそ"
|
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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "次のペインへ"
|
#~ msgstr "次のペインへ"
|
||||||
|
|
||||||
|
@@ -174,10 +174,14 @@ msgid "Exits the application."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -232,22 +236,16 @@ msgid ""
|
|||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr ""
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -451,6 +449,9 @@ msgstr ""
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -488,6 +489,17 @@ msgid ""
|
|||||||
"background and will be available soon."
|
"background and will be available soon."
|
||||||
msgstr ""
|
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"
|
msgid "File"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -500,10 +512,13 @@ msgstr ""
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
msgid "Export"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
@@ -552,6 +567,9 @@ msgstr ""
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -575,11 +593,7 @@ msgstr ""
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
@@ -591,9 +605,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -753,6 +764,12 @@ msgstr ""
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -772,9 +789,6 @@ msgstr ""
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -883,7 +897,7 @@ msgid "Fetched items: %d/%d."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -893,6 +907,16 @@ msgstr ""
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -954,7 +978,13 @@ msgstr ""
|
|||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Save geo-location with notes"
|
msgid "Save geo-location with notes"
|
||||||
@@ -975,7 +1005,15 @@ msgstr ""
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
@@ -1037,6 +1075,41 @@ msgstr ""
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr ""
|
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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1120,6 +1193,9 @@ msgstr ""
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@@ -187,14 +187,19 @@ msgstr "Notitie is opgeslaan."
|
|||||||
msgid "Exits the application."
|
msgid "Exits the application."
|
||||||
msgstr "Sluit de applicatie."
|
msgstr "Sluit de applicatie."
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Exporteert Joplin gegevens naar de opgegeven folder. Standaard zal het de "
|
"Exporteert Joplin gegevens naar de opgegeven folder. Standaard zal het de "
|
||||||
"volledige database exporteren, zoals notitieboeken, notities, tags en "
|
"volledige database exporteren, zoals notitieboeken, notities, tags en "
|
||||||
"middelen."
|
"middelen."
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Datumnotatie"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Exporteert alleen de opgegeven notitie."
|
msgstr "Exporteert alleen de opgegeven notitie."
|
||||||
|
|
||||||
@@ -259,26 +264,16 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Voor de volledige lijst van beschikbare shortcuts, typ `help shortcuts`"
|
"Voor de volledige lijst van beschikbare shortcuts, typ `help shortcuts`"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Importeer een Evernote notitieboek (.enex bestand)."
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Geen commando gevonden: \"%s\""
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Vraag niet om bevestiging. "
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Gevonden: %d."
|
msgstr "Gevonden: %d."
|
||||||
@@ -510,6 +505,10 @@ msgstr "Standaard: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Mogelijke sleutels/waarden:"
|
msgstr "Mogelijke sleutels/waarden:"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Toont gebruiksinformatie."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Fatale fout:"
|
msgstr "Fatale fout:"
|
||||||
|
|
||||||
@@ -563,6 +562,18 @@ msgstr ""
|
|||||||
"hoofdsleutel al ingegeven hebt, worden de versleutelde items ontsleuteld in "
|
"hoofdsleutel al ingegeven hebt, worden de versleutelde items ontsleuteld in "
|
||||||
"de achtergrond. Ze zijn binnenkort beschikbaar."
|
"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"
|
msgid "File"
|
||||||
msgstr "Bestand"
|
msgstr "Bestand"
|
||||||
|
|
||||||
@@ -575,11 +586,15 @@ msgstr "Nieuwe to-do"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Nieuw notitieboek"
|
msgstr "Nieuw notitieboek"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Importeer Evernote notities"
|
msgstr "Importeer"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
#, fuzzy
|
||||||
msgstr "Exporteer Evernote bestanden"
|
msgid "Export"
|
||||||
|
msgstr "Importeer"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -627,6 +642,10 @@ msgstr "Help"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Website en documentatie"
|
msgstr "Website en documentatie"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Website en documentatie"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -650,12 +669,8 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuleer"
|
msgstr "Annuleer"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr ""
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "Notities verwijderen?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -667,9 +682,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "N"
|
msgstr "N"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Annuleer synchronisatie"
|
msgstr "Annuleer synchronisatie"
|
||||||
@@ -847,6 +859,12 @@ msgstr "Tags"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Zet melding"
|
msgstr "Zet melding"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr "Nieuwe to-do"
|
msgstr "Nieuwe to-do"
|
||||||
@@ -868,9 +886,6 @@ msgstr "Vrijmaken"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "OneDrive Login"
|
msgstr "OneDrive Login"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Importeer"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Opties"
|
msgstr "Opties"
|
||||||
|
|
||||||
@@ -987,8 +1002,8 @@ msgstr "Verwijderde remote items: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "Opgehaalde items: %d/%d."
|
msgstr "Opgehaalde items: %d/%d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "Status: \"%s\""
|
msgstr "Status: \"%s\""
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -998,6 +1013,16 @@ msgstr "Annuleren..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Voltooid: %s"
|
msgstr "Voltooid: %s"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr "Fatale fout:"
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "Synchronisatie is reeds bezig. Status: %s"
|
msgstr "Synchronisatie is reeds bezig. Status: %s"
|
||||||
@@ -1065,9 +1090,16 @@ msgid "Dark"
|
|||||||
msgstr "Donker"
|
msgstr "Donker"
|
||||||
|
|
||||||
#, fuzzy
|
#, 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"
|
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"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Sla geo-locatie op bij notities"
|
msgstr "Sla geo-locatie op bij notities"
|
||||||
|
|
||||||
@@ -1088,7 +1120,15 @@ msgstr "Maakt een nieuwe notitie aan."
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
@@ -1154,6 +1194,44 @@ msgstr "Stel wachtwoord in"
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Ongeldige optie: \"%s\". Geldige waarden zijn: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Items die niet gesynchroniseerd kunnen worden"
|
msgstr "Items die niet gesynchroniseerd kunnen worden"
|
||||||
|
|
||||||
@@ -1241,6 +1319,9 @@ msgstr "Bevestig"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Annuleer synchronisatie"
|
msgstr "Annuleer synchronisatie"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr "Hoofdsleutel: %s"
|
msgstr "Hoofdsleutel: %s"
|
||||||
@@ -1326,6 +1407,32 @@ msgstr ""
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Welkom"
|
msgstr "Welkom"
|
||||||
|
|
||||||
|
#, 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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Focus op het volgende paneel"
|
#~ msgstr "Focus op het volgende paneel"
|
||||||
|
|
||||||
|
@@ -7,13 +7,13 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: Renato Nunes Bastos <rnbastos@gmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: pt_BR\n"
|
"Language: pt_BR\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Generator: Poedit 2.0.5\n"
|
"X-Generator: Poedit 2.0.6\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
msgid "To delete a tag, untag the associated notes."
|
msgid "To delete a tag, untag the associated notes."
|
||||||
@@ -50,16 +50,16 @@ msgstr "s"
|
|||||||
msgid "Cancelling background synchronisation... Please wait."
|
msgid "Cancelling background synchronisation... Please wait."
|
||||||
msgstr "Cancelando sincronização em segundo plano... Por favor, aguarde."
|
msgstr "Cancelando sincronização em segundo plano... Por favor, aguarde."
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "No such command: %s"
|
msgid "No such command: %s"
|
||||||
msgstr "Comando inválido: \"%s\""
|
msgstr "Não existe o comando: \"%s\""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "The command \"%s\" is only available in GUI mode"
|
msgid "The command \"%s\" is only available in GUI mode"
|
||||||
msgstr "O comando \"%s\" está disponível somente em modo gráfico"
|
msgstr "O comando \"%s\" está disponível somente em modo gráfico"
|
||||||
|
|
||||||
msgid "Cannot change encrypted item"
|
msgid "Cannot change encrypted item"
|
||||||
msgstr ""
|
msgstr "Não pode mudar um item encriptado"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Missing required argument: %s"
|
msgid "Missing required argument: %s"
|
||||||
@@ -127,22 +127,25 @@ msgid ""
|
|||||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||||
"`status` and `target-status`."
|
"`status` and `target-status`."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Gerencia a configuração E2EE. Os comandos são `enable`, `disable`, "
|
||||||
|
"`decrypt`, `status` e `target-status`."
|
||||||
|
|
||||||
msgid "Enter master password:"
|
msgid "Enter master password:"
|
||||||
msgstr ""
|
msgstr "Entre a senha master:"
|
||||||
|
|
||||||
msgid "Operation cancelled"
|
msgid "Operation cancelled"
|
||||||
msgstr ""
|
msgstr "Operação cancelada"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Starting decryption... Please wait as it may take several minutes depending "
|
"Starting decryption... Please wait as it may take several minutes depending "
|
||||||
"on how much there is to decrypt."
|
"on how much there is to decrypt."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Iniciando decriptação... Por favor aguarde, pois isso pode demorar vários "
|
||||||
|
"minutos, dependendo de quanto há para decriptar."
|
||||||
|
|
||||||
msgid "Completed decryption."
|
msgid "Completed decryption."
|
||||||
msgstr ""
|
msgstr "Decriptação completada."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Desabilitado"
|
msgstr "Desabilitado"
|
||||||
|
|
||||||
@@ -151,7 +154,7 @@ msgstr "Desabilitado"
|
|||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Encryption is: %s"
|
msgid "Encryption is: %s"
|
||||||
msgstr ""
|
msgstr "Encriptação está: %s"
|
||||||
|
|
||||||
msgid "Edit note."
|
msgid "Edit note."
|
||||||
msgstr "Editar nota."
|
msgstr "Editar nota."
|
||||||
@@ -174,7 +177,7 @@ msgstr "Começando a editar a nota. Feche o editor para voltar ao prompt."
|
|||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Error opening note in editor: %s"
|
msgid "Error opening note in editor: %s"
|
||||||
msgstr ""
|
msgstr "Erro ao abir a nota no editor: %s"
|
||||||
|
|
||||||
msgid "Note has been saved."
|
msgid "Note has been saved."
|
||||||
msgstr "Nota gravada."
|
msgstr "Nota gravada."
|
||||||
@@ -183,13 +186,17 @@ msgid "Exits the application."
|
|||||||
msgstr "Sai da aplicação."
|
msgstr "Sai da aplicação."
|
||||||
|
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Exporta os dados do Joplin para o diretório informado. Por padrão, ele "
|
"Exporta os dados do Joplin para o diretório informado. Por padrão, ele "
|
||||||
"exportará o banco de dados completo, incluindo cadernos, notas, tags e "
|
"exportará o banco de dados completo, incluindo cadernos, notas, tags e "
|
||||||
"recursos."
|
"recursos."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Formato do destino: %s"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Exporta apenas a nota fornecida."
|
msgstr "Exporta apenas a nota fornecida."
|
||||||
|
|
||||||
@@ -204,16 +211,17 @@ msgstr "Exibe informações de uso."
|
|||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "For information on how to customise the shortcuts please visit %s"
|
msgid "For information on how to customise the shortcuts please visit %s"
|
||||||
msgstr ""
|
msgstr "Para informações sobre como customizar os atalhos, por favor visite %s"
|
||||||
|
|
||||||
msgid "Shortcuts are not available in CLI mode."
|
msgid "Shortcuts are not available in CLI mode."
|
||||||
msgstr "Os atalhos não estão disponíveis no modo CLI."
|
msgstr "Os atalhos não estão disponíveis no modo CLI."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Type `help [command]` for more information about a command; or type `help "
|
"Type `help [command]` for more information about a command; or type `help "
|
||||||
"all` for the complete usage information."
|
"all` for the complete usage information."
|
||||||
msgstr "Digite `help [comando]` para obter mais informações sobre um comando."
|
msgstr ""
|
||||||
|
"Digite `help [comando]` para obter mais informações sobre um comando; ou "
|
||||||
|
"digite `help all` para informações completas de uso."
|
||||||
|
|
||||||
msgid "The possible commands are:"
|
msgid "The possible commands are:"
|
||||||
msgstr "Os comandos possíveis são:"
|
msgstr "Os comandos possíveis são:"
|
||||||
@@ -247,32 +255,21 @@ msgstr "Para entrar no modo de linha de comando, pressione \":\""
|
|||||||
msgid "To exit command line mode, press ESCAPE"
|
msgid "To exit command line mode, press ESCAPE"
|
||||||
msgstr "Para sair do modo de linha de comando, pressione o ESC"
|
msgstr "Para sair do modo de linha de comando, pressione o ESC"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Para a lista completa de atalhos de teclado disponíveis, digite `help "
|
"Para a lista completa de atalhos de teclado disponíveis, digite `help keymap`"
|
||||||
"shortcuts`"
|
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Importa um arquivo de caderno do Evernote (arquivo .enex)."
|
msgstr "Importa dados para o Joplin."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Formato da origem: \"%s\""
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Não pedir confirmação."
|
msgstr "Não pedir confirmação."
|
||||||
|
|
||||||
#, javascript-format
|
|
||||||
msgid "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
|
||||||
msgstr ""
|
|
||||||
"O arquivo \"%s\" será importado para o caderno existente \"%s\". Continuar?"
|
|
||||||
|
|
||||||
#, javascript-format
|
|
||||||
msgid ""
|
|
||||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
|
||||||
"it. Continue?"
|
|
||||||
msgstr ""
|
|
||||||
"O novo caderno \"%s\" será criado e o arquivo \"%s\" será importado para "
|
|
||||||
"ele. Continuar?"
|
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Encontrado: %d."
|
msgstr "Encontrado: %d."
|
||||||
@@ -367,6 +364,8 @@ msgstr "Exclui o caderno sem pedir confirmação."
|
|||||||
|
|
||||||
msgid "Delete notebook? All notes within this notebook will also be deleted."
|
msgid "Delete notebook? All notes within this notebook will also be deleted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Excluir o caderno? Todas as notas deste caderno notebook também serão "
|
||||||
|
"excluídas."
|
||||||
|
|
||||||
msgid "Deletes the notes matching <note-pattern>."
|
msgid "Deletes the notes matching <note-pattern>."
|
||||||
msgstr "Exclui as notas correspondentes ao padrão <note-pattern>."
|
msgstr "Exclui as notas correspondentes ao padrão <note-pattern>."
|
||||||
@@ -384,13 +383,17 @@ msgstr "Apagar nota?"
|
|||||||
msgid "Searches for the given <pattern> in all the notes."
|
msgid "Searches for the given <pattern> in all the notes."
|
||||||
msgstr "Procura o padrão <pattern>em todas as notas."
|
msgstr "Procura o padrão <pattern>em todas as notas."
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Sets the property <name> of the given <note> to the given [value]. Possible "
|
"Sets the property <name> of the given <note> to the given [value]. Possible "
|
||||||
"properties are:\n"
|
"properties are:\n"
|
||||||
"\n"
|
"\n"
|
||||||
"%s"
|
"%s"
|
||||||
msgstr "Define a propriedade <name> da <note> para o dado [valor]."
|
msgstr ""
|
||||||
|
"Define a propriedade <name> da <note> para o valor [value]. As propriedades "
|
||||||
|
"possíveis são:\n"
|
||||||
|
"\n"
|
||||||
|
"%s"
|
||||||
|
|
||||||
msgid "Displays summary about the notes and notebooks."
|
msgid "Displays summary about the notes and notebooks."
|
||||||
msgstr "Exibe sumário sobre as notas e cadernos."
|
msgstr "Exibe sumário sobre as notas e cadernos."
|
||||||
@@ -411,6 +414,8 @@ msgstr ""
|
|||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Not authentified with %s. Please provide any missing credentials."
|
msgid "Not authentified with %s. Please provide any missing credentials."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Não autenticado com %s. Por favor, complete as credenciais que estiverem "
|
||||||
|
"faltando."
|
||||||
|
|
||||||
msgid "Synchronisation is already in progress."
|
msgid "Synchronisation is already in progress."
|
||||||
msgstr "A sincronização já está em andamento."
|
msgstr "A sincronização já está em andamento."
|
||||||
@@ -497,6 +502,9 @@ msgstr "Padrão: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Possíveis chaves/valores:"
|
msgstr "Possíveis chaves/valores:"
|
||||||
|
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Digite 'joplin help' para informações de uso."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Erro fatal:"
|
msgstr "Erro fatal:"
|
||||||
|
|
||||||
@@ -532,6 +540,13 @@ msgid ""
|
|||||||
"\n"
|
"\n"
|
||||||
"For example, to create a notebook press `mb`; to create a note press `mn`."
|
"For example, to create a notebook press `mb`; to create a note press `mn`."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Bem-vindo ao Joplin!\n"
|
||||||
|
"\n"
|
||||||
|
"Digite `:help shortcuts` para obter a lista de atalhos de teclado, ou apenas "
|
||||||
|
"`:help` para informações de utilização.\n"
|
||||||
|
"\n"
|
||||||
|
"Por exemplo, para criar um caderno digite `mb`; para criar uma nota, digite "
|
||||||
|
"`mn`."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"One or more items are currently encrypted and you may need to supply a "
|
"One or more items are currently encrypted and you may need to supply a "
|
||||||
@@ -539,6 +554,22 @@ msgid ""
|
|||||||
"supplied the password, the encrypted items are being decrypted in the "
|
"supplied the password, the encrypted items are being decrypted in the "
|
||||||
"background and will be available soon."
|
"background and will be available soon."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Um ou mais itens estão criptografados, e você pode precisar de informar uma "
|
||||||
|
"senha master. Para fazer isso, por favor digite `e2ee decrypt`. Se você já "
|
||||||
|
"forneceu a senha, os itens criptografados estão sendo decriptados em "
|
||||||
|
"background e logo estarão disponíveis."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||||
|
msgstr "Exportando para \"%s\" com o formato \"%s\". Por favor, aguarde..."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||||
|
msgstr "Importando de \"%s\" com o formato \"%s\". Por favor, aguarde..."
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "PDF File"
|
||||||
|
msgstr "Arquivo"
|
||||||
|
|
||||||
msgid "File"
|
msgid "File"
|
||||||
msgstr "Arquivo"
|
msgstr "Arquivo"
|
||||||
@@ -552,15 +583,18 @@ msgstr "Nova tarefa"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Novo caderno"
|
msgstr "Novo caderno"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Importar notas do Evernote"
|
msgstr "Importar"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
msgid "Export"
|
||||||
msgstr "Arquivos de Exportação do Evernote"
|
msgstr "Exportar"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
msgstr ""
|
msgstr "Ocultar %s"
|
||||||
|
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Sair"
|
msgstr "Sair"
|
||||||
@@ -581,24 +615,22 @@ msgid "Search in all the notes"
|
|||||||
msgstr "Pesquisar em todas as notas"
|
msgstr "Pesquisar em todas as notas"
|
||||||
|
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr ""
|
msgstr "Visualizar"
|
||||||
|
|
||||||
msgid "Toggle editor layout"
|
msgid "Toggle editor layout"
|
||||||
msgstr ""
|
msgstr "Alternar layout do editor"
|
||||||
|
|
||||||
msgid "Tools"
|
msgid "Tools"
|
||||||
msgstr "Ferramentas"
|
msgstr "Ferramentas"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Synchronisation status"
|
msgid "Synchronisation status"
|
||||||
msgstr "Alvo de sincronização"
|
msgstr "Status de sincronização"
|
||||||
|
|
||||||
msgid "Encryption options"
|
msgid "Encryption options"
|
||||||
msgstr ""
|
msgstr "Opções de Encriptação"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "General Options"
|
msgid "General Options"
|
||||||
msgstr "Opções"
|
msgstr "Opções Gerais"
|
||||||
|
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Ajuda"
|
msgstr "Ajuda"
|
||||||
@@ -606,8 +638,11 @@ msgstr "Ajuda"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Website e documentação"
|
msgstr "Website e documentação"
|
||||||
|
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Fazer uma doação"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr "Verificar atualizações..."
|
||||||
|
|
||||||
msgid "About Joplin"
|
msgid "About Joplin"
|
||||||
msgstr "Sobre o Joplin"
|
msgstr "Sobre o Joplin"
|
||||||
@@ -616,12 +651,12 @@ msgstr "Sobre o Joplin"
|
|||||||
msgid "%s %s (%s, %s)"
|
msgid "%s %s (%s, %s)"
|
||||||
msgstr "%s %s (%s, %s)"
|
msgstr "%s %s (%s, %s)"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "Open %s"
|
msgid "Open %s"
|
||||||
msgstr "Em %s: %s"
|
msgstr "Abrir %s"
|
||||||
|
|
||||||
msgid "Exit"
|
msgid "Exit"
|
||||||
msgstr ""
|
msgstr "Sair"
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
@@ -629,42 +664,35 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr "A versão atual está atualizada."
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "Excluir notas?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr "Uma atualização está disponível, você quer baixar agora?"
|
||||||
|
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr ""
|
msgstr "Sim"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "N"
|
msgstr "Não"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Cancelar sincronização"
|
msgstr "Verificar a configuração da sincronização"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Notes and settings are stored in: %s"
|
msgid "Notes and settings are stored in: %s"
|
||||||
msgstr ""
|
msgstr "Notas e configurações estão armazenadas em: %s"
|
||||||
|
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr ""
|
msgstr "Salvar"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Disabling encryption means *all* your notes and attachments are going to be "
|
"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 "
|
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
|
||||||
"continue?"
|
"continue?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Desabilitar a encriptação significa que *todas* as suas notas e anexos serão "
|
||||||
|
"re-sincronizados e enviados sem encriptação. Você quer continuar?"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Enabling encryption means *all* your notes and attachments are going to be "
|
"Enabling encryption means *all* your notes and attachments are going to be "
|
||||||
@@ -672,59 +700,68 @@ msgid ""
|
|||||||
"password as, for security purposes, this will be the *only* way to decrypt "
|
"password as, for security purposes, this will be the *only* way to decrypt "
|
||||||
"the data! To enable encryption, please enter your password below."
|
"the data! To enable encryption, please enter your password below."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Habilitar a encriptação significa que *todas* as suas notas e anexos serão "
|
||||||
|
"re-sincronizados e re-enviados com encriptação. Não perca sua senha, pois, "
|
||||||
|
"por medidas de segurança, esse será o *único* modo de decriptar seus dados! "
|
||||||
|
"Para habilitar a encriptação, por favor entre sua senha abaixo."
|
||||||
|
|
||||||
msgid "Disable encryption"
|
msgid "Disable encryption"
|
||||||
msgstr ""
|
msgstr "Desabilitar encriptação"
|
||||||
|
|
||||||
msgid "Enable encryption"
|
msgid "Enable encryption"
|
||||||
msgstr ""
|
msgstr "Habilitar encriptação"
|
||||||
|
|
||||||
msgid "Master Keys"
|
msgid "Master Keys"
|
||||||
msgstr ""
|
msgstr "Chaves mestras"
|
||||||
|
|
||||||
msgid "Active"
|
msgid "Active"
|
||||||
msgstr ""
|
msgstr "Ativar"
|
||||||
|
|
||||||
msgid "ID"
|
msgid "ID"
|
||||||
msgstr ""
|
msgstr "ID"
|
||||||
|
|
||||||
msgid "Source"
|
msgid "Source"
|
||||||
msgstr ""
|
msgstr "Origem"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Created"
|
msgid "Created"
|
||||||
msgstr "Criado: %d."
|
msgstr "Criado"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Updated"
|
msgid "Updated"
|
||||||
msgstr "Atualizado: %d."
|
msgstr "Atualizado"
|
||||||
|
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr ""
|
msgstr "Senha"
|
||||||
|
|
||||||
msgid "Password OK"
|
msgid "Password OK"
|
||||||
msgstr ""
|
msgstr "Senha OK"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Note: Only one master key is going to be used for encryption (the one marked "
|
"Note: Only one master key is going to be used for encryption (the one marked "
|
||||||
"as \"active\"). Any of the keys might be used for decryption, depending on "
|
"as \"active\"). Any of the keys might be used for decryption, depending on "
|
||||||
"how the notes or notebooks were originally encrypted."
|
"how the notes or notebooks were originally encrypted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Noto: Apenas uma chave máster será usada para encriptação (a que estiver "
|
||||||
|
"marcada como \"ativa\"). Qualquer uma das chaves pode ser usada para "
|
||||||
|
"decriptação, dependendo de como as notas ou os cadernos foram encriptados "
|
||||||
|
"originalmente."
|
||||||
|
|
||||||
msgid "Missing Master Keys"
|
msgid "Missing Master Keys"
|
||||||
msgstr ""
|
msgstr "Chaves Master faltando"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The master keys with these IDs are used to encrypt some of your items, "
|
"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 "
|
"however the application does not currently have access to them. It is likely "
|
||||||
"they will eventually be downloaded via synchronisation."
|
"they will eventually be downloaded via synchronisation."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"As chaves master com essas IDs são usadas para encriptar alguns de seus "
|
||||||
|
"itens, contudo a aplicação atualmente não tem acesso a elas. Provavelmente, "
|
||||||
|
"elas serão baixadas via sincronização."
|
||||||
|
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
|
|
||||||
msgid "Encryption is:"
|
msgid "Encryption is:"
|
||||||
msgstr ""
|
msgstr "Encriptação está:"
|
||||||
|
|
||||||
msgid "Back"
|
msgid "Back"
|
||||||
msgstr "Voltar"
|
msgstr "Voltar"
|
||||||
@@ -762,19 +799,17 @@ msgstr "Procurar"
|
|||||||
msgid "Layout"
|
msgid "Layout"
|
||||||
msgstr "Layout"
|
msgstr "Layout"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Some items cannot be synchronised."
|
msgid "Some items cannot be synchronised."
|
||||||
msgstr "Não é possível inicializar o sincronizador."
|
msgstr "Alguns itens não podem ser sincronizados."
|
||||||
|
|
||||||
msgid "View them now"
|
msgid "View them now"
|
||||||
msgstr ""
|
msgstr "Visualizar agora"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Some items cannot be decrypted."
|
msgid "Some items cannot be decrypted."
|
||||||
msgstr "Não é possível inicializar o sincronizador."
|
msgstr "Alguns itens não podem ser decriptados."
|
||||||
|
|
||||||
msgid "Set the password"
|
msgid "Set the password"
|
||||||
msgstr ""
|
msgstr "Configurar a senha"
|
||||||
|
|
||||||
msgid "Add or remove tags"
|
msgid "Add or remove tags"
|
||||||
msgstr "Adicionar ou remover tags"
|
msgstr "Adicionar ou remover tags"
|
||||||
@@ -791,17 +826,15 @@ msgstr "Excluir notas?"
|
|||||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||||
msgstr "Não há notas aqui. Crie uma, clicando em \"Nova nota\"."
|
msgstr "Não há notas aqui. Crie uma, clicando em \"Nova nota\"."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"There is currently no notebook. Create one by clicking on \"New notebook\"."
|
"There is currently no notebook. Create one by clicking on \"New notebook\"."
|
||||||
msgstr "Atualmente, não há notas. Crie uma, clicando no botão (+)."
|
msgstr "Atualmente, não há cadernos. Crie um, clicando em \"Novo caderno\"."
|
||||||
|
|
||||||
msgid "Open..."
|
msgid "Open..."
|
||||||
msgstr ""
|
msgstr "Abrir..."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Save as..."
|
msgid "Save as..."
|
||||||
msgstr "Gravar alterações"
|
msgstr "Salvar como..."
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Unsupported link or message: %s"
|
msgid "Unsupported link or message: %s"
|
||||||
@@ -816,17 +849,23 @@ msgstr "Tags"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Definir alarme"
|
msgstr "Definir alarme"
|
||||||
|
|
||||||
#, fuzzy
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
"Esta nota não possui conteúdo. Clique em \"%s\" para alternar para o editor, "
|
||||||
|
"e edite a nota."
|
||||||
|
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr "Nova tarefa"
|
msgstr "tarefa"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "note"
|
msgid "note"
|
||||||
msgstr "Nova nota"
|
msgstr "nota"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "Creating new %s..."
|
msgid "Creating new %s..."
|
||||||
msgstr "Importando notas ..."
|
msgstr "Criando novo %s..."
|
||||||
|
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Atualizar"
|
msgstr "Atualizar"
|
||||||
@@ -837,18 +876,14 @@ msgstr "Limpar (clear)"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "Login no OneDrive"
|
msgstr "Login no OneDrive"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Importar"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Opções"
|
msgstr "Opções"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Synchronisation Status"
|
msgid "Synchronisation Status"
|
||||||
msgstr "Alvo de sincronização"
|
msgstr "Status de sincronização"
|
||||||
|
|
||||||
msgid "Encryption Options"
|
msgid "Encryption Options"
|
||||||
msgstr ""
|
msgstr "Opções de Encriptação"
|
||||||
|
|
||||||
msgid "Remove this tag from all the notes?"
|
msgid "Remove this tag from all the notes?"
|
||||||
msgstr "Remover esta tag de todas as notas?"
|
msgstr "Remover esta tag de todas as notas?"
|
||||||
@@ -868,9 +903,10 @@ msgstr "Cadernos"
|
|||||||
msgid "Searches"
|
msgid "Searches"
|
||||||
msgstr "Pesquisas"
|
msgstr "Pesquisas"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Please select where the sync status should be exported to"
|
msgid "Please select where the sync status should be exported to"
|
||||||
msgstr "Por favor, primeiro, selecione a nota ou caderno a excluir."
|
msgstr ""
|
||||||
|
"Favor selecionar o local para onde o status de sincronia deveria ser "
|
||||||
|
"exportado"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Usage: %s"
|
msgid "Usage: %s"
|
||||||
@@ -884,7 +920,7 @@ msgid "File system"
|
|||||||
msgstr "Sistema de arquivos"
|
msgstr "Sistema de arquivos"
|
||||||
|
|
||||||
msgid "Nextcloud"
|
msgid "Nextcloud"
|
||||||
msgstr ""
|
msgstr "Nextcloud"
|
||||||
|
|
||||||
msgid "OneDrive"
|
msgid "OneDrive"
|
||||||
msgstr "OneDrive"
|
msgstr "OneDrive"
|
||||||
@@ -893,7 +929,7 @@ msgid "OneDrive Dev (For testing only)"
|
|||||||
msgstr "OneDrive Dev (apenas para testes)"
|
msgstr "OneDrive Dev (apenas para testes)"
|
||||||
|
|
||||||
msgid "WebDAV"
|
msgid "WebDAV"
|
||||||
msgstr ""
|
msgstr "WebDAV"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Unknown log level: %s"
|
msgid "Unknown log level: %s"
|
||||||
@@ -953,12 +989,12 @@ msgstr "Itens locais excluídos: %d."
|
|||||||
msgid "Deleted remote items: %d."
|
msgid "Deleted remote items: %d."
|
||||||
msgstr "Itens remotos excluídos: %d."
|
msgstr "Itens remotos excluídos: %d."
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
|
||||||
msgid "Fetched items: %d/%d."
|
|
||||||
msgstr "Itens locais criados: %d."
|
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "Fetched items: %d/%d."
|
||||||
|
msgstr "Itens pesquisados: %d/%d."
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "State: %s."
|
||||||
msgstr "Estado: \"%s\"."
|
msgstr "Estado: \"%s\"."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -968,16 +1004,25 @@ msgstr "Cancelando..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Completado: %s"
|
msgstr "Completado: %s"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr "Erro fatal:"
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "Sincronização já em andamento. Estado: %s"
|
msgstr "Sincronização já em andamento. Estado: %s"
|
||||||
|
|
||||||
msgid "Encrypted"
|
msgid "Encrypted"
|
||||||
msgstr ""
|
msgstr "Encriptado"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Encrypted items cannot be modified"
|
msgid "Encrypted items cannot be modified"
|
||||||
msgstr "Não é possível inicializar o sincronizador."
|
msgstr "Itens encriptados não podem ser modificados"
|
||||||
|
|
||||||
msgid "Conflicts"
|
msgid "Conflicts"
|
||||||
msgstr "Conflitos"
|
msgstr "Conflitos"
|
||||||
@@ -999,7 +1044,7 @@ msgstr "Esta nota não possui informações de geolocalização."
|
|||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Cannot copy note to \"%s\" notebook"
|
msgid "Cannot copy note to \"%s\" notebook"
|
||||||
msgstr "Não é possível copiar a nota para o caderno \"%s\" "
|
msgstr "Não é possível copiar a nota para o caderno \"%s\""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Cannot move note to \"%s\" notebook"
|
msgid "Cannot move note to \"%s\" notebook"
|
||||||
@@ -1033,33 +1078,45 @@ msgstr "Light"
|
|||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Dark"
|
msgstr "Dark"
|
||||||
|
|
||||||
#, fuzzy
|
msgid "Uncompleted to-dos on top"
|
||||||
msgid "Show uncompleted to-dos on top of the lists"
|
msgstr "Mostrar tarefas incompletas no topo"
|
||||||
msgstr "Mostrar tarefas incompletas no topo das listas"
|
|
||||||
|
msgid "Sort notes by"
|
||||||
|
msgstr "Ordenar notas por"
|
||||||
|
|
||||||
|
msgid "Reverse sort order"
|
||||||
|
msgstr "Inverter ordem de classificação."
|
||||||
|
|
||||||
msgid "Save geo-location with notes"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Salvar geolocalização com notas"
|
msgstr "Salvar geolocalização com notas"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "When creating a new to-do:"
|
msgid "When creating a new to-do:"
|
||||||
msgstr "Cria uma nova tarefa."
|
msgstr "Quando criar uma nova tarefa:"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Focus title"
|
msgid "Focus title"
|
||||||
msgstr "Título da nota:"
|
msgstr "Foco no título"
|
||||||
|
|
||||||
msgid "Focus body"
|
msgid "Focus body"
|
||||||
msgstr ""
|
msgstr "Focar no corpo"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "When creating a new note:"
|
msgid "When creating a new note:"
|
||||||
msgstr "Cria uma nova nota."
|
msgstr "Quando criar uma nota nova:"
|
||||||
|
|
||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr "Exibir tray icon"
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
msgid "Global zoom percentage"
|
||||||
|
msgstr "Porcentagem global do zoom"
|
||||||
|
|
||||||
|
msgid "Editor font family"
|
||||||
|
msgstr "Família de fontes do editor"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"The font name will not be checked. If incorrect or empty, it will default to "
|
||||||
|
"a generic monospace font."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"O nomes da fonte não será verificado. Se estiver incorreto ou vazio, será "
|
||||||
|
"usado por default uma fonte genérica monospace."
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
msgstr "Atualizar automaticamente o aplicativo"
|
msgstr "Atualizar automaticamente o aplicativo"
|
||||||
@@ -1089,9 +1146,11 @@ msgid ""
|
|||||||
"The target to synchonise to. Each sync target may have additional parameters "
|
"The target to synchonise to. Each sync target may have additional parameters "
|
||||||
"which are named as `sync.NUM.NAME` (all documented below)."
|
"which are named as `sync.NUM.NAME` (all documented below)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"O alvo para onde sincronizar. Cada alvo pode ter parâmetros adicionais que "
|
||||||
|
"são nomeados como `sync.NUM.NAME` (todos documentados abaixo)."
|
||||||
|
|
||||||
msgid "Directory to synchronise with (absolute path)"
|
msgid "Directory to synchronise with (absolute path)"
|
||||||
msgstr ""
|
msgstr "Diretório para sincronizar (caminho absoluto)"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The path to synchronise with when file system synchronisation is enabled. "
|
"The path to synchronise with when file system synchronisation is enabled. "
|
||||||
@@ -1101,39 +1160,80 @@ msgstr ""
|
|||||||
"está habilitada. Veja `sync.target`."
|
"está habilitada. Veja `sync.target`."
|
||||||
|
|
||||||
msgid "Nextcloud WebDAV URL"
|
msgid "Nextcloud WebDAV URL"
|
||||||
msgstr ""
|
msgstr "Nextcloud WebDAV URL"
|
||||||
|
|
||||||
msgid "Nextcloud username"
|
msgid "Nextcloud username"
|
||||||
msgstr ""
|
msgstr "Usuário da Nextcloud"
|
||||||
|
|
||||||
msgid "Nextcloud password"
|
msgid "Nextcloud password"
|
||||||
msgstr ""
|
msgstr "Senha da Nextcloud"
|
||||||
|
|
||||||
msgid "WebDAV URL"
|
msgid "WebDAV URL"
|
||||||
msgstr ""
|
msgstr "WebDAV URL"
|
||||||
|
|
||||||
msgid "WebDAV username"
|
msgid "WebDAV username"
|
||||||
msgstr ""
|
msgstr "Usuário do WebDAV"
|
||||||
|
|
||||||
msgid "WebDAV password"
|
msgid "WebDAV password"
|
||||||
msgstr ""
|
msgstr "Senha do WebDAV"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Valor da opção inválida: \"%s\". Os valores possíveis são: %s."
|
msgstr "Valor da opção inválida: \"%s\". Os valores possíveis são: %s."
|
||||||
|
|
||||||
msgid "Items that cannot be synchronised"
|
msgid "Joplin Export File"
|
||||||
msgstr ""
|
msgstr "Arquivo de Exportação do Joplin"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Markdown"
|
||||||
|
msgstr "Markdown"
|
||||||
|
|
||||||
|
msgid "Joplin Export Directory"
|
||||||
|
msgstr "Diretório de Exportação do Joplin"
|
||||||
|
|
||||||
|
msgid "Evernote Export File"
|
||||||
|
msgstr "Arquivo de Exportação do Evernote"
|
||||||
|
|
||||||
|
msgid "Directory"
|
||||||
|
msgstr "DIretório"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Cannot load \"%s\" module for format \"%s\""
|
||||||
|
msgstr "Não é possível carregar o módulo \"%s\" para o formato \"%s\""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Please specify import format for %s"
|
||||||
|
msgstr "Favor especificar o formato de importação para %s"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
|
||||||
|
"decrypted and try again."
|
||||||
|
msgstr ""
|
||||||
|
"Este item atualmente está encriptado: %s \"%s\". Favor aguardar que todos os "
|
||||||
|
"itens sejam decriptados e tente novamente."
|
||||||
|
|
||||||
|
msgid "There is no data to export."
|
||||||
|
msgstr "Não há dados a exportar."
|
||||||
|
|
||||||
|
msgid "Please specify the notebook where the notes should be imported to."
|
||||||
|
msgstr ""
|
||||||
|
"Por favor, especifique o caderno para onde as notas deveriam ser importadas."
|
||||||
|
|
||||||
|
msgid "Items that cannot be synchronised"
|
||||||
|
msgstr "Os itens não podem ser sincronizados"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
msgid "%s (%s): %s"
|
msgid "%s (%s): %s"
|
||||||
msgstr "%s %s (%s)"
|
msgstr "%s (%s): %s"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"These items will remain on the device but will not be uploaded to the sync "
|
"These items will remain on the device but will not be uploaded to the sync "
|
||||||
"target. In order to find these items, either search for the title or the ID "
|
"target. In order to find these items, either search for the title or the ID "
|
||||||
"(which is displayed in brackets above)."
|
"(which is displayed in brackets above)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Estes itens continuarão no dispositivo mas não serão enviados ao alvo de "
|
||||||
|
"sincronização. Para encontrar esses itens, ou pesquise pelo título ou pelo "
|
||||||
|
"ID (que é exibido nos colchetes acima)"
|
||||||
|
|
||||||
msgid "Sync status (synced items / total items)"
|
msgid "Sync status (synced items / total items)"
|
||||||
msgstr "Status de sincronização (sincronizados / totais)"
|
msgstr "Status de sincronização (sincronizados / totais)"
|
||||||
@@ -1181,7 +1281,7 @@ msgid "Export Debug Report"
|
|||||||
msgstr "Exportar Relatório de Debug"
|
msgstr "Exportar Relatório de Debug"
|
||||||
|
|
||||||
msgid "Encryption Config"
|
msgid "Encryption Config"
|
||||||
msgstr ""
|
msgstr "Configuração de Encriptação"
|
||||||
|
|
||||||
msgid "Configuration"
|
msgid "Configuration"
|
||||||
msgstr "Configuração"
|
msgstr "Configuração"
|
||||||
@@ -1194,7 +1294,7 @@ msgid "Move %d notes to notebook \"%s\"?"
|
|||||||
msgstr "Mover %d notas para o caderno \"%s\"?"
|
msgstr "Mover %d notas para o caderno \"%s\"?"
|
||||||
|
|
||||||
msgid "Press to set the decryption password."
|
msgid "Press to set the decryption password."
|
||||||
msgstr ""
|
msgstr "Pressione para configurar a senha de decriptação."
|
||||||
|
|
||||||
msgid "Select date"
|
msgid "Select date"
|
||||||
msgstr "Selecionar data"
|
msgstr "Selecionar data"
|
||||||
@@ -1205,23 +1305,25 @@ msgstr "Confirmar"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Cancelar sincronização"
|
msgstr "Cancelar sincronização"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr "Site do Joplin"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr ""
|
msgstr "Chave Master %s"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "Created: %s"
|
msgid "Created: %s"
|
||||||
msgstr "Criado: %d."
|
msgstr "Criado: %s"
|
||||||
|
|
||||||
msgid "Password:"
|
msgid "Password:"
|
||||||
msgstr ""
|
msgstr "Senha:"
|
||||||
|
|
||||||
msgid "Password cannot be empty"
|
msgid "Password cannot be empty"
|
||||||
msgstr ""
|
msgstr "Senha não pode ser vazia"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Enable"
|
msgid "Enable"
|
||||||
msgstr "Desabilitado"
|
msgstr "Habilitar"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "The notebook could not be saved: %s"
|
msgid "The notebook could not be saved: %s"
|
||||||
@@ -1231,10 +1333,10 @@ msgid "Edit notebook"
|
|||||||
msgstr "Editar caderno"
|
msgstr "Editar caderno"
|
||||||
|
|
||||||
msgid "Show all"
|
msgid "Show all"
|
||||||
msgstr ""
|
msgstr "Exibir tudo"
|
||||||
|
|
||||||
msgid "Errors only"
|
msgid "Errors only"
|
||||||
msgstr ""
|
msgstr "Somente erros"
|
||||||
|
|
||||||
msgid "This note has been modified:"
|
msgid "This note has been modified:"
|
||||||
msgstr "Esta nota foi modificada:"
|
msgstr "Esta nota foi modificada:"
|
||||||
@@ -1289,6 +1391,34 @@ msgstr "Você não possui cadernos. Crie um clicando no botão (+)."
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Bem-vindo"
|
msgstr "Bem-vindo"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "Release notes:\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ "%s"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "Notas da versão:\n"
|
||||||
|
#~ "\n"
|
||||||
|
#~ "%s"
|
||||||
|
|
||||||
|
#~ msgid "Imports an Evernote notebook file (.enex file)."
|
||||||
|
#~ msgstr "Importa um arquivo de caderno do Evernote (arquivo .enex)."
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "File \"%s\" will be imported into existing notebook \"%s\". Continue?"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "O arquivo \"%s\" será importado para o caderno existente \"%s\". "
|
||||||
|
#~ "Continuar?"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "New notebook \"%s\" will be created and file \"%s\" will be imported into "
|
||||||
|
#~ "it. Continue?"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "O novo caderno \"%s\" será criado e o arquivo \"%s\" será importado para "
|
||||||
|
#~ "ele. Continuar?"
|
||||||
|
|
||||||
|
#~ msgid "Import Evernote notes"
|
||||||
|
#~ msgstr "Importar notas do Evernote"
|
||||||
|
|
||||||
#~ msgid "Give focus to next pane"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Dar o foco para o próximo painel"
|
#~ msgstr "Dar o foco para o próximo painel"
|
||||||
|
|
||||||
|
@@ -190,12 +190,16 @@ msgid "Exits the application."
|
|||||||
msgstr "Выход из приложения."
|
msgstr "Выход из приложения."
|
||||||
|
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Экспортирует данные Joplin в заданный каталог. По умолчанию экспортируется "
|
"Экспортирует данные Joplin по заданному пути. По умолчанию экспортируется "
|
||||||
"полная база данных, включая блокноты, заметки, теги и ресурсы."
|
"полная база данных, включая блокноты, заметки, теги и ресурсы."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "Целевой формат: %s"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "Экспортирует только заданную заметку."
|
msgstr "Экспортирует только заданную заметку."
|
||||||
|
|
||||||
@@ -210,7 +214,7 @@ msgstr "Выводит информацию об использовании."
|
|||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "For information on how to customise the shortcuts please visit %s"
|
msgid "For information on how to customise the shortcuts please visit %s"
|
||||||
msgstr ""
|
msgstr "Информацию по настройке сочетаний можно получить, посетив %s"
|
||||||
|
|
||||||
msgid "Shortcuts are not available in CLI mode."
|
msgid "Shortcuts are not available in CLI mode."
|
||||||
msgstr "Ярлыки недоступны в режиме командной строки."
|
msgstr "Ярлыки недоступны в режиме командной строки."
|
||||||
@@ -254,31 +258,22 @@ msgstr "Чтобы войти в режим командной строки, н
|
|||||||
msgid "To exit command line mode, press ESCAPE"
|
msgid "To exit command line mode, press ESCAPE"
|
||||||
msgstr "Чтобы выйти из режима командной строки, нажмите ESCAPE"
|
msgstr "Чтобы выйти из режима командной строки, нажмите ESCAPE"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Для просмотра списка доступных клавиатурных сочетаний введите `help "
|
"Для просмотра списка клавиатурных сочетаний и настроек конфигурации введите "
|
||||||
"shortcuts`"
|
"`help keymap`"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "Импортирует файл блокнотов Evernote (.enex-файл)."
|
msgstr "Импортирует данные в Joplin."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "Исходный формат: %s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "Не запрашивать подтверждение."
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "Найдено: %d."
|
msgstr "Найдено: %d."
|
||||||
@@ -510,6 +505,9 @@ msgstr "По умолчанию: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "Возможные ключи/значения:"
|
msgstr "Возможные ключи/значения:"
|
||||||
|
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "Введите `joplin help` для получения информации об использовании."
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Фатальная ошибка:"
|
msgstr "Фатальная ошибка:"
|
||||||
|
|
||||||
@@ -563,6 +561,17 @@ msgstr ""
|
|||||||
"decrypt». Если пароль уже был вами предоставлен, зашифрованные элементы "
|
"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"
|
msgid "File"
|
||||||
msgstr "Файл"
|
msgstr "Файл"
|
||||||
|
|
||||||
@@ -575,15 +584,18 @@ msgstr "Новая задача"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "Новый блокнот"
|
msgstr "Новый блокнот"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "Импортировать заметки из Evernote"
|
msgstr "Импорт"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
msgid "Export"
|
||||||
msgstr "Файлы экспорта Evernote"
|
msgstr "Экспорт"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr "Печать"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
msgstr ""
|
msgstr "Скрыть %s"
|
||||||
|
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Выход"
|
msgstr "Выход"
|
||||||
@@ -604,10 +616,10 @@ msgid "Search in all the notes"
|
|||||||
msgstr "Поиск во всех заметках"
|
msgstr "Поиск во всех заметках"
|
||||||
|
|
||||||
msgid "View"
|
msgid "View"
|
||||||
msgstr ""
|
msgstr "Вид"
|
||||||
|
|
||||||
msgid "Toggle editor layout"
|
msgid "Toggle editor layout"
|
||||||
msgstr ""
|
msgstr "Переключить вид редактора"
|
||||||
|
|
||||||
msgid "Tools"
|
msgid "Tools"
|
||||||
msgstr "Инструменты"
|
msgstr "Инструменты"
|
||||||
@@ -627,6 +639,9 @@ msgstr "Помощь"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "Сайт и документация"
|
msgstr "Сайт и документация"
|
||||||
|
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "Сделать пожертвование"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr "Проверить обновления..."
|
msgstr "Проверить обновления..."
|
||||||
|
|
||||||
@@ -637,12 +652,12 @@ msgstr "О Joplin"
|
|||||||
msgid "%s %s (%s, %s)"
|
msgid "%s %s (%s, %s)"
|
||||||
msgstr "%s %s (%s, %s)"
|
msgstr "%s %s (%s, %s)"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "Open %s"
|
msgid "Open %s"
|
||||||
msgstr "В %s: %s"
|
msgstr "Открыть %s"
|
||||||
|
|
||||||
msgid "Exit"
|
msgid "Exit"
|
||||||
msgstr ""
|
msgstr "Выход"
|
||||||
|
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
@@ -650,30 +665,20 @@ msgstr "OK"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Отмена"
|
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."
|
msgid "Current version is up-to-date."
|
||||||
msgstr "Вы используете самую свежую версию."
|
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"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "Отменить синхронизацию"
|
msgstr "Проверить настройки синхронизации"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Notes and settings are stored in: %s"
|
msgid "Notes and settings are stored in: %s"
|
||||||
@@ -743,15 +748,17 @@ msgstr ""
|
|||||||
"ключей, в зависимости от того, как изначально были зашифрованы заметки или "
|
"ключей, в зависимости от того, как изначально были зашифрованы заметки или "
|
||||||
"блокноты."
|
"блокноты."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Missing Master Keys"
|
msgid "Missing Master Keys"
|
||||||
msgstr "Мастер-ключи"
|
msgstr "Недостающие мастер-ключи"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The master keys with these IDs are used to encrypt some of your items, "
|
"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 "
|
"however the application does not currently have access to them. It is likely "
|
||||||
"they will eventually be downloaded via synchronisation."
|
"they will eventually be downloaded via synchronisation."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Мастер-ключи с такими ID используются для шифрования некоторых из ваших "
|
||||||
|
"элементов, однако у приложения сейчас нет к ним доступа. Скорее всего, они "
|
||||||
|
"загрузятся при синхронизации."
|
||||||
|
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Статус"
|
msgstr "Статус"
|
||||||
@@ -826,11 +833,10 @@ msgid ""
|
|||||||
msgstr "Сейчас здесь нет блокнотов. Создайте новый нажав «Новый блокнот»."
|
msgstr "Сейчас здесь нет блокнотов. Создайте новый нажав «Новый блокнот»."
|
||||||
|
|
||||||
msgid "Open..."
|
msgid "Open..."
|
||||||
msgstr ""
|
msgstr "Открыть..."
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Save as..."
|
msgid "Save as..."
|
||||||
msgstr "Сохранить изменения"
|
msgstr "Сохранить как..."
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Unsupported link or message: %s"
|
msgid "Unsupported link or message: %s"
|
||||||
@@ -845,17 +851,23 @@ msgstr "Теги"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "Установить напоминание"
|
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"
|
msgid "to-do"
|
||||||
msgstr "Новая задача"
|
msgstr "задача"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "note"
|
msgid "note"
|
||||||
msgstr "Новая заметка"
|
msgstr "заметка"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
#, javascript-format
|
||||||
msgid "Creating new %s..."
|
msgid "Creating new %s..."
|
||||||
msgstr "Импорт заметок..."
|
msgstr "Создание новой %s..."
|
||||||
|
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Обновить"
|
msgstr "Обновить"
|
||||||
@@ -866,9 +878,6 @@ msgstr "Очистить"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "Вход в OneDrive"
|
msgstr "Вход в OneDrive"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "Импорт"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "Настройки"
|
msgstr "Настройки"
|
||||||
|
|
||||||
@@ -910,9 +919,8 @@ msgstr "Неизвестный флаг: %s"
|
|||||||
msgid "File system"
|
msgid "File system"
|
||||||
msgstr "Файловая система"
|
msgstr "Файловая система"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Nextcloud"
|
msgid "Nextcloud"
|
||||||
msgstr "Nextcloud (Beta)"
|
msgstr "Nextcloud"
|
||||||
|
|
||||||
msgid "OneDrive"
|
msgid "OneDrive"
|
||||||
msgstr "OneDrive"
|
msgstr "OneDrive"
|
||||||
@@ -920,9 +928,8 @@ msgstr "OneDrive"
|
|||||||
msgid "OneDrive Dev (For testing only)"
|
msgid "OneDrive Dev (For testing only)"
|
||||||
msgstr "OneDrive Dev (только для тестирования)"
|
msgstr "OneDrive Dev (только для тестирования)"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV"
|
msgid "WebDAV"
|
||||||
msgstr "Nextcloud WebDAV URL"
|
msgstr "WebDAV"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Unknown log level: %s"
|
msgid "Unknown log level: %s"
|
||||||
@@ -986,8 +993,8 @@ msgstr "Удалено удалённых элементов: %d."
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "Получено элементов: %d/%d."
|
msgstr "Получено элементов: %d/%d."
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "Статус: «%s»."
|
msgstr "Статус: «%s»."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -997,6 +1004,16 @@ msgstr "Отмена..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Завершено: %s"
|
msgstr "Завершено: %s"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr "Последняя ошибка: %s"
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr "Простой"
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr "Выполнение"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "Синхронизация уже выполняется. Статус: %s"
|
msgstr "Синхронизация уже выполняется. Статус: %s"
|
||||||
@@ -1060,9 +1077,14 @@ msgstr "Светлая"
|
|||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Тёмная"
|
msgstr "Тёмная"
|
||||||
|
|
||||||
#, fuzzy
|
msgid "Uncompleted to-dos on top"
|
||||||
msgid "Show uncompleted to-dos on top of the lists"
|
msgstr "Незавершённые задачи сверху"
|
||||||
msgstr "Показывать незавершённые задачи вверху списков"
|
|
||||||
|
msgid "Sort notes by"
|
||||||
|
msgstr "Сортировать заметки по"
|
||||||
|
|
||||||
|
msgid "Reverse sort order"
|
||||||
|
msgstr "Обратный порядок сортировки"
|
||||||
|
|
||||||
msgid "Save geo-location with notes"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "Сохранять информацию о геолокации в заметках"
|
msgstr "Сохранять информацию о геолокации в заметках"
|
||||||
@@ -1080,10 +1102,20 @@ msgid "When creating a new note:"
|
|||||||
msgstr "При создании новой заметки:"
|
msgstr "При создании новой заметки:"
|
||||||
|
|
||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr "Показывать иконку в панели задач"
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
msgid "Global zoom percentage"
|
||||||
msgstr "Масштаб приложения в процентах"
|
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"
|
msgid "Automatically update the application"
|
||||||
msgstr "Автоматически обновлять приложение"
|
msgstr "Автоматически обновлять приложение"
|
||||||
@@ -1135,22 +1167,57 @@ msgstr "Имя пользователя Nextcloud"
|
|||||||
msgid "Nextcloud password"
|
msgid "Nextcloud password"
|
||||||
msgstr "Пароль Nextcloud"
|
msgstr "Пароль Nextcloud"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV URL"
|
msgid "WebDAV URL"
|
||||||
msgstr "Nextcloud WebDAV URL"
|
msgstr "URL WebDAV"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV username"
|
msgid "WebDAV username"
|
||||||
msgstr "Имя пользователя Nextcloud"
|
msgstr "Имя пользователя WebDAV"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "WebDAV password"
|
msgid "WebDAV password"
|
||||||
msgstr "Установить пароль"
|
msgstr "Пароль WebDAV"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "Неверное значение параметра: «%s». Доступные значения: %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"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "Элементы, которые не могут быть синхронизированы"
|
msgstr "Элементы, которые не могут быть синхронизированы"
|
||||||
|
|
||||||
@@ -1237,6 +1304,9 @@ msgstr "Подтвердить"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "Отменить синхронизацию"
|
msgstr "Отменить синхронизацию"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr "Сайт Joplin"
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr "Мастер-ключ %s"
|
msgstr "Мастер-ключ %s"
|
||||||
@@ -1262,11 +1332,10 @@ msgid "Edit notebook"
|
|||||||
msgstr "Редактировать блокнот"
|
msgstr "Редактировать блокнот"
|
||||||
|
|
||||||
msgid "Show all"
|
msgid "Show all"
|
||||||
msgstr ""
|
msgstr "Показать всё"
|
||||||
|
|
||||||
#, fuzzy
|
|
||||||
msgid "Errors only"
|
msgid "Errors only"
|
||||||
msgstr "Ошибка"
|
msgstr "Только ошибки"
|
||||||
|
|
||||||
msgid "This note has been modified:"
|
msgid "This note has been modified:"
|
||||||
msgstr "Эта заметка была изменена:"
|
msgstr "Эта заметка была изменена:"
|
||||||
@@ -1321,6 +1390,31 @@ msgstr "У вас сейчас нет блокнота. Создайте его
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "Добро пожаловать"
|
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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "Переключиться на следующую панель"
|
#~ msgstr "Переключиться на следующую панель"
|
||||||
|
|
||||||
|
@@ -177,13 +177,18 @@ msgstr "笔记已被保存。"
|
|||||||
msgid "Exits the application."
|
msgid "Exits the application."
|
||||||
msgstr "退出程序。"
|
msgstr "退出程序。"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
msgid ""
|
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."
|
"complete database including notebooks, notes, tags and resources."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"导出Joplin数据至给定文件目录。默认为导出所有的数据库,包含笔记本、笔记、标签"
|
"导出Joplin数据至给定文件目录。默认为导出所有的数据库,包含笔记本、笔记、标签"
|
||||||
"及资源。"
|
"及资源。"
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Destination format: %s"
|
||||||
|
msgstr "日期格式"
|
||||||
|
|
||||||
msgid "Exports only the given note."
|
msgid "Exports only the given note."
|
||||||
msgstr "仅导出给定笔记。"
|
msgstr "仅导出给定笔记。"
|
||||||
|
|
||||||
@@ -242,22 +247,16 @@ msgid ""
|
|||||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||||
msgstr "输入`help shortcuts`显示全部可用的快捷键列表。"
|
msgstr "输入`help shortcuts`显示全部可用的快捷键列表。"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports data into Joplin."
|
||||||
msgstr "导入Evernote笔记本文件(.enex文件)。"
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Source format: %s"
|
||||||
|
msgstr "无以下命令:%s"
|
||||||
|
|
||||||
msgid "Do not ask for confirmation."
|
msgid "Do not ask for confirmation."
|
||||||
msgstr "不再要求确认。"
|
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
|
#, javascript-format
|
||||||
msgid "Found: %d."
|
msgid "Found: %d."
|
||||||
msgstr "已找到:%d条。"
|
msgstr "已找到:%d条。"
|
||||||
@@ -472,6 +471,10 @@ msgstr "默认值: %s"
|
|||||||
msgid "Possible keys/values:"
|
msgid "Possible keys/values:"
|
||||||
msgstr "可用键/值:"
|
msgstr "可用键/值:"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Type `joplin help` for usage information."
|
||||||
|
msgstr "显示使用信息。"
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "严重错误:"
|
msgstr "严重错误:"
|
||||||
|
|
||||||
@@ -512,6 +515,18 @@ msgid ""
|
|||||||
"background and will be available soon."
|
"background and will be available soon."
|
||||||
msgstr ""
|
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"
|
msgid "File"
|
||||||
msgstr "文件"
|
msgstr "文件"
|
||||||
|
|
||||||
@@ -524,11 +539,15 @@ msgstr "新待办事项"
|
|||||||
msgid "New notebook"
|
msgid "New notebook"
|
||||||
msgstr "新笔记本"
|
msgstr "新笔记本"
|
||||||
|
|
||||||
msgid "Import Evernote notes"
|
msgid "Import"
|
||||||
msgstr "导入Evernote笔记"
|
msgstr "导入"
|
||||||
|
|
||||||
msgid "Evernote Export Files"
|
#, fuzzy
|
||||||
msgstr "Evernote导出文件"
|
msgid "Export"
|
||||||
|
msgstr "导入"
|
||||||
|
|
||||||
|
msgid "Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Hide %s"
|
msgid "Hide %s"
|
||||||
@@ -577,6 +596,10 @@ msgstr "帮助"
|
|||||||
msgid "Website and documentation"
|
msgid "Website and documentation"
|
||||||
msgstr "网站与文档"
|
msgstr "网站与文档"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Make a donation"
|
||||||
|
msgstr "网站与文档"
|
||||||
|
|
||||||
msgid "Check for updates..."
|
msgid "Check for updates..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -600,12 +623,8 @@ msgstr "确认"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "取消"
|
msgstr "取消"
|
||||||
|
|
||||||
#, fuzzy, javascript-format
|
msgid "Current version is up-to-date."
|
||||||
msgid ""
|
msgstr ""
|
||||||
"Release notes:\n"
|
|
||||||
"\n"
|
|
||||||
"%s"
|
|
||||||
msgstr "是否删除笔记?"
|
|
||||||
|
|
||||||
msgid "An update is available, do you want to download it now?"
|
msgid "An update is available, do you want to download it now?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -617,9 +636,6 @@ msgstr ""
|
|||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "否"
|
msgstr "否"
|
||||||
|
|
||||||
msgid "Current version is up-to-date."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Check synchronisation configuration"
|
msgid "Check synchronisation configuration"
|
||||||
msgstr "取消同步"
|
msgstr "取消同步"
|
||||||
@@ -785,6 +801,12 @@ msgstr "标签"
|
|||||||
msgid "Set alarm"
|
msgid "Set alarm"
|
||||||
msgstr "设置提醒"
|
msgstr "设置提醒"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||||
|
"note."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "to-do"
|
msgid "to-do"
|
||||||
msgstr "新待办事项"
|
msgstr "新待办事项"
|
||||||
@@ -806,9 +828,6 @@ msgstr "清除"
|
|||||||
msgid "OneDrive Login"
|
msgid "OneDrive Login"
|
||||||
msgstr "登陆OneDrive"
|
msgstr "登陆OneDrive"
|
||||||
|
|
||||||
msgid "Import"
|
|
||||||
msgstr "导入"
|
|
||||||
|
|
||||||
msgid "Options"
|
msgid "Options"
|
||||||
msgstr "选项"
|
msgstr "选项"
|
||||||
|
|
||||||
@@ -922,8 +941,8 @@ msgstr "已删除远程项目: %d。"
|
|||||||
msgid "Fetched items: %d/%d."
|
msgid "Fetched items: %d/%d."
|
||||||
msgstr "已新建本地项目: %d。"
|
msgstr "已新建本地项目: %d。"
|
||||||
|
|
||||||
#, javascript-format
|
#, fuzzy, javascript-format
|
||||||
msgid "State: \"%s\"."
|
msgid "State: %s."
|
||||||
msgstr "状态:\"%s\"。"
|
msgstr "状态:\"%s\"。"
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling..."
|
||||||
@@ -933,6 +952,16 @@ msgstr "正在取消..."
|
|||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "已完成:\"%s\""
|
msgstr "已完成:\"%s\""
|
||||||
|
|
||||||
|
#, fuzzy, javascript-format
|
||||||
|
msgid "Last error: %s"
|
||||||
|
msgstr "严重错误:"
|
||||||
|
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "In progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation is already in progress. State: %s"
|
msgid "Synchronisation is already in progress. State: %s"
|
||||||
msgstr "同步正在进行中。状态:%s"
|
msgstr "同步正在进行中。状态:%s"
|
||||||
@@ -996,9 +1025,16 @@ msgid "Dark"
|
|||||||
msgstr "深色"
|
msgstr "深色"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Show uncompleted to-dos on top of the lists"
|
msgid "Uncompleted to-dos on top"
|
||||||
msgstr "在列表上方显示未完成的待办事项"
|
msgstr "在列表上方显示未完成的待办事项"
|
||||||
|
|
||||||
|
msgid "Sort notes by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Reverse sort order"
|
||||||
|
msgstr "反转排序顺序。"
|
||||||
|
|
||||||
msgid "Save geo-location with notes"
|
msgid "Save geo-location with notes"
|
||||||
msgstr "保存笔记时同时保存地理定位信息"
|
msgstr "保存笔记时同时保存地理定位信息"
|
||||||
|
|
||||||
@@ -1020,7 +1056,15 @@ msgstr "创建新笔记。"
|
|||||||
msgid "Show tray icon"
|
msgid "Show tray icon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Set application zoom percentage"
|
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 ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Automatically update the application"
|
msgid "Automatically update the application"
|
||||||
@@ -1082,6 +1126,44 @@ msgstr ""
|
|||||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||||
msgstr "无效的选项值:\"%s\"。可用值为:%s。"
|
msgstr "无效的选项值:\"%s\"。可用值为:%s。"
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Joplin Export File"
|
||||||
|
msgstr "Evernote导出文件"
|
||||||
|
|
||||||
|
msgid "Markdown"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Joplin Export Directory"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Evernote Export File"
|
||||||
|
msgstr "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 "请选择最先删除的笔记或笔记本。"
|
||||||
|
|
||||||
msgid "Items that cannot be synchronised"
|
msgid "Items that cannot be synchronised"
|
||||||
msgstr "项目无法被同步。"
|
msgstr "项目无法被同步。"
|
||||||
|
|
||||||
@@ -1165,6 +1247,9 @@ msgstr "确认"
|
|||||||
msgid "Cancel synchronisation"
|
msgid "Cancel synchronisation"
|
||||||
msgstr "取消同步"
|
msgstr "取消同步"
|
||||||
|
|
||||||
|
msgid "Joplin website"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Master Key %s"
|
msgid "Master Key %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1247,6 +1332,28 @@ msgstr "您当前没有任何笔记本。点击(+)按钮创建新笔记本。"
|
|||||||
msgid "Welcome"
|
msgid "Welcome"
|
||||||
msgstr "欢迎"
|
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"
|
#~ msgid "Give focus to next pane"
|
||||||
#~ msgstr "聚焦于下个面板"
|
#~ msgstr "聚焦于下个面板"
|
||||||
|
|
||||||
|
39
CliClient/package-lock.json
generated
39
CliClient/package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "joplin",
|
"name": "joplin",
|
||||||
"version": "1.0.99",
|
"version": "1.0.103",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -435,6 +435,14 @@
|
|||||||
"universalify": "0.1.1"
|
"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": {
|
"fs.realpath": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||||
@@ -858,9 +866,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minizlib": {
|
"minizlib": {
|
||||||
"version": "1.0.4",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
|
||||||
"integrity": "sha512-sN4U9tIJtBRwKbwgFh9qJfrPIQ/GGTRr1MGqkgOeMTLy8/lM0FcWU//FqlnZ3Vb7gJ+Mxh3FOg1EklibdajbaQ==",
|
"integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"minipass": "2.2.1"
|
"minipass": "2.2.1"
|
||||||
}
|
}
|
||||||
@@ -1161,6 +1169,20 @@
|
|||||||
"semver": "5.4.1",
|
"semver": "5.4.1",
|
||||||
"simple-get": "2.7.0",
|
"simple-get": "2.7.0",
|
||||||
"tar": "3.2.1"
|
"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": {
|
"simple-concat": {
|
||||||
@@ -2005,13 +2027,14 @@
|
|||||||
"integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0="
|
"integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0="
|
||||||
},
|
},
|
||||||
"tar": {
|
"tar": {
|
||||||
"version": "3.2.1",
|
"version": "4.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/tar/-/tar-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.0.tgz",
|
||||||
"integrity": "sha512-ZSzds1E0IqutvMU8HxjMaU8eB7urw2fGwTq88ukDOVuUIh0656l7/P7LiVPxhO5kS4flcRJQk8USG+cghQbTUQ==",
|
"integrity": "sha512-gJlTiiErwo96K904FnoYWl+5+FBgS+FimU6GMh66XLdLa55al8+d4jeDfPoGwSNHdtWI5FJP6xurmVqhBuGJpQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"chownr": "1.0.1",
|
"chownr": "1.0.1",
|
||||||
|
"fs-minipass": "1.2.5",
|
||||||
"minipass": "2.2.1",
|
"minipass": "2.2.1",
|
||||||
"minizlib": "1.0.4",
|
"minizlib": "1.1.0",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"yallist": "3.0.2"
|
"yallist": "3.0.2"
|
||||||
}
|
}
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
],
|
],
|
||||||
"owner": "Laurent Cozic"
|
"owner": "Laurent Cozic"
|
||||||
},
|
},
|
||||||
"version": "1.0.99",
|
"version": "1.0.103",
|
||||||
"bin": {
|
"bin": {
|
||||||
"joplin": "./main.js"
|
"joplin": "./main.js"
|
||||||
},
|
},
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"node-emoji": "^1.8.1",
|
"node-emoji": "^1.8.1",
|
||||||
"node-fetch": "^1.7.1",
|
"node-fetch": "^1.7.1",
|
||||||
"node-persist": "^2.1.0",
|
"node-persist": "^2.1.0",
|
||||||
"os-tmpdir": "^1.0.2",
|
|
||||||
"promise": "^7.1.1",
|
"promise": "^7.1.1",
|
||||||
"proper-lockfile": "^2.0.1",
|
"proper-lockfile": "^2.0.1",
|
||||||
"query-string": "4.3.4",
|
"query-string": "4.3.4",
|
||||||
@@ -57,6 +56,7 @@
|
|||||||
"string-padding": "^1.0.2",
|
"string-padding": "^1.0.2",
|
||||||
"string-to-stream": "^1.1.0",
|
"string-to-stream": "^1.1.0",
|
||||||
"strip-ansi": "^4.0.0",
|
"strip-ansi": "^4.0.0",
|
||||||
|
"tar": "^4.4.0",
|
||||||
"tcp-port-used": "^0.1.2",
|
"tcp-port-used": "^0.1.2",
|
||||||
"tkwidgets": "^0.5.25",
|
"tkwidgets": "^0.5.25",
|
||||||
"url-parse": "^1.2.0",
|
"url-parse": "^1.2.0",
|
||||||
|
@@ -9,7 +9,7 @@ rsync -a "$ROOT_DIR/build/locales/" "$BUILD_DIR/locales/"
|
|||||||
mkdir -p "$BUILD_DIR/data"
|
mkdir -p "$BUILD_DIR/data"
|
||||||
|
|
||||||
if [[ $TEST_FILE == "" ]]; then
|
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
|
else
|
||||||
(cd "$ROOT_DIR" && npm test tests-build/$TEST_FILE.js)
|
(cd "$ROOT_DIR" && npm test tests-build/$TEST_FILE.js)
|
||||||
fi
|
fi
|
252
CliClient/tests/services_InteropService.js
Normal file
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
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);
|
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 folder = await Folder.save({ title: "folder1" });
|
||||||
let note = await Note.save({ title: "un", parent_id: folder.id });
|
let note = await Note.save({ title: "un", parent_id: folder.id });
|
||||||
await synchronizer().start();
|
await synchronizer().start();
|
||||||
@@ -883,6 +883,37 @@ describe('Synchronizer', function() {
|
|||||||
expect(fileContentEqual(resourcePath1, resourcePath1_2)).toBe(true);
|
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 () => {
|
it('should encryt resources', asyncTest(async () => {
|
||||||
Setting.setValue('encryption.enabled', true);
|
Setting.setValue('encryption.enabled', true);
|
||||||
const masterKey = await loadEncryptionMasterKey();
|
const masterKey = await loadEncryptionMasterKey();
|
||||||
@@ -1006,4 +1037,29 @@ describe('Synchronizer', function() {
|
|||||||
await localItemsSameAsRemote(all, expect);
|
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,7 @@ const { FileApi } = require('lib/file-api.js');
|
|||||||
const { FileApiDriverMemory } = require('lib/file-api-driver-memory.js');
|
const { FileApiDriverMemory } = require('lib/file-api-driver-memory.js');
|
||||||
const { FileApiDriverLocal } = require('lib/file-api-driver-local.js');
|
const { FileApiDriverLocal } = require('lib/file-api-driver-local.js');
|
||||||
const { FileApiDriverWebDav } = require('lib/file-api-driver-webdav.js');
|
const { FileApiDriverWebDav } = require('lib/file-api-driver-webdav.js');
|
||||||
|
const BaseService = require('lib/services/BaseService.js');
|
||||||
const { FsDriverNode } = require('lib/fs-driver-node.js');
|
const { FsDriverNode } = require('lib/fs-driver-node.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const { time } = require('lib/time-utils.js');
|
||||||
const { shimInit } = require('lib/shim-init-node.js');
|
const { shimInit } = require('lib/shim-init-node.js');
|
||||||
@@ -51,8 +52,8 @@ SyncTargetRegistry.addClass(SyncTargetFilesystem);
|
|||||||
SyncTargetRegistry.addClass(SyncTargetOneDrive);
|
SyncTargetRegistry.addClass(SyncTargetOneDrive);
|
||||||
SyncTargetRegistry.addClass(SyncTargetNextcloud);
|
SyncTargetRegistry.addClass(SyncTargetNextcloud);
|
||||||
|
|
||||||
const syncTargetId_ = SyncTargetRegistry.nameToId('nextcloud');
|
// const syncTargetId_ = SyncTargetRegistry.nameToId("nextcloud");
|
||||||
//const syncTargetId_ = SyncTargetRegistry.nameToId('memory');
|
const syncTargetId_ = SyncTargetRegistry.nameToId("memory");
|
||||||
//const syncTargetId_ = SyncTargetRegistry.nameToId('filesystem');
|
//const syncTargetId_ = SyncTargetRegistry.nameToId('filesystem');
|
||||||
const syncDir = __dirname + '/../tests/sync';
|
const syncDir = __dirname + '/../tests/sync';
|
||||||
|
|
||||||
@@ -63,7 +64,7 @@ console.info('Testing with sync target: ' + SyncTargetRegistry.idToName(syncTarg
|
|||||||
const logger = new Logger();
|
const logger = new Logger();
|
||||||
logger.addTarget('console');
|
logger.addTarget('console');
|
||||||
logger.addTarget('file', { path: logDir + '/log.txt' });
|
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('Note', Note);
|
||||||
BaseItem.loadClass('Folder', Folder);
|
BaseItem.loadClass('Folder', Folder);
|
||||||
@@ -75,6 +76,8 @@ BaseItem.loadClass('MasterKey', MasterKey);
|
|||||||
Setting.setConstant('appId', 'net.cozic.joplin-cli');
|
Setting.setConstant('appId', 'net.cozic.joplin-cli');
|
||||||
Setting.setConstant('appType', 'cli');
|
Setting.setConstant('appType', 'cli');
|
||||||
|
|
||||||
|
BaseService.logger_ = logger;
|
||||||
|
|
||||||
Setting.autoSaveEnabled = false;
|
Setting.autoSaveEnabled = false;
|
||||||
|
|
||||||
function syncTargetId() {
|
function syncTargetId() {
|
||||||
@@ -118,8 +121,9 @@ async function clearDatabase(id = null) {
|
|||||||
'DELETE FROM tags',
|
'DELETE FROM tags',
|
||||||
'DELETE FROM note_tags',
|
'DELETE FROM note_tags',
|
||||||
'DELETE FROM master_keys',
|
'DELETE FROM master_keys',
|
||||||
'DELETE FROM settings',
|
'DELETE FROM item_changes',
|
||||||
|
'DELETE FROM note_resources',
|
||||||
|
'DELETE FROM settings',
|
||||||
'DELETE FROM deleted_items',
|
'DELETE FROM deleted_items',
|
||||||
'DELETE FROM sync_items',
|
'DELETE FROM sync_items',
|
||||||
];
|
];
|
||||||
|
@@ -41,13 +41,14 @@ class ElectronAppWrapper {
|
|||||||
const windowState = windowStateKeeper({
|
const windowState = windowStateKeeper({
|
||||||
defaultWidth: 800,
|
defaultWidth: 800,
|
||||||
defaultHeight: 600,
|
defaultHeight: 600,
|
||||||
|
file: 'window-state-' + this.env_ + '.json',
|
||||||
});
|
});
|
||||||
|
|
||||||
const windowOptions = {
|
const windowOptions = {
|
||||||
'x': windowState.x,
|
x: windowState.x,
|
||||||
'y': windowState.y,
|
y: windowState.y,
|
||||||
'width': windowState.width,
|
width: windowState.width,
|
||||||
'height': windowState.height,
|
height: windowState.height,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Linux icon workaround for bug https://github.com/electron-userland/electron-builder/issues/2098
|
// Linux icon workaround for bug https://github.com/electron-userland/electron-builder/issues/2098
|
||||||
@@ -78,7 +79,7 @@ class ElectronAppWrapper {
|
|||||||
this.win_ = null;
|
this.win_ = null;
|
||||||
} else {
|
} else {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.win_.hide();
|
this.hide();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (this.trayShown() && !this.willQuitApp_) {
|
if (this.trayShown() && !this.willQuitApp_) {
|
||||||
@@ -109,14 +110,24 @@ class ElectronAppWrapper {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async exit() {
|
async quit() {
|
||||||
this.electronApp_.quit();
|
this.electronApp_.quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit(errorCode = 0) {
|
||||||
|
this.electronApp_.exit(errorCode);
|
||||||
|
}
|
||||||
|
|
||||||
trayShown() {
|
trayShown() {
|
||||||
return !!this.tray_;
|
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() {
|
buildDir() {
|
||||||
if (this.buildDir_) return this.buildDir_;
|
if (this.buildDir_) return this.buildDir_;
|
||||||
let dir = __dirname + '/build';
|
let dir = __dirname + '/build';
|
||||||
@@ -129,11 +140,24 @@ class ElectronAppWrapper {
|
|||||||
return dir;
|
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
|
// Note: this must be called only after the "ready" event of the app has been dispatched
|
||||||
createTray(contextMenu) {
|
createTray(contextMenu) {
|
||||||
try {
|
try {
|
||||||
const iconFilename = this.env_ === 'dev' ? '16x16-dev.png' : '16x16.png';
|
this.tray_ = new Tray(this.buildDir() + '/icons/' + this.trayIconFilename_())
|
||||||
this.tray_ = new Tray(this.buildDir() + '/icons/' + iconFilename)
|
|
||||||
this.tray_.setToolTip(this.electronApp_.getName())
|
this.tray_.setToolTip(this.electronApp_.getName())
|
||||||
this.tray_.setContextMenu(contextMenu)
|
this.tray_.setContextMenu(contextMenu)
|
||||||
|
|
||||||
@@ -151,11 +175,32 @@ class ElectronAppWrapper {
|
|||||||
this.tray_ = null;
|
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() {
|
async start() {
|
||||||
// Since we are doing other async things before creating the window, we might miss
|
// 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.
|
// the "ready" event. So we use the function below to make sure that the app is ready.
|
||||||
await this.waitForElectronAppReady();
|
await this.waitForElectronAppReady();
|
||||||
|
|
||||||
|
const alreadyRunning = await this.ensureSingleInstance();
|
||||||
|
if (alreadyRunning) return;
|
||||||
|
|
||||||
this.createWindow();
|
this.createWindow();
|
||||||
|
|
||||||
this.electronApp_.on('before-quit', () => {
|
this.electronApp_.on('before-quit', () => {
|
||||||
|
51
ElectronClient/app/InteropServiceHelper.js
Normal file
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 AlarmService = require('lib/services/AlarmService.js');
|
||||||
const AlarmServiceDriverNode = require('lib/services/AlarmServiceDriverNode');
|
const AlarmServiceDriverNode = require('lib/services/AlarmServiceDriverNode');
|
||||||
const DecryptionWorker = require('lib/services/DecryptionWorker');
|
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 { bridge } = require('electron').remote.require('./bridge');
|
||||||
const Menu = bridge().Menu;
|
const Menu = bridge().Menu;
|
||||||
@@ -144,8 +147,12 @@ class Application extends BaseApplication {
|
|||||||
this.updateTray();
|
this.updateTray();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (['NOTE_UPDATE_ONE', 'NOTE_DELETE', 'FOLDER_UPDATE_ONE', 'FOLDER_DELETE'].indexOf(action.type) >= 0) {
|
if (action.type == 'SETTING_UPDATE_ONE' && action.key == 'style.editor.fontFamily' || action.type == 'SETTING_UPDATE_ALL') {
|
||||||
if (!await reg.syncTarget().syncStarted()) reg.scheduleSync();
|
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) {
|
if (['EVENT_NOTE_ALARM_FIELD_CHANGE', 'NOTE_DELETE'].indexOf(action.type) >= 0) {
|
||||||
@@ -175,6 +182,101 @@ class Application extends BaseApplication {
|
|||||||
updateMenu(screen) {
|
updateMenu(screen) {
|
||||||
if (this.lastMenuScreen_ === screen) return;
|
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 = [
|
const template = [
|
||||||
{
|
{
|
||||||
label: _('File'),
|
label: _('File'),
|
||||||
@@ -211,22 +313,21 @@ class Application extends BaseApplication {
|
|||||||
}, {
|
}, {
|
||||||
type: 'separator',
|
type: 'separator',
|
||||||
}, {
|
}, {
|
||||||
label: _('Import Evernote notes'),
|
label: _('Import'),
|
||||||
|
submenu: importItems,
|
||||||
|
}, {
|
||||||
|
label: _('Export'),
|
||||||
|
submenu: exportItems,
|
||||||
|
}, {
|
||||||
|
type: 'separator',
|
||||||
|
}, {
|
||||||
|
label: _('Print'),
|
||||||
|
accelerator: 'CommandOrControl+P',
|
||||||
|
screens: ['Main'],
|
||||||
click: () => {
|
click: () => {
|
||||||
const filePaths = bridge().showOpenDialog({
|
|
||||||
properties: ['openFile', 'createDirectory'],
|
|
||||||
filters: [
|
|
||||||
{ name: _('Evernote Export Files'), extensions: ['enex'] },
|
|
||||||
]
|
|
||||||
});
|
|
||||||
if (!filePaths || !filePaths.length) return;
|
|
||||||
|
|
||||||
this.dispatch({
|
this.dispatch({
|
||||||
type: 'NAV_GO',
|
type: 'WINDOW_COMMAND',
|
||||||
routeName: 'Import',
|
name: 'print',
|
||||||
props: {
|
|
||||||
filePath: filePaths[0],
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
@@ -236,13 +337,13 @@ class Application extends BaseApplication {
|
|||||||
label: _('Hide %s', 'Joplin'),
|
label: _('Hide %s', 'Joplin'),
|
||||||
platforms: ['darwin'],
|
platforms: ['darwin'],
|
||||||
accelerator: 'CommandOrControl+H',
|
accelerator: 'CommandOrControl+H',
|
||||||
click: () => { bridge().window().hide() }
|
click: () => { bridge().electronApp().hide() }
|
||||||
}, {
|
}, {
|
||||||
type: 'separator',
|
type: 'separator',
|
||||||
}, {
|
}, {
|
||||||
label: _('Quit'),
|
label: _('Quit'),
|
||||||
accelerator: 'CommandOrControl+Q',
|
accelerator: 'CommandOrControl+Q',
|
||||||
click: () => { bridge().electronApp().exit() }
|
click: () => { bridge().electronApp().quit() }
|
||||||
}]
|
}]
|
||||||
}, {
|
}, {
|
||||||
label: _('Edit'),
|
label: _('Edit'),
|
||||||
@@ -287,6 +388,29 @@ class Application extends BaseApplication {
|
|||||||
name: 'toggleVisiblePanes',
|
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'),
|
label: _('Tools'),
|
||||||
@@ -325,11 +449,17 @@ class Application extends BaseApplication {
|
|||||||
label: _('Website and documentation'),
|
label: _('Website and documentation'),
|
||||||
accelerator: 'F1',
|
accelerator: 'F1',
|
||||||
click () { bridge().openExternal('http://joplin.cozic.net') }
|
click () { bridge().openExternal('http://joplin.cozic.net') }
|
||||||
|
}, {
|
||||||
|
label: _('Make a donation'),
|
||||||
|
click () { bridge().openExternal('http://joplin.cozic.net/donate') }
|
||||||
}, {
|
}, {
|
||||||
label: _('Check for updates...'),
|
label: _('Check for updates...'),
|
||||||
click: () => {
|
click: () => {
|
||||||
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath());
|
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath());
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
type: 'separator',
|
||||||
|
screens: ['Main'],
|
||||||
}, {
|
}, {
|
||||||
label: _('About Joplin'),
|
label: _('About Joplin'),
|
||||||
click: () => {
|
click: () => {
|
||||||
@@ -340,8 +470,8 @@ class Application extends BaseApplication {
|
|||||||
'Copyright © 2016-2018 Laurent Cozic',
|
'Copyright © 2016-2018 Laurent Cozic',
|
||||||
_('%s %s (%s, %s)', p.name, p.version, Setting.value('env'), process.platform),
|
_('%s %s (%s, %s)', p.name, p.version, Setting.value('env'), process.platform),
|
||||||
];
|
];
|
||||||
bridge().showMessageBox({
|
bridge().showInfoMessageBox(message.join('\n'), {
|
||||||
message: message.join('\n'),
|
icon: bridge().electronApp().buildDir() + '/icons/32x32.png',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
@@ -395,12 +525,27 @@ class Application extends BaseApplication {
|
|||||||
const contextMenu = Menu.buildFromTemplate([
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
{ label: _('Open %s', app.electronApp().getName()), click: () => { app.window().show(); } },
|
{ label: _('Open %s', app.electronApp().getName()), click: () => { app.window().show(); } },
|
||||||
{ type: 'separator' },
|
{ type: 'separator' },
|
||||||
{ label: _('Exit'), click: () => { app.exit() } },
|
{ label: _('Exit'), click: () => { app.quit() } },
|
||||||
])
|
])
|
||||||
app.createTray(contextMenu);
|
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) {
|
async start(argv) {
|
||||||
argv = await super.start(argv);
|
argv = await super.start(argv);
|
||||||
|
|
||||||
@@ -464,6 +609,8 @@ class Application extends BaseApplication {
|
|||||||
AlarmService.garbageCollect();
|
AlarmService.garbageCollect();
|
||||||
}, 1000 * 60 * 60);
|
}, 1000 * 60 * 60);
|
||||||
|
|
||||||
|
ResourceService.runInBackground();
|
||||||
|
|
||||||
if (Setting.value('env') === 'dev') {
|
if (Setting.value('env') === 'dev') {
|
||||||
AlarmService.updateAllNotifications();
|
AlarmService.updateAllNotifications();
|
||||||
} else {
|
} else {
|
||||||
|
@@ -62,20 +62,23 @@ class Bridge {
|
|||||||
return filePaths;
|
return filePaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
showMessageBox(window, options) {
|
// Don't use this directly - call one of the showXxxxxxxMessageBox() instead
|
||||||
|
showMessageBox_(window, options) {
|
||||||
const {dialog} = require('electron');
|
const {dialog} = require('electron');
|
||||||
|
const nativeImage = require('electron').nativeImage
|
||||||
|
if (!window) window = this.window();
|
||||||
return dialog.showMessageBox(window, options);
|
return dialog.showMessageBox(window, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
showErrorMessageBox(message) {
|
showErrorMessageBox(message) {
|
||||||
return this.showMessageBox(this.window(), {
|
return this.showMessageBox_(this.window(), {
|
||||||
type: 'error',
|
type: 'error',
|
||||||
message: message,
|
message: message,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
showConfirmMessageBox(message) {
|
showConfirmMessageBox(message) {
|
||||||
const result = this.showMessageBox(this.window(), {
|
const result = this.showMessageBox_(this.window(), {
|
||||||
type: 'question',
|
type: 'question',
|
||||||
message: message,
|
message: message,
|
||||||
buttons: [_('OK'), _('Cancel')],
|
buttons: [_('OK'), _('Cancel')],
|
||||||
@@ -83,12 +86,12 @@ class Bridge {
|
|||||||
return result === 0;
|
return result === 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
showInfoMessageBox(message) {
|
showInfoMessageBox(message, options = {}) {
|
||||||
const result = this.showMessageBox(this.window(), {
|
const result = this.showMessageBox_(this.window(), Object.assign({}, {
|
||||||
type: 'info',
|
type: 'info',
|
||||||
message: message,
|
message: message,
|
||||||
buttons: [_('OK')],
|
buttons: [_('OK')],
|
||||||
});
|
}, options));
|
||||||
return result === 0;
|
return result === 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,23 +111,6 @@ class Bridge {
|
|||||||
return require('electron').shell.openItem(fullPath)
|
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) {
|
checkForUpdates(inBackground, window, logFilePath) {
|
||||||
const { checkForUpdates } = require('./checkForUpdates.js');
|
const { checkForUpdates } = require('./checkForUpdates.js');
|
||||||
checkForUpdates(inBackground, window, logFilePath);
|
checkForUpdates(inBackground, window, logFilePath);
|
||||||
|
BIN
ElectronClient/app/build/icons/16x16@2x.png
Normal file
BIN
ElectronClient/app/build/icons/16x16@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
ElectronClient/app/build/icons/16x16@3x.png
Normal file
BIN
ElectronClient/app/build/icons/16x16@3x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
ElectronClient/app/build/icons/32x32@3.png
Normal file
BIN
ElectronClient/app/build/icons/32x32@3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.3 KiB |
BIN
ElectronClient/app/build/icons/macos-16x16Template.png
Normal file
BIN
ElectronClient/app/build/icons/macos-16x16Template.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 348 B |
BIN
ElectronClient/app/build/icons/macos-16x16Template@2x.png
Normal file
BIN
ElectronClient/app/build/icons/macos-16x16Template@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 504 B |
@@ -1,31 +1,15 @@
|
|||||||
const { dialog } = require('electron')
|
const { dialog } = require('electron')
|
||||||
const { autoUpdater } = require('electron-updater')
|
|
||||||
const { Logger } = require('lib/logger.js');
|
const { Logger } = require('lib/logger.js');
|
||||||
const { _ } = require('lib/locale.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 autoUpdateLogger_ = new Logger();
|
||||||
let checkInBackground_ = false;
|
let checkInBackground_ = false;
|
||||||
let isCheckingForUpdate_ = false;
|
let isCheckingForUpdate_ = false;
|
||||||
let parentWindow_ = null;
|
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) {
|
function showErrorMessageBox(message) {
|
||||||
return dialog.showMessageBox(parentWindow_, {
|
return dialog.showMessageBox(parentWindow_, {
|
||||||
type: 'error',
|
type: 'error',
|
||||||
@@ -43,75 +27,45 @@ function onCheckEnded() {
|
|||||||
isCheckingForUpdate_ = false;
|
isCheckingForUpdate_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
autoUpdater.on('error', (error) => {
|
async function fetchLatestRelease() {
|
||||||
autoUpdateLogger_.error(error);
|
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
|
||||||
if (checkInBackground_) return onCheckEnded();
|
|
||||||
showErrorMessageBox(error == null ? "unknown" : (error.stack || error).toString())
|
|
||||||
onCheckEnded();
|
|
||||||
})
|
|
||||||
|
|
||||||
function findDownloadFilename_(info) {
|
if (!response.ok) {
|
||||||
// { version: '1.0.64',
|
const responseText = await response.text();
|
||||||
// files:
|
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||||
// [ { 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < info.files.length; i++) {
|
const json = await response.json();
|
||||||
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;
|
const version = json.tag_name.substr(1);
|
||||||
if (f.indexOf('.dmg') >= 0) return f;
|
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) {
|
function checkForUpdates(inBackground, window, logFilePath) {
|
||||||
if (isCheckingForUpdate_) {
|
if (isCheckingForUpdate_) {
|
||||||
autoUpdateLogger_.info('checkForUpdates: Skipping check because it is already running');
|
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_.addTarget('file', { path: logFilePath });
|
||||||
autoUpdateLogger_.setLevel(Logger.LEVEL_DEBUG);
|
autoUpdateLogger_.setLevel(Logger.LEVEL_DEBUG);
|
||||||
autoUpdateLogger_.info('checkForUpdates: Initializing...');
|
autoUpdateLogger_.info('checkForUpdates: Initializing...');
|
||||||
autoUpdater.logger = autoUpdateLogger_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
checkInBackground_ = inBackground;
|
checkInBackground_ = inBackground;
|
||||||
|
|
||||||
try {
|
fetchLatestRelease().then(release => {
|
||||||
autoUpdater.checkForUpdates()
|
if (compareVersions(release.version, packageInfo.version) <= 0) {
|
||||||
} catch (error) {
|
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);
|
autoUpdateLogger_.error(error);
|
||||||
if (!checkInBackground_) showErrorMessageBox(error.message);
|
if (!checkInBackground_) showErrorMessageBox(error.message);
|
||||||
|
}).then(() => {
|
||||||
onCheckEnded();
|
onCheckEnded();
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.checkForUpdates = checkForUpdates
|
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;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,6 +59,12 @@ class ConfigScreenComponent extends React.Component {
|
|||||||
display: 'inline-block',
|
display: 'inline-block',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const descriptionStyle = Object.assign({}, theme.textStyle, {
|
||||||
|
color: theme.colorFaded,
|
||||||
|
marginTop: 5,
|
||||||
|
fontStyle: 'italic',
|
||||||
|
});
|
||||||
|
|
||||||
const updateSettingValue = (key, value) => {
|
const updateSettingValue = (key, value) => {
|
||||||
return shared.updateSettingValue(this, key, value);
|
return shared.updateSettingValue(this, key, value);
|
||||||
}
|
}
|
||||||
@@ -71,6 +73,13 @@ class ConfigScreenComponent extends React.Component {
|
|||||||
|
|
||||||
const md = Setting.settingMetadata(key);
|
const md = Setting.settingMetadata(key);
|
||||||
|
|
||||||
|
const descriptionText = Setting.keyDescription(key, 'desktop');
|
||||||
|
const descriptionComp = descriptionText ? (
|
||||||
|
<div style={descriptionStyle}>
|
||||||
|
{descriptionText}
|
||||||
|
</div>
|
||||||
|
) : null;
|
||||||
|
|
||||||
if (md.isEnum) {
|
if (md.isEnum) {
|
||||||
let items = [];
|
let items = [];
|
||||||
const settingOptions = md.options();
|
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) }}>
|
<select value={value} style={controlStyle} onChange={(event) => { updateSettingValue(key, event.target.value) }}>
|
||||||
{items}
|
{items}
|
||||||
</select>
|
</select>
|
||||||
|
{ descriptionComp }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} else if (md.type === Setting.TYPE_BOOL) {
|
} else if (md.type === Setting.TYPE_BOOL) {
|
||||||
@@ -100,6 +110,7 @@ class ConfigScreenComponent extends React.Component {
|
|||||||
<div key={key+value.toString()} style={rowStyle}>
|
<div key={key+value.toString()} style={rowStyle}>
|
||||||
<div style={controlStyle}>
|
<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>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -115,6 +126,7 @@ class ConfigScreenComponent extends React.Component {
|
|||||||
<div key={key} style={rowStyle}>
|
<div key={key} style={rowStyle}>
|
||||||
<div style={labelStyle}><label>{md.label()}</label></div>
|
<div style={labelStyle}><label>{md.label()}</label></div>
|
||||||
<input type={inputType} style={inputStyle} value={this.state.settings[key]} onChange={(event) => {onTextChange(event)}} />
|
<input type={inputType} style={inputStyle} value={this.state.settings[key]} onChange={(event) => {onTextChange(event)}} />
|
||||||
|
{ descriptionComp }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} else if (md.type === Setting.TYPE_INT) {
|
} else if (md.type === Setting.TYPE_INT) {
|
||||||
@@ -126,6 +138,7 @@ class ConfigScreenComponent extends React.Component {
|
|||||||
<div key={key} style={rowStyle}>
|
<div key={key} style={rowStyle}>
|
||||||
<div style={labelStyle}><label>{md.label()}</label></div>
|
<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}/>
|
<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>
|
</div>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -22,6 +22,10 @@ class MainScreenComponent extends React.Component {
|
|||||||
componentWillMount() {
|
componentWillMount() {
|
||||||
this.setState({
|
this.setState({
|
||||||
promptOptions: null,
|
promptOptions: null,
|
||||||
|
modalLayer: {
|
||||||
|
visible: false,
|
||||||
|
message: '',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,6 +169,10 @@ class MainScreenComponent extends React.Component {
|
|||||||
});
|
});
|
||||||
} else if (command.name === 'toggleVisiblePanes') {
|
} else if (command.name === 'toggleVisiblePanes') {
|
||||||
this.toggleVisiblePanes();
|
this.toggleVisiblePanes();
|
||||||
|
} 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') {
|
} else if (command.name === 'editAlarm') {
|
||||||
const note = await Note.load(command.noteId);
|
const note = await Note.load(command.noteId);
|
||||||
|
|
||||||
@@ -265,6 +273,17 @@ class MainScreenComponent extends React.Component {
|
|||||||
height: height,
|
height: height,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.styles_.modalLayer = Object.assign({}, theme.textStyle, {
|
||||||
|
zIndex: 10000,
|
||||||
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
backgroundColor: theme.backgroundColorTransparent,
|
||||||
|
width: width - 20,
|
||||||
|
height: height - 20,
|
||||||
|
padding: 10,
|
||||||
|
});
|
||||||
|
|
||||||
return this.styles_;
|
return this.styles_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,8 +372,12 @@ class MainScreenComponent extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const modalLayerStyle = Object.assign({}, styles.modalLayer, { display: this.state.modalLayer.visible ? 'block' : 'none' });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={style}>
|
<div style={style}>
|
||||||
|
<div style={modalLayerStyle}>{this.state.modalLayer.message}</div>
|
||||||
|
|
||||||
<PromptDialog
|
<PromptDialog
|
||||||
autocomplete={promptOptions && ('autocomplete' in promptOptions) ? promptOptions.autocomplete : null}
|
autocomplete={promptOptions && ('autocomplete' in promptOptions) ? promptOptions.autocomplete : null}
|
||||||
defaultValue={promptOptions && promptOptions.value ? promptOptions.value : ''}
|
defaultValue={promptOptions && promptOptions.value ? promptOptions.value : ''}
|
||||||
|
@@ -9,6 +9,8 @@ const { bridge } = require('electron').remote.require('./bridge');
|
|||||||
const Menu = bridge().Menu;
|
const Menu = bridge().Menu;
|
||||||
const MenuItem = bridge().MenuItem;
|
const MenuItem = bridge().MenuItem;
|
||||||
const eventManager = require('../eventManager');
|
const eventManager = require('../eventManager');
|
||||||
|
const InteropService = require('lib/services/InteropService');
|
||||||
|
const InteropServiceHelper = require('../InteropServiceHelper.js');
|
||||||
|
|
||||||
class NoteListComponent extends React.Component {
|
class NoteListComponent extends React.Component {
|
||||||
|
|
||||||
@@ -91,6 +93,23 @@ class NoteListComponent extends React.Component {
|
|||||||
eventManager.emit('noteTypeToggle', { noteId: note.id });
|
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 () => {
|
menu.append(new MenuItem({label: _('Delete'), click: async () => {
|
||||||
|
@@ -240,6 +240,10 @@ class NoteTextComponent extends React.Component {
|
|||||||
if ('syncStarted' in nextProps && !nextProps.syncStarted && !this.isModified()) {
|
if ('syncStarted' in nextProps && !nextProps.syncStarted && !this.isModified()) {
|
||||||
await this.reloadNote(nextProps, { noReloadIfLocalChanges: true });
|
await this.reloadNote(nextProps, { noReloadIfLocalChanges: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nextProps.windowCommand) {
|
||||||
|
this.doCommand(nextProps.windowCommand);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isModified() {
|
isModified() {
|
||||||
@@ -292,7 +296,7 @@ class NoteTextComponent extends React.Component {
|
|||||||
|
|
||||||
const menu = new Menu()
|
const menu = new Menu()
|
||||||
|
|
||||||
if (itemType === 'image') {
|
if (itemType === "image" || itemType === "link") {
|
||||||
const resource = await Resource.load(arg0.resourceId);
|
const resource = await Resource.load(arg0.resourceId);
|
||||||
const resourcePath = Resource.fullPath(resource);
|
const resourcePath = Resource.fullPath(resource);
|
||||||
|
|
||||||
@@ -320,10 +324,7 @@ class NoteTextComponent extends React.Component {
|
|||||||
bridge().openItem(filePath);
|
bridge().openItem(filePath);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
bridge().showMessageBox({
|
bridge().showErrorMessageBox(_('Unsupported link or message: %s', msg));
|
||||||
type: 'error',
|
|
||||||
message: _('Unsupported link or message: %s', msg),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -429,6 +430,38 @@ class NoteTextComponent extends React.Component {
|
|||||||
this.scheduleSave();
|
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() {
|
async commandAttachFile() {
|
||||||
const filePaths = bridge().showOpenDialog({
|
const filePaths = bridge().showOpenDialog({
|
||||||
@@ -604,7 +637,7 @@ class NoteTextComponent extends React.Component {
|
|||||||
let bodyToRender = body;
|
let bodyToRender = body;
|
||||||
if (!bodyToRender.trim() && visiblePanes.indexOf('viewer') >= 0 && visiblePanes.indexOf('editor') < 0) {
|
if (!bodyToRender.trim() && visiblePanes.indexOf('viewer') >= 0 && visiblePanes.indexOf('editor') < 0) {
|
||||||
// Fixes https://github.com/laurent22/joplin/issues/217
|
// Fixes https://github.com/laurent22/joplin/issues/217
|
||||||
bodyToRender = '*' + _('This not has no content. Click on "%s" to toggle the editor and edit the note.', _('Layout')) + '*';
|
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);
|
const html = this.mdToHtml().render(bodyToRender, theme, mdOptions);
|
||||||
@@ -713,6 +746,7 @@ const mapStateToProps = (state) => {
|
|||||||
showAdvancedOptions: state.settings.showAdvancedOptions,
|
showAdvancedOptions: state.settings.showAdvancedOptions,
|
||||||
syncStarted: state.syncStarted,
|
syncStarted: state.syncStarted,
|
||||||
newNote: state.newNote,
|
newNote: state.newNote,
|
||||||
|
windowCommand: state.windowCommand,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -54,10 +54,7 @@ class OneDriveLoginScreenComponent extends React.Component {
|
|||||||
this.props.dispatch({ type: 'NAV_BACK' });
|
this.props.dispatch({ type: 'NAV_BACK' });
|
||||||
reg.scheduleSync(0);
|
reg.scheduleSync(0);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
bridge().showMessageBox({
|
bridge().showErrorMessageBox('Could not login to OneDrive. Please try again.\n\n' + error.message + "\n\n" + url.match(/.{1,64}/g).join('\n'));
|
||||||
type: 'error',
|
|
||||||
message: 'Could not login to OneDrive. Please try again.\n\n' + error.message + "\n\n" + url.match(/.{1,64}/g).join('\n'),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.authCode_ = null;
|
this.authCode_ = null;
|
||||||
|
@@ -1,19 +1,19 @@
|
|||||||
const React = require('react');
|
const React = require("react");
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require("react-redux");
|
||||||
const shared = require('lib/components/shared/side-menu-shared.js');
|
const shared = require("lib/components/shared/side-menu-shared.js");
|
||||||
const { Synchronizer } = require('lib/synchronizer.js');
|
const { Synchronizer } = require("lib/synchronizer.js");
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require("lib/BaseModel.js");
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require("lib/models/Folder.js");
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require("lib/models/Note.js");
|
||||||
const Tag = require('lib/models/Tag.js');
|
const Tag = require("lib/models/Tag.js");
|
||||||
const { _ } = require('lib/locale.js');
|
const { _ } = require("lib/locale.js");
|
||||||
const { themeStyle } = require('../theme.js');
|
const { themeStyle } = require("../theme.js");
|
||||||
const { bridge } = require('electron').remote.require('./bridge');
|
const { bridge } = require("electron").remote.require("./bridge");
|
||||||
const Menu = bridge().Menu;
|
const Menu = bridge().Menu;
|
||||||
const MenuItem = bridge().MenuItem;
|
const MenuItem = bridge().MenuItem;
|
||||||
|
const InteropServiceHelper = require("../InteropServiceHelper.js");
|
||||||
|
|
||||||
class SideBarComponent extends React.Component {
|
class SideBarComponent extends React.Component {
|
||||||
|
|
||||||
style() {
|
style() {
|
||||||
const theme = themeStyle(this.props.theme);
|
const theme = themeStyle(this.props.theme);
|
||||||
|
|
||||||
@@ -27,63 +27,65 @@ class SideBarComponent extends React.Component {
|
|||||||
height: itemHeight,
|
height: itemHeight,
|
||||||
fontFamily: theme.fontFamily,
|
fontFamily: theme.fontFamily,
|
||||||
fontSize: theme.fontSize,
|
fontSize: theme.fontSize,
|
||||||
textDecoration: 'none',
|
textDecoration: "none",
|
||||||
boxSizing: 'border-box',
|
boxSizing: "border-box",
|
||||||
color: theme.color2,
|
color: theme.color2,
|
||||||
paddingLeft: 14,
|
paddingLeft: 14,
|
||||||
display: 'flex',
|
display: "flex",
|
||||||
alignItems: 'center',
|
alignItems: "center",
|
||||||
cursor: 'default',
|
cursor: "default",
|
||||||
opacity: 0.8,
|
opacity: 0.8,
|
||||||
whiteSpace: 'nowrap',
|
whiteSpace: "nowrap",
|
||||||
},
|
},
|
||||||
listItemSelected: {
|
listItemSelected: {
|
||||||
backgroundColor: theme.selectedColor2,
|
backgroundColor: theme.selectedColor2,
|
||||||
},
|
},
|
||||||
conflictFolder: {
|
conflictFolder: {
|
||||||
color: theme.colorError2,
|
color: theme.colorError2,
|
||||||
fontWeight: 'bold',
|
fontWeight: "bold",
|
||||||
},
|
},
|
||||||
header: {
|
header: {
|
||||||
height: itemHeight * 1.8,
|
height: itemHeight * 1.8,
|
||||||
fontFamily: theme.fontFamily,
|
fontFamily: theme.fontFamily,
|
||||||
fontSize: theme.fontSize * 1.3,
|
fontSize: theme.fontSize * 1.3,
|
||||||
textDecoration: 'none',
|
textDecoration: "none",
|
||||||
boxSizing: 'border-box',
|
boxSizing: "border-box",
|
||||||
color: theme.color2,
|
color: theme.color2,
|
||||||
paddingLeft: 8,
|
paddingLeft: 8,
|
||||||
display: 'flex',
|
display: "flex",
|
||||||
alignItems: 'center',
|
alignItems: "center",
|
||||||
},
|
},
|
||||||
button: {
|
button: {
|
||||||
padding: 6,
|
padding: 6,
|
||||||
fontFamily: theme.fontFamily,
|
fontFamily: theme.fontFamily,
|
||||||
fontSize: theme.fontSize,
|
fontSize: theme.fontSize,
|
||||||
textDecoration: 'none',
|
textDecoration: "none",
|
||||||
boxSizing: 'border-box',
|
boxSizing: "border-box",
|
||||||
color: theme.color2,
|
color: theme.color2,
|
||||||
display: 'flex',
|
display: "flex",
|
||||||
alignItems: 'center',
|
alignItems: "center",
|
||||||
justifyContent: 'center',
|
justifyContent: "center",
|
||||||
border: "1px solid rgba(255,255,255,0.2)",
|
border: "1px solid rgba(255,255,255,0.2)",
|
||||||
marginTop: 10,
|
marginTop: 10,
|
||||||
marginLeft: 5,
|
marginLeft: 5,
|
||||||
marginRight: 5,
|
marginRight: 5,
|
||||||
cursor: 'default',
|
cursor: "default",
|
||||||
},
|
},
|
||||||
syncReport: {
|
syncReport: {
|
||||||
fontFamily: theme.fontFamily,
|
fontFamily: theme.fontFamily,
|
||||||
fontSize: Math.round(theme.fontSize * .9),
|
fontSize: Math.round(theme.fontSize * 0.9),
|
||||||
color: theme.color2,
|
color: theme.color2,
|
||||||
opacity: .5,
|
opacity: 0.5,
|
||||||
display: 'flex',
|
display: "flex",
|
||||||
alignItems: 'left',
|
alignItems: "left",
|
||||||
justifyContent: 'top',
|
justifyContent: "top",
|
||||||
flexDirection: 'column',
|
flexDirection: "column",
|
||||||
marginTop: 10,
|
marginTop: 10,
|
||||||
marginLeft: 5,
|
marginLeft: 5,
|
||||||
marginRight: 5,
|
marginRight: 5,
|
||||||
minHeight: 70,
|
minHeight: 70,
|
||||||
|
wordWrap: "break-word",
|
||||||
|
width: "100%",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -91,19 +93,19 @@ class SideBarComponent extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
itemContextMenu(event) {
|
itemContextMenu(event) {
|
||||||
const itemId = event.target.getAttribute('data-id');
|
const itemId = event.target.getAttribute("data-id");
|
||||||
if (itemId === Folder.conflictFolderId()) return;
|
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) {
|
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) {
|
} 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) {
|
} else if (itemType === BaseModel.TYPE_SEARCH) {
|
||||||
deleteMessage = _('Remove this search from the sidebar?');
|
deleteMessage = _("Remove this search from the sidebar?");
|
||||||
}
|
}
|
||||||
|
|
||||||
const menu = new Menu();
|
const menu = new Menu();
|
||||||
@@ -113,30 +115,55 @@ class SideBarComponent extends React.Component {
|
|||||||
item = BaseModel.byId(this.props.folders, itemId);
|
item = BaseModel.byId(this.props.folders, itemId);
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.append(new MenuItem({label: _('Delete'), click: async () => {
|
menu.append(
|
||||||
const ok = bridge().showConfirmMessageBox(deleteMessage);
|
new MenuItem({
|
||||||
if (!ok) return;
|
label: _("Delete"),
|
||||||
|
click: async () => {
|
||||||
|
const ok = bridge().showConfirmMessageBox(deleteMessage);
|
||||||
|
if (!ok) return;
|
||||||
|
|
||||||
if (itemType === BaseModel.TYPE_FOLDER) {
|
if (itemType === BaseModel.TYPE_FOLDER) {
|
||||||
await Folder.delete(itemId);
|
await Folder.delete(itemId);
|
||||||
} else if (itemType === BaseModel.TYPE_TAG) {
|
} else if (itemType === BaseModel.TYPE_TAG) {
|
||||||
await Tag.untagAll(itemId);
|
await Tag.untagAll(itemId);
|
||||||
} else if (itemType === BaseModel.TYPE_SEARCH) {
|
} else if (itemType === BaseModel.TYPE_SEARCH) {
|
||||||
this.props.dispatch({
|
this.props.dispatch({
|
||||||
type: 'SEARCH_DELETE',
|
type: "SEARCH_DELETE",
|
||||||
id: itemId,
|
id: itemId,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}}))
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
if (itemType === BaseModel.TYPE_FOLDER && !item.encryption_applied) {
|
if (itemType === BaseModel.TYPE_FOLDER && !item.encryption_applied) {
|
||||||
menu.append(new MenuItem({label: _('Rename'), click: async () => {
|
menu.append(
|
||||||
this.props.dispatch({
|
new MenuItem({
|
||||||
type: 'WINDOW_COMMAND',
|
label: _("Rename"),
|
||||||
name: 'renameFolder',
|
click: async () => {
|
||||||
id: itemId,
|
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());
|
menu.popup(bridge().window());
|
||||||
@@ -144,21 +171,21 @@ class SideBarComponent extends React.Component {
|
|||||||
|
|
||||||
folderItem_click(folder) {
|
folderItem_click(folder) {
|
||||||
this.props.dispatch({
|
this.props.dispatch({
|
||||||
type: 'FOLDER_SELECT',
|
type: "FOLDER_SELECT",
|
||||||
id: folder ? folder.id : null,
|
id: folder ? folder.id : null,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
tagItem_click(tag) {
|
tagItem_click(tag) {
|
||||||
this.props.dispatch({
|
this.props.dispatch({
|
||||||
type: 'TAG_SELECT',
|
type: "TAG_SELECT",
|
||||||
id: tag ? tag.id : null,
|
id: tag ? tag.id : null,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
searchItem_click(search) {
|
searchItem_click(search) {
|
||||||
this.props.dispatch({
|
this.props.dispatch({
|
||||||
type: 'SEARCH_SELECT',
|
type: "SEARCH_SELECT",
|
||||||
id: search ? search.id : null,
|
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);
|
if (folder.id === Folder.conflictFolderId()) style = Object.assign(style, this.style().conflictFolder);
|
||||||
|
|
||||||
const onDragOver = (event, folder) => {
|
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) => {
|
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();
|
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++) {
|
for (let i = 0; i < noteIds.length; i++) {
|
||||||
await Note.moveToFolder(noteIds[i], folder.id);
|
await Note.moveToFolder(noteIds[i], folder.id);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
const itemTitle = Folder.displayTitle(folder);
|
const itemTitle = Folder.displayTitle(folder);
|
||||||
|
|
||||||
return <a
|
return (
|
||||||
className="list-item"
|
<a
|
||||||
onDragOver={(event) => { onDragOver(event, folder) } }
|
className="list-item"
|
||||||
onDrop={(event) => { onDrop(event, folder) } }
|
onDragOver={event => {
|
||||||
href="#"
|
onDragOver(event, folder);
|
||||||
data-id={folder.id}
|
}}
|
||||||
data-type={BaseModel.TYPE_FOLDER}
|
onDrop={event => {
|
||||||
onContextMenu={(event) => this.itemContextMenu(event)}
|
onDrop(event, folder);
|
||||||
key={folder.id}
|
}}
|
||||||
style={style} onClick={() => {this.folderItem_click(folder)}}>{itemTitle}
|
href="#"
|
||||||
</a>
|
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) {
|
tagItem(tag, selected) {
|
||||||
let style = Object.assign({}, this.style().listItem);
|
let style = Object.assign({}, this.style().listItem);
|
||||||
if (selected) style = Object.assign(style, this.style().listItemSelected);
|
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) {
|
searchItem(search, selected) {
|
||||||
let style = Object.assign({}, this.style().listItem);
|
let style = Object.assign({}, this.style().listItem);
|
||||||
if (selected) style = Object.assign(style, this.style().listItemSelected);
|
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) {
|
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) {
|
makeHeader(key, label, iconName) {
|
||||||
const style = this.style().header;
|
const style = this.style().header;
|
||||||
const icon = <i style={{fontSize: style.fontSize * 1.2, marginRight: 5}} className={"fa " + iconName}></i>
|
const icon = <i style={{ fontSize: style.fontSize * 1.2, marginRight: 5 }} className={"fa " + iconName} />;
|
||||||
return <div style={style} key={key}>{icon}{label}</div>
|
return (
|
||||||
|
<div style={style} key={key}>
|
||||||
|
{icon}
|
||||||
|
{label}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronizeButton(type) {
|
synchronizeButton(type) {
|
||||||
const style = this.style().button;
|
const style = this.style().button;
|
||||||
const iconName = type === 'sync' ? 'fa-refresh' : 'fa-times';
|
const iconName = type === "sync" ? "fa-refresh" : "fa-times";
|
||||||
const label = type === 'sync' ? _('Synchronise') : _('Cancel');
|
const label = type === "sync" ? _("Synchronise") : _("Cancel");
|
||||||
const icon = <i style={{fontSize: style.fontSize, marginRight: 5}} className={"fa " + iconName}></i>
|
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>
|
return (
|
||||||
|
<a
|
||||||
|
className="synchronize-button"
|
||||||
|
style={style}
|
||||||
|
href="#"
|
||||||
|
key="sync_button"
|
||||||
|
onClick={() => {
|
||||||
|
this.sync_click();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{icon}
|
||||||
|
{label}
|
||||||
|
</a>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const theme = themeStyle(this.props.theme);
|
const theme = themeStyle(this.props.theme);
|
||||||
const style = Object.assign({}, this.style().root, this.props.style, {
|
const style = Object.assign({}, this.style().root, this.props.style, {
|
||||||
overflowX: 'hidden',
|
overflowX: "hidden",
|
||||||
overflowY: 'auto',
|
overflowY: "auto",
|
||||||
});
|
});
|
||||||
|
|
||||||
let items = [];
|
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) {
|
if (this.props.folders.length) {
|
||||||
const folderItems = shared.renderFolders(this.props, this.folderItem.bind(this));
|
const folderItems = shared.renderFolders(this.props, this.folderItem.bind(this));
|
||||||
items = items.concat(folderItems);
|
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) {
|
if (this.props.tags.length) {
|
||||||
const tagItems = shared.renderTags(this.props, this.tagItem.bind(this));
|
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) {
|
if (this.props.searches.length) {
|
||||||
items.push(this.makeHeader('searchHeader', _('Searches'), 'fa-search'));
|
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);
|
let lines = Synchronizer.reportToLines(this.props.syncReport);
|
||||||
const syncReportText = [];
|
const syncReportText = [];
|
||||||
for (let i = 0; i < lines.length; i++) {
|
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 (
|
return (
|
||||||
<div className="side-bar" style={style}>
|
<div className="side-bar" style={style}>
|
||||||
@@ -279,10 +381,9 @@ class SideBarComponent extends React.Component {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapStateToProps = (state) => {
|
const mapStateToProps = state => {
|
||||||
return {
|
return {
|
||||||
folders: state.folders,
|
folders: state.folders,
|
||||||
tags: state.tags,
|
tags: state.tags,
|
||||||
@@ -300,4 +401,4 @@ const mapStateToProps = (state) => {
|
|||||||
|
|
||||||
const SideBar = connect(mapStateToProps)(SideBarComponent);
|
const SideBar = connect(mapStateToProps)(SideBarComponent);
|
||||||
|
|
||||||
module.exports = { SideBar };
|
module.exports = { SideBar };
|
||||||
|
@@ -181,7 +181,11 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
document.addEventListener('contextmenu', function(event) {
|
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')) {
|
if (element && element.getAttribute('data-resource-id')) {
|
||||||
ipcRenderer.sendToHost('contextMenu', {
|
ipcRenderer.sendToHost('contextMenu', {
|
||||||
type: element.getAttribute('src') ? 'image' : 'link',
|
type: element.getAttribute('src') ? 'image' : 'link',
|
||||||
|
@@ -17,11 +17,6 @@
|
|||||||
.smalltalk .page {
|
.smalltalk .page {
|
||||||
max-width: 30em;
|
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;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -64,11 +64,17 @@ document.addEventListener('click', (event) => event.preventDefault());
|
|||||||
app().start(bridge().processArgv()).then(() => {
|
app().start(bridge().processArgv()).then(() => {
|
||||||
require('./gui/Root.min.js');
|
require('./gui/Root.min.js');
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
// If something goes wrong at this stage we don't have a console or a log file
|
if (error.code == 'flagError') {
|
||||||
// so display the error in a message box.
|
bridge().showErrorMessageBox(error.message);
|
||||||
let msg = ['Fatal error:', error.message];
|
} else {
|
||||||
if (error.fileName) msg.push(error.fileName);
|
// If something goes wrong at this stage we don't have a console or a log file
|
||||||
if (error.lineNumber) msg.push(error.lineNumber);
|
// so display the error in a message box.
|
||||||
if (error.stack) msg.push(error.stack);
|
let msg = ['Fatal error:', error.message];
|
||||||
bridge().showErrorMessageBox(msg.join('\n'));
|
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);
|
||||||
});
|
});
|
2087
ElectronClient/app/package-lock.json
generated
2087
ElectronClient/app/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Joplin",
|
"name": "Joplin",
|
||||||
"version": "1.0.67",
|
"version": "1.0.78",
|
||||||
"description": "Joplin for Desktop",
|
"description": "Joplin for Desktop",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -43,10 +43,12 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/laurent22/joplin#readme",
|
"homepage": "https://github.com/laurent22/joplin#readme",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"ajv": "^6.2.0",
|
||||||
|
"app-builder-bin": "^1.5.0",
|
||||||
"babel-cli": "^6.26.0",
|
"babel-cli": "^6.26.0",
|
||||||
"babel-preset-react": "^6.24.1",
|
"babel-preset-react": "^6.24.1",
|
||||||
"electron": "^1.7.11",
|
"electron": "^1.7.11",
|
||||||
"electron-builder": "^19.45.4"
|
"electron-builder": "^20.5.1"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"7zip-bin-mac": "^1.0.1",
|
"7zip-bin-mac": "^1.0.1",
|
||||||
@@ -57,9 +59,8 @@
|
|||||||
"app-module-path": "^2.2.0",
|
"app-module-path": "^2.2.0",
|
||||||
"async-mutex": "^0.1.3",
|
"async-mutex": "^0.1.3",
|
||||||
"base-64": "^0.1.0",
|
"base-64": "^0.1.0",
|
||||||
|
"compare-versions": "^3.1.0",
|
||||||
"electron-context-menu": "^0.9.1",
|
"electron-context-menu": "^0.9.1",
|
||||||
"electron-log": "^2.2.11",
|
|
||||||
"electron-updater": "^2.16.1",
|
|
||||||
"electron-window-state": "^4.1.1",
|
"electron-window-state": "^4.1.1",
|
||||||
"follow-redirects": "^1.2.5",
|
"follow-redirects": "^1.2.5",
|
||||||
"form-data": "^2.3.1",
|
"form-data": "^2.3.1",
|
||||||
@@ -91,6 +92,7 @@
|
|||||||
"sqlite3": "^3.1.13",
|
"sqlite3": "^3.1.13",
|
||||||
"string-padding": "^1.0.2",
|
"string-padding": "^1.0.2",
|
||||||
"string-to-stream": "^1.1.0",
|
"string-to-stream": "^1.1.0",
|
||||||
|
"tar": "^4.4.0",
|
||||||
"tcp-port-used": "^0.1.2",
|
"tcp-port-used": "^0.1.2",
|
||||||
"url-parse": "^1.2.0",
|
"url-parse": "^1.2.0",
|
||||||
"uuid": "^3.1.0",
|
"uuid": "^3.1.0",
|
||||||
|
@@ -7,6 +7,7 @@ const globalStyle = {
|
|||||||
itemMarginTop: 10,
|
itemMarginTop: 10,
|
||||||
itemMarginBottom: 10,
|
itemMarginBottom: 10,
|
||||||
backgroundColor: "#ffffff",
|
backgroundColor: "#ffffff",
|
||||||
|
backgroundColorTransparent: 'rgba(255,255,255,0.9)',
|
||||||
oddBackgroundColor: "#dddddd",
|
oddBackgroundColor: "#dddddd",
|
||||||
color: "#222222", // For regular text
|
color: "#222222", // For regular text
|
||||||
colorError: "red",
|
colorError: "red",
|
||||||
|
@@ -90,6 +90,8 @@ async function main(argv) {
|
|||||||
if (linuxUrl) content = content.replace(/(https:\/\/github.com\/laurent22\/joplin\/releases\/download\/.*?\.AppImage)/, linuxUrl);
|
if (linuxUrl) content = content.replace(/(https:\/\/github.com\/laurent22\/joplin\/releases\/download\/.*?\.AppImage)/, linuxUrl);
|
||||||
|
|
||||||
setReadmeContent(content);
|
setReadmeContent(content);
|
||||||
|
|
||||||
|
console.info("git pull && git add -A && git commit -m 'Update readme downloads' && git push")
|
||||||
}
|
}
|
||||||
|
|
||||||
main(process.argv).catch((error) => {
|
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.
|
|
89
README.md
89
README.md
@@ -1,10 +1,10 @@
|
|||||||
# Joplin
|
# 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).
|
Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown).
|
||||||
|
|
||||||
Notes exported from Evernote via .enex files [can be imported](#importing-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.).
|
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 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.
|
The notes can be [synchronised](#synchronisation) with various cloud services including [Nextcloud](https://nextcloud.com/), the file system (for example with a network directory) or with Microsoft OneDrive. When synchronising the notes, notebooks, tags and other metadata are saved to plain text files which can be easily inspected, backed up and moved around.
|
||||||
|
|
||||||
The 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/).
|
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/).
|
||||||
|
|
||||||
@@ -18,15 +18,15 @@ Three types of applications are available: for the **desktop** (Windows, macOS a
|
|||||||
|
|
||||||
Operating System | Download
|
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>
|
Windows | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.70/Joplin-Setup-1.0.70.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>
|
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.70/Joplin-1.0.70.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>
|
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.70/Joplin-1.0.70-x86_64.AppImage'><img alt='Get it on Linux' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/master/docs/images/BadgeLinux.png'/></a>
|
||||||
|
|
||||||
## Mobile applications
|
## Mobile applications
|
||||||
|
|
||||||
Operating System | Download | Alt. Download
|
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.101/joplin-v1.0.101.apk)
|
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.107/joplin-v1.0.107.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> | -
|
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> | -
|
||||||
|
|
||||||
## Terminal application
|
## Terminal application
|
||||||
@@ -51,20 +51,23 @@ For usage information, please refer to the full [Joplin Terminal Application Doc
|
|||||||
# Features
|
# Features
|
||||||
|
|
||||||
- Desktop, mobile and terminal applications.
|
- Desktop, mobile and terminal applications.
|
||||||
- Import Enex files (Evernote export format)
|
- End To End Encryption (E2EE)
|
||||||
|
- Synchronisation with various services, including NextCloud, WebDAV and OneDrive. Dropbox is planned.
|
||||||
|
- 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.
|
- 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.
|
- 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.
|
- 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.
|
- 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.
|
- File attachment support - images are displayed, and other files are linked and can be opened in the relevant application.
|
||||||
- Search functionality.
|
- Search functionality.
|
||||||
- Geo-location support.
|
- Geo-location support.
|
||||||
- Supports multiple languages
|
- 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:
|
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,17 +77,29 @@ 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:
|
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](/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](/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:
|
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/)
|
* 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.
|
* 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.
|
||||||
|
|
||||||
|
# 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
|
# 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 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.
|
||||||
@@ -93,7 +108,7 @@ Currently, synchronisation is possible with Nextcloud and OneDrive (by default)
|
|||||||
|
|
||||||
## Nextcloud synchronisation
|
## 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.
|
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. 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:
|
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:
|
||||||
|
|
||||||
@@ -108,12 +123,14 @@ If synchronisation does not work, please consult the logs in the app profile dir
|
|||||||
|
|
||||||
Select the "WebDAV" synchronisation target and follow the same instructions as for Nextcloud above.
|
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/)
|
- [Box.com](https://www.box.com/)
|
||||||
- [DriveHQ](https://www.drivehq.com)
|
- [DriveHQ](https://www.drivehq.com)
|
||||||
- [Zimbra](https://www.zimbra.com/)
|
- [OwnCloud](https://owncloud.org/)
|
||||||
- [Seafile](https://www.seafile.com/)
|
- [Seafile](https://www.seafile.com/)
|
||||||
|
- [Stack](https://www.transip.nl/stack/)
|
||||||
|
- [Zimbra](https://www.zimbra.com/)
|
||||||
|
|
||||||
## OneDrive synchronisation
|
## OneDrive synchronisation
|
||||||
|
|
||||||
@@ -177,12 +194,18 @@ Here is an example with the Markdown and rendered result side by side:
|
|||||||
|
|
||||||
Checkboxes can be added like so:
|
Checkboxes can be added like so:
|
||||||
|
|
||||||
-[ ] Milk
|
- [ ] Milk
|
||||||
-[ ] Rice
|
- [ ] Rice
|
||||||
-[ ] Eggs
|
- [ ] Eggs
|
||||||
|
|
||||||
The checkboxes can then be ticked in the mobile and desktop applications.
|
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](http://joplin.cozic.net/donate/) for information on how to support the development of Joplin.
|
||||||
|
|
||||||
# Contributing
|
# 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
|
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,18 +228,18 @@ Current translations:
|
|||||||
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
||||||
| Language | Po File | Last translator | Percent done
|
| Language | Po File | Last translator | Percent done
|
||||||
---|---|---|---|---
|
---|---|---|---|---
|
||||||
 | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 87%
|
 | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 79%
|
||||||
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić <trbuhom@net.hr> | 71%
|
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić <trbuhom@net.hr> | 64%
|
||||||
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Tobias Strobel <git@strobeltobias.de> | 89%
|
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Tobias Grasse <mail@tobias-grasse.net> | 99%
|
||||||
 | English | [en_GB](https://github.com/laurent22/joplin/blob/master/CliClient/locales/en_GB.po) | | 100%
|
 | 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> | 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%
|
 | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 99%
|
||||||
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 73%
|
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 66%
|
||||||
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 87%
|
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 80%
|
||||||
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | | 71%
|
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos <rnbastos@gmail.com> | 98%
|
||||||
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov <artyom.karlov@gmail.com> | 91%
|
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov <artyom.karlov@gmail.com> | 99%
|
||||||
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | RCJacH <RCJacH@outlook.com> | 73%
|
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | RCJacH <RCJacH@outlook.com> | 66%
|
||||||
 | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 71%
|
 | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 64%
|
||||||
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
||||||
|
|
||||||
# Known bugs
|
# Known bugs
|
||||||
@@ -226,6 +249,8 @@ Current translations:
|
|||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2016-2018 Laurent Cozic
|
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:
|
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,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"
|
applicationId "net.cozic.joplin"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 22
|
targetSdkVersion 22
|
||||||
versionCode 2097279
|
versionCode 2097285
|
||||||
versionName "1.0.101"
|
versionName "1.0.107"
|
||||||
ndk {
|
ndk {
|
||||||
abiFilters "armeabi-v7a", "x86"
|
abiFilters "armeabi-v7a", "x86"
|
||||||
}
|
}
|
||||||
|
@@ -1,51 +1,3 @@
|
|||||||
const { main } = require('./main.js');
|
const { main } = require('./main.js');
|
||||||
|
|
||||||
main();
|
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);
|
|
@@ -1302,7 +1302,7 @@
|
|||||||
PRODUCT_NAME = Joplin;
|
PRODUCT_NAME = Joplin;
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
TARGETED_DEVICE_FAMILY = 1;
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@@ -1342,7 +1342,7 @@
|
|||||||
PRODUCT_NAME = Joplin;
|
PRODUCT_NAME = Joplin;
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
TARGETED_DEVICE_FAMILY = 1;
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
|
@@ -15,7 +15,6 @@ ArrayUtils.removeElement = function(array, element) {
|
|||||||
|
|
||||||
// https://stackoverflow.com/a/10264318/561309
|
// https://stackoverflow.com/a/10264318/561309
|
||||||
ArrayUtils.binarySearch = function(items, value) {
|
ArrayUtils.binarySearch = function(items, value) {
|
||||||
|
|
||||||
var startIndex = 0,
|
var startIndex = 0,
|
||||||
stopIndex = items.length - 1,
|
stopIndex = items.length - 1,
|
||||||
middle = Math.floor((stopIndex + startIndex)/2);
|
middle = Math.floor((stopIndex + startIndex)/2);
|
||||||
@@ -37,4 +36,13 @@ ArrayUtils.binarySearch = function(items, value) {
|
|||||||
return (items[middle] != value) ? -1 : middle;
|
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;
|
module.exports = ArrayUtils;
|
@@ -1,5 +1,5 @@
|
|||||||
const { createStore, applyMiddleware } = require('redux');
|
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 { JoplinDatabase } = require('lib/joplin-database.js');
|
||||||
const { Database } = require('lib/database.js');
|
const { Database } = require('lib/database.js');
|
||||||
const { FoldersScreenUtils } = require('lib/folders-screen-utils.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 { _, setLocale, defaultLocale, closestSupportedLocale } = require('lib/locale.js');
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
|
const JoplinError = require('lib/JoplinError');
|
||||||
const EventEmitter = require('events');
|
const EventEmitter = require('events');
|
||||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
||||||
const SyncTargetFilesystem = require('lib/SyncTargetFilesystem.js');
|
const SyncTargetFilesystem = require('lib/SyncTargetFilesystem.js');
|
||||||
@@ -30,6 +31,7 @@ const SyncTargetNextcloud = require('lib/SyncTargetNextcloud.js');
|
|||||||
const SyncTargetWebDAV = require('lib/SyncTargetWebDAV.js');
|
const SyncTargetWebDAV = require('lib/SyncTargetWebDAV.js');
|
||||||
const EncryptionService = require('lib/services/EncryptionService');
|
const EncryptionService = require('lib/services/EncryptionService');
|
||||||
const DecryptionWorker = require('lib/services/DecryptionWorker');
|
const DecryptionWorker = require('lib/services/DecryptionWorker');
|
||||||
|
const BaseService = require('lib/services/BaseService');
|
||||||
|
|
||||||
SyncTargetRegistry.addClass(SyncTargetFilesystem);
|
SyncTargetRegistry.addClass(SyncTargetFilesystem);
|
||||||
SyncTargetRegistry.addClass(SyncTargetOneDrive);
|
SyncTargetRegistry.addClass(SyncTargetOneDrive);
|
||||||
@@ -95,14 +97,14 @@ class BaseApplication {
|
|||||||
let nextArg = argv.length >= 2 ? argv[1] : null;
|
let nextArg = argv.length >= 2 ? argv[1] : null;
|
||||||
|
|
||||||
if (arg == '--profile') {
|
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;
|
matched.profileDir = nextArg;
|
||||||
argv.splice(0, 2);
|
argv.splice(0, 2);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg == '--env') {
|
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;
|
matched.env = nextArg;
|
||||||
argv.splice(0, 2);
|
argv.splice(0, 2);
|
||||||
continue;
|
continue;
|
||||||
@@ -133,14 +135,14 @@ class BaseApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (arg == '--log-level') {
|
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);
|
matched.logLevel = Logger.levelStringToId(nextArg);
|
||||||
argv.splice(0, 2);
|
argv.splice(0, 2);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg.length && arg[0] == '-') {
|
if (arg.length && arg[0] == '-') {
|
||||||
throw new Error(_('Unknown flag: %s', arg));
|
throw new JoplinError(_('Unknown flag: %s', arg), 'flagError');
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -184,8 +186,9 @@ class BaseApplication {
|
|||||||
this.logger().debug('Refreshing notes:', parentType, parentId);
|
this.logger().debug('Refreshing notes:', parentType, parentId);
|
||||||
|
|
||||||
let options = {
|
let options = {
|
||||||
order: state.notesOrder,
|
order: stateUtils.notesOrder(state.settings),
|
||||||
uncompletedTodosOnTop: Setting.value('uncompletedTodosOnTop'),
|
uncompletedTodosOnTop: Setting.value('uncompletedTodosOnTop'),
|
||||||
|
caseInsensitive: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
const source = JSON.stringify({
|
const source = JSON.stringify({
|
||||||
@@ -255,14 +258,31 @@ class BaseApplication {
|
|||||||
|
|
||||||
const result = next(action);
|
const result = next(action);
|
||||||
const newState = store.getState();
|
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') {
|
||||||
Setting.setValue('activeFolderId', newState.selectedFolderId);
|
Setting.setValue('activeFolderId', newState.selectedFolderId);
|
||||||
this.currentFolder_ = newState.selectedFolderId ? await Folder.load(newState.selectedFolderId) : null;
|
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);
|
await this.refreshNotes(newState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,14 +308,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 (action.type === 'NOTE_UPDATE_ONE') {
|
||||||
// If there is a conflict, we refresh the folders so as to display "Conflicts" folder
|
// If there is a conflict, we refresh the folders so as to display "Conflicts" folder
|
||||||
if (action.note && action.note.is_conflict) {
|
if (action.note && action.note.is_conflict) {
|
||||||
@@ -303,11 +315,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') {
|
if (this.hasGui() && action.type == 'SETTING_UPDATE_ONE' && action.key == 'sync.interval' || action.type == 'SETTING_UPDATE_ALL') {
|
||||||
reg.setupRecurrentSync();
|
reg.setupRecurrentSync();
|
||||||
}
|
}
|
||||||
@@ -420,6 +427,7 @@ class BaseApplication {
|
|||||||
setLocale(Setting.value('locale'));
|
setLocale(Setting.value('locale'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BaseService.logger_ = this.logger_;
|
||||||
EncryptionService.instance().setLogger(this.logger_);
|
EncryptionService.instance().setLogger(this.logger_);
|
||||||
BaseItem.encryptionService_ = EncryptionService.instance();
|
BaseItem.encryptionService_ = EncryptionService.instance();
|
||||||
DecryptionWorker.instance().setLogger(this.logger_);
|
DecryptionWorker.instance().setLogger(this.logger_);
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { Database } = require('lib/database.js');
|
const { Database } = require('lib/database.js');
|
||||||
const { uuid } = require('lib/uuid.js');
|
const { uuid } = require('lib/uuid.js');
|
||||||
const { time } = require('lib/time-utils.js');
|
const { time } = require('lib/time-utils.js');
|
||||||
@@ -45,6 +44,14 @@ class BaseModel {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static modelTypeToName(type) {
|
||||||
|
for (let i = 0; i < BaseModel.typeEnum_.length; i++) {
|
||||||
|
const e = BaseModel.typeEnum_[i];
|
||||||
|
if (e[1] === type) return e[0].substr(5).toLowerCase();
|
||||||
|
}
|
||||||
|
throw new Error('Unknown model type: ' + type);
|
||||||
|
}
|
||||||
|
|
||||||
static hasField(name) {
|
static hasField(name) {
|
||||||
let fields = this.fieldNames();
|
let fields = this.fieldNames();
|
||||||
return fields.indexOf(name) >= 0;
|
return fields.indexOf(name) >= 0;
|
||||||
@@ -114,15 +121,6 @@ class BaseModel {
|
|||||||
return id.substr(0, 5);
|
return id.substr(0, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static minimalPartialId(id) {
|
|
||||||
// let length = 2;
|
|
||||||
// while (true) {
|
|
||||||
// const partialId = id.substr(0, length);
|
|
||||||
// const r = await this.db().selectOne('SELECT count(*) as total FROM `' + this.tableName() + '` WHERE `id` LIKE ?', [partialId + '%']);
|
|
||||||
// if (r['total'] <= 1) return partialId;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
static loadByPartialId(partialId) {
|
static loadByPartialId(partialId) {
|
||||||
return this.modelSelectAll('SELECT * FROM `' + this.tableName() + '` WHERE `id` LIKE ?', [partialId + '%']);
|
return this.modelSelectAll('SELECT * FROM `' + this.tableName() + '` WHERE `id` LIKE ?', [partialId + '%']);
|
||||||
}
|
}
|
||||||
@@ -214,20 +212,6 @@ class BaseModel {
|
|||||||
}
|
}
|
||||||
if ('type_' in newModel) output.type_ = newModel.type_;
|
if ('type_' in newModel) output.type_ = newModel.type_;
|
||||||
return output;
|
return output;
|
||||||
// let output = {};
|
|
||||||
// let type = null;
|
|
||||||
// for (let n in newModel) {
|
|
||||||
// if (!newModel.hasOwnProperty(n)) continue;
|
|
||||||
// if (n == 'type_') {
|
|
||||||
// type = newModel[n];
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
// if (!(n in oldModel) || newModel[n] !== oldModel[n]) {
|
|
||||||
// output[n] = newModel[n];
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (type !== null) output.type_ = type;
|
|
||||||
// return output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static diffObjectsFields(oldModel, newModel) {
|
static diffObjectsFields(oldModel, newModel) {
|
||||||
@@ -414,11 +398,10 @@ class BaseModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
output = this.filter(o);
|
output = this.filter(o);
|
||||||
} catch (error) {
|
} finally {
|
||||||
Log.error('Cannot save model', error);
|
this.releaseSaveMutex(o, mutexRelease);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.releaseSaveMutex(o, mutexRelease);
|
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@@ -487,15 +470,24 @@ class BaseModel {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseModel.TYPE_NOTE = 1;
|
BaseModel.typeEnum_ = [
|
||||||
BaseModel.TYPE_FOLDER = 2;
|
['TYPE_NOTE', 1],
|
||||||
BaseModel.TYPE_SETTING = 3;
|
['TYPE_FOLDER', 2],
|
||||||
BaseModel.TYPE_RESOURCE = 4;
|
['TYPE_SETTING', 3],
|
||||||
BaseModel.TYPE_TAG = 5;
|
['TYPE_RESOURCE', 4],
|
||||||
BaseModel.TYPE_NOTE_TAG = 6;
|
['TYPE_TAG', 5],
|
||||||
BaseModel.TYPE_SEARCH = 7;
|
['TYPE_NOTE_TAG', 6],
|
||||||
BaseModel.TYPE_ALARM = 8;
|
['TYPE_SEARCH', 7],
|
||||||
BaseModel.TYPE_MASTER_KEY = 9;
|
['TYPE_ALARM', 8],
|
||||||
|
['TYPE_MASTER_KEY', 9],
|
||||||
|
['TYPE_ITEM_CHANGE', 10],
|
||||||
|
['TYPE_NOTE_RESOURCE', 11],
|
||||||
|
];
|
||||||
|
|
||||||
|
for (let i = 0; i < BaseModel.typeEnum_.length; i++) {
|
||||||
|
const e = BaseModel.typeEnum_[i];
|
||||||
|
BaseModel[e[0]] = e[1];
|
||||||
|
}
|
||||||
|
|
||||||
BaseModel.db_ = null;
|
BaseModel.db_ = null;
|
||||||
BaseModel.dispatch = function(o) {};
|
BaseModel.dispatch = function(o) {};
|
||||||
|
@@ -28,8 +28,7 @@ class Cache {
|
|||||||
Cache.storage = async function() {
|
Cache.storage = async function() {
|
||||||
if (Cache.storage_) return Cache.storage_;
|
if (Cache.storage_) return Cache.storage_;
|
||||||
Cache.storage_ = require('node-persist');
|
Cache.storage_ = require('node-persist');
|
||||||
const osTmpdir = require('os-tmpdir');
|
await Cache.storage_.init({ dir: require('os').tmpdir() + '/joplin-cache', ttl: 1000 * 60 });
|
||||||
await Cache.storage_.init({ dir: osTmpdir() + '/joplin-cache', ttl: 1000 * 60 });
|
|
||||||
return Cache.storage_;
|
return Cache.storage_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -135,13 +135,17 @@ class MdToHtml {
|
|||||||
// Ideally they should be opened in the user's browser.
|
// Ideally they should be opened in the user's browser.
|
||||||
return '<span style="opacity: 0.5">(Resource not yet supported: '; //+ htmlentities(text) + ']';
|
return '<span style="opacity: 0.5">(Resource not yet supported: '; //+ htmlentities(text) + ']';
|
||||||
} else {
|
} else {
|
||||||
|
let resourceIdAttr = "";
|
||||||
|
let icon = "";
|
||||||
if (isResourceUrl) {
|
if (isResourceUrl) {
|
||||||
const resourceId = Resource.pathToId(href);
|
const resourceId = Resource.pathToId(href);
|
||||||
href = 'joplin://' + resourceId;
|
href = "joplin://" + resourceId;
|
||||||
|
resourceIdAttr = "data-resource-id='" + resourceId + "'";
|
||||||
|
icon = '<span class="resource-icon"></span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
const js = options.postMessageSyntax + "(" + JSON.stringify(href) + "); return false;";
|
const js = options.postMessageSyntax + "(" + JSON.stringify(href) + "); return false;";
|
||||||
let output = "<a title='" + htmlentities(title) + "' href='#' onclick='" + js + "'>";
|
let output = "<a " + resourceIdAttr + " title='" + htmlentities(title) + "' href='#' onclick='" + js + "'>" + icon;
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,7 +196,7 @@ class MdToHtml {
|
|||||||
let openTag = null;
|
let openTag = null;
|
||||||
let closeTag = null;
|
let closeTag = null;
|
||||||
let attrs = t.attrs ? t.attrs : [];
|
let attrs = t.attrs ? t.attrs : [];
|
||||||
let tokenContent = t.content ? t.content : null;
|
let tokenContent = t.content ? t.content : '';
|
||||||
const isCodeBlock = tag === 'code' && t.block;
|
const isCodeBlock = tag === 'code' && t.block;
|
||||||
const isInlineCode = t.type === 'code_inline';
|
const isInlineCode = t.type === 'code_inline';
|
||||||
const codeBlockLanguage = t && t.info ? t.info : null;
|
const codeBlockLanguage = t && t.info ? t.info : null;
|
||||||
@@ -394,7 +398,6 @@ class MdToHtml {
|
|||||||
let loopCount = 0;
|
let loopCount = 0;
|
||||||
while (renderedBody.indexOf('mJOPm') >= 0) {
|
while (renderedBody.indexOf('mJOPm') >= 0) {
|
||||||
renderedBody = renderedBody.replace(/mJOPmCHECKBOXm([A-Z]+)m(\d+)m/, function(v, type, index) {
|
renderedBody = renderedBody.replace(/mJOPmCHECKBOXm([A-Z]+)m(\d+)m/, function(v, type, index) {
|
||||||
|
|
||||||
const js = options.postMessageSyntax + "('checkboxclick:" + type + ':' + index + "'); this.classList.contains('tick') ? this.classList.remove('tick') : this.classList.add('tick'); return false;";
|
const js = options.postMessageSyntax + "('checkboxclick:" + type + ':' + index + "'); this.classList.contains('tick') ? this.classList.remove('tick') : this.classList.add('tick'); return false;";
|
||||||
return '<a href="#" onclick="' + js + '" class="checkbox ' + (type == 'NOTICK' ? '' : 'tick') + '"><span>' + '' + '</span></a>';
|
return '<a href="#" onclick="' + js + '" class="checkbox ' + (type == 'NOTICK' ? '' : 'tick') + '"><span>' + '' + '</span></a>';
|
||||||
});
|
});
|
||||||
@@ -443,6 +446,18 @@ class MdToHtml {
|
|||||||
ul {
|
ul {
|
||||||
padding-left: 1.3em;
|
padding-left: 1.3em;
|
||||||
}
|
}
|
||||||
|
.resource-icon {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
top: .5em;
|
||||||
|
text-decoration: none;
|
||||||
|
width: 1.15em;
|
||||||
|
height: 1.5em;
|
||||||
|
margin-right: 0.4em;
|
||||||
|
background-color: ` + style.htmlColor + `;
|
||||||
|
/* Awesome Font file */
|
||||||
|
-webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'><path d='M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z'/></svg>");
|
||||||
|
}
|
||||||
a.checkbox {
|
a.checkbox {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -480,13 +495,34 @@ class MdToHtml {
|
|||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.katex .mfrac .frac-line:before {
|
@media print {
|
||||||
/* top: 50%; */
|
body {
|
||||||
/* padding-bottom: .7em; */
|
height: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.checkbox {
|
||||||
|
border: 1pt solid ` + style.htmlColor + `;
|
||||||
|
border-radius: 2pt;
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
line-height: 1em;
|
||||||
|
text-align: center;
|
||||||
|
top: .4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.checkbox.tick:after {
|
||||||
|
content: "X";
|
||||||
|
}
|
||||||
|
|
||||||
|
a.checkbox.tick {
|
||||||
|
top: 0;
|
||||||
|
left: -0.02em;
|
||||||
|
color: ` + style.htmlColor + `;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const styleHtml = '<style>' + normalizeCss + "\n" + css + '</style>'; //+ '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css">';
|
const styleHtml = '<style>' + normalizeCss + "\n" + css + '</style>';
|
||||||
|
|
||||||
const output = styleHtml + renderedBody;
|
const output = styleHtml + renderedBody;
|
||||||
|
|
||||||
|
56
ReactNativeClient/lib/ObjectUtils.js
Normal file
56
ReactNativeClient/lib/ObjectUtils.js
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
const ObjectUtils = {};
|
||||||
|
|
||||||
|
ObjectUtils.sortByValue = function(object) {
|
||||||
|
const temp = [];
|
||||||
|
for (let k in object) {
|
||||||
|
if (!object.hasOwnProperty(k)) continue;
|
||||||
|
temp.push({
|
||||||
|
key: k,
|
||||||
|
value: object[k],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
temp.sort(function(a, b) {
|
||||||
|
let v1 = a.value;
|
||||||
|
let v2 = b.value;
|
||||||
|
if (typeof v1 === 'string') v1 = v1.toLowerCase();
|
||||||
|
if (typeof v2 === 'string') v2 = v2.toLowerCase();
|
||||||
|
if (v1 === v2) return 0;
|
||||||
|
return v1 < v2 ? -1 : +1;
|
||||||
|
});
|
||||||
|
|
||||||
|
const output = {};
|
||||||
|
for (let i = 0; i < temp.length; i++) {
|
||||||
|
const item = temp[i];
|
||||||
|
output[item.key] = item.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectUtils.fieldsEqual = function(o1, o2) {
|
||||||
|
if ((!o1 || !o2) && (o1 !== o2)) return false;
|
||||||
|
|
||||||
|
for (let k in o1) {
|
||||||
|
if (!o1.hasOwnProperty(k)) continue;
|
||||||
|
if (o1[k] !== o2[k]) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const c1 = Object.getOwnPropertyNames(o1);
|
||||||
|
const c2 = Object.getOwnPropertyNames(o2);
|
||||||
|
|
||||||
|
if (c1.length !== c2.length) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectUtils.convertValuesToFunctions = function(o) {
|
||||||
|
const output = {};
|
||||||
|
for (let n in o) {
|
||||||
|
if (!o.hasOwnProperty(n)) continue;
|
||||||
|
output[n] = () => { return typeof o[n] === 'function' ? o[n]() : o[n]; }
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ObjectUtils;
|
@@ -37,10 +37,10 @@ class SyncTargetNextcloud extends BaseSyncTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async initFileApi() {
|
async initFileApi() {
|
||||||
const fileApi = await SyncTargetWebDAV.initFileApi_(SyncTargetNextcloud.id(), {
|
const fileApi = await SyncTargetWebDAV.newFileApi_(SyncTargetNextcloud.id(), {
|
||||||
path: Setting.value('sync.5.path'),
|
path: () => Setting.value('sync.5.path'),
|
||||||
username: Setting.value('sync.5.username'),
|
username: () => Setting.value('sync.5.username'),
|
||||||
password: Setting.value('sync.5.password'),
|
password: () => Setting.value('sync.5.password'),
|
||||||
});
|
});
|
||||||
|
|
||||||
fileApi.setLogger(this.logger());
|
fileApi.setLogger(this.logger());
|
||||||
|
@@ -28,11 +28,11 @@ class SyncTargetWebDAV extends BaseSyncTarget {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static async initFileApi_(syncTargetId, options) {
|
static async newFileApi_(syncTargetId, options) {
|
||||||
const apiOptions = {
|
const apiOptions = {
|
||||||
baseUrl: () => options.path,
|
baseUrl: () => options.path(),
|
||||||
username: () => options.username,
|
username: () => options.username(),
|
||||||
password: () => options.password,
|
password: () => options.password(),
|
||||||
};
|
};
|
||||||
|
|
||||||
const api = new WebDavApi(apiOptions);
|
const api = new WebDavApi(apiOptions);
|
||||||
@@ -43,7 +43,8 @@ class SyncTargetWebDAV extends BaseSyncTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async checkConfig(options) {
|
static async checkConfig(options) {
|
||||||
const fileApi = await SyncTargetWebDAV.initFileApi_(SyncTargetWebDAV.id(), options);
|
const fileApi = await SyncTargetWebDAV.newFileApi_(SyncTargetWebDAV.id(), options);
|
||||||
|
fileApi.requestRepeatCount_ = 0;
|
||||||
|
|
||||||
const output = {
|
const output = {
|
||||||
ok: false,
|
ok: false,
|
||||||
@@ -52,7 +53,7 @@ class SyncTargetWebDAV extends BaseSyncTarget {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const result = await fileApi.stat('');
|
const result = await fileApi.stat('');
|
||||||
if (!result) throw new Error('Could not access WebDAV directory');
|
if (!result) throw new Error('WebDAV directory not found: ' + options.path);
|
||||||
output.ok = true;
|
output.ok = true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
output.errorMessage = error.message;
|
output.errorMessage = error.message;
|
||||||
@@ -63,10 +64,10 @@ class SyncTargetWebDAV extends BaseSyncTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async initFileApi() {
|
async initFileApi() {
|
||||||
const fileApi = await SyncTargetWebDAV.initFileApi_(SyncTargetWebDAV.id(), {
|
const fileApi = await SyncTargetWebDAV.newFileApi_(SyncTargetWebDAV.id(), {
|
||||||
path: Setting.value('sync.6.path'),
|
path: () => Setting.value('sync.6.path'),
|
||||||
username: Setting.value('sync.6.username'),
|
username: () => Setting.value('sync.6.username'),
|
||||||
password: Setting.value('sync.6.password'),
|
password: () => Setting.value('sync.6.password'),
|
||||||
});
|
});
|
||||||
|
|
||||||
fileApi.setLogger(this.logger());
|
fileApi.setLogger(this.logger());
|
||||||
|
@@ -29,7 +29,15 @@ class WebDavApi {
|
|||||||
|
|
||||||
authToken() {
|
authToken() {
|
||||||
if (!this.options_.username() || !this.options_.password()) return null;
|
if (!this.options_.username() || !this.options_.password()) return null;
|
||||||
return base64.encode(this.options_.username() + ':' + this.options_.password());
|
try {
|
||||||
|
// Note: Non-ASCII passwords will throw an error about Latin1 characters - https://github.com/laurent22/joplin/issues/246
|
||||||
|
// Tried various things like the below, but it didn't work on React Native:
|
||||||
|
//return base64.encode(utf8.encode(this.options_.username() + ':' + this.options_.password()));
|
||||||
|
return base64.encode(this.options_.username() + ':' + this.options_.password());
|
||||||
|
} catch (error) {
|
||||||
|
error.message = 'Cannot encode username/password: ' + error.message;
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
baseUrl() {
|
baseUrl() {
|
||||||
@@ -299,7 +307,7 @@ class WebDavApi {
|
|||||||
if (json && json['d:error']) {
|
if (json && json['d:error']) {
|
||||||
const code = json['d:error']['s:exception'] ? json['d:error']['s:exception'].join(' ') : response.status;
|
const code = json['d:error']['s:exception'] ? json['d:error']['s:exception'].join(' ') : response.status;
|
||||||
const message = json['d:error']['s:message'] ? json['d:error']['s:message'].join("\n") : 'Unknown error 1';
|
const message = json['d:error']['s:message'] ? json['d:error']['s:message'].join("\n") : 'Unknown error 1';
|
||||||
throw newError(message + '(Exception ' + code + ')', response.status);
|
throw newError(message + ' (Exception ' + code + ')', response.status);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw newError('Unknown error 2', response.status);
|
throw newError('Unknown error 2', response.status);
|
||||||
|
81
ReactNativeClient/lib/components/ModalDialog.js
Normal file
81
ReactNativeClient/lib/components/ModalDialog.js
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
const React = require('react');
|
||||||
|
const { Text, Modal, View, StyleSheet, Button } = require('react-native');
|
||||||
|
const { themeStyle } = require('lib/components/global-style.js');
|
||||||
|
const { _ } = require('lib/locale');
|
||||||
|
|
||||||
|
class ModalDialog extends React.Component {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.styles_ = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
styles() {
|
||||||
|
const themeId = this.props.theme;
|
||||||
|
const theme = themeStyle(themeId);
|
||||||
|
|
||||||
|
if (this.styles_[themeId]) return this.styles_[themeId];
|
||||||
|
this.styles_ = {};
|
||||||
|
|
||||||
|
let styles = {
|
||||||
|
modalWrapper: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
modalContentWrapper: {
|
||||||
|
flex:1,
|
||||||
|
flexDirection: 'column',
|
||||||
|
backgroundColor: theme.backgroundColor,
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor:theme.dividerColor,
|
||||||
|
margin: 20,
|
||||||
|
padding: 10,
|
||||||
|
},
|
||||||
|
modalContentWrapper2: {
|
||||||
|
paddingTop: 10,
|
||||||
|
flex:1,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
borderBottomWidth: 1,
|
||||||
|
borderBottomColor: theme.dividerColor,
|
||||||
|
paddingBottom: 10,
|
||||||
|
},
|
||||||
|
buttonRow: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
borderTopWidth: 1,
|
||||||
|
borderTopColor: theme.dividerColor,
|
||||||
|
paddingTop: 10,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
this.styles_[themeId] = StyleSheet.create(styles);
|
||||||
|
return this.styles_[themeId];
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const ContentComponent = this.props.ContentComponent;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={this.styles().modalWrapper}>
|
||||||
|
<Modal transparent={true} visible={true} onRequestClose={() => { }} >
|
||||||
|
<View style={this.styles().modalContentWrapper}>
|
||||||
|
<Text style={this.styles().title}>Title</Text>
|
||||||
|
<View style={this.styles().modalContentWrapper2}>
|
||||||
|
{ContentComponent}
|
||||||
|
</View>
|
||||||
|
<View style={this.styles().buttonRow}>
|
||||||
|
<View style={{flex:1}}>
|
||||||
|
<Button title={_('OK')} onPress={() => {}}></Button>
|
||||||
|
</View>
|
||||||
|
<View style={{flex:1, marginLeft: 5}}>
|
||||||
|
<Button title={_('Cancel')} onPress={() => {}}></Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Modal>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ModalDialog;
|
@@ -4,7 +4,6 @@ const Icon = require('react-native-vector-icons/Ionicons').default;
|
|||||||
const ReactNativeActionButton = require('react-native-action-button').default;
|
const ReactNativeActionButton = require('react-native-action-button').default;
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { globalStyle } = require('lib/components/global-style.js');
|
const { globalStyle } = require('lib/components/global-style.js');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { _ } = require('lib/locale.js');
|
const { _ } = require('lib/locale.js');
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
|
@@ -46,6 +46,13 @@ globalStyle.lineInput = {
|
|||||||
backgroundColor: globalStyle.backgroundColor,
|
backgroundColor: globalStyle.backgroundColor,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
globalStyle.buttonRow = {
|
||||||
|
flexDirection: 'row',
|
||||||
|
borderTopWidth: 1,
|
||||||
|
borderTopColor: globalStyle.dividerColor,
|
||||||
|
paddingTop: 10,
|
||||||
|
};
|
||||||
|
|
||||||
let themeCache_ = {};
|
let themeCache_ = {};
|
||||||
|
|
||||||
function themeStyle(theme) {
|
function themeStyle(theme) {
|
||||||
|
@@ -104,7 +104,7 @@ class NoteBodyViewer extends Component {
|
|||||||
style={webViewStyle}
|
style={webViewStyle}
|
||||||
source={source}
|
source={source}
|
||||||
onLoadEnd={() => this.onLoadEnd()}
|
onLoadEnd={() => this.onLoadEnd()}
|
||||||
onError={(e) => reg.logger().error('WebView error', e) }
|
onError={() => reg.logger().error('WebView error') }
|
||||||
onMessage={(event) => {
|
onMessage={(event) => {
|
||||||
let msg = event.nativeEvent.data;
|
let msg = event.nativeEvent.data;
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
const React = require('react'); const Component = React.Component;
|
const React = require('react'); const Component = React.Component;
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { ListView, Text, TouchableOpacity , View, StyleSheet } = require('react-native');
|
const { ListView, Text, TouchableOpacity , View, StyleSheet } = require('react-native');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { _ } = require('lib/locale.js');
|
const { _ } = require('lib/locale.js');
|
||||||
const { Checkbox } = require('lib/components/checkbox.js');
|
const { Checkbox } = require('lib/components/checkbox.js');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
const React = require('react'); const Component = React.Component;
|
const React = require('react'); const Component = React.Component;
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { ListView, Text, TouchableHighlight, Switch, View, StyleSheet } = require('react-native');
|
const { ListView, Text, TouchableHighlight, Switch, View, StyleSheet } = require('react-native');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { _ } = require('lib/locale.js');
|
const { _ } = require('lib/locale.js');
|
||||||
const { Checkbox } = require('lib/components/checkbox.js');
|
const { Checkbox } = require('lib/components/checkbox.js');
|
||||||
const { NoteItem } = require('lib/components/note-item.js');
|
const { NoteItem } = require('lib/components/note-item.js');
|
||||||
|
@@ -2,8 +2,8 @@ const React = require('react'); const Component = React.Component;
|
|||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { Platform, View, Text, Button, StyleSheet, TouchableOpacity, Image, ScrollView, Dimensions } = require('react-native');
|
const { Platform, View, Text, Button, StyleSheet, TouchableOpacity, Image, ScrollView, Dimensions } = require('react-native');
|
||||||
const Icon = require('react-native-vector-icons/Ionicons').default;
|
const Icon = require('react-native-vector-icons/Ionicons').default;
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { BackButtonService } = require('lib/services/back-button.js');
|
const { BackButtonService } = require('lib/services/back-button.js');
|
||||||
|
const NavService = require('lib/services/NavService.js');
|
||||||
const { ReportService } = require('lib/services/report.js');
|
const { ReportService } = require('lib/services/report.js');
|
||||||
const { Menu, MenuOptions, MenuOption, MenuTrigger } = require('react-native-popup-menu');
|
const { Menu, MenuOptions, MenuOption, MenuTrigger } = require('react-native-popup-menu');
|
||||||
const { _ } = require('lib/locale.js');
|
const { _ } = require('lib/locale.js');
|
||||||
@@ -128,6 +128,8 @@ class ScreenHeaderComponent extends Component {
|
|||||||
color: theme.raisedHighlightedColor,
|
color: theme.raisedHighlightedColor,
|
||||||
fontWeight: 'bold',
|
fontWeight: 'bold',
|
||||||
fontSize: theme.fontSize,
|
fontSize: theme.fontSize,
|
||||||
|
paddingTop: 15,
|
||||||
|
paddingBottom: 15,
|
||||||
},
|
},
|
||||||
warningBox: {
|
warningBox: {
|
||||||
backgroundColor: "#ff9900",
|
backgroundColor: "#ff9900",
|
||||||
@@ -160,10 +162,7 @@ class ScreenHeaderComponent extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
searchButton_press() {
|
searchButton_press() {
|
||||||
this.props.dispatch({
|
NavService.go('Search');
|
||||||
type: 'NAV_GO',
|
|
||||||
routeName: 'Search',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async deleteButton_press() {
|
async deleteButton_press() {
|
||||||
@@ -184,38 +183,23 @@ class ScreenHeaderComponent extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log_press() {
|
log_press() {
|
||||||
this.props.dispatch({
|
NavService.go('Log');
|
||||||
type: 'NAV_GO',
|
|
||||||
routeName: 'Log',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
status_press() {
|
status_press() {
|
||||||
this.props.dispatch({
|
NavService.go('Status');
|
||||||
type: 'NAV_GO',
|
|
||||||
routeName: 'Status',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config_press() {
|
config_press() {
|
||||||
this.props.dispatch({
|
NavService.go('Config');
|
||||||
type: 'NAV_GO',
|
|
||||||
routeName: 'Config',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
encryptionConfig_press() {
|
encryptionConfig_press() {
|
||||||
this.props.dispatch({
|
NavService.go('EncryptionConfig');
|
||||||
type: 'NAV_GO',
|
|
||||||
routeName: 'EncryptionConfig',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
warningBox_press() {
|
warningBox_press() {
|
||||||
this.props.dispatch({
|
NavService.go('EncryptionConfig');
|
||||||
type: 'NAV_GO',
|
|
||||||
routeName: 'EncryptionConfig',
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async debugReport_press() {
|
async debugReport_press() {
|
||||||
@@ -300,6 +284,16 @@ class ScreenHeaderComponent extends Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sortButton(styles, onPress) {
|
||||||
|
return (
|
||||||
|
<TouchableOpacity onPress={onPress}>
|
||||||
|
<View style={styles.iconButton}>
|
||||||
|
<Icon name='md-funnel' style={styles.topIcon} />
|
||||||
|
</View>
|
||||||
|
</TouchableOpacity>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let key = 0;
|
let key = 0;
|
||||||
let menuOptionComponents = [];
|
let menuOptionComponents = [];
|
||||||
|
|
||||||
@@ -436,14 +430,19 @@ class ScreenHeaderComponent extends Component {
|
|||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
) : null;
|
) : null;
|
||||||
|
|
||||||
|
const showSideMenuButton = this.props.showSideMenuButton !== false && !this.props.noteSelectionEnabled;
|
||||||
|
const showSearchButton = this.props.showSearchButton !== false && !this.props.noteSelectionEnabled;
|
||||||
|
const showContextMenuButton = this.props.showContextMenuButton !== false;
|
||||||
|
|
||||||
const titleComp = createTitleComponent();
|
const titleComp = createTitleComponent();
|
||||||
const sideMenuComp = this.props.noteSelectionEnabled ? null : sideMenuButton(this.styles(), () => this.sideMenuButton_press());
|
const sideMenuComp = !showSideMenuButton ? null : sideMenuButton(this.styles(), () => this.sideMenuButton_press());
|
||||||
const backButtonComp = backButton(this.styles(), () => this.backButton_press(), !this.props.historyCanGoBack);
|
const backButtonComp = backButton(this.styles(), () => this.backButton_press(), !this.props.historyCanGoBack);
|
||||||
const searchButtonComp = this.props.noteSelectionEnabled ? null : searchButton(this.styles(), () => this.searchButton_press());
|
const searchButtonComp = !showSearchButton ? null : searchButton(this.styles(), () => this.searchButton_press());
|
||||||
const deleteButtonComp = this.props.noteSelectionEnabled ? deleteButton(this.styles(), () => this.deleteButton_press()) : null;
|
const deleteButtonComp = this.props.noteSelectionEnabled ? deleteButton(this.styles(), () => this.deleteButton_press()) : null;
|
||||||
|
const sortButtonComp = this.props.sortButton_press ? sortButton(this.styles(), () => this.props.sortButton_press()) : null;
|
||||||
const windowHeight = Dimensions.get('window').height - 50;
|
const windowHeight = Dimensions.get('window').height - 50;
|
||||||
|
|
||||||
const menuComp = (
|
const menuComp = !showContextMenuButton ? null : (
|
||||||
<Menu onSelect={(value) => this.menu_select(value)} style={this.styles().contextMenu}>
|
<Menu onSelect={(value) => this.menu_select(value)} style={this.styles().contextMenu}>
|
||||||
<MenuTrigger style={{ paddingTop: PADDING_V, paddingBottom: PADDING_V }}>
|
<MenuTrigger style={{ paddingTop: PADDING_V, paddingBottom: PADDING_V }}>
|
||||||
<Text style={this.styles().contextMenuTrigger}> ⋮</Text>
|
<Text style={this.styles().contextMenuTrigger}> ⋮</Text>
|
||||||
@@ -465,6 +464,7 @@ class ScreenHeaderComponent extends Component {
|
|||||||
{ titleComp }
|
{ titleComp }
|
||||||
{ searchButtonComp }
|
{ searchButtonComp }
|
||||||
{ deleteButtonComp }
|
{ deleteButtonComp }
|
||||||
|
{ sortButtonComp }
|
||||||
{ menuComp }
|
{ menuComp }
|
||||||
</View>
|
</View>
|
||||||
{ warningComp }
|
{ warningComp }
|
||||||
|
@@ -200,11 +200,19 @@ class ConfigScreenComponent extends BaseScreenComponent {
|
|||||||
</View>
|
</View>
|
||||||
</View>);
|
</View>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
settingComps.push(
|
||||||
|
<View key="donate_link" style={this.styles().settingContainer}>
|
||||||
|
<TouchableOpacity onPress={() => { Linking.openURL('http://joplin.cozic.net/donate/') }}>
|
||||||
|
<Text key="label" style={this.styles().linkText}>{_('Make a donation')}</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
|
||||||
settingComps.push(
|
settingComps.push(
|
||||||
<View key="website_link" style={this.styles().settingContainer}>
|
<View key="website_link" style={this.styles().settingContainer}>
|
||||||
<TouchableOpacity onPress={() => { Linking.openURL('http://joplin.cozic.net/') }}>
|
<TouchableOpacity onPress={() => { Linking.openURL('http://joplin.cozic.net/') }}>
|
||||||
<Text key="label" style={this.styles().linkText}>Joplin Website</Text>
|
<Text key="label" style={this.styles().linkText}>{_('Joplin website')}</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
const React = require('react'); const Component = React.Component;
|
const React = require('react'); const Component = React.Component;
|
||||||
const { View, Button, TextInput, StyleSheet } = require('react-native');
|
const { View, Button, TextInput, StyleSheet } = require('react-native');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { ActionButton } = require('lib/components/action-button.js');
|
const { ActionButton } = require('lib/components/action-button.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
const React = require('react'); const Component = React.Component;
|
const React = require('react'); const Component = React.Component;
|
||||||
const { ListView, View, Text, Button, StyleSheet, Platform } = require('react-native');
|
const { ListView, View, Text, Button, StyleSheet, Platform } = require('react-native');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
const { time } = require('lib/time-utils');
|
const { time } = require('lib/time-utils');
|
||||||
|
201
ReactNativeClient/lib/components/screens/note-tags.js
Normal file
201
ReactNativeClient/lib/components/screens/note-tags.js
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
const React = require('react'); const Component = React.Component;
|
||||||
|
const { ListView, StyleSheet, View, Text, Button, FlatList, TouchableOpacity, TextInput } = require('react-native');
|
||||||
|
const Setting = require('lib/models/Setting.js');
|
||||||
|
const { connect } = require('react-redux');
|
||||||
|
const { reg } = require('lib/registry.js');
|
||||||
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
|
const { time } = require('lib/time-utils');
|
||||||
|
const { Logger } = require('lib/logger.js');
|
||||||
|
const BaseItem = require('lib/models/BaseItem.js');
|
||||||
|
const Tag = require('lib/models/Tag.js');
|
||||||
|
const { Database } = require('lib/database.js');
|
||||||
|
const Folder = require('lib/models/Folder.js');
|
||||||
|
const { ReportService } = require('lib/services/report.js');
|
||||||
|
const { _ } = require('lib/locale.js');
|
||||||
|
const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
||||||
|
const { globalStyle, themeStyle } = require('lib/components/global-style.js');
|
||||||
|
const Icon = require('react-native-vector-icons/Ionicons').default;
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
body: {
|
||||||
|
flex: 1,
|
||||||
|
margin: globalStyle.margin,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
class NoteTagsScreenComponent extends BaseScreenComponent {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.styles_ = {};
|
||||||
|
this.state = {
|
||||||
|
noteTagIds: [],
|
||||||
|
noteId: null,
|
||||||
|
tagListData: [],
|
||||||
|
newTags: '',
|
||||||
|
savingTags: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
const noteHasTag = (tagId) => {
|
||||||
|
for (let i = 0; i < this.state.tagListData.length; i++) {
|
||||||
|
if (this.state.tagListData[i].id === tagId) return this.state.tagListData[i].selected;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const newTagTitles = () => {
|
||||||
|
return this.state.newTags
|
||||||
|
.split(',')
|
||||||
|
.map(t => t.trim().toLowerCase())
|
||||||
|
.filter(t => !!t);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tag_press = (tagId) => {
|
||||||
|
const newData = this.state.tagListData.slice();
|
||||||
|
for (let i = 0; i < newData.length; i++) {
|
||||||
|
const t = newData[i];
|
||||||
|
if (t.id === tagId) {
|
||||||
|
const newTag = Object.assign({}, t);
|
||||||
|
newTag.selected = !newTag.selected;
|
||||||
|
newData[i] = newTag;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setState({ tagListData: newData });
|
||||||
|
}
|
||||||
|
|
||||||
|
this.renderTag = (data) => {
|
||||||
|
const tag = data.item;
|
||||||
|
const iconName = noteHasTag(tag.id) ? 'md-checkbox-outline' : 'md-square-outline';
|
||||||
|
return (
|
||||||
|
<TouchableOpacity key={tag.id} onPress={() => this.tag_press(tag.id)} style={this.styles().tag}>
|
||||||
|
<View style={this.styles().tagIconText}>
|
||||||
|
<Icon name={iconName} style={this.styles().tagCheckbox}/><Text>{tag.title}</Text>
|
||||||
|
</View>
|
||||||
|
</TouchableOpacity>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tagKeyExtractor = (tag, index) => tag.id;
|
||||||
|
|
||||||
|
this.okButton_press = async () => {
|
||||||
|
this.setState({ savingTags: true });
|
||||||
|
|
||||||
|
try {
|
||||||
|
const tagIds = this.state.tagListData.filter(t => t.selected).map(t => t.id);
|
||||||
|
await Tag.setNoteTagsByIds(this.state.noteId, tagIds);
|
||||||
|
|
||||||
|
const extraTitles = newTagTitles();
|
||||||
|
for (let i = 0; i < extraTitles.length; i++) {
|
||||||
|
await Tag.addNoteTagByTitle(this.state.noteId, extraTitles[i]);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
this.setState({ savingTags: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
this.props.dispatch({
|
||||||
|
type: 'NAV_BACK',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.cancelButton_press = () => {
|
||||||
|
this.props.dispatch({
|
||||||
|
type: 'NAV_BACK',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillMount() {
|
||||||
|
const noteId = this.props.noteId;
|
||||||
|
this.setState({ noteId: noteId });
|
||||||
|
this.loadNoteTags(noteId);
|
||||||
|
}
|
||||||
|
|
||||||
|
async loadNoteTags(noteId) {
|
||||||
|
const tags = await Tag.tagsByNoteId(noteId);
|
||||||
|
const tagIds = tags.map(t => t.id);
|
||||||
|
|
||||||
|
const tagListData = this.props.tags.map(tag => { return {
|
||||||
|
id: tag.id,
|
||||||
|
title: tag.title,
|
||||||
|
selected: tagIds.indexOf(tag.id) >= 0,
|
||||||
|
}});
|
||||||
|
|
||||||
|
this.setState({ tagListData: tagListData });
|
||||||
|
}
|
||||||
|
|
||||||
|
styles() {
|
||||||
|
const themeId = this.props.theme;
|
||||||
|
const theme = themeStyle(themeId);
|
||||||
|
|
||||||
|
if (this.styles_[themeId]) return this.styles_[themeId];
|
||||||
|
this.styles_ = {};
|
||||||
|
|
||||||
|
let styles = {
|
||||||
|
tag: {
|
||||||
|
padding: 10,
|
||||||
|
borderBottomWidth: 1,
|
||||||
|
borderBottomColor: theme.dividerColor,
|
||||||
|
},
|
||||||
|
tagIconText: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
tagCheckbox: {
|
||||||
|
marginRight: 5,
|
||||||
|
fontSize: 20,
|
||||||
|
},
|
||||||
|
newTagBox: {
|
||||||
|
flexDirection:'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
paddingLeft: theme.marginLeft,
|
||||||
|
paddingRight: theme.marginRight,
|
||||||
|
borderTopWidth: 1,
|
||||||
|
borderTopColor: theme.dividerColor
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
this.styles_[themeId] = StyleSheet.create(styles);
|
||||||
|
return this.styles_[themeId];
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const theme = themeStyle(this.props.theme);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={this.rootStyle(this.props.theme).root}>
|
||||||
|
<ScreenHeader title={_('Note tags')} showSideMenuButton={false} showSearchButton={false} showContextMenuButton={false}/>
|
||||||
|
<FlatList
|
||||||
|
data={this.state.tagListData}
|
||||||
|
renderItem={this.renderTag}
|
||||||
|
keyExtractor={this.tagKeyExtractor}
|
||||||
|
/>
|
||||||
|
<View style={this.styles().newTagBox}>
|
||||||
|
<Text>{_('Or type tags:')}</Text><TextInput value={this.state.newTags} onChangeText={value => { this.setState({ newTags: value }) }} style={{flex:1}}/>
|
||||||
|
</View>
|
||||||
|
<View style={theme.buttonRow}>
|
||||||
|
<View style={{flex:1}}>
|
||||||
|
<Button disabled={this.state.savingTags} title={_('OK')} onPress={this.okButton_press}></Button>
|
||||||
|
</View>
|
||||||
|
<View style={{flex:1, marginLeft: 5}}>
|
||||||
|
<Button disabled={this.state.savingTags} title={_('Cancel')} onPress={this.cancelButton_press}></Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const NoteTagsScreen = connect(
|
||||||
|
(state) => {
|
||||||
|
return {
|
||||||
|
theme: state.settings.theme,
|
||||||
|
tags: state.tags,
|
||||||
|
noteId: state.selectedNoteIds.length ? state.selectedNoteIds[0] : null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)(NoteTagsScreenComponent)
|
||||||
|
|
||||||
|
module.exports = { NoteTagsScreen };
|
@@ -2,13 +2,13 @@ const React = require('react'); const Component = React.Component;
|
|||||||
const { Platform, Keyboard, BackHandler, View, Button, TextInput, WebView, Text, StyleSheet, Linking, Image } = require('react-native');
|
const { Platform, Keyboard, BackHandler, View, Button, TextInput, WebView, Text, StyleSheet, Linking, Image } = require('react-native');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { uuid } = require('lib/uuid.js');
|
const { uuid } = require('lib/uuid.js');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const RNFS = require('react-native-fs');
|
const RNFS = require('react-native-fs');
|
||||||
const Note = require('lib/models/Note.js');
|
const Note = require('lib/models/Note.js');
|
||||||
const Setting = require('lib/models/Setting.js');
|
const Setting = require('lib/models/Setting.js');
|
||||||
const Resource = require('lib/models/Resource.js');
|
const Resource = require('lib/models/Resource.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const { BackButtonService } = require('lib/services/back-button.js');
|
const { BackButtonService } = require('lib/services/back-button.js');
|
||||||
|
const NavService = require('lib/services/NavService.js');
|
||||||
const BaseModel = require('lib/BaseModel.js');
|
const BaseModel = require('lib/BaseModel.js');
|
||||||
const { ActionButton } = require('lib/components/action-button.js');
|
const { ActionButton } = require('lib/components/action-button.js');
|
||||||
const Icon = require('react-native-vector-icons/Ionicons').default;
|
const Icon = require('react-native-vector-icons/Ionicons').default;
|
||||||
@@ -61,18 +61,29 @@ class NoteScreenComponent extends BaseScreenComponent {
|
|||||||
|
|
||||||
this.styles_ = {};
|
this.styles_ = {};
|
||||||
|
|
||||||
this.backHandler = async () => {
|
const saveDialog = async () => {
|
||||||
if (this.isModified()) {
|
if (this.isModified()) {
|
||||||
let buttonId = await dialogs.pop(this, _('This note has been modified:'), [
|
let buttonId = await dialogs.pop(this, _('This note has been modified:'), [
|
||||||
{ title: _('Save changes'), id: 'save' },
|
{ text: _('Save changes'), id: 'save' },
|
||||||
{ title: _('Discard changes'), id: 'discard' },
|
{ text: _('Discard changes'), id: 'discard' },
|
||||||
{ title: _('Cancel'), id: 'cancel' },
|
{ text: _('Cancel'), id: 'cancel' },
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (buttonId == 'cancel') return true;
|
if (buttonId == 'cancel') return true;
|
||||||
if (buttonId == 'save') await this.saveNoteButton_press();
|
if (buttonId == 'save') await this.saveNoteButton_press();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.navHandler = async () => {
|
||||||
|
return await saveDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.backHandler = async () => {
|
||||||
|
const r = await saveDialog();
|
||||||
|
if (r) return r;
|
||||||
|
|
||||||
if (!this.state.note.id) {
|
if (!this.state.note.id) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -145,6 +156,7 @@ class NoteScreenComponent extends BaseScreenComponent {
|
|||||||
|
|
||||||
async componentWillMount() {
|
async componentWillMount() {
|
||||||
BackButtonService.addHandler(this.backHandler);
|
BackButtonService.addHandler(this.backHandler);
|
||||||
|
NavService.addHandler(this.navHandler);
|
||||||
|
|
||||||
await shared.initState(this);
|
await shared.initState(this);
|
||||||
|
|
||||||
@@ -157,6 +169,7 @@ class NoteScreenComponent extends BaseScreenComponent {
|
|||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
BackButtonService.removeHandler(this.backHandler);
|
BackButtonService.removeHandler(this.backHandler);
|
||||||
|
NavService.removeHandler(this.navHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
title_changeText(text) {
|
title_changeText(text) {
|
||||||
@@ -344,6 +357,16 @@ class NoteScreenComponent extends BaseScreenComponent {
|
|||||||
shared.toggleIsTodo_onPress(this);
|
shared.toggleIsTodo_onPress(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tags_onPress() {
|
||||||
|
if (!this.state.note || !this.state.note.id) return;
|
||||||
|
|
||||||
|
this.props.dispatch({
|
||||||
|
type: 'NAV_GO',
|
||||||
|
routeName: 'NoteTags',
|
||||||
|
noteId: this.state.note.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
setAlarm_onPress() {
|
setAlarm_onPress() {
|
||||||
this.setState({ alarmDialogShown: true });
|
this.setState({ alarmDialogShown: true });
|
||||||
}
|
}
|
||||||
@@ -380,6 +403,7 @@ class NoteScreenComponent extends BaseScreenComponent {
|
|||||||
menuOptions() {
|
menuOptions() {
|
||||||
const note = this.state.note;
|
const note = this.state.note;
|
||||||
const isTodo = note && !!note.is_todo;
|
const isTodo = note && !!note.is_todo;
|
||||||
|
const isSaved = note && note.id;
|
||||||
|
|
||||||
let output = [];
|
let output = [];
|
||||||
|
|
||||||
@@ -397,6 +421,7 @@ class NoteScreenComponent extends BaseScreenComponent {
|
|||||||
output.push({ title: _('Set alarm'), onPress: () => { this.setState({ alarmDialogShown: true }) }});;
|
output.push({ title: _('Set alarm'), onPress: () => { this.setState({ alarmDialogShown: true }) }});;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isSaved) output.push({ title: _('Tags'), onPress: () => { this.tags_onPress(); } });
|
||||||
output.push({ title: isTodo ? _('Convert to note') : _('Convert to todo'), onPress: () => { this.toggleIsTodo_onPress(); } });
|
output.push({ title: isTodo ? _('Convert to note') : _('Convert to todo'), onPress: () => { this.toggleIsTodo_onPress(); } });
|
||||||
output.push({ isDivider: true });
|
output.push({ isDivider: true });
|
||||||
if (this.props.showAdvancedOptions) output.push({ title: this.state.showNoteMetadata ? _('Hide metadata') : _('Show metadata'), onPress: () => { this.showMetadata_onPress(); } });
|
if (this.props.showAdvancedOptions) output.push({ title: this.state.showNoteMetadata ? _('Hide metadata') : _('Show metadata'), onPress: () => { this.showMetadata_onPress(); } });
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
const React = require('react'); const Component = React.Component;
|
const React = require('react'); const Component = React.Component;
|
||||||
const { View, Button } = require('react-native');
|
const { View, Button, Text } = require('react-native');
|
||||||
|
const { stateUtils } = require('lib/reducer.js');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { NoteList } = require('lib/components/note-list.js');
|
const { NoteList } = require('lib/components/note-list.js');
|
||||||
const Folder = require('lib/models/Folder.js');
|
const Folder = require('lib/models/Folder.js');
|
||||||
const Tag = require('lib/models/Tag.js');
|
const Tag = require('lib/models/Tag.js');
|
||||||
@@ -10,7 +10,7 @@ const Note = require('lib/models/Note.js');
|
|||||||
const Setting = require('lib/models/Setting.js');
|
const Setting = require('lib/models/Setting.js');
|
||||||
const { themeStyle } = require('lib/components/global-style.js');
|
const { themeStyle } = require('lib/components/global-style.js');
|
||||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
const { MenuOption, Text } = require('react-native-popup-menu');
|
const { MenuOption } = require('react-native-popup-menu');
|
||||||
const { _ } = require('lib/locale.js');
|
const { _ } = require('lib/locale.js');
|
||||||
const { ActionButton } = require('lib/components/action-button.js');
|
const { ActionButton } = require('lib/components/action-button.js');
|
||||||
const { dialogs } = require('lib/dialogs.js');
|
const { dialogs } = require('lib/dialogs.js');
|
||||||
@@ -23,6 +23,43 @@ class NotesScreenComponent extends BaseScreenComponent {
|
|||||||
return { header: null };
|
return { header: null };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.sortButton_press = async () => {
|
||||||
|
const buttons = [];
|
||||||
|
const sortNoteOptions = Setting.enumOptions('notes.sortOrder.field');
|
||||||
|
|
||||||
|
const makeCheckboxText = function(selected, sign, label) {
|
||||||
|
const s = sign === 'tick' ? '✓' : '⬤'
|
||||||
|
return (selected ? (s + ' ') : '') + label;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let field in sortNoteOptions) {
|
||||||
|
if (!sortNoteOptions.hasOwnProperty(field)) continue;
|
||||||
|
buttons.push({
|
||||||
|
text: makeCheckboxText(Setting.value('notes.sortOrder.field') === field, 'bullet', sortNoteOptions[field]),
|
||||||
|
id: { name: 'notes.sortOrder.field', value: field },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
buttons.push({
|
||||||
|
text: makeCheckboxText(Setting.value('notes.sortOrder.reverse'), 'tick', '[ ' + Setting.settingMetadata('notes.sortOrder.reverse').label() + ' ]'),
|
||||||
|
id: { name: 'notes.sortOrder.reverse', value: !Setting.value('notes.sortOrder.reverse') },
|
||||||
|
});
|
||||||
|
|
||||||
|
buttons.push({
|
||||||
|
text: makeCheckboxText(Setting.value('uncompletedTodosOnTop'), 'tick', '[ ' + Setting.settingMetadata('uncompletedTodosOnTop').label() + ' ]'),
|
||||||
|
id: { name: 'uncompletedTodosOnTop', value: !Setting.value('uncompletedTodosOnTop') },
|
||||||
|
});
|
||||||
|
|
||||||
|
const r = await dialogs.pop(this, Setting.settingMetadata('notes.sortOrder.field').label(), buttons);
|
||||||
|
if (!r) return;
|
||||||
|
|
||||||
|
Setting.setValue(r.name, r.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async componentDidMount() {
|
async componentDidMount() {
|
||||||
await this.refreshNotes();
|
await this.refreshNotes();
|
||||||
}
|
}
|
||||||
@@ -42,6 +79,7 @@ class NotesScreenComponent extends BaseScreenComponent {
|
|||||||
let options = {
|
let options = {
|
||||||
order: props.notesOrder,
|
order: props.notesOrder,
|
||||||
uncompletedTodosOnTop: props.uncompletedTodosOnTop,
|
uncompletedTodosOnTop: props.uncompletedTodosOnTop,
|
||||||
|
caseInsensitive: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
const parent = this.parentItem(props);
|
const parent = this.parentItem(props);
|
||||||
@@ -155,6 +193,7 @@ class NotesScreenComponent extends BaseScreenComponent {
|
|||||||
title={title}
|
title={title}
|
||||||
menuOptions={this.menuOptions()}
|
menuOptions={this.menuOptions()}
|
||||||
parentComponent={thisComp}
|
parentComponent={thisComp}
|
||||||
|
sortButton_press={this.sortButton_press}
|
||||||
folderPickerOptions={{
|
folderPickerOptions={{
|
||||||
enabled: this.props.noteSelectionEnabled,
|
enabled: this.props.noteSelectionEnabled,
|
||||||
mustSelect: true,
|
mustSelect: true,
|
||||||
@@ -178,11 +217,11 @@ const NotesScreen = connect(
|
|||||||
selectedTagId: state.selectedTagId,
|
selectedTagId: state.selectedTagId,
|
||||||
notesParentType: state.notesParentType,
|
notesParentType: state.notesParentType,
|
||||||
notes: state.notes,
|
notes: state.notes,
|
||||||
notesOrder: state.notesOrder,
|
|
||||||
notesSource: state.notesSource,
|
notesSource: state.notesSource,
|
||||||
uncompletedTodosOnTop: state.settings.uncompletedTodosOnTop,
|
uncompletedTodosOnTop: state.settings.uncompletedTodosOnTop,
|
||||||
theme: state.settings.theme,
|
theme: state.settings.theme,
|
||||||
noteSelectionEnabled: state.noteSelectionEnabled,
|
noteSelectionEnabled: state.noteSelectionEnabled,
|
||||||
|
notesOrder: stateUtils.notesOrder(state.settings),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
)(NotesScreenComponent)
|
)(NotesScreenComponent)
|
||||||
|
@@ -2,7 +2,6 @@ const React = require('react'); const Component = React.Component;
|
|||||||
const { View } = require('react-native');
|
const { View } = require('react-native');
|
||||||
const { WebView, Button, Text } = require('react-native');
|
const { WebView, Button, Text } = require('react-native');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const Setting = require('lib/models/Setting.js');
|
const Setting = require('lib/models/Setting.js');
|
||||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
@@ -44,8 +43,6 @@ class OneDriveLoginScreenComponent extends BaseScreenComponent {
|
|||||||
const parsedUrl = parseUri(url);
|
const parsedUrl = parseUri(url);
|
||||||
|
|
||||||
if (!this.authCode_ && parsedUrl && parsedUrl.queryKey && parsedUrl.queryKey.code) {
|
if (!this.authCode_ && parsedUrl && parsedUrl.queryKey && parsedUrl.queryKey.code) {
|
||||||
Log.info('URL: ', url, parsedUrl.queryKey);
|
|
||||||
|
|
||||||
this.authCode_ = parsedUrl.queryKey.code
|
this.authCode_ = parsedUrl.queryKey.code
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -60,8 +57,8 @@ class OneDriveLoginScreenComponent extends BaseScreenComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async webview_error(error) {
|
async webview_error() {
|
||||||
Log.error(error);
|
alert('Could not load page. Please check your connection and try again.');
|
||||||
}
|
}
|
||||||
|
|
||||||
retryButton_click() {
|
retryButton_click() {
|
||||||
@@ -93,7 +90,7 @@ class OneDriveLoginScreenComponent extends BaseScreenComponent {
|
|||||||
<WebView
|
<WebView
|
||||||
source={source}
|
source={source}
|
||||||
onNavigationStateChange={(o) => { this.webview_load(o); }}
|
onNavigationStateChange={(o) => { this.webview_load(o); }}
|
||||||
onError={(error) => { this.webview_error(error); }}
|
onError={() => { this.webview_error(); }}
|
||||||
/>
|
/>
|
||||||
<Button title={_("Refresh")} onPress={() => { this.retryButton_click(); }}></Button>
|
<Button title={_("Refresh")} onPress={() => { this.retryButton_click(); }}></Button>
|
||||||
</View>
|
</View>
|
||||||
|
@@ -2,7 +2,6 @@ const React = require('react'); const Component = React.Component;
|
|||||||
const { ListView, StyleSheet, View, Text, Button, FlatList } = require('react-native');
|
const { ListView, StyleSheet, View, Text, Button, FlatList } = require('react-native');
|
||||||
const Setting = require('lib/models/Setting.js');
|
const Setting = require('lib/models/Setting.js');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { reg } = require('lib/registry.js');
|
const { reg } = require('lib/registry.js');
|
||||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
const { time } = require('lib/time-utils');
|
const { time } = require('lib/time-utils');
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
const React = require('react'); const Component = React.Component;
|
const React = require('react'); const Component = React.Component;
|
||||||
const { View, Text, StyleSheet } = require('react-native');
|
const { View, Text, StyleSheet } = require('react-native');
|
||||||
const { connect } = require('react-redux');
|
const { connect } = require('react-redux');
|
||||||
const { Log } = require('lib/log.js');
|
|
||||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||||
const { ActionButton } = require('lib/components/action-button.js');
|
const { ActionButton } = require('lib/components/action-button.js');
|
||||||
const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
const Setting = require('lib/models/Setting.js');
|
const Setting = require('lib/models/Setting.js');
|
||||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||||
|
const ObjectUtils = require('lib/ObjectUtils');
|
||||||
const { _ } = require('lib/locale.js');
|
const { _ } = require('lib/locale.js');
|
||||||
|
|
||||||
const shared = {}
|
const shared = {}
|
||||||
@@ -16,7 +17,7 @@ shared.checkSyncConfig = async function(comp, settings) {
|
|||||||
const SyncTargetClass = SyncTargetRegistry.classById(syncTargetId);
|
const SyncTargetClass = SyncTargetRegistry.classById(syncTargetId);
|
||||||
const options = Setting.subValues('sync.' + syncTargetId, settings);
|
const options = Setting.subValues('sync.' + syncTargetId, settings);
|
||||||
comp.setState({ checkSyncConfigResult: 'checking' });
|
comp.setState({ checkSyncConfigResult: 'checking' });
|
||||||
const result = await SyncTargetClass.checkConfig(options);
|
const result = await SyncTargetClass.checkConfig(ObjectUtils.convertValuesToFunctions(options));
|
||||||
comp.setState({ checkSyncConfigResult: result });
|
comp.setState({ checkSyncConfigResult: result });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -63,7 +63,9 @@ shared.checkPasswords = async function(comp) {
|
|||||||
|
|
||||||
shared.decryptedStatText = function(comp) {
|
shared.decryptedStatText = function(comp) {
|
||||||
const stats = comp.state.stats;
|
const stats = comp.state.stats;
|
||||||
return _('Decrypted items: %s / %s', stats.encrypted !== null ? (stats.total - stats.encrypted) : '-', stats.total !== null ? stats.total : '-');
|
const doneCount = stats.encrypted !== null ? (stats.total - stats.encrypted) : '-';
|
||||||
|
const totalCount = stats.total !== null ? stats.total : '-';
|
||||||
|
return _('Decrypted items: %s / %s', doneCount, totalCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
shared.onSavePasswordClick = function(comp, mk) {
|
shared.onSavePasswordClick = function(comp, mk) {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user