You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-30 20:39:46 +02:00
Compare commits
261 Commits
v1.0.116
...
android-v1
Author | SHA1 | Date | |
---|---|---|---|
|
d2d659d5a9 | ||
|
1595248b52 | ||
|
fc94c616b5 | ||
|
f6f0bcf1c3 | ||
|
6eeeda5dab | ||
|
58993d2ead | ||
|
7c0b608769 | ||
|
259be84a3e | ||
|
57c880cf85 | ||
|
0469fe76d7 | ||
|
a3e74320fa | ||
|
4e0f4397b2 | ||
|
b26aab3863 | ||
|
75ec97fe61 | ||
|
9a356453fc | ||
|
f0020b3393 | ||
|
ea9f1dc91d | ||
|
2ef77dcf1f | ||
|
29e7ec4cc9 | ||
|
5710e3fad0 | ||
|
a03aa62d58 | ||
|
2203a39917 | ||
|
bc58668483 | ||
|
0b4650f355 | ||
|
aecdec48ad | ||
|
e49198a0d4 | ||
|
6aa4553dd3 | ||
|
860e8a8f5a | ||
|
434037d793 | ||
|
214eae27da | ||
|
0567188fa8 | ||
|
4326902683 | ||
|
da3589149d | ||
|
69b4b4d1f4 | ||
|
dd4b46a88b | ||
|
6f2253b2f4 | ||
|
4c00d9512e | ||
|
6f511cb1e6 | ||
|
029e84f538 | ||
|
42b1db1d08 | ||
|
9d4b34cad7 | ||
|
cd9aff0f59 | ||
|
032816fffc | ||
|
1408f06c8d | ||
|
49f8d0c6d8 | ||
|
0d6443c30a | ||
|
e62d91dda8 | ||
|
0e122c9dc5 | ||
|
c2bd453e8c | ||
|
949ea7afb7 | ||
|
9f575101d2 | ||
|
2b4470054e | ||
|
b220613e54 | ||
|
11328babe8 | ||
|
735bc92bc4 | ||
|
6894b9b1b7 | ||
|
4de7815f31 | ||
|
4ce7b48468 | ||
|
77e4cb87ad | ||
|
dd6b43035e | ||
|
e76094c546 | ||
|
9c00dc4cab | ||
|
fc416de348 | ||
|
a2156be4ec | ||
|
cf427eba0f | ||
|
0050c90678 | ||
|
5eeff02dbe | ||
|
eb283efc20 | ||
|
87121c9c21 | ||
|
a2dbbbf832 | ||
|
fd251cd9a9 | ||
|
8ced2d288e | ||
|
242926d381 | ||
|
8c9a148e71 | ||
|
9e165fc7dc | ||
|
f46e4e0cec | ||
|
efcf5ecef4 | ||
|
b6ba843d09 | ||
|
915112e274 | ||
|
cc8f8fcd2c | ||
|
bda3ea9a35 | ||
|
a7aed1f93a | ||
|
a33f602f3b | ||
|
4d08b49578 | ||
|
21e049ab45 | ||
|
1d4234caea | ||
|
d1269de3a7 | ||
|
8c19fcf8fc | ||
|
beaba2be55 | ||
|
32c9ad1d59 | ||
|
a194513252 | ||
|
cd93a1d1e1 | ||
|
2867728996 | ||
|
394cc78851 | ||
|
76f0a26322 | ||
|
92d7a577a0 | ||
|
9c1219b188 | ||
|
f62bbfe286 | ||
|
fef176eb96 | ||
|
ed541dac3b | ||
|
4a175b2158 | ||
|
4076899e11 | ||
|
998bdf3b56 | ||
|
76b211eb6d | ||
|
f781cb3922 | ||
|
ced3e5d623 | ||
|
2a4812cb87 | ||
|
1f384c7ae4 | ||
|
01a3285636 | ||
|
53166cb3f5 | ||
|
893462ae87 | ||
|
949dbf45f1 | ||
|
d7dc625042 | ||
|
cc91c77f9e | ||
|
4847fd76de | ||
|
25b711a8da | ||
|
b5e50fa62e | ||
|
28e40a5c86 | ||
|
a8a7b7c07b | ||
|
299008688d | ||
|
42a674008f | ||
|
8fdc0bf17c | ||
|
4e3896c108 | ||
|
96cd56548e | ||
|
739fb2c3d2 | ||
|
0c98573700 | ||
|
8dc0b34fdc | ||
|
384ca09842 | ||
|
97d86825c2 | ||
|
f5a824b1e6 | ||
|
4fc11e77e8 | ||
|
8d16ad7035 | ||
|
3b1d84b00b | ||
|
3f540da31b | ||
|
3a20f1c245 | ||
|
e803f0c545 | ||
|
c9495c23a6 | ||
|
26aae9eea5 | ||
|
7d92136467 | ||
|
a7896b43d7 | ||
|
2e12b2655b | ||
|
a1f0bd1e6c | ||
|
4472590133 | ||
|
64f1214ad9 | ||
|
bd465a72cf | ||
|
1d1c2a6925 | ||
|
d68ba32533 | ||
|
d1a316032d | ||
|
b465042a56 | ||
|
8ff2418b02 | ||
|
f6640bcc32 | ||
|
fa3c0fd18a | ||
|
2ac03c18c4 | ||
|
51ee6128f3 | ||
|
53478056de | ||
|
83c791564a | ||
|
65d0032995 | ||
|
37c4f99341 | ||
|
adbc873b2a | ||
|
3567a57d6a | ||
|
b4e9fb157f | ||
|
1be3646a04 | ||
|
46b82f877b | ||
|
ef56eb4a52 | ||
|
6989f9fd16 | ||
|
7c3e8547de | ||
|
8268c3edba | ||
|
a8cc8763b0 | ||
|
09b4acf087 | ||
|
3b719ce53b | ||
|
83281197f1 | ||
|
ffda04f9b4 | ||
|
606893286a | ||
|
075b71746a | ||
|
01f1f3e957 | ||
|
88a9d5e802 | ||
|
7eebfae1c3 | ||
|
340fe76b8f | ||
|
e83678df3a | ||
|
0bbbb49a31 | ||
|
0e61115857 | ||
|
8d3ac6f6fe | ||
|
86e644be9a | ||
|
30201249b5 | ||
|
41155f5ef4 | ||
|
f308fe71f9 | ||
|
5a00214fd2 | ||
|
1b3e0f65e1 | ||
|
7cfc537870 | ||
|
53513db5b5 | ||
|
59402cf198 | ||
|
12efc02d91 | ||
|
f38b907680 | ||
|
8fcb46ca4a | ||
|
71ec9a193f | ||
|
393a545548 | ||
|
f88449fbb0 | ||
|
50ad4d05f2 | ||
|
8d0e562c8a | ||
|
c98e67c003 | ||
|
5565538b80 | ||
|
958979e1d7 | ||
|
685845e097 | ||
|
3813f9e417 | ||
|
40cf3fb4d0 | ||
|
3f88b16603 | ||
|
32c02275a2 | ||
|
c0d679b6c2 | ||
|
eb789b9b9a | ||
|
b1898141c3 | ||
|
3231bfaff0 | ||
|
6bb09c9c30 | ||
|
35d3fe03ab | ||
|
f05929cd17 | ||
|
982c9828da | ||
|
d6eacb2b33 | ||
|
0abe213fc2 | ||
|
a6716d55c5 | ||
|
fa0572de77 | ||
|
6dca4a0d6b | ||
|
eacfe1a9ac | ||
|
c223cdf10a | ||
|
38c42b7a15 | ||
|
56432dc773 | ||
|
d3b4379161 | ||
|
8a6fcdbcae | ||
|
061ce646d2 | ||
|
5ec7c16e3e | ||
|
5d629508c1 | ||
|
0a6f8b0cfe | ||
|
460f826672 | ||
|
cb16a10121 | ||
|
3b6131f1ca | ||
|
57225a36b9 | ||
|
3e313399c2 | ||
|
7947e14792 | ||
|
71098102c5 | ||
|
8e601e80df | ||
|
3b14cfcc54 | ||
|
61a0e43092 | ||
|
d08aaffe41 | ||
|
7d0def30f0 | ||
|
bb45d72a56 | ||
|
3943192c5d | ||
|
18d76807f6 | ||
|
01a30a7ccf | ||
|
3fb35d043b | ||
|
9b51bd484d | ||
|
879b556845 | ||
|
0df2a501dd | ||
|
6f64fdffcc | ||
|
19252af345 | ||
|
897f53b13e | ||
|
45cd8b7e3c | ||
|
922bbdd1b6 | ||
|
c24135577c | ||
|
3240ff40bc | ||
|
58b68cab0c | ||
|
0a0afd7245 | ||
|
de01606bff | ||
|
046474b484 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -40,4 +40,5 @@ Tools/github_oauth_token.txt
|
||||
_releases
|
||||
ReactNativeClient/lib/csstojs/
|
||||
ElectronClient/app/gui/note-viewer/fonts/
|
||||
ElectronClient/app/gui/note-viewer/lib.js
|
||||
Tools/commit_hook.txt
|
@@ -1,3 +1,7 @@
|
||||
**IMPORTANT:** At the moment pull requests for new features are no longer being accepted. More info there: https://github.com/laurent22/joplin/issues/1112
|
||||
|
||||
* * *
|
||||
|
||||
# User support
|
||||
|
||||
For general discussion about Joplin, user support, software development questions, and to discuss new features, please go to the [Joplin Forum](https://discourse.joplin.cozic.net/). It is possible to login with your GitHub account.
|
||||
@@ -12,14 +16,16 @@ If possible, **please provide a screenshot**. A screenshot showing the problem i
|
||||
|
||||
Again, please check that it has not already been requested. If it has, simply **up-vote the issue** - the ones with the most up-votes are likely to be implemented. "+1" comments are not tracked.
|
||||
|
||||
# Adding new features
|
||||
# Creating a pull request
|
||||
|
||||
If you want to add a new feature, consider asking about it before implementing it or checking existing discussions to make sure it is within the scope of the project. Of course you are free to create the pull request directly but it is not guaranteed it is going to be accepted.
|
||||
- If you want to add a new feature, consider asking about it before implementing it or checking existing discussions to make sure it is within the scope of the project. That scope, due to limited resources, might be narrower than you think. As a rule of thumb **if your change is likely to involve more than 50 lines of code, you should discuss it in the forum**, just so that you don't waste your time implementing something that might not be accepted.
|
||||
|
||||
- Bug fixes have a very high change of being accepted.
|
||||
|
||||
- A pull request that is relevant to the current roadmap has a very high change of being accepted.
|
||||
|
||||
Building the apps is relatively easy - please [see the build instructions](https://github.com/laurent22/joplin/blob/master/BUILD.md) for more details.
|
||||
|
||||
Pull requests that automatically change many files tend to be rejected (for example changes that automatically update the code styling, or to add new lines to many files, or to automatically convert images to a different format) so if you have such a pull request in mind, please discuss it first in the forum.
|
||||
|
||||
# Coding style
|
||||
|
||||
There are only two rules, but not following them means the pull request will not be accepted (it can be accepted once the issues are fixed):
|
||||
|
@@ -22,6 +22,7 @@ const os = require('os');
|
||||
const fs = require('fs-extra');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
const Cache = require('lib/Cache');
|
||||
const WelcomeUtils = require('lib/WelcomeUtils');
|
||||
|
||||
class Application extends BaseApplication {
|
||||
|
||||
@@ -376,6 +377,8 @@ class Application extends BaseApplication {
|
||||
return this.stdout(object);
|
||||
});
|
||||
|
||||
await WelcomeUtils.install(this.dispatch.bind(this));
|
||||
|
||||
// If we have some arguments left at this point, it's a command
|
||||
// so execute it.
|
||||
if (argv.length) {
|
||||
@@ -393,6 +396,12 @@ class Application extends BaseApplication {
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
await Setting.saveAll();
|
||||
|
||||
// Need to call exit() explicitely, otherwise Node wait for any timeout to complete
|
||||
// https://stackoverflow.com/questions/18050095
|
||||
process.exit(0);
|
||||
} else { // Otherwise open the GUI
|
||||
this.initRedux();
|
||||
|
||||
|
@@ -154,11 +154,11 @@ class Command extends BaseCommand {
|
||||
type: Database.enumId('fieldType', 'text'),
|
||||
description: 'If an image is provided, you can also specify an optional rectangle that will be used to crop the image. In format `{ x: x, y: y, width: width, height: height }`',
|
||||
});
|
||||
tableFields.push({
|
||||
name: 'tags',
|
||||
type: Database.enumId('fieldType', 'text'),
|
||||
description: 'Comma-separated list of tags. eg. `tag1,tag2`.',
|
||||
});
|
||||
// tableFields.push({
|
||||
// name: 'tags',
|
||||
// type: Database.enumId('fieldType', 'text'),
|
||||
// description: 'Comma-separated list of tags. eg. `tag1,tag2`.',
|
||||
// });
|
||||
}
|
||||
|
||||
lines.push('# ' + toTitleCase(tableName));
|
||||
|
@@ -47,63 +47,34 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
if (args.command === 'decrypt') {
|
||||
while (true) {
|
||||
try {
|
||||
if (args.path) {
|
||||
const plainText = await EncryptionService.instance().decryptString(args.path);
|
||||
this.stdout(plainText);
|
||||
return;
|
||||
} else {
|
||||
if (process.stdin.isTTY) {
|
||||
this.stdout(_('Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.'));
|
||||
await DecryptionWorker.instance().start();
|
||||
this.stdout(_('Completed decryption.'));
|
||||
return;
|
||||
} else {
|
||||
// var repl = require("repl");
|
||||
// var r = repl.start("node> ");
|
||||
if (args.path) {
|
||||
const plainText = await EncryptionService.instance().decryptString(args.path);
|
||||
this.stdout(plainText);
|
||||
} else {
|
||||
this.stdout(_('Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.'));
|
||||
|
||||
const text = await new Promise((accept, reject) => {
|
||||
var buffer = '';
|
||||
process.stdin.setEncoding('utf8');
|
||||
process.stdin.on('data', function(chunk) {
|
||||
buffer += chunk;
|
||||
// process.stdout.write(chunk);
|
||||
});
|
||||
process.stdin.on('end', function() {
|
||||
accept(buffer.trim());
|
||||
});
|
||||
});
|
||||
|
||||
if (text.length > 0) {
|
||||
var cipherText = text;
|
||||
try {
|
||||
var item = await BaseItem.unserialize(text);
|
||||
cipherText = item.encryption_cipher_text;
|
||||
} catch (error) {
|
||||
// we already got the pure cipher text
|
||||
}
|
||||
const plainText = await EncryptionService.instance().decryptString(cipherText);
|
||||
this.stdout(plainText);
|
||||
while (true) {
|
||||
try {
|
||||
await DecryptionWorker.instance().start();
|
||||
break;
|
||||
} catch (error) {
|
||||
if (error.code === 'masterKeyNotLoaded') {
|
||||
const masterKeyId = error.masterKeyId;
|
||||
const password = await this.prompt(_('Enter master password:'), { type: 'string', secure: true });
|
||||
if (!password) {
|
||||
this.stdout(_('Operation cancelled'));
|
||||
return;
|
||||
}
|
||||
return;
|
||||
Setting.setObjectKey('encryption.passwordCache', masterKeyId, password);
|
||||
await EncryptionService.instance().loadMasterKeysFromSettings();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
if (error.code === 'masterKeyNotLoaded') {
|
||||
const masterKeyId = error.masterKeyId;
|
||||
const password = await this.prompt(_('Enter master password:'), { type: 'string', secure: true });
|
||||
if (!password) {
|
||||
this.stdout(_('Operation cancelled'));
|
||||
return;
|
||||
}
|
||||
Setting.setObjectKey('encryption.passwordCache', masterKeyId, password);
|
||||
await EncryptionService.instance().loadMasterKeysFromSettings();
|
||||
continue;
|
||||
}
|
||||
|
||||
throw error;
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
this.stdout(_('Completed decryption.'));
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -215,4 +186,4 @@ class Command extends BaseCommand {
|
||||
|
||||
}
|
||||
|
||||
module.exports = Command;
|
||||
module.exports = Command;
|
@@ -49,35 +49,6 @@ class Command extends BaseCommand {
|
||||
type: 'SEARCH_SELECT',
|
||||
id: searchId,
|
||||
});
|
||||
|
||||
// let fields = Note.previewFields();
|
||||
// fields.push('body');
|
||||
// const notes = await Note.previews(folder ? folder.id : null, {
|
||||
// fields: fields,
|
||||
// anywherePattern: '*' + pattern + '*',
|
||||
// });
|
||||
|
||||
// const fragmentLength = 50;
|
||||
|
||||
// let parents = {};
|
||||
|
||||
// for (let i = 0; i < notes.length; i++) {
|
||||
// const note = notes[i];
|
||||
// const parent = parents[note.parent_id] ? parents[note.parent_id] : await Folder.load(note.parent_id);
|
||||
// parents[note.parent_id] = parent;
|
||||
|
||||
// const idx = note.body.indexOf(pattern);
|
||||
// let line = '';
|
||||
// if (idx >= 0) {
|
||||
// let fragment = note.body.substr(Math.max(0, idx - fragmentLength / 2), fragmentLength);
|
||||
// fragment = fragment.replace(/\n/g, ' ');
|
||||
// line = sprintf('%s: %s / %s: %s', BaseModel.shortId(note.id), parent.title, note.title, fragment);
|
||||
// } else {
|
||||
// line = sprintf('%s: %s / %s', BaseModel.shortId(note.id), parent.title, note.title);
|
||||
// }
|
||||
|
||||
// this.stdout(line);
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -117,7 +117,6 @@ class Command extends BaseCommand {
|
||||
this.releaseLockFn_ = null;
|
||||
|
||||
// Lock is unique per profile/database
|
||||
// TODO: use SQLite database to do lock?
|
||||
const lockFilePath = require('os').tmpdir() + '/synclock_' + md5(escape(Setting.value('profileDir'))); // https://github.com/pvorb/node-md5/issues/41
|
||||
if (!await fs.pathExists(lockFilePath)) await fs.writeFile(lockFilePath, 'synclock');
|
||||
|
||||
|
@@ -139,7 +139,8 @@ class FolderListWidget extends ListWidget {
|
||||
const orderFolders = (parentId) => {
|
||||
for (let i = 0; i < this.folders.length; i++) {
|
||||
const f = this.folders[i];
|
||||
if (f.parent_id === parentId) {
|
||||
const folderParentId = f.parent_id ? f.parent_id : '';
|
||||
if (folderParentId === parentId) {
|
||||
newItems.push(f);
|
||||
if (this.folderHasChildren_(this.folders, f.id)) orderFolders(f.id);
|
||||
}
|
||||
|
@@ -1,5 +1,8 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// Use njstrace to find out what Node.js might be spending time on
|
||||
// var njstrace = require('njstrace').inject();
|
||||
|
||||
// Make it possible to require("/lib/...") without specifying full path
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
|
@@ -589,6 +589,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "S'està exportant a «%s» com a format «%s». Espereu..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Títol del bloc de notes:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Blocs de notes"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "S'està important des de «%s» com a format «%s». Espereu..."
|
||||
@@ -646,6 +660,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -655,6 +672,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Cerca a totes les notes"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Cerca a totes les notes"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Visualització"
|
||||
|
||||
@@ -664,6 +685,10 @@ msgstr "Mostra o amaga la barra lateral"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Canvia el disseny de l'editor"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Vés al cos"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Eines"
|
||||
|
||||
@@ -714,9 +739,21 @@ msgstr "Cancel·la"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versió actual està actualitzada"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hi ha disponible una actualització. Voleu baixar-la ara?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
@@ -791,13 +828,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprova la configuració de la sincronització"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Les notes i la configuració es desen a: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprova la configuració de la sincronització"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -892,6 +932,10 @@ msgstr "Estat"
|
||||
msgid "Encryption is:"
|
||||
msgstr "El xifratge és:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Ús: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Enrere"
|
||||
|
||||
@@ -942,36 +986,6 @@ msgstr "Alguns elements no s'han pogut desxifrar."
|
||||
msgid "Set the password"
|
||||
msgstr "Establiu la contrasenya"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Afegeix o suprimeix etiquetes"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Copia"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Alterna entre el tipus nota i tasques pendents"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Alterna entre el tipus nota i tasques pendents"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Alterna entre el tipus nota i tasques pendents"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copia l'enllaç Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Suprimeix"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Voleu suprimir les notes?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "No hi ha cap nota aquí. Creeu-ne una fent clic a «Nota nova»."
|
||||
|
||||
@@ -1021,6 +1035,9 @@ msgstr ""
|
||||
"Aquesta nota no té contingut. Feu clic a «%s» per a anar a l'editor i "
|
||||
"modificar-la."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1114,6 +1131,9 @@ msgstr "Voleu suprimir aquesta etiqueta de totes les notes?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Voleu suprimir aquesta cerca de la barra laterla?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Suprimeix"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Canvia el nom"
|
||||
|
||||
@@ -1134,6 +1154,39 @@ msgstr "Recursos: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Seleccioneu on s'hauria d'exportar l'estat de la sincronització"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Afegeix o suprimeix etiquetes"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Surt de l'aplicació"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Copia"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Alterna entre el tipus nota i tasques pendents"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Alterna entre el tipus nota i tasques pendents"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Alterna entre el tipus nota i tasques pendents"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copia l'enllaç Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Voleu suprimir les notes?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Voleu suprimir aquestes notes?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Ús: %s"
|
||||
@@ -1345,6 +1398,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Percentatge de zoom global"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Tipus de lletra de l'editor"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Tipus de lletra de l'editor"
|
||||
|
||||
@@ -1359,6 +1416,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualitza automàticament l'aplicació"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Interval de sincronització"
|
||||
|
||||
@@ -1451,6 +1515,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "El valor de l'opció no és vàlid: «%s». Els valors possibles són: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opcions generals"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Estat de la sincronització"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Blocs de notes"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Surt de l'aplicació"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1657,9 +1740,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Lloc web del Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Lloc web del Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Per suprimir: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Inicia sessió amb Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Clau mestra %s"
|
||||
@@ -1712,6 +1810,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipus d'imatge no admesa: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Adjunta una imatge"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Adjunta una imatge"
|
||||
|
||||
|
@@ -571,6 +571,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportuji do \"%s\" jako formát \"%s\". Chvíli strpení..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Název zápisníku:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Zápisníky"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importuji z \"%s\" jako formát \"%s\". Chvíli strpení..."
|
||||
@@ -628,6 +642,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -637,6 +654,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Hledat ve všech poznámkách"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Hledat ve všech poznámkách"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Zobrazit"
|
||||
|
||||
@@ -646,6 +667,10 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Změňit layout editoru"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Vybrat text poznámky"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Nástroje"
|
||||
|
||||
@@ -696,9 +721,21 @@ msgstr "Zrušit"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Současná verze je aktuální."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Je k dispozici update, chcete jej stáhnout?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ano"
|
||||
|
||||
@@ -766,13 +803,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Zkontrolujte nastavení synchronizace"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Poznámky a nastavení uloženo v: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Zkontrolujte nastavení synchronizace"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -862,6 +902,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Šifrování je:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Použití: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Zpět"
|
||||
|
||||
@@ -914,37 +958,6 @@ msgstr "Některé položky nelze rozšifrovat."
|
||||
msgid "Set the password"
|
||||
msgstr "Nastavit heslo"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Přidat či odebrat tagy"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopírovat"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Přepnout mezi poznámkou a to-do"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Přepnout mezi poznámkou a to-do"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Přepnout mezi poznámkou a to-do"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Smazat"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Smazat poznámky?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Žádné poznámky. Vytvořte jednu kliknutím na \"Nová poznámka\"."
|
||||
|
||||
@@ -990,6 +1003,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr "Tato poznámka je prázdný. Klikněte na \"%s\" pro otevření editoru."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1084,6 +1100,9 @@ msgstr "Odebrat tento tag ze všech poznámek?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Smazat tento hledaný výraz z panelu?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Smazat"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Přejmenovat"
|
||||
|
||||
@@ -1104,6 +1123,40 @@ msgstr "Zdroje: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Prosím vyberte, kam má být stav synchronizace exportován"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Přidat či odebrat tagy"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Ukončí aplikaci."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopírovat"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Přepnout mezi poznámkou a to-do"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Přepnout mezi poznámkou a to-do"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Přepnout mezi poznámkou a to-do"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Smazat poznámky?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Smazat tyto poznámky?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Použití: %s"
|
||||
@@ -1320,6 +1373,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Globální zoom"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Rodina písma v editoru"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Rodina písma v editoru"
|
||||
|
||||
@@ -1334,6 +1391,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automaticky updatovat aplikaci"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Interval synchronizace"
|
||||
|
||||
@@ -1426,6 +1490,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Neplatná hodnota: \"%s\". Přípustné hodnoty jsou: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Obecná nastavení"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Stav synchronizace"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Zápisníky"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Ukončí aplikaci."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1626,10 +1709,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Web Joplinu"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Web Joplinu"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "K smazání: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Přihlásit se pomocí OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Master heslo %s"
|
||||
@@ -1681,6 +1779,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Nepodporovaný formát obrázku: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Přiložit obrázek"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Přiložit obrázek"
|
||||
|
||||
|
@@ -576,6 +576,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Eksporterer til \"%s\" som \"%s\"-format. Vent venligst..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Notesbogs titel:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Notesbøger"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importerer fra \"%s\" som \"%s\"-format. Vent venligst..."
|
||||
@@ -633,6 +647,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -642,6 +659,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Søg i alle noter"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Søg i alle noter"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Vis"
|
||||
|
||||
@@ -651,6 +672,10 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Skift editor layout"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Fokuser på brødtekst"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Værktøjer"
|
||||
|
||||
@@ -701,9 +726,21 @@ msgstr "Fortryd"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Aktuel version er nyeste."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Opdatering er til rådighed, vil du hente den nu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
@@ -771,13 +808,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Check synkroniserings Indstillinger"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Noter og indstillinger er gemt i: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Check synkroniserings Indstillinger"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -871,6 +911,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Kryptering er:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Forbrug: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Tilbage"
|
||||
|
||||
@@ -923,37 +967,6 @@ msgstr "Nogle emner kan ikke krypteres."
|
||||
msgid "Set the password"
|
||||
msgstr "Indstil kodeord"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Tilføj eller slet mærker"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopier"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Skift mellem note- og opgave type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Skift mellem note- og opgave type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Skift mellem note- og opgave type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Slet"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Slet noter?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Der er ingen noter her. Opret en ved at klikke på \"Ny note\"."
|
||||
|
||||
@@ -999,6 +1012,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr "Denne note er tom. Klik på \"%s\" for at starte editor og rette noten."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1093,6 +1109,9 @@ msgstr "Slet denne markering fra alle noter?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Slet denne søgning fra sidebjælke?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Slet"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Omdøb"
|
||||
|
||||
@@ -1113,6 +1132,40 @@ msgstr "Ressourcer: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Vælg hvor sync status skal eksporteres til"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Tilføj eller slet mærker"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Forlad/luk program."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopier"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Skift mellem note- og opgave type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Skift mellem note- og opgave type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Skift mellem note- og opgave type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Slet noter?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Slet disse noter?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Forbrug: %s"
|
||||
@@ -1329,6 +1382,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Global zoom procent"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Rediger skrifttype"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Rediger skrifttype"
|
||||
|
||||
@@ -1343,6 +1400,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automatisk app update"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synkroniserings interval"
|
||||
|
||||
@@ -1435,6 +1499,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ulovlig værdi: \"%s\". Mulige valg er: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Generelle indstillinger"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Synkroniserings status"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Notesbøger"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Forlad/luk program."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1635,10 +1718,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin hjemmeside"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin hjemmeside"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Til sletning: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Log på med OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hoved nøgle %s"
|
||||
@@ -1690,6 +1788,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Ulovlig billedtype: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Vedhæft foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Vedhæft foto"
|
||||
|
||||
|
@@ -472,10 +472,10 @@ msgid "Starting synchronisation..."
|
||||
msgstr "Starte Synchronisation..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "Lade Anhänge herunter..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "Abbrechen… Bitte warten."
|
||||
msgstr "Abbrechen... Bitte warten."
|
||||
|
||||
msgid ""
|
||||
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
||||
@@ -598,9 +598,23 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportiere „%s“ ins „%s“ Format. Bitte warten..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Notizbuch-Titel:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Notizbücher"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten…"
|
||||
msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten..."
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-Datei"
|
||||
@@ -654,6 +668,9 @@ msgstr "Fett"
|
||||
msgid "Italic"
|
||||
msgstr "Kursiv"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Datum / Uhrzeit einfügen"
|
||||
|
||||
@@ -663,15 +680,22 @@ msgstr "Im externen Editor bearbeiten"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Alle Notizen durchsuchen"
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr "Aktuelle Notiz durchsuchen"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Ansicht"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr "Seitenleiste ein/aus"
|
||||
msgstr "Seitenleiste umschalten"
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Editor-Layout umschalten"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Fokussiere Inhalt"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Werkzeuge"
|
||||
|
||||
@@ -697,7 +721,7 @@ msgid "Make a donation"
|
||||
msgstr "Spenden"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr "Überprüfe auf Updates…"
|
||||
msgstr "Überprüfe auf Aktualisierungen..."
|
||||
|
||||
msgid "About Joplin"
|
||||
msgstr "Über Joplin"
|
||||
@@ -720,10 +744,23 @@ msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Die aktuelle Version ist up-to-date."
|
||||
msgstr "Die aktuelle Version ist auf dem neuesten Stand."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Es ist ein Update verfügbar. Soll es jetzt heruntergeladen werden?"
|
||||
msgstr ""
|
||||
"Es ist eine Aktualisierung verfügbar. Soll sie jetzt heruntergeladen werden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
@@ -801,13 +838,16 @@ msgstr ""
|
||||
"Dieses Autorisierung-Token wird nur benötigt, um Drittanbieter-Anwendungen "
|
||||
"Zugriff auf Joplin zu gewähren."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Überprüfen der Synchronisationseinstellungen"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Notizen und Einstellungen werden gespeichert in: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Überprüfen der Synchronisationseinstellungen"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Anwenden"
|
||||
|
||||
@@ -879,7 +919,7 @@ msgstr ""
|
||||
"Notizbücher ursprünglich verschlüsselt wurden."
|
||||
|
||||
msgid "Missing Master Keys"
|
||||
msgstr "Fehlender Hauptschlüssel"
|
||||
msgstr "Fehlende Hauptschlüssel"
|
||||
|
||||
msgid ""
|
||||
"The master keys with these IDs are used to encrypt some of your items, "
|
||||
@@ -901,6 +941,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Die Verschlüsselung ist:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Nutzung: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Zurück"
|
||||
|
||||
@@ -953,34 +997,6 @@ msgstr "Einige Objekte können nicht entschlüsselt werden."
|
||||
msgid "Set the password"
|
||||
msgstr "Setze ein Passwort"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Schlagwörter hinzufügen oder entfernen"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplizieren"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s kopieren"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Zwischen Notiz und To-Do Typ wechseln"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "Zu Notiz-Typ wechseln"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Zu To-Do-Typ wechseln"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown-Link kopieren"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Notizen löschen?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr ""
|
||||
"Keine Notizen vorhanden. Erstelle eine, indem du auf \"Neue Notiz\" drückst."
|
||||
@@ -1019,6 +1035,7 @@ msgstr "Link-Adresse kopieren"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
"Dieser Anhang wurde nicht heruntergeladen oder noch nicht entschlüsselt."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1032,6 +1049,9 @@ msgstr ""
|
||||
"Diese Notiz hat keinen Inhalt. Klicke auf „%s“ um den Editor zu aktivieren "
|
||||
"und die Notiz zu bearbeiten."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "Fetter Text"
|
||||
|
||||
@@ -1124,6 +1144,9 @@ msgstr "Dieses Schlagwort von allen Notizen entfernen?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Diese Suche von der Seitenleiste entfernen?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Umbenennen"
|
||||
|
||||
@@ -1137,14 +1160,44 @@ msgstr "Notizbücher"
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "Entschlüsselte Objekte: %d/%d"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "Anhänge: %d."
|
||||
msgstr "Ressourcen abrufen: %d"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
"Bitte wähle aus, wohin der Synchronisations-Status exportiert werden soll"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Schlagwörter hinzufügen oder entfernen"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplizieren"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Kopieren"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Zwischen Notiz und To-Do Typ wechseln"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "Zu Notiz-Typ wechseln"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Zu To-Do-Typ wechseln"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown-Link kopieren"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Notizbuch \"%s\" löschen?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Sollen diese Notizen gelöscht werden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Nutzung: %s"
|
||||
@@ -1350,6 +1403,9 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"Dadurch kann Joplin im Hintergrund laufen. Es wird empfohlen,diese "
|
||||
"Einstellung zu aktivieren, damit deine Notizen ständig synchronisiertwerden "
|
||||
"und somit die Anzahl der Konflikte reduziert wird."
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr "Starte die Anwendung minimiert im Tray"
|
||||
@@ -1357,8 +1413,11 @@ msgstr "Starte die Anwendung minimiert im Tray"
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Zoomstufe der Benutzeroberfläche"
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr "Schriftgröße im Editor"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Editor Schriftenfamilie"
|
||||
msgstr "Schriftfamilie im Editor"
|
||||
|
||||
msgid ""
|
||||
"This must be *monospace* font or it will not work properly. If the font is "
|
||||
@@ -1371,6 +1430,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Die Applikation automatisch aktualisieren"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synchronisationsinterval"
|
||||
|
||||
@@ -1470,6 +1536,26 @@ msgstr "Ignoriere TLS-Zertifikatfehler"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ungültiger Optionswert: \"%s\". Mögliche Werte sind: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Allgemeine Einstellungen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Status der Synchronisation"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Notizbücher"
|
||||
|
||||
# Please note: The term 'Location' is assumed to be the geographical location where the note has been created. For this the german word 'Standort' fits better than the previously used 'Ablageort'. The latter one is used for the folder where files are stored.
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Standort"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1487,9 +1573,8 @@ msgstr "Joplin Export Verzeichnis"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote Export Datei"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin Export Verzeichnis"
|
||||
msgstr "Json Export Verzeichnis"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Verzeichnis"
|
||||
@@ -1567,10 +1652,10 @@ msgid "On %s: %s"
|
||||
msgstr "Auf %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "Berechtigung zur Verwendung der Kamera"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
msgstr "Deine Zustimmung zur Verwendung deiner Kamera ist erforderlich."
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr ""
|
||||
@@ -1683,9 +1768,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Website von Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Datenbank v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS aktiviert: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Mit Dropbox anmelden"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "Hier Code eingeben"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hauptschlüssel %s"
|
||||
@@ -1738,6 +1838,9 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Nicht unterstütztes Fotoformat: %s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "Foto aufnehmen"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Foto anhängen"
|
||||
|
||||
@@ -1763,7 +1866,7 @@ msgid "View on map"
|
||||
msgstr "Auf der Karte anzeigen"
|
||||
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
msgstr "Zur Quell-URL gehen"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Notizbuch löschen"
|
||||
@@ -1790,6 +1893,9 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Willkommen"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Notizen löschen?"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Status: %s."
|
||||
|
||||
@@ -1833,9 +1939,6 @@ msgstr "Willkommen"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Das vorherige Fenster fokussieren"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Zum Terminal-Modus wechseln"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Den Terminal-Modus verlassen"
|
||||
|
||||
@@ -1854,7 +1957,6 @@ msgstr "Willkommen"
|
||||
#~ msgid "Set a to-do as completed / not completed"
|
||||
#~ msgstr "Ein To-Do als abgeschlossen / nicht abgeschlossen markieren"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "[t]oggle [c]onsole between maximized/minimized/hidden/visible."
|
||||
#~ msgstr ""
|
||||
#~ "Schal[t]e das Terminal zwischen maximiert/minimiert/versteckt/sichtbar um."
|
||||
@@ -1894,9 +1996,6 @@ msgstr "Willkommen"
|
||||
#~ msgid "Delete notebook?"
|
||||
#~ msgstr "Notizbuch löschen?"
|
||||
|
||||
#~ msgid "Delete notebook \"%s\"?"
|
||||
#~ msgstr "Notizbuch \"%s\" löschen?"
|
||||
|
||||
#~ msgid "File system synchronisation target directory"
|
||||
#~ msgstr "Dateisystem-Synchronisation Zielpfad"
|
||||
|
||||
|
@@ -508,6 +508,18 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note title"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note body"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
@@ -564,6 +576,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -573,6 +588,9 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr ""
|
||||
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
@@ -582,6 +600,9 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
msgstr ""
|
||||
|
||||
@@ -632,9 +653,21 @@ msgstr ""
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -701,13 +734,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -786,6 +822,9 @@ msgstr ""
|
||||
msgid "Encryption is:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Usage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
@@ -836,34 +875,6 @@ msgstr ""
|
||||
msgid "Set the password"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr ""
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr ""
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr ""
|
||||
|
||||
@@ -909,6 +920,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1001,6 +1015,9 @@ msgstr ""
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "Rename"
|
||||
msgstr ""
|
||||
|
||||
@@ -1021,6 +1038,36 @@ msgstr ""
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr ""
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr ""
|
||||
@@ -1224,6 +1271,9 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
@@ -1235,6 +1285,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr ""
|
||||
|
||||
@@ -1319,6 +1376,21 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr ""
|
||||
|
||||
msgid "General"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note"
|
||||
msgstr ""
|
||||
|
||||
msgid "Application"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1508,9 +1580,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr ""
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1562,6 +1649,9 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr ""
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr ""
|
||||
|
||||
|
@@ -585,6 +585,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportando el formato de \"%s\" a \"%s\". Por favor espere..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Título de libreta:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Libretas"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importando el formato de \"%s\" a \"%s\". Por favor espere..."
|
||||
@@ -642,6 +656,9 @@ msgstr "Negrita"
|
||||
msgid "Italic"
|
||||
msgstr "Cursiva"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Introduce fecha"
|
||||
|
||||
@@ -651,6 +668,10 @@ msgstr "Editar con un editor externo"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Buscar en todas las notas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Buscar en todas las notas"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Ver"
|
||||
|
||||
@@ -660,6 +681,10 @@ msgstr "Cambia la barra lateral"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Cambia el diseño del editor"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Foco en el cuerpo"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Herramientas"
|
||||
|
||||
@@ -710,9 +735,21 @@ msgstr "Cancelar"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versión actual está actualizada."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hay disponible una actualización. ¿Quiere descargarla ahora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
@@ -787,13 +824,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprobar sincronización"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Las notas y los ajustes se guardan en: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprobar sincronización"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Aplicar"
|
||||
|
||||
@@ -887,6 +927,10 @@ msgstr "Estado"
|
||||
msgid "Encryption is:"
|
||||
msgstr "El cifrado está:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Uso: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Atrás"
|
||||
|
||||
@@ -937,36 +981,6 @@ msgstr "No se han podido descifrar algunos elementos."
|
||||
msgid "Set the password"
|
||||
msgstr "Establecer la contraseña"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Añadir o borrar etiquetas"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicado"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copiar"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copiar el enlace de Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Eliminar"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "¿Desea eliminar notas?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "No hay ninguna nota. Cree una pulsando «Nota nueva»."
|
||||
|
||||
@@ -1014,6 +1028,9 @@ msgstr ""
|
||||
"Esta nota no tiene contenido. Pulse en \"%s\" para cambiar al editor y "
|
||||
"editar la nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "texto destacado"
|
||||
|
||||
@@ -1106,6 +1123,9 @@ msgstr "¿Desea eliminar esta etiqueta de todas las notas?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "¿Desea eliminar esta búsqueda de la barra lateral?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Eliminar"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Renombrar"
|
||||
|
||||
@@ -1126,6 +1146,38 @@ msgstr "Recursos: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Seleccione a dónde se debería exportar el estado de sincronización"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Añadir o borrar etiquetas"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicado"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copiar"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copiar el enlace de Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Elimina una libreta \"%s\"?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "¿Desea borrar estas notas?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Uso: %s"
|
||||
@@ -1338,6 +1390,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Establecer el porcentaje de aumento de la aplicación"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Fuente del editor"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Fuente del editor"
|
||||
|
||||
@@ -1352,6 +1408,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualizar la aplicación automáticamente"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalo de sincronización"
|
||||
|
||||
@@ -1449,6 +1512,25 @@ msgstr "Ignorar errores en certificados TLS"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Opción inválida: «%s». Los valores posibles son: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opciones generales"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Estado de la sincronización"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Libretas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Salir de la aplicación."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1655,9 +1737,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Borrar: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Acceder con Dropbox"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Entrar en modo línea de comandos"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Clave maestra %s"
|
||||
@@ -1710,6 +1808,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipo de imagen no soportado: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Adjuntar foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Adjuntar foto"
|
||||
|
||||
@@ -1760,6 +1862,9 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Bienvenido"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "¿Desea eliminar notas?"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Estado: «%s»."
|
||||
|
||||
@@ -1810,9 +1915,6 @@ msgstr "Bienvenido"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Enfocar el panel anterior"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Entrar en modo línea de comandos"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Salir del modo línea de comandos"
|
||||
|
||||
@@ -1822,9 +1924,6 @@ msgstr "Bienvenido"
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Cancelar el comando actual."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Salir de la aplicación."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Eliminar la nota o libreta seleccionada."
|
||||
|
||||
@@ -1875,9 +1974,6 @@ msgstr "Bienvenido"
|
||||
#~ msgid "Delete notebook?"
|
||||
#~ msgstr "Eliminar libreta?"
|
||||
|
||||
#~ msgid "Delete notebook \"%s\"?"
|
||||
#~ msgstr "Elimina una libreta \"%s\"?"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "File system synchronisation target directory"
|
||||
#~ msgstr "Sincronización de sistema de archivos en directorio objetivo"
|
||||
|
@@ -582,6 +582,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Koadernoaren izenburua: "
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Koadernoak"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
@@ -641,6 +655,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -650,6 +667,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Bilatu ohar guztietan"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Bilatu ohar guztietan"
|
||||
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
@@ -659,6 +680,9 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Tresnak"
|
||||
|
||||
@@ -710,9 +734,21 @@ msgstr "Utzi"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -781,14 +817,17 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Sinkronizazioa utzi"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Oharrak eta ezarpenak hemen daude gordeta: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Sinkronizazioa utzi"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -879,6 +918,10 @@ msgstr "Egoera"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Zifratua da:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Erabili: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Atzera"
|
||||
|
||||
@@ -933,36 +976,6 @@ msgstr "Zenbait item ezin dira deszifratu."
|
||||
msgid "Set the password"
|
||||
msgstr "Ezarri pasahitza"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Gehitu edo ezabatu etiketak"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopiatu"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Aldatu oharra eta zeregin eren artean."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Aldatu oharra eta zeregin eren artean."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Aldatu oharra eta zeregin eren artean."
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Ezabatu"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Oharrak ezabatu?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Hemen ez dago oharrik. Sortu bat \"Ohar berria\" sakatuta."
|
||||
|
||||
@@ -1009,6 +1022,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1106,6 +1122,9 @@ msgstr "Kendu etiketa hori ohar guztietatik?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Kendu bilaketa hori ohar guztietatik?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Ezabatu"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Berrizendatu"
|
||||
|
||||
@@ -1127,6 +1146,39 @@ msgstr "Baliabideak: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Aukeratu nora esportatu sinkronizazioaren egoera, mesedez"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Gehitu edo ezabatu etiketak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Irten aplikaziotik"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopiatu"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Aldatu oharra eta zeregin eren artean."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Aldatu oharra eta zeregin eren artean."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Aldatu oharra eta zeregin eren artean."
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Oharrak ezabatu?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Oharrok ezabatu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Erabili: %s"
|
||||
@@ -1350,6 +1402,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Ezarri aplikazioaren zoomaren ehunekoa"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Oharra editatu."
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
@@ -1361,6 +1417,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automatikoki eguneratu aplikazioa"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Sinkronizazio tartea"
|
||||
|
||||
@@ -1456,6 +1519,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Balio aukera baliogabea: \"%s\". Litezkeen balioak: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Ezarpenak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Sinkronizazioaren egoera"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Koadernoak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Irten aplikaziotik"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1656,10 +1738,26 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Ezabatzeko: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Login with OneDrive"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Sartu komando-lerro moduan "
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Pasahitz Nagusia %s"
|
||||
@@ -1711,6 +1809,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Irudi formatua ez onartua: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Argazkia erantsi"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Argazkia erantsi"
|
||||
|
||||
@@ -1802,9 +1904,6 @@ msgstr "Ongi etorri!"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Eraman fokua aurreko panelera"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Sartu komando-lerro moduan "
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Irten komando-lerro modutik"
|
||||
|
||||
@@ -1814,9 +1913,6 @@ msgstr "Ongi etorri!"
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Utzi uneko komandoa"
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Irten aplikaziotik"
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Ezabatu aukeratutako oharra edo koadernoa"
|
||||
|
||||
|
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.3\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "Pour supprimer une vignette, enlever là des notes associées."
|
||||
@@ -583,6 +583,18 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exporter vers \"%s\" au format \"%s\". Veuillez patienter..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr "Barre latérale"
|
||||
|
||||
msgid "Note list"
|
||||
msgstr "Liste de notes"
|
||||
|
||||
msgid "Note title"
|
||||
msgstr "Titre de la note"
|
||||
|
||||
msgid "Note body"
|
||||
msgstr "Corps de la note"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importer depuis \"%s\" au format \"%s\". Veuillez patienter..."
|
||||
@@ -639,6 +651,9 @@ msgstr "Gras"
|
||||
msgid "Italic"
|
||||
msgstr "Italique"
|
||||
|
||||
msgid "Link"
|
||||
msgstr "Lien"
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Insérer la date et l'heure"
|
||||
|
||||
@@ -648,6 +663,9 @@ msgstr "Ouvrir dans un éditeur externe"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Chercher dans toutes les notes"
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr "Chercher dans la note en cours"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Affichage"
|
||||
|
||||
@@ -657,6 +675,9 @@ msgstr "Basculer barre latérale"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Basculer l'agencement de l'éditeur"
|
||||
|
||||
msgid "Focus"
|
||||
msgstr "Naviguer"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Outils"
|
||||
|
||||
@@ -707,10 +728,22 @@ msgstr "Annuler"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La version actuelle est à jour."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr "%s (pré-release)"
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
"Une mise à jour est disponible, souhaitez vous la télécharger maintenant ?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "Votre version : v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "Nouvelle version : v%s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Oui"
|
||||
|
||||
@@ -786,13 +819,16 @@ msgstr ""
|
||||
"Ce code d'authentification est nécessaire uniquement pour permettre aux "
|
||||
"logiciels tiers d'accéder aux données de Joplin."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Vérifier config synchronisation"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Les notes et paramètres se trouve dans : %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr "Parcourir…"
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Vérifier config synchronisation"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Appliquer"
|
||||
|
||||
@@ -888,6 +924,9 @@ msgstr "État"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Le chiffrement est :"
|
||||
|
||||
msgid "Usage"
|
||||
msgstr "Utilisation"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Retour"
|
||||
|
||||
@@ -940,34 +979,6 @@ msgstr "Certains objets ne peuvent être déchiffrés."
|
||||
msgid "Set the password"
|
||||
msgstr "Définir le mot de passe"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Gérer les étiquettes"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Dupliquer"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copie"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Alterner entre note et tâche"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "Convertir en note"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Convertir en tâche"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copier lien Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Supprimer"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Supprimer les notes ?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr ""
|
||||
"Pas de notes ici. Créez-en une en pressant le bouton \"Nouvelle note\"."
|
||||
@@ -1004,7 +1015,7 @@ msgid "Copy Link Address"
|
||||
msgstr "Copier l'adresse du lien"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr "Cette pièce jointe n'est pas téléchargée ou pas encore déchiffrée"
|
||||
msgstr "Cette pièce jointe n'est pas téléchargée ou pas encore déchiffrée."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1018,6 +1029,11 @@ msgstr ""
|
||||
"Cette note n'a pas de contenu. Cliquer sur \"%s\" pour basculer vers "
|
||||
"l'éditeur et éditer cette note."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
"Les notes ne peuvent être imprimées ou exportées en PDF qu'une seule à la "
|
||||
"fois."
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "texte en gras"
|
||||
|
||||
@@ -1110,6 +1126,9 @@ msgstr "Enlever cette étiquette de toutes les notes ?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Enlever cette recherche de la barre latérale ?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Supprimer"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Renommer"
|
||||
|
||||
@@ -1131,6 +1150,36 @@ msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
"Veuillez sélectionner un répertoire ou exporter l'état de la synchronisation"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Gérer les étiquettes"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Dupliquer"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copie"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Alterner entre note et tâche"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "Convertir en note"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Convertir en tâche"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copier lien Markdown"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Supprimer note \"%s\" ?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Supprimer ces %d notes ?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Utilisation : %s"
|
||||
@@ -1345,6 +1394,9 @@ msgstr "Démarrer minimisé dans la zone de notification"
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Niveau de zoom"
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr "Taille police éditeur"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Police de l'éditeur"
|
||||
|
||||
@@ -1359,6 +1411,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Mettre à jour le logiciel automatiquement"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr "Recevoir les pré-release lors de la vérification des mises à jour"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr "Voir la page des pré-release pour plus de détails : %s"
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalle de synchronisation"
|
||||
|
||||
@@ -1458,6 +1517,21 @@ msgstr "Ignorer les erreurs de certificats TLS"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Option invalide: \"%s\". Les valeurs possibles sont : %s."
|
||||
|
||||
msgid "General"
|
||||
msgstr "Général"
|
||||
|
||||
msgid "Synchronisation"
|
||||
msgstr "Synchronisation"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr "Apparence"
|
||||
|
||||
msgid "Note"
|
||||
msgstr "Note"
|
||||
|
||||
msgid "Application"
|
||||
msgstr "Application"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr "L'étiquette \"%s\" existe déjà. Veuillez choisir un autre nom."
|
||||
@@ -1555,7 +1629,7 @@ msgid "Permission to use camera"
|
||||
msgstr "Permission d'utiliser l'appareil photo"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr "Votre permission est requise pour utiliser l'appareil photo"
|
||||
msgstr "Votre permission est requise pour utiliser l'appareil photo."
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr ""
|
||||
@@ -1667,9 +1741,24 @@ msgstr "- Position : Pour attacher à une note les coordonnées GPS."
|
||||
msgid "Joplin website"
|
||||
msgstr "Site web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Base de données v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS activé : %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Se connecter à Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "Entrez le code ici"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Clef maître %s"
|
||||
@@ -1722,6 +1811,9 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Type d'image non géré : %s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "Prendre une photo"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Attacher une photo"
|
||||
|
||||
@@ -1773,6 +1865,9 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Bienvenue"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Supprimer les notes ?"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "État : %s."
|
||||
|
||||
@@ -1823,9 +1918,6 @@ msgstr "Bienvenue"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Activer le volet précédent"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Démarrer le mode de ligne de commande"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Sortir du mode de ligne de commande"
|
||||
|
||||
@@ -1895,9 +1987,6 @@ msgstr "Bienvenue"
|
||||
#~ msgid "Delete notebook?"
|
||||
#~ msgstr "Supprimer le carnet ?"
|
||||
|
||||
#~ msgid "Delete notebook \"%s\"?"
|
||||
#~ msgstr "Supprimer le carnet \"%s\" ?"
|
||||
|
||||
#~ msgid "File system synchronisation target directory"
|
||||
#~ msgstr "Cible de la synchronisation sur le disque dur"
|
||||
|
||||
|
@@ -576,6 +576,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportando a «%s» como formato «%s». Agarde..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Título do caderno:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Cadernos"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importando de «%s» como formato «%s». Agarde..."
|
||||
@@ -633,6 +647,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -642,6 +659,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Buscar en todas as notas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Buscar en todas as notas"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Vista"
|
||||
|
||||
@@ -651,6 +672,10 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Cambiar a disposición do editor"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Focar no corpo"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Ferramentas"
|
||||
|
||||
@@ -701,9 +726,21 @@ msgstr "Cancelar"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "A versión actual está actualizada."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hai unha actualización dispoñíbel, desexa descargala agora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Si"
|
||||
|
||||
@@ -771,13 +808,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprobar a configuración da sincronización"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "As notas e axustes gardáronse en: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprobar a configuración da sincronización"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -869,6 +909,10 @@ msgstr "Estado"
|
||||
msgid "Encryption is:"
|
||||
msgstr "O cifrado é:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Uso: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Anterior"
|
||||
|
||||
@@ -920,37 +964,6 @@ msgstr "Non é posíbel descifrar algúns elementos."
|
||||
msgid "Set the password"
|
||||
msgstr "Estabelecer un contrasinal"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Engadir ou eliminar etiquetas"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Copiar"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Cambiar entre notas e tarefas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Cambiar entre notas e tarefas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Cambiar entre notas e tarefas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Eliminar"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Desexa eliminar as notas?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Aquí non hai notas. Cree unha premendo en «Nova nota»."
|
||||
|
||||
@@ -998,6 +1011,9 @@ msgstr ""
|
||||
"Esta nota non ten contido. Prema en «%s» para ir ao editor e modificar a "
|
||||
"nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1092,6 +1108,9 @@ msgstr "Desexa eliminar esta etiqueta de todas as notas?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Desexa eliminar esta busca da barra lateral?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Eliminar"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Renomear"
|
||||
|
||||
@@ -1112,6 +1131,40 @@ msgstr "Recursos: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Seleccione onde exportar o estado da sincronización"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Engadir ou eliminar etiquetas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Sae do aplicativo."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Copiar"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Cambiar entre notas e tarefas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Cambiar entre notas e tarefas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Cambiar entre notas e tarefas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Desexa eliminar as notas?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Desexa eliminar estas notas?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Uso: %s"
|
||||
@@ -1328,6 +1381,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Porcentaxe de ampliación"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Familia de tipos de letra do editor"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Familia de tipos de letra do editor"
|
||||
|
||||
@@ -1342,6 +1399,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualizar automaticamente o aplicativo"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalo de sincronización"
|
||||
|
||||
@@ -1434,6 +1498,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Valor incorrecto de opción: «%s». Os valores posíbeis son: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opcións xerais"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Estado da sincronización"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Cadernos"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Sae do aplicativo."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1634,10 +1717,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Borrar: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Acceder con OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Chave mestra %s"
|
||||
@@ -1689,6 +1787,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipo de imaxe incompatíbel: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Anexar foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Anexar foto"
|
||||
|
||||
|
@@ -579,6 +579,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Naslov bilježnice:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Bilježnice"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
@@ -638,6 +652,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -647,6 +664,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Pretraži u svim bilješkama"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Pretraži u svim bilješkama"
|
||||
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
@@ -656,6 +677,10 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Naslov bilješke:"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Alati"
|
||||
|
||||
@@ -708,9 +733,21 @@ msgstr "Odustani"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -779,14 +816,17 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Prekini sinkronizaciju"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Bilješke i postavke su pohranjene u: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Prekini sinkronizaciju"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -865,6 +905,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Korištenje: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Natrag"
|
||||
|
||||
@@ -920,36 +964,6 @@ msgstr "Neke stavke se ne mogu sinkronizirati."
|
||||
msgid "Set the password"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Dodaj ili makni oznake"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopiraj"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Zamijeni bilješku i zadatak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Zamijeni bilješku i zadatak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Zamijeni bilješku i zadatak"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Obriši"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Obriši bilješke?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Ovdje nema bilješki. Stvori novu pritiskom na \"Nova bilješka\"."
|
||||
|
||||
@@ -996,6 +1010,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1092,6 +1109,9 @@ msgstr "Makni ovu oznaku iz svih bilješki?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Makni ovu pretragu iz izbornika?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Obriši"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Preimenuj"
|
||||
|
||||
@@ -1112,6 +1132,39 @@ msgstr "Resursi: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Odaberi lokaciju za izvoz statusa sinkronizacije"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Dodaj ili makni oznake"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Izađi iz aplikacije."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopiraj"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Zamijeni bilješku i zadatak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Zamijeni bilješku i zadatak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Zamijeni bilješku i zadatak"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Obriši bilješke?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Obriši ove bilješke?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Korištenje: %s"
|
||||
@@ -1332,6 +1385,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Uredi bilješku."
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
@@ -1343,6 +1400,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automatsko instaliranje nove verzije"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Interval sinkronizacije"
|
||||
|
||||
@@ -1433,6 +1497,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Nevažeća vrijednost: \"%s\". Moguće vrijednosti su: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opcije"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Status sinkronizacije"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Bilježnice"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Izađi iz aplikacije."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1631,10 +1714,26 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Za brisanje: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Prijavi se u OneDrive"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Otvori naredbeni redak"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1687,6 +1786,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Nepodržana vrsta slike: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Priloži sliku"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Priloži sliku"
|
||||
|
||||
@@ -1777,9 +1880,6 @@ msgstr "Dobro došli"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Fokusiraj prethodno okno"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Otvori naredbeni redak"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Napusti naredbeni redak"
|
||||
|
||||
@@ -1789,9 +1889,6 @@ msgstr "Dobro došli"
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Prekini trenutnu naredbu."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Izađi iz aplikacije."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Obriši odabranu bilješku ili bilježnicu."
|
||||
|
||||
|
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.1.1\n"
|
||||
"X-Generator: Poedit 2.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -462,7 +462,7 @@ msgid "Starting synchronisation..."
|
||||
msgstr "Inizio sincronizzazione..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "Scaricamento risorse…"
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "Cancellazione... Attendere per favore."
|
||||
@@ -566,6 +566,13 @@ msgid ""
|
||||
"\n"
|
||||
"For example, to create a notebook press `mb`; to create a note press `mn`."
|
||||
msgstr ""
|
||||
"Benvenuto in Joplin!\n"
|
||||
"\n"
|
||||
"Digita `:help shortcuts` per la lista delle scorciatoie da tastiera, oppure "
|
||||
"solo `:help` per le informazioni di utilizzo.\n"
|
||||
"\n"
|
||||
"Per esempio, per creare un taccuino digita `mb`; per creare una nota digita "
|
||||
"`mn`."
|
||||
|
||||
msgid ""
|
||||
"One or more items are currently encrypted and you may need to supply a "
|
||||
@@ -582,6 +589,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Esportazione da \"%s\" come formato \"%s\". Si prega di attendere..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Titolo del Taccuino:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Taccuini"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importazione da \"%s\" come formato \"%s\". Si prega di attendere..."
|
||||
@@ -629,9 +650,8 @@ msgstr "Taglia"
|
||||
msgid "Paste"
|
||||
msgstr "Incolla"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Select all"
|
||||
msgstr "Seleziona la data"
|
||||
msgstr "Seleziona tutto"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "Grasseto"
|
||||
@@ -639,6 +659,9 @@ msgstr "Grasseto"
|
||||
msgid "Italic"
|
||||
msgstr "Corsivo"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Inserisci data e ora"
|
||||
|
||||
@@ -648,6 +671,9 @@ msgstr "Modifica in un editor esterno"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Cerca in tutte le note"
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr "Cerca nella nota corrente"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Vista"
|
||||
|
||||
@@ -657,6 +683,10 @@ msgstr "Attiva / disattiva barra laterale"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Attiva / disattiva il layout dell'editor"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Focus sul testo"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Strumenti"
|
||||
|
||||
@@ -707,9 +737,21 @@ msgstr "Cancella"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versione attuale è aggiornata."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "È disponibile un aggiornamento, vuoi scaricarlo ora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sì"
|
||||
|
||||
@@ -783,13 +825,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Controlla la configurazione della sincronizzazione"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Le note e le impostazioni sono memorizzate in: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Controlla la configurazione della sincronizzazione"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Applica"
|
||||
|
||||
@@ -885,6 +930,10 @@ msgstr "Stato"
|
||||
msgid "Encryption is:"
|
||||
msgstr "La crittografia è:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Uso: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Indietro"
|
||||
|
||||
@@ -935,36 +984,6 @@ msgstr "Alcuni elementi non possono essere decodificati."
|
||||
msgid "Set the password"
|
||||
msgstr "Imposta la password"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Aggiungi o rimuovi etichetta"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicare"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copia"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copia il link Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Elimina"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Eliminare le note?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Non è presente nessuna nota. Creane una cliccando \"Nuova nota\"."
|
||||
|
||||
@@ -1000,7 +1019,7 @@ msgid "Copy Link Address"
|
||||
msgstr "Copia l'indirizzo del link"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
msgstr "Questo allegato non è ancora stato scaricato o decriptato."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1014,6 +1033,9 @@ msgstr ""
|
||||
"Questa nota non ha contenuto. Fai clic su \"%s\" per attivare l'editor e "
|
||||
"modificare la nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "Testo grasseto"
|
||||
|
||||
@@ -1107,6 +1129,9 @@ msgstr "Rimuovere questa etichetta da tutte le note?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Rimuovere questa ricerca dalla barra laterale?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Elimina"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Rinomina"
|
||||
|
||||
@@ -1127,6 +1152,36 @@ msgstr "Risorse: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Aggiungi o rimuovi etichetta"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicare"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copia"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "Converti in nota"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Converti in \"Cose-da-fare\""
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copia il link Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Eliminare il taccuino \"%s\"?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Cancellare queste note?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Uso: %s"
|
||||
@@ -1312,10 +1367,10 @@ msgid "When creating a new to-do:"
|
||||
msgstr "Quando crei un nuovo \"Cose-da-fare\":"
|
||||
|
||||
msgid "Focus title"
|
||||
msgstr ""
|
||||
msgstr "Focus sul titolo"
|
||||
|
||||
msgid "Focus body"
|
||||
msgstr ""
|
||||
msgstr "Focus sul testo"
|
||||
|
||||
msgid "When creating a new note:"
|
||||
msgstr "Quando si crea una nuova nota:"
|
||||
@@ -1331,6 +1386,9 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"Questo consentirà Joplin di essere in esecuzione in background. E’ "
|
||||
"raccomandata l’attivazione di questa impostazione per sincronizzare "
|
||||
"costantemente le tue note e quindi ridurre il numero di conflitti."
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr ""
|
||||
@@ -1338,8 +1396,11 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Percentuale di zoom globale"
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr "Editor dimensione caratteri"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Editor Famiglia Caratteri"
|
||||
msgstr "Editor famiglia caratteri"
|
||||
|
||||
msgid ""
|
||||
"This must be *monospace* font or it will not work properly. If the font is "
|
||||
@@ -1352,6 +1413,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Aggiorna automaticamente l'applicazione"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervallo di sincronizzazione"
|
||||
|
||||
@@ -1446,14 +1514,33 @@ msgstr "Ignora gli errori del certificato TLS"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Oprione non valida: \"%s\". I valori possibili sono: %s."
|
||||
msgstr "Opzione non valida: \"%s\". I valori possibili sono: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opzioni Generali"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Stato di sincronizzazione"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Taccuini"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Esci dall'applicazione."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
msgstr "Il tag \"%s\" esiste già. Scegliere un nome differente."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Esposta files di Joplin"
|
||||
msgstr "Esporta file di Joplin"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr "Markdown"
|
||||
@@ -1464,9 +1551,8 @@ msgstr "Cartella di esportazione di Joplin"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Esporta files di Evernote"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Cartella di esportazione di Joplin"
|
||||
msgstr "Cartella di esportazione JSON"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Cartella"
|
||||
@@ -1543,7 +1629,7 @@ msgid "On %s: %s"
|
||||
msgstr "Su %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "Permesso di usare la fotocamera"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
@@ -1653,11 +1739,26 @@ msgstr ""
|
||||
"geografica ad una nota."
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr "Siro web Joplin"
|
||||
msgstr "Sito web Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Database v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS attivato: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Login Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "Inserisci qui il codice"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Chiave Master %s"
|
||||
@@ -1710,6 +1811,9 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipo di immagine non supportata: %s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "Scatta foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Allega foto"
|
||||
|
||||
@@ -1760,6 +1864,9 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Benvenuto"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Eliminare le note?"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Stato: %s."
|
||||
|
||||
@@ -1817,9 +1924,6 @@ msgstr "Benvenuto"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Pannello precedente"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Accedi alla modalità linea di comando"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Esci dalla modalità linea di comando"
|
||||
|
||||
@@ -1829,9 +1933,6 @@ msgstr "Benvenuto"
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Cancella il comando corrente."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Esci dall'applicazione."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr "Elimina la nota o il taccuino selezionato."
|
||||
|
||||
@@ -1878,8 +1979,5 @@ msgstr "Benvenuto"
|
||||
#~ msgid "Delete notebook?"
|
||||
#~ msgstr "Eliminare il taccuino?"
|
||||
|
||||
#~ msgid "Delete notebook \"%s\"?"
|
||||
#~ msgstr "Eliminare il taccuino \"%s\"?"
|
||||
|
||||
#~ msgid "File system synchronisation target directory"
|
||||
#~ msgstr "Directory di destinazione per la sincronizzazione nel file system"
|
||||
|
@@ -236,7 +236,7 @@ msgstr ""
|
||||
"ムを参照できます。"
|
||||
|
||||
msgid "To move from one pane to another, press Tab or Shift+Tab."
|
||||
msgstr "ペイン間を移動するには、TabかShift+Tabをおしてください。"
|
||||
msgstr "ペイン間を移動するには、TabかShift+Tabを押してください。"
|
||||
|
||||
msgid ""
|
||||
"Use the arrows and page up/down to scroll the lists and text areas "
|
||||
@@ -446,7 +446,7 @@ msgid "Starting synchronisation..."
|
||||
msgstr "同期を開始中..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "リソースをダウンロード中..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "中止中...お待ちください。"
|
||||
@@ -570,6 +570,20 @@ msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
"\"%s\" を \"%s\" フォーマットにエクスポート中。しばらくお待ちください..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "ノートブックの題名:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "ノートブック"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
@@ -618,9 +632,8 @@ msgstr "切り取り"
|
||||
msgid "Paste"
|
||||
msgstr "貼り付け"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Select all"
|
||||
msgstr "日付の選択"
|
||||
msgstr "すべて選択"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "太字"
|
||||
@@ -628,6 +641,9 @@ msgstr "太字"
|
||||
msgid "Italic"
|
||||
msgstr "斜体"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "日付の入力"
|
||||
|
||||
@@ -637,6 +653,9 @@ msgstr "外部エディターで編集"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "すべてのノートを検索"
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr "現在のノートを検索"
|
||||
|
||||
msgid "View"
|
||||
msgstr "表示"
|
||||
|
||||
@@ -646,6 +665,10 @@ msgstr "サイドバーの表示切り替え"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "エディターレイアウトの表示切り替え"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "本文にフォーカス"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "ツール"
|
||||
|
||||
@@ -696,9 +719,21 @@ msgstr "キャンセル"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "現在のバージョンは最新版です。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "アップデートがあります。すぐにダウンロードしますか?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Yes"
|
||||
|
||||
@@ -706,7 +741,7 @@ msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr ""
|
||||
msgstr "トークンをクリップボードにコピーしました!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr "Webクリッパーサービスは有効で、自動起動します。"
|
||||
@@ -756,28 +791,32 @@ msgstr "ステップ2: 拡張機能のインストール"
|
||||
msgid "Download and install the relevant extension for your browser:"
|
||||
msgstr "関連する拡張機能をブラウザーにインストールします:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Advanced options"
|
||||
msgstr "詳細な設定の表示"
|
||||
msgstr "詳細な設定"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr ""
|
||||
msgstr "認証するトークン:"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr ""
|
||||
msgstr "トークンのコピー"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "同期の設定を確認する"
|
||||
"この認証トークンはサードパーティアプリケーションがJoplinにアクセスするためだ"
|
||||
"けに必要です。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "ノートと設定は次の場所に保存されます: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "同期の設定を確認する"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "適用"
|
||||
|
||||
@@ -869,6 +908,10 @@ msgstr "状態"
|
||||
msgid "Encryption is:"
|
||||
msgstr "暗号化の状態:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "使用方法: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "戻る"
|
||||
|
||||
@@ -921,36 +964,6 @@ msgstr "いくつかの項目は復号されませんでした。"
|
||||
msgid "Set the password"
|
||||
msgstr "パスワードの設定"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "タグの追加と削除"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "複製"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - コピー"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "ノートとToDoを切り替え"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "ノートとToDoを切り替え"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "ノートとToDoを切り替え"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdownのリンクをコピー"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "削除"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "ノートを削除しますか?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "ノートがありません。新しいノートを作成して下さい。"
|
||||
|
||||
@@ -959,13 +972,13 @@ msgid ""
|
||||
msgstr "ノートブックがありません。新しいノートブックを作成してください。"
|
||||
|
||||
msgid "Location"
|
||||
msgstr ""
|
||||
msgstr "場所"
|
||||
|
||||
msgid "URL"
|
||||
msgstr ""
|
||||
msgstr "URL"
|
||||
|
||||
msgid "Note properties"
|
||||
msgstr ""
|
||||
msgstr "ノートのプロパティ"
|
||||
|
||||
msgid "Open..."
|
||||
msgstr "開く..."
|
||||
@@ -984,7 +997,7 @@ msgid "Copy Link Address"
|
||||
msgstr "リンクアドレスをコピー"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
msgstr "この添付ファイルはダウンロードできないか、まだ復号できません。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -998,6 +1011,9 @@ msgstr ""
|
||||
"このノートには中身がありません。 \"%s\" をクリックしてエディターを表示し、"
|
||||
"ノートを編集してください。"
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "文字を太字に"
|
||||
|
||||
@@ -1011,7 +1027,7 @@ msgid "Insert Hyperlink"
|
||||
msgstr "ハイパーリンクの挿入"
|
||||
|
||||
msgid "Attach file"
|
||||
msgstr "ファイルを添付"
|
||||
msgstr "ファイルを添付する"
|
||||
|
||||
msgid "Tags"
|
||||
msgstr "タグ"
|
||||
@@ -1090,6 +1106,9 @@ msgstr "すべてのノートからこのタグを削除しますか?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "サイドバーからこの検索を削除しますか?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "削除"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "名前の変更"
|
||||
|
||||
@@ -1103,13 +1122,43 @@ msgstr "ノートブック"
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "復号中のアイテム: %d/%d"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "リソース: %d."
|
||||
msgstr "取得中のリソース: %d"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "同期状況の出力先を選択してください"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "タグの追加と削除"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "複製"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - コピー"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "ノートとToDoを切り替え"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "ノートに切り替え"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "ToDoに切り替え"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdownのリンクをコピー"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "ノートを削除しますか?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "ノートを削除しますか?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "使用方法: %s"
|
||||
@@ -1316,6 +1365,8 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"有効にすると、Joplinがバックグラウンドで動作するようになります。ノートを定期"
|
||||
"的に同期し、衝突を減らすために強くおすすめする設定です。"
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr "アプリケーションをトレイアンコンで最小化して起動"
|
||||
@@ -1323,6 +1374,9 @@ msgstr "アプリケーションをトレイアンコンで最小化して起動
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "全体ズームの割合"
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr "エディターのフォントサイズ"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "エディターのフォントファミリー"
|
||||
|
||||
@@ -1334,7 +1388,14 @@ msgstr ""
|
||||
"誤っているか空の場合は、一般的な等幅フォントが指定されるでしょう。"
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "アプリケーションの自動更新"
|
||||
msgstr "アプリケーションを自動的にアップデート"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "同期間隔"
|
||||
@@ -1433,6 +1494,25 @@ msgstr "TLS証明書のエラーを無視"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "無効な設定値: \"%s\"。有効な値は: %sです。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "全般のオプション"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "同期状況"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "ノートブック"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "場所"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr "タグ \"%s\" はすでにあります。ほかの名前を選択してください。"
|
||||
@@ -1449,9 +1529,8 @@ msgstr "Joplin エクスポートディレクトリ"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote エクスポートファイル"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin エクスポートディレクトリ"
|
||||
msgstr "Json エクスポートディレクトリ"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "ディレクトリ"
|
||||
@@ -1528,10 +1607,10 @@ msgid "On %s: %s"
|
||||
msgstr "日時 %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "カメラ使用の許可"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
msgstr "カメラを使用するには権限が必要です。"
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr "ノートがありません。(+)ボタンを押して新しいノートを作成してください。"
|
||||
@@ -1561,9 +1640,8 @@ msgstr "%d個のノートを\"%s\"に移動しますか?"
|
||||
msgid "Press to set the decryption password."
|
||||
msgstr "復号するパスワードを入力してください。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Clear alarm"
|
||||
msgstr "アラームをセット"
|
||||
msgstr "アラームをクリア"
|
||||
|
||||
msgid "Save alarm"
|
||||
msgstr "アラームの保存"
|
||||
@@ -1577,22 +1655,21 @@ msgstr "確認"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "同期の中止"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Checking... Please wait."
|
||||
msgstr "中止中...お待ちください。"
|
||||
msgstr "確認中...お待ちください。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Success! Synchronisation configuration appears to be correct."
|
||||
msgstr "同期の設定を確認する"
|
||||
msgstr "成功です! 同期の設定は正しいようです。"
|
||||
|
||||
msgid ""
|
||||
"Error. Please check that URL, username, password, etc. are correct and that "
|
||||
"the sync target is accessible. The reported error was:"
|
||||
msgstr ""
|
||||
"エラーです。URL、ユーザー名、パスワードなどを修正し、同期するターゲットにアク"
|
||||
"セスできるかを確認してください。次が報告されたエラーです:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "The application has been authorised!"
|
||||
msgstr "アプリケーションは問題なく認証されました。"
|
||||
msgstr "アプリケーションは問題なく認証されました!"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -1602,10 +1679,15 @@ msgid ""
|
||||
"\n"
|
||||
"Please try again."
|
||||
msgstr ""
|
||||
"アプリケーションが認証できません:\n"
|
||||
"\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"やり直してください。"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Decrypted items: %s / %s"
|
||||
msgstr "復号中のアイテム: %d/%d"
|
||||
msgstr "復号中のアイテム: %s/%s"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr "新しいタグ:"
|
||||
@@ -1636,9 +1718,25 @@ msgstr "- 位置情報: ノートに位置情報を添付するのに必要で
|
||||
msgid "Joplin website"
|
||||
msgstr "JoplinのWebサイト"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "JoplinのWebサイト"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "削除予定: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Dropboxでログイン"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "コマンドラインモードに入る"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "マスターキー %s"
|
||||
@@ -1690,6 +1788,9 @@ msgstr "Joplinモバイルアプリは次のタイプのリンクをまだサポ
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "サポートされていない画像の形式: %s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "写真を撮影する"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "写真を添付"
|
||||
|
||||
@@ -1715,7 +1816,7 @@ msgid "View on map"
|
||||
msgstr "地図上に表示"
|
||||
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
msgstr "ソースURLに行く"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "ノートブックを削除"
|
||||
@@ -1781,9 +1882,6 @@ msgstr "ようこそ"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "前のペインへ"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "コマンドラインモードに入る"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "コマンドラインモードの終了"
|
||||
|
||||
|
@@ -508,6 +508,18 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note title"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note body"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
@@ -564,6 +576,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -573,6 +588,9 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr ""
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr ""
|
||||
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
@@ -582,6 +600,9 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
msgstr ""
|
||||
|
||||
@@ -632,9 +653,21 @@ msgstr ""
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -701,13 +734,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -786,6 +822,9 @@ msgstr ""
|
||||
msgid "Encryption is:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Usage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
@@ -836,34 +875,6 @@ msgstr ""
|
||||
msgid "Set the password"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr ""
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr ""
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr ""
|
||||
|
||||
@@ -909,6 +920,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1001,6 +1015,9 @@ msgstr ""
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "Rename"
|
||||
msgstr ""
|
||||
|
||||
@@ -1021,6 +1038,36 @@ msgstr ""
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr ""
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr ""
|
||||
@@ -1224,6 +1271,9 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr ""
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
@@ -1235,6 +1285,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr ""
|
||||
|
||||
@@ -1319,6 +1376,21 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr ""
|
||||
|
||||
msgid "General"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note"
|
||||
msgstr ""
|
||||
|
||||
msgid "Application"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1508,9 +1580,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr ""
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1562,6 +1649,9 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr ""
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr ""
|
||||
|
||||
|
@@ -447,12 +447,11 @@ msgid "Starting synchronisation..."
|
||||
msgstr "동기화를 시작합니다..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "리소스 다운로드 중..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "취소하는 중입니다... 잠시만 기다리세요."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
||||
"[tag] from [note], or to list the notes associated with [tag]. The command "
|
||||
@@ -460,7 +459,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"[note]로부터 [tag]를 지우거나 지정할 때, 아니면 [tag]와 관련된 노트의 목록을 "
|
||||
"확인할 때 <tag-command>로 \"add\", \"remove\" 또는 \"list\" 를 사용할 수 있습"
|
||||
"니다. `tag list` 명령어로 모든 태그의 목록을 확인할 수 있습니다."
|
||||
"니다. `tag list` 명령어로 모든 태그의 목록을 확인할 수 있습니다 (옵션 -l 사"
|
||||
"용 가능)."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Invalid command: \"%s\""
|
||||
@@ -568,6 +568,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "\"%s\"에 \"%s\" 포맷으로 내보내는 중입니다. 잠시만 기다리세요..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "노트북 제목:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "노트북"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "\"%s\"에서 \"%s\" 포맷으로 가져오는 중입니다. 잠시만 기다리세요..."
|
||||
@@ -615,9 +629,8 @@ msgstr "잘라내기"
|
||||
msgid "Paste"
|
||||
msgstr "붙여넣기"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Select all"
|
||||
msgstr "날짜 선택"
|
||||
msgstr "모두 선택"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "굵게"
|
||||
@@ -625,6 +638,9 @@ msgstr "굵게"
|
||||
msgid "Italic"
|
||||
msgstr "기울임"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "날짜와 시간 입력"
|
||||
|
||||
@@ -634,6 +650,9 @@ msgstr "외부 편집기에서 편집하기"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "모든 노트에서 검색"
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr "현재 노트에서 검색"
|
||||
|
||||
msgid "View"
|
||||
msgstr "보기"
|
||||
|
||||
@@ -643,6 +662,10 @@ msgstr "사이드바 표시 전환"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "편집기 배치 형태 전환"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "내용에 포커스"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "도구"
|
||||
|
||||
@@ -693,9 +716,21 @@ msgstr "취소"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "현재 버전은 최신입니다."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr "%s (프리-릴리즈)"
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "업데이트가 있습니다. 지금 다운로드할까요?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "현재 버전: v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "새 버전: v%s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "예"
|
||||
|
||||
@@ -703,7 +738,7 @@ msgid "No"
|
||||
msgstr "아니오"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr ""
|
||||
msgstr "토큰이 클립보드로 복사되었습니다!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr "웹 수집기 서비스가 활성화되었고 자동으로 시작하도록 설정되었습니다."
|
||||
@@ -752,28 +787,32 @@ msgstr "2단계: 확장 기능 설치"
|
||||
msgid "Download and install the relevant extension for your browser:"
|
||||
msgstr "브라우저에 적절한 확장 기능을 다운로드 및 설치하세요:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Advanced options"
|
||||
msgstr "고급 옵션"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr ""
|
||||
msgstr "인증 토큰:"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr ""
|
||||
msgstr "토큰 복사"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "동기화 설정 확인"
|
||||
"이 인증 토큰은 오직 서드파티 애플리케이션에서 조플린을 접근할 때만 필요합니"
|
||||
"다."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "노트와 설정값이 다음에 저장되었습니다: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "동기화 설정 확인"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "적용"
|
||||
|
||||
@@ -865,6 +904,10 @@ msgstr "상태"
|
||||
msgid "Encryption is:"
|
||||
msgstr "암호화는 다음과 같습니다:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "사용량: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "뒤로 가기"
|
||||
|
||||
@@ -915,36 +958,6 @@ msgstr "일부 항목들은 암호화할 수 없습니다."
|
||||
msgid "Set the password"
|
||||
msgstr "암호 설정"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "태그 추가 및 제거"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "복제"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - 복사"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "마크다운 링크 복사"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "삭제"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "노트를 삭제할까요?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "노트가 없습니다. '새 노트'를 선택해서 노트를 새로 만드세요."
|
||||
|
||||
@@ -953,13 +966,13 @@ msgid ""
|
||||
msgstr "노트북이 없습니다. '새 노트북'을 선택해서 노트북을 새로 만드세요."
|
||||
|
||||
msgid "Location"
|
||||
msgstr ""
|
||||
msgstr "위치"
|
||||
|
||||
msgid "URL"
|
||||
msgstr ""
|
||||
msgstr "URL"
|
||||
|
||||
msgid "Note properties"
|
||||
msgstr ""
|
||||
msgstr "노트 속성"
|
||||
|
||||
msgid "Open..."
|
||||
msgstr "열기..."
|
||||
@@ -978,7 +991,7 @@ msgid "Copy Link Address"
|
||||
msgstr "링크 주소 복사"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
msgstr "이 첨부는 아직 다운로드 또는 복호화 되지 않았습니다."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -992,6 +1005,9 @@ msgstr ""
|
||||
"비어있는 노트입니다. \"%s\" 항목을 선택해서 편집기를 전환하고 노트를 편집하세"
|
||||
"요."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr "한 번에 오직 하나의 노트만 출력하거나 내보내기 할 수 있습니다."
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "중요 텍스트"
|
||||
|
||||
@@ -1084,6 +1100,9 @@ msgstr "모든 노트에서 이 태그를 제거할까요?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "사이드바에서 이 검색 항목을 제거할까요?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "삭제"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "이름 바꾸기"
|
||||
|
||||
@@ -1097,13 +1116,43 @@ msgstr "노트북"
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "복호화 항목: %d/%d"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "리소스: %d."
|
||||
msgstr "리소스 가져오는 중: %d."
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "동기화 상태를 내보낼 대상을 선택하세요"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "태그 추가 및 제거"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "복제"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - 복사"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "'노트' 또는'할 일' 형식으로 전환합니다."
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "'노트' 형식으로 전환합니다."
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "'할 일' 형식으로 전환합니다."
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "마크다운 링크 복사"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "노트를 삭제할까요?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "노트를 삭제할까요?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "사용량: %s"
|
||||
@@ -1308,13 +1357,18 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"조플린을 백그라운드에서 구동합니다. 노트가 정기적으로 동기화 되어 충돌 횟수"
|
||||
"를 줄이기 위해 이 옵션을 활성화 하는 것을 추천합니다."
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr ""
|
||||
msgstr "트레이 아이콘에 최소화 된 상태로 애플리케이션 시작"
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "전체적 확대 비율"
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr "편집기 글꼴 크기"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "편집기 글꼴 집합"
|
||||
|
||||
@@ -1329,6 +1383,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "애플리케이션을 자동으로 업데이트"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr "업데이트 확인 시 프리-릴리즈 받기"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr "자세한 내용은 프리-릴리즈 페이지를 참조하세요: %s"
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "동기화 간격"
|
||||
|
||||
@@ -1386,6 +1447,8 @@ msgid ""
|
||||
"to it before syncing, otherwise all files will be removed! See the FAQ for "
|
||||
"more details: %s"
|
||||
msgstr ""
|
||||
"주의: 이 위치를 변경하시려면, 동기화 전에 모든 컨텐트를 복사했는지 확인하세"
|
||||
"요, 그렇지 않으면 모든 파일이 삭제됩니다! 자세한 정보는 FAQ를 참조하세요: %s"
|
||||
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Nextcloud 사용자 이름"
|
||||
@@ -1423,9 +1486,28 @@ msgstr "TLS 인증서 오류 무시"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "올바르지 않은 옵션 값: \"%s\". 가능한 값은 다음과 같습니다: \"%s\"."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "일반 옵션"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "동기화 상태"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "노트북"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "위치"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
msgstr "태그 \"%s\"(이)가 이미 존재합니다. 다른 이름을 선택해 주세요."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "조플린 내보내기 파일"
|
||||
@@ -1439,9 +1521,8 @@ msgstr "조플린 내보내기 폴더"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "에버노트 내보내기 파일"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "조플린 내보내기 폴더"
|
||||
msgstr "Json 내보내기 폴더"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "폴더"
|
||||
@@ -1518,10 +1599,10 @@ msgid "On %s: %s"
|
||||
msgstr "%s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "카메라 사용 허가"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
msgstr "카메라 사용을 허가가 요구됩니다."
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr "노트가 없습니다. (+) 버튼을 선택해 새로 만드세요."
|
||||
@@ -1551,9 +1632,8 @@ msgstr "%d 노트를 \"%s\" 노트북으로 옮길까요?"
|
||||
msgid "Press to set the decryption password."
|
||||
msgstr "복호화 암호를 설정하려면 누르세요."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Clear alarm"
|
||||
msgstr "알람 설정"
|
||||
msgstr "알람 취소"
|
||||
|
||||
msgid "Save alarm"
|
||||
msgstr "알람 저장"
|
||||
@@ -1567,20 +1647,19 @@ msgstr "확인"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "동기화 취소"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Checking... Please wait."
|
||||
msgstr "취소하는 중입니다... 잠시만 기다리세요."
|
||||
msgstr "확인 중입니다... 잠시만 기다리세요."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Success! Synchronisation configuration appears to be correct."
|
||||
msgstr "동기화 설정 확인"
|
||||
msgstr "성공! 동기화 설정이 올바릅니다."
|
||||
|
||||
msgid ""
|
||||
"Error. Please check that URL, username, password, etc. are correct and that "
|
||||
"the sync target is accessible. The reported error was:"
|
||||
msgstr ""
|
||||
"Error. Please check that URL, username, password, etc. are correct and that "
|
||||
"the sync target is accessible. The reported error was:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "The application has been authorised!"
|
||||
msgstr "애플리케이션이 성공적으로 허가되었습니다."
|
||||
|
||||
@@ -1592,10 +1671,15 @@ msgid ""
|
||||
"\n"
|
||||
"Please try again."
|
||||
msgstr ""
|
||||
"애플리케이션을 허가할 수 없습니다:\n"
|
||||
"\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"다시 시도해 주세요."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Decrypted items: %s / %s"
|
||||
msgstr "복호화 항목: %d/%d"
|
||||
msgstr "복호화된 항목: %s / %s"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr "새 태그:"
|
||||
@@ -1626,9 +1710,24 @@ msgstr "- 위치: 지리적 위치 정보를 노트에 첨부하기 위해서
|
||||
msgid "Joplin website"
|
||||
msgstr "조플린 웹사이트"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "조플린 v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "데이터베이스 v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS 활성됨: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Dropbox로 로그인"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "여기에 코드를 입력하세요"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "관리자 키 %s"
|
||||
@@ -1680,6 +1779,9 @@ msgstr "조플린 모바일 앱은 현재 해당 형식의 링크를 지원하
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "지원하지 않는 이미지 형식: %s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "사진 찍기"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "사진 첨부"
|
||||
|
||||
@@ -1705,7 +1807,7 @@ msgid "View on map"
|
||||
msgstr "지도에 표시"
|
||||
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
msgstr "소스 URL로 이동"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "노트북 삭제"
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -584,6 +584,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Notitieboek titel:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Notitieboeken"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
@@ -643,6 +657,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -652,6 +669,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Zoek in alle notities"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Zoek in alle notities"
|
||||
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
@@ -661,6 +682,9 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Tools"
|
||||
|
||||
@@ -712,9 +736,21 @@ msgstr "Annuleer"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -783,14 +819,17 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Annuleer synchronisatie"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Notities en instellingen zijn opgeslaan in %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Annuleer synchronisatie"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -881,6 +920,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Versleuteling is:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Gebruik: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Terug"
|
||||
|
||||
@@ -935,36 +978,6 @@ msgstr "Sommige items kunnen niet gedecodeerd worden."
|
||||
msgid "Set the password"
|
||||
msgstr "Stel wachtwoord in"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Voeg tag toe of verwijder tag"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopieer"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Wissel tussen notitie en to-do type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Wissel tussen notitie en to-do type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Wissel tussen notitie en to-do type"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Notities verwijderen?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Geen notities. Maak een notitie door op \"Nieuwe notitie\" te klikken."
|
||||
|
||||
@@ -1013,6 +1026,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1109,6 +1125,9 @@ msgstr "Deze tag verwijderen van alle notities?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Dit item verwijderen van de zijbalk?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Hernoem"
|
||||
|
||||
@@ -1129,6 +1148,39 @@ msgstr "Middelen: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Selecteer waar de synchronisatie status naar geëxporteerd moet worden"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Voeg tag toe of verwijder tag"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Sluit de applicatie."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopieer"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Wissel tussen notitie en to-do type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Wissel tussen notitie en to-do type"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Wissel tussen notitie en to-do type"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Notities verwijderen?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Deze notities verwijderen?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Gebruik: %s"
|
||||
@@ -1352,6 +1404,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Bewerk notitie."
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
@@ -1363,6 +1419,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Update de applicatie automatisch"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synchronisatie interval"
|
||||
|
||||
@@ -1456,6 +1519,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ongeldige optie: \"%s\". Geldige waarden zijn: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Algemene opties"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Synchronisatie status"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Notitieboeken"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Sluit de applicatie."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1658,10 +1740,26 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Verwijderen: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Log in met OneDrive"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Ga naar command line modus"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hoofdsleutel: %s"
|
||||
@@ -1713,6 +1811,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Afbeeldingstype %s wordt niet ondersteund"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Voeg foto toe"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Voeg foto toe"
|
||||
|
||||
@@ -1806,9 +1908,6 @@ msgstr "Welkom"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Focus op het vorige paneel"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Ga naar command line modus"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Ga uit command line modus"
|
||||
|
||||
@@ -1818,9 +1917,6 @@ msgstr "Welkom"
|
||||
#~ msgid "Cancel the current command."
|
||||
#~ msgstr "Annuleer het huidige commando."
|
||||
|
||||
#~ msgid "Exit the application."
|
||||
#~ msgstr "Sluit de applicatie."
|
||||
|
||||
#~ msgid "Delete the currently selected note or notebook."
|
||||
#~ msgstr ""
|
||||
#~ "Verwijder de geselecteerde notitie of het geselecteerde notitieboek."
|
||||
|
@@ -585,6 +585,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Bezig met exporteren van \"%s\" in het formaat \"%s\". Even geduld..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Titel van notitieboek:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Notitieboeken"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Bezig met importeren van \"%s\" in het formaat \"%s\". Even geduld..."
|
||||
@@ -642,6 +656,9 @@ msgstr "Vetgedrukt"
|
||||
msgid "Italic"
|
||||
msgstr "Cursief"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Datum en tijd invoegen"
|
||||
|
||||
@@ -651,6 +668,10 @@ msgstr "Bewerken in externe bewerker"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Alle notities doorzoeken"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Alle notities doorzoeken"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Beeld"
|
||||
|
||||
@@ -660,6 +681,10 @@ msgstr "Zijbalk tonen/verbergen"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Bewerkindeling tonen/verbergen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Inhoud focussen"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Hulpmiddelen"
|
||||
|
||||
@@ -710,9 +735,21 @@ msgstr "Annuleren"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "De huidige versie is up-to-date."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Er is een update beschikbaar. Wil je deze nu downloaden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
@@ -786,13 +823,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Synchronisatieconfiguratie controleren"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Notities en instellingen worden opgeslagen in: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Synchronisatieconfiguratie controleren"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Toepassen"
|
||||
|
||||
@@ -887,6 +927,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Gebruikte versleuteling:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Gebruik: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Terug"
|
||||
|
||||
@@ -939,36 +983,6 @@ msgstr "Sommige items kunnen niet worden ontsleuteled."
|
||||
msgid "Set the password"
|
||||
msgstr "Wachtwoord instellen"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Labels toevoegen of verwijderen"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Dupliceren"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - kopiëren"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Schakelen tussen notitie en taak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Schakelen tussen notitie en taak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Schakelen tussen notitie en taak"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdownlink kopiëren"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Notities verwijderen?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr ""
|
||||
"Er zijn hier geen notities. Creëer een notitie door de klikken op \"Nieuwe "
|
||||
@@ -1020,6 +1034,9 @@ msgstr ""
|
||||
"Deze notitie bevat geen inhoud. Klik op \"%s\" om de bewerker te openen en "
|
||||
"de notitie te bewerken."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "vetgedrukte tekst"
|
||||
|
||||
@@ -1112,6 +1129,9 @@ msgstr "Wil je dit label verwijderen van alle notities?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Wil je deze zoekopdracht verwijderen uit de zijbalk?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Naam wijzigen"
|
||||
|
||||
@@ -1132,6 +1152,38 @@ msgstr "Bronnen: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Kies waar de synchronisatiestatus naar moet worden geëxporteerd"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Labels toevoegen of verwijderen"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Dupliceren"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - kopiëren"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Schakelen tussen notitie en taak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Schakelen tussen notitie en taak"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Schakelen tussen notitie en taak"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdownlink kopiëren"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Notities verwijderen?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Deze notities verwijderen?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Gebruik: %s"
|
||||
@@ -1343,6 +1395,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Globaal zoompercentage"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Lettertype van bewerker"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Lettertype van bewerker"
|
||||
|
||||
@@ -1357,6 +1413,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Applicatie automatisch bijwerken"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synchronisatietussenpoos"
|
||||
|
||||
@@ -1454,6 +1517,25 @@ msgstr "TLS-certificaatfouten negeren"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ongeldige optie: \"%s\". Geldige waarden zijn: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Algemene opties"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Synchronisatiestatus"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Notitieboeken"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Sluit de applicatie af."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1662,9 +1744,24 @@ msgstr "- Locatie: zodat je locatie-informatie kunt toevoegen aan een notitie."
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin-website"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin-website"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Te verwijderen: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Inloggen met Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hoofdsleutel %s"
|
||||
@@ -1716,6 +1813,10 @@ msgstr "De mobiele Joplin-app ondersteunt momenteel niet dit soort links: %s"
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Niet-ondersteunde afbeeldingssoort: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Foto bijvoegen"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Foto bijvoegen"
|
||||
|
||||
|
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2\n"
|
||||
"X-Generator: Poedit 2.0.7\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -582,6 +582,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportando para \"%s\" com o formato \"%s\". Por favor, aguarde..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Título do caderno:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Cadernos"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importando de \"%s\" com o formato \"%s\". Por favor, aguarde..."
|
||||
@@ -638,6 +652,9 @@ msgstr "Negrito"
|
||||
msgid "Italic"
|
||||
msgstr "Itálico"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Inserir Data e Hora"
|
||||
|
||||
@@ -647,6 +664,9 @@ msgstr "Editar com editor externo"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Pesquisar em todas as notas"
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr "Pesquisar na nota atual"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Visualizar"
|
||||
|
||||
@@ -656,6 +676,10 @@ msgstr "Alternar barra lateral"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Alternar layout do editor"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Focar no corpo"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Ferramentas"
|
||||
|
||||
@@ -706,9 +730,21 @@ msgstr "Cancelar"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "A versão atual está atualizada."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Uma atualização está disponível, você quer baixar agora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sim"
|
||||
|
||||
@@ -783,13 +819,16 @@ msgstr ""
|
||||
"Esse token de autoriza\\u00e7\\u00e3o só é necess\\u00e1rio para permitir "
|
||||
"que aplicativos de terceiros acessem o Joplin."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Verificar a configuração da sincronização"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Notas e configurações estão armazenadas em: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Verificar a configuração da sincronização"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Aplicar"
|
||||
|
||||
@@ -883,6 +922,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Encriptação está:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Uso: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Voltar"
|
||||
|
||||
@@ -934,34 +977,6 @@ msgstr "Alguns itens não podem ser decriptados."
|
||||
msgid "Set the password"
|
||||
msgstr "Configurar a senha"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Adicionar ou remover tags"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicar"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copiar"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Alternar entre os tipos Nota e Tarefa"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "Alternar para o tipo Nota"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Alternar para o tipo Tarefa"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copiar link de Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Excluir"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Excluir notas?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Não há notas aqui. Crie uma, clicando em \"Nova nota\"."
|
||||
|
||||
@@ -1009,6 +1024,9 @@ msgstr ""
|
||||
"Esta nota não possui conteúdo. Clique em \"%s\" para alternar para o editor, "
|
||||
"e edite a nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "texto forte"
|
||||
|
||||
@@ -1101,6 +1119,9 @@ msgstr "Remover esta tag de todas as notas?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Remover essa pesquisa da barra lateral?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Excluir"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Renomear"
|
||||
|
||||
@@ -1123,6 +1144,36 @@ msgstr ""
|
||||
"Favor selecionar o local para onde o status de sincronia deveria ser "
|
||||
"exportado"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Adicionar ou remover tags"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicar"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copiar"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Alternar entre os tipos Nota e Tarefa"
|
||||
|
||||
msgid "Switch to note type"
|
||||
msgstr "Alternar para o tipo Nota"
|
||||
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Alternar para o tipo Tarefa"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copiar link de Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Apagar o caderno \"%s\"?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Excluir estas notas?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Uso: %s"
|
||||
@@ -1256,7 +1307,7 @@ msgid "title"
|
||||
msgstr "título"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data de ataualização"
|
||||
msgstr "data de atualização"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "data de criação"
|
||||
@@ -1338,6 +1389,9 @@ msgstr "Iniciar aplicativo minimizado na barra de tarefas"
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Porcentagem global do zoom"
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr "Tamanho da fonte no Editor"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Família de fontes do editor"
|
||||
|
||||
@@ -1351,6 +1405,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Atualizar automaticamente o aplicativo"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalo de sincronização"
|
||||
|
||||
@@ -1450,6 +1511,25 @@ msgstr "Ignorar erros de certificados TLS"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Valor da opção inválida: \"%s\". Os valores possíveis são: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opções Gerais"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Status de sincronização"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Cadernos"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Localização"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr "A tag \"%s\" já existe. Escolha um nome diferente."
|
||||
@@ -1660,9 +1740,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Site do Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Site do Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Para excluir: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Login com Dropbox"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Entrar no modo de linha de comando"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Chave Master %s"
|
||||
@@ -1714,6 +1810,9 @@ msgstr "O app mobile do Joplin não suporta, atualmente, esse tipo de link: %s"
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipo de imagem não suportada: %s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "Tirar foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Anexar foto"
|
||||
|
||||
@@ -1763,6 +1862,9 @@ msgstr "Você não possui cadernos. Crie um clicando no botão (+)."
|
||||
msgid "Welcome"
|
||||
msgstr "Bem-vindo"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Excluir notas?"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Estado: \"%s\"."
|
||||
|
||||
@@ -1806,9 +1908,6 @@ msgstr "Bem-vindo"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Dar o foco para o painel anterior"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Entrar no modo de linha de comando"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Sair do modo de linha de comando"
|
||||
|
||||
@@ -1862,8 +1961,5 @@ msgstr "Bem-vindo"
|
||||
#~ msgid "Delete notebook?"
|
||||
#~ msgstr "Excluir caderno?"
|
||||
|
||||
#~ msgid "Delete notebook \"%s\"?"
|
||||
#~ msgstr "Apagar o caderno \"%s\"?"
|
||||
|
||||
#~ msgid "File system synchronisation target directory"
|
||||
#~ msgstr "Diretório de destino de sincronização do sistema de arquivos"
|
||||
|
@@ -521,6 +521,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Se exportă către \"%s\" în format \"%s\". Vă rugăm să așteotați..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Titlul caietului de notițe:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Caiete de notițe"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr ""
|
||||
@@ -578,6 +592,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -587,6 +604,10 @@ msgstr "Editați într-un editor extern"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Căutați în toate notițele"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Căutați în toate notițele"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Vizualizați"
|
||||
|
||||
@@ -596,6 +617,9 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Unelte"
|
||||
|
||||
@@ -646,9 +670,21 @@ msgstr "Anulați"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Versiunea curentă este actualizată."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Da"
|
||||
|
||||
@@ -716,13 +752,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr ""
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Aplicați"
|
||||
|
||||
@@ -801,6 +840,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Criptarea este:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Utilizare: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Înapoi"
|
||||
|
||||
@@ -851,36 +894,6 @@ msgstr "Câțiva itemi nu pot fi descriptați."
|
||||
msgid "Set the password"
|
||||
msgstr "Setați parola"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Adăugați ori eliminați etichete"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicați"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copiați"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Schimbați între notiță și sarcină"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Schimbați între notiță și sarcină"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Schimbați între notiță și sarcină"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copiați link-ul Markdown"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Ștergeți"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Ștergeți notițele?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr ""
|
||||
|
||||
@@ -926,6 +939,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1018,6 +1034,9 @@ msgstr ""
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Ștergeți"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Redenumiți"
|
||||
|
||||
@@ -1038,6 +1057,39 @@ msgstr "Resurse: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Adăugați ori eliminați etichete"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplicați"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Copiați"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Schimbați între notiță și sarcină"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Schimbați între notiță și sarcină"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Schimbați între notiță și sarcină"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copiați link-ul Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Ștergeți notițele?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Ștergeți aceste notițe?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Utilizare: %s"
|
||||
@@ -1241,6 +1293,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Editează notiță."
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr ""
|
||||
|
||||
@@ -1252,6 +1308,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualizați automat aplicația"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalul de sincronizare"
|
||||
|
||||
@@ -1336,6 +1399,25 @@ msgstr "Ignoră erorile de certificat TLS"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opțiuni Generale"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Statusul sincronizării"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Caiete de notițe"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Duplicați"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1527,9 +1609,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Website Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Website Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "De șters: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Autentificați-vă cu Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1581,6 +1678,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Atașează imagine"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Atașează imagine"
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -582,6 +582,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Izvažam v \"%s\" kot \"%s\" format. Prosim počakajte..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Naslov beležnice:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Beležnice"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Uvažam v \"%s\" kot \"%s\" format. Prosim počakajte..."
|
||||
@@ -639,6 +653,9 @@ msgstr ""
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr ""
|
||||
|
||||
@@ -648,6 +665,10 @@ msgstr ""
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Išči znotraj vseh zabeležk"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Išči znotraj vseh zabeležk"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Pogled"
|
||||
|
||||
@@ -657,6 +678,10 @@ msgstr ""
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Spremeni izgled urejevalnika"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Fokusiraj vsebino"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Orodja"
|
||||
|
||||
@@ -707,9 +732,21 @@ msgstr "Prekliči"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Sedanja verzija je najnovejša."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Posodobitev je na voljo, jo želite prenesti sedaj?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Da"
|
||||
|
||||
@@ -777,13 +814,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Preveri nastavitve sinhronizacije"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Zabeležke in nastavitve so shranjene v: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Preveri nastavitve sinhronizacije"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
@@ -877,6 +917,10 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Enkripcija je:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Uporaba: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Nazaj"
|
||||
|
||||
@@ -930,37 +974,6 @@ msgstr "Nekateri predmeti ne morejo biti dekriptirani."
|
||||
msgid "Set the password"
|
||||
msgstr "Nastavi geslo"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Dodaj ali odstrani oznake"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopiraj"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Menjaj med zabeležko in seznamom opravil"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Menjaj med zabeležko in seznamom opravil"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Menjaj med zabeležko in seznamom opravil"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Sistem označevanja"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Izbriši"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Izbriši zabeležke?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr ""
|
||||
"Trenutno ni tukaj nobene zabeležke. Ustvarite jo z klikom na \"Nova zabeležka"
|
||||
@@ -1012,6 +1025,9 @@ msgstr ""
|
||||
"Ta zabeležka nima vsebine. Kliknite na \"%s\" da menjate med urejevalnikom "
|
||||
"in urejanje zabeležke."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1106,6 +1122,9 @@ msgstr "Odstranite to oznako iz vseh zabeležk?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Odstranite ta iskalni niz iz stranske vrstice?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Izbriši"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Preimenuj"
|
||||
|
||||
@@ -1126,6 +1145,40 @@ msgstr "Viri: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Prosim izberite, kam želite izvoziti sinhronizacijski status"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Dodaj ali odstrani oznake"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Izhod iz aplikacije."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopiraj"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Menjaj med zabeležko in seznamom opravil"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Menjaj med zabeležko in seznamom opravil"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Menjaj med zabeležko in seznamom opravil"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Sistem označevanja"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Izbriši zabeležke?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Izbriši te zabeležke?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Uporaba: %s"
|
||||
@@ -1342,6 +1395,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Celokupen procent povečave"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Družina urejevalnika besedilnega stila"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Družina urejevalnika besedilnega stila"
|
||||
|
||||
@@ -1356,6 +1413,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Samodejno posodobi aplikacijo"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Časovni interval sinhronizacije"
|
||||
|
||||
@@ -1448,6 +1512,25 @@ msgstr ""
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Neveljavna vrednost: \"%s\". Možne vrednosti so : %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Splošne možnosti"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Status sinhronizacije"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Beležnice"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Izhod iz aplikacije."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1648,10 +1731,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin spletna stran"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin spletna stran"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Za izbris: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Prijavi se z OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Glavno geslo %s"
|
||||
@@ -1703,6 +1801,10 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Nepodprt tip slike: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Pripni fotografijo"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Pripni fotografijo"
|
||||
|
||||
|
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.1.1\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -462,21 +462,20 @@ msgid "Starting synchronisation..."
|
||||
msgstr "Startar synkronisering..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "Laddar ned resurser..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "Avbryter... vänta."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
||||
"[tag] from [note], or to list the notes associated with [tag]. The command "
|
||||
"`tag list` can be used to list all the tags (use -l for long option)."
|
||||
msgstr ""
|
||||
"<tag-command> kan vara \"add\", \"remove\" eller \"list\" för att tilldela "
|
||||
"eller ta bort [tag] från [note], eller för att lista anteckningarna som är "
|
||||
"associerade med [tag]. Kommandot `tag list` kan användas för att lista alla "
|
||||
"taggar."
|
||||
"<tag-command> kan vara \"lägg till\", \"ta bort\" eller \"lisat\" för att "
|
||||
"tilldela eller ta bort [tag] från [note], eller för att lista anteckningarna "
|
||||
"som är associerade med [tag]. Kommandot `tag list` kan användas för att "
|
||||
"lista alla taggar."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Invalid command: \"%s\""
|
||||
@@ -589,6 +588,18 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportera till \"%s\" som \"%s\" format. Vänta..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr "Sidofältet"
|
||||
|
||||
msgid "Note list"
|
||||
msgstr "Anteckningsboken"
|
||||
|
||||
msgid "Note title"
|
||||
msgstr "Rubriken"
|
||||
|
||||
msgid "Note body"
|
||||
msgstr "Texten"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importerar från \"%s\" som \"%s\" format. Vänta..."
|
||||
@@ -636,9 +647,8 @@ msgstr "Klipp ut"
|
||||
msgid "Paste"
|
||||
msgstr "Klistra in"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Select all"
|
||||
msgstr "Välj datum"
|
||||
msgstr "Välj alla"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "Fet"
|
||||
@@ -646,6 +656,9 @@ msgstr "Fet"
|
||||
msgid "Italic"
|
||||
msgstr "Kursiv"
|
||||
|
||||
msgid "Link"
|
||||
msgstr "Länk"
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Infoga datumtid"
|
||||
|
||||
@@ -655,6 +668,9 @@ msgstr "Redigera i extern redigerare"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Sök i alla anteckningarna"
|
||||
|
||||
msgid "Search in current note"
|
||||
msgstr "Sök i aktuell anteckning"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Visa"
|
||||
|
||||
@@ -664,6 +680,9 @@ msgstr "Växla sidofältet"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Växla redigeringslayout"
|
||||
|
||||
msgid "Focus"
|
||||
msgstr "Fokus"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Verktyg"
|
||||
|
||||
@@ -714,9 +733,21 @@ msgstr "Avbryt"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Nuvarande version är uppdaterad."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr "%s (förhandsversion)"
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "En uppdatering är tillgänglig, vill du hämta den nu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "Din version: v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "Ny version: v%s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
@@ -724,7 +755,7 @@ msgid "No"
|
||||
msgstr "Nej"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr ""
|
||||
msgstr "Token har kopierats till urklipp!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr "Web clipper-tjänsten är aktiverad och inställd för automatisk start."
|
||||
@@ -774,28 +805,32 @@ msgstr "Steg 2: Installera tillägget"
|
||||
msgid "Download and install the relevant extension for your browser:"
|
||||
msgstr "Hämta och installera det relevanta tillägget för din webbläsare:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Advanced options"
|
||||
msgstr "Visa avancerade inställningar"
|
||||
msgstr "Avancerade alternativ"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr ""
|
||||
msgstr "Auktoriserings token:"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr ""
|
||||
msgstr "Kopiera token"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Kontrollera synkroniseringskonfigurationen"
|
||||
"Denna auktorisering behövs endast för att tillåta tredjepartsprogram att "
|
||||
"integrera med Joplin."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Anteckningar och inställningar lagras i: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr "Bläddra..."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Kontrollera synkroniseringskonfigurationen"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "Tillämpa"
|
||||
|
||||
@@ -890,6 +925,9 @@ msgstr "Tillstånd"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Kryptering är:"
|
||||
|
||||
msgid "Usage"
|
||||
msgstr "Användning"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Tillbaka"
|
||||
|
||||
@@ -942,36 +980,6 @@ msgstr "Några objekt kan inte dekrypteras."
|
||||
msgid "Set the password"
|
||||
msgstr "Ställ in lösenord"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Lägg till eller ta bort taggar"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplikat"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Kopiera"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Växla mellan antecknings- och att-göra-typ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Växla mellan antecknings- och att-göra-typ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Växla mellan antecknings- och att-göra-typ"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Kopiera Markdown-länk"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Ta bort"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "Ta bort anteckningar?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "Inga anteckningar här. Skapa en genom att klicka på \"Ny anteckning\"."
|
||||
|
||||
@@ -982,13 +990,13 @@ msgstr ""
|
||||
"\"Ny anteckningsbok\"."
|
||||
|
||||
msgid "Location"
|
||||
msgstr ""
|
||||
msgstr "Plats"
|
||||
|
||||
msgid "URL"
|
||||
msgstr ""
|
||||
msgstr "URL"
|
||||
|
||||
msgid "Note properties"
|
||||
msgstr ""
|
||||
msgstr "Anteckningens egenskaper"
|
||||
|
||||
msgid "Open..."
|
||||
msgstr "Öppna..."
|
||||
@@ -1007,7 +1015,7 @@ msgid "Copy Link Address"
|
||||
msgstr "Kopiera länkadress"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
msgstr "Denna bilaga är inte nedladdad eller ännu inte dekrypterad."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1021,6 +1029,10 @@ msgstr ""
|
||||
"Den här anteckningen har inget innehåll. Klicka på \"%s\" för att växla "
|
||||
"redigeraren och redigera anteckningen."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
"Endast en anteckning i taget kan bli utskriven eller exporterad till PDF."
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "stark text"
|
||||
|
||||
@@ -1113,6 +1125,9 @@ msgstr "Ta bort den här taggen från alla anteckningar?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Ta bort den här sökningen från sidofältet?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "Ta bort"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Byt namn"
|
||||
|
||||
@@ -1126,13 +1141,45 @@ msgstr "Anteckningsböcker"
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "Dekrypterar objekt: %d/%d"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "Resurser: %d."
|
||||
msgstr "Hämtar resurser: %d"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Välj vart synkroniseringstillståndet ska exporteras till"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Lägg till eller ta bort taggar"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "Duplikat"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - Kopiera"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Växla mellan antecknings- och att-göra-typ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Växla mellan antecknings- och att-göra-typ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Växla mellan antecknings- och att-göra-typ"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Kopiera Markdown-länk"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Ta bort anteckningar?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Ta bort dessa anteckningar?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "Användning: %s"
|
||||
@@ -1269,7 +1316,7 @@ msgid "updated date"
|
||||
msgstr "uppdaterad datum"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "Skapad datum"
|
||||
msgstr "skapad datum"
|
||||
|
||||
msgid "This note does not have geolocation information."
|
||||
msgstr "Denna anteckning har inte geolokaliseringsinformation."
|
||||
@@ -1338,13 +1385,19 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"Detta tillåter Joplin att köra i bakgrunden. Det är rekommenderat att "
|
||||
"tillåta detta så att anteckningarna synkroniseras löpande. På det sättet "
|
||||
"minskas risken för konflikter."
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr ""
|
||||
msgstr "Starta programmet minimerat"
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Global zoomprocent"
|
||||
|
||||
msgid "Editor font size"
|
||||
msgstr "Redigerarens teckenstorlek"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Redigerarens typsnittsfamilj"
|
||||
|
||||
@@ -1359,6 +1412,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Uppdatera programmet automatiskt"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr "Inkludera även förhandsversionen vid uppdateringar"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr "Se sidan för förhandsversioner för mer information: %s"
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synkroniseringsintervall"
|
||||
|
||||
@@ -1417,6 +1477,9 @@ msgid ""
|
||||
"to it before syncing, otherwise all files will be removed! See the FAQ for "
|
||||
"more details: %s"
|
||||
msgstr ""
|
||||
"OBS! Om du ändrar denna plats så se till att du har en kopia på allt "
|
||||
"innehåll innan du synkroniserar. Annars kommer samtliga filer att raderas. "
|
||||
"Läs FAQ för mer information: %s"
|
||||
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Nextcloud-användarnamn"
|
||||
@@ -1455,9 +1518,25 @@ msgstr "Ignorera TLS-certifikatfel"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ogiltigt inställningsvärde: \"%s\". Möjliga värden är: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Allmänna inställningar"
|
||||
|
||||
msgid "Synchronisation"
|
||||
msgstr "Synkronisering"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr "Utseende"
|
||||
|
||||
msgid "Note"
|
||||
msgstr "Anteckning"
|
||||
|
||||
msgid "Application"
|
||||
msgstr "Avslutar programmet"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
msgstr "Taggen \"%s\" finns redan. Välj ett annat namn."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Joplin-exporteringsfil"
|
||||
@@ -1471,9 +1550,8 @@ msgstr "Joplin-exporteringskatalog"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote-exporteringsfil"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin-exporteringskatalog"
|
||||
msgstr "Joplin-exportkatalog"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Katalog"
|
||||
@@ -1550,10 +1628,10 @@ msgid "On %s: %s"
|
||||
msgstr "På %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "Tillåtelse att använda kameran"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
msgstr "Du måste ge tillåtelse att använda kameran."
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr ""
|
||||
@@ -1585,9 +1663,8 @@ msgstr "Flytta %d anteckningar till anteckningsboken \"%s\"?"
|
||||
msgid "Press to set the decryption password."
|
||||
msgstr "Tryck för att ställa in dekrypteringslösenordet."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Clear alarm"
|
||||
msgstr "Sätt alarm"
|
||||
msgstr "Ta bort alarm"
|
||||
|
||||
msgid "Save alarm"
|
||||
msgstr "Spara alarm"
|
||||
@@ -1601,22 +1678,21 @@ msgstr "Bekräfta"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Avbryt synkronisering"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Checking... Please wait."
|
||||
msgstr "Avbryter... vänta."
|
||||
msgstr "Kontrollerar... vänta."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Success! Synchronisation configuration appears to be correct."
|
||||
msgstr "Kontrollera synkroniseringskonfigurationen"
|
||||
msgstr "Lyckades! Synkroniseringsinställningarna verkar vara korrekta."
|
||||
|
||||
msgid ""
|
||||
"Error. Please check that URL, username, password, etc. are correct and that "
|
||||
"the sync target is accessible. The reported error was:"
|
||||
msgstr ""
|
||||
"Fel. Verifiera att URL, användarnamn, lösenord etc. är korrekta och att "
|
||||
"destinationen är tillgänglig. Rapporterat fel var:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "The application has been authorised!"
|
||||
msgstr "Programmet har godkänts."
|
||||
msgstr "Programmet har blivit godkänt!"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -1626,10 +1702,15 @@ msgid ""
|
||||
"\n"
|
||||
"Please try again."
|
||||
msgstr ""
|
||||
"Kunde inte auktorisera programmet:\n"
|
||||
"\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"Försök igen."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Decrypted items: %s / %s"
|
||||
msgstr "Dekrypterar objekt: %d/%d"
|
||||
msgstr "Antal dekrypterade objekt: %s / %s"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr "Nya taggar:"
|
||||
@@ -1664,9 +1745,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin-webbplats"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Databas v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS aktiverat: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Logga in med Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "Ange kod här"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Huvudnyckel %s"
|
||||
@@ -1719,6 +1815,9 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Bildstorlek som inte stöds: %s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "Ta ett foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Bifoga foto"
|
||||
|
||||
@@ -1744,7 +1843,7 @@ msgid "View on map"
|
||||
msgstr "Visa på karta"
|
||||
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
msgstr "Gå till källans URL"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Ta bort anteckningsbok"
|
||||
|
1792
CliClient/locales/tr_TR.po
Normal file
1792
CliClient/locales/tr_TR.po
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -548,6 +548,20 @@ msgstr ""
|
||||
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "匯出到 \"%s\" 為 \"%s\" 格式。請稍候..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "記事本標題:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "記事本"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "從 \"%s\" 匯入為 \"%s\" 格式。請稍候..."
|
||||
@@ -605,6 +619,9 @@ msgstr "粗體"
|
||||
msgid "Italic"
|
||||
msgstr "斜體"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "插入日期時間"
|
||||
|
||||
@@ -614,6 +631,10 @@ msgstr "使用外部編輯器編輯"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "在所有記事中搜尋"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "在所有記事中搜尋"
|
||||
|
||||
msgid "View"
|
||||
msgstr "檢視"
|
||||
|
||||
@@ -623,6 +644,10 @@ msgstr "顯示 / 隱藏側邊欄"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "切換編輯器佈局"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "游標置於內文"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "工具"
|
||||
|
||||
@@ -673,9 +698,21 @@ msgstr "取消"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "此版本是最新的。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "有可用的更新,您需要立即下載嗎?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "是"
|
||||
|
||||
@@ -745,13 +782,16 @@ msgid ""
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "檢測同步設置"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
msgstr "所有記事和設置均儲存於: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "檢測同步設置"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr "套用"
|
||||
|
||||
@@ -839,6 +879,10 @@ msgstr "狀態"
|
||||
msgid "Encryption is:"
|
||||
msgstr "加密:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "使用資訊: %s"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "返回"
|
||||
|
||||
@@ -889,36 +933,6 @@ msgstr "有些項目不能解密。"
|
||||
msgid "Set the password"
|
||||
msgstr "設置密碼"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "新增或移除標籤"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "新增複本"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - 複本"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "切換到記事 / 待辦事項"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "切換到記事 / 待辦事項"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "切換到記事 / 待辦事項"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "複製 Markdown 連結"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "刪除"
|
||||
|
||||
msgid "Delete notes?"
|
||||
msgstr "刪除此記事?"
|
||||
|
||||
msgid "No notes in here. Create one by clicking on \"New note\"."
|
||||
msgstr "當前沒有任何筆記。通過按一下 \"新增筆記\" 去建立。"
|
||||
|
||||
@@ -964,6 +978,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr "此筆記沒有內容。按一下 \"%s\" 切換到編輯模式並編輯筆記。"
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "重要文字 <strong>"
|
||||
|
||||
@@ -1056,6 +1073,9 @@ msgstr "是否從所有記事中刪除此標籤?"
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "是否從側邊欄中刪除此搜索?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "刪除"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "重新命名"
|
||||
|
||||
@@ -1076,6 +1096,38 @@ msgstr "資源: %d。"
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "請選擇將同步狀態導出到的位置"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "新增或移除標籤"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "新增複本"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s - 複本"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "切換到記事 / 待辦事項"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "切換到記事 / 待辦事項"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "切換到記事 / 待辦事項"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "複製 Markdown 連結"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "刪除此記事?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "刪除這些記事?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
msgstr "使用資訊: %s"
|
||||
@@ -1284,6 +1336,10 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "整體縮放比例 (%)"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "編輯器字型系列"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "編輯器字型系列"
|
||||
|
||||
@@ -1297,6 +1353,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "自動更新應用程式"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "同步時間間隔"
|
||||
|
||||
@@ -1388,6 +1451,25 @@ msgstr "忽略 TLS 證書錯誤"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "不正確選項值: \"%s\"。可能的值為: %s。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "一般選項"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "顯示同步狀態"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "記事本"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "離開本程式。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
@@ -1586,9 +1668,24 @@ msgstr "- 位置: 允許將地理位置資訊附加到筆記。"
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin 官方網站"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin 官方網站"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "標示刪除: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "以 Dropbox 登錄"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "主密碼 %s"
|
||||
@@ -1640,6 +1737,10 @@ msgstr "Joplin 移動應用程式暫時不支援此類型的連結: %s"
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "不支援的圖像類型: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "附加相片"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "附加相片"
|
||||
|
||||
|
131
CliClient/package-lock.json
generated
131
CliClient/package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "joplin",
|
||||
"version": "1.0.117",
|
||||
"version": "1.0.123",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -29,16 +29,16 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"acorn": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz",
|
||||
"integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg=="
|
||||
"version": "6.0.6",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz",
|
||||
"integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"acorn-walk": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.0.1.tgz",
|
||||
"integrity": "sha512-PqVQ8c6a3kyqdsUZlC7nljp3FFuxipBRHKu+7C1h8QygBFlzTaDX5HD383jej3Peed+1aDG8HwkfB1Z1HMNPkw=="
|
||||
"version": "6.1.1",
|
||||
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
|
||||
"integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw=="
|
||||
},
|
||||
"ajv": {
|
||||
"version": "5.5.2",
|
||||
@@ -488,12 +488,12 @@
|
||||
"integrity": "sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo="
|
||||
},
|
||||
"data-urls": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz",
|
||||
"integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==",
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
|
||||
"integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
|
||||
"requires": {
|
||||
"abab": "^2.0.0",
|
||||
"whatwg-mimetype": "^2.1.0",
|
||||
"whatwg-mimetype": "^2.2.0",
|
||||
"whatwg-url": "^7.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -555,6 +555,11 @@
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
|
||||
},
|
||||
"diacritics": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
|
||||
"integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E="
|
||||
},
|
||||
"domexception": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
|
||||
@@ -1422,9 +1427,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"joplin-turndown": {
|
||||
"version": "4.0.9",
|
||||
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.9.tgz",
|
||||
"integrity": "sha512-8MOxX4t5Ai22muHhXPMGNoKc/AB7gSo0eUvNh6dyd6b3vcSiMIRZE8UHpMjS9ruJQ+8e+8TtJXc0nfbexeHwrA==",
|
||||
"version": "4.0.11",
|
||||
"resolved": "https://registry.npmjs.org/joplin-turndown/-/joplin-turndown-4.0.11.tgz",
|
||||
"integrity": "sha512-2oiwWX0nKYi1NVcaprSsrXQkYdGoRtPWFmnXdWQnQW44jlgjFV38B4VrgliwX5ZMq7cbx6A9IBwfXcBL2YV2NA==",
|
||||
"requires": {
|
||||
"jsdom": "^11.9.0"
|
||||
}
|
||||
@@ -1483,6 +1488,17 @@
|
||||
"xml-name-validator": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ajv": {
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz",
|
||||
"integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
|
||||
"requires": {
|
||||
"fast-deep-equal": "^2.0.1",
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
"json-schema-traverse": "^0.4.1",
|
||||
"uri-js": "^4.2.2"
|
||||
}
|
||||
},
|
||||
"aws4": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
|
||||
@@ -1501,46 +1517,46 @@
|
||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
|
||||
},
|
||||
"fast-deep-equal": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
|
||||
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
|
||||
},
|
||||
"form-data": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
|
||||
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
|
||||
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "1.0.6",
|
||||
"combined-stream": "^1.0.6",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"dependencies": {
|
||||
"combined-stream": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
|
||||
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
|
||||
"requires": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
|
||||
"integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
|
||||
"version": "5.1.3",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
|
||||
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
|
||||
"requires": {
|
||||
"ajv": "^5.3.0",
|
||||
"ajv": "^6.5.5",
|
||||
"har-schema": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"json-schema-traverse": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.36.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
|
||||
"integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
|
||||
"version": "1.37.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
|
||||
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.20",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
|
||||
"integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
|
||||
"version": "2.1.21",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
|
||||
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
|
||||
"requires": {
|
||||
"mime-db": "~1.36.0"
|
||||
"mime-db": "~1.37.0"
|
||||
}
|
||||
},
|
||||
"oauth-sign": {
|
||||
@@ -2788,7 +2804,7 @@
|
||||
"requires": {
|
||||
"chalk": "^2.1.0",
|
||||
"emphasize": "^1.5.0",
|
||||
"node-emoji": "git+https://github.com/laurent22/node-emoji.git#9fa01eac463e94dde1316ef8c53089eeef4973b5",
|
||||
"node-emoji": "git+https://github.com/laurent22/node-emoji.git",
|
||||
"slice-ansi": "^1.0.0",
|
||||
"string-width": "^2.1.1",
|
||||
"terminal-kit": "^1.13.11",
|
||||
@@ -2910,6 +2926,21 @@
|
||||
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
|
||||
"integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
|
||||
},
|
||||
"uri-js": {
|
||||
"version": "4.2.2",
|
||||
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
|
||||
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
|
||||
"requires": {
|
||||
"punycode": "^2.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"url-parse": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz",
|
||||
@@ -2958,17 +2989,17 @@
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
|
||||
},
|
||||
"whatwg-encoding": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz",
|
||||
"integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==",
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
|
||||
"integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
|
||||
"requires": {
|
||||
"iconv-lite": "0.4.23"
|
||||
"iconv-lite": "0.4.24"
|
||||
},
|
||||
"dependencies": {
|
||||
"iconv-lite": {
|
||||
"version": "0.4.23",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
|
||||
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
@@ -2976,9 +3007,9 @@
|
||||
}
|
||||
},
|
||||
"whatwg-mimetype": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz",
|
||||
"integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw=="
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
|
||||
"integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
|
||||
},
|
||||
"whatwg-url": {
|
||||
"version": "6.5.0",
|
||||
|
@@ -15,11 +15,12 @@
|
||||
"years": [
|
||||
2016,
|
||||
2017,
|
||||
2018
|
||||
2018,
|
||||
2019
|
||||
],
|
||||
"owner": "Laurent Cozic"
|
||||
},
|
||||
"version": "1.0.117",
|
||||
"version": "1.0.123",
|
||||
"bin": {
|
||||
"joplin": "./main.js"
|
||||
},
|
||||
@@ -31,6 +32,7 @@
|
||||
"async-mutex": "^0.1.3",
|
||||
"base-64": "^0.1.0",
|
||||
"compare-version": "^0.1.2",
|
||||
"diacritics": "^1.3.0",
|
||||
"es6-promise-pool": "^2.5.0",
|
||||
"follow-redirects": "^1.2.4",
|
||||
"form-data": "^2.1.4",
|
||||
@@ -39,7 +41,7 @@
|
||||
"html-minifier": "^3.5.15",
|
||||
"image-data-uri": "^2.0.0",
|
||||
"image-type": "^3.0.0",
|
||||
"joplin-turndown": "^4.0.9",
|
||||
"joplin-turndown": "^4.0.11",
|
||||
"joplin-turndown-plugin-gfm": "^1.0.7",
|
||||
"jssha": "^2.3.0",
|
||||
"levenshtein": "^1.0.5",
|
||||
|
@@ -22,18 +22,22 @@ trap finish EXIT
|
||||
|
||||
cd "$ROOT_DIR"
|
||||
npm test tests-build/ArrayUtils.js
|
||||
npm test tests-build/encryption.js
|
||||
npm test tests-build/EnexToMd.js
|
||||
npm test tests-build/HtmlToMd.js
|
||||
npm test tests-build/markdownUtils.js
|
||||
npm test tests-build/models_BaseItem.js
|
||||
npm test tests-build/models_Folder.js
|
||||
npm test tests-build/models_ItemChange.js
|
||||
npm test tests-build/models_Note.js
|
||||
npm test tests-build/models_Tag.js
|
||||
npm test tests-build/models_Resource.js
|
||||
npm test tests-build/models_Setting.js
|
||||
npm test tests-build/models_Tag.js
|
||||
npm test tests-build/pathUtils.js
|
||||
npm test tests-build/services_InteropService.js
|
||||
npm test tests-build/services_ResourceService.js
|
||||
npm test tests-build/urlUtils.js
|
||||
npm test tests-build/encryption.js
|
||||
npm test tests-build/services_rest_Api.js
|
||||
npm test tests-build/synchronizer.js
|
||||
npm test tests-build/services_SearchEngine.js
|
||||
npm test tests-build/StringUtils.js
|
||||
npm test tests-build/synchronizer.js
|
||||
npm test tests-build/urlUtils.js
|
@@ -37,7 +37,7 @@ describe('HtmlToMd', function() {
|
||||
const htmlPath = basePath + '/' + htmlFilename;
|
||||
const mdPath = basePath + '/' + filename(htmlFilename) + '.md';
|
||||
|
||||
// if (htmlFilename !== 'anchor_with_url_with_spaces.html') continue;
|
||||
// if (htmlFilename !== 'picture.html') continue;
|
||||
|
||||
const html = await shim.fsDriver().readFile(htmlPath);
|
||||
let expectedMd = await shim.fsDriver().readFile(mdPath);
|
||||
|
45
CliClient/tests/StringUtils.js
Normal file
45
CliClient/tests/StringUtils.js
Normal file
@@ -0,0 +1,45 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const StringUtils = require('lib/string-utils');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
});
|
||||
|
||||
describe('StringUtils', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
done();
|
||||
});
|
||||
|
||||
it('should surround keywords with strings', async (done) => {
|
||||
const testCases = [
|
||||
[[], 'test', 'a', 'b', 'test'],
|
||||
[['test'], 'test', 'a', 'b', 'atestb'],
|
||||
[['test'], 'Test', 'a', 'b', 'aTestb'],
|
||||
[['te[]st'], 'Te[]st', 'a', 'b', 'aTe[]stb'],
|
||||
// [['test1', 'test2'], 'bla test1 blabla test1 bla test2 not this one - test22', 'a', 'b', 'bla atest1b blabla atest1b bla atest2b not this one - test22'],
|
||||
[['test1', 'test2'], 'bla test1 test1 bla test2', '<span class="highlighted-keyword">', '</span>', 'bla <span class="highlighted-keyword">test1</span> <span class="highlighted-keyword">test1</span> bla <span class="highlighted-keyword">test2</span>'],
|
||||
// [[{ type:'regex', value:'test.*?'}], 'bla test1 test1 bla test2 test tttest', 'a', 'b', 'bla atest1b atest1b bla atest2b atestb tttest'],
|
||||
];
|
||||
|
||||
for (let i = 0; i < testCases.length; i++) {
|
||||
const t = testCases[i];
|
||||
|
||||
const keywords = t[0];
|
||||
const input = t[1];
|
||||
const prefix = t[2];
|
||||
const suffix = t[3];
|
||||
const expected = t[4];
|
||||
|
||||
const actual = StringUtils.surroundKeywords(keywords, input, prefix, suffix);
|
||||
|
||||
expect(actual).toBe(expected, 'Test case ' + i);
|
||||
}
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
47
CliClient/tests/html_to_md/picture.html
Normal file
47
CliClient/tests/html_to_md/picture.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<figure itemprop="associatedMedia image" itemscope="" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="75583fcfe2eb74f1e89ea320355ff4156f4ade7b" id="img-1">
|
||||
<meta itemprop="representativeOfPage" content="true">
|
||||
<meta itemprop="url" content="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=700&quality=85&auto=format&fit=max&s=2a6a7ba9738c6a6a79eab39ba46c34cd">
|
||||
<meta itemprop="width" content="3904">
|
||||
<meta itemprop="height" content="2342">
|
||||
<a href="#img-1" data-link-name="Launch Article Lightbox" data-is-ajax="">
|
||||
<div>
|
||||
<picture>
|
||||
<!--[if IE 9]><video style="display: none;"><![endif]-->
|
||||
<source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&quality=45&auto=format&fit=max&dpr=2&s=bacff59339e5ba117f957c24218ef76b 1240w">
|
||||
<source media="(min-width: 980px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&quality=85&auto=format&fit=max&s=f1427ce6689688d3d6e0087fe9cb5c18 620w">
|
||||
<source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="700px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=700&quality=45&auto=format&fit=max&dpr=2&s=70accd3c6e7d2c36f5ccc7321eab097e 1400w">
|
||||
<source media="(min-width: 740px)" sizes="700px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=700&quality=85&auto=format&fit=max&s=2a6a7ba9738c6a6a79eab39ba46c34cd 700w">
|
||||
<source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&quality=45&auto=format&fit=max&dpr=2&s=bacff59339e5ba117f957c24218ef76b 1240w">
|
||||
<source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=620&quality=85&auto=format&fit=max&s=f1427ce6689688d3d6e0087fe9cb5c18 620w">
|
||||
<source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="645px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=645&quality=45&auto=format&fit=max&dpr=2&s=6751fcff1b880acc45ed5aab6511a2ca 1290w">
|
||||
<source media="(min-width: 480px)" sizes="645px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=645&quality=85&auto=format&fit=max&s=d18702564383ce5d613d22b96ec6d726 645w">
|
||||
<source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="465px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=465&quality=45&auto=format&fit=max&dpr=2&s=a7b87fb26b9813d197f3c236a5282ca4 930w">
|
||||
<source media="(min-width: 0px)" sizes="465px" srcset="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=465&quality=85&auto=format&fit=max&s=821ae9e950ae92371b40a35e98a31116 465w">
|
||||
<!--[if IE 9]></video><![endif]-->
|
||||
<img itemprop="contentUrl" alt="A blood moon" src="https://i.guim.co.uk/img/media/75583fcfe2eb74f1e89ea320355ff4156f4ade7b/0_49_3904_2342/master/3904.jpg?width=300&quality=85&auto=format&fit=max&s=1e9b643d2c109a1e271f50046eac1324">
|
||||
</picture>
|
||||
</div>
|
||||
<span>
|
||||
<svg width="22" height="22" viewBox="0 0 22 22">
|
||||
<path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path>
|
||||
</svg>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<label for="show-caption">
|
||||
<span>
|
||||
<svg width="6" height="14" viewBox="0 0 6 14">
|
||||
<path d="M4.6 12l-.4 1.4c-.7.2-1.9.6-3 .6-.7 0-1.2-.2-1.2-.9 0-.2 0-.3.1-.5l2-6.7H.7l.4-1.5 4.2-.6h.2L3 12h1.6zm-.3-9.2c-.9 0-1.4-.5-1.4-1.3C2.9.5 3.7 0 4.6 0 5.4 0 6 .5 6 1.3c0 1-.8 1.5-1.7 1.5z"></path>
|
||||
</svg>
|
||||
</span>
|
||||
</label>
|
||||
<figcaption itemprop="description">
|
||||
<span>
|
||||
<svg width="11" height="10" viewBox="0 0 11 10">
|
||||
<path fill-rule="evenodd" d="M5.5 0L11 10H0z"></path>
|
||||
</svg>
|
||||
</span>
|
||||
A blood moon last occurred in July 2018, though clouds largely obscured the celestial phenomenon in the UK.
|
||||
Photograph: JM F Almeida/Getty Images
|
||||
</figcaption>
|
||||
</figure>
|
3
CliClient/tests/html_to_md/picture.md
Normal file
3
CliClient/tests/html_to_md/picture.md
Normal file
@@ -0,0 +1,3 @@
|
||||
[](#img-1)
|
||||
|
||||
A blood moon last occurred in July 2018, though clouds largely obscured the celestial phenomenon in the UK. Photograph: JM F Almeida/Getty Images
|
53
CliClient/tests/models_ItemChange.js
Normal file
53
CliClient/tests/models_ItemChange.js
Normal file
@@ -0,0 +1,53 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const ResourceService = require('lib/services/ResourceService');
|
||||
const ItemChangeUtils = require('lib/services/ItemChangeUtils');
|
||||
const Note = require('lib/models/Note');
|
||||
const Setting = require('lib/models/Setting');
|
||||
const ItemChange = require('lib/models/ItemChange');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
});
|
||||
|
||||
let searchEngine = null;
|
||||
|
||||
describe('models_ItemChange', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
await setupDatabaseAndSynchronizer(1);
|
||||
searchEngine = new SearchEngine();
|
||||
searchEngine.setDb(db());
|
||||
done();
|
||||
});
|
||||
|
||||
it('should delete old changes that have been processed', asyncTest(async () => {
|
||||
const n1 = await Note.save({ title: "abcd efgh" }); // 3
|
||||
|
||||
await ItemChange.waitForAllSaved();
|
||||
|
||||
expect(await ItemChange.lastChangeId()).toBe(1);
|
||||
|
||||
const resourceService = new ResourceService();
|
||||
|
||||
await searchEngine.syncTables();
|
||||
|
||||
// If we run this now, it should not delete any change because
|
||||
// the resource service has not yet processed the change
|
||||
await ItemChangeUtils.deleteProcessedChanges();
|
||||
|
||||
expect(await ItemChange.lastChangeId()).toBe(1);
|
||||
|
||||
await resourceService.indexNoteResources();
|
||||
|
||||
// Now that the resource service has processed the change,
|
||||
// the change can be deleted.
|
||||
await ItemChangeUtils.deleteProcessedChanges();
|
||||
|
||||
expect(await ItemChange.lastChangeId()).toBe(0);
|
||||
}));
|
||||
|
||||
});
|
@@ -5,6 +5,7 @@ const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const ArrayUtils = require('lib/ArrayUtils.js');
|
||||
const { shim } = require('lib/shim');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
@@ -35,13 +36,36 @@ describe('models_Note', function() {
|
||||
expect(items[0].type_).toBe(BaseModel.TYPE_NOTE);
|
||||
expect(items[1].type_).toBe(BaseModel.TYPE_RESOURCE);
|
||||
|
||||
const resource = items[1];
|
||||
note2.body += '<img alt="bla" src=":/' + resource.id + '"/>';
|
||||
note2.body += '<img src=\':/' + resource.id + '\' />';
|
||||
const resource2 = await shim.createResourceFromPath(__dirname + '/../tests/support/photo.jpg');
|
||||
const resource3 = await shim.createResourceFromPath(__dirname + '/../tests/support/photo.jpg');
|
||||
note2.body += '<img alt="bla" src=":/' + resource2.id + '"/>';
|
||||
note2.body += '<img src=\':/' + resource3.id + '\' />';
|
||||
items = await Note.linkedItems(note2.body);
|
||||
expect(items.length).toBe(4);
|
||||
}));
|
||||
|
||||
it('should find linked items', asyncTest(async () => {
|
||||
const testCases = [
|
||||
['[](:/06894e83b8f84d3d8cbe0f1587f9e226)', ['06894e83b8f84d3d8cbe0f1587f9e226']],
|
||||
['[](:/06894e83b8f84d3d8cbe0f1587f9e226) [](:/06894e83b8f84d3d8cbe0f1587f9e226)', ['06894e83b8f84d3d8cbe0f1587f9e226']],
|
||||
['[](:/06894e83b8f84d3d8cbe0f1587f9e226) [](:/06894e83b8f84d3d8cbe0f1587f9e227)', ['06894e83b8f84d3d8cbe0f1587f9e226', '06894e83b8f84d3d8cbe0f1587f9e227']],
|
||||
['[](:/06894e83b8f84d3d8cbe0f1587f9e226 "some title")', ['06894e83b8f84d3d8cbe0f1587f9e226']],
|
||||
];
|
||||
|
||||
for (let i = 0; i < testCases.length; i++) {
|
||||
const t = testCases[i];
|
||||
|
||||
const input = t[0];
|
||||
const expected = t[1];
|
||||
const actual = Note.linkedItemIds(input);
|
||||
const contentEquals = ArrayUtils.contentEquals(actual, expected);
|
||||
|
||||
// console.info(contentEquals, input, expected, actual);
|
||||
|
||||
expect(contentEquals).toBe(true);
|
||||
}
|
||||
}));
|
||||
|
||||
it('should change the type of notes', asyncTest(async () => {
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
|
@@ -4,6 +4,7 @@ const { time } = require('lib/time-utils.js');
|
||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const NoteTag = require('lib/models/NoteTag.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const { shim } = require('lib/shim');
|
||||
@@ -42,4 +43,18 @@ describe('models_Tag', function() {
|
||||
expect(hasThrown).toBe(true);
|
||||
}));
|
||||
|
||||
it('should not return tags without notes', asyncTest(async () => {
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
await Tag.setNoteTagsByTitles(note1.id, ['un']);
|
||||
|
||||
let tags = await Tag.allWithNotes();
|
||||
expect(tags.length).toBe(1);
|
||||
|
||||
await Note.delete(note1.id);
|
||||
|
||||
tags = await Tag.allWithNotes();
|
||||
expect(tags.length).toBe(0);
|
||||
}));
|
||||
|
||||
});
|
@@ -1,6 +1,6 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { friendlySafeFilename } = require('lib/path-utils.js');
|
||||
const { extractExecutablePath, quotePath, unquotePath, friendlySafeFilename } = require('lib/path-utils.js');
|
||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
@@ -21,6 +21,7 @@ describe('pathUtils', function() {
|
||||
['con', '___'],
|
||||
['no space at the end ', 'no space at the end'],
|
||||
['nor dots...', 'nor dots'],
|
||||
[' no space before either', 'no space before either'],
|
||||
['thatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylong', 'thatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylongthatsreallylong'],
|
||||
];
|
||||
|
||||
@@ -35,4 +36,41 @@ describe('pathUtils', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
it('should quote and unquote paths', async (done) => {
|
||||
const testCases = [
|
||||
['', ''],
|
||||
['/my/path', '/my/path'],
|
||||
['/my/path with spaces', '"/my/path with spaces"'],
|
||||
['/my/weird"path', '"/my/weird\\"path"'],
|
||||
['c:\\Windows\\test.dll', 'c:\\Windows\\test.dll'],
|
||||
['c:\\Windows\\test test.dll', '"c:\\Windows\\test test.dll"'],
|
||||
];
|
||||
|
||||
for (let i = 0; i < testCases.length; i++) {
|
||||
const t = testCases[i];
|
||||
expect(quotePath(t[0])).toBe(t[1]);
|
||||
expect(unquotePath(quotePath(t[0]))).toBe(t[0]);
|
||||
}
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should extract executable path from command', async (done) => {
|
||||
const testCases = [
|
||||
['', ''],
|
||||
['/my/cmd -some -args', '/my/cmd'],
|
||||
['"/my/cmd" -some -args', '"/my/cmd"'],
|
||||
['"/my/cmd"', '"/my/cmd"'],
|
||||
['"/my/cmd and space" -some -flags', '"/my/cmd and space"'],
|
||||
['"" -some -flags', '""'],
|
||||
];
|
||||
|
||||
for (let i = 0; i < testCases.length; i++) {
|
||||
const t = testCases[i];
|
||||
expect(extractExecutablePath(t[0])).toBe(t[1]);
|
||||
}
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
@@ -8,6 +8,7 @@ const Note = require('lib/models/Note.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const NoteTag = require('lib/models/NoteTag.js');
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const ItemChange = require('lib/models/ItemChange.js');
|
||||
const NoteResource = require('lib/models/NoteResource.js');
|
||||
const ResourceService = require('lib/services/ResourceService.js');
|
||||
const fs = require('fs-extra');
|
||||
@@ -124,4 +125,25 @@ describe('services_ResourceService', function() {
|
||||
expect(!!(await Resource.load(resource1.id))).toBe(true);
|
||||
}));
|
||||
|
||||
it('should not process twice the same change', asyncTest(async () => {
|
||||
const service = new ResourceService();
|
||||
|
||||
let folder1 = await Folder.save({ title: "folder1" });
|
||||
let note1 = await Note.save({ title: 'ma note', parent_id: folder1.id });
|
||||
note1 = await shim.attachFileToNote(note1, __dirname + '/../tests/support/photo.jpg');
|
||||
let resource1 = (await Resource.all())[0];
|
||||
|
||||
await service.indexNoteResources();
|
||||
|
||||
const before = (await NoteResource.all())[0];
|
||||
|
||||
await time.sleep(0.1);
|
||||
|
||||
await service.indexNoteResources();
|
||||
|
||||
const after = (await NoteResource.all())[0];
|
||||
|
||||
expect(before.last_seen_time).toBe(after.last_seen_time);
|
||||
}));
|
||||
|
||||
});
|
283
CliClient/tests/services_SearchEngine.js
Normal file
283
CliClient/tests/services_SearchEngine.js
Normal file
@@ -0,0 +1,283 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const Note = require('lib/models/Note');
|
||||
const ItemChange = require('lib/models/ItemChange');
|
||||
const Setting = require('lib/models/Setting');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
});
|
||||
|
||||
let engine = null;
|
||||
|
||||
describe('services_SearchEngine', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
await setupDatabaseAndSynchronizer(1);
|
||||
await switchClient(1);
|
||||
|
||||
engine = new SearchEngine();
|
||||
engine.setDb(db());
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should keep the content and FTS table in sync', asyncTest(async () => {
|
||||
let rows, n1, n2, n3;
|
||||
|
||||
n1 = await Note.save({ title: "a" });
|
||||
n2 = await Note.save({ title: "b" });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('a');
|
||||
expect(rows.length).toBe(1);
|
||||
expect(rows[0].title).toBe('a');
|
||||
|
||||
await Note.delete(n1.id);
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('a');
|
||||
expect(rows.length).toBe(0);
|
||||
rows = await engine.search('b');
|
||||
expect(rows[0].title).toBe('b');
|
||||
|
||||
await Note.save({ id: n2.id, title: 'c' });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('b');
|
||||
expect(rows.length).toBe(0);
|
||||
rows = await engine.search('c');
|
||||
expect(rows[0].title).toBe('c');
|
||||
|
||||
await Note.save({ id: n2.id, encryption_applied: 1 });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('c');
|
||||
expect(rows.length).toBe(0);
|
||||
|
||||
await Note.save({ id: n2.id, encryption_applied: 0 });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('c');
|
||||
expect(rows.length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should, after initial indexing, save the last change ID', asyncTest(async () => {
|
||||
const n1 = await Note.save({ title: "abcd efgh" }); // 3
|
||||
const n2 = await Note.save({ title: "abcd aaaaa abcd abcd" }); // 1
|
||||
|
||||
expect(Setting.value('searchEngine.initialIndexingDone')).toBe(false);
|
||||
|
||||
await ItemChange.waitForAllSaved();
|
||||
const lastChangeId = await ItemChange.lastChangeId();
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect(Setting.value('searchEngine.lastProcessedChangeId')).toBe(lastChangeId);
|
||||
expect(Setting.value('searchEngine.initialIndexingDone')).toBe(true);
|
||||
}));
|
||||
|
||||
|
||||
it('should order search results by relevance (1)', asyncTest(async () => {
|
||||
const n1 = await Note.save({ title: "abcd efgh" }); // 3
|
||||
const n2 = await Note.save({ title: "abcd aaaaa abcd abcd" }); // 1
|
||||
const n3 = await Note.save({ title: "abcd aaaaa bbbb eeee abcd" }); // 2
|
||||
|
||||
await engine.syncTables();
|
||||
const rows = await engine.search('abcd');
|
||||
|
||||
expect(rows[0].id).toBe(n2.id);
|
||||
expect(rows[1].id).toBe(n3.id);
|
||||
expect(rows[2].id).toBe(n1.id);
|
||||
}));
|
||||
|
||||
it('should order search results by relevance (2)', asyncTest(async () => {
|
||||
// 1
|
||||
const n1 = await Note.save({ title: "abcd efgh", body: "XX abcd XX efgh" });
|
||||
// 4
|
||||
const n2 = await Note.save({ title: "abcd aaaaa bbbb eeee efgh" });
|
||||
// 3
|
||||
const n3 = await Note.save({ title: "abcd aaaaa efgh" });
|
||||
// 2
|
||||
const n4 = await Note.save({ title: "blablablabla blabla bla abcd X efgh" });
|
||||
// 5
|
||||
const n5 = await Note.save({ title: "occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh" });
|
||||
|
||||
await engine.syncTables();
|
||||
const rows = await engine.search('abcd efgh');
|
||||
|
||||
expect(rows[0].id).toBe(n1.id);
|
||||
expect(rows[1].id).toBe(n4.id);
|
||||
expect(rows[2].id).toBe(n3.id);
|
||||
expect(rows[3].id).toBe(n2.id);
|
||||
expect(rows[4].id).toBe(n5.id);
|
||||
}));
|
||||
|
||||
it('should supports various query types', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const n1 = await Note.save({ title: "abcd efgh ijkl", body: "aaaa bbbb" });
|
||||
const n2 = await Note.save({ title: "iiii efgh bbbb", body: "aaaa bbbb" });
|
||||
const n3 = await Note.save({ title: "Агентство Рейтер" });
|
||||
const n4 = await Note.save({ title: "Dog" });
|
||||
const n5 = await Note.save({ title: "СООБЩИЛО" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
rows = await engine.search('abcd ijkl');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('"abcd ijkl"');
|
||||
expect(rows.length).toBe(0);
|
||||
|
||||
rows = await engine.search('"abcd efgh"');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('title:abcd');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('title:efgh');
|
||||
expect(rows.length).toBe(2);
|
||||
|
||||
rows = await engine.search('body:abcd');
|
||||
expect(rows.length).toBe(0);
|
||||
|
||||
rows = await engine.search('body:bbbb');
|
||||
expect(rows.length).toBe(2);
|
||||
|
||||
rows = await engine.search('body:bbbb iiii');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('Рейтер');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('рейтер');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('Dog');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('dog');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('сообщило');
|
||||
expect(rows.length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with or without accents', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "père noël" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('père')).length).toBe(1);
|
||||
expect((await engine.search('pere')).length).toBe(1);
|
||||
expect((await engine.search('noe*')).length).toBe(1);
|
||||
expect((await engine.search('noë*')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with Chinese characters', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "我是法国人" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('我')).length).toBe(1);
|
||||
expect((await engine.search('法国人')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with Japanese characters', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "私は日本語を話すことができません" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('日本')).length).toBe(1);
|
||||
expect((await engine.search('できません')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with Korean characters', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "이것은 한국말이다" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('이것은')).length).toBe(1);
|
||||
expect((await engine.search('말')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should parse normal query strings', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const testCases = [
|
||||
['abcd efgh', { _: ['abcd', 'efgh'] }],
|
||||
['abcd efgh', { _: ['abcd', 'efgh'] }],
|
||||
['title:abcd efgh', { _: ['efgh'], title: ['abcd'] }],
|
||||
['title:abcd', { title: ['abcd'] }],
|
||||
['"abcd efgh"', { _: ['abcd efgh'] }],
|
||||
];
|
||||
|
||||
for (let i = 0; i < testCases.length; i++) {
|
||||
const t = testCases[i];
|
||||
const input = t[0];
|
||||
const expected = t[1];
|
||||
const actual = engine.parseQuery(input);
|
||||
|
||||
const _Values = actual.terms._ ? actual.terms._.map(v => v.value) : undefined;
|
||||
const titleValues = actual.terms.title ? actual.terms.title.map(v => v.value) : undefined;
|
||||
const bodyValues = actual.terms.body ? actual.terms.body.map(v => v.value) : undefined;
|
||||
|
||||
expect(JSON.stringify(_Values)).toBe(JSON.stringify(expected._), 'Test case (_) ' + i);
|
||||
expect(JSON.stringify(titleValues)).toBe(JSON.stringify(expected.title), 'Test case (title) ' + i);
|
||||
expect(JSON.stringify(bodyValues)).toBe(JSON.stringify(expected.body), 'Test case (body) ' + i);
|
||||
}
|
||||
}));
|
||||
|
||||
// it('should parse query strings with wildcards', asyncTest(async () => {
|
||||
// let rows;
|
||||
|
||||
// const testCases = [
|
||||
// ['do*', ['do', 'dog', 'domino'], [] ],
|
||||
// // "*" is a wildcard only when used at the end (to search for documents with the specified prefix)
|
||||
// // If it's at the beginning, it's ignored, if it's in the middle, it's treated as a litteral "*".
|
||||
// ['*an*', ['an', 'anneau'], ['piano', 'plan'] ],
|
||||
// ['no*no', ['no*no'], ['nonono'] ],
|
||||
// ];
|
||||
|
||||
// for (let i = 0; i < testCases.length; i++) {
|
||||
// const t = testCases[i];
|
||||
// const input = t[0];
|
||||
// const shouldMatch = t[1];
|
||||
// const shouldNotMatch = t[2];
|
||||
// const regex = new RegExp(engine.parseQuery(input).terms._[0].value, 'gmi');
|
||||
|
||||
// for (let j = 0; j < shouldMatch.length; j++) {
|
||||
// const r = shouldMatch[j].match(regex);
|
||||
// expect(!!r).toBe(true, '"' + input + '" should match "' + shouldMatch[j] + '"');
|
||||
// }
|
||||
// }
|
||||
|
||||
// expect(engine.parseQuery('*').termCount).toBe(0);
|
||||
// }));
|
||||
|
||||
it('should handle queries with special characters', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const testCases = [
|
||||
['did-not-match', 'did-not-match'],
|
||||
['does match', 'does match'],
|
||||
];
|
||||
|
||||
for (let i = 0; i < testCases.length; i++) {
|
||||
const t = testCases[i];
|
||||
const content = t[0];
|
||||
const query = t[1];
|
||||
|
||||
const n = await Note.save({ title: content });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search(query);
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
await Note.delete(n.id);
|
||||
}
|
||||
}));
|
||||
|
||||
});
|
@@ -170,6 +170,17 @@ describe('services_rest_Api', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
it('should create folders with supplied ID', async (done) => {
|
||||
const response = await api.route('POST', 'folders', null, JSON.stringify({
|
||||
id: '12345678123456781234567812345678',
|
||||
title: 'from api',
|
||||
}));
|
||||
|
||||
expect(response.id).toBe('12345678123456781234567812345678');
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should create notes with images', async (done) => {
|
||||
let response = null;
|
||||
const f = await Folder.save({ title: "mon carnet" });
|
||||
|
@@ -15,6 +15,7 @@ const MasterKey = require('lib/models/MasterKey');
|
||||
const BaseItem = require('lib/models/BaseItem.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry.js');
|
||||
const WelcomeUtils = require('lib/WelcomeUtils');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
@@ -1099,4 +1100,44 @@ describe('Synchronizer', function() {
|
||||
expect(note2.title).toBe("un UPDATE");
|
||||
}));
|
||||
|
||||
it("should sync Welcome notebook and not duplicate it", asyncTest(async () => {
|
||||
// Create the Welcome items on two separate clients and verify
|
||||
// that they appear only once (due to having hard-coded IDs), that they are not duplicated.
|
||||
|
||||
Setting.setConstant('env', 'prod');
|
||||
|
||||
await WelcomeUtils.createWelcomeItems();
|
||||
await synchronizer().start();
|
||||
|
||||
await switchClient(2);
|
||||
|
||||
await WelcomeUtils.createWelcomeItems();
|
||||
const beforeFolderCount = (await Folder.all()).length;
|
||||
const beforeNoteCount = (await Note.all()).length;
|
||||
expect(beforeFolderCount >= 1).toBe(true);
|
||||
expect(beforeNoteCount > 1).toBe(true);
|
||||
|
||||
await synchronizer().start();
|
||||
|
||||
const afterFolderCount = (await Folder.all()).length;
|
||||
const afterNoteCount = (await Note.all()).length;
|
||||
|
||||
expect(afterFolderCount).toBe(beforeFolderCount);
|
||||
expect(afterNoteCount).toBe(beforeNoteCount);
|
||||
|
||||
// Changes to the Welcome items should be synced to all clients
|
||||
|
||||
const f1 = (await Folder.all())[0];
|
||||
await Folder.save({ id: f1.id, title: 'Welcome MOD' });
|
||||
|
||||
await synchronizer().start();
|
||||
|
||||
await switchClient(1);
|
||||
|
||||
await synchronizer().start();
|
||||
|
||||
const f1_1 = (await Folder.all())[0];
|
||||
expect(f1_1.title).toBe('Welcome MOD');
|
||||
}));
|
||||
|
||||
});
|
||||
|
@@ -4,6 +4,7 @@ const { DatabaseDriverNode } = require('lib/database-driver-node.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const ItemChange = require('lib/models/ItemChange.js');
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const NoteTag = require('lib/models/NoteTag.js');
|
||||
@@ -122,6 +123,8 @@ async function switchClient(id) {
|
||||
async function clearDatabase(id = null) {
|
||||
if (id === null) id = currentClient_;
|
||||
|
||||
await ItemChange.waitForAllSaved();
|
||||
|
||||
let queries = [
|
||||
'DELETE FROM notes',
|
||||
'DELETE FROM folders',
|
||||
@@ -134,6 +137,7 @@ async function clearDatabase(id = null) {
|
||||
'DELETE FROM settings',
|
||||
'DELETE FROM deleted_items',
|
||||
'DELETE FROM sync_items',
|
||||
'DELETE FROM notes_normalized',
|
||||
];
|
||||
|
||||
await databases_[id].transactionExecBatch(queries);
|
||||
|
1
CliClientDemo/.gitignore
vendored
1
CliClientDemo/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
node_modules
|
Binary file not shown.
@@ -1,31 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
const spawn = require('child_process').spawn;
|
||||
const os = require('os');
|
||||
const fs = require('fs-extra');
|
||||
|
||||
const joplinPath = __dirname + '/node_modules/.bin/joplin';
|
||||
const profileDir = os.homedir() + '/.config/demo-joplin';
|
||||
const dbFilename = 'database.sqlite';
|
||||
|
||||
fs.ensureDirSync(profileDir);
|
||||
if (!fs.pathExistsSync(profileDir + '/' + dbFilename)) {
|
||||
fs.copySync(__dirname + '/' + dbFilename, profileDir + '/' + dbFilename);
|
||||
}
|
||||
|
||||
const opt = {
|
||||
cwd: __dirname,
|
||||
env: (function() {
|
||||
process.env.NODE_PATH = '.';
|
||||
return process.env;
|
||||
}()),
|
||||
stdio: [process.stdin, process.stdout, process.stderr]
|
||||
};
|
||||
|
||||
const app = spawn(joplinPath, ['--is-demo', '--profile', profileDir], opt);
|
||||
|
||||
app.on('close', (code) => {
|
||||
process.exit(code);
|
||||
});
|
2124
CliClientDemo/package-lock.json
generated
2124
CliClientDemo/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"name": "demo-joplin",
|
||||
"version": "1.0.8",
|
||||
"description": "Demo for Joplin CLI",
|
||||
"bin": {
|
||||
"demo-joplin": "./index.js"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/laurent22/joplin/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laurent22/joplin"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.7.0"
|
||||
},
|
||||
"copyright": {
|
||||
"title": "Demo for Joplin CLI",
|
||||
"years": [
|
||||
2016,
|
||||
2017,
|
||||
2018
|
||||
],
|
||||
"owner": "Laurent Cozic"
|
||||
},
|
||||
"dependencies": {
|
||||
"fs-extra": "^4.0.2",
|
||||
"joplin": "^0.10.69"
|
||||
},
|
||||
"author": "Laurent Cozic",
|
||||
"license": "MIT"
|
||||
}
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
npm version patch
|
||||
npm publish
|
@@ -30,6 +30,21 @@
|
||||
return output;
|
||||
}
|
||||
|
||||
function getImageSizes(element) {
|
||||
const images = element.getElementsByTagName('img');
|
||||
const output = {};
|
||||
for (let i = 0; i < images.length; i++) {
|
||||
const img = images[i];
|
||||
output[img.src] = {
|
||||
width: img.width,
|
||||
height: img.height,
|
||||
naturalWidth: img.naturalWidth,
|
||||
naturalHeight: img.naturalHeight,
|
||||
};
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
// Cleans up element by removing all its invisible children (which we don't want to render as Markdown)
|
||||
function cleanUpElement(element) {
|
||||
const childNodes = element.childNodes;
|
||||
@@ -74,7 +89,7 @@
|
||||
async function prepareCommandResponse(command) {
|
||||
console.info('Got command: ' + command.name);
|
||||
|
||||
const clippedContentResponse = (title, html) => {
|
||||
const clippedContentResponse = (title, html, imageSizes) => {
|
||||
return {
|
||||
name: 'clippedContent',
|
||||
title: title,
|
||||
@@ -83,6 +98,7 @@
|
||||
url: location.origin + location.pathname + location.search,
|
||||
parent_id: command.parent_id,
|
||||
tags: command.tags || '',
|
||||
image_sizes: imageSizes,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -99,20 +115,20 @@
|
||||
response.warning = 'Could not retrieve simplified version of page - full page has been saved instead.';
|
||||
return response;
|
||||
}
|
||||
return clippedContentResponse(article.title, article.body);
|
||||
return clippedContentResponse(article.title, article.body, getImageSizes(document));
|
||||
|
||||
} else if (command.name === "completePageHtml") {
|
||||
|
||||
const cleanDocument = document.body.cloneNode(true);
|
||||
cleanUpElement(cleanDocument);
|
||||
return clippedContentResponse(pageTitle(), cleanDocument.innerHTML);
|
||||
return clippedContentResponse(pageTitle(), cleanDocument.innerHTML, getImageSizes(document));
|
||||
|
||||
} else if (command.name === "selectedHtml") {
|
||||
|
||||
const range = window.getSelection().getRangeAt(0);
|
||||
const container = document.createElement('div');
|
||||
container.appendChild(range.cloneContents());
|
||||
return clippedContentResponse(pageTitle(), container.innerHTML);
|
||||
return clippedContentResponse(pageTitle(), container.innerHTML, getImageSizes(document));
|
||||
|
||||
} else if (command.name === 'screenshot') {
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "Joplin Web Clipper [DEV]",
|
||||
"version": "1.0.7",
|
||||
"version": "1.0.8",
|
||||
"description": "Capture and save web pages and screenshots from your browser to Joplin.",
|
||||
"homepage_url": "https://joplin.cozic.net",
|
||||
"icons": {
|
||||
|
@@ -18,7 +18,10 @@ class AppComponent extends Component {
|
||||
});
|
||||
|
||||
this.confirm_click = () => {
|
||||
bridge().sendContentToJoplin(this.props.clippedContent);
|
||||
const content = Object.assign({}, this.props.clippedContent);
|
||||
content.tags = this.state.selectedTags.join(',');
|
||||
content.parent_id = this.props.selectedFolderId;
|
||||
bridge().sendContentToJoplin(content);
|
||||
}
|
||||
|
||||
this.contentTitle_change = (event) => {
|
||||
@@ -31,24 +34,18 @@ class AppComponent extends Component {
|
||||
this.clipSimplified_click = () => {
|
||||
bridge().sendCommandToActiveTab({
|
||||
name: 'simplifiedPageHtml',
|
||||
parent_id: this.props.selectedFolderId,
|
||||
tags: this.state.selectedTags.join(','),
|
||||
});
|
||||
}
|
||||
|
||||
this.clipComplete_click = () => {
|
||||
bridge().sendCommandToActiveTab({
|
||||
name: 'completePageHtml',
|
||||
parent_id: this.props.selectedFolderId,
|
||||
tags: this.state.selectedTags.join(','),
|
||||
});
|
||||
}
|
||||
|
||||
this.clipSelection_click = () => {
|
||||
bridge().sendCommandToActiveTab({
|
||||
name: 'selectedHtml',
|
||||
parent_id: this.props.selectedFolderId,
|
||||
tags: this.state.selectedTags.join(','),
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -29,6 +29,7 @@ class Bridge {
|
||||
source_url: command.url,
|
||||
parent_id: command.parent_id,
|
||||
tags: command.tags || '',
|
||||
image_sizes: command.image_sizes || {},
|
||||
};
|
||||
|
||||
this.dispatch({ type: 'CLIPPED_CONTENT_SET', content: content });
|
||||
|
@@ -58,7 +58,7 @@ class ElectronAppWrapper {
|
||||
|
||||
// Linux icon workaround for bug https://github.com/electron-userland/electron-builder/issues/2098
|
||||
// Fix: https://github.com/electron-userland/electron-builder/issues/2269
|
||||
if (shim.isLinux()) windowOptions.icon = __dirname + '/build/icons/128x128.png';
|
||||
if (shim.isLinux()) windowOptions.icon = path.join(__dirname, '..', 'build/icons/128x128.png');
|
||||
|
||||
require('electron-context-menu')({
|
||||
shouldShowMenu: (event, params) => {
|
||||
@@ -231,4 +231,4 @@ class ElectronAppWrapper {
|
||||
|
||||
}
|
||||
|
||||
module.exports = { ElectronAppWrapper };
|
||||
module.exports = { ElectronAppWrapper };
|
||||
|
@@ -24,7 +24,7 @@ const InteropService = require('lib/services/InteropService');
|
||||
const InteropServiceHelper = require('./InteropServiceHelper.js');
|
||||
const ResourceService = require('lib/services/ResourceService');
|
||||
const ClipperServer = require('lib/ClipperServer');
|
||||
|
||||
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const Menu = bridge().Menu;
|
||||
const MenuItem = bridge().MenuItem;
|
||||
@@ -42,6 +42,7 @@ const appDefaultState = Object.assign({}, defaultState, {
|
||||
sidebarVisibility: true,
|
||||
windowContentSize: bridge().windowContentSize(),
|
||||
watchedNoteFiles: [],
|
||||
lastEditorScrollPercents: {},
|
||||
});
|
||||
|
||||
class Application extends BaseApplication {
|
||||
@@ -171,6 +172,14 @@ class Application extends BaseApplication {
|
||||
}
|
||||
break;
|
||||
|
||||
case 'EDITOR_SCROLL_PERCENT_SET':
|
||||
|
||||
newState = Object.assign({}, state);
|
||||
const newPercents = Object.assign({}, newState.lastEditorScrollPercents);
|
||||
newPercents[action.noteId] = action.percent;
|
||||
newState.lastEditorScrollPercents = newPercents;
|
||||
break;
|
||||
|
||||
}
|
||||
} catch (error) {
|
||||
error.message = 'In reducer: ' + error.message + ' Action: ' + JSON.stringify(action);
|
||||
@@ -197,10 +206,6 @@ class Application extends BaseApplication {
|
||||
this.updateEditorFont();
|
||||
}
|
||||
|
||||
if (["NOTE_UPDATE_ONE", "NOTE_DELETE", "FOLDER_UPDATE_ONE", "FOLDER_DELETE"].indexOf(action.type) >= 0) {
|
||||
if (!await reg.syncTarget().syncStarted()) reg.scheduleSync(30 * 1000, { syncSteps: ["update_remote", "delete_remote"] });
|
||||
}
|
||||
|
||||
if (['EVENT_NOTE_ALARM_FIELD_CHANGE', 'NOTE_DELETE'].indexOf(action.type) >= 0) {
|
||||
await AlarmService.updateNoteNotification(action.id, action.type === 'NOTE_DELETE');
|
||||
}
|
||||
@@ -229,6 +234,14 @@ class Application extends BaseApplication {
|
||||
this.updateMenu(screen);
|
||||
}
|
||||
|
||||
focusElement_(target) {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focusElement',
|
||||
target: target,
|
||||
});
|
||||
}
|
||||
|
||||
updateMenu(screen) {
|
||||
if (this.lastMenuScreen_ === screen) return;
|
||||
|
||||
@@ -248,6 +261,32 @@ class Application extends BaseApplication {
|
||||
});
|
||||
}
|
||||
|
||||
const focusItems = [];
|
||||
|
||||
focusItems.push({
|
||||
label: _('Sidebar'),
|
||||
click: () => { this.focusElement_('sideBar') },
|
||||
accelerator: 'CommandOrControl+Shift+S',
|
||||
});
|
||||
|
||||
focusItems.push({
|
||||
label: _('Note list'),
|
||||
click: () => { this.focusElement_('noteList') },
|
||||
accelerator: 'CommandOrControl+Shift+L',
|
||||
});
|
||||
|
||||
focusItems.push({
|
||||
label: _('Note title'),
|
||||
click: () => { this.focusElement_('noteTitle') },
|
||||
accelerator: 'CommandOrControl+Shift+N',
|
||||
});
|
||||
|
||||
focusItems.push({
|
||||
label: _('Note body'),
|
||||
click: () => { this.focusElement_('noteBody') },
|
||||
accelerator: 'CommandOrControl+Shift+B',
|
||||
});
|
||||
|
||||
const importItems = [];
|
||||
const exportItems = [];
|
||||
const ioService = new InteropService();
|
||||
@@ -435,10 +474,22 @@ class Application extends BaseApplication {
|
||||
name: 'textItalic',
|
||||
});
|
||||
},
|
||||
}, {
|
||||
label: _('Link'),
|
||||
screens: ['Main'],
|
||||
accelerator: 'CommandOrControl+K',
|
||||
click: () => {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'textLink',
|
||||
});
|
||||
},
|
||||
}, {
|
||||
type: 'separator',
|
||||
screens: ['Main'],
|
||||
}, {
|
||||
label: _('Insert Date Time'),
|
||||
screens: ['Main'],
|
||||
visible: false,
|
||||
accelerator: 'CommandOrControl+Shift+T',
|
||||
click: () => {
|
||||
this.dispatch({
|
||||
@@ -459,14 +510,27 @@ class Application extends BaseApplication {
|
||||
name: 'commandStartExternalEditing',
|
||||
});
|
||||
},
|
||||
}, {
|
||||
type: 'separator',
|
||||
screens: ['Main'],
|
||||
}, {
|
||||
label: _('Search in all the notes'),
|
||||
screens: ['Main'],
|
||||
accelerator: shim.isMac() ? 'Shift+Command+F' : 'F6',
|
||||
click: () => {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focus_search',
|
||||
});
|
||||
},
|
||||
}, {
|
||||
label: _('Search in current note'),
|
||||
screens: ['Main'],
|
||||
accelerator: 'CommandOrControl+F',
|
||||
click: () => {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focus_search',
|
||||
name: 'showLocalSearch',
|
||||
});
|
||||
},
|
||||
}],
|
||||
@@ -475,7 +539,7 @@ class Application extends BaseApplication {
|
||||
submenu: [{
|
||||
label: _('Toggle sidebar'),
|
||||
screens: ['Main'],
|
||||
accelerator: 'F10',
|
||||
accelerator: shim.isMac() ? 'Option+Command+S' : 'F10',
|
||||
click: () => {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
@@ -523,6 +587,13 @@ class Application extends BaseApplication {
|
||||
click: () => {
|
||||
Setting.setValue('showCompletedTodos', !Setting.value('showCompletedTodos'));
|
||||
},
|
||||
}, {
|
||||
type: 'separator',
|
||||
screens: ['Main'],
|
||||
}, {
|
||||
label: _('Focus'),
|
||||
screens: ['Main'],
|
||||
submenu: focusItems,
|
||||
}],
|
||||
}, {
|
||||
label: _('Tools'),
|
||||
@@ -575,7 +646,7 @@ class Application extends BaseApplication {
|
||||
}, {
|
||||
label: _('Check for updates...'),
|
||||
click: () => {
|
||||
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath());
|
||||
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath(), { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
|
||||
}
|
||||
}, {
|
||||
type: 'separator',
|
||||
@@ -587,7 +658,7 @@ class Application extends BaseApplication {
|
||||
let message = [
|
||||
p.description,
|
||||
'',
|
||||
'Copyright © 2016-2018 Laurent Cozic',
|
||||
'Copyright © 2016-2019 Laurent Cozic',
|
||||
_('%s %s (%s, %s)', p.name, p.version, Setting.value('env'), process.platform),
|
||||
];
|
||||
bridge().showInfoMessageBox(message.join('\n'), {
|
||||
@@ -758,7 +829,7 @@ class Application extends BaseApplication {
|
||||
if (shim.isWindows() || shim.isMac()) {
|
||||
const runAutoUpdateCheck = () => {
|
||||
if (Setting.value('autoUpdateEnabled')) {
|
||||
bridge().checkForUpdates(true, bridge().window(), this.checkForUpdateLoggerPath());
|
||||
bridge().checkForUpdates(true, bridge().window(), this.checkForUpdateLoggerPath(), { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -802,6 +873,9 @@ class Application extends BaseApplication {
|
||||
if (Setting.value('clipperServer.autoStart')) {
|
||||
ClipperServer.instance().start();
|
||||
}
|
||||
|
||||
ExternalEditWatcher.instance().setLogger(reg.logger());
|
||||
ExternalEditWatcher.instance().dispatch = this.store().dispatch;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -116,9 +116,9 @@ class Bridge {
|
||||
return require('electron').shell.openItem(fullPath)
|
||||
}
|
||||
|
||||
checkForUpdates(inBackground, window, logFilePath) {
|
||||
checkForUpdates(inBackground, window, logFilePath, options) {
|
||||
const { checkForUpdates } = require('./checkForUpdates.js');
|
||||
checkForUpdates(inBackground, window, logFilePath);
|
||||
checkForUpdates(inBackground, window, logFilePath, options);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -29,15 +29,35 @@ function onCheckEnded() {
|
||||
isCheckingForUpdate_ = false;
|
||||
}
|
||||
|
||||
async function fetchLatestRelease() {
|
||||
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
|
||||
async function fetchLatestRelease(options) {
|
||||
options = Object.assign({}, { includePreReleases: false }, options);
|
||||
|
||||
if (!response.ok) {
|
||||
const responseText = await response.text();
|
||||
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
let json = null;
|
||||
|
||||
if (options.includePreReleases) {
|
||||
// This end-point will include all releases, including pre-releases (but not draft), so we take
|
||||
// whatever is the latest release. It might be the same as releases/latest, or it might be
|
||||
// a pre-release.
|
||||
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases');
|
||||
|
||||
if (!response.ok) {
|
||||
const responseText = await response.text();
|
||||
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
}
|
||||
|
||||
json = await response.json();
|
||||
if (!json.length) throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
json = json[0];
|
||||
} else {
|
||||
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
|
||||
|
||||
if (!response.ok) {
|
||||
const responseText = await response.text();
|
||||
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
}
|
||||
|
||||
json = await response.json();
|
||||
}
|
||||
|
||||
const json = await response.json();
|
||||
|
||||
const version = json.tag_name.substr(1);
|
||||
let downloadUrl = null;
|
||||
@@ -69,10 +89,11 @@ async function fetchLatestRelease() {
|
||||
downloadUrl: downloadUrl,
|
||||
notes: json.body,
|
||||
pageUrl: json.html_url,
|
||||
prerelease: json.prerelease,
|
||||
};
|
||||
}
|
||||
|
||||
function checkForUpdates(inBackground, window, logFilePath) {
|
||||
function checkForUpdates(inBackground, window, logFilePath, options) {
|
||||
if (isCheckingForUpdate_) {
|
||||
autoUpdateLogger_.info('checkForUpdates: Skipping check because it is already running');
|
||||
return;
|
||||
@@ -91,18 +112,22 @@ function checkForUpdates(inBackground, window, logFilePath) {
|
||||
|
||||
checkInBackground_ = inBackground;
|
||||
|
||||
fetchLatestRelease().then(release => {
|
||||
autoUpdateLogger_.info('checkForUpdates: Checking with options ' + JSON.stringify(options));
|
||||
|
||||
fetchLatestRelease(options).then(release => {
|
||||
autoUpdateLogger_.info('Current version: ' + packageInfo.version);
|
||||
autoUpdateLogger_.info('Latest version: ' + release.version);
|
||||
autoUpdateLogger_.info('Is Pre-release:', release.prerelease);
|
||||
|
||||
if (compareVersions(release.version, packageInfo.version) <= 0) {
|
||||
if (!checkInBackground_) dialog.showMessageBox({ message: _('Current version is up-to-date.') })
|
||||
} else {
|
||||
const releaseNotes = release.notes.trim() ? "\n\n" + release.notes.trim() : '';
|
||||
const newVersionString = release.prerelease ? _('%s (pre-release)', release.version) : release.version;
|
||||
|
||||
const buttonIndex = dialog.showMessageBox(parentWindow_, {
|
||||
type: 'info',
|
||||
message: _('An update is available, do you want to download it now?' + releaseNotes),
|
||||
message: _('An update is available, do you want to download it now?') + '\n\n' + _('Your version: v%s', packageInfo.version) + '\n' + _('New version: v%s', newVersionString) + releaseNotes,
|
||||
buttons: [_('Yes'), _('No')]
|
||||
});
|
||||
|
||||
|
@@ -2,6 +2,7 @@ const fs = require('fs-extra');
|
||||
const spawnSync = require('child_process').spawnSync;
|
||||
|
||||
const babelPath = __dirname + '/node_modules/.bin/babel' + (process.platform === 'win32' ? '.cmd' : '');
|
||||
const basePath = __dirname + '/../..';
|
||||
const guiPath = __dirname + '/gui';
|
||||
|
||||
function fileIsNewerThan(path1, path2) {
|
||||
@@ -27,7 +28,7 @@ fs.readdirSync(guiPath).forEach((filename) => {
|
||||
|
||||
if (fileIsNewerThan(jsxPath, jsPath)) {
|
||||
console.info('Compiling ' + jsxPath + '...');
|
||||
const result = spawnSync(babelPath, ['--presets', 'react', '--out-file',jsPath, jsxPath]);
|
||||
const result = spawnSync(babelPath, ['--presets', 'react', '--out-file', jsPath, jsxPath]);
|
||||
if (result.status !== 0) {
|
||||
const msg = [];
|
||||
if (result.stdout) msg.push(result.stdout.toString());
|
||||
@@ -38,3 +39,10 @@ fs.readdirSync(guiPath).forEach((filename) => {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const libContent = [
|
||||
fs.readFileSync(basePath + '/ReactNativeClient/lib/string-utils-common.js', 'utf8'),
|
||||
fs.readFileSync(basePath + '/ReactNativeClient/lib/markJsUtils.js', 'utf8'),
|
||||
];
|
||||
|
||||
fs.writeFileSync(__dirname + '/gui/note-viewer/lib.js', libContent.join('\n'), 'utf8');
|
@@ -7,6 +7,7 @@ const { Header } = require('./Header.min.js');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const pathUtils = require('lib/path-utils.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { commandArgumentsToString } = require('lib/string-utils');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||
const shared = require('lib/components/shared/config-shared.js');
|
||||
|
||||
@@ -43,6 +44,49 @@ class ConfigScreenComponent extends React.Component {
|
||||
return output;
|
||||
}
|
||||
|
||||
sectionToComponent(key, section, settings) {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const settingComps = [];
|
||||
|
||||
for (let i = 0; i < section.metadatas.length; i++) {
|
||||
const md = section.metadatas[i];
|
||||
|
||||
const settingComp = this.settingToComponent(md.key, settings[md.key]);
|
||||
settingComps.push(settingComp);
|
||||
}
|
||||
|
||||
const sectionStyle = {
|
||||
marginBottom: 20,
|
||||
};
|
||||
|
||||
const headerStyle = Object.assign({}, theme.headerStyle, {
|
||||
borderBottomWidth: 1,
|
||||
borderBottomColor: theme.dividerColor,
|
||||
borderBottomStyle: 'solid',
|
||||
paddingBottom: '.4em',
|
||||
});
|
||||
|
||||
if (section.name === 'general') {
|
||||
sectionStyle.borderTopWidth = 0;
|
||||
}
|
||||
|
||||
const noteComp = section.name !== 'general' ? null : (
|
||||
<div style={Object.assign({}, theme.textStyle, {marginBottom: 10})}>
|
||||
{_('Notes and settings are stored in: %s', pathUtils.toSystemSlashes(Setting.value('profileDir'), process.platform))}
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<div key={key} style={sectionStyle}>
|
||||
<h2 style={headerStyle}>{Setting.sectionNameToLabel(section.name)}</h2>
|
||||
{noteComp}
|
||||
<div>
|
||||
{settingComps}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
settingToComponent(key, value) {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
@@ -56,6 +100,15 @@ class ConfigScreenComponent extends React.Component {
|
||||
color: theme.color,
|
||||
});
|
||||
|
||||
const subLabel = Object.assign({}, labelStyle, {
|
||||
opacity: 0.7,
|
||||
marginBottom: Math.round(rowStyle.marginBottom * 0.7),
|
||||
});
|
||||
|
||||
const invisibleLabel = Object.assign({}, labelStyle, {
|
||||
opacity: 0,
|
||||
});
|
||||
|
||||
const controlStyle = {
|
||||
display: 'inline-block',
|
||||
color: theme.color,
|
||||
@@ -70,6 +123,7 @@ class ConfigScreenComponent extends React.Component {
|
||||
});
|
||||
|
||||
const updateSettingValue = (key, value) => {
|
||||
// console.info(key + ' = ' + value);
|
||||
return shared.updateSettingValue(this, key, value);
|
||||
}
|
||||
|
||||
@@ -119,23 +173,93 @@ class ConfigScreenComponent extends React.Component {
|
||||
</div>
|
||||
);
|
||||
} else if (md.type === Setting.TYPE_STRING) {
|
||||
const onTextChange = (event) => {
|
||||
updateSettingValue(key, event.target.value);
|
||||
}
|
||||
|
||||
const inputStyle = Object.assign({}, controlStyle, {
|
||||
width: '50%',
|
||||
minWidth: '20em',
|
||||
border: '1px solid' });
|
||||
const inputType = md.secure === true ? 'password' : 'text';
|
||||
|
||||
return (
|
||||
<div key={key} style={rowStyle}>
|
||||
<div style={labelStyle}><label>{md.label()}</label></div>
|
||||
<input type={inputType} style={inputStyle} value={this.state.settings[key]} onChange={(event) => {onTextChange(event)}} />
|
||||
{ descriptionComp }
|
||||
</div>
|
||||
);
|
||||
if (md.subType === 'file_path_and_args') {
|
||||
inputStyle.marginBottom = subLabel.marginBottom;
|
||||
|
||||
const splitCmd = cmdString => {
|
||||
const path = pathUtils.extractExecutablePath(cmdString);
|
||||
const args = cmdString.substr(path.length + 1);
|
||||
return [pathUtils.unquotePath(path), args];
|
||||
}
|
||||
|
||||
const joinCmd = cmdArray => {
|
||||
if (!cmdArray[0] && !cmdArray[1]) return '';
|
||||
let cmdString = pathUtils.quotePath(cmdArray[0]);
|
||||
if (!cmdString) cmdString = '""';
|
||||
if (cmdArray[1]) cmdString += ' ' + cmdArray[1];
|
||||
return cmdString;
|
||||
}
|
||||
|
||||
const onPathChange = event => {
|
||||
const cmd = splitCmd(this.state.settings[key]);
|
||||
cmd[0] = event.target.value;
|
||||
updateSettingValue(key, joinCmd(cmd));
|
||||
}
|
||||
|
||||
const onArgsChange = event => {
|
||||
const cmd = splitCmd(this.state.settings[key]);
|
||||
cmd[1] = event.target.value;
|
||||
updateSettingValue(key, joinCmd(cmd));
|
||||
}
|
||||
|
||||
const browseButtonClick = () => {
|
||||
const paths = bridge().showOpenDialog();
|
||||
if (!paths || !paths.length) return;
|
||||
const cmd = splitCmd(this.state.settings[key]);
|
||||
cmd[0] = paths[0]
|
||||
updateSettingValue(key, joinCmd(cmd));
|
||||
}
|
||||
|
||||
const cmd = splitCmd(this.state.settings[key]);
|
||||
|
||||
return (
|
||||
<div key={key} style={rowStyle}>
|
||||
<div style={{display:'flex'}}>
|
||||
<div style={{flex:0, whiteSpace: 'nowrap'}}>
|
||||
<div style={labelStyle}><label>{md.label()}</label></div>
|
||||
</div>
|
||||
<div style={{flex:0}}>
|
||||
<div style={subLabel}>Path:</div>
|
||||
<div style={subLabel}>Arguments:</div>
|
||||
</div>
|
||||
<div style={{flex:1}}>
|
||||
<div style={{display: 'flex', flexDirection: 'row', alignItems: 'center', marginBottom: inputStyle.marginBottom}}>
|
||||
<input type={inputType} style={Object.assign({}, inputStyle, {marginBottom:0})} onChange={(event) => {onPathChange(event)}} value={cmd[0]} />
|
||||
<button onClick={browseButtonClick} style={Object.assign({}, theme.buttonStyle, { marginLeft: 5, minHeight: 20, height: 20 })}>{_('Browse...')}</button>
|
||||
</div>
|
||||
<input type={inputType} style={inputStyle} onChange={(event) => {onArgsChange(event)}} value={cmd[1]}/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style={{display:'flex'}}>
|
||||
<div style={{flex:0, whiteSpace: 'nowrap'}}>
|
||||
<div style={invisibleLabel}><label>{md.label()}</label></div>
|
||||
</div>
|
||||
<div style={{flex:1}}>
|
||||
{ descriptionComp }
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
} else {
|
||||
const onTextChange = (event) => {
|
||||
updateSettingValue(key, event.target.value);
|
||||
}
|
||||
|
||||
return (
|
||||
<div key={key} style={rowStyle}>
|
||||
<div style={labelStyle}><label>{md.label()}</label></div>
|
||||
<input type={inputType} style={inputStyle} value={this.state.settings[key]} onChange={(event) => {onTextChange(event)}} />
|
||||
{ descriptionComp }
|
||||
</div>
|
||||
);
|
||||
}
|
||||
} else if (md.type === Setting.TYPE_INT) {
|
||||
const onNumChange = (event) => {
|
||||
updateSettingValue(key, event.target.value);
|
||||
@@ -170,21 +294,31 @@ class ConfigScreenComponent extends React.Component {
|
||||
|
||||
render() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
const style = Object.assign({
|
||||
backgroundColor: theme.backgroundColor
|
||||
}, this.props.style, { overflow: 'auto' });
|
||||
const settings = this.state.settings;
|
||||
}, this.props.style, {
|
||||
overflow: 'hidden',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
});
|
||||
|
||||
const headerStyle = Object.assign({}, theme.headerStyle, { width: style.width });
|
||||
let settings = this.state.settings;
|
||||
|
||||
const containerStyle = Object.assign({}, theme.containerStyle, { padding: 10 });
|
||||
const containerStyle = Object.assign({}, theme.containerStyle, { padding: 10, paddingTop: 0 });
|
||||
|
||||
const hasChanges = !!this.state.changedSettingKeys.length;
|
||||
|
||||
const buttonStyle = Object.assign({}, theme.buttonStyle, {
|
||||
display: this.state.changedSettingKeys.length ? 'inline-block' : 'none',
|
||||
display: 'inline-block',
|
||||
marginRight: 10,
|
||||
});
|
||||
|
||||
const settingComps = shared.settingsToComponents(this, 'desktop', settings);
|
||||
const buttonStyleApprove = Object.assign({}, buttonStyle, {
|
||||
opacity: hasChanges ? 1 : theme.disabledOpacity,
|
||||
});
|
||||
|
||||
const settingComps = shared.settingsToComponents2(this, 'desktop', settings);
|
||||
|
||||
const syncTargetMd = SyncTargetRegistry.idToMetadata(settings['sync.target']);
|
||||
|
||||
@@ -199,22 +333,29 @@ class ConfigScreenComponent extends React.Component {
|
||||
|
||||
settingComps.push(
|
||||
<div key="check_sync_config_button" style={this.rowStyle_}>
|
||||
<button style={buttonStyle} disabled={this.state.checkSyncConfigResult === 'checking'} onClick={this.checkSyncConfig_}>{_('Check synchronisation configuration')}</button>
|
||||
<button disabled={this.state.checkSyncConfigResult === 'checking'} style={buttonStyle} onClick={this.checkSyncConfig_}>{_('Check synchronisation configuration')}</button>
|
||||
{ statusComp }
|
||||
</div>);
|
||||
}
|
||||
|
||||
const buttonBarStyle = {
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
padding: 15,
|
||||
borderBottomWidth: 1,
|
||||
borderBottomStyle: 'solid',
|
||||
borderBottomColor: theme.dividerColor,
|
||||
};
|
||||
|
||||
return (
|
||||
<div style={style}>
|
||||
<Header style={headerStyle} />
|
||||
<div style={buttonBarStyle}>
|
||||
<button onClick={() => {this.onCancelClick()}} style={buttonStyle}>{'⬅ ' + _('Cancel')}</button>
|
||||
<button disabled={!hasChanges} onClick={() => {this.onSaveClick()}} style={buttonStyleApprove}>{_('OK')}</button>
|
||||
<button disabled={!hasChanges} onClick={() => {this.onApplyClick()}} style={buttonStyleApprove}>{_('Apply')}</button>
|
||||
</div>
|
||||
<div style={containerStyle}>
|
||||
<div style={Object.assign({}, theme.textStyle, {marginBottom: 20})}>
|
||||
{_('Notes and settings are stored in: %s', pathUtils.toSystemSlashes(Setting.value('profileDir'), process.platform))}
|
||||
</div>
|
||||
{ settingComps }
|
||||
<button onClick={() => {this.onSaveClick()}} style={buttonStyle}>{_('OK')}</button>
|
||||
<button onClick={() => {this.onCancelClick()}} style={buttonStyle}>{_('Cancel')}</button>
|
||||
<button onClick={() => {this.onApplyClick()}} style={buttonStyle}>{_('Apply')}</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
@@ -3,6 +3,7 @@ const { connect } = require('react-redux');
|
||||
const { reg } = require('lib/registry.js');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
|
||||
class HeaderComponent extends React.Component {
|
||||
|
||||
@@ -10,6 +11,7 @@ class HeaderComponent extends React.Component {
|
||||
super();
|
||||
this.state = {
|
||||
searchQuery: '',
|
||||
showSearchUsageLink: false,
|
||||
};
|
||||
|
||||
this.scheduleSearchChangeEventIid_ = null;
|
||||
@@ -37,6 +39,27 @@ class HeaderComponent extends React.Component {
|
||||
triggerOnQuery('');
|
||||
if (this.searchElement_) this.searchElement_.focus();
|
||||
}
|
||||
|
||||
this.search_onFocus = event => {
|
||||
if (this.hideSearchUsageLinkIID_) {
|
||||
clearTimeout(this.hideSearchUsageLinkIID_);
|
||||
this.hideSearchUsageLinkIID_ = null;
|
||||
}
|
||||
|
||||
this.setState({ showSearchUsageLink: true });
|
||||
}
|
||||
|
||||
this.search_onBlur = event => {
|
||||
if (this.hideSearchUsageLinkIID_) return;
|
||||
|
||||
this.hideSearchUsageLinkIID_ = setTimeout(() => {
|
||||
this.setState({ showSearchUsageLink: false });
|
||||
}, 5000);
|
||||
}
|
||||
|
||||
this.searchUsageLink_click = event => {
|
||||
bridge().openExternal('https://joplin.cozic.net/#searching');
|
||||
}
|
||||
}
|
||||
|
||||
async componentWillReceiveProps(nextProps) {
|
||||
@@ -45,6 +68,13 @@ class HeaderComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
if (this.hideSearchUsageLinkIID_) {
|
||||
clearTimeout(this.hideSearchUsageLinkIID_);
|
||||
this.hideSearchUsageLinkIID_ = null;
|
||||
}
|
||||
}
|
||||
|
||||
async doCommand(command) {
|
||||
if (!command) return;
|
||||
|
||||
@@ -100,6 +130,8 @@ class HeaderComponent extends React.Component {
|
||||
}
|
||||
|
||||
makeSearch(key, style, options, state) {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
const inputStyle = {
|
||||
display: 'flex',
|
||||
flex: 1,
|
||||
@@ -137,6 +169,10 @@ class HeaderComponent extends React.Component {
|
||||
const icon = <i style={iconStyle} className={"fa " + iconName}></i>
|
||||
if (options.onQuery) this.searchOnQuery_ = options.onQuery;
|
||||
|
||||
const usageLink = !this.state.showSearchUsageLink ? null : (
|
||||
<a onClick={this.searchUsageLink_click} style={theme.urlStyle} href="#">{_('Usage')}</a>
|
||||
);
|
||||
|
||||
return (
|
||||
<div key={key} style={containerStyle}>
|
||||
<input
|
||||
@@ -146,12 +182,15 @@ class HeaderComponent extends React.Component {
|
||||
value={state.searchQuery}
|
||||
onChange={this.search_onChange}
|
||||
ref={elem => this.searchElement_ = elem}
|
||||
onFocus={this.search_onFocus}
|
||||
onBlur={this.search_onBlur}
|
||||
/>
|
||||
<a
|
||||
href="#"
|
||||
style={searchButton}
|
||||
onClick={this.search_onClear}
|
||||
>{icon}</a>
|
||||
{usageLink}
|
||||
</div>);
|
||||
}
|
||||
|
||||
|
@@ -6,13 +6,23 @@ class ItemList extends React.Component {
|
||||
super();
|
||||
|
||||
this.scrollTop_ = 0;
|
||||
|
||||
this.listRef = React.createRef();
|
||||
|
||||
this.onScroll = this.onScroll.bind(this);
|
||||
this.onKeyDown = this.onKeyDown.bind(this);
|
||||
}
|
||||
|
||||
visibleItemCount(props) {
|
||||
if (typeof props === 'undefined') props = this.props;
|
||||
return Math.ceil(props.style.height / props.itemHeight);
|
||||
}
|
||||
|
||||
updateStateItemIndexes(props) {
|
||||
if (typeof props === 'undefined') props = this.props;
|
||||
|
||||
const topItemIndex = Math.floor(this.scrollTop_ / props.itemHeight);
|
||||
const visibleItemCount = Math.ceil(props.style.height / props.itemHeight);
|
||||
const visibleItemCount = this.visibleItemCount(props);
|
||||
|
||||
let bottomItemIndex = topItemIndex + visibleItemCount;
|
||||
if (bottomItemIndex >= props.items.length) bottomItemIndex = props.items.length - 1;
|
||||
@@ -31,8 +41,33 @@ class ItemList extends React.Component {
|
||||
this.updateStateItemIndexes(newProps);
|
||||
}
|
||||
|
||||
onScroll(scrollTop) {
|
||||
onScroll(event) {
|
||||
this.scrollTop_ = event.target.scrollTop;
|
||||
this.updateStateItemIndexes();
|
||||
}
|
||||
|
||||
onKeyDown(event) {
|
||||
if (this.props.onKeyDown) this.props.onKeyDown(event);
|
||||
}
|
||||
|
||||
makeItemIndexVisible(itemIndex) {
|
||||
const top = Math.min(this.props.items.length - 1, this.state.topItemIndex + 1);
|
||||
const bottom = Math.max(0, this.state.bottomItemIndex - 1)
|
||||
|
||||
if (itemIndex >= top && itemIndex <= bottom) return;
|
||||
|
||||
let scrollTop = 0;
|
||||
if (itemIndex < top) {
|
||||
scrollTop = this.props.itemHeight * itemIndex;
|
||||
} else {
|
||||
scrollTop = this.props.itemHeight * itemIndex - (this.visibleItemCount() - 1) * this.props.itemHeight;
|
||||
}
|
||||
|
||||
if (scrollTop < 0) scrollTop = 0;
|
||||
|
||||
this.scrollTop_ = scrollTop;
|
||||
this.listRef.current.scrollTop = scrollTop;
|
||||
|
||||
this.updateStateItemIndexes();
|
||||
}
|
||||
|
||||
@@ -61,10 +96,8 @@ class ItemList extends React.Component {
|
||||
let classes = ['item-list'];
|
||||
if (this.props.className) classes.push(this.props.className);
|
||||
|
||||
const that = this;
|
||||
|
||||
return (
|
||||
<div className={classes.join(' ')} style={style} onScroll={ (event) => { this.onScroll(event.target.scrollTop) }}>
|
||||
<div ref={this.listRef} className={classes.join(' ')} style={style} onScroll={this.onScroll} onKeyDown={this.onKeyDown}>
|
||||
{ itemComps }
|
||||
</div>
|
||||
);
|
||||
|
@@ -295,7 +295,7 @@ class MainScreenComponent extends React.Component {
|
||||
height: rowHeight,
|
||||
display: 'inline-block',
|
||||
verticalAlign: 'top',
|
||||
};
|
||||
};
|
||||
|
||||
if (isSidebarVisible === false) {
|
||||
this.styles_.sideBar.width = 0;
|
||||
@@ -338,9 +338,9 @@ class MainScreenComponent extends React.Component {
|
||||
render() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const style = Object.assign({
|
||||
color: theme.color,
|
||||
backgroundColor: theme.backgroundColor,
|
||||
}, this.props.style);
|
||||
color: theme.color,
|
||||
backgroundColor: theme.backgroundColor,
|
||||
}, this.props.style);
|
||||
const promptOptions = this.state.promptOptions;
|
||||
const folders = this.props.folders;
|
||||
const notes = this.props.notes;
|
||||
|
@@ -4,6 +4,7 @@ const { connect } = require('react-redux');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const BaseModel = require('lib/BaseModel');
|
||||
const markJsUtils = require('lib/markJsUtils');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const Menu = bridge().Menu;
|
||||
@@ -12,10 +13,24 @@ const eventManager = require('../eventManager');
|
||||
const InteropService = require('lib/services/InteropService');
|
||||
const InteropServiceHelper = require('../InteropServiceHelper.js');
|
||||
const Search = require('lib/models/Search');
|
||||
const { stateUtils } = require('lib/reducer');
|
||||
const Mark = require('mark.js/dist/mark.min.js');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const NoteListUtils = require('./utils/NoteListUtils');
|
||||
const { replaceRegexDiacritics, pregQuote } = require('lib/string-utils');
|
||||
|
||||
class NoteListComponent extends React.Component {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.itemListRef = React.createRef();
|
||||
this.itemAnchorRefs_ = {};
|
||||
|
||||
this.itemRenderer = this.itemRenderer.bind(this);
|
||||
this.onKeyDown = this.onKeyDown.bind(this);
|
||||
}
|
||||
|
||||
style() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
@@ -70,108 +85,20 @@ class NoteListComponent extends React.Component {
|
||||
|
||||
if (!noteIds.length) return;
|
||||
|
||||
const notes = noteIds.map((id) => BaseModel.byId(this.props.notes, id));
|
||||
|
||||
let hasEncrypted = false;
|
||||
for (let i = 0; i < notes.length; i++) {
|
||||
if (!!notes[i].encryption_applied) hasEncrypted = true;
|
||||
}
|
||||
|
||||
const menu = new Menu()
|
||||
|
||||
if (!hasEncrypted) {
|
||||
menu.append(new MenuItem({label: _('Add or remove tags'), enabled: noteIds.length === 1, click: async () => {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'setTags',
|
||||
noteId: noteIds[0],
|
||||
});
|
||||
}}));
|
||||
|
||||
menu.append(new MenuItem({label: _('Duplicate'), click: async () => {
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
await Note.duplicate(noteIds[i], {
|
||||
uniqueTitle: _('%s - Copy', note.title),
|
||||
});
|
||||
}
|
||||
}}));
|
||||
|
||||
if (noteIds.length <= 1) {
|
||||
menu.append(new MenuItem({label: _('Switch between note and to-do type'), click: async () => {
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
await Note.save(Note.toggleIsTodo(note), { userSideValidation: true });
|
||||
eventManager.emit('noteTypeToggle', { noteId: note.id });
|
||||
}
|
||||
}}));
|
||||
} else {
|
||||
const switchNoteType = async (noteIds, type) => {
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
const newNote = Note.changeNoteType(note, type);
|
||||
if (newNote === note) continue;
|
||||
await Note.save(newNote, { userSideValidation: true });
|
||||
eventManager.emit('noteTypeToggle', { noteId: note.id });
|
||||
}
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Switch to note type'), click: async () => {
|
||||
await switchNoteType(noteIds, 'note');
|
||||
}}));
|
||||
|
||||
menu.append(new MenuItem({label: _('Switch to to-do type'), click: async () => {
|
||||
await switchNoteType(noteIds, 'todo');
|
||||
}}));
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Copy Markdown link'), click: async () => {
|
||||
const { clipboard } = require('electron');
|
||||
const links = [];
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
links.push(Note.markdownTag(note));
|
||||
}
|
||||
clipboard.writeText(links.join(' '));
|
||||
}}));
|
||||
|
||||
const exportMenu = new Menu();
|
||||
|
||||
const ioService = new InteropService();
|
||||
const ioModules = ioService.modules();
|
||||
for (let i = 0; i < ioModules.length; i++) {
|
||||
const module = ioModules[i];
|
||||
if (module.type !== 'exporter') continue;
|
||||
|
||||
exportMenu.append(new MenuItem({ label: module.fullLabel() , click: async () => {
|
||||
await InteropServiceHelper.export(this.props.dispatch.bind(this), module, { sourceNoteIds: noteIds });
|
||||
}}));
|
||||
}
|
||||
|
||||
exportMenu.append(new MenuItem({ label: 'PDF - ' + _('PDF File') , click: () => {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'exportPdf',
|
||||
});
|
||||
}}));
|
||||
|
||||
const exportMenuItem = new MenuItem({label: _('Export'), submenu: exportMenu});
|
||||
|
||||
menu.append(exportMenuItem);
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Delete'), click: async () => {
|
||||
const ok = bridge().showConfirmMessageBox(noteIds.length > 1 ? _('Delete notes?') : _('Delete note?'));
|
||||
if (!ok) return;
|
||||
await Note.batchDelete(noteIds);
|
||||
}}));
|
||||
const menu = NoteListUtils.makeContextMenu(noteIds, {
|
||||
notes: this.props.notes,
|
||||
dispatch: this.props.dispatch,
|
||||
});
|
||||
|
||||
menu.popup(bridge().window());
|
||||
}
|
||||
|
||||
itemRenderer(item, theme, width) {
|
||||
itemRenderer(item) {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const width = this.props.style.width;
|
||||
|
||||
const onTitleClick = async (event, item) => {
|
||||
if (event.ctrlKey) {
|
||||
if (event.ctrlKey || event.metaKey) {
|
||||
event.preventDefault();
|
||||
this.props.dispatch({
|
||||
type: 'NOTE_SELECT_TOGGLE',
|
||||
@@ -225,8 +152,11 @@ class NoteListComponent extends React.Component {
|
||||
|
||||
let highlightedWords = [];
|
||||
if (this.props.notesParentType === 'Search') {
|
||||
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
|
||||
highlightedWords = search ? Search.keywords(search.query_pattern) : [];
|
||||
const query = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
|
||||
if (query) {
|
||||
const parsedQuery = SearchEngine.instance().parseQuery(query.query_pattern);
|
||||
highlightedWords = SearchEngine.instance().allParsedQueryTerms(parsedQuery);
|
||||
}
|
||||
}
|
||||
|
||||
let style = Object.assign({ width: width }, this.style().listItem);
|
||||
@@ -257,7 +187,17 @@ class NoteListComponent extends React.Component {
|
||||
exclude: ['img'],
|
||||
acrossElements: true,
|
||||
});
|
||||
mark.mark(highlightedWords);
|
||||
|
||||
mark.unmark();
|
||||
|
||||
for (let i = 0; i < highlightedWords.length; i++) {
|
||||
const w = highlightedWords[i];
|
||||
|
||||
markJsUtils.markKeyword(mark, w, {
|
||||
pregQuote: pregQuote,
|
||||
replaceRegexDiacritics: replaceRegexDiacritics,
|
||||
});
|
||||
}
|
||||
|
||||
// Note: in this case it is safe to use dangerouslySetInnerHTML because titleElement
|
||||
// is a span tag that we created and that contains data that's been inserted as plain text
|
||||
@@ -269,11 +209,23 @@ class NoteListComponent extends React.Component {
|
||||
titleComp = <span>{displayTitle}</span>
|
||||
}
|
||||
|
||||
const watchedIconStyle = {
|
||||
paddingRight: 4,
|
||||
color: theme.color,
|
||||
};
|
||||
const watchedIcon = this.props.watchedNoteFiles.indexOf(item.id) < 0 ? null : (
|
||||
<i style={watchedIconStyle} className={"fa fa-external-link"}></i>
|
||||
);
|
||||
|
||||
if (!this.itemAnchorRefs_[item.id]) this.itemAnchorRefs_[item.id] = React.createRef();
|
||||
const ref = this.itemAnchorRefs_[item.id];
|
||||
|
||||
// Need to include "todo_completed" in key so that checkbox is updated when
|
||||
// item is changed via sync.
|
||||
return <div key={item.id + '_' + item.todo_completed} style={style}>
|
||||
{checkbox}
|
||||
<a
|
||||
ref={ref}
|
||||
className="list-item"
|
||||
onContextMenu={(event) => this.itemContextMenu(event)}
|
||||
href="#"
|
||||
@@ -283,11 +235,148 @@ class NoteListComponent extends React.Component {
|
||||
onDragStart={(event) => onDragStart(event) }
|
||||
data-id={item.id}
|
||||
>
|
||||
{watchedIcon}
|
||||
{titleComp}
|
||||
</a>
|
||||
</div>
|
||||
}
|
||||
|
||||
itemAnchorRef(itemId) {
|
||||
if (this.itemAnchorRefs_[itemId] && this.itemAnchorRefs_[itemId].current) return this.itemAnchorRefs_[itemId].current;
|
||||
return null;
|
||||
}
|
||||
|
||||
doCommand(command) {
|
||||
if (!command) return;
|
||||
|
||||
let commandProcessed = true;
|
||||
|
||||
if (command.name === 'focusElement' && command.target === 'noteList') {
|
||||
if (this.props.selectedNoteIds.length) {
|
||||
const ref = this.itemAnchorRef(this.props.selectedNoteIds[0]);
|
||||
if (ref) ref.focus();
|
||||
}
|
||||
} else {
|
||||
commandProcessed = false;
|
||||
}
|
||||
|
||||
if (commandProcessed) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps, prevState, snapshot) {
|
||||
if (prevProps.windowCommand !== this.props.windowCommand) {
|
||||
this.doCommand(this.props.windowCommand);
|
||||
}
|
||||
|
||||
if (prevProps.selectedNoteIds !== this.props.selectedNoteIds && this.props.selectedNoteIds.length === 1) {
|
||||
const id = this.props.selectedNoteIds[0];
|
||||
for (let i = 0; i < this.props.notes.length; i++) {
|
||||
if (this.props.notes[i].id === id) {
|
||||
this.itemListRef.current.makeItemIndexVisible(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async onKeyDown(event) {
|
||||
const keyCode = event.keyCode;
|
||||
const noteIds = this.props.selectedNoteIds;
|
||||
|
||||
if (noteIds.length === 1 && (keyCode === 40 || keyCode === 38)) { // DOWN / UP
|
||||
const noteId = noteIds[0];
|
||||
let noteIndex = BaseModel.modelIndexById(this.props.notes, noteId);
|
||||
const inc = keyCode === 38 ? -1 : +1;
|
||||
|
||||
noteIndex += inc;
|
||||
|
||||
if (noteIndex < 0) noteIndex = 0;
|
||||
if (noteIndex > this.props.notes.length - 1) noteIndex = this.props.notes.length - 1;
|
||||
|
||||
const newSelectedNote = this.props.notes[noteIndex];
|
||||
|
||||
this.props.dispatch({
|
||||
type: 'NOTE_SELECT',
|
||||
id: newSelectedNote.id,
|
||||
});
|
||||
|
||||
this.itemListRef.current.makeItemIndexVisible(noteIndex);
|
||||
|
||||
this.focusNoteId_(newSelectedNote.id);
|
||||
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
if (noteIds.length && (keyCode === 46 || (keyCode === 8 && event.metaKey))) { // DELETE / CMD+Backspace
|
||||
event.preventDefault();
|
||||
await NoteListUtils.confirmDeleteNotes(noteIds);
|
||||
}
|
||||
|
||||
if (noteIds.length && keyCode === 32) { // SPACE
|
||||
event.preventDefault();
|
||||
|
||||
const notes = BaseModel.modelsByIds(this.props.notes, noteIds);
|
||||
const todos = notes.filter(n => !!n.is_todo);
|
||||
if (!todos.length) return;
|
||||
|
||||
for (let i = 0; i < todos.length; i++) {
|
||||
const toggledTodo = Note.toggleTodoCompleted(todos[i]);
|
||||
await Note.save(toggledTodo);
|
||||
}
|
||||
|
||||
this.focusNoteId_(todos[0].id);
|
||||
}
|
||||
|
||||
if (keyCode === 9) { // TAB
|
||||
event.preventDefault();
|
||||
|
||||
if (event.shiftKey) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focusElement',
|
||||
target: 'sideBar',
|
||||
});
|
||||
} else {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focusElement',
|
||||
target: 'noteTitle',
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
focusNoteId_(noteId) {
|
||||
// - We need to focus the item manually otherwise focus might be lost when the
|
||||
// list is scrolled and items within it are being rebuilt.
|
||||
// - We need to use an interval because when leaving the arrow pressed, the rendering
|
||||
// of items might lag behind and so the ref is not yet available at this point.
|
||||
if (!this.itemAnchorRef(noteId)) {
|
||||
if (this.focusItemIID_) clearInterval(this.focusItemIID_);
|
||||
this.focusItemIID_ = setInterval(() => {
|
||||
if (this.itemAnchorRef(noteId)) {
|
||||
this.itemAnchorRef(noteId).focus();
|
||||
clearInterval(this.focusItemIID_)
|
||||
this.focusItemIID_ = null;
|
||||
}
|
||||
}, 10);
|
||||
} else {
|
||||
this.itemAnchorRef(noteId).focus();
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
if (this.focusItemIID_) {
|
||||
clearInterval(this.focusItemIID_);
|
||||
this.focusItemIID_ = null;
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const style = this.props.style;
|
||||
@@ -309,11 +398,13 @@ class NoteListComponent extends React.Component {
|
||||
|
||||
return (
|
||||
<ItemList
|
||||
ref={this.itemListRef}
|
||||
itemHeight={this.style().listItem.height}
|
||||
style={style}
|
||||
className={"note-list"}
|
||||
items={notes}
|
||||
itemRenderer={ (item) => { return this.itemRenderer(item, theme, style.width) } }
|
||||
itemRenderer={this.itemRenderer}
|
||||
onKeyDown={this.onKeyDown}
|
||||
></ItemList>
|
||||
);
|
||||
}
|
||||
@@ -329,6 +420,8 @@ const mapStateToProps = (state) => {
|
||||
notesParentType: state.notesParentType,
|
||||
searches: state.searches,
|
||||
selectedSearchId: state.selectedSearchId,
|
||||
watchedNoteFiles: state.watchedNoteFiles,
|
||||
windowCommand: state.windowCommand,
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -16,6 +16,8 @@ class NotePropertiesDialog extends React.Component {
|
||||
|
||||
this.okButton_click = this.okButton_click.bind(this);
|
||||
this.cancelButton_click = this.cancelButton_click.bind(this);
|
||||
this.onKeyDown = this.onKeyDown.bind(this);
|
||||
this.okButton = React.createRef();
|
||||
|
||||
this.state = {
|
||||
formNote: null,
|
||||
@@ -43,6 +45,12 @@ class NotePropertiesDialog extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
if (this.state.editedKey == null) {
|
||||
this.okButton.current.focus();
|
||||
}
|
||||
}
|
||||
|
||||
async loadNote(noteId) {
|
||||
if (!noteId) {
|
||||
this.setState({ formNote: null });
|
||||
@@ -184,6 +192,14 @@ class NotePropertiesDialog extends React.Component {
|
||||
this.closeDialog(false);
|
||||
}
|
||||
|
||||
onKeyDown(event) {
|
||||
if (event.keyCode === 13) {
|
||||
this.closeDialog(true);
|
||||
} else if (event.keyCode === 27) {
|
||||
this.closeDialog(false);
|
||||
}
|
||||
}
|
||||
|
||||
editPropertyButtonClick(key, initialValue) {
|
||||
this.setState({
|
||||
editedKey: key,
|
||||
@@ -222,6 +238,7 @@ class NotePropertiesDialog extends React.Component {
|
||||
|
||||
async cancelProperty() {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.okButton.current.focus();
|
||||
this.setState({
|
||||
editedKey: null,
|
||||
editedValue: null
|
||||
@@ -347,7 +364,17 @@ class NotePropertiesDialog extends React.Component {
|
||||
const formNote = this.state.formNote;
|
||||
|
||||
const buttonComps = [];
|
||||
buttonComps.push(<button key="ok" style={styles.button} onClick={this.okButton_click}>{_('Apply')}</button>);
|
||||
buttonComps.push(
|
||||
<button
|
||||
key="ok"
|
||||
style={styles.button}
|
||||
onClick={this.okButton_click}
|
||||
ref={this.okButton}
|
||||
onKeyDown={this.onKeyDown}
|
||||
>
|
||||
{_('Apply')}
|
||||
</button>
|
||||
);
|
||||
buttonComps.push(<button key="cancel" style={styles.button} onClick={this.cancelButton_click}>{_('Cancel')}</button>);
|
||||
|
||||
const noteComps = [];
|
||||
|
141
ElectronClient/app/gui/NoteSearchBar.jsx
Normal file
141
ElectronClient/app/gui/NoteSearchBar.jsx
Normal file
@@ -0,0 +1,141 @@
|
||||
const React = require('react');
|
||||
const { connect } = require('react-redux');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
|
||||
class NoteSearchBarComponent extends React.Component {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.state = {
|
||||
query: '',
|
||||
};
|
||||
|
||||
this.searchInput_change = this.searchInput_change.bind(this);
|
||||
this.searchInput_keyDown = this.searchInput_keyDown.bind(this);
|
||||
this.previousButton_click = this.previousButton_click.bind(this);
|
||||
this.nextButton_click = this.nextButton_click.bind(this);
|
||||
this.closeButton_click = this.closeButton_click.bind(this);
|
||||
}
|
||||
|
||||
style() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
let style = {
|
||||
root: Object.assign({}, theme.textStyle, {
|
||||
backgroundColor: theme.backgroundColor,
|
||||
color: theme.colorFaded,
|
||||
}),
|
||||
};
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.refs.searchInput.focus();
|
||||
}
|
||||
|
||||
buttonIconComponent(iconName, clickHandler) {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
const searchButton = {
|
||||
paddingLeft: 4,
|
||||
paddingRight: 4,
|
||||
paddingTop: 2,
|
||||
paddingBottom: 2,
|
||||
textDecoration: 'none',
|
||||
marginRight: 5,
|
||||
};
|
||||
|
||||
const iconStyle = {
|
||||
display: 'flex',
|
||||
fontSize: Math.round(theme.fontSize) * 1.2,
|
||||
color: theme.color,
|
||||
};
|
||||
|
||||
const icon = <i style={iconStyle} className={"fa " + iconName}></i>
|
||||
|
||||
return (
|
||||
<a
|
||||
href="#"
|
||||
style={searchButton}
|
||||
onClick={clickHandler}
|
||||
>{icon}</a>
|
||||
);
|
||||
}
|
||||
|
||||
searchInput_change(event) {
|
||||
const query = event.currentTarget.value;
|
||||
this.setState({ query: query });
|
||||
this.triggerOnChange(query);
|
||||
}
|
||||
|
||||
searchInput_keyDown(event) {
|
||||
if (event.keyCode === 13) { // ENTER
|
||||
event.preventDefault();
|
||||
|
||||
if (!event.shiftKey) {
|
||||
if (this.props.onNext) this.props.onNext();
|
||||
} else {
|
||||
if (this.props.onPrevious) this.props.onPrevious();
|
||||
}
|
||||
}
|
||||
|
||||
if (event.keyCode === 27) { // ESCAPE
|
||||
event.preventDefault();
|
||||
|
||||
if (this.props.onClose) this.props.onClose();
|
||||
}
|
||||
}
|
||||
|
||||
previousButton_click(event) {
|
||||
if (this.props.onPrevious) this.props.onPrevious();
|
||||
}
|
||||
|
||||
nextButton_click(event) {
|
||||
if (this.props.onNext) this.props.onNext();
|
||||
}
|
||||
|
||||
closeButton_click(event) {
|
||||
if (this.props.onClose) this.props.onClose();
|
||||
}
|
||||
|
||||
triggerOnChange(query) {
|
||||
if (this.props.onChange) this.props.onChange(query);
|
||||
}
|
||||
|
||||
focus() {
|
||||
this.refs.searchInput.focus();
|
||||
}
|
||||
|
||||
render() {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
const closeButton = this.buttonIconComponent('fa-times', this.closeButton_click);
|
||||
const previousButton = this.buttonIconComponent('fa-chevron-up', this.previousButton_click);
|
||||
const nextButton = this.buttonIconComponent('fa-chevron-down', this.nextButton_click);
|
||||
|
||||
return (
|
||||
<div style={this.props.style}>
|
||||
<div style={{display: 'flex', flexDirection: 'row', alignItems: 'center' }}>
|
||||
{ closeButton }
|
||||
<input placeholder={_('Search...')} value={this.state.query} onChange={this.searchInput_change} onKeyDown={this.searchInput_keyDown} ref="searchInput" type="text" style={{width: 200, marginRight: 5}}></input>
|
||||
{ nextButton }
|
||||
{ previousButton }
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
return {
|
||||
theme: state.settings.theme,
|
||||
};
|
||||
};
|
||||
|
||||
const NoteSearchBar = connect(mapStateToProps, null, null, { withRef: true })(NoteSearchBarComponent);
|
||||
|
||||
module.exports = NoteSearchBar;
|
@@ -6,7 +6,7 @@ const Search = require('lib/models/Search.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { IconButton } = require('./IconButton.min.js');
|
||||
const { urlDecode, escapeHtml } = require('lib/string-utils');
|
||||
const { urlDecode, escapeHtml, pregQuote, scriptType } = require('lib/string-utils');
|
||||
const Toolbar = require('./Toolbar.min.js');
|
||||
const TagList = require('./TagList.min.js');
|
||||
const { connect } = require('react-redux');
|
||||
@@ -25,13 +25,18 @@ const fs = require('fs-extra');
|
||||
const md5 = require('md5');
|
||||
const mimeUtils = require('lib/mime-utils.js').mime;
|
||||
const ArrayUtils = require('lib/ArrayUtils');
|
||||
const ObjectUtils = require('lib/ObjectUtils');
|
||||
const urlUtils = require('lib/urlUtils');
|
||||
const dialogs = require('./dialogs');
|
||||
const NoteListUtils = require('./utils/NoteListUtils');
|
||||
const NoteSearchBar = require('./NoteSearchBar.min.js');
|
||||
const markdownUtils = require('lib/markdownUtils');
|
||||
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
|
||||
const ResourceFetcher = require('lib/services/ResourceFetcher');
|
||||
const { toSystemSlashes, safeFilename } = require('lib/path-utils');
|
||||
const { clipboard } = require('electron');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const NoteTextViewer = require('./NoteTextViewer.min');
|
||||
|
||||
require('brace/mode/markdown');
|
||||
// https://ace.c9.io/build/kitchen-sink.html
|
||||
@@ -39,11 +44,19 @@ require('brace/mode/markdown');
|
||||
require('brace/theme/chrome');
|
||||
require('brace/theme/twilight');
|
||||
|
||||
const NOTE_TAG_BAR_FEATURE_ENABLED = false;
|
||||
|
||||
class NoteTextComponent extends React.Component {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.localSearchDefaultState = {
|
||||
query: '',
|
||||
selectedIndex: 0,
|
||||
resultCount: 0,
|
||||
};
|
||||
|
||||
this.state = {
|
||||
note: null,
|
||||
noteMetadata: '',
|
||||
@@ -63,8 +76,12 @@ class NoteTextComponent extends React.Component {
|
||||
newAndNoTitleChangeNoteId: null,
|
||||
bodyHtml: '',
|
||||
lastKeys: [],
|
||||
showLocalSearch: false,
|
||||
localSearch: Object.assign({}, this.localSearchDefaultState),
|
||||
};
|
||||
|
||||
this.webviewRef_ = React.createRef();
|
||||
|
||||
this.lastLoadedNoteId_ = null;
|
||||
|
||||
this.webviewListeners_ = null;
|
||||
@@ -72,8 +89,10 @@ class NoteTextComponent extends React.Component {
|
||||
this.scheduleSaveTimeout_ = null;
|
||||
this.restoreScrollTop_ = null;
|
||||
this.lastSetHtml_ = '';
|
||||
this.lastSetMarkers_ = [];
|
||||
this.lastSetMarkers_ = '';
|
||||
this.lastSetMarkersOptions_ = {};
|
||||
this.selectionRange_ = null;
|
||||
this.noteSearchBar_ = React.createRef();
|
||||
|
||||
// Complicated but reliable method to get editor content height
|
||||
// https://github.com/ajaxorg/ace/issues/2046
|
||||
@@ -88,9 +107,9 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
this.onAlarmChange_ = (event) => { if (event.noteId === this.props.noteId) this.reloadNote(this.props); }
|
||||
this.onNoteTypeToggle_ = (event) => { if (event.noteId === this.props.noteId) this.reloadNote(this.props); }
|
||||
this.onTodoToggle_ = (event) => { if (event.noteId === this.props.noteId) this.reloadNote(this.props); }
|
||||
this.onAlarmChange_ = (event) => { if (event.noteId === this.props.noteId) this.scheduleReloadNote(this.props); }
|
||||
this.onNoteTypeToggle_ = (event) => { if (event.noteId === this.props.noteId) this.scheduleReloadNote(this.props); }
|
||||
this.onTodoToggle_ = (event) => { if (event.noteId === this.props.noteId) this.scheduleReloadNote(this.props); }
|
||||
|
||||
this.onEditorPaste_ = async (event = null) => {
|
||||
const formats = clipboard.availableFormats();
|
||||
@@ -199,7 +218,7 @@ class NoteTextComponent extends React.Component {
|
||||
this.externalEditWatcher_noteChange = (event) => {
|
||||
if (!this.state.note || !this.state.note.id) return;
|
||||
if (event.id === this.state.note.id) {
|
||||
this.reloadNote(this.props);
|
||||
this.scheduleReloadNote(this.props);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,6 +231,40 @@ class NoteTextComponent extends React.Component {
|
||||
this.updateHtml(this.state.note.body);
|
||||
}
|
||||
}
|
||||
|
||||
this.noteSearchBar_change = (query) => {
|
||||
this.setState({ localSearch: {
|
||||
query: query,
|
||||
selectedIndex: 0,
|
||||
}});
|
||||
}
|
||||
|
||||
const noteSearchBarNextPrevious = (inc) => {
|
||||
const ls = Object.assign({}, this.state.localSearch);
|
||||
ls.selectedIndex += inc;
|
||||
if (ls.selectedIndex < 0) ls.selectedIndex = ls.resultCount - 1;
|
||||
if (ls.selectedIndex >= ls.resultCount) ls.selectedIndex = 0;
|
||||
|
||||
this.setState({ localSearch: ls });
|
||||
}
|
||||
|
||||
this.noteSearchBar_next = () => {
|
||||
noteSearchBarNextPrevious(+1);
|
||||
}
|
||||
|
||||
this.noteSearchBar_previous = () => {
|
||||
noteSearchBarNextPrevious(-1);
|
||||
}
|
||||
|
||||
this.noteSearchBar_close = () => {
|
||||
this.setState({
|
||||
showLocalSearch: false,
|
||||
});
|
||||
}
|
||||
|
||||
this.titleField_keyDown = this.titleField_keyDown.bind(this);
|
||||
this.webview_ipcMessage = this.webview_ipcMessage.bind(this);
|
||||
this.webview_domReady = this.webview_domReady.bind(this);
|
||||
}
|
||||
|
||||
// Note:
|
||||
@@ -305,21 +358,20 @@ class NoteTextComponent extends React.Component {
|
||||
eventManager.on('todoToggle', this.onTodoToggle_);
|
||||
|
||||
ResourceFetcher.instance().on('downloadComplete', this.resourceFetcher_downloadComplete);
|
||||
ExternalEditWatcher.instance().on('noteChange', this.externalEditWatcher_noteChange);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.saveIfNeeded();
|
||||
|
||||
this.mdToHtml_ = null;
|
||||
this.destroyWebview();
|
||||
|
||||
eventManager.removeListener('alarmChange', this.onAlarmChange_);
|
||||
eventManager.removeListener('noteTypeToggle', this.onNoteTypeToggle_);
|
||||
eventManager.removeListener('todoToggle', this.onTodoToggle_);
|
||||
|
||||
ResourceFetcher.instance().off('downloadComplete', this.resourceFetcher_downloadComplete);
|
||||
|
||||
this.destroyExternalEditWatcher();
|
||||
ExternalEditWatcher.instance().off('noteChange', this.externalEditWatcher_noteChange);
|
||||
}
|
||||
|
||||
async saveIfNeeded(saveIfNewNote = false) {
|
||||
@@ -332,7 +384,7 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
await shared.saveNoteButton_press(this);
|
||||
|
||||
this.externalEditWatcherUpdateNoteFile(this.state.note);
|
||||
ExternalEditWatcher.instance().updateNoteFile(this.state.note);
|
||||
}
|
||||
|
||||
async saveOneProperty(name, value) {
|
||||
@@ -353,6 +405,20 @@ class NoteTextComponent extends React.Component {
|
||||
}, 500);
|
||||
}
|
||||
|
||||
scheduleReloadNote(props, options = null) {
|
||||
if (this.scheduleReloadNoteIID_) {
|
||||
clearTimeout(this.scheduleReloadNoteIID_);
|
||||
this.scheduleReloadNoteIID_ = null;
|
||||
}
|
||||
|
||||
this.scheduleReloadNoteIID_ = setTimeout(() => {
|
||||
this.reloadNote(props, options);
|
||||
}, 10);
|
||||
}
|
||||
|
||||
// Generally, reloadNote() should not be called directly so that it's not called multiple times
|
||||
// from multiple places within a short interval of time. Instead use scheduleReloadNote() to
|
||||
// delay reloading a bit and make sure that only one reload operation is performed.
|
||||
async reloadNote(props, options = null) {
|
||||
if (!options) options = {};
|
||||
if (!('noReloadIfLocalChanges' in options)) options.noReloadIfLocalChanges = false;
|
||||
@@ -367,13 +433,17 @@ class NoteTextComponent extends React.Component {
|
||||
let loadingNewNote = true;
|
||||
let parentFolder = null;
|
||||
let noteTags = [];
|
||||
let scrollPercent = 0;
|
||||
|
||||
if (props.newNote) {
|
||||
note = Object.assign({}, props.newNote);
|
||||
this.lastLoadedNoteId_ = null;
|
||||
this.externalEditWatcherStopWatchingAll();
|
||||
} else {
|
||||
noteId = props.noteId;
|
||||
|
||||
scrollPercent = this.props.lastEditorScrollPercents[noteId];
|
||||
if (!scrollPercent) scrollPercent = 0;
|
||||
|
||||
loadingNewNote = stateNoteId !== noteId;
|
||||
noteTags = await Tag.tagsByNoteId(noteId);
|
||||
this.lastLoadedNoteId_ = noteId;
|
||||
@@ -394,12 +464,10 @@ class NoteTextComponent extends React.Component {
|
||||
// If we are loading nothing (noteId == null), make sure to
|
||||
// set webviewReady to false too because the webview component
|
||||
// is going to be removed in render().
|
||||
const webviewReady = this.webview_ && this.state.webviewReady && (noteId || props.newNote);
|
||||
const webviewReady = !!this.webviewRef_.current && this.state.webviewReady && (!!noteId || !!props.newNote);
|
||||
|
||||
// Scroll back to top when loading new note
|
||||
if (loadingNewNote) {
|
||||
this.externalEditWatcherStopWatchingAll();
|
||||
|
||||
this.editorMaxScrollTop_ = 0;
|
||||
|
||||
// HACK: To go around a bug in Ace editor, we first set the scroll position to 1
|
||||
@@ -413,11 +481,13 @@ class NoteTextComponent extends React.Component {
|
||||
if (this.props.newNote) {
|
||||
const focusSettingName = !!note.is_todo ? 'newTodoFocus' : 'newNoteFocus';
|
||||
|
||||
if (Setting.value(focusSettingName) === 'title') {
|
||||
if (this.titleField_) this.titleField_.focus();
|
||||
} else {
|
||||
if (this.editor_) this.editor_.editor.focus();
|
||||
}
|
||||
requestAnimationFrame(() => {
|
||||
if (Setting.value(focusSettingName) === 'title') {
|
||||
if (this.titleField_) this.titleField_.focus();
|
||||
} else {
|
||||
if (this.editor_) this.editor_.editor.focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (this.editor_) {
|
||||
@@ -439,11 +509,15 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
this.editor_.editor.clearSelection();
|
||||
this.editor_.editor.moveCursorTo(0,0);
|
||||
|
||||
setTimeout(() => {
|
||||
this.setEditorPercentScroll(scrollPercent ? scrollPercent : 0);
|
||||
this.setViewerPercentScroll(scrollPercent ? scrollPercent : 0);
|
||||
}, 10);
|
||||
}
|
||||
}
|
||||
|
||||
if (note)
|
||||
{
|
||||
if (note) {
|
||||
parentFolder = Folder.byId(props.folders, note.parent_id);
|
||||
}
|
||||
|
||||
@@ -462,8 +536,14 @@ class NoteTextComponent extends React.Component {
|
||||
newState.newAndNoTitleChangeNoteId = null;
|
||||
}
|
||||
|
||||
if (!note || loadingNewNote) {
|
||||
newState.showLocalSearch = false;
|
||||
newState.localSearch = Object.assign({}, this.localSearchDefaultState);
|
||||
}
|
||||
|
||||
this.lastSetHtml_ = '';
|
||||
this.lastSetMarkers_ = [];
|
||||
this.lastSetMarkers_ = '';
|
||||
this.lastSetMarkersOptions_ = {};
|
||||
|
||||
this.setState(newState);
|
||||
|
||||
@@ -474,29 +554,31 @@ class NoteTextComponent extends React.Component {
|
||||
// anywhere in the app. Thus it's not possible simple to load the tags here (as we won't have a way to know if they're updated afterwards).
|
||||
// Perhaps a better way would be to move that code in the middleware, check for TAGS_DELETE, TAGS_UPDATE, etc. actions and update the
|
||||
// selected note tags accordingly.
|
||||
if (!this.props.newNote) {
|
||||
this.props.dispatch({
|
||||
type: "SET_NOTE_TAGS",
|
||||
items: noteTags,
|
||||
});
|
||||
if (NOTE_TAG_BAR_FEATURE_ENABLED) {
|
||||
if (!this.props.newNote) {
|
||||
this.props.dispatch({
|
||||
type: "SET_NOTE_TAGS",
|
||||
items: noteTags,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
this.updateHtml(newState.note ? newState.note.body : '');
|
||||
}
|
||||
|
||||
async componentWillReceiveProps(nextProps) {
|
||||
if (nextProps.newNote) {
|
||||
await this.reloadNote(nextProps);
|
||||
} else if ('noteId' in nextProps && nextProps.noteId !== this.props.noteId) {
|
||||
await this.reloadNote(nextProps);
|
||||
if (this.props.newNote !== nextProps.newNote && nextProps.newNote) {
|
||||
await this.scheduleReloadNote(nextProps);
|
||||
} else if (('noteId' in nextProps) && nextProps.noteId !== this.props.noteId) {
|
||||
await this.scheduleReloadNote(nextProps);
|
||||
} else if ('noteTags' in nextProps && this.areNoteTagsModified(nextProps.noteTags, this.state.noteTags)) {
|
||||
this.setState({
|
||||
noteTags: nextProps.noteTags
|
||||
});
|
||||
}
|
||||
|
||||
if ('syncStarted' in nextProps && !nextProps.syncStarted && !this.isModified()) {
|
||||
await this.reloadNote(nextProps, { noReloadIfLocalChanges: true });
|
||||
if ((nextProps.syncStarted !== this.props.syncStarted) && ('syncStarted' in nextProps) && !nextProps.syncStarted && !this.isModified()) {
|
||||
await this.scheduleReloadNote(nextProps, { noReloadIfLocalChanges: true });
|
||||
}
|
||||
|
||||
if (nextProps.windowCommand) {
|
||||
@@ -509,6 +591,8 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
|
||||
areNoteTagsModified(newTags, oldTags) {
|
||||
if (!NOTE_TAG_BAR_FEATURE_ENABLED) return false;
|
||||
|
||||
if (!oldTags) return true;
|
||||
|
||||
if (newTags.length !== oldTags.length) return true;
|
||||
@@ -562,6 +646,10 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
const newBody = this.mdToHtml_.handleCheckboxClick(msg, this.state.note.body);
|
||||
this.saveOneProperty('body', newBody);
|
||||
} else if (msg === 'setMarkerCount') {
|
||||
const ls = Object.assign({}, this.state.localSearch);
|
||||
ls.resultCount = arg0;
|
||||
this.setState({ localSearch: ls });
|
||||
} else if (msg === 'percentScroll') {
|
||||
this.ignoreNextEditorScroll_ = true;
|
||||
this.setEditorPercentScroll(arg0);
|
||||
@@ -623,6 +711,10 @@ class NoteTextComponent extends React.Component {
|
||||
type: "FOLDER_AND_NOTE_SELECT",
|
||||
folderId: item.parent_id,
|
||||
noteId: item.id,
|
||||
historyNoteAction: {
|
||||
id: this.state.note.id,
|
||||
parent_id: this.state.note.parent_id,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
throw new Error('Unsupported item type: ' + item.type_);
|
||||
@@ -655,11 +747,31 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
|
||||
setEditorPercentScroll(p) {
|
||||
const noteId = this.props.noteId;
|
||||
|
||||
if (noteId) {
|
||||
this.props.dispatch({
|
||||
type: 'EDITOR_SCROLL_PERCENT_SET',
|
||||
noteId: noteId,
|
||||
percent: p,
|
||||
});
|
||||
}
|
||||
|
||||
this.editorSetScrollTop(p * this.editorMaxScroll());
|
||||
}
|
||||
|
||||
setViewerPercentScroll(p) {
|
||||
this.webview_.send('setPercentScroll', p);
|
||||
const noteId = this.props.noteId;
|
||||
|
||||
if (noteId) {
|
||||
this.props.dispatch({
|
||||
type: 'EDITOR_SCROLL_PERCENT_SET',
|
||||
noteId: noteId,
|
||||
percent: p,
|
||||
});
|
||||
}
|
||||
|
||||
if (this.webviewRef_.current) this.webviewRef_.current.wrappedInstance.send('setPercentScroll', p);
|
||||
}
|
||||
|
||||
editor_scroll() {
|
||||
@@ -669,29 +781,20 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
|
||||
const m = this.editorMaxScroll();
|
||||
this.setViewerPercentScroll(m ? this.editorScrollTop() / m : 0);
|
||||
const percent = m ? this.editorScrollTop() / m : 0;
|
||||
|
||||
this.setViewerPercentScroll(percent);
|
||||
}
|
||||
|
||||
webview_domReady() {
|
||||
if (!this.webview_) return;
|
||||
if (!this.webviewRef_.current) return;
|
||||
|
||||
this.setState({
|
||||
webviewReady: true,
|
||||
});
|
||||
|
||||
// if (Setting.value('env') === 'dev') this.webview_.openDevTools();
|
||||
}
|
||||
|
||||
webview_ref(element) {
|
||||
if (this.webview_) {
|
||||
if (this.webview_ === element) return;
|
||||
this.destroyWebview();
|
||||
}
|
||||
|
||||
if (!element) {
|
||||
this.destroyWebview();
|
||||
} else {
|
||||
this.initWebview(element);
|
||||
if (Setting.value('env') === 'dev') {
|
||||
// this.webviewRef_.current.wrappedInstance.openDevTools();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -767,35 +870,6 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
initWebview(wv) {
|
||||
if (!this.webviewListeners_) {
|
||||
this.webviewListeners_ = {
|
||||
'dom-ready': this.webview_domReady.bind(this),
|
||||
'ipc-message': this.webview_ipcMessage.bind(this),
|
||||
};
|
||||
}
|
||||
|
||||
for (let n in this.webviewListeners_) {
|
||||
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
|
||||
const fn = this.webviewListeners_[n];
|
||||
wv.addEventListener(n, fn);
|
||||
}
|
||||
|
||||
this.webview_ = wv;
|
||||
}
|
||||
|
||||
destroyWebview() {
|
||||
if (!this.webview_) return;
|
||||
|
||||
for (let n in this.webviewListeners_) {
|
||||
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
|
||||
const fn = this.webviewListeners_[n];
|
||||
this.webview_.removeEventListener(n, fn);
|
||||
}
|
||||
|
||||
this.webview_ = null;
|
||||
}
|
||||
|
||||
aceEditor_change(body) {
|
||||
shared.noteComponent_change(this, 'body', body);
|
||||
this.scheduleHtmlUpdate();
|
||||
@@ -817,7 +891,10 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
updateHtml(body = null) {
|
||||
updateHtml(body = null, options = null) {
|
||||
if (!options) options = {};
|
||||
if (!('useCustomCss' in options)) options.useCustomCss = true;
|
||||
|
||||
const mdOptions = {
|
||||
onResourceLoaded: () => {
|
||||
if (this.resourceLoadedTimeoutId_) {
|
||||
@@ -838,7 +915,6 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
let bodyToRender = body;
|
||||
if (bodyToRender === null) bodyToRender = this.state.note && this.state.note.body ? this.state.note.body : '';
|
||||
bodyToRender = '<style>' + this.props.customCss + '</style>\n' + bodyToRender;
|
||||
let bodyHtml = '';
|
||||
|
||||
const visiblePanes = this.props.visiblePanes || ['editor', 'viewer'];
|
||||
@@ -848,38 +924,100 @@ class NoteTextComponent extends React.Component {
|
||||
bodyToRender = '*' + _('This note has no content. Click on "%s" to toggle the editor and edit the note.', _('Layout')) + '*';
|
||||
}
|
||||
|
||||
if (options.useCustomCss) bodyToRender = '<style>' + this.props.customCss + '</style>\n' + bodyToRender;
|
||||
|
||||
bodyHtml = this.mdToHtml().render(bodyToRender, theme, mdOptions);
|
||||
|
||||
this.setState({ bodyHtml: bodyHtml });
|
||||
}
|
||||
|
||||
titleField_keyDown(event) {
|
||||
const keyCode = event.keyCode;
|
||||
|
||||
if (keyCode === 9) { // TAB
|
||||
event.preventDefault();
|
||||
|
||||
if (event.shiftKey) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focusElement',
|
||||
target: 'noteList',
|
||||
});
|
||||
} else {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focusElement',
|
||||
target: 'noteBody',
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async doCommand(command) {
|
||||
if (!command || !this.state.note) return;
|
||||
if (!command) return;
|
||||
|
||||
let commandProcessed = true;
|
||||
let fn = null;
|
||||
|
||||
if (command.name === 'exportPdf' && this.webview_) {
|
||||
this.commandSavePdf();
|
||||
} else if (command.name === 'print' && this.webview_) {
|
||||
this.webview_.print();
|
||||
} else if (command.name === 'textBold') {
|
||||
this.commandTextBold();
|
||||
} else if (command.name === 'textItalic') {
|
||||
this.commandTextItalic();
|
||||
} else if (command.name === 'insertDateTime' ) {
|
||||
this.commandDateTime();
|
||||
} else if (command.name === 'commandStartExternalEditing') {
|
||||
this.commandStartExternalEditing();
|
||||
if (command.name === 'exportPdf') {
|
||||
fn = this.commandSavePdf;
|
||||
} else if (command.name === 'print') {
|
||||
fn = this.commandPrint;
|
||||
}
|
||||
|
||||
if (this.state.note) {
|
||||
if (command.name === 'textBold') {
|
||||
fn = this.commandTextBold;
|
||||
} else if (command.name === 'textItalic') {
|
||||
fn = this.commandTextItalic;
|
||||
} else if (command.name === 'textLink') {
|
||||
fn = this.commandTextLink;
|
||||
} else if (command.name === 'insertDateTime') {
|
||||
fn = this.commandDateTime;
|
||||
} else if (command.name === 'commandStartExternalEditing') {
|
||||
fn = this.commandStartExternalEditing;
|
||||
} else if (command.name === 'showLocalSearch') {
|
||||
fn = this.commandShowLocalSearch;
|
||||
}
|
||||
}
|
||||
|
||||
if (command.name === 'focusElement' && command.target === 'noteTitle') {
|
||||
fn = () => {
|
||||
if (!this.titleField_) return;
|
||||
this.titleField_.focus();
|
||||
}
|
||||
}
|
||||
|
||||
if (command.name === 'focusElement' && command.target === 'noteBody') {
|
||||
fn = () => {
|
||||
if (!this.editor_) return;
|
||||
this.editor_.editor.focus();
|
||||
}
|
||||
}
|
||||
|
||||
if (!fn) return;
|
||||
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: null,
|
||||
});
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
fn = fn.bind(this);
|
||||
fn();
|
||||
});
|
||||
}
|
||||
|
||||
commandShowLocalSearch() {
|
||||
if (this.state.showLocalSearch) {
|
||||
this.noteSearchBar_.current.wrappedInstance.focus();
|
||||
} else {
|
||||
commandProcessed = false;
|
||||
this.setState({ showLocalSearch: true });
|
||||
}
|
||||
|
||||
if (commandProcessed) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: null,
|
||||
});
|
||||
}
|
||||
this.props.dispatch({
|
||||
type: 'NOTE_VISIBLE_PANES_SET',
|
||||
panes: ['editor', 'viewer'],
|
||||
});
|
||||
}
|
||||
|
||||
async commandAttachFile(filePaths = null) {
|
||||
@@ -924,80 +1062,80 @@ class NoteTextComponent extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
commandSavePdf() {
|
||||
const path = bridge().showSaveDialog({
|
||||
filters: [{ name: _('PDF File'), extensions: ['pdf']}],
|
||||
defaultPath: safeFilename(this.state.note.title),
|
||||
});
|
||||
printTo_(target, options) {
|
||||
if (this.props.selectedNoteIds.length !== 1 || !this.webviewRef_.current) {
|
||||
throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
|
||||
}
|
||||
|
||||
if (path) {
|
||||
// Temporarily add a <h2> title in the webview
|
||||
const newHtml = this.insertHtmlHeading_(this.lastSetHtml_, this.state.note.title);
|
||||
this.webview_.send('setHtml', newHtml);
|
||||
const previousBody = this.state.note.body;
|
||||
const tempBody = "# " + this.state.note.title + "\n\n" + previousBody;
|
||||
|
||||
const previousTheme = Setting.value('theme');
|
||||
Setting.setValue('theme', Setting.THEME_LIGHT);
|
||||
this.lastSetHtml_ = '';
|
||||
this.updateHtml(tempBody, { useCustomCss: false });
|
||||
this.forceUpdate();
|
||||
|
||||
const restoreSettings = () => {
|
||||
Setting.setValue('theme', previousTheme);
|
||||
this.lastSetHtml_ = '';
|
||||
this.updateHtml(previousBody);
|
||||
this.forceUpdate();
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
if (target === 'pdf') {
|
||||
this.webviewRef_.current.wrappedInstance.printToPDF({ printBackground: true }, (error, data) => {
|
||||
restoreSettings();
|
||||
|
||||
setTimeout(() => {
|
||||
this.webview_.printToPDF({}, (error, data) => {
|
||||
if (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
} else {
|
||||
shim.fsDriver().writeFile(path, data, 'buffer');
|
||||
shim.fsDriver().writeFile(options.path, data, 'buffer');
|
||||
}
|
||||
|
||||
// Refresh the webview, restoring the previous content
|
||||
this.lastSetHtml_ = '';
|
||||
this.forceUpdate();
|
||||
});
|
||||
}, 100);
|
||||
} else if (target === 'printer') {
|
||||
this.webviewRef_.current.wrappedInstance.print({ printBackground: true });
|
||||
restoreSettings();
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
|
||||
commandSavePdf() {
|
||||
try {
|
||||
if (!this.state.note) throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
|
||||
|
||||
const path = bridge().showSaveDialog({
|
||||
filters: [{ name: _('PDF File'), extensions: ['pdf']}],
|
||||
defaultPath: safeFilename(this.state.note.title),
|
||||
});
|
||||
|
||||
if (!path) return;
|
||||
|
||||
this.printTo_('pdf', { path: path });
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
insertHtmlHeading_(s, heading) {
|
||||
const tag = 'h2';
|
||||
const marker = '<!-- START_OF_DOCUMENT -->'
|
||||
let splitStyle = s.split(marker);
|
||||
const index = splitStyle.length > 1 ? 1 : 0;
|
||||
let toInsert = escapeHtml(heading);
|
||||
toInsert = '<' + tag + '>' + toInsert + '</' + tag + '>';
|
||||
splitStyle[index] = toInsert + splitStyle[index];
|
||||
return splitStyle.join(marker);
|
||||
}
|
||||
|
||||
externalEditWatcher() {
|
||||
if (!this.externalEditWatcher_) {
|
||||
this.externalEditWatcher_ = new ExternalEditWatcher((action) => { return this.props.dispatch(action) });
|
||||
this.externalEditWatcher_.setLogger(reg.logger());
|
||||
this.externalEditWatcher_.on('noteChange', this.externalEditWatcher_noteChange);
|
||||
}
|
||||
|
||||
return this.externalEditWatcher_;
|
||||
}
|
||||
|
||||
externalEditWatcherUpdateNoteFile(note) {
|
||||
if (this.externalEditWatcher_) this.externalEditWatcher().updateNoteFile(note);
|
||||
}
|
||||
|
||||
externalEditWatcherStopWatchingAll() {
|
||||
if (this.externalEditWatcher_) this.externalEditWatcher().stopWatchingAll();
|
||||
}
|
||||
|
||||
destroyExternalEditWatcher() {
|
||||
if (!this.externalEditWatcher_) return;
|
||||
|
||||
this.externalEditWatcher_.off('noteChange', this.externalEditWatcher_noteChange);
|
||||
this.externalEditWatcher_.stopWatchingAll();
|
||||
this.externalEditWatcher_ = null;
|
||||
commandPrint() {
|
||||
try {
|
||||
this.printTo_('printer');
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
async commandStartExternalEditing() {
|
||||
try {
|
||||
await this.externalEditWatcher().openAndWatch(this.state.note);
|
||||
await ExternalEditWatcher.instance().openAndWatch(this.state.note);
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(_('Error opening note in editor: %s', error.message));
|
||||
}
|
||||
}
|
||||
|
||||
async commandStopExternalEditing() {
|
||||
this.externalEditWatcherStopWatchingAll();
|
||||
ExternalEditWatcher.instance().stopWatching(this.state.note.id);
|
||||
}
|
||||
|
||||
async commandSetTags() {
|
||||
@@ -1241,6 +1379,25 @@ class NoteTextComponent extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
if (this.props.historyNotes.length) {
|
||||
toolbarItems.push({
|
||||
tooltip: _('Back'),
|
||||
iconName: 'fa-arrow-left',
|
||||
onClick: () => {
|
||||
if (!this.props.historyNotes.length) return;
|
||||
|
||||
const lastItem = this.props.historyNotes[this.props.historyNotes.length - 1];
|
||||
|
||||
this.props.dispatch({
|
||||
type: "FOLDER_AND_NOTE_SELECT",
|
||||
folderId: lastItem.parent_id,
|
||||
noteId: lastItem.id,
|
||||
historyNoteAction: 'pop',
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
toolbarItems.push({
|
||||
tooltip: _('Bold'),
|
||||
iconName: 'fa-bold',
|
||||
@@ -1376,6 +1533,61 @@ class NoteTextComponent extends React.Component {
|
||||
return toolbarItems;
|
||||
}
|
||||
|
||||
renderNoNotes(rootStyle) {
|
||||
const emptyDivStyle = Object.assign({
|
||||
backgroundColor: 'black',
|
||||
opacity: 0.1,
|
||||
}, rootStyle);
|
||||
return <div style={emptyDivStyle}></div>
|
||||
}
|
||||
|
||||
renderMultiNotes(rootStyle) {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
const multiNotesButton_click = item => {
|
||||
if (item.submenu) {
|
||||
item.submenu.popup(bridge().window());
|
||||
} else {
|
||||
item.click();
|
||||
}
|
||||
}
|
||||
|
||||
const menu = NoteListUtils.makeContextMenu(this.props.selectedNoteIds, {
|
||||
notes: this.props.notes,
|
||||
dispatch: this.props.dispatch,
|
||||
});
|
||||
|
||||
const buttonStyle = Object.assign({}, theme.buttonStyle, {
|
||||
marginBottom: 10,
|
||||
});
|
||||
|
||||
const itemComps = [];
|
||||
const menuItems = menu.items;
|
||||
|
||||
for (let i = 0; i < menuItems.length; i++) {
|
||||
const item = menuItems[i];
|
||||
if (!item.enabled) continue;
|
||||
|
||||
itemComps.push(<button
|
||||
key={item.label}
|
||||
style={buttonStyle}
|
||||
onClick={() => multiNotesButton_click(item)}
|
||||
>{item.label}</button>);
|
||||
}
|
||||
|
||||
rootStyle = Object.assign({}, rootStyle, {
|
||||
paddingTop: rootStyle.paddingLeft,
|
||||
display: 'inline-flex',
|
||||
justifyContent: 'center',
|
||||
});
|
||||
|
||||
return (<div style={rootStyle}>
|
||||
<div style={{display: 'flex', flexDirection: 'column'}}>
|
||||
{itemComps}
|
||||
</div>
|
||||
</div>);
|
||||
}
|
||||
|
||||
render() {
|
||||
const style = this.props.style;
|
||||
const note = this.state.note;
|
||||
@@ -1395,12 +1607,10 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
const innerWidth = rootStyle.width - rootStyle.paddingLeft - rootStyle.paddingRight - borderWidth;
|
||||
|
||||
if (!note || !!note.encryption_applied) {
|
||||
const emptyDivStyle = Object.assign({
|
||||
backgroundColor: 'black',
|
||||
opacity: 0.1,
|
||||
}, rootStyle);
|
||||
return <div style={emptyDivStyle}></div>
|
||||
if (this.props.selectedNoteIds.length > 1) {
|
||||
return this.renderMultiNotes(rootStyle);
|
||||
} else if (!note || !!note.encryption_applied) { //|| (note && !this.props.newNote && this.props.noteId && note.id !== this.props.noteId)) { // note.id !== props.noteId is when the note has not been loaded yet, and the previous one is still in the state
|
||||
return this.renderNoNotes(rootStyle);
|
||||
}
|
||||
|
||||
const titleBarStyle = {
|
||||
@@ -1437,8 +1647,18 @@ class NoteTextComponent extends React.Component {
|
||||
height: 30
|
||||
};
|
||||
|
||||
const bottomRowHeight = rootStyle.height - titleBarStyle.height - titleBarStyle.marginBottom - titleBarStyle.marginTop - theme.toolbarHeight - tagStyle.height - tagStyle.marginBottom;
|
||||
const searchBarHeight = this.state.showLocalSearch ? 35 : 0;
|
||||
|
||||
let bottomRowHeight = 0;
|
||||
if (NOTE_TAG_BAR_FEATURE_ENABLED) {
|
||||
bottomRowHeight = rootStyle.height - titleBarStyle.height - titleBarStyle.marginBottom - titleBarStyle.marginTop - theme.toolbarHeight - tagStyle.height - tagStyle.marginBottom;
|
||||
} else {
|
||||
toolbarStyle.marginBottom = 10;
|
||||
bottomRowHeight = rootStyle.height - titleBarStyle.height - titleBarStyle.marginBottom - titleBarStyle.marginTop - theme.toolbarHeight - toolbarStyle.marginBottom;
|
||||
}
|
||||
|
||||
bottomRowHeight -= searchBarHeight;
|
||||
|
||||
const viewerStyle = {
|
||||
width: Math.floor(innerWidth / 2),
|
||||
height: bottomRowHeight,
|
||||
@@ -1458,7 +1678,7 @@ class NoteTextComponent extends React.Component {
|
||||
verticalAlign: 'top',
|
||||
paddingTop: paddingTop + 'px',
|
||||
lineHeight: theme.textAreaLineHeight + 'px',
|
||||
fontSize: theme.fontSize + 'px',
|
||||
fontSize: theme.editorFontSize + 'px',
|
||||
color: theme.color,
|
||||
backgroundColor: theme.backgroundColor,
|
||||
editorTheme: theme.editorTheme,
|
||||
@@ -1493,16 +1713,33 @@ class NoteTextComponent extends React.Component {
|
||||
const htmlHasChanged = this.lastSetHtml_ !== html;
|
||||
if (htmlHasChanged) {
|
||||
let options = {codeTheme: theme.codeThemeCss};
|
||||
this.webview_.send('setHtml', html, options);
|
||||
this.webviewRef_.current.wrappedInstance.send('setHtml', html, options);
|
||||
this.lastSetHtml_ = html;
|
||||
}
|
||||
|
||||
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
|
||||
const keywords = search ? Search.keywords(search.query_pattern) : [];
|
||||
let keywords = [];
|
||||
const markerOptions = {};
|
||||
|
||||
if (htmlHasChanged || !ArrayUtils.contentEquals(this.lastSetMarkers_, keywords)) {
|
||||
this.lastSetMarkers_ = [];
|
||||
this.webview_.send('setMarkers', keywords);
|
||||
if (this.state.showLocalSearch) {
|
||||
keywords = [{
|
||||
type: 'text',
|
||||
value: this.state.localSearch.query,
|
||||
accuracy: 'partially',
|
||||
}]
|
||||
markerOptions.selectedIndex = this.state.localSearch.selectedIndex;
|
||||
} else {
|
||||
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
|
||||
if (search) {
|
||||
const parsedQuery = SearchEngine.instance().parseQuery(search.query_pattern);
|
||||
keywords = SearchEngine.instance().allParsedQueryTerms(parsedQuery);
|
||||
}
|
||||
}
|
||||
|
||||
const keywordHash = JSON.stringify(keywords);
|
||||
if (htmlHasChanged || keywordHash !== this.lastSetMarkers_ || !ObjectUtils.fieldsEqual(this.lastSetMarkersOptions_, markerOptions)) {
|
||||
this.lastSetMarkers_ = keywordHash;
|
||||
this.lastSetMarkersOptions_ = Object.assign({}, markerOptions);
|
||||
this.webviewRef_.current.wrappedInstance.send('setMarkers', keywords, markerOptions);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1519,10 +1756,11 @@ class NoteTextComponent extends React.Component {
|
||||
style={titleEditorStyle}
|
||||
value={note && note.title ? note.title : ''}
|
||||
onChange={(event) => { this.title_changeText(event); }}
|
||||
onKeyDown={this.titleField_keyDown}
|
||||
placeholder={ this.props.newNote ? _('Creating new %s...', isTodo ? _('to-do') : _('note')) : '' }
|
||||
/>
|
||||
|
||||
const tagList = <TagList
|
||||
const tagList = !NOTE_TAG_BAR_FEATURE_ENABLED ? null : <TagList
|
||||
style={tagStyle}
|
||||
items={this.state.noteTags}
|
||||
/>;
|
||||
@@ -1533,32 +1771,13 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
const titleBarDate = <span style={Object.assign({}, theme.textStyle, {color: theme.colorFaded})}>{time.formatMsToLocal(note.user_updated_time)}</span>
|
||||
|
||||
const viewer = <webview
|
||||
style={viewerStyle}
|
||||
preload="gui/note-viewer/preload.js"
|
||||
src="gui/note-viewer/index.html"
|
||||
webpreferences="contextIsolation"
|
||||
ref={(elem) => { this.webview_ref(elem); } }
|
||||
const viewer = <NoteTextViewer
|
||||
ref={this.webviewRef_}
|
||||
viewerStyle={viewerStyle}
|
||||
onDomReady={this.webview_domReady}
|
||||
onIpcMessage={this.webview_ipcMessage}
|
||||
/>
|
||||
|
||||
// const markers = [{
|
||||
// startRow: 2,
|
||||
// startCol: 3,
|
||||
// endRow: 2,
|
||||
// endCol: 6,
|
||||
// type: 'text',
|
||||
// className: 'test-marker'
|
||||
// }];
|
||||
|
||||
// markers={markers}
|
||||
// editorProps={{$useWorker: false}}
|
||||
|
||||
// #note-editor .test-marker {
|
||||
// background-color: red;
|
||||
// color: yellow;
|
||||
// position: absolute;
|
||||
// }
|
||||
|
||||
const editorRootStyle = Object.assign({}, editorStyle);
|
||||
delete editorRootStyle.width;
|
||||
delete editorRootStyle.height;
|
||||
@@ -1580,6 +1799,7 @@ class NoteTextComponent extends React.Component {
|
||||
showPrintMargin={false}
|
||||
onSelectionChange={this.aceEditor_selectionChange}
|
||||
onFocus={this.aceEditor_focus}
|
||||
readOnly={visiblePanes.indexOf('editor') < 0}
|
||||
|
||||
// Disable warning: "Automatically scrolling cursor into view after
|
||||
// selection change this will be disabled in the next version set
|
||||
@@ -1590,6 +1810,17 @@ class NoteTextComponent extends React.Component {
|
||||
highlightActiveLine={false}
|
||||
/>
|
||||
|
||||
const noteSearchBarComp = !this.state.showLocalSearch ? null : (
|
||||
<NoteSearchBar
|
||||
ref={this.noteSearchBar_}
|
||||
style={{display: 'flex', height:searchBarHeight,width:innerWidth, borderTop: '1px solid ' + theme.dividerColor}}
|
||||
onChange={this.noteSearchBar_change}
|
||||
onNext={this.noteSearchBar_next}
|
||||
onPrevious={this.noteSearchBar_previous}
|
||||
onClose={this.noteSearchBar_close}
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<div style={rootStyle} onDrop={this.onDrop_}>
|
||||
<div style={titleBarStyle}>
|
||||
@@ -1601,6 +1832,8 @@ class NoteTextComponent extends React.Component {
|
||||
{ tagList }
|
||||
{ editor }
|
||||
{ viewer }
|
||||
<div style={{clear:'both'}}/>
|
||||
{ noteSearchBarComp }
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1610,6 +1843,8 @@ class NoteTextComponent extends React.Component {
|
||||
const mapStateToProps = (state) => {
|
||||
return {
|
||||
noteId: state.selectedNoteIds.length === 1 ? state.selectedNoteIds[0] : null,
|
||||
notes: state.notes,
|
||||
selectedNoteIds: state.selectedNoteIds,
|
||||
noteTags: state.selectedNoteTags,
|
||||
folderId: state.selectedFolderId,
|
||||
itemType: state.selectedItemType,
|
||||
@@ -1624,6 +1859,8 @@ const mapStateToProps = (state) => {
|
||||
selectedSearchId: state.selectedSearchId,
|
||||
watchedNoteFiles: state.watchedNoteFiles,
|
||||
customCss: state.customCss,
|
||||
lastEditorScrollPercents: state.lastEditorScrollPercents,
|
||||
historyNotes: state.historyNotes,
|
||||
};
|
||||
};
|
||||
|
||||
|
111
ElectronClient/app/gui/NoteTextViewer.jsx
Normal file
111
ElectronClient/app/gui/NoteTextViewer.jsx
Normal file
@@ -0,0 +1,111 @@
|
||||
const React = require('react');
|
||||
const { connect } = require('react-redux');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
|
||||
class NoteTextViewerComponent extends React.Component {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.initialized_ = false;
|
||||
|
||||
this.webviewRef_ = React.createRef();
|
||||
this.webviewListeners_ = null;
|
||||
|
||||
this.webview_domReady = this.webview_domReady.bind(this);
|
||||
this.webview_ipcMessage = this.webview_ipcMessage.bind(this);
|
||||
}
|
||||
|
||||
webview_domReady(event) {
|
||||
this.props.onDomReady(event);
|
||||
}
|
||||
|
||||
webview_ipcMessage(event) {
|
||||
this.props.onIpcMessage(event);
|
||||
}
|
||||
|
||||
initWebview() {
|
||||
const wv = this.webviewRef_.current;
|
||||
|
||||
if (!this.webviewListeners_) {
|
||||
this.webviewListeners_ = {
|
||||
'dom-ready': this.webview_domReady.bind(this),
|
||||
'ipc-message': this.webview_ipcMessage.bind(this),
|
||||
};
|
||||
}
|
||||
|
||||
for (let n in this.webviewListeners_) {
|
||||
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
|
||||
const fn = this.webviewListeners_[n];
|
||||
wv.addEventListener(n, fn);
|
||||
}
|
||||
}
|
||||
|
||||
destroyWebview() {
|
||||
const wv = this.webviewRef_.current;
|
||||
if (!wv || !this.initialized_) return;
|
||||
|
||||
for (let n in this.webviewListeners_) {
|
||||
if (!this.webviewListeners_.hasOwnProperty(n)) continue;
|
||||
const fn = this.webviewListeners_[n];
|
||||
wv.removeEventListener(n, fn);
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
if (!this.initialized_ && this.webviewRef_.current) {
|
||||
this.initWebview();
|
||||
this.initialized_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.destroyWebview();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// Wrap WebView functions
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
send(channel, arg0 = null, arg1 = null, arg2 = null, arg3 = null) {
|
||||
return this.webviewRef_.current.send(channel, arg0, arg1, arg2, arg3);
|
||||
}
|
||||
|
||||
printToPDF(options, callback) {
|
||||
return this.webviewRef_.current.printToPDF(options, callback);
|
||||
}
|
||||
|
||||
print(options = {}) {
|
||||
return this.webviewRef_.current.print(options);
|
||||
}
|
||||
|
||||
openDevTools() {
|
||||
return this.webviewRef_.current.openDevTools();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// Wrap WebView functions (END)
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
render() {
|
||||
return <webview
|
||||
ref={this.webviewRef_}
|
||||
style={this.props.viewerStyle}
|
||||
preload="gui/note-viewer/preload.js"
|
||||
src="gui/note-viewer/index.html"
|
||||
webpreferences="contextIsolation"
|
||||
/>
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
return {
|
||||
theme: state.settings.theme,
|
||||
};
|
||||
};
|
||||
|
||||
const NoteTextViewer = connect(mapStateToProps, null, null, { withRef: true })(NoteTextViewerComponent);
|
||||
|
||||
module.exports = NoteTextViewer;
|
@@ -15,6 +15,7 @@ const { ConfigScreen } = require('./ConfigScreen.min.js');
|
||||
const { EncryptionConfigScreen } = require('./EncryptionConfigScreen.min.js');
|
||||
const { ClipperConfigScreen } = require('./ClipperConfigScreen.min.js');
|
||||
const { Navigator } = require('./Navigator.min.js');
|
||||
const WelcomeUtils = require('lib/WelcomeUtils');
|
||||
|
||||
const { app } = require('../app');
|
||||
|
||||
@@ -71,6 +72,8 @@ class RootComponent extends React.Component {
|
||||
state: 'ready',
|
||||
});
|
||||
}
|
||||
|
||||
await WelcomeUtils.install(this.props.dispatch);
|
||||
}
|
||||
|
||||
render() {
|
||||
|
@@ -3,6 +3,7 @@ const { connect } = require("react-redux");
|
||||
const shared = require("lib/components/shared/side-menu-shared.js");
|
||||
const { Synchronizer } = require("lib/synchronizer.js");
|
||||
const BaseModel = require("lib/BaseModel.js");
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Folder = require("lib/models/Folder.js");
|
||||
const Note = require("lib/models/Note.js");
|
||||
const Tag = require("lib/models/Tag.js");
|
||||
@@ -23,7 +24,7 @@ class SideBarComponent extends React.Component {
|
||||
this.onFolderDragStart_ = (event) => {
|
||||
const folderId = event.currentTarget.getAttribute('folderid');
|
||||
if (!folderId) return;
|
||||
|
||||
|
||||
event.dataTransfer.setDragImage(new Image(), 1, 1);
|
||||
event.dataTransfer.clearData();
|
||||
event.dataTransfer.setData('text/x-jop-folder-ids', JSON.stringify([folderId]));
|
||||
@@ -39,9 +40,15 @@ class SideBarComponent extends React.Component {
|
||||
const dt = event.dataTransfer;
|
||||
if (!dt) return;
|
||||
|
||||
// folderId can be NULL when dropping on the sidebar Notebook header. In that case, it's used
|
||||
// to put the dropped folder at the root. But for notes, folderId needs to always be defined
|
||||
// since there's no such thing as a root note.
|
||||
|
||||
if (dt.types.indexOf("text/x-jop-note-ids") >= 0) {
|
||||
event.preventDefault();
|
||||
|
||||
if (!folderId) return;
|
||||
|
||||
const noteIds = JSON.parse(dt.getData("text/x-jop-note-ids"));
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
await Note.moveToFolder(noteIds[i], folderId);
|
||||
@@ -79,6 +86,20 @@ class SideBarComponent extends React.Component {
|
||||
id: folderId,
|
||||
});
|
||||
};
|
||||
|
||||
this.folderItemsOrder_ = [];
|
||||
this.tagItemsOrder_ = [];
|
||||
|
||||
this.onKeyDown = this.onKeyDown.bind(this);
|
||||
|
||||
this.rootRef = React.createRef();
|
||||
|
||||
this.anchorItemRefs = {};
|
||||
|
||||
this.state = {
|
||||
tagHeaderIsExpanded: Setting.value('tagHeaderIsExpanded'),
|
||||
folderHeaderIsExpanded: Setting.value('folderHeaderIsExpanded')
|
||||
};
|
||||
}
|
||||
|
||||
style() {
|
||||
@@ -166,9 +187,8 @@ class SideBarComponent extends React.Component {
|
||||
marginTop: 10,
|
||||
marginLeft: 5,
|
||||
marginRight: 5,
|
||||
minHeight: 70,
|
||||
marginBottom: 10,
|
||||
wordWrap: "break-word",
|
||||
//width: "100%",
|
||||
},
|
||||
};
|
||||
|
||||
@@ -186,11 +206,36 @@ class SideBarComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
doCommand(command) {
|
||||
if (!command) return;
|
||||
|
||||
let commandProcessed = true;
|
||||
|
||||
if (command.name === 'focusElement' && command.target === 'sideBar') {
|
||||
if (this.props.sidebarVisibility) {
|
||||
const item = this.selectedItem();
|
||||
if (item) {
|
||||
const anchorRef = this.anchorItemRefs[item.type][item.id];
|
||||
if (anchorRef) anchorRef.current.focus();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
commandProcessed = false;
|
||||
}
|
||||
|
||||
if (commandProcessed) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
if (shim.isLinux()) {
|
||||
// For some reason, the UI seems to sleep in some Linux distro during
|
||||
// sync. Cannot find the reason for it and cannot replicate, so here
|
||||
// as a test force the update at regular intervals.
|
||||
// as a test force the update at regular intervals.
|
||||
// https://github.com/laurent22/joplin/issues/312#issuecomment-429472193
|
||||
if (!prevProps.syncStarted && this.props.syncStarted) {
|
||||
this.clearForceUpdateDuringSync();
|
||||
@@ -201,13 +246,19 @@ class SideBarComponent extends React.Component {
|
||||
}
|
||||
|
||||
if (prevProps.syncStarted && !this.props.syncStarted) this.clearForceUpdateDuringSync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.clearForceUpdateDuringSync();
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps, prevState, snapshot) {
|
||||
if (prevProps.windowCommand !== this.props.windowCommand) {
|
||||
this.doCommand(this.props.windowCommand);
|
||||
}
|
||||
}
|
||||
|
||||
itemContextMenu(event) {
|
||||
const itemId = event.target.getAttribute("data-id");
|
||||
if (itemId === Folder.conflictFolderId()) return;
|
||||
@@ -303,7 +354,7 @@ class SideBarComponent extends React.Component {
|
||||
);
|
||||
}
|
||||
|
||||
if (itemType === BaseModel.TYPE_TAG) {
|
||||
if (itemType === BaseModel.TYPE_TAG) {
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: _('Rename'),
|
||||
@@ -335,17 +386,26 @@ class SideBarComponent extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
searchItem_click(search) {
|
||||
this.props.dispatch({
|
||||
type: "SEARCH_SELECT",
|
||||
id: search ? search.id : null,
|
||||
});
|
||||
}
|
||||
// searchItem_click(search) {
|
||||
// this.props.dispatch({
|
||||
// type: "SEARCH_SELECT",
|
||||
// id: search ? search.id : null,
|
||||
// });
|
||||
// }
|
||||
|
||||
async sync_click() {
|
||||
await shared.synchronize_press(this);
|
||||
}
|
||||
|
||||
anchorItemRef(type, id) {
|
||||
let refs = null;
|
||||
|
||||
if (!this.anchorItemRefs[type]) this.anchorItemRefs[type] = {};
|
||||
if (this.anchorItemRefs[type][id]) return this.anchorItemRefs[type][id];
|
||||
this.anchorItemRefs[type][id] = React.createRef();
|
||||
return this.anchorItemRefs[type][id];
|
||||
}
|
||||
|
||||
folderItem(folder, selected, hasChildren, depth) {
|
||||
let style = Object.assign({}, this.style().listItem);
|
||||
if (folder.id === Folder.conflictFolderId()) style = Object.assign(style, this.style().conflictFolder);
|
||||
@@ -353,8 +413,6 @@ class SideBarComponent extends React.Component {
|
||||
const itemTitle = Folder.displayTitle(folder);
|
||||
|
||||
let containerStyle = Object.assign({}, this.style().listItemContainer);
|
||||
// containerStyle.paddingLeft = containerStyle.paddingLeft + depth * 10;
|
||||
|
||||
if (selected) containerStyle = Object.assign(containerStyle, this.style().listItemSelected);
|
||||
|
||||
let expandLinkStyle = Object.assign({}, this.style().listItemExpandIcon);
|
||||
@@ -367,10 +425,13 @@ class SideBarComponent extends React.Component {
|
||||
const expandIcon = <i style={expandIconStyle} className={"fa " + iconName}></i>
|
||||
const expandLink = hasChildren ? <a style={expandLinkStyle} href="#" folderid={folder.id} onClick={this.onFolderToggleClick_}>{expandIcon}</a> : <span style={expandLinkStyle}>{expandIcon}</span>
|
||||
|
||||
const anchorRef = this.anchorItemRef('folder', folder.id);
|
||||
|
||||
return (
|
||||
<div className="list-item-container" style={containerStyle} key={folder.id} onDragStart={this.onFolderDragStart_} onDragOver={this.onFolderDragOver_} onDrop={this.onFolderDrop_} draggable={true} folderid={folder.id}>
|
||||
{ expandLink }
|
||||
<a
|
||||
ref={anchorRef}
|
||||
className="list-item"
|
||||
href="#"
|
||||
data-id={folder.id}
|
||||
@@ -392,10 +453,14 @@ class SideBarComponent extends React.Component {
|
||||
tagItem(tag, selected) {
|
||||
let style = Object.assign({}, this.style().tagItem);
|
||||
if (selected) style = Object.assign(style, this.style().listItemSelected);
|
||||
|
||||
const anchorRef = this.anchorItemRef('tag', tag.id);
|
||||
|
||||
return (
|
||||
<a
|
||||
className="list-item"
|
||||
href="#"
|
||||
ref={anchorRef}
|
||||
data-id={tag.id}
|
||||
data-type={BaseModel.TYPE_TAG}
|
||||
onContextMenu={event => this.itemContextMenu(event)}
|
||||
@@ -412,26 +477,26 @@ class SideBarComponent extends React.Component {
|
||||
);
|
||||
}
|
||||
|
||||
searchItem(search, selected) {
|
||||
let style = Object.assign({}, this.style().listItem);
|
||||
if (selected) style = Object.assign(style, this.style().listItemSelected);
|
||||
return (
|
||||
<a
|
||||
className="list-item"
|
||||
href="#"
|
||||
data-id={search.id}
|
||||
data-type={BaseModel.TYPE_SEARCH}
|
||||
onContextMenu={event => this.itemContextMenu(event)}
|
||||
key={search.id}
|
||||
style={style}
|
||||
onClick={() => {
|
||||
this.searchItem_click(search);
|
||||
}}
|
||||
>
|
||||
{search.title}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
// searchItem(search, selected) {
|
||||
// let style = Object.assign({}, this.style().listItem);
|
||||
// if (selected) style = Object.assign(style, this.style().listItemSelected);
|
||||
// return (
|
||||
// <a
|
||||
// className="list-item"
|
||||
// href="#"
|
||||
// data-id={search.id}
|
||||
// data-type={BaseModel.TYPE_SEARCH}
|
||||
// onContextMenu={event => this.itemContextMenu(event)}
|
||||
// key={search.id}
|
||||
// style={style}
|
||||
// onClick={() => {
|
||||
// this.searchItem_click(search);
|
||||
// }}
|
||||
// >
|
||||
// {search.title}
|
||||
// </a>
|
||||
// );
|
||||
// }
|
||||
|
||||
makeDivider(key) {
|
||||
return <div style={{ height: 2, backgroundColor: "blue" }} key={key} />;
|
||||
@@ -440,16 +505,138 @@ class SideBarComponent extends React.Component {
|
||||
makeHeader(key, label, iconName, extraProps = {}) {
|
||||
const style = this.style().header;
|
||||
const icon = <i style={{ fontSize: style.fontSize * 1.2, marginRight: 5 }} className={"fa " + iconName} />;
|
||||
|
||||
if (extraProps.toggleblock || extraProps.onClick) {
|
||||
style.cursor = "pointer";
|
||||
}
|
||||
|
||||
let headerClick = extraProps.onClick || null;
|
||||
delete extraProps.onClick;
|
||||
|
||||
// check if toggling option is set.
|
||||
let toggleIcon = null;
|
||||
const toggleKey = `${key}IsExpanded`;
|
||||
if (extraProps.toggleblock) {
|
||||
let isExpanded = this.state[toggleKey];
|
||||
toggleIcon = <i className={`fa ${isExpanded ? 'fa-chevron-down' : 'fa-chevron-left'}`} style={{ fontSize: style.fontSize * 0.75,
|
||||
marginRight: 12, marginLeft: 5, marginTop: style.fontSize * 0.125}}></i>;
|
||||
}
|
||||
|
||||
const ref = this.anchorItemRef('headers', key);
|
||||
|
||||
return (
|
||||
<div style={style} key={key} {...extraProps}>
|
||||
<div ref={ref} style={style} key={key} {...extraProps} onClick={(event) => {
|
||||
// if a custom click event is attached, trigger that.
|
||||
if (headerClick) {
|
||||
headerClick(key, event);
|
||||
}
|
||||
this.onHeaderClick_(key, event);
|
||||
}}>
|
||||
{icon}
|
||||
{label}
|
||||
<span style={{flex: 1 }}>{label}</span>
|
||||
{toggleIcon}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
selectedItem() {
|
||||
if (this.props.notesParentType === 'Folder' && this.props.selectedFolderId) {
|
||||
return { type: 'folder', id: this.props.selectedFolderId };
|
||||
} else if (this.props.notesParentType === 'Tag' && this.props.selectedTagId) {
|
||||
return { type: 'tag', id: this.props.selectedTagId };
|
||||
} else if (this.props.notesParentType === 'Search' && this.props.selectedSearchId) {
|
||||
return { type: 'search', id: this.props.selectedSearchId };
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
onKeyDown(event) {
|
||||
const keyCode = event.keyCode;
|
||||
const selectedItem = this.selectedItem();
|
||||
|
||||
if (keyCode === 40 || keyCode === 38) { // DOWN / UP
|
||||
event.preventDefault();
|
||||
|
||||
const focusItems = [];
|
||||
|
||||
for (let i = 0; i < this.folderItemsOrder_.length; i++) {
|
||||
const id = this.folderItemsOrder_[i];
|
||||
focusItems.push({ id: id, ref: this.anchorItemRefs['folder'][id], type: 'folder' });
|
||||
}
|
||||
|
||||
for (let i = 0; i < this.tagItemsOrder_.length; i++) {
|
||||
const id = this.tagItemsOrder_[i];
|
||||
focusItems.push({ id: id, ref: this.anchorItemRefs['tag'][id], type: 'tag' });
|
||||
}
|
||||
|
||||
let currentIndex = 0;
|
||||
for (let i = 0; i < focusItems.length; i++) {
|
||||
if (!selectedItem || focusItems[i].id === selectedItem.id) {
|
||||
currentIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const inc = keyCode === 38 ? -1 : +1;
|
||||
let newIndex = currentIndex + inc;
|
||||
|
||||
if (newIndex < 0) newIndex = 0;
|
||||
if (newIndex > focusItems.length - 1) newIndex = focusItems.length - 1;
|
||||
|
||||
const focusItem = focusItems[newIndex];
|
||||
|
||||
let actionName = focusItem.type.toUpperCase() + '_SELECT';
|
||||
|
||||
this.props.dispatch({
|
||||
type: actionName,
|
||||
id: focusItem.id,
|
||||
});
|
||||
|
||||
focusItem.ref.current.focus();
|
||||
}
|
||||
|
||||
if (keyCode === 9) { // TAB
|
||||
event.preventDefault();
|
||||
|
||||
if (event.shiftKey) {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focusElement',
|
||||
target: 'noteBody',
|
||||
});
|
||||
} else {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'focusElement',
|
||||
target: 'noteList',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (selectedItem && selectedItem.type === 'folder' && keyCode === 32) { // SPACE
|
||||
event.preventDefault();
|
||||
|
||||
this.props.dispatch({
|
||||
type: 'FOLDER_TOGGLE',
|
||||
id: selectedItem.id,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
onHeaderClick_(key, event) {
|
||||
const currentHeader = event.currentTarget;
|
||||
const toggleBlock = +currentHeader.getAttribute('toggleblock');
|
||||
if (toggleBlock) {
|
||||
const toggleKey = `${key}IsExpanded`;
|
||||
const isExpanded = this.state[toggleKey];
|
||||
this.setState({ [toggleKey]: !isExpanded });
|
||||
Setting.setValue(toggleKey, !isExpanded);
|
||||
}
|
||||
}
|
||||
|
||||
synchronizeButton(type) {
|
||||
const style = this.style().button;
|
||||
const style = Object.assign({}, this.style().button, { marginBottom: 5 });
|
||||
const iconName = type === "sync" ? "fa-refresh" : "fa-times";
|
||||
const label = type === "sync" ? _("Synchronise") : _("Cancel");
|
||||
const icon = <i style={{ fontSize: style.fontSize, marginRight: 5 }} className={"fa " + iconName} />;
|
||||
@@ -473,28 +660,37 @@ class SideBarComponent extends React.Component {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const style = Object.assign({}, this.style().root, this.props.style, {
|
||||
overflowX: "hidden",
|
||||
overflowY: "auto",
|
||||
overflowY: "hidden",
|
||||
display: 'inline-flex',
|
||||
flexDirection: 'column',
|
||||
});
|
||||
|
||||
let items = [];
|
||||
|
||||
items.push(this.makeHeader("folderHeader", _("Notebooks"), "fa-folder-o", {
|
||||
items.push(this.makeHeader("folderHeader", _("Notebooks"), "fa-book", {
|
||||
onDrop: this.onFolderDrop_,
|
||||
folderid: '',
|
||||
toggleblock: 1
|
||||
}));
|
||||
|
||||
if (this.props.folders.length) {
|
||||
const folderItems = shared.renderFolders(this.props, this.folderItem.bind(this));
|
||||
items = items.concat(folderItems);
|
||||
const result = shared.renderFolders(this.props, this.folderItem.bind(this));
|
||||
const folderItems = result.items;
|
||||
this.folderItemsOrder_ = result.order;
|
||||
items.push(<div className="folders" key="folder_items" style={{display: this.state.folderHeaderIsExpanded ? 'block': 'none'}}>
|
||||
{folderItems}</div>);
|
||||
}
|
||||
|
||||
items.push(this.makeHeader("tagHeader", _("Tags"), "fa-tags"));
|
||||
items.push(this.makeHeader("tagHeader", _("Tags"), "fa-tags", {
|
||||
toggleblock: 1
|
||||
}));
|
||||
|
||||
if (this.props.tags.length) {
|
||||
const tagItems = shared.renderTags(this.props, this.tagItem.bind(this));
|
||||
const result = shared.renderTags(this.props, this.tagItem.bind(this));
|
||||
const tagItems = result.items;
|
||||
this.tagItemsOrder_ = result.order;
|
||||
|
||||
items.push(
|
||||
<div className="tags" key="tag_items">
|
||||
<div className="tags" key="tag_items" style={{display: this.state.tagHeaderIsExpanded ? 'block': 'none'}}>
|
||||
{tagItems}
|
||||
</div>
|
||||
);
|
||||
@@ -522,17 +718,23 @@ class SideBarComponent extends React.Component {
|
||||
);
|
||||
}
|
||||
|
||||
items.push(this.synchronizeButton(this.props.syncStarted ? "cancel" : "sync"));
|
||||
const syncButton = this.synchronizeButton(this.props.syncStarted ? "cancel" : "sync");
|
||||
|
||||
items.push(
|
||||
const syncReportComp = !syncReportText.length ? null : (
|
||||
<div style={this.style().syncReport} key="sync_report">
|
||||
{syncReportText}
|
||||
</div>
|
||||
);
|
||||
{syncReportText}
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="side-bar" style={style}>
|
||||
{items}
|
||||
<div ref={this.rootRef} onKeyDown={this.onKeyDown} className="side-bar" style={style}>
|
||||
<div style={{flex:1, overflowY: 'auto'}}>
|
||||
{items}
|
||||
</div>
|
||||
<div style={{flex:0}}>
|
||||
{syncButton}
|
||||
{syncReportComp}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -554,6 +756,8 @@ const mapStateToProps = state => {
|
||||
collapsedFolderIds: state.collapsedFolderIds,
|
||||
decryptionWorker: state.decryptionWorker,
|
||||
resourceFetcher: state.resourceFetcher,
|
||||
windowCommand: state.windowCommand,
|
||||
sidebarVisibility: state.sidebarVisibility,
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -16,6 +16,11 @@
|
||||
}
|
||||
|
||||
mark {
|
||||
background: #F3B717;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.mark-selected {
|
||||
background: #CF3F00;
|
||||
color: white;
|
||||
}
|
||||
@@ -32,6 +37,7 @@
|
||||
<div id="hlScriptContainer"></div>
|
||||
<div id="markScriptContainer"></div>
|
||||
<div id="content" ondragstart="return false;" ondrop="return false;"></div>
|
||||
<script src="./lib.js"></script>
|
||||
|
||||
<script>
|
||||
const contentElement = document.getElementById('content');
|
||||
@@ -138,6 +144,8 @@
|
||||
ipc.setHtml = (event) => {
|
||||
const html = event.html;
|
||||
|
||||
markJsHackMarkerInserted_ = false;
|
||||
|
||||
updateBodyHeight();
|
||||
|
||||
contentElement.innerHTML = html;
|
||||
@@ -191,8 +199,36 @@
|
||||
setPercentScroll(percent);
|
||||
}
|
||||
|
||||
// HACK for Mark.js bug - https://github.com/julmot/mark.js/issues/127
|
||||
let markJsHackMarkerInserted_ = false;
|
||||
function addMarkJsSpaceHack(document) {
|
||||
if (markJsHackMarkerInserted_) return;
|
||||
|
||||
const prepareElementsForMarkJs = (elements, type) => {
|
||||
// const markJsHackMarker_ = '​ ​'
|
||||
const markJsHackMarker_ = ' ';
|
||||
for (let i = 0; i < elements.length; i++) {
|
||||
if (!type) {
|
||||
elements[i].innerHTML = elements[i].innerHTML + markJsHackMarker_;
|
||||
} else if (type === 'insertBefore') {
|
||||
elements[i].insertAdjacentHTML('beforeBegin', markJsHackMarker_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
prepareElementsForMarkJs(document.getElementsByTagName('p'));
|
||||
prepareElementsForMarkJs(document.getElementsByTagName('div'));
|
||||
prepareElementsForMarkJs(document.getElementsByTagName('br'), 'insertBefore');
|
||||
markJsHackMarkerInserted_ = true;
|
||||
}
|
||||
|
||||
let mark_ = null;
|
||||
function setMarkers(keywords) {
|
||||
let markSelectedElement_ = null;
|
||||
function setMarkers(keywords, options = null) {
|
||||
if (!options) options = {};
|
||||
|
||||
// TODO: Add support for scriptType on mobile and CLI
|
||||
|
||||
if (!mark_) {
|
||||
mark_ = new Mark(document.getElementById('content'), {
|
||||
exclude: ['img'],
|
||||
@@ -200,26 +236,61 @@
|
||||
});
|
||||
}
|
||||
|
||||
mark_.mark(keywords);
|
||||
addMarkJsSpaceHack(document);
|
||||
|
||||
mark_.unmark()
|
||||
|
||||
if (markSelectedElement_) markSelectedElement_.classList.remove('mark-selected');
|
||||
|
||||
let selectedElement = null;
|
||||
let elementIndex = 0;
|
||||
|
||||
const onEachElement = (element) => {
|
||||
if (!('selectedIndex' in options)) return;
|
||||
|
||||
if (('selectedIndex' in options) && elementIndex === options.selectedIndex) {
|
||||
markSelectedElement_ = element;
|
||||
element.classList.add('mark-selected');
|
||||
selectedElement = element;
|
||||
}
|
||||
|
||||
elementIndex++;
|
||||
}
|
||||
|
||||
for (let i = 0; i < keywords.length; i++) {
|
||||
let keyword = keywords[i];
|
||||
|
||||
markJsUtils.markKeyword(mark_, keyword, {
|
||||
pregQuote: pregQuote,
|
||||
replaceRegexDiacritics: replaceRegexDiacritics,
|
||||
}, {
|
||||
each: onEachElement,
|
||||
});
|
||||
}
|
||||
|
||||
ipcProxySendToHost('setMarkerCount', elementIndex);
|
||||
|
||||
if (selectedElement) selectedElement.scrollIntoView();
|
||||
}
|
||||
|
||||
let markLoaded_ = false;
|
||||
ipc.setMarkers = (event) => {
|
||||
const keywords = event.keywords;
|
||||
const options = event.options;
|
||||
|
||||
if (!keywords.length && !markLoaded_) return;
|
||||
|
||||
if (!markLoaded_) {
|
||||
const script = document.createElement('script');
|
||||
script.onload = function() {
|
||||
setMarkers(keywords);
|
||||
setMarkers(keywords, options);
|
||||
};
|
||||
|
||||
script.src = '../../node_modules/mark.js/dist/mark.min.js';
|
||||
document.getElementById('markScriptContainer').appendChild(script);
|
||||
markLoaded_ = true;
|
||||
} else {
|
||||
setMarkers(keywords);
|
||||
setMarkers(keywords, options);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,22 +357,38 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
function getParentAnchorElement(element) {
|
||||
let counter = 0;
|
||||
while (true) {
|
||||
|
||||
if (counter++ >= 10000) {
|
||||
console.warn('been looping for too long - exiting')
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!element) return null;
|
||||
if (element.nodeName === 'A') return element;
|
||||
element = element.parentElement;
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('click', function(event) {
|
||||
const t = event.target;
|
||||
const anchor = getParentAnchorElement(event.target);
|
||||
if (!anchor) return;
|
||||
|
||||
// Prevent URLs added via <a> tags from being opened within the application itself
|
||||
// otherwise it would open the whole website within the WebView.
|
||||
if (t && t.nodeName === 'A' && !t.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, t)) return;
|
||||
if (!anchor.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, anchor)) return;
|
||||
|
||||
event.preventDefault();
|
||||
ipcProxySendToHost(t.getAttribute('href'));
|
||||
ipcProxySendToHost(anchor.getAttribute('href'));
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is an internal link, jump to the anchor directly
|
||||
if (t && t.nodeName === 'A' && t.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, t)) return;
|
||||
if (anchor.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, anchor)) return;
|
||||
}
|
||||
});
|
||||
|
||||
|
@@ -13,8 +13,8 @@ ipcRenderer.on('setPercentScroll', (event, percent) => {
|
||||
window.postMessage({ target: 'webview', name: 'setPercentScroll', data: { percent: percent } }, '*');
|
||||
});
|
||||
|
||||
ipcRenderer.on('setMarkers', (event, keywords) => {
|
||||
window.postMessage({ target: 'webview', name: 'setMarkers', data: { keywords: keywords } }, '*');
|
||||
ipcRenderer.on('setMarkers', (event, keywords, options) => {
|
||||
window.postMessage({ target: 'webview', name: 'setMarkers', data: { keywords: keywords, options: options } }, '*');
|
||||
});
|
||||
|
||||
window.addEventListener('message', (event) => {
|
||||
|
137
ElectronClient/app/gui/utils/NoteListUtils.js
Normal file
137
ElectronClient/app/gui/utils/NoteListUtils.js
Normal file
@@ -0,0 +1,137 @@
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const BaseModel = require('lib/BaseModel');
|
||||
const markJsUtils = require('lib/markJsUtils');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const Menu = bridge().Menu;
|
||||
const MenuItem = bridge().MenuItem;
|
||||
const eventManager = require('../../eventManager');
|
||||
const InteropService = require('lib/services/InteropService');
|
||||
const InteropServiceHelper = require('../../InteropServiceHelper.js');
|
||||
const Search = require('lib/models/Search');
|
||||
const Note = require('lib/models/Note');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const { replaceRegexDiacritics, pregQuote, substrWithEllipsis } = require('lib/string-utils');
|
||||
|
||||
class NoteListUtils {
|
||||
|
||||
static makeContextMenu(noteIds, props) {
|
||||
const notes = noteIds.map((id) => BaseModel.byId(props.notes, id));
|
||||
|
||||
let hasEncrypted = false;
|
||||
for (let i = 0; i < notes.length; i++) {
|
||||
if (!!notes[i].encryption_applied) hasEncrypted = true;
|
||||
}
|
||||
|
||||
const menu = new Menu()
|
||||
|
||||
if (!hasEncrypted) {
|
||||
menu.append(new MenuItem({label: _('Add or remove tags'), enabled: noteIds.length === 1, click: async () => {
|
||||
props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'setTags',
|
||||
noteId: noteIds[0],
|
||||
});
|
||||
}}));
|
||||
|
||||
menu.append(new MenuItem({label: _('Duplicate'), click: async () => {
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
await Note.duplicate(noteIds[i], {
|
||||
uniqueTitle: _('%s - Copy', note.title),
|
||||
});
|
||||
}
|
||||
}}));
|
||||
|
||||
if (noteIds.length <= 1) {
|
||||
menu.append(new MenuItem({label: _('Switch between note and to-do type'), click: async () => {
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
await Note.save(Note.toggleIsTodo(note), { userSideValidation: true });
|
||||
eventManager.emit('noteTypeToggle', { noteId: note.id });
|
||||
}
|
||||
}}));
|
||||
} else {
|
||||
const switchNoteType = async (noteIds, type) => {
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
const newNote = Note.changeNoteType(note, type);
|
||||
if (newNote === note) continue;
|
||||
await Note.save(newNote, { userSideValidation: true });
|
||||
eventManager.emit('noteTypeToggle', { noteId: note.id });
|
||||
}
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Switch to note type'), click: async () => {
|
||||
await switchNoteType(noteIds, 'note');
|
||||
}}));
|
||||
|
||||
menu.append(new MenuItem({label: _('Switch to to-do type'), click: async () => {
|
||||
await switchNoteType(noteIds, 'todo');
|
||||
}}));
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Copy Markdown link'), click: async () => {
|
||||
const { clipboard } = require('electron');
|
||||
const links = [];
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const note = await Note.load(noteIds[i]);
|
||||
links.push(Note.markdownTag(note));
|
||||
}
|
||||
clipboard.writeText(links.join(' '));
|
||||
}}));
|
||||
|
||||
const exportMenu = new Menu();
|
||||
|
||||
const ioService = new InteropService();
|
||||
const ioModules = ioService.modules();
|
||||
for (let i = 0; i < ioModules.length; i++) {
|
||||
const module = ioModules[i];
|
||||
if (module.type !== 'exporter') continue;
|
||||
|
||||
exportMenu.append(new MenuItem({ label: module.fullLabel() , click: async () => {
|
||||
await InteropServiceHelper.export(props.dispatch.bind(this), module, { sourceNoteIds: noteIds });
|
||||
}}));
|
||||
}
|
||||
|
||||
if (noteIds.length === 1) {
|
||||
exportMenu.append(new MenuItem({ label: 'PDF - ' + _('PDF File') , click: () => {
|
||||
props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'exportPdf',
|
||||
});
|
||||
}}));
|
||||
}
|
||||
|
||||
const exportMenuItem = new MenuItem({label: _('Export'), submenu: exportMenu});
|
||||
|
||||
menu.append(exportMenuItem);
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({label: _('Delete'), click: async () => {
|
||||
await this.confirmDeleteNotes(noteIds);
|
||||
}}));
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
static async confirmDeleteNotes(noteIds) {
|
||||
if (!noteIds.length) return;
|
||||
|
||||
let msg = '';
|
||||
if (noteIds.length === 1) {
|
||||
const note = await Note.load(noteIds[0]);
|
||||
if (!note) return;
|
||||
msg = _('Delete note "%s"?', substrWithEllipsis(note.title, 0, 32));
|
||||
} else {
|
||||
msg = _('Delete these %d notes?', noteIds.length);
|
||||
}
|
||||
|
||||
const ok = bridge().showConfirmMessageBox(msg);
|
||||
if (!ok) return;
|
||||
await Note.batchDelete(noteIds);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = NoteListUtils;
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -12,14 +12,15 @@ locales['hr_HR'] = require('./hr_HR.json');
|
||||
locales['it_IT'] = require('./it_IT.json');
|
||||
locales['ja_JP'] = require('./ja_JP.json');
|
||||
locales['ko'] = require('./ko.json');
|
||||
locales['nb_NO'] = require('./nb_NO.json');
|
||||
locales['nl_BE'] = require('./nl_BE.json');
|
||||
locales['nl_NL'] = require('./nl_NL.json');
|
||||
locales['no'] = require('./no.json');
|
||||
locales['pt_BR'] = require('./pt_BR.json');
|
||||
locales['ro'] = require('./ro.json');
|
||||
locales['ru_RU'] = require('./ru_RU.json');
|
||||
locales['sl_SI'] = require('./sl_SI.json');
|
||||
locales['sv'] = require('./sv.json');
|
||||
locales['tr_TR'] = require('./tr_TR.json');
|
||||
locales['zh_CN'] = require('./zh_CN.json');
|
||||
locales['zh_TW'] = require('./zh_TW.json');
|
||||
module.exports = { locales: locales };
|
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
1
ElectronClient/app/locales/nb_NO.json
Normal file
1
ElectronClient/app/locales/nb_NO.json
Normal file
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
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user