1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-08-27 20:29:45 +02:00

Compare commits

..

2 Commits

Author SHA1 Message Date
Laurent Cozic
f98c693adf CLI v1.0.112 2018-07-25 17:51:13 +02:00
Laurent Cozic
6da80f3291 Trying to get proxy to work 2018-07-25 17:47:35 +02:00
143 changed files with 1290 additions and 11229 deletions

View File

@@ -9,6 +9,8 @@
echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
If you get a node-gyp related error you might need to manually install it: `npm install -g node-gyp`
## Linux and Windows (WSL) dependencies
- Install yarn - https://yarnpkg.com/lang/en/docs/install/
@@ -35,10 +37,6 @@ yarn dist
If there's an error `while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory`, run `sudo apt-get install libgconf-2-4`
If you get a node-gyp related error you might need to manually install it: `npm install -g node-gyp`.
If you get the error `libtool: unrecognized option '-static'`, follow the instructions [in this post](https://stackoverflow.com/a/38552393/561309) to use the correct libtool version.
That will create the executable file in the `dist` directory.
From `/ElectronClient` you can also run `run.sh` to run the app for testing.

View File

@@ -17,10 +17,3 @@ Again, please check that it has not already been requested. If it has, simply **
If you want to add a new feature, consider asking about it before implementing it or checking existing discussions to make sure it is within the scope of the project. Of course you are free to create the pull request directly but it is not guaranteed it is going to be accepted.
Building the apps is relatively easy - please [see the build instructions](https://github.com/laurent22/joplin/blob/master/BUILD.md) for more details.
# Coding style
There are only two rules, but not following them means the pull request will not be accepted (it can be accepted once the issues are fixed):
- **Please use tabs, NOT spaces.**
- **Please do not add or remove optional characters, such as spaces or colons.** Please setup your editor so that it only changes what you are working on and is not making automated changes elsewhere. The reason for this is that small white space changes make diff hard to read and can cause needless conflicts.

View File

@@ -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;

View File

@@ -22,7 +22,7 @@ class Command extends BaseCommand {
enabled() {
return false;
}
options() {
return [
['-n, --limit <num>', _('Displays only the first top <num> notes.')],
@@ -93,7 +93,7 @@ class Command extends BaseCommand {
row.push(await Folder.noteCount(item.id));
}
row.push(time.formatMsToLocal(item.user_updated_time));
row.push(time.unixMsToLocalDateTime(item.user_updated_time));
}
let title = item.title;
@@ -123,4 +123,4 @@ class Command extends BaseCommand {
}
module.exports = Command;
module.exports = Command;

View File

@@ -3,7 +3,6 @@ const { app } = require('./app.js');
const { _ } = require('lib/locale.js');
const Tag = require('lib/models/Tag.js');
const BaseModel = require('lib/BaseModel.js');
const { time } = require('lib/time-utils.js');
class Command extends BaseCommand {
@@ -12,19 +11,11 @@ class Command extends BaseCommand {
}
description() {
return _('<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).');
return _('<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.');
}
options() {
return [
['-l, --long', _('Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE')],
];
}
async action(args) {
let tag = null;
let options = args.options;
if (args.tag) tag = await app().loadItem(BaseModel.TYPE_TAG, args.tag);
let notes = [];
if (args.note) {
@@ -50,28 +41,7 @@ class Command extends BaseCommand {
} else if (command == 'list') {
if (tag) {
let notes = await Tag.notes(tag.id);
notes.map((note) => {
let line = '';
if (options.long) {
line += BaseModel.shortId(note.id);
line += ' ';
line += time.formatMsToLocal(note.user_updated_time);
line += ' ';
}
if (note.is_todo) {
line += '[';
if (note.todo_completed) {
line += 'X';
} else {
line += ' ';
}
line += '] ';
} else {
line += ' ';
}
line += note.title;
this.stdout(line);
});
notes.map((note) => { this.stdout(note.title); });
} else {
let tags = await Tag.all();
tags.map((tag) => { this.stdout(tag.title); });

View File

@@ -463,11 +463,10 @@ msgstr "Està començant la sincronització..."
msgid "Cancelling... Please wait."
msgstr "S'està cancel·lant... Espereu."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command>pot ser «add», «remove» o «list» per a assignar o suprimir "
"[tag] de la [nota], o per a llistar les notes associades amb [tag]. L'ordre "
@@ -948,12 +947,6 @@ msgstr ""
"Ara mateix no hi ha cap bloc de notes. Creeu-ne un fent clic a «Bloc de "
"notes nou»."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Obre..."
@@ -1007,9 +1000,6 @@ msgstr "Estableix una alarma"
msgid "In: %s"
msgstr "A: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1215,6 +1205,10 @@ msgstr "Conflictes"
msgid "Cannot move notebook to this location"
msgstr "No es pot moure el bloc de notes a aquesta ubicació"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Ja existeix un bloc de notes amb aquest títol: «%s»"
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Els blocs de notes no poden tenir el nom «%s», és un títol reservat."
@@ -1293,9 +1287,6 @@ msgstr "Mostra la icona a la safata"
msgid "Note: Does not work in all desktop environments."
msgstr "Nota: no funciona en tots els entorns d'escriptori."
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Percentatge de zoom global"
@@ -1366,13 +1357,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "URL del Nextcloud WebDAV"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nom d'usuari del Nextcloud"
@@ -1405,10 +1389,6 @@ 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."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Fitxer d'exportació del Joplin"
@@ -1672,6 +1652,3 @@ msgstr ""
msgid "Welcome"
msgstr "Benvingut"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Ja existeix un bloc de notes amb aquest títol: «%s»"

View File

@@ -451,11 +451,10 @@ msgstr "Zahajuji synchronizaci..."
msgid "Cancelling... Please wait."
msgstr "Zastavuji, chvíli strpení."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> může být \"add\", \"remove\" nebo \"list\" - přidat (add) či "
"odebrat (remove) [tag] k [poznámce], nebo vypsat (list) seznam poznámek "
@@ -919,12 +918,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "Nemáte žádný zápisník. Vytvořte jeden kliknutím na \"Nový zápisník\"."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Otevřít..."
@@ -976,9 +969,6 @@ msgstr "Nastavit alarm"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1186,6 +1176,10 @@ msgstr "Konflikty"
msgid "Cannot move notebook to this location"
msgstr "Poznámku nelze přesunout do zápisníku \"%s\""
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Zápisník s tímto názvem již existuje: \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Zápisník se nemůže jmenovat \"%s\", tento název je rezervován."
@@ -1268,9 +1262,6 @@ msgstr "Zobrazovat ikonu v panelu"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Globální zoom"
@@ -1341,13 +1332,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV URL"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nextcloud uživatelské jméno"
@@ -1380,10 +1364,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Neplatná hodnota: \"%s\". Přípustné hodnoty jsou: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Soubor Joplin Export"
@@ -1641,8 +1621,5 @@ msgstr "Nemáte žádný zápisník. Vytvořte jeden kliknutím na tlačítko (+
msgid "Welcome"
msgstr "Vítejte"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Zápisník s tímto názvem již existuje: \"%s\""
#~ msgid "Searches"
#~ msgstr "Hledané výrazy"

View File

@@ -455,11 +455,10 @@ msgstr "Starter synkronisering."
msgid "Cancelling... Please wait."
msgstr "Annullerer... Vent venligst."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> (mærke-kommando) kan enten være \"add\" (tilføj), \"remove"
"\" (slet) eller \"list\" (liste) for at tilføje eller fjerne mærke [tag] fra "
@@ -928,12 +927,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "Der er ingen notesbog. Opret en ved at klikke på \"Ny Notesbog\"."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Åben..."
@@ -985,9 +978,6 @@ msgstr "Indstil alarm"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1195,6 +1185,10 @@ msgstr "Konflikter"
msgid "Cannot move notebook to this location"
msgstr "Kan ikke flytte note til \"%s\" notesbog"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "En notesbog bruger allerede dette navn: \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Notesbøger kan ikke få navnet \"%s\", da det er en beskyttet titel."
@@ -1277,9 +1271,6 @@ msgstr "Vis ikon på bundbjælke"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Global zoom procent"
@@ -1350,13 +1341,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV URL"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nextcloud brugernavn"
@@ -1389,10 +1373,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ulovlig værdi: \"%s\". Mulige valg er: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Joplin eksport fil"
@@ -1650,9 +1630,6 @@ msgstr "Du har ingen notesbøger. Opret en ved at klikke på (+) knappen."
msgid "Welcome"
msgstr "Velkommen"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "En notesbog bruger allerede dette navn: \"%s\""
#~ msgid ""
#~ "For more information about End-To-End Encryption (E2EE) and advices on "
#~ "how to enable it please check the documentation"

View File

@@ -475,11 +475,10 @@ msgstr "Starte Synchronisation..."
msgid "Cancelling... Please wait."
msgstr "Abbrechen… Bitte warten."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> kann \"add\", \"remove\" or \"list\" sein, um ein [Schlagwort] "
"zu [Notiz] zuzuweisen oder zu entfernen, oder um mit [Schlagwort] markierte "
@@ -962,12 +961,6 @@ msgstr ""
"Momentan existieren noch keine Notizbücher. Erstelle eines, indem du auf "
"\"Neues Notizbuch\" drückst."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Öffne..."
@@ -1021,9 +1014,6 @@ msgstr "Alarm erstellen"
msgid "In: %s"
msgstr "In: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Weblink"
@@ -1230,6 +1220,10 @@ msgstr "Konflikte"
msgid "Cannot move notebook to this location"
msgstr "Kann Notizbuch nicht an diesen Ort verschieben"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Ein Notizbuch mit diesem Titel existiert bereits : \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
@@ -1309,9 +1303,6 @@ msgstr "Zeige Tray Icon"
msgid "Note: Does not work in all desktop environments."
msgstr "Hinweis: Funktioniert nicht in allen Desktopumgebungen."
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Zoomstufe der Benutzeroberfläche"
@@ -1381,13 +1372,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV URL"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nextcloud Benutzername"
@@ -1425,10 +1409,6 @@ msgstr "Ignoriere TLS-Zertifikatfehler"
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ungültiger Optionswert: \"%s\". Mögliche Werte sind: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Joplin Export Datei"
@@ -1697,9 +1677,6 @@ msgstr ""
msgid "Welcome"
msgstr "Willkommen"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Ein Notizbuch mit diesem Titel existiert bereits : \"%s\""
#~ msgid "Searches"
#~ msgstr "Suchen"

View File

@@ -414,7 +414,7 @@ msgstr ""
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)."
"`tag list` can be used to list all the tags."
msgstr ""
#, javascript-format
@@ -842,12 +842,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr ""
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr ""
@@ -899,9 +893,6 @@ msgstr ""
msgid "In: %s"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1098,6 +1089,10 @@ msgstr ""
msgid "Cannot move notebook to this location"
msgstr ""
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr ""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
@@ -1176,9 +1171,6 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1238,13 +1230,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr ""
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr ""
@@ -1277,10 +1262,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr ""
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr ""

View File

@@ -460,11 +460,10 @@ msgstr "Iniciando sincronización..."
msgid "Cancelling... Please wait."
msgstr "Cancelando... Por favor espere."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> puede ser \"add\", \"remove\" o \"list\" para asignar o "
"eliminar [tag] de [note], o para listar las notas asociadas con [tag]. El "
@@ -630,16 +629,16 @@ msgid "Paste"
msgstr "Pegar"
msgid "Bold"
msgstr "Negrita"
msgstr ""
msgid "Italic"
msgstr "Cursiva"
msgstr ""
msgid "Insert Date Time"
msgstr "Introduce fecha"
msgstr ""
msgid "Edit in external editor"
msgstr "Editar con un editor externo"
msgstr ""
msgid "Search in all the notes"
msgstr "Buscar en todas las notas"
@@ -712,10 +711,11 @@ msgstr "Sí"
msgid "No"
msgstr "No"
#, fuzzy
msgid "The web clipper service is enabled and set to auto-start."
msgstr ""
"El servicio de recorte web está habilitado y configurado para que inicie "
"automáticamente."
"El servicio de recorte web está habilitado y configurado para inicie "
"automaticamente"
#, javascript-format
msgid "Status: Started on port %d"
@@ -770,7 +770,7 @@ msgid "Notes and settings are stored in: %s"
msgstr "Las notas y los ajustes se guardan en: %s"
msgid "Apply"
msgstr "Aplicar"
msgstr ""
msgid "Submit"
msgstr "Aceptar"
@@ -916,11 +916,11 @@ msgid "Add or remove tags"
msgstr "Añadir o borrar etiquetas"
msgid "Duplicate"
msgstr "Duplicado"
msgstr ""
#, javascript-format
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "%s - Copiar"
msgstr "Copiar"
msgid "Switch between note and to-do type"
msgstr "Cambiar entre nota y lista de tareas"
@@ -941,18 +941,12 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "No hay ninguna libreta. Cree una pulsando en «Libreta nueva»."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Abrir..."
#, javascript-format
#, fuzzy, javascript-format
msgid "This file could not be opened: %s"
msgstr "No se ha podido abrir este archivo: %s"
msgstr "No se ha podido guardar esta libreta: %s"
msgid "Save as..."
msgstr "Guardar como..."
@@ -961,7 +955,7 @@ msgid "Copy path to clipboard"
msgstr "Copiar la ruta en el portapapeles"
msgid "Copy Link Address"
msgstr "Copiar enlace"
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
@@ -976,16 +970,16 @@ msgstr ""
"editar la nota."
msgid "strong text"
msgstr "texto destacado"
msgstr ""
msgid "emphasized text"
msgstr "texto resaltado"
msgstr ""
msgid "List item"
msgstr "Listar elementos"
msgstr ""
msgid "Insert Hyperlink"
msgstr "Insertar hipervínculo"
msgstr ""
msgid "Attach file"
msgstr "Adjuntar archivo"
@@ -996,39 +990,37 @@ msgstr "Etiquetas"
msgid "Set alarm"
msgstr "Establecer alarma"
#, javascript-format
#, fuzzy, javascript-format
msgid "In: %s"
msgstr "En: %s"
msgid "Note properties"
msgstr ""
msgstr "%s: %s"
msgid "Hyperlink"
msgstr "Hipervínculo"
msgstr ""
msgid "Code"
msgstr "Código"
msgstr ""
msgid "Numbered List"
msgstr "Lista numerada"
msgstr ""
msgid "Bulleted List"
msgstr "Lista con viñetas"
msgstr ""
msgid "Checkbox"
msgstr "Casilla"
msgstr ""
msgid "Heading"
msgstr "Título"
msgstr ""
msgid "Horizontal Rule"
msgstr "Regla horizontal"
msgstr ""
msgid "Click to stop external editing"
msgstr "Pulsa para detener la edición externa"
msgstr ""
#, fuzzy
msgid "Watching..."
msgstr "Mirando..."
msgstr "Cancelando..."
msgid "to-do"
msgstr "lista de tareas"
@@ -1207,19 +1199,26 @@ msgstr "Conflictos"
msgid "Cannot move notebook to this location"
msgstr "No se puede mover la libreta a este lugar"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Ya existe una libreta con este nombre: «%s»"
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
"No se puede usar el nombre «%s» para una libreta; es un título reservado."
#, fuzzy
msgid "title"
msgstr "título"
msgstr "Sin título"
#, fuzzy
msgid "updated date"
msgstr "fecha de actualización"
msgstr "Actualizado: %d."
#, fuzzy
msgid "created date"
msgstr "fecha de creación"
msgstr "Creado: %d."
msgid "Untitled"
msgstr "Sin título"
@@ -1286,9 +1285,6 @@ msgstr "Mostrar icono en la bandeja"
msgid "Note: Does not work in all desktop environments."
msgstr "Nota: No funciona en todos los entornos de escritorio."
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Establecer el porcentaje de aumento de la aplicación"
@@ -1321,16 +1317,17 @@ msgstr "%d hora"
msgid "%d hours"
msgstr "%d horas"
#, fuzzy
msgid "Text editor command"
msgstr "Editor de texto"
#, fuzzy
msgid ""
"The editor command (may include arguments) that will be used to open a note. "
"If none is provided it will try to auto-detect the default editor."
msgstr ""
"El comando del editor (puede incluir argumentos) que se utilizará para abrir "
"una nota. Si no se provee ninguno se intentará auto detectar el editor por "
"defecto."
"El editor que se usará para abrir una nota. Se intentará auto-detectar el "
"editor predeterminado si no se proporciona ninguno."
msgid "Show advanced options"
msgstr "Mostrar opciones avanzadas"
@@ -1359,13 +1356,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Servidor WebDAV de Nextcloud"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Usuario de Nextcloud"
@@ -1382,7 +1372,7 @@ msgid "WebDAV password"
msgstr "Contraseña de WebDAV"
msgid "Custom TLS certificates"
msgstr "Certificados TLS personalizados"
msgstr ""
msgid ""
"Comma-separated list of paths to directories to load the certificates from, "
@@ -1390,23 +1380,14 @@ msgid ""
"pem. Note that if you make changes to the TLS settings, you must save your "
"changes before clicking on \"Check synchronisation configuration\"."
msgstr ""
"Lista de rutas de los directorios de dónde cargar los certificados separados "
"por comas, o la ruta individual de los certificados. Por ejemplo: /mi/"
"cert_dir, /otro/personalizado.pem. Tenga en cuenta que si realiza cambios en "
"la configuración de los certificados debe guardar los cambios antes de "
"pulsar en \"Comprobar la configuración de sincronización\"."
msgid "Ignore TLS certificate errors"
msgstr "Ignorar errores en certificados TLS"
msgstr ""
#, javascript-format
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Opción inválida: «%s». Los valores posibles son: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Archivo de exportación de Joplin"
@@ -1521,6 +1502,7 @@ msgstr "¿Desea mover %d notas a libreta «%s»?"
msgid "Press to set the decryption password."
msgstr "Presione para establecer la contraseña de descifrado."
#, fuzzy
msgid "Save alarm"
msgstr "Establecer alarma"
@@ -1533,9 +1515,9 @@ msgstr "Confirmar"
msgid "Cancel synchronisation"
msgstr "Cancelar sincronización"
#, javascript-format
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Descifrando elementos: %d/%d."
msgstr "Elementos obtenidos: %d/%d."
msgid "New tags:"
msgstr "Nuevas etiquetas:"
@@ -1671,9 +1653,6 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenido"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Ya existe una libreta con este nombre: «%s»"
#~ msgid ""
#~ "For more information about End-To-End Encryption (E2EE) and advices on "
#~ "how to enable it please check the documentation"

View File

@@ -458,11 +458,10 @@ msgstr "Sinkronizazioa hasten..."
msgid "Cancelling... Please wait."
msgstr "Bertan behera uzten... itxaron, mesedez."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> izan daiteke \"add\", \"remove\" edo \"list\" [oharra]tik "
"[etiketa] esleitu edo kentzeko, edo [etiketa]rekin elkartutako oharrak "
@@ -937,12 +936,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "Momentuz ez dago koadernorik. Sortu bat \"Koaderno berria\" sakatuta."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr ""
@@ -995,9 +988,6 @@ msgstr "Ezarri alarma"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1210,6 +1200,10 @@ msgstr "Gatazkak"
msgid "Cannot move notebook to this location"
msgstr "Ezin eraman daiteke oharra \"%s\" koadernora"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Dagoeneko bada koaderno bat izen horrekin: \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
@@ -1297,9 +1291,6 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
#, fuzzy
msgid "Global zoom percentage"
msgstr "Ezarri aplikazioaren zoomaren ehunekoa"
@@ -1368,13 +1359,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV URL"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nextcloud erabiltzaile-izena"
@@ -1410,10 +1394,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Balio aukera baliogabea: \"%s\". Litezkeen balioak: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
#, fuzzy
msgid "Joplin Export File"
msgstr "Evernotetik esportatutako fitxategiak"
@@ -1671,9 +1651,6 @@ msgstr "Oraindik ez duzu koadernorik. Sortu bat (+) botoian sakatuta."
msgid "Welcome"
msgstr "Ongi etorri!"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Dagoeneko bada koaderno bat izen horrekin: \"%s\""
#~ msgid "Searches"
#~ msgstr "Bilaketak"

View File

@@ -59,7 +59,7 @@ msgstr ""
"La commande \"%s\" est disponible uniquement en mode d'interface graphique"
msgid "Cannot change encrypted item"
msgstr "Un objet chiffré ne peut pas être modifié"
msgstr "Un objet crypté ne peut pas être modifié"
#, javascript-format
msgid "Missing required argument: %s"
@@ -127,7 +127,7 @@ msgid ""
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
"`status` and `target-status`."
msgstr ""
"Gérer la configuration E2EE (Chiffrement de bout à bout). Les commandes sont "
"Gérer la configuration E2EE (Cryptage de bout à bout). Les commandes sont "
"`enable`, `disable`, `decrypt` et `status` et `target-status`."
msgid "Enter master password:"
@@ -140,11 +140,11 @@ msgid ""
"Starting decryption... Please wait as it may take several minutes depending "
"on how much there is to decrypt."
msgstr ""
"Démarrage du déchiffrement... Veuillez patienter car cela pourrait prendre "
"plusieurs minutes selon le nombre d'objets à déchiffrer."
"Démarrage du décryptage... Veuillez patienter car cela pourrait prendre "
"plusieurs minutes selon le nombre d'objets à décrypter."
msgid "Completed decryption."
msgstr "Déchiffrement complété."
msgstr "Décryptage complété."
msgid "Enabled"
msgstr "Activé"
@@ -154,7 +154,7 @@ msgstr "Désactivé"
#, javascript-format
msgid "Encryption is: %s"
msgstr "Le chiffrement est : %s"
msgstr "Le cryptage est : %s"
msgid "Edit note."
msgstr "Éditer la note."
@@ -461,11 +461,10 @@ msgstr "Commencement de la synchronisation..."
msgid "Cancelling... Please wait."
msgstr "Annulation... Veuillez attendre."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> peut être \"add\", \"remove\" ou \"list\" pour assigner ou "
"enlever l'étiquette [tag] de la [note], our pour lister les notes associées "
@@ -572,10 +571,10 @@ msgid ""
"supplied the password, the encrypted items are being decrypted in the "
"background and will be available soon."
msgstr ""
"Au moins un objet est actuellement chiffré et il se peut que vous deviez "
"Au moins un objet est actuellement crypté et il se peut que vous deviez "
"fournir votre mot de passe maître. Pour se faire, veuillez taper `e2ee "
"decrypt`. Si vous avez déjà fourni ce mot de passe, les objets chiffrés vont "
"être déchiffré en tâche de fond et seront disponible prochainement."
"decrypt`. Si vous avez déjà fourni ce mot de passe, les objets cryptés vont "
"être décrypté en tâche de fond et seront disponible prochainement."
#, javascript-format
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
@@ -662,7 +661,7 @@ msgid "Web clipper options"
msgstr "Options du Web Clipper"
msgid "Encryption options"
msgstr "Options de chiffrement"
msgstr "Options de cryptage"
msgid "General Options"
msgstr "Options générales"
@@ -783,9 +782,9 @@ msgid ""
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
"continue?"
msgstr ""
"Désactiver le chiffrement signifie que *toutes* les notes et fichiers vont "
"être re-synchronisés et envoyés déchiffrés sur la cible de la "
"synchronisation. Souhaitez vous continuer ?"
"Désactiver le cryptage signifie que *toutes* les notes et fichiers vont être "
"re-synchronisés et envoyés décryptés sur la cible de la synchronisation. "
"Souhaitez vous continuer ?"
msgid ""
"Enabling encryption means *all* your notes and attachments are going to be "
@@ -793,17 +792,17 @@ msgid ""
"password as, for security purposes, this will be the *only* way to decrypt "
"the data! To enable encryption, please enter your password below."
msgstr ""
"Activer le chiffrement signifie que *toutes* les notes et fichiers vont être "
"re-synchronisés et envoyés chiffrés vers la cible de la synchronisation. Ne "
"Activer le cryptage signifie que *toutes* les notes et fichiers vont être re-"
"synchronisés et envoyés cryptés vers la cible de la synchronisation. Ne "
"perdez pas votre mot de passe car, pour des raisons de sécurité, ce sera la "
"*seule* façon de déchiffrer les données ! Pour activer le chiffrement, "
"veuillez entrer votre mot de passe ci-dessous."
"*seule* façon de décrypter les données ! Pour activer le cryptage, veuillez "
"entrer votre mot de passe ci-dessous."
msgid "Disable encryption"
msgstr "Désactiver le chiffrement"
msgstr "Désactiver le cryptage"
msgid "Enable encryption"
msgstr "Activer le chiffrement"
msgstr "Activer le cryptage"
msgid "Master Keys"
msgstr "Clefs maître"
@@ -834,10 +833,10 @@ msgid ""
"as \"active\"). Any of the keys might be used for decryption, depending on "
"how the notes or notebooks were originally encrypted."
msgstr ""
"Note : seule une clef maître va être utilisée pour le chiffrement (celle "
"Note : seule une clef maître va être utilisée pour le cryptage (celle "
"marquée comme \"actif\" ci-dessus). N'importe quelle clef peut être utilisée "
"pour le déchiffrement, selon la façon dont les notes ou carnets étaient "
"chiffrés à l'origine."
"pour le décryptage, selon la façon dont les notes ou carnets étaient cryptés "
"à l'origine."
msgid "Missing Master Keys"
msgstr "Clefs maître manquantes"
@@ -847,7 +846,7 @@ msgid ""
"however the application does not currently have access to them. It is likely "
"they will eventually be downloaded via synchronisation."
msgstr ""
"Les clefs maître avec ces identifiants sont utilisées pour chiffrer certains "
"Les clefs maître avec ces identifiants sont utilisées pour crypter certains "
"de vos objets, cependant le logiciel n'y a pour l'instant pas accès. Il est "
"probable qu'elle vont être prochainement disponible via la synchronisation."
@@ -855,14 +854,14 @@ msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr ""
"Pour plus d'informations sur le chiffrement de bout en bout, ainsi que des "
"Pour plus d'informations sur l'encryption de bout en bout, ainsi que des "
"conseils pour l'activer, veuillez consulter la documentation :"
msgid "Status"
msgstr "État"
msgid "Encryption is:"
msgstr "Le chiffrement est :"
msgstr "Le cryptage est :"
msgid "Back"
msgstr "Retour"
@@ -911,7 +910,7 @@ msgid "View them now"
msgstr "Les voir maintenant"
msgid "Some items cannot be decrypted."
msgstr "Certains objets ne peuvent être déchiffrés."
msgstr "Certains objets ne peuvent être décryptés."
msgid "Set the password"
msgstr "Définir le mot de passe"
@@ -948,12 +947,6 @@ msgstr ""
"Il n'y a pour l'instant aucun carnet. Créez-en un en cliquant sur \"Nouveau "
"carnet\"."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Ouvrir..."
@@ -1007,9 +1000,6 @@ msgstr "Régler alarme"
msgid "In: %s"
msgstr "Dans : %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr "Lien"
@@ -1066,7 +1056,7 @@ msgid "Synchronisation Status"
msgstr "État de la synchronisation"
msgid "Encryption Options"
msgstr "Options de chiffrement"
msgstr "Options de cryptage"
msgid "Clipper Options"
msgstr "Options du Web Clipper"
@@ -1204,10 +1194,10 @@ msgid "Synchronisation is already in progress. State: %s"
msgstr "La synchronisation est déjà en cours. État : %s"
msgid "Encrypted"
msgstr "Chiffré"
msgstr "Crypté"
msgid "Encrypted items cannot be modified"
msgstr "Les objets chiffrés ne peuvent être modifiés"
msgstr "Les objets cryptés ne peuvent être modifiés"
msgid "Conflicts"
msgstr "Conflits"
@@ -1215,6 +1205,10 @@ msgstr "Conflits"
msgid "Cannot move notebook to this location"
msgstr "Impossible de déplacer le carnet à cet endroit"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Un carnet avec ce titre existe déjà : \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Les carnets ne peuvent être nommés \"%s\" car c'est un nom réservé."
@@ -1293,9 +1287,6 @@ msgstr "Afficher l'icône dans la zone de notifications"
msgid "Note: Does not work in all desktop environments."
msgstr "Note : Ne fonctionne pas dans tous les environnements de bureau."
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Niveau de zoom"
@@ -1365,13 +1356,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud : URL WebDAV"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nextcloud : Nom utilisateur"
@@ -1409,10 +1393,6 @@ 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."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Fichier d'export Joplin"
@@ -1441,7 +1421,7 @@ msgid ""
"This item is currently encrypted: %s \"%s\". Please wait for all items to be "
"decrypted and try again."
msgstr ""
"Cet objet est chiffré : %s \"%s\". Veuillez attendre que tout soit déchiffré "
"Cet objet est crypté : %s \"%s\". Veuillez attendre que tout soit décrypté "
"et réessayez."
msgid "There is no data to export."
@@ -1514,7 +1494,7 @@ msgid "Export Debug Report"
msgstr "Exporter rapport de débogage"
msgid "Encryption Config"
msgstr "Config chiffrement"
msgstr "Config cryptage"
msgid "Configuration"
msgstr "Configuration"
@@ -1543,7 +1523,7 @@ msgstr "Annuler synchronisation"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Déchiffrement des objets : %d/%d"
msgstr "Décryptage des objets : %d/%d"
msgid "New tags:"
msgstr "Nouvelles étiquettes :"
@@ -1679,15 +1659,12 @@ msgstr ""
msgid "Welcome"
msgstr "Bienvenue"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Un carnet avec ce titre existe déjà : \"%s\""
#~ msgid ""
#~ "For more information about End-To-End Encryption (E2EE) and advices on "
#~ "how to enable it please check the documentation"
#~ msgstr ""
#~ "Pour plus d'informations sur le chiffrement de bout en bout, ainsi que "
#~ "des conseils pour l'activer, veuillez consulter la documentation"
#~ "Pour plus d'informations sur l'encryption de bout en bout, ainsi que des "
#~ "conseils pour l'activer, veuillez consulter la documentation"
#~ msgid "Searches"
#~ msgstr "Recherches"

View File

@@ -455,11 +455,10 @@ msgstr "Iniciando sincronización..."
msgid "Cancelling... Please wait."
msgstr "Cancelando... Agarde."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> pode ser «add», «remove» ou «list» para asignar ou eliminar "
"[tag] da [note] ou para listar as notas asociadas con [tag]. A orde «list» "
@@ -925,12 +924,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "Este no é un caderno. Cree un, premendo en «Novo caderno»."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Abrir…"
@@ -984,9 +977,6 @@ msgstr "Estabelecer alarma"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1194,6 +1184,10 @@ msgstr "Conflitos"
msgid "Cannot move notebook to this location"
msgstr "Non é posíbel mover a nota ao caderno «%s»"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Xa existe un caderno con ese título: «%s»"
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Os cadernos non poden levar o nome «%s» porque é un título reservado."
@@ -1276,9 +1270,6 @@ msgstr "Mostrar a icona na bandexa"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Porcentaxe de ampliación"
@@ -1349,13 +1340,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "URL de Nextcloud WebDAV"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Usuario de Nextcloud"
@@ -1388,10 +1372,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Valor incorrecto de opción: «%s». Os valores posíbeis son: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Ficheiro de exportación do Joplin"
@@ -1648,6 +1628,3 @@ msgstr "Non ten cadernos actualmente. Cree un premendo no botón (+)."
msgid "Welcome"
msgstr "Benvido/a"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Xa existe un caderno con ese título: «%s»"

View File

@@ -462,7 +462,7 @@ msgstr "Prekidam... Pričekaj."
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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<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 "
@@ -924,12 +924,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "Ovdje nema bilježnica. Stvori novu pritiskom na \"Nova bilježnica\"."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr ""
@@ -982,9 +976,6 @@ msgstr "Postavi upozorenje"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1193,6 +1184,10 @@ msgstr "Sukobi"
msgid "Cannot move notebook to this location"
msgstr "Ne mogu premjestiti bilješku u bilježnicu %s"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Bilježnica s ovim naslovom već postoji: \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Naslov \"%s\" je rezerviran i ne može se koristiti."
@@ -1280,9 +1275,6 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1348,13 +1340,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr ""
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr ""
@@ -1387,10 +1372,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Nevažeća vrijednost: \"%s\". Moguće vrijednosti su: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
#, fuzzy
msgid "Joplin Export File"
msgstr "Evernote izvozne datoteke"
@@ -1647,9 +1628,6 @@ msgstr "Trenutno nemaš nijednu bilježnicu. Stvori novu klikom na (+) gumb."
msgid "Welcome"
msgstr "Dobro došli"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Bilježnica s ovim naslovom već postoji: \"%s\""
#~ msgid "Searches"
#~ msgstr "Pretraživanja"

File diff suppressed because it is too large Load Diff

View File

@@ -447,11 +447,10 @@ 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 "
"`tag list` can be used to list all the tags (use -l for long option)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> は\"add\", \"remove\", \"list\"のいずれかで、指定したノートから"
"タグをつけたり外したり出来ます。`tag list`で、すべてのタグを見ることが出来ま"
@@ -915,12 +914,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "ノートブックがありません。新しいノートブックを作成してください。"
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr ""
@@ -973,9 +966,6 @@ msgstr "アラームをセット"
msgid "In: %s"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1186,6 +1176,10 @@ msgstr "衝突"
msgid "Cannot move notebook to this location"
msgstr "ノートをノートブック \"%s\"に移動できませんでした。"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "\"%s\"という名前のノートブックはすでに存在しています。"
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
@@ -1275,9 +1269,6 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1343,13 +1334,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr ""
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr ""
@@ -1382,10 +1366,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "無効な設定値: \"%s\"。有効な値は: %sです。"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
#, fuzzy
msgid "Joplin Export File"
msgstr "Evernote Exportファイル"
@@ -1644,9 +1624,6 @@ msgstr ""
msgid "Welcome"
msgstr "ようこそ"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "\"%s\"という名前のノートブックはすでに存在しています。"
#~ msgid "Searches"
#~ msgstr "検索"

View File

@@ -414,7 +414,7 @@ msgstr ""
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)."
"`tag list` can be used to list all the tags."
msgstr ""
#, javascript-format
@@ -842,12 +842,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr ""
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr ""
@@ -899,9 +893,6 @@ msgstr ""
msgid "In: %s"
msgstr ""
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1098,6 +1089,10 @@ msgstr ""
msgid "Cannot move notebook to this location"
msgstr ""
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr ""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
@@ -1176,9 +1171,6 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1238,13 +1230,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr ""
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr ""
@@ -1277,10 +1262,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr ""
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -459,11 +459,10 @@ msgstr "Synchronisatie starten..."
msgid "Cancelling... Please wait."
msgstr "Annuleren.. Even geduld."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> kan \"add\", \"remove\" of \"list\" zijn om een [tag] toe te "
"voegen aan een [note] of te verwijderen, of om alle notities geassocieerd "
@@ -941,12 +940,6 @@ msgstr ""
"U heeft momenteel geen notitieboek. Maak een notitieboek door op \"Nieuw "
"notitieboek\" te klikken."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr ""
@@ -999,9 +992,6 @@ msgstr "Zet melding"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1212,6 +1202,10 @@ msgstr "Conflicten"
msgid "Cannot move notebook to this location"
msgstr "Kan notitie niet naar notitieboek \"%s\" verplaatsen."
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Er bestaat al een notitieboek met \"%s\" als titel"
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
@@ -1300,9 +1294,6 @@ msgstr ""
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr ""
@@ -1369,13 +1360,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr ""
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr ""
@@ -1410,10 +1394,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Ongeldige optie: \"%s\". Geldige waarden zijn: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
#, fuzzy
msgid "Joplin Export File"
msgstr "Exporteer Evernote bestanden"
@@ -1675,9 +1655,6 @@ msgstr ""
msgid "Welcome"
msgstr "Welkom"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Er bestaat al een notitieboek met \"%s\" als titel"
#~ msgid "Searches"
#~ msgstr "Zoekopdrachten"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -246,8 +246,9 @@ msgstr ""
"Use as setas e a Page Up/Page Down para rolar as listas e áreas de texto "
"(incluindo este console)."
#, fuzzy
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "Para maximizar / minimizar o console, pressione \"tc\"."
msgstr "Para maximizar / minimizar o console, pressione \"TC\"."
msgid "To enter command line mode, press \":\""
msgstr "Para entrar no modo de linha de comando, pressione \":\""
@@ -362,11 +363,12 @@ msgstr "Exclui o caderno informado."
msgid "Deletes the notebook without asking for confirmation."
msgstr "Exclui o caderno sem pedir confirmação."
#, fuzzy
msgid ""
"Delete notebook? All notes and sub-notebooks within this notebook will also "
"be deleted."
msgstr ""
"Excluir o caderno? Todas as notas e sub-cadernos dentro deste também serão "
"Excluir o caderno? Todas as notas deste caderno notebook também serão "
"excluídas."
msgid "Deletes the notes matching <note-pattern>."
@@ -457,11 +459,10 @@ msgstr "Iniciando sincronização..."
msgid "Cancelling... Please wait."
msgstr "Cancelando... Aguarde."
#, fuzzy
msgid ""
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
"[tag] from [note], or to list the notes associated with [tag]. The command "
"`tag list` can be used to list all the tags (use -l for long option)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> pode ser \"add\", \"remove\" ou \"list\" para atribuir ou "
"remover [tag] de [nota], ou para listar as notas associadas a [tag]. O "
@@ -626,16 +627,16 @@ msgid "Paste"
msgstr "Colar"
msgid "Bold"
msgstr "Negrito"
msgstr ""
msgid "Italic"
msgstr "Itálico"
msgstr ""
msgid "Insert Date Time"
msgstr "Inserir Data e Hora"
msgstr ""
msgid "Edit in external editor"
msgstr "Editar com editor externo"
msgstr ""
msgid "Search in all the notes"
msgstr "Pesquisar em todas as notas"
@@ -644,7 +645,7 @@ msgid "View"
msgstr "Visualizar"
msgid "Toggle sidebar"
msgstr "Alternar barra lateral"
msgstr ""
msgid "Toggle editor layout"
msgstr "Alternar layout do editor"
@@ -656,7 +657,7 @@ msgid "Synchronisation status"
msgstr "Status de sincronização"
msgid "Web clipper options"
msgstr "Opções do Web clipper"
msgstr ""
msgid "Encryption options"
msgstr "Opções de Encriptação"
@@ -710,52 +711,46 @@ msgstr "Não"
msgid "The web clipper service is enabled and set to auto-start."
msgstr ""
"O serviço de web clipper está habilitado e configurado para auto-start."
#, javascript-format
msgid "Status: Started on port %d"
msgstr "Status: Iniciado, na porta %d"
msgstr ""
#, javascript-format
#, fuzzy, javascript-format
msgid "Status: %s"
msgstr "Status: \"%s\"."
msgstr "Estado: \"%s\"."
msgid "Disable Web Clipper Service"
msgstr "Desabilitar serviço Web Clipper"
msgstr ""
msgid "The web clipper service is not enabled."
msgstr "O serviço de web clipper não está habilitado."
msgstr ""
msgid "Enable Web Clipper Service"
msgstr "Habilitar serviço Web Clipper"
msgstr ""
msgid ""
"Joplin Web Clipper allows saving web pages and screenshots from your browser "
"to Joplin."
msgstr ""
"O serviço de Web Clipper do Joplin permite salvar páginas da web e "
"screenshots do seu browser, no Joplin."
msgid "In order to use the web clipper, you need to do the following:"
msgstr "Para usar o web clipper, você precisa fazer o seguinte:"
msgstr ""
msgid "Step 1: Enable the clipper service"
msgstr "Passo 1: Habilitar o serviço do clipper"
msgstr ""
msgid ""
"This service allows the browser extension to communicate with Joplin. When "
"enabling it your firewall may ask you to give permission to Joplin to listen "
"to a particular port."
msgstr ""
"Este serviço permite a extensão do browser se comunicat com o Joplin. Quando "
"habilitar, talvez seu firewall peça que você conceda permissão ao Joplin "
"para escutar determinada porta."
msgid "Step 2: Install the extension"
msgstr "Passo 2: Instalar a extensão"
msgstr ""
msgid "Download and install the relevant extension for your browser:"
msgstr "Baixe e instale a extensão relevante para seu browser:"
msgstr ""
msgid "Check synchronisation configuration"
msgstr "Verificar a configuração da sincronização"
@@ -765,7 +760,7 @@ msgid "Notes and settings are stored in: %s"
msgstr "Notas e configurações estão armazenadas em: %s"
msgid "Apply"
msgstr "Aplicar"
msgstr ""
msgid "Submit"
msgstr "Enviar"
@@ -884,8 +879,9 @@ msgstr "Separe cada tag por vírgula."
msgid "Rename notebook:"
msgstr "Renomear caderno:"
#, fuzzy
msgid "Rename tag:"
msgstr "Renomear tag:"
msgstr "Renomear"
msgid "Set alarm:"
msgstr "Definir alarme:"
@@ -912,17 +908,18 @@ msgid "Add or remove tags"
msgstr "Adicionar ou remover tags"
msgid "Duplicate"
msgstr "Duplicar"
msgstr ""
#, javascript-format
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "%s - Copiar"
msgstr "Copiar"
msgid "Switch between note and to-do type"
msgstr "Alternar entre os tipos Nota e Tarefa"
#, fuzzy
msgid "Copy Markdown link"
msgstr "Copiar link de Markdown"
msgstr "Markdown"
msgid "Delete"
msgstr "Excluir"
@@ -937,27 +934,21 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "Atualmente, não há cadernos. Crie um, clicando em \"Novo caderno\"."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Abrir..."
#, javascript-format
#, fuzzy, javascript-format
msgid "This file could not be opened: %s"
msgstr "Este arquivo não pôde ser aberto: %s"
msgstr "O caderno não pôde ser salvo: %s"
msgid "Save as..."
msgstr "Salvar como..."
msgid "Copy path to clipboard"
msgstr "Copiar caminho para a área de transferência"
msgstr ""
msgid "Copy Link Address"
msgstr "Copiar endereço do link"
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
@@ -972,16 +963,16 @@ msgstr ""
"e edite a nota."
msgid "strong text"
msgstr "texto forte"
msgstr ""
msgid "emphasized text"
msgstr "texto enfatizado"
msgstr ""
msgid "List item"
msgstr "Listar item"
msgstr ""
msgid "Insert Hyperlink"
msgstr "Inserir Hiperlink"
msgstr ""
msgid "Attach file"
msgstr "Anexar arquivo"
@@ -992,39 +983,37 @@ msgstr "Tags"
msgid "Set alarm"
msgstr "Definir alarme"
#, javascript-format
#, fuzzy, javascript-format
msgid "In: %s"
msgstr "Em: %s"
msgid "Note properties"
msgstr ""
msgstr "%s: %s"
msgid "Hyperlink"
msgstr "Hiperlink"
msgstr ""
msgid "Code"
msgstr "Código"
msgstr ""
msgid "Numbered List"
msgstr "Lista numerada"
msgstr ""
msgid "Bulleted List"
msgstr "Lista com bullets"
msgstr ""
msgid "Checkbox"
msgstr "Checkbox"
msgstr ""
msgid "Heading"
msgstr "Cabeçalho"
msgstr ""
msgid "Horizontal Rule"
msgstr "Régua horizontal"
msgstr ""
msgid "Click to stop external editing"
msgstr "Clique para encerrar edição externa"
msgstr ""
#, fuzzy
msgid "Watching..."
msgstr "Verificando..."
msgstr "Cancelando..."
msgid "to-do"
msgstr "tarefa"
@@ -1057,8 +1046,9 @@ msgstr "Status de sincronização"
msgid "Encryption Options"
msgstr "Opções de Encriptação"
#, fuzzy
msgid "Clipper Options"
msgstr "Opções do clipper"
msgstr "Opções Gerais"
msgid "Remove this tag from all the notes?"
msgstr "Remover esta tag de todas as notas?"
@@ -1202,22 +1192,30 @@ msgstr "Itens encriptados não podem ser modificados"
msgid "Conflicts"
msgstr "Conflitos"
#, fuzzy
msgid "Cannot move notebook to this location"
msgstr "Não é possível mover a nota para este local"
msgstr "Não é possível mover a nota para o caderno \"%s\""
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Já existe caderno com este título: \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr ""
"Os cadernos não podem ser nomeados como\"%s\", que é um título reservado."
#, fuzzy
msgid "title"
msgstr "título"
msgstr "Sem título"
#, fuzzy
msgid "updated date"
msgstr "data de ataualização"
msgstr "Atualizado: %d."
#, fuzzy
msgid "created date"
msgstr "data de criação"
msgstr "Criado: %d."
msgid "Untitled"
msgstr "Sem título"
@@ -1254,8 +1252,9 @@ msgstr "Dark"
msgid "Uncompleted to-dos on top"
msgstr "Mostrar tarefas incompletas no topo"
#, fuzzy
msgid "Show completed to-dos"
msgstr "Mostrar tarefas completas"
msgstr "Mostrar tarefas incompletas no topo"
msgid "Sort notes by"
msgstr "Ordenar notas por"
@@ -1282,9 +1281,6 @@ msgid "Show tray icon"
msgstr "Exibir tray icon"
msgid "Note: Does not work in all desktop environments."
msgstr "Nota: não funciona em todos os ambientes de desktop"
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
@@ -1293,12 +1289,13 @@ msgstr "Porcentagem global do zoom"
msgid "Editor font family"
msgstr "Família de fontes do editor"
#, fuzzy
msgid ""
"This must be *monospace* font or it will not work properly. If the font is "
"incorrect or empty, it will default to a generic monospace font."
msgstr ""
"Deve ser uma fonte *monospace\" ou não vai funcionar direito. Se a fonte "
"estiver incorreta ou vazia, será usada uma fonte genérica monospace default."
"O nomes da fonte não será verificado. Se estiver incorreto ou vazio, será "
"usado por default uma fonte genérica monospace."
msgid "Automatically update the application"
msgstr "Atualizar automaticamente o aplicativo"
@@ -1318,16 +1315,17 @@ msgstr "%d hora"
msgid "%d hours"
msgstr "%d horas"
#, fuzzy
msgid "Text editor command"
msgstr "Comando do editor de texto"
msgstr "Editor de texto"
#, fuzzy
msgid ""
"The editor command (may include arguments) that will be used to open a note. "
"If none is provided it will try to auto-detect the default editor."
msgstr ""
"O comando do editor (pode incluir argumentos) que será usado para abrir uma "
"nota. Se nenhum for indicado, ele tentará detectar automaticamente o editor "
"padrão."
"O editor que será usado para abrir uma nota. Se nenhum for indicado, ele "
"tentará detectar automaticamente o editor padrão."
msgid "Show advanced options"
msgstr "Mostrar opções avançadas"
@@ -1355,13 +1353,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV URL"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Usuário da Nextcloud"
@@ -1378,7 +1369,7 @@ msgid "WebDAV password"
msgstr "Senha do WebDAV"
msgid "Custom TLS certificates"
msgstr "Certificados TLS customizados"
msgstr ""
msgid ""
"Comma-separated list of paths to directories to load the certificates from, "
@@ -1386,23 +1377,14 @@ msgid ""
"pem. Note that if you make changes to the TLS settings, you must save your "
"changes before clicking on \"Check synchronisation configuration\"."
msgstr ""
"Lista de caminhos para diretórios, separados por vírgula, de onde carregar "
"os certificados, ou caminhos para arquivos cert. Por exemplo, /my/cert_dir, /"
"other/custom.pem. Note que se você fizer mudanças nas configurações de TLS, "
"você tem que salvar as mudanças antes de clicar em \"Verificar a "
"configuração da sincronização\""
msgid "Ignore TLS certificate errors"
msgstr "Ignorar erros de certificados TLS"
msgstr ""
#, javascript-format
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Valor da opção inválida: \"%s\". Os valores possíveis são: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Arquivo de Exportação do Joplin"
@@ -1518,8 +1500,9 @@ msgstr "Mover %d notas para o caderno \"%s\"?"
msgid "Press to set the decryption password."
msgstr "Pressione para configurar a senha de decriptação."
#, fuzzy
msgid "Save alarm"
msgstr "Salvar alarme"
msgstr "Definir alarme"
msgid "Select date"
msgstr "Selecionar data"
@@ -1530,9 +1513,9 @@ msgstr "Confirmar"
msgid "Cancel synchronisation"
msgstr "Cancelar sincronização"
#, javascript-format
#, fuzzy, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "Decriptando itens: %d/%d."
msgstr "Itens pesquisados: %d/%d."
msgid "New tags:"
msgstr "Novas tags:"
@@ -1544,24 +1527,17 @@ msgid ""
"To work correctly, the app needs the following permissions. Please enable "
"them in your phone settings, in Apps > Joplin > Permissions"
msgstr ""
"Para funcionar corretamente, o app precisa das seguintes permissões. Por "
"favor, habilite-as nas configurações do seu telefone, em Apps >Joplin > "
"Permissões"
msgid ""
"- Storage: to allow attaching files to notes and to enable filesystem "
"synchronisation."
msgstr ""
"- Armazenamento: para permitir anexar arquivos a notas, e para permitir a "
"sincronização do sistema de arquivos "
msgid "- Camera: to allow taking a picture and attaching it to a note."
msgstr "- Câmera: para permitir tirar fotos e anexar a uma nota."
msgstr ""
msgid "- Location: to allow attaching geo-location information to a note."
msgstr ""
"- Localização: para permitir anexar informações de geo-localização a uma "
"nota."
msgid "Joplin website"
msgstr "Site do Joplin"
@@ -1610,11 +1586,11 @@ msgstr "Descartar alterações"
#, javascript-format
msgid "No item with ID %s"
msgstr "Nenhum item com ID %s"
msgstr ""
#, javascript-format
msgid "The Joplin mobile app does not currently support this type of link: %s"
msgstr "O app mobile do Joplin não suporta, atualmente, esse tipo de link: %s"
msgstr ""
#, javascript-format
msgid "Unsupported image type: %s"
@@ -1627,7 +1603,7 @@ msgid "Attach any file"
msgstr "Anexar qualquer arquivo"
msgid "Share"
msgstr "Compartilhar"
msgstr ""
msgid "Convert to note"
msgstr "Converter para nota"
@@ -1666,9 +1642,6 @@ msgstr "Você não possui cadernos. Crie um clicando no botão (+)."
msgid "Welcome"
msgstr "Bem-vindo"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Já existe caderno com este título: \"%s\""
#~ msgid "Searches"
#~ msgstr "Pesquisas"

File diff suppressed because it is too large Load Diff

View File

@@ -459,11 +459,10 @@ 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 "
"`tag list` can be used to list all the tags (use -l for long option)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> может быть «add», «remove» или «list», чтобы назначить или "
"убрать [tag] с [note], или чтобы вывести список заметок, ассоциированых с "
@@ -935,12 +934,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "Сейчас здесь нет блокнотов. Создайте новый нажав «Новый блокнот»."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Открыть..."
@@ -994,9 +987,6 @@ msgstr "Установить напоминание"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1204,6 +1194,10 @@ msgstr "Конфликты"
msgid "Cannot move notebook to this location"
msgstr "Не удалось переместить заметку в блокнот «%s»"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Блокнот с таким названием уже существует: «%s»"
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Блокнот не может быть назван «%s», это зарезервированное название."
@@ -1286,9 +1280,6 @@ msgstr "Показывать иконку в панели задач"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Глобальный масштаб в процентах"
@@ -1359,13 +1350,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV URL"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Имя пользователя Nextcloud"
@@ -1398,10 +1382,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Неверное значение параметра: «%s». Доступные значения: %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Файл экспорта Joplin"
@@ -1660,9 +1640,6 @@ msgstr "У вас сейчас нет блокнота. Создайте его
msgid "Welcome"
msgstr "Добро пожаловать"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Блокнот с таким названием уже существует: «%s»"
#~ msgid "Searches"
#~ msgstr "Запросы"

View File

@@ -458,11 +458,10 @@ msgstr "Sinhronizacija se začenja."
msgid "Cancelling... Please wait."
msgstr "V preklicu...Prosim počakajte."
#, 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)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> je lahko \"dodaj\", \"odstrani\" ali \"naštej\", da dodeliš "
"ali odstraniš [tag] from [note] ali našteje zabeležke povezane z oznako "
@@ -939,12 +938,6 @@ msgstr ""
"Trenutno ni tukaj nobene beležnice. Ustvarite jo z klikom na \"Nova beležnica"
"\"."
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "Odpri..."
@@ -998,9 +991,6 @@ msgstr "Nastavi alarm"
msgid "In: %s"
msgstr "%s: %s"
msgid "Note properties"
msgstr ""
msgid "Hyperlink"
msgstr ""
@@ -1208,6 +1198,10 @@ msgstr "Konfikti"
msgid "Cannot move notebook to this location"
msgstr "Ni moč premakniti zabeležke v \"%s\" beležnico"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "Beležnica s tem naslovom že obstaja: \"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "Beležnica ne more biti imenovana \"%s\", ker je to rezerviran naslov."
@@ -1290,9 +1284,6 @@ msgstr "Pokaži ikono v območju za obvestila(opravilna vrstica)"
msgid "Note: Does not work in all desktop environments."
msgstr ""
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "Celokupen procent povečave"
@@ -1363,13 +1354,6 @@ msgstr ""
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV URL"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nextcloud uporabniško ime"
@@ -1402,10 +1386,6 @@ msgstr ""
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "Neveljavna vrednost: \"%s\". Možne vrednosti so : %s."
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Joplin izvozna datoteka"
@@ -1663,8 +1643,5 @@ msgstr "Trenutno nimate nobene beležnice. Ustvarite jo s klikom na (+) gumb."
msgid "Welcome"
msgstr "Dobrodošli"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "Beležnica s tem naslovom že obstaja: \"%s\""
#~ msgid "Searches"
#~ msgstr "Iskalni niz"

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.1.1\n"
"X-Generator: Poedit 2.0.8\n"
msgid "To delete a tag, untag the associated notes."
msgstr "移除相关笔记的标签后才可删除此标签。"
@@ -247,7 +247,7 @@ msgstr "按 ESC 键退出命令行模式"
msgid ""
"For the list of keyboard shortcuts and config options, type `help keymap`"
msgstr "输入 `help keymap` 来获取完整的键盘快捷键列表"
msgstr "输入 `help keymap` 来获取完整的键盘快捷键列表"
msgid "Imports data into Joplin."
msgstr "导入数据至 Jolin。"
@@ -434,11 +434,10 @@ 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 "
"`tag list` can be used to list all the tags (use -l for long option)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> 可以是 \"add\", \"remove\" 或者 \"list\" 从 [note] 中分配或删"
"除 [tag],或者列出与 [tag] 相关的笔记。`tag list` 命令将列出所有的标签。"
@@ -466,7 +465,7 @@ msgid ""
msgstr "切换至 [notebook] - 所有进一步处理将在此笔记本中进行。"
msgid "Displays version information"
msgstr "显示版本信息"
msgstr "显示版本信息"
#, javascript-format
msgid "%s %s (%s)"
@@ -684,7 +683,7 @@ msgstr "状态:从端口 %d 开始"
#, javascript-format
msgid "Status: %s"
msgstr "状态:%s"
msgstr "状态:\"%s\"。"
msgid "Disable Web Clipper Service"
msgstr "禁用网页剪辑服务"
@@ -779,7 +778,7 @@ msgid "Updated"
msgstr "更新日期"
msgid "Password"
msgstr "密码"
msgstr "密码"
msgid "Password OK"
msgstr "密码可用"
@@ -841,7 +840,7 @@ msgid "Rename notebook:"
msgstr "重命名笔记本:"
msgid "Rename tag:"
msgstr "重命名标签"
msgstr "重命名标签"
msgid "Set alarm:"
msgstr "设置提醒:"
@@ -868,11 +867,11 @@ msgid "Add or remove tags"
msgstr "添加或删除标签"
msgid "Duplicate"
msgstr "重复的"
msgstr ""
#, javascript-format
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "%s - 副本"
msgstr "复制"
msgid "Switch between note and to-do type"
msgstr "在笔记和待办事项类型之间切换"
@@ -893,12 +892,6 @@ msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "此处没有任何笔记本。点击\"新笔记本\"创建。"
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "打开…"
@@ -932,7 +925,7 @@ msgid "emphasized text"
msgstr "强调文本"
msgid "List item"
msgstr "项目列表"
msgstr ""
msgid "Insert Hyperlink"
msgstr "插入超链接"
@@ -948,10 +941,7 @@ msgstr "设置提醒"
#, javascript-format
msgid "In: %s"
msgstr ": %s"
msgid "Note properties"
msgstr ""
msgstr "In: %s"
msgid "Hyperlink"
msgstr "超链接"
@@ -975,10 +965,11 @@ msgid "Horizontal Rule"
msgstr "水平线"
msgid "Click to stop external editing"
msgstr "点击以停止外部编辑"
msgstr ""
#, fuzzy
msgid "Watching..."
msgstr "正在监控变化..."
msgstr "正在取消..."
msgid "to-do"
msgstr "待办事项"
@@ -997,10 +988,10 @@ msgid "Clear"
msgstr "清除"
msgid "OneDrive Login"
msgstr "登 OneDrive"
msgstr "登 OneDrive"
msgid "Dropbox Login"
msgstr "登 Dropbox"
msgstr "登 Dropbox"
msgid "Options"
msgstr "选项"
@@ -1064,7 +1055,7 @@ msgstr "未知日志级别:%s"
#, javascript-format
msgid "Unknown level ID: %s"
msgstr "未知的级别 ID:%s"
msgstr "未知 level ID:%s"
msgid ""
"Cannot refresh token: authentication data is missing. Starting the "
@@ -1141,13 +1132,13 @@ msgstr "正在进行"
#, javascript-format
msgid "Synchronisation is already in progress. State: %s"
msgstr "同步正在进行中。状态:%s"
msgstr "同步正在进行中。状态:\"%s\""
msgid "Encrypted"
msgstr "已加密"
msgid "Encrypted items cannot be modified"
msgstr "无法修改加密项目"
msgstr "无法修改加密项目"
msgid "Conflicts"
msgstr "冲突文件"
@@ -1155,6 +1146,10 @@ msgstr "冲突文件"
msgid "Cannot move notebook to this location"
msgstr "无法移动笔记本到该位置"
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr "以此标题命名的笔记本已存在:\"%s\""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "笔记本无法被命名为 \"%s\",此标题为保留标题。"
@@ -1210,7 +1205,7 @@ msgid "Sort notes by"
msgstr "排序笔记"
msgid "Reverse sort order"
msgstr "反转排序顺序"
msgstr "反转排序顺序"
msgid "Save geo-location with notes"
msgstr "保存笔记时同时保存地理定位信息"
@@ -1233,9 +1228,6 @@ msgstr "显示托盘图标"
msgid "Note: Does not work in all desktop environments."
msgstr "注意:在所有的桌面环境中都不能工作。"
msgid "Start application minimised in the tray icon"
msgstr "启动应用程序时在托盘中最小化"
msgid "Global zoom percentage"
msgstr "全局缩放比例"
@@ -1257,25 +1249,25 @@ msgstr "同步间隔"
#, javascript-format
msgid "%d minutes"
msgstr "%d 分钟"
msgstr "%d"
#, javascript-format
msgid "%d hour"
msgstr "%d 小时"
msgstr "%d小时"
#, javascript-format
msgid "%d hours"
msgstr "%d 小时"
msgstr "%d小时"
#, fuzzy
msgid "Text editor command"
msgstr "文本编辑器命令"
msgstr "文本编辑器"
#, fuzzy
msgid ""
"The editor command (may include arguments) that will be used to open a note. "
"If none is provided it will try to auto-detect the default editor."
msgstr ""
"此文本编辑器命令(可能包括参数)将会被用于打开笔记。若未提供将尝试自动检测默"
"认编辑器。"
msgstr "此编辑器将会被用于打开笔记。若未提供将自动检测默认编辑器。"
msgid "Show advanced options"
msgstr "显示高级选项"
@@ -1299,16 +1291,7 @@ msgid ""
msgstr "文件系统同步启用时的同步目录。见 `sync.target`。"
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV 链接"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
"注意:如果您更改此位置,请确保在同步之前将所有内容复制到该位置,否则将删除所"
"有文件! 有关详细信息,请参阅常见问题解答(FAQ):%s"
msgstr "Nextcloud WebDAV URL"
msgid "Nextcloud username"
msgstr "Nextcloud 用户名"
@@ -1317,7 +1300,7 @@ msgid "Nextcloud password"
msgstr "Nextcloud 密码"
msgid "WebDAV URL"
msgstr "WebDAV 链接"
msgstr "WebDAV URL"
msgid "WebDAV username"
msgstr "WebDAV 用户名"
@@ -1326,7 +1309,7 @@ msgid "WebDAV password"
msgstr "WebDAV 密码"
msgid "Custom TLS certificates"
msgstr "自定义 TLS 证书"
msgstr ""
msgid ""
"Comma-separated list of paths to directories to load the certificates from, "
@@ -1334,29 +1317,22 @@ msgid ""
"pem. Note that if you make changes to the TLS settings, you must save your "
"changes before clicking on \"Check synchronisation configuration\"."
msgstr ""
"以逗号分隔的路径列表,可以是包含证书的目录,也可以是单独的证书路径。 例如:/"
"my/cert_dir,/other/custom.pem。 请注意,如果更改 TLS 设置,则必须先保存更改,"
"然后再点击『检查同步配置』。"
msgid "Ignore TLS certificate errors"
msgstr "忽略 TLS 证书的错误"
msgstr ""
#, javascript-format
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "无效设置数值:\"%s\"。可用值为:%s。"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr "标签“%s”已经存在。请选择一个不一样的名字。"
msgid "Joplin Export File"
msgstr "Joplin 出文件"
msgstr "Joplin 出文件"
msgid "Markdown"
msgstr "Markdown"
msgid "Joplin Export Directory"
msgstr "Joplin 导出目录"
msgstr "Joplin 输出文件目录"
msgid "Evernote Export File"
msgstr "Evernote 导出文件"
@@ -1366,7 +1342,7 @@ msgstr "文件目录"
#, javascript-format
msgid "Cannot load \"%s\" module for format \"%s\""
msgstr "无法加载 \"%s\" 模块读取 \"%s\" 格式"
msgstr "无法加载 \"%s\" 模块读取 \"%s\" 格式"
#, javascript-format
msgid "Please specify import format for %s"
@@ -1385,7 +1361,7 @@ msgid "Please specify the notebook where the notes should be imported to."
msgstr "请指定导入笔记的目标笔记本。"
msgid "Items that cannot be synchronised"
msgstr "无法同步项目"
msgstr "项目无法同步"
#, javascript-format
msgid "%s (%s): %s"
@@ -1461,7 +1437,7 @@ msgid "Press to set the decryption password."
msgstr "按键将设置解密密码。"
msgid "Save alarm"
msgstr "保存提醒"
msgstr "设置提醒"
msgid "Select date"
msgstr "选择日期"
@@ -1486,8 +1462,8 @@ msgid ""
"To work correctly, the app needs the following permissions. Please enable "
"them in your phone settings, in Apps > Joplin > Permissions"
msgstr ""
"为了正常的使用,应用需要以下权限。请在你的手机设置(应用 > Joplin > 权限)中"
"启用它们"
"为了正确地工作,应用需要以下权限。请在你的手机设置(应用 > Joplin > 权限)中"
"启用它们"
msgid ""
"- Storage: to allow attaching files to notes and to enable filesystem "
@@ -1504,7 +1480,7 @@ msgid "Joplin website"
msgstr "Joplin 官网"
msgid "Login with Dropbox"
msgstr "通过 Dropbox 登"
msgstr "通过 Dropbox 登"
#, javascript-format
msgid "Master Key %s"
@@ -1585,7 +1561,7 @@ msgid "Delete notebook"
msgstr "删除笔记本"
msgid "Login with OneDrive"
msgstr "通过 OneDrive 登"
msgstr "通过 OneDrive 登"
msgid "Search"
msgstr "搜索"
@@ -1601,8 +1577,5 @@ msgstr "您目前未有笔记本。点击(+)按钮创建。"
msgid "Welcome"
msgstr "欢迎"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "以此标题命名的笔记本已存在:\"%s\""
#~ msgid "Searches"
#~ msgstr "搜索历史"

View File

@@ -16,14 +16,15 @@ msgstr ""
"X-Generator: Poedit 2.0.8\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#, fuzzy
msgid "To delete a tag, untag the associated notes."
msgstr "要刪除標籤,請取消關聯已標籤的記事。"
msgstr "要刪除標籤,請取消關聯已標籤的記事。"
msgid "Please select the note or notebook to be deleted first."
msgstr "請先選擇要刪除的記事或記事本。"
msgid "Press Ctrl+D or type \"exit\" to exit the application"
msgstr " Ctrl+D 或鍵入 \"exit\" 以退出應用程式"
msgstr "Press Ctrl+D or type \"exit\" to exit the application"
#, javascript-format
msgid "More than one item match \"%s\". Please narrow down your query."
@@ -52,11 +53,11 @@ msgstr "正在取消同步...請稍等。"
#, javascript-format
msgid "No such command: %s"
msgstr "沒有該令: %s"
msgstr "沒有該令: %s"
#, javascript-format
msgid "The command \"%s\" is only available in GUI mode"
msgstr "命令 \"%s\" 僅在 GUI 模式下可用"
msgstr ""
msgid "Cannot change encrypted item"
msgstr "無法更改已加密項目"
@@ -94,11 +95,9 @@ msgid ""
"value of [name]. If neither [name] nor [value] is provided, it will list the "
"current configuration."
msgstr ""
"取得或設定一個設置值。如果沒有指明 [value],則會顯示 [name] 的值。如果 "
"[name] 和 [vallue] 兩者均沒有指明,則會列出當前設置。"
msgid "Also displays unset and hidden config variables."
msgstr "亦顯示未設置和隱藏的設置變數。"
msgstr ""
#, javascript-format
msgid "%s = %s (%s)"
@@ -112,8 +111,8 @@ msgid ""
"Duplicates the notes matching <note> to [notebook]. If no notebook is "
"specified the note is duplicated in the current notebook."
msgstr ""
"將匹配 <note> 的記事複製到 [notebook]。如果未指定筆記本,則預設複製到當前記事"
"中。"
"將匹配 <note> 的記事複製到 [記事本]。如果未指定筆記本,則預設複製到當前記事"
"中。"
msgid "Marks a to-do as done."
msgstr "標記待辦事項為完成。"
@@ -126,8 +125,6 @@ msgid ""
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
"`status` and `target-status`."
msgstr ""
"管理 E2EE 設置。命令是 `enable`,`disable`,`decrypt`,`status` 和 `target-"
"status`。"
msgid "Enter master password:"
msgstr "輸入主密碼:"
@@ -151,17 +148,17 @@ msgstr "已停用"
#, javascript-format
msgid "Encryption is: %s"
msgstr "加密: %s"
msgstr ""
msgid "Edit note."
msgstr "編輯記事。"
msgid ""
"No text editor is defined. Please set it using `config editor <editor-path>`"
msgstr "未設置文字編輯器。請用 `config editor <editor-path>` 去設置"
msgstr "未設置文字編輯器。請用 `config editor <editor-path>` 去設置"
msgid "No active notebook."
msgstr "無使用中的記本。"
msgstr "無使用中的記本。"
#, javascript-format
msgid "Note does not exist: \"%s\". Create it?"
@@ -205,49 +202,45 @@ msgstr "顯示使用資訊。"
#, javascript-format
msgid "For information on how to customise the shortcuts please visit %s"
msgstr "有關如何自訂快捷鍵,請訪問 %s"
msgstr ""
msgid "Shortcuts are not available in CLI mode."
msgstr "在 CLI 模式下無法使用快捷鍵。"
msgstr ""
msgid ""
"Type `help [command]` for more information about a command; or type `help "
"all` for the complete usage information."
msgstr ""
"輸入 `help [command]` 查看關於命令的更多資訊; 或者輸入 `help all` 獲取完整的"
"使用說明。"
msgid "The possible commands are:"
msgstr "可能的命令是:"
msgstr ""
msgid ""
"In any command, a note or notebook can be referred to by title or ID, or "
"using the shortcuts `$n` or `$b` for, respectively, the currently selected "
"note or notebook. `$c` can be used to refer to the currently selected item."
msgstr ""
"在任何一個命令中,可以通過標題或 ID 去引用記事或記事本,或使用快捷鍵 `$n` or "
"`$b` 分別選定記事或記事本的。您亦可以用 `$ c` 來引用當前選擇的項目。"
msgid "To move from one pane to another, press Tab or Shift+Tab."
msgstr "要從一個窗格移動到另一個窗格,請按 Tab 或 Shift+Tab。"
msgstr ""
msgid ""
"Use the arrows and page up/down to scroll the lists and text areas "
"(including this console)."
msgstr "使用方向鍵和上/下頁鍵去捲動清單和文本區域 (包括此主控台)。"
msgstr ""
msgid "To maximise/minimise the console, press \"tc\"."
msgstr "要最大化/最小化主控台,請按 \"tc\"。"
msgstr ""
msgid "To enter command line mode, press \":\""
msgstr "要進入命令行模式,請按 \":\""
msgstr ""
msgid "To exit command line mode, press ESCAPE"
msgstr "要退出命令行模式,請按 ESC 鍵"
msgstr ""
msgid ""
"For the list of keyboard shortcuts and config options, type `help keymap`"
msgstr "請輸入`help keymap` 查看有關鍵盤快捷鍵和設置選項"
msgstr ""
msgid "Imports data into Joplin."
msgstr "匯入資料到 Joplin。"
@@ -296,7 +289,7 @@ msgid ""
msgstr "顯示當前記事本中的記事。使用 \"ls/\" 顯示記事本的清單。"
msgid "Displays only the first top <num> notes."
msgstr "僅顯示頭 <num> 記事。"
msgstr "僅顯示頭 <num> 記事。"
msgid "Sorts the item by <field> (eg. title, updated_time, created_time)."
msgstr "按 <field> 對項目進行排序 (例如: 標題、更新時間、建立時間等等)。"
@@ -309,19 +302,14 @@ msgid ""
"for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the "
"to-dos, while `-ttd` would display notes and to-dos."
msgstr ""
"僅顯示特定類型的項目。您可用 `n` 來顯示記事,`t` 來顯示待辦事項,或者 `nt` 一"
"併顯示記事及待辦事項。又例如,用 `-tt` 僅顯示待辦事項,而 `-ttd` 則一併顯示記"
"事及待辦事項。"
msgid "Either \"text\" or \"json\""
msgstr "\"text\" 或 \"json\" 二者之一"
msgstr ""
msgid ""
"Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, "
"TODO_CHECKED (for to-dos), TITLE"
msgstr ""
"使用長清單格式。格式為 ID, NOTE_COUNT (用於記事本), DATE, TODO_CHECKED (用於"
"待辦事項), TITLE"
msgid "Please select a notebook first."
msgstr "請先選擇記事本。"
@@ -339,7 +327,7 @@ msgid "Creates a new to-do."
msgstr "新增待辦事項。"
msgid "Moves the notes matching <note> to [notebook]."
msgstr "將匹配 <note> 的記事移動到 [notebook]。"
msgstr "將匹配 <note> 的記事移動到 [記事本]。"
msgid "Renames the given <item> (note or notebook) to <name>."
msgstr "將特定的 <item> (記事或記事本) 重新命名為 <name>。"
@@ -363,7 +351,7 @@ msgstr "刪除記事時不要求確認。"
#, javascript-format
msgid "%d notes match this pattern. Delete them?"
msgstr "%d 記事與此模式匹配。要刪除它們?"
msgstr "%d 記事與此模式匹配。要刪除它們?"
msgid "Delete note?"
msgstr "刪除記事?"
@@ -389,15 +377,15 @@ msgid "Synchronises with remote storage."
msgstr "與遠端儲存設備同步。"
msgid "Sync to provided target (defaults to sync.target config value)"
msgstr "同步到已指明的目標 (預設是 sync.target 的設置值)"
msgstr ""
msgid ""
"Authentication was not completed (did not receive an authentication token)."
msgstr "身份驗證未完成 (未收到身份驗證的 token)。"
msgstr ""
msgid ""
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
msgstr "請按照以下步驟,設置 Joplin 與 Dropbox 同步所需的選項:"
msgstr "請按照以下步驟,設置 Joplin 與 Dropbox 同步所需的選項"
msgid "Step 1: Open this URL in your browser to authorise the application:"
msgstr "步驟 1: 在瀏覽器中打開此網址以授權應用程式:"
@@ -418,8 +406,6 @@ msgid ""
"taking place, you may delete the lock file at \"%s\" and resume the "
"operation."
msgstr ""
"鎖定檔已被保留。如果您知道沒有正在同步,您可刪除 \"%s\" 上的鎖定檔並繼續操"
"作。"
#, javascript-format
msgid "Synchronisation target: %s (%s)"
@@ -434,19 +420,15 @@ 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 "
"`tag list` can be used to list all the tags (use -l for long option)."
"`tag list` can be used to list all the tags."
msgstr ""
"<tag-command> 可以是 \"add\" (新增),\"remove\" (刪除) 或用 \"list\" 從 [記"
"事] 中分配或移除 [標籤],或列出與 [標籤] 關聯的記事。而命令 `tag list` 可以用"
"來列出所有的標籤。"
#, javascript-format
msgid "Invalid command: \"%s\""
msgstr "無效的令: \"%s\""
msgstr "無效的令: \"%s\""
msgid ""
"<todo-command> can either be \"toggle\" or \"clear\". Use \"toggle\" to "
@@ -454,9 +436,6 @@ msgid ""
"target is a regular note it will be converted to a to-do). Use \"clear\" to "
"convert the to-do back to a regular note."
msgstr ""
"<todo-command> 可以是 \"toggle\" (切換) 或 \"clear\" (清除)。使用 \"toggle\" "
"在已完成和未完成的待辦事項之間互相切換 (如果目標是一般記事,則會轉換為待辦事"
"項)。使用 \"clear\" 將待辦事項轉換為一般記事。"
msgid "Marks a to-do as non-completed."
msgstr "標記待辦事項為未完成。"
@@ -464,21 +443,21 @@ msgstr "標記待辦事項為未完成。"
msgid ""
"Switches to [notebook] - all further operations will happen within this "
"notebook."
msgstr "切換到 [notebook] - 所有進一步的操作將在此筆記本中發生。"
msgstr ""
msgid "Displays version information"
msgstr "顯示版本資訊"
#, javascript-format
msgid "%s %s (%s)"
msgstr "%s %s (%s)"
msgstr ""
msgid "Enum"
msgstr "列舉 (Enum)"
msgstr ""
#, javascript-format
msgid "Type: %s."
msgstr "類型: %s。"
msgstr ""
#, javascript-format
msgid "Possible values: %s."
@@ -489,20 +468,20 @@ msgid "Default: %s"
msgstr "預設: %s"
msgid "Possible keys/values:"
msgstr "可能的鍵/值:"
msgstr ""
msgid "Type `joplin help` for usage information."
msgstr "鍵入 `joplin help` 檢視使用說明。"
msgstr ""
msgid "Fatal error:"
msgstr "嚴重錯誤:"
msgstr ""
msgid ""
"The application has been authorised - you may now close this browser tab."
msgstr "應用程式已取得權限 - 您現在可以關閉此瀏覽器分頁。"
msgstr ""
msgid "The application has been successfully authorised."
msgstr "應用程式已成功取得權限。"
msgstr ""
msgid ""
"Please open the following URL in your browser to authenticate the "
@@ -511,9 +490,6 @@ msgid ""
"any files outside this directory nor to any other personal data. No data "
"will be shared with any third party."
msgstr ""
"請在瀏覽器開啟以下 URL 去驗證應用程式。應用程式將在 \"Apps/Joplin\" 中建立一"
"個目錄,並只會在該目錄中進行讀取和寫入。應用程式將無法訪問此目錄之外的任何檔"
"案,同時也無法使用任何其他個人資料。我們不會與任何第三方廠商共用任何資料。"
msgid "Search:"
msgstr "搜尋:"
@@ -526,11 +502,6 @@ msgid ""
"\n"
"For example, to create a notebook press `mb`; to create a note press `mn`."
msgstr ""
"Joplin 歡迎您!\n"
"\n"
"鍵入: `:help shortcuts` 檢視鍵盤快速鍵清單,或只鍵入 `:help` 檢視使用說明。\n"
"\n"
"例如,您可鍵入: `mb` 去新增一本記事本; 鍵入 `mn` 去新增記事。"
msgid ""
"One or more items are currently encrypted and you may need to supply a "
@@ -538,16 +509,14 @@ msgid ""
"supplied the password, the encrypted items are being decrypted in the "
"background and will be available soon."
msgstr ""
"當前已加密一個或多個一個項目,您可能需要提供主密碼。請鍵入 \"e2ee decrypt\" "
"去解碼。如果您已經提供了密碼,那加密的項目將會在後臺解密,請耐心等候。"
#, javascript-format
msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
msgstr "匯出到 \"%s\" 為 \"%s\" 格式。請稍候..."
msgstr ""
#, javascript-format
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
msgstr "從 \"%s\" 匯入為 \"%s\" 格式。請稍候..."
msgstr ""
msgid "PDF File"
msgstr "PDF 檔案"
@@ -593,16 +562,16 @@ msgid "Paste"
msgstr "貼上"
msgid "Bold"
msgstr "粗體"
msgstr ""
msgid "Italic"
msgstr "斜體"
msgstr ""
msgid "Insert Date Time"
msgstr "插入日期時間"
msgstr ""
msgid "Edit in external editor"
msgstr "使用外部編輯器編輯"
msgstr ""
msgid "Search in all the notes"
msgstr "在所有記事中搜尋"
@@ -648,7 +617,7 @@ msgstr "關於 Joplin"
#, javascript-format
msgid "%s %s (%s, %s)"
msgstr "%s %s (%s, %s)"
msgstr ""
#, javascript-format
msgid "Open %s"
@@ -676,11 +645,11 @@ msgid "No"
msgstr "否"
msgid "The web clipper service is enabled and set to auto-start."
msgstr "Web clipper 服務已啟用,並設置為自動啟動。"
msgstr ""
#, javascript-format
msgid "Status: Started on port %d"
msgstr "狀態: 已在 %d 端口上啟動"
msgstr ""
#, javascript-format
msgid "Status: %s"
@@ -690,7 +659,7 @@ msgid "Disable Web Clipper Service"
msgstr "停用 Web Clipper 服務"
msgid "The web clipper service is not enabled."
msgstr "Web clipper 服務已停用。"
msgstr ""
msgid "Enable Web Clipper Service"
msgstr "啟用 Web Clipper 服務"
@@ -698,40 +667,39 @@ msgstr "啟用 Web Clipper 服務"
msgid ""
"Joplin Web Clipper allows saving web pages and screenshots from your browser "
"to Joplin."
msgstr "Joplin Web Clipper 可以讓您從瀏覽器保存網頁和螢幕截圖到 Joplin。"
msgstr ""
msgid "In order to use the web clipper, you need to do the following:"
msgstr "要使用 web clipper,您需要執行以下動作:"
msgstr ""
msgid "Step 1: Enable the clipper service"
msgstr "步驟 1: 啟用 clipper 服務"
msgstr ""
msgid ""
"This service allows the browser extension to communicate with Joplin. When "
"enabling it your firewall may ask you to give permission to Joplin to listen "
"to a particular port."
msgstr ""
"此服務允許瀏覽器插件與 Joplin 溝通。當啟用它時,您的防火牆可能要求您授予 "
"Joplin 偵聽特定端口的許可權。"
msgid "Step 2: Install the extension"
msgstr "步驟 2: 安裝插件"
msgstr ""
msgid "Download and install the relevant extension for your browser:"
msgstr "下載並安裝瀏覽器插件:"
msgstr ""
msgid "Check synchronisation configuration"
msgstr "檢測同步設置"
#, javascript-format
msgid "Notes and settings are stored in: %s"
msgstr "所有記事和設置均儲存於: %s"
msgstr ""
msgid "Apply"
msgstr "套用"
msgstr ""
#, fuzzy
msgid "Submit"
msgstr "送出"
msgstr "提交 / 送出"
msgid "Save"
msgstr "儲存"
@@ -741,8 +709,6 @@ msgid ""
"re-synchronised and sent unencrypted to the sync target. Do you wish to "
"continue?"
msgstr ""
"禁用加密意味著*所有*您的筆記和附件將被重新同步並且在未加密的情況下發送到同步"
"目標。您想繼續嗎?"
msgid ""
"Enabling encryption means *all* your notes and attachments are going to be "
@@ -750,9 +716,6 @@ msgid ""
"password as, for security purposes, this will be the *only* way to decrypt "
"the data! To enable encryption, please enter your password below."
msgstr ""
"啟用加密意味著*所有*您的筆記和附件將被重新同步並在已加密的情況下發送到同步目"
"標。為了安全起見,不要丟失密碼,這將是解密數據的唯一方式!要啟用加密,請在下"
"面輸入您的密碼。"
msgid "Disable encryption"
msgstr "停用加密"
@@ -764,13 +727,13 @@ msgid "Master Keys"
msgstr "主密碼"
msgid "Active"
msgstr "使用中"
msgstr ""
msgid "ID"
msgstr "ID"
msgstr ""
msgid "Source"
msgstr "來源"
msgstr ""
msgid "Created"
msgstr "已建立"
@@ -789,8 +752,6 @@ msgid ""
"as \"active\"). Any of the keys might be used for decryption, depending on "
"how the notes or notebooks were originally encrypted."
msgstr ""
"注意: 只有一個主密碼將用於加密 (標記為 \"使用中\" 的那個)。根據記事或記事本最"
"初加密的方式,任何密碼都可能用於解密。"
msgid "Missing Master Keys"
msgstr "缺少主密碼"
@@ -800,19 +761,18 @@ msgid ""
"however the application does not currently have access to them. It is likely "
"they will eventually be downloaded via synchronisation."
msgstr ""
"某些項目使用這些 ID 的主密碼進行加密,但應用程式目前焦法訪問它們。這些許可權"
"可能最終會通過同步下載。"
msgid ""
"For more information about End-To-End Encryption (E2EE) and advices on how "
"to enable it please check the documentation:"
msgstr "有關端到端加密 (E2EE) 的詳細資訊以及該如何啟用它,請參考線上文檔:"
msgstr ""
"有關端到端加密 (E2EE) 的詳細資訊以及該如何啟用它的建議,請參考線上文檔:"
msgid "Status"
msgstr "狀態"
msgid "Encryption is:"
msgstr "加密:"
msgstr ""
msgid "Back"
msgstr "返回"
@@ -820,13 +780,13 @@ msgstr "返回"
#, javascript-format
msgid ""
"New notebook \"%s\" will be created and file \"%s\" will be imported into it"
msgstr "將建立新的記事本 \"%s\",檔案 \"%s\" 將會匯入其中"
msgstr ""
msgid "Please create a notebook first."
msgstr "請先新增記事本。"
msgid "Please create a notebook first"
msgstr "請先新增記事本"
msgstr "請先新增記事本"
msgid "Notebook title:"
msgstr "記事本標題:"
@@ -835,7 +795,7 @@ msgid "Add or remove tags:"
msgstr "新增或移除標籤:"
msgid "Separate each tag by a comma."
msgstr "您可用逗號分隔每個標籤。"
msgstr "用逗號分隔每個標籤。"
msgid "Rename notebook:"
msgstr "重新命名記事本:"
@@ -859,7 +819,7 @@ msgid "View them now"
msgstr "立即檢視"
msgid "Some items cannot be decrypted."
msgstr "有些項目不能解密。"
msgstr ""
msgid "Set the password"
msgstr "設置密碼"
@@ -868,14 +828,14 @@ msgid "Add or remove tags"
msgstr "新增或移除標籤"
msgid "Duplicate"
msgstr "新增複本"
msgstr ""
#, javascript-format
#, fuzzy, javascript-format
msgid "%s - Copy"
msgstr "%s - 複本"
msgstr "複製"
msgid "Switch between note and to-do type"
msgstr "切換到記事 / 待辦事項"
msgstr ""
msgid "Copy Markdown link"
msgstr "複製 Markdown 連結"
@@ -887,24 +847,18 @@ msgid "Delete notes?"
msgstr "刪除此記事?"
msgid "No notes in here. Create one by clicking on \"New note\"."
msgstr "當前沒有任何筆記。通過按一下 \"新增筆記\" 去建立。"
msgstr ""
msgid ""
"There is currently no notebook. Create one by clicking on \"New notebook\"."
msgstr "您當前沒有任何記事本。通過按一下 \"新增記事本\" 去建立。"
msgid "Location"
msgstr ""
msgid "URL"
msgstr ""
msgid "Open..."
msgstr "開啟..."
#, javascript-format
#, fuzzy, javascript-format
msgid "This file could not be opened: %s"
msgstr "無法開啟檔案: %s"
msgstr "無法儲存記事本: %s"
msgid "Save as..."
msgstr "另存為..."
@@ -913,29 +867,29 @@ msgid "Copy path to clipboard"
msgstr "複製路徑到剪貼板"
msgid "Copy Link Address"
msgstr "複製鏈接位址"
msgstr ""
#, javascript-format
msgid "Unsupported link or message: %s"
msgstr "不支援的鏈接或訊息: %s"
msgstr ""
#, javascript-format
msgid ""
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
"note."
msgstr "此筆記沒有內容。按一下 \"%s\" 切換到編輯模式並編輯筆記。"
msgstr ""
msgid "strong text"
msgstr "重要文字 <strong>"
msgstr ""
msgid "emphasized text"
msgstr "強調文字 <em>"
msgstr ""
msgid "List item"
msgstr "清單項目"
msgstr ""
msgid "Insert Hyperlink"
msgstr "插入超連結"
msgstr ""
msgid "Attach file"
msgstr "附加檔案"
@@ -946,39 +900,37 @@ msgstr "標籤"
msgid "Set alarm"
msgstr "設置提醒"
#, javascript-format
#, fuzzy, javascript-format
msgid "In: %s"
msgstr ": %s"
msgid "Note properties"
msgstr ""
msgstr "%s: %s"
msgid "Hyperlink"
msgstr "超連結"
msgstr ""
msgid "Code"
msgstr "引言"
msgstr ""
msgid "Numbered List"
msgstr "編號清單"
msgstr ""
msgid "Bulleted List"
msgstr "項目清單"
msgstr ""
msgid "Checkbox"
msgstr "核取方塊"
msgstr ""
msgid "Heading"
msgstr "標題"
msgstr ""
msgid "Horizontal Rule"
msgstr "水平線"
msgstr ""
msgid "Click to stop external editing"
msgstr "按下停止外部編輯"
msgstr ""
#, fuzzy
msgid "Watching..."
msgstr "觀察中..."
msgstr "正在取消中..."
msgid "to-do"
msgstr "待辦事項"
@@ -1030,15 +982,15 @@ msgid "Notebooks"
msgstr "記事本"
msgid "Please select where the sync status should be exported to"
msgstr "請選擇將同步狀態導出到的位置"
msgstr ""
#, javascript-format
msgid "Usage: %s"
msgstr "使用資訊: %s"
msgstr ""
#, javascript-format
msgid "Unknown flag: %s"
msgstr "未知的標誌: %s"
msgstr ""
msgid "Dropbox"
msgstr "Dropbox"
@@ -1060,16 +1012,16 @@ msgstr "WebDAV"
#, javascript-format
msgid "Unknown log level: %s"
msgstr "未知的日誌級別: %s"
msgstr ""
#, javascript-format
msgid "Unknown level ID: %s"
msgstr "未知的級別 ID: %s"
msgstr ""
msgid ""
"Cannot refresh token: authentication data is missing. Starting the "
"synchronisation again may fix the problem."
msgstr "無法刷新 token: 缺少身份驗證資料。再次啟動同步可能會解決此問題。"
msgstr ""
msgid ""
"Could not synchronize with OneDrive.\n"
@@ -1079,54 +1031,49 @@ msgid ""
"\n"
"Please consider using a regular OneDrive account."
msgstr ""
"無法與 OneDrive 同步。\n"
"\n"
"此錯誤通常發生在 OneDrive for Business,不幸地,該操作無法被支援。\n"
"\n"
"請考慮使用一般的 OneDrive 帳戶。"
#, javascript-format
msgid "Cannot access %s"
msgstr "無法訪問 %s"
msgstr ""
#, javascript-format
msgid "Created local items: %d."
msgstr "已建立的本地項目: %d 項"
msgstr ""
#, javascript-format
msgid "Updated local items: %d."
msgstr "已更新的本地項目: %d 項"
msgstr ""
#, javascript-format
msgid "Created remote items: %d."
msgstr "已建立的遠端項目: %d 項"
msgstr ""
#, javascript-format
msgid "Updated remote items: %d."
msgstr "已更新的遠端項目: %d 項"
msgstr ""
#, javascript-format
msgid "Deleted local items: %d."
msgstr "已刪除的本地項目: %d 項"
msgstr ""
#, javascript-format
msgid "Deleted remote items: %d."
msgstr "已刪除的遠端項目: %d 項"
msgstr ""
#, javascript-format
msgid "Fetched items: %d/%d."
msgstr "已擷取的本地項目: %d/%d 項"
msgstr ""
#, javascript-format
msgid "State: %s."
msgstr "狀態: %s。"
msgstr ""
msgid "Cancelling..."
msgstr "正在取消中..."
#, javascript-format
msgid "Completed: %s"
msgstr "已完成: %s"
msgstr "已完成: %s"
#, javascript-format
msgid "Last error: %s"
@@ -1140,7 +1087,7 @@ msgstr "進行中"
#, javascript-format
msgid "Synchronisation is already in progress. State: %s"
msgstr "同步已在進行中。狀態: %s"
msgstr ""
msgid "Encrypted"
msgstr "已加密"
@@ -1149,23 +1096,30 @@ msgid "Encrypted items cannot be modified"
msgstr "無法修改已加密項目"
msgid "Conflicts"
msgstr "衝突"
msgstr ""
msgid "Cannot move notebook to this location"
msgstr "無法移動記事本到此位置"
msgstr ""
#, javascript-format
msgid "A notebook with this title already exists: \"%s\""
msgstr ""
#, javascript-format
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
msgstr "筆記本無法命名為 \"%s\",這標題已被保留。"
msgstr ""
#, fuzzy
msgid "title"
msgstr "標題"
msgstr "未命名"
#, fuzzy
msgid "updated date"
msgstr "更新日期"
msgstr "更新: %d。"
#, fuzzy
msgid "created date"
msgstr "建立日期"
msgstr "建立: %d。"
msgid "Untitled"
msgstr "未命名"
@@ -1218,10 +1172,10 @@ msgid "When creating a new to-do:"
msgstr "當新增待辦事項時:"
msgid "Focus title"
msgstr "游標置於標題"
msgstr "游標放置在標題"
msgid "Focus body"
msgstr "游標置於內文"
msgstr "游標放置在內文"
msgid "When creating a new note:"
msgstr "當新增記事時:"
@@ -1232,11 +1186,8 @@ msgstr "顯示系統匣圖示"
msgid "Note: Does not work in all desktop environments."
msgstr "注意: 不是在全部桌面環境中都能發揮作用。"
msgid "Start application minimised in the tray icon"
msgstr ""
msgid "Global zoom percentage"
msgstr "整體縮放比例 (%)"
msgstr "整體縮放比例"
msgid "Editor font family"
msgstr "編輯器字型系列"
@@ -1245,8 +1196,8 @@ msgid ""
"This must be *monospace* font or it will not work properly. If the font is "
"incorrect or empty, it will default to a generic monospace font."
msgstr ""
"必須是 *等距 (monospace)* 字,否則程式將無法正常工作。如果字不正確或沒有"
"填寫,則預設為通用等距字。"
"必須是 *等距 (monospace)* 字,否則程式將無法正常工作。如果字不正確或"
"空, 則預設為通用等距字。"
msgid "Automatically update the application"
msgstr "自動更新應用程式"
@@ -1266,15 +1217,14 @@ msgstr "%d 小時"
msgid "%d hours"
msgstr "%d 小時"
#, fuzzy
msgid "Text editor command"
msgstr "文字編輯器命令"
msgstr "文字編輯器"
msgid ""
"The editor command (may include arguments) that will be used to open a note. "
"If none is provided it will try to auto-detect the default editor."
msgstr ""
"用於開啟筆記的編輯器命令 (可能包括參數)。如果沒有指明,程式將嘗試自動檢測預設"
"的編輯器。"
msgid "Show advanced options"
msgstr "顯示進階選項"
@@ -1300,13 +1250,6 @@ msgstr "啟用檔案系統同步時要同步的路徑。請參閱 `sync.target`
msgid "Nextcloud WebDAV URL"
msgstr "Nextcloud WebDAV 網址"
#, javascript-format
msgid ""
"Attention: If you change this location, make sure you copy all your content "
"to it before syncing, otherwise all files will be removed! See the FAQ for "
"more details: %s"
msgstr ""
msgid "Nextcloud username"
msgstr "Nextcloud 用戶名稱"
@@ -1323,7 +1266,7 @@ msgid "WebDAV password"
msgstr "WebDAV 密碼"
msgid "Custom TLS certificates"
msgstr "自訂 TLS 證書"
msgstr ""
msgid ""
"Comma-separated list of paths to directories to load the certificates from, "
@@ -1331,21 +1274,14 @@ msgid ""
"pem. Note that if you make changes to the TLS settings, you must save your "
"changes before clicking on \"Check synchronisation configuration\"."
msgstr ""
"要載入證書,可用逗號分隔的目錄路徑清單,或指明特定證書的路徑。例如: /my/"
"cert_dir, /other/custom.pem。請注意,如果修改了 TLS 的設置,您必須先儲存變"
"更,然後再按一下 \"檢測同步設置\"。"
msgid "Ignore TLS certificate errors"
msgstr "忽略 TLS 證書錯誤"
msgstr ""
#, javascript-format
msgid "Invalid option value: \"%s\". Possible values are: %s."
msgstr "不正確選項值: \"%s\"。可能的值為: %s。"
#, javascript-format
msgid "The tag \"%s\" already exists. Please choose a different name."
msgstr ""
msgid "Joplin Export File"
msgstr "Joplin 匯出檔"
@@ -1420,7 +1356,7 @@ msgstr "資料夾"
#, javascript-format
msgid "%s: %d notes"
msgstr "%s:%d 記事"
msgstr "%s:%d 記事"
msgid "Coming alarms"
msgstr "將會發生的提醒事項"
@@ -1471,31 +1407,29 @@ msgstr "取消同步"
#, javascript-format
msgid "Decrypting items: %d/%d"
msgstr "正在解密項目: %d/%d 項"
msgstr ""
msgid "New tags:"
msgstr "新增標籤:"
msgid "Type new tags or select from list"
msgstr "輸入新標籤,或在清單中選擇"
msgstr ""
msgid ""
"To work correctly, the app needs the following permissions. Please enable "
"them in your phone settings, in Apps > Joplin > Permissions"
msgstr ""
"應用程式需要以下權限才能正常運作。請在您的電話設定中啟用它們。(應用程式 > "
"Joplin > 權限)"
msgid ""
"- Storage: to allow attaching files to notes and to enable filesystem "
"synchronisation."
msgstr "- 儲存: 允許將檔案附加到筆記並啟用檔案系統同步。"
msgstr ""
msgid "- Camera: to allow taking a picture and attaching it to a note."
msgstr "- 相機: 允許拍照並附加相片到記事。"
msgstr ""
msgid "- Location: to allow attaching geo-location information to a note."
msgstr "- 位置: 允許將地理位置資訊附加到筆記。"
msgstr ""
msgid "Joplin website"
msgstr "Joplin 官方網站"
@@ -1531,13 +1465,13 @@ msgid "Show all"
msgstr "顯示全部"
msgid "Errors only"
msgstr "僅顯示錯誤"
msgstr "僅出錯時"
msgid "This note has been modified:"
msgstr "此記事已被修改:"
msgid "Save changes"
msgstr "存變更"
msgstr "存變更"
msgid "Discard changes"
msgstr "放棄變更"
@@ -1590,13 +1524,10 @@ msgstr "搜尋"
msgid ""
"Click on the (+) button to create a new note or notebook. Click on the side "
"menu to access your existing notebooks."
msgstr "可以點撃 (+) 鍵去新增記事或記事本。點撃側邊欄去檢視現有的記事本。"
msgstr "可以點撃 (+) 鍵去新增記事或記事本。點撃側邊欄去檢視現有的記事本。"
msgid "You currently have no notebook. Create one by clicking on (+) button."
msgstr "您當前沒有任何筆記本。通過按一下 (+) 鍵去建立一本筆記。"
msgid "Welcome"
msgstr "歡迎"
#~ msgid "A notebook with this title already exists: \"%s\""
#~ msgstr "同名筆記本已經存在: \"%s\""

View File

@@ -1,6 +1,6 @@
{
"name": "joplin",
"version": "1.0.114",
"version": "1.0.112",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -19,7 +19,7 @@
],
"owner": "Laurent Cozic"
},
"version": "1.0.114",
"version": "1.0.112",
"bin": {
"joplin": "./main.js"
},

View File

@@ -28,7 +28,6 @@ npm test tests-build/HtmlToMd.js
npm test tests-build/markdownUtils.js
npm test tests-build/models_Folder.js
npm test tests-build/models_Note.js
npm test tests-build/models_Tag.js
npm test tests-build/models_Setting.js
npm test tests-build/services_InteropService.js
npm test tests-build/services_ResourceService.js

View File

@@ -1,45 +0,0 @@
require('app-module-path').addPath(__dirname);
const { time } = require('lib/time-utils.js');
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
const Folder = require('lib/models/Folder.js');
const Note = require('lib/models/Note.js');
const Tag = require('lib/models/Tag.js');
const BaseModel = require('lib/BaseModel.js');
const { shim } = require('lib/shim');
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
describe('models_Tag', function() {
beforeEach(async (done) => {
await setupDatabaseAndSynchronizer(1);
await switchClient(1);
done();
});
it('should add tags by title', 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', 'deux']);
const noteTags = await Tag.tagsByNoteId(note1.id);
expect(noteTags.length).toBe(2);
}));
it('should not allow renaming tag to existing tag names', 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', 'deux']);
const tagUn = await Tag.loadByTitle('un');
const hasThrown = await checkThrowAsync(async () => await Tag.save({ id: tagUn.id, title: 'deux' }, { userSideValidation: true }));
expect(hasThrown).toBe(true);
}));
});

View File

@@ -62,9 +62,7 @@ class ElectronAppWrapper {
require('electron-context-menu')({
shouldShowMenu: (event, params) => {
// params.inputFieldType === 'none' when right-clicking the text editor. This is a bit of a hack to detect it because in this
// case we don't want to use the built-in context menu but a custom one.
return params.isEditable && params.inputFieldType !== 'none';
return params.isEditable;
},
});

View File

@@ -11,7 +11,7 @@ class InteropServiceHelper {
if (module.target === 'file') {
path = bridge().showSaveDialog({
filters: [{ name: module.description, extensions: module.fileExtensions}]
filters: [{ name: module.description, extensions: module.fileExtension}]
});
} else {
path = bridge().showOpenDialog({

View File

@@ -758,10 +758,6 @@ class Application extends BaseApplication {
AlarmService.garbageCollect();
}, 1000 * 60 * 60);
if (Setting.value('startMinimized') && Setting.value('showTrayIcon')) {
bridge().window().hide();
}
ResourceService.runInBackground();
if (Setting.value('env') === 'dev') {

View File

@@ -35,7 +35,6 @@ class HeaderComponent extends React.Component {
this.search_onClear = (event) => {
this.setState({ searchQuery: '' });
triggerOnQuery('');
if (this.searchElement_) this.searchElement_.focus();
}
}

View File

@@ -5,7 +5,6 @@ const { SideBar } = require('./SideBar.min.js');
const { NoteList } = require('./NoteList.min.js');
const { NoteText } = require('./NoteText.min.js');
const { PromptDialog } = require('./PromptDialog.min.js');
const NotePropertiesDialog = require('./NotePropertiesDialog.min.js');
const Setting = require('lib/models/Setting.js');
const BaseModel = require('lib/BaseModel.js');
const Tag = require('lib/models/Tag.js');
@@ -20,24 +19,13 @@ const eventManager = require('../eventManager');
class MainScreenComponent extends React.Component {
constructor() {
super();
this.notePropertiesDialog_close = this.notePropertiesDialog_close.bind(this);
}
notePropertiesDialog_close() {
this.setState({ notePropertiesDialogOptions: {} });
}
componentWillMount() {
this.setState({
promptOptions: null,
modalLayer: {
visible: false,
message: '',
},
notePropertiesDialogOptions: {},
}
});
}
@@ -201,13 +189,6 @@ class MainScreenComponent extends React.Component {
});
}
} else if (command.name === 'commandNoteProperties') {
this.setState({
notePropertiesDialogOptions: {
noteId: command.noteId,
visible: true,
},
});
} else if (command.name === 'toggleVisiblePanes') {
this.toggleVisiblePanes();
} else if (command.name === 'toggleSidebar') {
@@ -431,19 +412,10 @@ class MainScreenComponent extends React.Component {
const modalLayerStyle = Object.assign({}, styles.modalLayer, { display: this.state.modalLayer.visible ? 'block' : 'none' });
const notePropertiesDialogOptions = this.state.notePropertiesDialogOptions;
return (
<div style={style}>
<div style={modalLayerStyle}>{this.state.modalLayer.message}</div>
<NotePropertiesDialog
theme={this.props.theme}
noteId={notePropertiesDialogOptions.noteId}
visible={!!notePropertiesDialogOptions.visible}
onClose={this.notePropertiesDialog_close}
/>
<PromptDialog
autocomplete={promptOptions && ('autocomplete' in promptOptions) ? promptOptions.autocomplete : null}
defaultValue={promptOptions && promptOptions.value ? promptOptions.value : ''}
@@ -455,7 +427,6 @@ class MainScreenComponent extends React.Component {
visible={!!this.state.promptOptions}
buttons={promptOptions && ('buttons' in promptOptions) ? promptOptions.buttons : null}
inputType={promptOptions && ('inputType' in promptOptions) ? promptOptions.inputType : null} />
<Header style={styles.header} showBackButton={false} items={headerItems} />
{messageComp}
<SideBar style={styles.sideBar} />

View File

@@ -1,364 +0,0 @@
const React = require('react');
const { connect } = require('react-redux');
const { _ } = require('lib/locale.js');
const moment = require('moment');
const { themeStyle } = require('../theme.js');
const { time } = require('lib/time-utils.js');
const Datetime = require('react-datetime');
const Note = require('lib/models/Note');
const formatcoords = require('formatcoords');
const { bridge } = require('electron').remote.require('./bridge');
class NotePropertiesDialog extends React.Component {
constructor() {
super();
this.okButton_click = this.okButton_click.bind(this);
this.cancelButton_click = this.cancelButton_click.bind(this);
this.state = {
formNote: null,
editedKey: null,
editedValue: null,
visible: false,
};
this.keyToLabel_ = {
id: _('ID'),
user_created_time: _('Created'),
user_updated_time: _('Updated'),
location: _('Location'),
source_url: _('URL'),
};
}
componentWillReceiveProps(newProps) {
if ('visible' in newProps && newProps.visible !== this.state.visible) {
this.setState({ visible: newProps.visible });
}
if ('noteId' in newProps) {
this.loadNote(newProps.noteId);
}
}
async loadNote(noteId) {
if (!noteId) {
this.setState({ formNote: null });
} else {
const note = await Note.load(noteId);
const formNote = this.noteToFormNote(note);
this.setState({ formNote: formNote });
}
}
latLongFromLocation(location) {
const o = {};
const l = location.split(',');
if (l.length == 2) {
o.latitude = l[0].trim();
o.longitude = l[1].trim();
} else {
o.latitude = '';
o.longitude = '';
}
return o;
}
noteToFormNote(note) {
const formNote = {};
formNote.user_updated_time = time.formatMsToLocal(note.user_updated_time);
formNote.user_created_time = time.formatMsToLocal(note.user_created_time);
formNote.source_url = note.source_url;
formNote.location = '';
if (Number(note.latitude) || Number(note.longitude)) {
formNote.location = note.latitude + ', ' + note.longitude;
}
formNote.id = note.id;
return formNote;
}
formNoteToNote(formNote) {
const note = Object.assign({ id: formNote.id }, this.latLongFromLocation(formNote.location));
note.user_created_time = time.formatLocalToMs(formNote.user_created_time);
note.user_updated_time = time.formatLocalToMs(formNote.user_updated_time);
note.source_url = formNote.source_url;
return note;
}
styles(themeId) {
const styleKey = themeId;
if (styleKey === this.styleKey_) return this.styles_;
const theme = themeStyle(themeId);
this.styles_ = {};
this.styleKey_ = styleKey;
this.styles_.modalLayer = {
zIndex: 9999,
display: 'flex',
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
backgroundColor: 'rgba(0,0,0,0.6)',
alignItems: 'flex-start',
justifyContent: 'center',
};
this.styles_.dialogBox = {
backgroundColor: 'white',
padding: 16,
boxShadow: '6px 6px 20px rgba(0,0,0,0.5)',
marginTop: 20,
}
this.styles_.controlBox = {
marginBottom: '1em',
};
this.styles_.button = {
minWidth: theme.buttonMinWidth,
minHeight: theme.buttonMinHeight,
marginLeft: 5,
};
this.styles_.editPropertyButton = {
color: theme.color,
textDecoration: 'none',
};
this.styles_.dialogTitle = Object.assign({}, theme.h1Style, { marginBottom: '1.2em' });
return this.styles_;
}
async closeDialog(applyChanges) {
if (applyChanges) {
await this.saveProperty();
const note = this.formNoteToNote(this.state.formNote);
note.updated_time = Date.now();
await Note.save(note, { autoTimestamp: false });
} else {
await this.cancelProperty();
}
this.setState({
visible: false,
});
if (this.props.onClose) {
this.props.onClose();
}
}
okButton_click() {
this.closeDialog(true);
}
cancelButton_click() {
this.closeDialog(false);
}
editPropertyButtonClick(key, initialValue) {
this.setState({
editedKey: key,
editedValue: initialValue,
});
setTimeout(() => {
if (this.refs.editField.openCalendar) {
this.refs.editField.openCalendar();
} else {
this.refs.editField.focus();
}
}, 100);
}
async saveProperty() {
if (!this.state.editedKey) return;
return new Promise((resolve, reject) => {
const newFormNote = Object.assign({}, this.state.formNote);
if (this.state.editedKey.indexOf('_time') >= 0) {
const dt = time.anythingToDateTime(this.state.editedValue, new Date());
newFormNote[this.state.editedKey] = time.formatMsToLocal(dt.getTime());
} else {
newFormNote[this.state.editedKey] = this.state.editedValue;
}
this.setState({
formNote: newFormNote,
editedKey: null,
editedValue: null
}, () => { resolve() });
});
}
async cancelProperty() {
return new Promise((resolve, reject) => {
this.setState({
editedKey: null,
editedValue: null
}, () => { resolve() });
});
}
createNoteField(key, value) {
const styles = this.styles(this.props.theme);
const theme = themeStyle(this.props.theme);
const labelComp = <label style={Object.assign({}, theme.textStyle, {marginRight: '1em', width: '6em', display:'inline-block', fontWeight: 'bold'})}>{this.formatLabel(key)}</label>;
let controlComp = null;
let editComp = null;
let editCompHandler = null;
let editCompIcon = null;
const onKeyDown = (event) => {
if (event.keyCode === 13) {
this.saveProperty();
} else if (event.keyCode === 27) {
this.cancelProperty();
}
}
if (this.state.editedKey === key) {
if (key.indexOf('_time') >= 0) {
controlComp = <Datetime
ref="editField"
defaultValue={value}
dateFormat={time.dateFormat()}
timeFormat={time.timeFormat()}
inputProps={{
onKeyDown: (event) => onKeyDown(event, key)
}}
onChange={(momentObject) => {this.setState({ editedValue: momentObject })}}
/>
editCompHandler = () => {this.saveProperty()};
editCompIcon = 'fa-save';
} else {
controlComp = <input
defaultValue={value}
type="text"
ref="editField"
onChange={(event) => {this.setState({ editedValue: event.target.value })}}
onKeyDown={(event) => onKeyDown(event)}
style={{display:'inline-block'}}
/>
}
} else {
let displayedValue = value;
if (key === 'location') {
try {
const dms = formatcoords(value);
displayedValue = dms.format('DDMMss', { decimalPlaces: 0 });
} catch (error) {
displayedValue = '';
}
}
if (['source_url', 'location'].indexOf(key) >= 0) {
let url = '';
if (key === 'source_url') url = value;
if (key === 'location') {
const ll = this.latLongFromLocation(value);
url = Note.geoLocationUrlFromLatLong(ll.latitude, ll.longitude);
}
controlComp = <a href="#" onClick={() => bridge().openExternal(url)} style={theme.urlStyle}>{displayedValue}</a>
} else {
controlComp = <div style={Object.assign({}, theme.textStyle, {display: 'inline-block'})}>{displayedValue}</div>
}
if (key !== 'id') {
editCompHandler = () => {this.editPropertyButtonClick(key, value)};
editCompIcon = 'fa-edit';
}
}
if (editCompHandler) {
editComp = (
<a href="#" onClick={editCompHandler} style={styles.editPropertyButton}>
<i className={'fa ' + editCompIcon} aria-hidden="true" style={{ marginLeft: '.5em'}}></i>
</a>
);
}
return (
<div key={key} style={this.styles_.controlBox} className="note-property-box">
{ labelComp }
{ controlComp }
{ editComp }
</div>
);
}
formatLabel(key) {
if (this.keyToLabel_[key]) return this.keyToLabel_[key];
return key;
}
formatValue(key, note) {
if (key === 'location') {
if (!Number(note.latitude) && !Number(note.longitude)) return null;
const dms = formatcoords(Number(note.latitude), Number(note.longitude))
return dms.format('DDMMss', { decimalPlaces: 0 });
}
if (['user_updated_time', 'user_created_time'].indexOf(key) >= 0) {
return time.formatMsToLocal(note[key]);
}
return note[key];
}
render() {
const style = this.props.style;
const theme = themeStyle(this.props.theme);
const styles = this.styles(this.props.theme);
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="cancel" style={styles.button} onClick={this.cancelButton_click}>{_('Cancel')}</button>);
const noteComps = [];
const modalLayerStyle = Object.assign({}, styles.modalLayer);
if (!this.state.visible) modalLayerStyle.display = 'none';
if (formNote) {
for (let key in formNote) {
if (!formNote.hasOwnProperty(key)) continue;
const comp = this.createNoteField(key, formNote[key]);
noteComps.push(comp);
}
}
return (
<div style={modalLayerStyle}>
<div style={styles.dialogBox}>
<div style={styles.dialogTitle}>Note properties</div>
<div>{noteComps}</div>
<div style={{ textAlign: 'right', marginTop: 10 }}>
{buttonComps}
</div>
</div>
</div>
);
}
}
module.exports = NotePropertiesDialog;

View File

@@ -87,14 +87,13 @@ class NoteTextComponent extends React.Component {
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.onEditorPaste_ = async (event = null) => {
this.onEditorPaste_ = async (event) => {
const formats = clipboard.availableFormats();
for (let i = 0; i < formats.length; i++) {
const format = formats[i].toLowerCase();
const formatType = format.split('/')[0]
if (formatType === 'image') {
if (event) event.preventDefault();
event.preventDefault();
const image = clipboard.readImage();
@@ -115,32 +114,6 @@ class NoteTextComponent extends React.Component {
this.setState({ lastKeys: lastKeys });
}
this.onEditorContextMenu_ = (event) => {
const menu = new Menu();
const selectedText = this.selectedText();
const clipboardText = clipboard.readText();
menu.append(new MenuItem({label: _('Cut'), enabled: !!selectedText, click: async () => {
this.editorCutText();
}}));
menu.append(new MenuItem({label: _('Copy'), enabled: !!selectedText, click: async () => {
this.editorCopyText();
}}));
menu.append(new MenuItem({label: _('Paste'), enabled: true, click: async () => {
if (clipboardText) {
this.editorPasteText();
} else {
// To handle pasting images
this.onEditorPaste_();
}
}}));
menu.popup(bridge().window());
}
this.onDrop_ = async (event) => {
const files = event.dataTransfer.files;
if (!files || !files.length) return;
@@ -369,8 +342,9 @@ class NoteTextComponent extends React.Component {
this.editorSetScrollTop(1);
this.restoreScrollTop_ = 0;
// Only force focus on notes when creating a new note/todo
if (this.props.newNote) {
// If a search is in progress we don't focus any field otherwise it will
// take the focus out of the search box.
if (note && this.props.notesParentType !== 'Search') {
const focusSettingName = !!note.is_todo ? 'newTodoFocus' : 'newNoteFocus';
if (Setting.value(focusSettingName) === 'title') {
@@ -493,6 +467,8 @@ class NoteTextComponent extends React.Component {
const menu = new Menu()
console.info(itemType);
if (itemType === "image" || itemType === "resource") {
const resource = await Resource.load(arg0.resourceId);
const resourcePath = Resource.fullPath(resource);
@@ -619,7 +595,6 @@ class NoteTextComponent extends React.Component {
this.editor_.editor.renderer.off('afterRender', this.onAfterEditorRender_);
document.querySelector('#note-editor').removeEventListener('paste', this.onEditorPaste_, true);
document.querySelector('#note-editor').removeEventListener('keydown', this.onEditorKeyDown_);
document.querySelector('#note-editor').removeEventListener('contextmenu', this.onEditorContextMenu_);
}
this.editor_ = element;
@@ -648,7 +623,6 @@ class NoteTextComponent extends React.Component {
document.querySelector('#note-editor').addEventListener('paste', this.onEditorPaste_, true);
document.querySelector('#note-editor').addEventListener('keydown', this.onEditorKeyDown_);
document.querySelector('#note-editor').addEventListener('contextmenu', this.onEditorContextMenu_);
const lineLeftSpaces = function(line) {
let output = '';
@@ -921,49 +895,6 @@ class NoteTextComponent extends React.Component {
return lines[row];
}
selectedText() {
if (!this.state.note || !this.state.note.body) return '';
const selection = this.textOffsetSelection();
if (!selection || selection.start === selection.end) return '';
return this.state.note.body.substr(selection.start, selection.end - selection.start);
}
editorCopyText() {
clipboard.writeText(this.selectedText());
}
editorCutText() {
const selectedText = this.selectedText();
if (!selectedText) return;
clipboard.writeText(selectedText);
const s = this.textOffsetSelection();
if (!s || s.start === s.end) return '';
const s1 = this.state.note.body.substr(0, s.start);
const s2 = this.state.note.body.substr(s.end);
shared.noteComponent_change(this, 'body', s1 + s2);
this.updateEditorWithDelay((editor) => {
const range = this.selectionRange_;
range.setStart(range.start.row, range.start.column);
range.setEnd(range.start.row, range.start.column);
editor.getSession().getSelection().setSelectionRange(range, false);
editor.focus();
}, 10);
}
editorPasteText() {
const s = this.textOffsetSelection();
const s1 = this.state.note.body.substr(0, s.start);
const s2 = this.state.note.body.substr(s.end);
this.wrapSelectionWithStrings("", "", '', clipboard.readText());
}
selectionRangePreviousLine() {
if (!this.selectionRange_) return '';
const row = this.selectionRange_.start.row;
@@ -976,20 +907,16 @@ class NoteTextComponent extends React.Component {
return this.lineAtRow(row);
}
textOffsetSelection() {
return this.selectionRange_ ? this.rangeToTextOffsets(this.selectionRange_, this.state.note.body) : null;
}
wrapSelectionWithStrings(string1, string2 = '', defaultText = '', replacementText = '') {
wrapSelectionWithStrings(string1, string2 = '', defaultText = '') {
if (!this.rawEditor() || !this.state.note) return;
const selection = this.textOffsetSelection();
const selection = this.selectionRange_ ? this.rangeToTextOffsets(this.selectionRange_, this.state.note.body) : null;
let newBody = this.state.note.body;
if (selection && selection.start !== selection.end) {
const s1 = this.state.note.body.substr(0, selection.start);
const s2 = replacementText ? replacementText : this.state.note.body.substr(selection.start, selection.end - selection.start);
const s2 = this.state.note.body.substr(selection.start, selection.end - selection.start);
const s3 = this.state.note.body.substr(selection.end);
newBody = s1 + string1 + s2 + string2 + s3;
@@ -1000,11 +927,6 @@ class NoteTextComponent extends React.Component {
end: { row: r.end.row, column: r.end.column + string1.length},
};
if (replacementText) {
const diff = replacementText.length - (selection.end - selection.start);
newRange.end.column += diff;
}
this.updateEditorWithDelay((editor) => {
const range = this.selectionRange_;
range.setStart(newRange.start.row, newRange.start.column);
@@ -1013,20 +935,19 @@ class NoteTextComponent extends React.Component {
editor.focus();
});
} else {
let middleText = replacementText ? replacementText : defaultText;
const textOffset = this.currentTextOffset();
const s1 = this.state.note.body.substr(0, textOffset);
const s2 = this.state.note.body.substr(textOffset);
newBody = s1 + string1 + middleText + string2 + s2;
newBody = s1 + string1 + defaultText + string2 + s2;
const p = this.textOffsetToCursorPosition(textOffset + string1.length, newBody);
const newRange = {
start: { row: p.row, column: p.column },
end: { row: p.row, column: p.column + middleText.length },
end: { row: p.row, column: p.column + defaultText.length },
};
this.updateEditorWithDelay((editor) => {
if (middleText && newRange) {
if (defaultText && newRange) {
const range = this.selectionRange_;
range.setStart(newRange.start.row, newRange.start.column);
range.setEnd(newRange.end.row, newRange.end.column);
@@ -1145,25 +1066,6 @@ class NoteTextComponent extends React.Component {
type: 'separator',
});
toolbarItems.push({
tooltip: _('Note properties'),
iconName: 'fa-info-circle',
onClick: () => {
const n = this.state.note;
if (!n || !n.id) return;
this.props.dispatch({
type: 'WINDOW_COMMAND',
name: 'commandNoteProperties',
noteId: n.id,
});
},
});
toolbarItems.push({
type: 'separator',
});
toolbarItems.push({
tooltip: _('Hyperlink'),
iconName: 'fa-link',

View File

@@ -102,8 +102,7 @@ class PromptDialog extends React.Component {
if (this.props.onClose) {
let outputAnswer = this.state.answer;
if (this.props.inputType === 'datetime') {
// outputAnswer = anythingToDate(outputAnswer);
outputAnswer = time.anythingToDateTime(outputAnswer);
outputAnswer = anythingToDate(outputAnswer);
}
this.props.onClose(accept ? outputAnswer : null, buttonType);
}
@@ -114,14 +113,14 @@ class PromptDialog extends React.Component {
this.setState({ answer: event.target.value });
}
// const anythingToDate = (o) => {
// if (o && o.toDate) return o.toDate();
// if (!o) return null;
// let m = moment(o, time.dateTimeFormat());
// if (m.isValid()) return m.toDate();
// m = moment(o, time.dateFormat());
// return m.isValid() ? m.toDate() : null;
// }
const anythingToDate = (o) => {
if (o && o.toDate) return o.toDate();
if (!o) return null;
let m = moment(o, time.dateTimeFormat());
if (m.isValid()) return m.toDate();
m = moment(o, time.dateFormat());
return m.isValid() ? m.toDate() : null;
}
const onDateTimeChange = (momentObject) => {
this.setState({ answer: momentObject });

View File

@@ -55,21 +55,6 @@ class SideBarComponent extends React.Component {
}
};
this.onTagDrop_ = async (event) => {
const tagId = event.currentTarget.getAttribute('tagid');
const dt = event.dataTransfer;
if (!dt) return;
if (dt.types.indexOf("text/x-jop-note-ids") >= 0) {
event.preventDefault();
const noteIds = JSON.parse(dt.getData("text/x-jop-note-ids"));
for (let i = 0; i < noteIds.length; i++) {
await Tag.addNote(tagId, noteIds[i]);
}
}
}
this.onFolderToggleClick_ = async (event) => {
const folderId = event.currentTarget.getAttribute('folderid');
@@ -253,22 +238,14 @@ class SideBarComponent extends React.Component {
const InteropService = require("lib/services/InteropService.js");
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, { sourceFolderIds: [itemId] });
}}));
}
menu.append(
new MenuItem({
label: _("Export"),
submenu: exportMenu,
click: async () => {
const ioService = new InteropService();
const module = ioService.moduleByFormat_("exporter", "jex");
await InteropServiceHelper.export(this.props.dispatch.bind(this), module, { sourceFolderIds: [itemId] });
},
})
);
}
@@ -369,10 +346,8 @@ class SideBarComponent extends React.Component {
data-id={tag.id}
data-type={BaseModel.TYPE_TAG}
onContextMenu={event => this.itemContextMenu(event)}
tagid={tag.id}
key={tag.id}
style={style}
onDrop={this.onTagDrop_}
onClick={() => {
this.tagItem_click(tag);
}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -11,15 +11,10 @@ locales['gl_ES'] = require('./gl_ES.json');
locales['hr_HR'] = require('./hr_HR.json');
locales['it_IT'] = require('./it_IT.json');
locales['ja_JP'] = require('./ja_JP.json');
locales['ko'] = require('./ko.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['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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{
"name": "Joplin",
"version": "1.0.107",
"version": "1.0.104",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -35,14 +35,14 @@
"dev": true
},
"abab": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz",
"integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w=="
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
"integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4="
},
"acorn": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz",
"integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw=="
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
"integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ=="
},
"acorn-globals": {
"version": "4.1.0",
@@ -52,6 +52,14 @@
"acorn": "^5.0.0"
}
},
"agent-base": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
"integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
"requires": {
"es6-promisify": "^5.0.0"
}
},
"ajv": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz",
@@ -1363,14 +1371,14 @@
"dev": true
},
"cssom": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
"integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog=="
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.3.tgz",
"integrity": "sha512-pjE/I/NSp3iyeoxXN5QaoJpgzYUMj2dJHx9OSufoTliJLDx+kuOQaMCJW8OwvrKJswhXUHnHN6eUmUSETN0msg=="
},
"cssstyle": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz",
"integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==",
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz",
"integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==",
"requires": {
"cssom": "0.3.x"
}
@@ -1685,25 +1693,13 @@
}
},
"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.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz",
"integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==",
"requires": {
"abab": "^2.0.0",
"whatwg-mimetype": "^2.1.0",
"whatwg-url": "^7.0.0"
},
"dependencies": {
"whatwg-url": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
"integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
"requires": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
"webidl-conversions": "^4.0.2"
}
}
"abab": "^1.0.4",
"whatwg-mimetype": "^2.0.0",
"whatwg-url": "^6.4.0"
}
},
"debug": {
@@ -1792,11 +1788,6 @@
"repeating": "^2.0.0"
}
},
"diff-match-patch": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz",
"integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg=="
},
"dmg-builder": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-4.10.1.tgz",
@@ -2275,6 +2266,14 @@
"resolved": "https://registry.npmjs.org/es6-promise-pool/-/es6-promise-pool-2.5.0.tgz",
"integrity": "sha1-FHxhKza0fxBQJ/nSv1SlmKmdnMs="
},
"es6-promisify": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
"requires": {
"es6-promise": "^4.0.3"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -2282,9 +2281,9 @@
"dev": true
},
"escodegen": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
"integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz",
"integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==",
"requires": {
"esprima": "^3.1.3",
"estraverse": "^4.2.0",
@@ -2693,11 +2692,6 @@
"mime-types": "^2.1.12"
}
},
"formatcoords": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/formatcoords/-/formatcoords-1.1.3.tgz",
"integrity": "sha1-dS8FarL+NMHUrooZBIzgw44W7QM="
},
"fragment-cache": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -3529,6 +3523,25 @@
"sshpk": "^1.7.0"
}
},
"https-proxy-agent": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
"integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
"requires": {
"agent-base": "^4.1.0",
"debug": "^3.1.0"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
}
}
},
"iconv-lite": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
@@ -3943,35 +3956,35 @@
"optional": true
},
"jsdom": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
"integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
"version": "11.11.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz",
"integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==",
"requires": {
"abab": "^2.0.0",
"acorn": "^5.5.3",
"abab": "^1.0.4",
"acorn": "^5.3.0",
"acorn-globals": "^4.1.0",
"array-equal": "^1.0.0",
"cssom": ">= 0.3.2 < 0.4.0",
"cssstyle": "^1.0.0",
"cssstyle": ">= 0.3.1 < 0.4.0",
"data-urls": "^1.0.0",
"domexception": "^1.0.1",
"escodegen": "^1.9.1",
"domexception": "^1.0.0",
"escodegen": "^1.9.0",
"html-encoding-sniffer": "^1.0.2",
"left-pad": "^1.3.0",
"nwsapi": "^2.0.7",
"left-pad": "^1.2.0",
"nwsapi": "^2.0.0",
"parse5": "4.0.0",
"pn": "^1.1.0",
"request": "^2.87.0",
"request": "^2.83.0",
"request-promise-native": "^1.0.5",
"sax": "^1.2.4",
"symbol-tree": "^3.2.2",
"tough-cookie": "^2.3.4",
"tough-cookie": "^2.3.3",
"w3c-hr-time": "^1.0.1",
"webidl-conversions": "^4.0.2",
"whatwg-encoding": "^1.0.3",
"whatwg-mimetype": "^2.1.0",
"whatwg-url": "^6.4.1",
"ws": "^5.2.0",
"ws": "^4.0.0",
"xml-name-validator": "^3.0.0"
}
},
@@ -4027,18 +4040,11 @@
"integrity": "sha1-FHshJTaQNcpLL30hDcU58Amz3po="
},
"katex": {
"version": "0.10.0-rc.1",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.10.0-rc.1.tgz",
"integrity": "sha512-JmnreLp0lWPA1z1krzO5drN1qBrkhqzMg5qv0l5y+Fr97sqgOuh37k9ky7VD1k/Ec+yvOe2BptiYSR9OoShkFg==",
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.9.0.tgz",
"integrity": "sha512-lp3x90LT1tDZBW2tjLheJ98wmRMRjUHwk4QpaswT9bhqoQZ+XA4cPcjcQBxgOQNwaOSt6ZeL/a6GKQ1of3LFxQ==",
"requires": {
"commander": "^2.16.0"
},
"dependencies": {
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
}
"match-at": "^0.1.1"
}
},
"kind-of": {
@@ -4586,9 +4592,9 @@
"dev": true
},
"nwsapi": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz",
"integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ=="
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.4.tgz",
"integrity": "sha512-Zt6HRR6RcJkuj5/N9zeE7FN6YitRW//hK2wTOwX274IBphbY3Zf5+yn5mZ9v/SzAOTMjQNxZf9KkmPLWn0cV4g=="
},
"oauth-sign": {
"version": "0.8.2",
@@ -5112,12 +5118,11 @@
}
},
"react-ace": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/react-ace/-/react-ace-6.1.4.tgz",
"integrity": "sha512-a8/lAsy2bfi7Ho+3Kaj8hBPR+PEiCTG9xFG9LIjCJrv5WQFYFpeFTiPWA96M3t+LgIDFFltwfVTwD2pmdAVOxQ==",
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/react-ace/-/react-ace-5.10.0.tgz",
"integrity": "sha512-aEK/XZCowP8IXq91e2DYqOtGhabk1bbjt+fyeW0UBcIkzDzP/RX/MeJKeyW7wsZcwElACVwyy9nnwXBTqgky3A==",
"requires": {
"brace": "^0.11.0",
"diff-match-patch": "^1.0.0",
"lodash.get": "^4.4.2",
"lodash.isequal": "^4.1.1",
"prop-types": "^15.5.8"
@@ -7159,21 +7164,11 @@
"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.3",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
"integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
"requires": {
"iconv-lite": "0.4.23"
},
"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==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
}
"iconv-lite": "0.4.19"
}
},
"whatwg-fetch": {
@@ -7285,11 +7280,12 @@
}
},
"ws": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
"integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz",
"integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==",
"requires": {
"async-limiter": "~1.0.0"
"async-limiter": "~1.0.0",
"safe-buffer": "~5.1.0"
}
},
"xdg-basedir": {

View File

@@ -1,6 +1,6 @@
{
"name": "Joplin",
"version": "1.0.107",
"version": "1.0.104",
"description": "Joplin for Desktop",
"main": "main.js",
"scripts": {
@@ -87,15 +87,15 @@
"es6-promise-pool": "^2.5.0",
"follow-redirects": "^1.5.0",
"form-data": "^2.3.2",
"formatcoords": "^1.1.3",
"fs-extra": "^5.0.0",
"highlight.js": "^9.12.0",
"html-entities": "^1.2.1",
"https-proxy-agent": "^2.2.1",
"image-type": "^3.0.0",
"joplin-turndown": "^4.0.8",
"joplin-turndown-plugin-gfm": "^1.0.7",
"jssha": "^2.3.1",
"katex": "^0.10.0-rc.1",
"katex": "^0.9.0",
"levenshtein": "^1.0.5",
"lodash": "^4.17.10",
"mark.js": "^8.11.1",
@@ -110,7 +110,7 @@
"promise": "^8.0.1",
"query-string": "^5.1.1",
"react": "^16.4.0",
"react-ace": "^6.1.4",
"react-ace": "^5.10.0",
"react-datetime": "^2.14.0",
"react-dom": "^16.4.0",
"react-redux": "^5.0.7",

View File

@@ -77,8 +77,4 @@ table td, table th {
.smalltalk {
font-family: sans-serif;
}
.note-property-box .rdt {
display: inline-block;
}

View File

@@ -76,15 +76,11 @@ globalStyle.textStyle2 = Object.assign({}, globalStyle.textStyle, {
color: globalStyle.color2,
});
globalStyle.urlStyle = Object.assign({}, globalStyle.textStyle, { color: "#155BDA", textDecoration: 'underline' });
globalStyle.h1Style = Object.assign({}, globalStyle.textStyle);
globalStyle.h1Style.fontSize *= 1.5;
globalStyle.h1Style.fontWeight = 'bold';
globalStyle.h2Style = Object.assign({}, globalStyle.textStyle);
globalStyle.h2Style.fontSize *= 1.3;
globalStyle.h2Style.fontWeight = 'bold';
globalStyle.toolbarStyle = {
height: globalStyle.toolbarHeight,

View File

@@ -1,6 +1,6 @@
# Joplin
[![Donate](https://joplin.cozic.net/images/badges/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted) [![Become a patron](https://joplin.cozic.net/images/badges/Patreon-Badge.svg)](https://www.patreon.com/joplin) [![Travis Build Status](https://travis-ci.org/laurent22/joplin.svg?branch=master)](https://travis-ci.org/laurent22/joplin) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/laurent22/joplin?branch=master&passingText=master%20-%20OK&svg=true)](https://ci.appveyor.com/project/laurent22/joplin)
[![Donate](https://joplin.cozic.net/images/badges/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted) [![Donate with Bitcoin](https://joplin.cozic.net/images/badges/Donate-Bitcoin.svg)](https://joplin.cozic.net/donate/#bitcoin) [![Travis Build Status](https://travis-ci.org/laurent22/joplin.svg?branch=master)](https://travis-ci.org/laurent22/joplin) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/laurent22/joplin?branch=master&passingText=master%20-%20OK&svg=true)](https://ci.appveyor.com/project/laurent22/joplin)
Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown).
@@ -20,23 +20,17 @@ Three types of applications are available: for the **desktop** (Windows, macOS a
Operating System | Download | Alternative
-----------------|--------|-------------------
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.105/Joplin-Setup-1.0.105.exe'><img alt='Get it on Windows' height="40px" src='https://joplin.cozic.net/images/BadgeWindows.png'/></a> | or Get the <a href='https://github.com/laurent22/joplin/releases/download/v1.0.105/JoplinPortable.exe'>Portable version</a><br>(to run from a USB key, etc.)
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.105/Joplin-1.0.105.dmg'><img alt='Get it on macOS' height="40px" src='https://joplin.cozic.net/images/BadgeMacOS.png'/></a> |
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.105/Joplin-1.0.105-x86_64.AppImage'><img alt='Get it on Linux' height="40px" src='https://joplin.cozic.net/images/BadgeLinux.png'/></a> | An Arch Linux package<br>[is also available](#terminal-application).
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.104/Joplin-Setup-1.0.104.exe'><img alt='Get it on Windows' height="40px" src='https://joplin.cozic.net/images/BadgeWindows.png'/></a> | or Get the <a href='https://github.com/laurent22/joplin/releases/download/v1.0.104/JoplinPortable.exe'>Portable version</a><br>(to run from a USB key, etc.)
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.104/Joplin-1.0.104.dmg'><img alt='Get it on macOS' height="40px" src='https://joplin.cozic.net/images/BadgeMacOS.png'/></a> |
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.104/Joplin-1.0.104-x86_64.AppImage'><img alt='Get it on Linux' height="40px" src='https://joplin.cozic.net/images/BadgeLinux.png'/></a> | An Arch Linux package<br>[is also available](#terminal-application).
The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
### Install and Update Ubuntu/Debian (Gnome Shell)
``` sh
wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/install_ubuntu.sh | bash
```
## Mobile applications
Operating System | Download | Alt. Download
-----------------|----------|----------------
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplin.cozic.net/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.131/joplin-v1.0.131.apk)
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://joplin.cozic.net/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.129/joplin-v1.0.129.apk)
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://joplin.cozic.net/images/BadgeIOS.png'/></a> | -
## Terminal application
@@ -174,7 +168,6 @@ WebDAV-compatible services that are known to work with Joplin:
- [Box.com](https://www.box.com/)
- [DriveHQ](https://www.drivehq.com)
- [Fastmail](https://www.fastmail.com/)
- [HiDrive](https://www.strato.fr/stockage-en-ligne/) from Strato. [Setup help](https://github.com/laurent22/joplin/issues/309)
- [Nginx WebDAV Module](https://nginx.org/en/docs/http/ngx_http_dav_module.html)
- [OwnCloud](https://owncloud.org/)
@@ -311,29 +304,24 @@ Current translations:
<!-- LOCALE-TABLE-AUTO-GENERATED -->
&nbsp; | Language | Po File | Last translator | Percent done
---|---|---|---|---
![](https://joplin.cozic.net/images/flags/es/basque_country.png) | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 64%
![](https://joplin.cozic.net/images/flags/es/catalonia.png) | Catalan | [ca](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ca.po) | jmontane, 2018 | 91%
![](https://joplin.cozic.net/images/flags/country-4x3/hr.png) | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić (trbuhom@net.hr) | 52%
![](https://joplin.cozic.net/images/flags/country-4x3/cz.png) | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt (lukas@aiya.cz) | 81%
![](https://joplin.cozic.net/images/flags/country-4x3/dk.png) | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | Morten Juhl-Johansen Zölde-Fejér (mjjzf@syntaktisk. | 83%
![](https://joplin.cozic.net/images/flags/country-4x3/de.png) | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Michael Sonntag (ms@editorei.de) | 98%
![](https://joplin.cozic.net/images/flags/es/basque_country.png) | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 65%
![](https://joplin.cozic.net/images/flags/es/catalonia.png) | Catalan | [ca](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ca.po) | jmontane, 2018 | 93%
![](https://joplin.cozic.net/images/flags/country-4x3/hr.png) | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić (trbuhom@net.hr) | 53%
![](https://joplin.cozic.net/images/flags/country-4x3/cz.png) | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt (lukas@aiya.cz) | 82%
![](https://joplin.cozic.net/images/flags/country-4x3/dk.png) | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | Morten Juhl-Johansen Zölde-Fejér (mjjzf@syntaktisk. | 84%
![](https://joplin.cozic.net/images/flags/country-4x3/de.png) | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Michael Sonntag (ms@editorei.de) | 99%
![](https://joplin.cozic.net/images/flags/country-4x3/gb.png) | English | [en_GB](https://github.com/laurent22/joplin/blob/master/CliClient/locales/en_GB.po) | | 100%
![](https://joplin.cozic.net/images/flags/country-4x3/es.png) | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín (f@mrtn.es) | 98%
![](https://joplin.cozic.net/images/flags/country-4x3/fr.png) | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 98%
![](https://joplin.cozic.net/images/flags/es/galicia.png) | Galician | [gl_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/gl_ES.po) | Marcos Lans (marcoslansgarza@gmail.com) | 81%
![](https://joplin.cozic.net/images/flags/country-4x3/it.png) | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 97%
![](https://joplin.cozic.net/images/flags/country-4x3/nl.png) | Nederlands | [nl_NL](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_NL.po) | Heimen Stoffels (vistausss@outlook.com) | 98%
![](https://joplin.cozic.net/images/flags/country-4x3/be.png) | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 64%
![](https://joplin.cozic.net/images/flags/country-4x3/no.png) | Norwegian | [no](https://github.com/laurent22/joplin/blob/master/CliClient/locales/no.po) | | 87%
![](https://joplin.cozic.net/images/flags/country-4x3/br.png) | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos (rnbastos@gmail.com) | 98%
![](https://joplin.cozic.net/images/flags/country-4x3/ro.png) | Română | [ro](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ro.po) | | 64%
![](https://joplin.cozic.net/images/flags/country-4x3/si.png) | Slovenian | [sl_SI](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sl_SI.po) | | 80%
![](https://joplin.cozic.net/images/flags/country-4x3/se.png) | Svenska | [sv](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sv.po) | Jonatan Nyberg (jonatan@autistici.org) | 97%
![](https://joplin.cozic.net/images/flags/country-4x3/ru.png) | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov (artyom.karlov@gmail.com) | 80%
![](https://joplin.cozic.net/images/flags/country-4x3/cn.png) | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 98%
![](https://joplin.cozic.net/images/flags/country-4x3/tw.png) | 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_TW.po) | penguinsam (samliu@gmail.com) | 98%
![](https://joplin.cozic.net/images/flags/country-4x3/jp.png) | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 52%
![](https://joplin.cozic.net/images/flags/country-4x3/kr.png) | 한국말 | [ko](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ko.po) | | 98%
![](https://joplin.cozic.net/images/flags/country-4x3/es.png) | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín (f@mrtn.es) | 92%
![](https://joplin.cozic.net/images/flags/country-4x3/fr.png) | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 100%
![](https://joplin.cozic.net/images/flags/es/galicia.png) | Galician | [gl_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/gl_ES.po) | Marcos Lans (marcoslansgarza@gmail.com) | 83%
![](https://joplin.cozic.net/images/flags/country-4x3/it.png) | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 55%
![](https://joplin.cozic.net/images/flags/country-4x3/be.png) | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 66%
![](https://joplin.cozic.net/images/flags/country-4x3/br.png) | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos (rnbastos@gmail.com) | 85%
![](https://joplin.cozic.net/images/flags/country-4x3/si.png) | Slovenian | [sl_SI](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sl_SI.po) | | 82%
![](https://joplin.cozic.net/images/flags/country-4x3/ru.png) | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov (artyom.karlov@gmail.com) | 82%
![](https://joplin.cozic.net/images/flags/country-4x3/cn.png) | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 96%
![](https://joplin.cozic.net/images/flags/country-4x3/tw.png) | 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_TW.po) | penguinsam (samliu@gmail.com) | 71%
![](https://joplin.cozic.net/images/flags/country-4x3/jp.png) | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | | 53%
<!-- LOCALE-TABLE-AUTO-GENERATED -->
# Known bugs

View File

@@ -90,8 +90,8 @@ android {
applicationId "net.cozic.joplin"
minSdkVersion 16
targetSdkVersion 26
versionCode 2097309
versionName "1.0.131"
versionCode 2097307
versionName "1.0.129"
ndk {
abiFilters "armeabi-v7a", "x86"
}
@@ -137,7 +137,7 @@ android {
}
dependencies {
compile project(':react-native-file-viewer')
compile project(':react-native-file-viewer')
compile project(':react-native-securerandom')
compile project(':react-native-push-notification')
compile project(':react-native-fs')
@@ -151,8 +151,6 @@ dependencies {
compile project(':react-native-fetch-blob')
compile project(':react-native-document-picker')
compile project(':react-native-image-resizer')
compile project(':react-native-share-extension')
compile "com.facebook.react:react-native:+"
}
// Run this once to be able to run the application with BUCK

View File

@@ -1,6 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto"
package="net.cozic.joplin"
android:versionCode="2"
android:versionName="0.8.0">
@@ -15,12 +14,12 @@
<!-- START react-native-push-notification -->
<!-- ==================================== -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!-- ================================== -->
<!-- END react-native-push-notification -->
<!-- ================================== -->
@@ -40,13 +39,13 @@
<!-- START react-native-push-notification -->
<!-- ==================================== -->
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationRegistrationService"/>
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationRegistrationService"/>
<!-- ================================== -->
<!-- END react-native-push-notification -->
<!-- ================================== -->
@@ -64,19 +63,5 @@
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<activity
android:noHistory="true"
android:name=".share.ShareActivity"
android:configChanges="orientation"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -7,7 +7,6 @@ import com.vinzscam.reactnativefileviewer.RNFileViewerPackage;
import net.rhogan.rnsecurerandom.RNSecureRandomPackage;
import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage;
import com.imagepicker.ImagePickerPackage;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
@@ -19,8 +18,6 @@ import com.rnfs.RNFSPackage;
import fr.bamlab.rnimageresizer.ImageResizerPackage;
import org.pgsqlite.SQLitePluginPackage;
import com.alinz.parkerdan.shareextension.SharePackage;
import java.util.Arrays;
import java.util.List;
@@ -45,8 +42,7 @@ public class MainApplication extends Application implements ReactApplication {
new RNFetchBlobPackage(),
new RNFSPackage(),
new SQLitePluginPackage(),
new VectorIconsPackage(),
new SharePackage()
new VectorIconsPackage()
);
}
};

View File

@@ -1,15 +0,0 @@
package net.cozic.joplin.share;
// import ReactActivity
import com.facebook.react.ReactActivity;
public class ShareActivity extends ReactActivity {
@Override
protected String getMainComponentName() {
// this is the name AppRegistry will use to launch the Share View
return "Joplin";
}
}

View File

@@ -1,38 +0,0 @@
package net.cozic.joplin.share;
// import build config
import net.cozic.joplin.BuildConfig;
import com.alinz.parkerdan.shareextension.SharePackage;
import android.app.Application;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactPackage;
import java.util.Arrays;
import java.util.List;
public class ShareApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new SharePackage()
);
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
}

View File

@@ -25,7 +25,4 @@ include ':react-native-fetch-blob'
project(':react-native-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fetch-blob/android')
include ':react-native-document-picker'
project(':react-native-document-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-document-picker/android')
include ':app', ':react-native-share-extension'
project(':react-native-share-extension').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-share-extension/android')
project(':react-native-document-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-document-picker/android')

View File

@@ -50,10 +50,10 @@ class BaseApplication {
this.dbLogger_ = new Logger();
this.eventEmitter_ = new EventEmitter();
// Note: this is basically a cache of state.selectedFolderId. It should *only*
// Note: this is basically a cache of state.selectedFolderId. It should *only*
// be derived from the state and not set directly since that would make the
// state and UI out of sync.
this.currentFolder_ = null;
this.currentFolder_ = null;
}
logger() {
@@ -70,7 +70,7 @@ class BaseApplication {
async refreshCurrentFolder() {
let newFolder = null;
if (this.currentFolder_) newFolder = await Folder.load(this.currentFolder_.id);
if (!newFolder) newFolder = await Folder.defaultFolder();
@@ -99,7 +99,7 @@ class BaseApplication {
while (argv.length) {
let arg = argv[0];
let nextArg = argv.length >= 2 ? argv[1] : null;
if (arg == '--profile') {
if (!nextArg) throw new JoplinError(_('Usage: %s', '--profile <dir-path>'), 'flagError');
matched.profileDir = nextArg;
@@ -183,7 +183,7 @@ class BaseApplication {
async refreshNotes(state) {
let parentType = state.notesParentType;
let parentId = null;
if (parentType === 'Folder') {
parentId = state.selectedFolderId;
parentType = BaseModel.TYPE_FOLDER;
@@ -388,7 +388,7 @@ class BaseApplication {
flags.splice(0, 0, 'node');
flags = await this.handleStartFlags_(flags, false);
return flags.matched;
}
@@ -494,9 +494,6 @@ class BaseApplication {
setLocale(Setting.value('locale'));
}
time.setDateFormat(Setting.value('dateFormat'));
time.setTimeFormat(Setting.value('timeFormat'));
BaseService.logger_ = this.logger_;
EncryptionService.instance().setLogger(this.logger_);
BaseItem.encryptionService_ = EncryptionService.instance();
@@ -517,4 +514,4 @@ class BaseApplication {
}
module.exports = { BaseApplication };
module.exports = { BaseApplication };

View File

@@ -287,7 +287,7 @@ class BaseModel {
}
// Remove fields that are not in the `fields` list, if provided.
// Note that things like update_time, user_updated_time will still
// Note that things like update_time, user_update_time will still
// be part of the final list of fields if autoTimestamp is on.
// id also will stay.
if (!options.isNew && options.fields) {
@@ -314,10 +314,6 @@ class BaseModel {
// The purpose of user_updated_time is to allow the user to manually set the time of a note (in which case
// options.autoTimestamp will be `false`). However note that if the item is later changed, this timestamp
// will be set again to the current time.
//
// The technique to modify user_updated_time while keeping updated_time current (so that sync can happen) is to
// manually set updated_time when saving and to set autoTimestamp to false, for example:
// Note.save({ id: "...", updated_time: Date.now(), user_updated_time: 1436342618000 }, { autoTimestamp: false })
if (options.autoTimestamp && this.hasField('user_updated_time')) {
o.user_updated_time = timeNow;
}

View File

@@ -259,7 +259,7 @@ class MdToHtml {
}
if (!rendererPlugin) {
output.push('<code class="inline-code">');
output.push('<code>');
}
}
@@ -395,40 +395,6 @@ class MdToHtml {
html: true,
});
// Add `file:` protocol in linkify to allow text in the format of "file://..." to translate into
// file-URL links in html view
md.linkify.add('file:', {
validate: function (text, pos, self) {
var tail = text.slice(pos);
if (!self.re.file) {
self.re.file = new RegExp(
'^[\\/]{2,3}[\\S]+' // matches all local file URI on Win/Unix/MacOS systems including reserved characters in some OS (i.e. no OS specific sanity check)
);
}
if (self.re.file.test(tail)) {
return tail.match(self.re.file)[0].length;
}
return 0;
}
});
// enable file link URLs in MarkdownIt. Keeps other URL restrictions of MarkdownIt untouched.
// Format [link name](file://...)
md.validateLink = function (url) {
var BAD_PROTO_RE = /^(vbscript|javascript|data):/;
var GOOD_DATA_RE = /^data:image\/(gif|png|jpeg|webp);/;
// url should be normalized at this point, and existing entities are decoded
var str = url.trim().toLowerCase();
return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;
}
// This is currently used only so that the $expression$ and $$\nexpression\n$$ blocks are translated
// to math_inline and math_block blocks. These blocks are then processed directly with the Katex
// library. It is better this way as then it is possible to conditionally load the CSS required by
@@ -472,6 +438,9 @@ class MdToHtml {
}
}
// Support <br> tag to allow newlines inside table cells
renderedBody = renderedBody.replace(/&lt;br&gt;/gi, '<br>');
// https://necolas.github.io/normalize.css/
const normalizeCss = `
html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
@@ -526,7 +495,7 @@ class MdToHtml {
margin-right: 0.4em;
background-color: ` + style.htmlColor + `;
/* Awesome Font file */
-webkit-mask: url("data:image/svg+xml;utf8,<svg viewBox='0 0 1536 1892' xmlns='http://www.w3.org/2000/svg'><path d='M288 128C129 128 0 257 0 416v960c0 159 129 288 288 288h960c159 0 288-129 288-288V416c0-159-129-288-288-288H288zm449.168 236.572l263.434.565 263.431.562.584 73.412.584 73.412-42.732 1.504c-23.708.835-47.002 2.774-52.322 4.36-14.497 4.318-23.722 12.902-29.563 27.51l-5.12 12.802-1.403 291.717c-1.425 295.661-1.626 302.586-9.936 343.043-15.2 74-69.604 150.014-142.197 198.685-58.287 39.08-121.487 60.47-208.155 70.45-22.999 2.648-122.228 2.636-141.976-.024l-.002.006c-69.785-9.377-108.469-20.202-154.848-43.332-85.682-42.73-151.778-116.991-177.537-199.469-10.247-32.81-11.407-40.853-11.375-78.754.026-31.257.76-39.15 5.024-54.043 8.94-31.228 20.912-51.733 43.56-74.62 27.312-27.6 55.812-40.022 95.524-41.633 37.997-1.542 63.274 5.024 87.23 22.66 15.263 11.235 30.828 33.238 39.537 55.884 5.52 14.355 5.949 18.31 7.549 69.569 1.675 53.648 3.05 63.99 11.674 87.785 11.777 32.499 31.771 55.017 61.46 69.22 26.835 12.838 47.272 16.785 80.56 15.56 21.646-.798 30.212-2.135 43.208-6.741 38.682-13.708 70.96-44.553 86.471-82.635 16.027-39.348 15.995-38.647 15.947-361.595-.042-283.26-.09-286.272-4.568-296.153-10.958-24.171-22.488-28.492-81.074-30.377l-42.969-1.38v-147.95z'/></svg>");
-webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'><path d='M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z'/></svg>");
}
a.checkbox {
display: inline-block;
@@ -564,21 +533,6 @@ class MdToHtml {
width: auto;
max-width: 100%;
}
.inline-code {
border: 1px solid #CBCBCB;
background-color: #eff0f1;
padding-right: .2em;
padding-left: .2em;
}
/*
This is to fix https://github.com/laurent22/joplin/issues/764
Without this, the tag attached to an equation float at an absoluate position of the page,
instead of a position relative to the container.
*/
.katex-display>.katex>.katex-html {
position: relative;
}
@media print {
body {
@@ -608,10 +562,6 @@ class MdToHtml {
pre {
white-space: pre-wrap;
}
.code, .inline-code {
border: 1px solid #CBCBCB;
}
}
`;
@@ -653,4 +603,4 @@ class MdToHtml {
}
module.exports = MdToHtml;
module.exports = MdToHtml;

View File

@@ -34,7 +34,6 @@ const shared = require('lib/components/shared/note-screen-shared.js');
const ImagePicker = require('react-native-image-picker');
const AlarmService = require('lib/services/AlarmService.js');
const { SelectDateTimeDialog } = require('lib/components/select-date-time-dialog.js');
const ShareExtension = require('react-native-share-extension').default;
import FileViewer from 'react-native-file-viewer';
@@ -58,7 +57,6 @@ class NoteScreenComponent extends BaseScreenComponent {
alarmDialogShown: false,
heightBumpView:0,
noteTagDialogShown: false,
fromShare: false,
};
// iOS doesn't support multiline text fields properly so disable it
@@ -217,10 +215,6 @@ class NoteScreenComponent extends BaseScreenComponent {
componentWillUnmount() {
BackButtonService.removeHandler(this.backHandler);
NavService.removeHandler(this.navHandler);
if (this.state.fromShare) {
ShareExtension.close();
}
}
title_changeText(text) {
@@ -681,10 +675,9 @@ const NoteScreen = connect(
itemType: state.selectedItemType,
folders: state.folders,
theme: state.settings.theme,
sharedData: state.sharedData,
showAdvancedOptions: state.settings.showAdvancedOptions,
};
}
)(NoteScreenComponent)
module.exports = { NoteScreen };
module.exports = { NoteScreen };

View File

@@ -1,5 +1,5 @@
const React = require('react'); const Component = React.Component;
const { AppState, View, Button, Text } = require('react-native');
const { View, Button, Text } = require('react-native');
const { stateUtils } = require('lib/reducer.js');
const { connect } = require('react-redux');
const { reg } = require('lib/registry.js');
@@ -26,13 +26,6 @@ class NotesScreenComponent extends BaseScreenComponent {
constructor() {
super();
this.onAppStateChange_ = async () => {
// Force an update to the notes list when app state changes
let newProps = Object.assign({}, this.props);
newProps.notesSource = '';
await this.refreshNotes(newProps);
}
this.sortButton_press = async () => {
const buttons = [];
const sortNoteOptions = Setting.enumOptions('notes.sortOrder.field');
@@ -74,11 +67,6 @@ class NotesScreenComponent extends BaseScreenComponent {
async componentDidMount() {
await this.refreshNotes();
AppState.addEventListener('change', this.onAppStateChange_);
}
async componentWillUnmount() {
AppState.removeEventListener('change', this.onAppStateChange_);
}
async UNSAFE_componentWillReceiveProps(newProps) {
@@ -245,4 +233,4 @@ const NotesScreen = connect(
}
)(NotesScreenComponent)
module.exports = { NotesScreen };
module.exports = { NotesScreen };

View File

@@ -2,6 +2,7 @@ const Setting = require('lib/models/Setting.js');
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
const ObjectUtils = require('lib/ObjectUtils');
const { _ } = require('lib/locale.js');
const { shim } = require('lib/shim.js');
const shared = {}
@@ -17,7 +18,9 @@ shared.checkSyncConfig = async function(comp, settings) {
const SyncTargetClass = SyncTargetRegistry.classById(syncTargetId);
const options = Setting.subValues('sync.' + syncTargetId, settings);
comp.setState({ checkSyncConfigResult: 'checking' });
const previousTimeout = shim.setFetchTimeout(1000 * 5);
const result = await SyncTargetClass.checkConfig(ObjectUtils.convertValuesToFunctions(options));
shim.setFetchTimeout(previousTimeout);
comp.setState({ checkSyncConfigResult: result });
}

View File

@@ -174,13 +174,8 @@ shared.initState = async function(comp) {
mode: mode,
folder: folder,
isLoading: false,
fromShare: comp.props.sharedData ? true : false,
});
if (comp.props.sharedData) {
this.noteComponent_change(comp, 'body', comp.props.sharedData.value);
}
comp.lastLoadedNoteId_ = note ? note.id : null;
}
@@ -195,4 +190,4 @@ shared.toggleIsTodo_onPress = function(comp) {
comp.setState(newState);
}
module.exports = shared;
module.exports = shared;

View File

@@ -159,20 +159,12 @@ class FileApiDriverDropbox {
// See https://github.com/facebook/react-native/issues/14445#issuecomment-352965210
if (typeof content === 'string') content = shim.Buffer.from(content, 'utf8')
try {
await this.api().exec('POST', 'files/upload', content, {
'Dropbox-API-Arg': JSON.stringify({
path: this.makePath_(path),
mode: 'overwrite',
mute: true, // Don't send a notification to user since there can be many of these updates
})}, options);
} catch (error) {
if (this.hasErrorCode_(error, 'restricted_content')) {
throw new JoplinError('Cannot upload because content is restricted by Dropbox', 'rejectedByTarget');
} else {
throw error;
}
}
await this.api().exec('POST', 'files/upload', content, {
'Dropbox-API-Arg': JSON.stringify({
path: this.makePath_(path),
mode: 'overwrite',
mute: true, // Don't send a notification to user since there can be many of these updates
})}, options);
}
async delete(path) {

View File

@@ -19,7 +19,9 @@ async function tryAndRepeat(fn, count) {
while (true) {
try {
console.info('RRRRRRR');
const result = await fn();
console.info(result);
return result;
} catch (error) {
if (retryCount >= count) throw error;

View File

@@ -3,13 +3,7 @@ const Folder = require('lib/models/Folder.js');
class FoldersScreenUtils {
static async refreshFolders() {
let initialFolders = await Folder.all({
includeConflictFolder: true,
order: [{
by: "title",
dir: "asc"
}]
});
let initialFolders = await Folder.all({ includeConflictFolder: true });
this.dispatch({
type: 'FOLDER_UPDATE_ALL',

View File

@@ -220,19 +220,10 @@ class Folder extends BaseItem {
}
}
// We allow folders with duplicate titles so that folders with the same title can exist under different parent folder. For example:
//
// PHP
// Code samples
// Doc
// Java
// My project
// Doc
// if (options.duplicateCheck === true && o.title) {
// let existingFolder = await Folder.loadByTitle(o.title);
// if (existingFolder && existingFolder.id != o.id) throw new Error(_('A notebook with this title already exists: "%s"', o.title));
// }
if (options.duplicateCheck === true && o.title) {
let existingFolder = await Folder.loadByTitle(o.title);
if (existingFolder && existingFolder.id != o.id) throw new Error(_('A notebook with this title already exists: "%s"', o.title));
}
if (options.reservedTitleCheck === true && o.title) {
if (o.title == Folder.conflictFolderTitle()) throw new Error(_('Notebooks cannot be named "%s", which is a reserved title.', o.title));

View File

@@ -100,12 +100,7 @@ class Note extends BaseItem {
static geolocationUrl(note) {
if (!('latitude' in note) || !('longitude' in note)) throw new Error('Latitude or longitude is missing');
if (!Number(note.latitude) && !Number(note.longitude)) throw new Error(_('This note does not have geolocation information.'));
return this.geoLocationUrlFromLatLong(note.latitude, note.longitude);
//return sprintf('https://www.openstreetmap.org/?lat=%s&lon=%s&zoom=20', note.latitude, note.longitude);
}
static geoLocationUrlFromLatLong(lat, long) {
return sprintf('https://www.openstreetmap.org/?lat=%s&lon=%s&zoom=20', lat, long)
return sprintf('https://www.openstreetmap.org/?lat=%s&lon=%s&zoom=20', note.latitude, note.longitude)
}
static modelType() {
@@ -470,6 +465,17 @@ class Note extends BaseItem {
return note;
}
// Not used?
// static async delete(id, options = null) {
// let r = await super.delete(id, options);
// this.dispatch({
// type: 'NOTE_DELETE',
// id: id,
// });
// }
static async batchDelete(ids, options = null) {
const result = await super.batchDelete(ids, options);
for (let i = 0; i < ids.length; i++) {

View File

@@ -93,8 +93,6 @@ class Setting extends BaseModel {
return platform === 'linux' ? _('Note: Does not work in all desktop environments.') : null;
}},
'startMinimized': { value: false, type: Setting.TYPE_BOOL, public: true, appTypes: ['desktop'], label: () => _('Start application minimised in the tray icon') },
'collapsedFolderIds': { value: [], type: Setting.TYPE_ARRAY, public: false },
'encryption.enabled': { value: false, type: Setting.TYPE_BOOL, public: false },
@@ -133,11 +131,11 @@ class Setting extends BaseModel {
return value ? rtrimSlashes(value) : '';
}, public: true, label: () => _('Directory to synchronise with (absolute path)'), description: (appType) => { return appType !== 'cli' ? null : _('The path to synchronise with when file system synchronisation is enabled. See `sync.target`.'); } },
'sync.5.path': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('nextcloud') }, public: true, label: () => _('Nextcloud WebDAV URL'), description: () => _('Attention: If you change this location, make sure you copy all your content to it before syncing, otherwise all files will be removed! See the FAQ for more details: %s', 'https://joplin.cozic.net/faq/') },
'sync.5.path': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('nextcloud') }, public: true, label: () => _('Nextcloud WebDAV URL') },
'sync.5.username': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('nextcloud') }, public: true, label: () => _('Nextcloud username') },
'sync.5.password': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('nextcloud') }, public: true, label: () => _('Nextcloud password'), secure: true },
'sync.6.path': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('webdav') }, public: true, label: () => _('WebDAV URL'), description: () => _('Attention: If you change this location, make sure you copy all your content to it before syncing, otherwise all files will be removed! See the FAQ for more details: %s', 'https://joplin.cozic.net/faq/') },
'sync.6.path': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('webdav') }, public: true, label: () => _('WebDAV URL') },
'sync.6.username': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('webdav') }, public: true, label: () => _('WebDAV username') },
'sync.6.password': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return settings['sync.target'] == SyncTargetRegistry.nameToId('webdav') }, public: true, label: () => _('WebDAV password'), secure: true },
@@ -154,6 +152,7 @@ class Setting extends BaseModel {
'net.customCertificates': { value: '', type: Setting.TYPE_STRING, show: (settings) => { return [SyncTargetRegistry.nameToId('nextcloud'), SyncTargetRegistry.nameToId('webdav')].indexOf(settings['sync.target']) >= 0 }, public: true, appTypes: ['desktop', 'cli'], label: () => _('Custom TLS certificates'), description: () => _('Comma-separated list of paths to directories to load the certificates from, or path to individual cert files. For example: /my/cert_dir, /other/custom.pem. Note that if you make changes to the TLS settings, you must save your changes before clicking on "Check synchronisation configuration".') },
'net.ignoreTlsErrors': { value: false, type: Setting.TYPE_BOOL, show: (settings) => { return [SyncTargetRegistry.nameToId('nextcloud'), SyncTargetRegistry.nameToId('webdav')].indexOf(settings['sync.target']) >= 0 }, public: true, appTypes: ['desktop', 'cli'], label: () => _('Ignore TLS certificate errors') },
'net.proxy': { value: '', type: Setting.TYPE_STRING, public: true, appTypes: ['desktop', 'cli'], label: () => _('Proxy') },
};
return this.metadata_;

View File

@@ -3,7 +3,6 @@ const BaseItem = require('lib/models/BaseItem.js');
const NoteTag = require('lib/models/NoteTag.js');
const Note = require('lib/models/Note.js');
const { time } = require('lib/time-utils.js');
const { _ } = require('lib/locale');
class Tag extends BaseItem {
@@ -154,9 +153,6 @@ class Tag extends BaseItem {
if (options && options.userSideValidation) {
if ('title' in o) {
o.title = o.title.trim().toLowerCase();
const existingTag = await Tag.loadByTitle(o.title);
if (existingTag && existingTag.id !== o.id) throw new Error(_('The tag "%s" already exists. Please choose a different name.', o.title));
}
}

View File

@@ -40,11 +40,9 @@ function safeFileExtension(e) {
return e.replace(/[^a-zA-Z0-9]/g, '')
}
function safeFilename(e, maxLength = null, allowSpaces = false) {
if (maxLength === null) maxLength = 32;
function safeFilename(e, maxLength = 32) {
if (!e || !e.replace) return '';
const regex = allowSpaces ? /[^a-zA-Z0-9\-_\(\)\. ]/g : /[^a-zA-Z0-9\-_\(\)\.]/g
let output = e.replace(regex, '_')
let output = e.replace(/[^a-zA-Z0-9\-_\(\)\.]/g, '_')
return output.substr(0, maxLength);
}

View File

@@ -23,7 +23,6 @@ const defaultState = {
syncReport: {},
searchQuery: '',
settings: {},
sharedData: null,
appState: 'starting',
hasDisabledSyncItems: false,
newNote: null,
@@ -571,4 +570,4 @@ const reducer = (state = defaultState, action) => {
return newState;
}
module.exports = { reducer, defaultState, stateUtils };
module.exports = { reducer, defaultState, stateUtils };

View File

@@ -44,13 +44,7 @@ class ExternalEditWatcher {
this.logger().debug('ExternalEditWatcher: Event: ' + event + ': ' + path);
if (event === 'unlink') {
// File are unwatched in the stopWatching functions below. When we receive an unlink event
// here it might be that the file is quickly moved to a different location and replaced by
// another file with the same name, as it happens with emacs. So because of this
// we keep watching anyway.
// See: https://github.com/laurent22/joplin/issues/710#issuecomment-420997167
// this.watcher_.unwatch(path);
this.watcher_.unwatch(path);
} else if (event === 'change') {
const id = Note.pathToId(path);

View File

@@ -58,10 +58,6 @@ class InteropService {
format: 'raw',
target: 'directory',
description: _('Joplin Export Directory'),
}, {
format: 'md',
target: 'directory',
description: _('Markdown'),
},
];

View File

@@ -1,58 +0,0 @@
const InteropService_Exporter_Base = require('lib/services/InteropService_Exporter_Base');
const { basename, filename, safeFilename } = require('lib/path-utils.js');
const BaseModel = require('lib/BaseModel');
const Folder = require('lib/models/Folder');
const Note = require('lib/models/Note');
const { shim } = require('lib/shim');
class InteropService_Exporter_Md extends InteropService_Exporter_Base {
async init(destDir) {
this.destDir_ = destDir;
this.resourceDir_ = destDir ? destDir + '/_resources' : null;
this.createdDirs_ = [];
await shim.fsDriver().mkdir(this.destDir_);
await shim.fsDriver().mkdir(this.resourceDir_);
}
async makeDirPath_(item) {
let output = '';
while (true) {
if (item.type_ === BaseModel.TYPE_FOLDER) {
output = safeFilename(item.title, null, true) + '/' + output;
}
if (!item.parent_id) return output;
item = await Folder.load(item.parent_id);
}
return output;
}
async processItem(ItemClass, item) {
if ([BaseModel.TYPE_NOTE, BaseModel.TYPE_FOLDER].indexOf(item.type_) < 0) return;
const filename = safeFilename(item.title, null, true);
const dirPath = this.destDir_ + '/' + (await this.makeDirPath_(item));
if (this.createdDirs_.indexOf(dirPath) < 0) {
await shim.fsDriver().mkdir(dirPath);
this.createdDirs_.push(dirPath);
}
if (item.type_ === BaseModel.TYPE_NOTE) {
const noteFilePath = dirPath + '/' + safeFilename(item.title, null, true) + '.md';
const noteContent = await Note.serializeForEdit(item);
await shim.fsDriver().writeFile(noteFilePath, noteContent, 'utf-8');
}
}
async processResource(resource, filePath) {
const destResourcePath = this.resourceDir_ + '/' + basename(filePath);
await shim.fsDriver().copy(filePath, destResourcePath);
}
async close() {}
}
module.exports = InteropService_Exporter_Md;

View File

@@ -21,67 +21,52 @@ class InteropService_Importer_Md extends InteropService_Importer_Base {
async exec(result) {
let parentFolderId = null;
const sourcePath = rtrimSlashes(this.sourcePath_);
const supportedFileExtension = this.metadata().fileExtensions;
const filePaths = [];
if (await shim.fsDriver().isDirectory(sourcePath)) {
if (await shim.fsDriver().isDirectory(this.sourcePath_)) {
const stats = await shim.fsDriver().readDirStats(this.sourcePath_);
for (let i = 0; i < stats.length; i++) {
const stat = stats[i];
if (supportedFileExtension.indexOf(fileExtension(stat.path).toLowerCase()) >= 0) {
filePaths.push(this.sourcePath_ + '/' + stat.path);
}
}
if (!this.options_.destinationFolder) {
const folderTitle = await Folder.findUniqueItemTitle(basename(sourcePath));
const folderTitle = await Folder.findUniqueItemTitle(basename(rtrimSlashes(this.sourcePath_)));
const folder = await Folder.save({ title: folderTitle });
parentFolderId = folder.id;
} else {
parentFolderId = this.options_.destinationFolder.id;
}
this.importDirectory(sourcePath, parentFolderId);
} else {
if (!this.options_.destinationFolder) throw new Error(_('Please specify the notebook where the notes should be imported to.'));
parentFolderId = this.options_.destinationFolder.id
filePaths.push(sourcePath);
filePaths.push(this.sourcePath_);
}
for (let i = 0; i < filePaths.length; i++) {
await this.importFile(filePaths[i], parentFolderId);
const path = filePaths[i];
const stat = await shim.fsDriver().stat(path);
if (!stat) throw new Error('Cannot read ' + path);
const title = filename(path);
const body = await shim.fsDriver().readFile(path);
const note = {
parent_id: parentFolderId,
title: title,
body: body,
updated_time: stat.mtime.getTime(),
created_time: stat.birthtime.getTime(),
user_updated_time: stat.mtime.getTime(),
user_created_time: stat.birthtime.getTime(),
};
await Note.save(note, { autoTimestamp: false });
}
return result;
}
async importDirectory(dirPath, parentFolderId) {
console.info('Import: ' + dirPath);
const supportedFileExtension = this.metadata().fileExtensions;
const stats = await shim.fsDriver().readDirStats(dirPath);
for (let i = 0; i < stats.length; i++) {
const stat = stats[i];
if (stat.isDirectory()) {
const folderTitle = await Folder.findUniqueItemTitle(basename(stat.path));
const folder = await Folder.save({ title: folderTitle, parent_id: parentFolderId });
this.importDirectory(dirPath + '/' + basename(stat.path), folder.id);
} else if (supportedFileExtension.indexOf(fileExtension(stat.path).toLowerCase()) >= 0) {
this.importFile(dirPath + '/' + stat.path, parentFolderId);
}
}
}
async importFile(filePath, parentFolderId) {
const stat = await shim.fsDriver().stat(filePath);
if (!stat) throw new Error('Cannot read ' + filePath);
const title = filename(filePath);
const body = await shim.fsDriver().readFile(filePath);
const note = {
parent_id: parentFolderId,
title: title,
body: body,
updated_time: stat.mtime.getTime(),
created_time: stat.birthtime.getTime(),
user_updated_time: stat.mtime.getTime(),
user_created_time: stat.birthtime.getTime(),
};
await Note.save(note, { autoTimestamp: false });
}
}
module.exports = InteropService_Importer_Md;

View File

@@ -7,8 +7,10 @@ const { setLocale, defaultLocale, closestSupportedLocale } = require('lib/locale
const { FsDriverNode } = require('lib/fs-driver-node.js');
const mimeUtils = require('lib/mime-utils.js').mime;
const Note = require('lib/models/Note.js');
const Setting = require('lib/models/Setting.js');
const Resource = require('lib/models/Resource.js');
const urlValidator = require('valid-url');
const HttpsProxyAgent = require('https-proxy-agent');
function shimInit() {
shim.fsDriver = () => { throw new Error('Not implemented') }
@@ -188,10 +190,27 @@ function shimInit() {
return new Buffer(data).toString('base64');
}
shim.addProxyAgent_ = (requestOptions) => {
if (requestOptions.agent) return requestOptions;
const proxy = Setting.value('net.proxy');
if (!proxy) return requestOptions;
requestOptions = Object.assign({}, requestOptions);
requestOptions.agent = new HttpsProxyAgent(proxy); // http://127.0.0.1:3128
return requestOptions;
}
shim.fetch = async function(url, options = null) {
const validatedUrl = urlValidator.isUri(url);
if (!validatedUrl) throw new Error('Not a valid URL: ' + url);
options = shim.addProxyAgent_(options);
if (shim.fetchTimeout()) options.timeout = shim.fetchTimeout();
console.info(options);
return shim.fetchWithRetry(() => {
return nodeFetch(url, options)
}, options);
@@ -221,7 +240,7 @@ function shimInit() {
};
}
const requestOptions = {
let requestOptions = {
protocol: url.protocol,
host: url.hostname,
port: url.port,
@@ -230,6 +249,8 @@ function shimInit() {
headers: headers,
};
requestOptions = shim.addProxyAgent_(requestOptions);
const doFetchOperation = async () => {
return new Promise((resolve, reject) => {
let file = null;

View File

@@ -120,6 +120,12 @@ shim.fetchWithRetry = async function(fetchFn, options = null) {
}
shim.fetch = () => { throw new Error('Not implemented'); }
shim.setFetchTimeout = (v) => {
const previousTimeout = shim.fetchTimeout_ ? shim.fetchTimeout_ : null;
shim.fetchTimeout_ = v;
return previousTimeout;
}
shim.fetchTimeout = () => { return shim.fetchTimeout_; }
shim.FormData = typeof FormData !== 'undefined' ? FormData : null;
shim.fsDriver = () => { throw new Error('Not implemented') }
shim.FileApiDriverLocal = null;

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