You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-30 20:39:46 +02:00
Compare commits
124 Commits
android-v1
...
v1.0.140
Author | SHA1 | Date | |
---|---|---|---|
|
ade5af2559 | ||
|
0a993dc012 | ||
|
4baa46507f | ||
|
0d8878abd3 | ||
|
f962084591 | ||
|
921b45286b | ||
|
301bfed05e | ||
|
62e7d6fa86 | ||
|
7e34cd4452 | ||
|
b35cb9a7ab | ||
|
18b836525c | ||
|
e34e49b88d | ||
|
5bf879c2d9 | ||
|
61d6309c0e | ||
|
17c9c0f9ef | ||
|
9bd62fd3d4 | ||
|
de73d4baa7 | ||
|
379ff5163b | ||
|
d9538ccb08 | ||
|
9289dbdf77 | ||
|
5719ae495a | ||
|
a89e3b7924 | ||
|
e576d09712 | ||
|
43600a7824 | ||
|
921f01d9dc | ||
|
dec5668582 | ||
|
e30bc12354 | ||
|
fca4fa666d | ||
|
59478160c8 | ||
|
8110fe89ef | ||
|
c7ed1b5eae | ||
|
25951e7097 | ||
|
687b9d1bef | ||
|
630e77b9eb | ||
|
68ff2e17b3 | ||
|
945d83608a | ||
|
833d473268 | ||
|
2256b0c5ec | ||
|
677aa7d59b | ||
|
4363005e92 | ||
|
2e3ef618db | ||
|
1adbbd14c6 | ||
|
4dfd7db729 | ||
|
e70562a102 | ||
|
a0e5947ba4 | ||
|
e841ea8a91 | ||
|
770a435029 | ||
|
49b56e84a7 | ||
|
ff1a6fdbbd | ||
|
2168090b96 | ||
|
33f7b680bc | ||
|
0957298cb8 | ||
|
08f2f982cf | ||
|
3376fbfa55 | ||
|
4a31e5fe73 | ||
|
baacec5ba6 | ||
|
95188b71b8 | ||
|
cf57be6e98 | ||
|
b691092d7a | ||
|
03e60fc028 | ||
|
2e25ec318f | ||
|
7236e5e9ae | ||
|
6f7dd51a98 | ||
|
db1dab9293 | ||
|
06f1b9e4d7 | ||
|
8f958ac931 | ||
|
eae63bfb79 | ||
|
8adfc81c30 | ||
|
0c516443e3 | ||
|
ad9bc0bf63 | ||
|
b0596670a6 | ||
|
998011ff43 | ||
|
081e1c5b62 | ||
|
edfd2c4d54 | ||
|
9d65a3a34c | ||
|
1a86cbdb9d | ||
|
849cb4456c | ||
|
1736717f2e | ||
|
50b75e1e63 | ||
|
179005dd6c | ||
|
6b3fe6b2cb | ||
|
c34872bb26 | ||
|
4845a21287 | ||
|
ddd513fe09 | ||
|
4ce118d459 | ||
|
99da184ba5 | ||
|
e2e4e62c4f | ||
|
229dd7a6dd | ||
|
1e0c4cc5cd | ||
|
b40ccc7a15 | ||
|
7d6b7e588c | ||
|
22cacd2c5b | ||
|
6a22e7836a | ||
|
32a67b9b33 | ||
|
b5dff09c28 | ||
|
c56d8153e8 | ||
|
eb5950d126 | ||
|
4241436e40 | ||
|
e93af7aed5 | ||
|
d2416f850e | ||
|
7af22eb006 | ||
|
3f1be5e7e7 | ||
|
a4e649c82d | ||
|
cde1a8f0a8 | ||
|
cda6eb7c2f | ||
|
3c3e6aeca0 | ||
|
99156311db | ||
|
91b2e5e703 | ||
|
573fd816d0 | ||
|
e6aa002758 | ||
|
361d46ac5d | ||
|
9bc7c2fd65 | ||
|
ce49f5f8b7 | ||
|
81e4cd319d | ||
|
71f905535f | ||
|
d3bff0a9e3 | ||
|
88e6315d09 | ||
|
3d933c5244 | ||
|
73af19314d | ||
|
1d71712c8a | ||
|
1333c35389 | ||
|
e0f5f47a15 | ||
|
34323042d5 | ||
|
aa86fa9986 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -39,6 +39,7 @@ node_modules
|
||||
Tools/github_oauth_token.txt
|
||||
_releases
|
||||
ReactNativeClient/lib/csstojs/
|
||||
ReactNativeClient/lib/rnInjectedJs/
|
||||
ElectronClient/app/gui/note-viewer/fonts/
|
||||
ElectronClient/app/gui/note-viewer/lib.js
|
||||
Tools/commit_hook.txt
|
@@ -20,9 +20,9 @@ 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. That scope, due to limited resources, might be narrower than you think. As a rule of thumb **if your change is likely to involve more than 50 lines of code, you should discuss it in the forum**, just so that you don't waste your time implementing something that might not be accepted.
|
||||
|
||||
- Bug fixes have a very high change of being accepted.
|
||||
- Bug fixes have a very high chance of being accepted.
|
||||
|
||||
- A pull request that is relevant to the current roadmap has a very high change of being accepted.
|
||||
- A pull request that is relevant to the current roadmap has a very high chance of being accepted.
|
||||
|
||||
Building the apps is relatively easy - please [see the build instructions](https://github.com/laurent22/joplin/blob/master/BUILD.md) for more details.
|
||||
|
||||
|
@@ -113,6 +113,11 @@ class Command extends BaseCommand {
|
||||
lines.push('\tcurl http://localhost:41184/tags?fields=id');
|
||||
lines.push('');
|
||||
|
||||
lines.push('# Error handling');
|
||||
lines.push('');
|
||||
lines.push('In case of an error, an HTTP status code >= 400 will be returned along with a JSON object that provides more info about the error. The JSON object is in the format `{ "error": "description of error" }`.');
|
||||
lines.push('');
|
||||
|
||||
lines.push('# About the property types');
|
||||
lines.push('');
|
||||
lines.push('* Text is UTF-8.');
|
||||
@@ -125,6 +130,11 @@ class Command extends BaseCommand {
|
||||
lines.push('Call **GET /ping** to check if the service is available. It should return "JoplinClipperServer" if it works.');
|
||||
lines.push('');
|
||||
|
||||
lines.push('# Searching');
|
||||
lines.push('');
|
||||
lines.push('Call **GET /search?query=YOUR_QUERY** to search for notes. This end-point supports the `field` parameter which is recommended to use so that you only get the data that you need. The query syntax is as described in the main documentation: https://joplin.cozic.net/#searching');
|
||||
lines.push('');
|
||||
|
||||
for (let i = 0; i < models.length; i++) {
|
||||
const model = models[i];
|
||||
const ModelClass = BaseItem.getClassByItemType(model.type);
|
||||
|
@@ -6,6 +6,10 @@ const DecryptionWorker = require('lib/services/DecryptionWorker');
|
||||
const MasterKey = require('lib/models/MasterKey');
|
||||
const BaseItem = require('lib/models/BaseItem');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { shim } = require('lib/shim');
|
||||
const pathUtils = require('lib/path-utils.js');
|
||||
const imageType = require('image-type');
|
||||
const readChunk = require('read-chunk');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
|
||||
@@ -14,7 +18,7 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
description() {
|
||||
return _('Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status` and `target-status`.');
|
||||
return _('Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.');
|
||||
}
|
||||
|
||||
options() {
|
||||
@@ -22,6 +26,7 @@ class Command extends BaseCommand {
|
||||
// This is here mostly for testing - shouldn't be used
|
||||
['-p, --password <password>', 'Use this password as master password (For security reasons, it is not recommended to use this option).'],
|
||||
['-v, --verbose', 'More verbose output for the `target-status` command'],
|
||||
['-o, --output <directory>', 'Output directory'],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -30,6 +35,18 @@ class Command extends BaseCommand {
|
||||
|
||||
const options = args.options;
|
||||
|
||||
const askForMasterKey = async (error) => {
|
||||
const masterKeyId = error.masterKeyId;
|
||||
const password = await this.prompt(_('Enter master password:'), { type: 'string', secure: true });
|
||||
if (!password) {
|
||||
this.stdout(_('Operation cancelled'));
|
||||
return false;
|
||||
}
|
||||
Setting.setObjectKey('encryption.passwordCache', masterKeyId, password);
|
||||
await EncryptionService.instance().loadMasterKeysFromSettings();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.command === 'enable') {
|
||||
const password = options.password ? options.password.toString() : await this.prompt(_('Enter master password:'), { type: 'string', secure: true });
|
||||
if (!password) {
|
||||
@@ -59,14 +76,8 @@ class Command extends BaseCommand {
|
||||
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;
|
||||
}
|
||||
Setting.setObjectKey('encryption.passwordCache', masterKeyId, password);
|
||||
await EncryptionService.instance().loadMasterKeysFromSettings();
|
||||
const ok = await askForMasterKey(error);
|
||||
if (!ok) return;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -85,6 +96,36 @@ class Command extends BaseCommand {
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.command === 'decrypt-file') {
|
||||
while (true) {
|
||||
try {
|
||||
const outputDir = options.output ? options.output : require('os').tmpdir();
|
||||
let outFile = outputDir + '/' + pathUtils.filename(args.path) + '.' + Date.now() + '.bin';
|
||||
await EncryptionService.instance().decryptFile(args.path, outFile);
|
||||
const buffer = await readChunk(outFile, 0, 64);
|
||||
const detectedType = imageType(buffer);
|
||||
|
||||
if (detectedType) {
|
||||
const newOutFile = outFile + '.' + detectedType.ext;
|
||||
await shim.fsDriver().move(outFile, newOutFile);
|
||||
outFile = newOutFile;
|
||||
}
|
||||
|
||||
this.stdout(outFile);
|
||||
break;
|
||||
} catch (error) {
|
||||
if (error.code === 'masterKeyNotLoaded') {
|
||||
const ok = await askForMasterKey(error);
|
||||
if (!ok) return;
|
||||
continue;
|
||||
}
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.command === 'target-status') {
|
||||
const fs = require('fs-extra');
|
||||
const pathUtils = require('lib/path-utils.js');
|
||||
|
1793
CliClient/locales/ar.po
Normal file
1793
CliClient/locales/ar.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -125,9 +125,10 @@ msgstr "Marca un llistat de tasques pendents com a fet."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "La nota no és un llistat de tasques pendents: «%s»"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Gestiona la configuració E2EE. Les ordres són «enable», «disable», "
|
||||
"«decrypt», «status» i «target-status»"
|
||||
@@ -610,7 +611,8 @@ msgstr "S'està important des de «%s» com a format «%s». Espereu..."
|
||||
msgid "PDF File"
|
||||
msgstr "Fitxer PDF"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Fitxer"
|
||||
|
||||
msgid "New note"
|
||||
@@ -628,6 +630,9 @@ msgstr "Importació"
|
||||
msgid "Export"
|
||||
msgstr "Exportació"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronitza"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Imprimeix"
|
||||
|
||||
@@ -638,7 +643,8 @@ msgstr "Amaga %s"
|
||||
msgid "Quit"
|
||||
msgstr "Surt"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Edita"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -676,7 +682,8 @@ msgstr "Cerca a totes les notes"
|
||||
msgid "Search in current note"
|
||||
msgstr "Cerca a totes les notes"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Visualització"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -689,7 +696,8 @@ msgstr "Canvia el disseny de l'editor"
|
||||
msgid "Focus"
|
||||
msgstr "Vés al cos"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Eines"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -704,7 +712,8 @@ msgstr "Opcions del xifratge"
|
||||
msgid "General Options"
|
||||
msgstr "Opcions generals"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Ajuda"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -747,11 +756,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hi ha disponible una actualització. Voleu baixar-la ara?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1125,7 +1134,17 @@ msgstr "Opcions de xifratge"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Opcions del desa-retalls"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Voleu suprimir el bloc de notes? També se suprimiran tots els sub-blocs "
|
||||
"d'aquest bloc de notes."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Voleu suprimir aquesta etiqueta de totes les notes?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1137,9 +1156,6 @@ msgstr "Suprimeix"
|
||||
msgid "Rename"
|
||||
msgstr "Canvia el nom"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronitza"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Blocs de notes"
|
||||
|
||||
@@ -1154,6 +1170,9 @@ msgstr "Recursos: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Seleccioneu on s'hauria d'exportar l'estat de la sincronització"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Afegeix o suprimeix etiquetes"
|
||||
|
||||
@@ -1305,6 +1324,12 @@ msgstr "Xifrat"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Els elements xifrats no es poden modificar"
|
||||
|
||||
msgid "title"
|
||||
msgstr "títol"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data d'actualització"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflictes"
|
||||
|
||||
@@ -1315,12 +1340,6 @@ msgstr "No es pot moure el bloc de notes a aquesta ubicació"
|
||||
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."
|
||||
|
||||
msgid "title"
|
||||
msgstr "títol"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data d'actualització"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "data de creació"
|
||||
|
||||
@@ -1365,6 +1384,10 @@ msgstr "Ordena les notes per"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Ordre invers"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Ordena les notes per"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Desa la geolocalització a les notes"
|
||||
|
||||
@@ -1554,6 +1577,9 @@ msgstr "Fitxer d'exportació de l'Evernote"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Directori d'exportació del Joplin"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fitxer"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Directori"
|
||||
|
||||
@@ -1740,10 +1766,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Lloc web del Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Lloc web del Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1841,6 +1863,9 @@ msgstr "Mostra-ho al mapa"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Edita"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Suprimeix el bloc de notes"
|
||||
|
||||
@@ -1864,6 +1889,10 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Benvingut"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Lloc web del Joplin"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Estat: %s"
|
||||
|
||||
|
@@ -124,9 +124,10 @@ msgstr "Označí to-do jako hotové."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Poznámka není to-do: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Nastavuje šifrování. Příkazy jsou `enable` (zapnout), `disable` (vypnout), "
|
||||
"`decrypt` (dešifrovat), `status` (stav) a `target-status` (stav v cíli "
|
||||
@@ -592,7 +593,8 @@ msgstr "Importuji z \"%s\" jako formát \"%s\". Chvíli strpení..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF soubor"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Soubor"
|
||||
|
||||
msgid "New note"
|
||||
@@ -610,6 +612,9 @@ msgstr "Import"
|
||||
msgid "Export"
|
||||
msgstr "Export"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchronizovat"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Tisk"
|
||||
|
||||
@@ -620,7 +625,8 @@ msgstr "Schovat %s"
|
||||
msgid "Quit"
|
||||
msgstr "Ukončit"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Upravit"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -658,7 +664,8 @@ msgstr "Hledat ve všech poznámkách"
|
||||
msgid "Search in current note"
|
||||
msgstr "Hledat ve všech poznámkách"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Zobrazit"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -671,7 +678,8 @@ msgstr "Změňit layout editoru"
|
||||
msgid "Focus"
|
||||
msgstr "Vybrat text poznámky"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Nástroje"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -686,7 +694,8 @@ msgstr "Nastavení šifrování"
|
||||
msgid "General Options"
|
||||
msgstr "Obecná nastavení"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Nápověda"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -729,11 +738,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Je k dispozici update, chcete jej stáhnout?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1094,7 +1103,15 @@ msgstr "Nastavení šifrování"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Obecná nastavení"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr "Smazat zápisník? Budou smazány i všechny poznámky v něm obsažené."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Odebrat tento tag ze všech poznámek?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1106,9 +1123,6 @@ msgstr "Smazat"
|
||||
msgid "Rename"
|
||||
msgstr "Přejmenovat"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchronizovat"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Zápisníky"
|
||||
|
||||
@@ -1123,6 +1137,9 @@ msgstr "Zdroje: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Prosím vyberte, kam má být stav synchronizace exportován"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Přidat či odebrat tagy"
|
||||
|
||||
@@ -1275,6 +1292,14 @@ msgstr "Zašifrováno"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Nelze editovat zašifrovanou položku"
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Bez názvu"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Upraveno: %d."
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Konflikty"
|
||||
|
||||
@@ -1286,14 +1311,6 @@ msgstr "Poznámku nelze přesunout do zápisníku \"%s\""
|
||||
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."
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Bez názvu"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Upraveno: %d."
|
||||
|
||||
#, fuzzy
|
||||
msgid "created date"
|
||||
msgstr "Vytvořeno: %d."
|
||||
@@ -1340,6 +1357,10 @@ msgstr "Řadit poznámky podle"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Řadit od konce"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Řadit poznámky podle"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Ukládat k poznámkám informace o poloze (geolokaci)"
|
||||
|
||||
@@ -1529,6 +1550,9 @@ msgstr "Soubor Evernote Exportu"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Složka pro export"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Soubor"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Adresář"
|
||||
|
||||
@@ -1709,10 +1733,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Web Joplinu"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Web Joplinu"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1810,6 +1830,9 @@ msgstr "Zobrazit na map+"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Upravit"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Smazat zápisník"
|
||||
|
||||
@@ -1832,6 +1855,10 @@ msgstr "Nemáte žádný zápisník. Vytvořte jeden kliknutím na tlačítko (+
|
||||
msgid "Welcome"
|
||||
msgstr "Vítejte"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Web Joplinu"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Stav: %s."
|
||||
|
||||
|
@@ -123,9 +123,10 @@ msgstr "Markerer en opgave som udført."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Noten er ikke en opgave: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Udfører E2EE konfiguration. Kommandoer er `enable`(aktiver), "
|
||||
"`disable`(sluk), `decrypt`(dekrypter), `status` og `target-status` (modtager-"
|
||||
@@ -597,7 +598,8 @@ msgstr "Importerer fra \"%s\" som \"%s\"-format. Vent venligst..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF fil"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Fil"
|
||||
|
||||
msgid "New note"
|
||||
@@ -615,6 +617,9 @@ msgstr "Importer"
|
||||
msgid "Export"
|
||||
msgstr "Eksporter"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synkroniser"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Udskriv"
|
||||
|
||||
@@ -625,7 +630,8 @@ msgstr "Skjul %s"
|
||||
msgid "Quit"
|
||||
msgstr "Afslut"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Ret"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -663,7 +669,8 @@ msgstr "Søg i alle noter"
|
||||
msgid "Search in current note"
|
||||
msgstr "Søg i alle noter"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Vis"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -676,7 +683,8 @@ msgstr "Skift editor layout"
|
||||
msgid "Focus"
|
||||
msgstr "Fokuser på brødtekst"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Værktøjer"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -691,7 +699,8 @@ msgstr "Krypterings muligheder"
|
||||
msgid "General Options"
|
||||
msgstr "Generelle indstillinger"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Hjælp"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -734,11 +743,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Opdatering er til rådighed, vil du hente den nu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1103,7 +1112,15 @@ msgstr "Krypterings indstillinger"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Generelle indstillinger"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr "Slet notesbog? Alle noter i notesbogen bliver også slettet."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Slet denne markering fra alle noter?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1115,9 +1132,6 @@ msgstr "Slet"
|
||||
msgid "Rename"
|
||||
msgstr "Omdøb"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synkroniser"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Notesbøger"
|
||||
|
||||
@@ -1132,6 +1146,9 @@ msgstr "Ressourcer: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Vælg hvor sync status skal eksporteres til"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Tilføj eller slet mærker"
|
||||
|
||||
@@ -1284,6 +1301,14 @@ msgstr "Krypteret"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Krypteret emner kan ikke rettes"
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Samlet"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Opdateret %d."
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Konflikter"
|
||||
|
||||
@@ -1295,14 +1320,6 @@ msgstr "Kan ikke flytte note til \"%s\" notesbog"
|
||||
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."
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Samlet"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Opdateret %d."
|
||||
|
||||
#, fuzzy
|
||||
msgid "created date"
|
||||
msgstr "Oprettet: %d."
|
||||
@@ -1349,6 +1366,10 @@ msgstr "Sorter noter efter"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Modsat sorterings orden"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Sorter noter efter"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Gem geo-lokation i noter"
|
||||
|
||||
@@ -1538,6 +1559,9 @@ msgstr "Evernote eksport fil"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin eksport mappe"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fil"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Indeks"
|
||||
|
||||
@@ -1718,10 +1742,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin hjemmeside"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin hjemmeside"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1819,6 +1839,9 @@ msgstr "Vis på kort"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Ret"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Slet notesbog"
|
||||
|
||||
@@ -1841,6 +1864,10 @@ msgstr "Du har ingen notesbøger. Opret en ved at klikke på (+) knappen."
|
||||
msgid "Welcome"
|
||||
msgstr "Velkommen"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin hjemmeside"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Tilstand: %s."
|
||||
|
||||
|
@@ -13,12 +13,13 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.1.1\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
msgstr ""
|
||||
"Um ein Tag zu löschen, entferne es bei allen damit verbundenen Notizen."
|
||||
"Um ein Schlagwort zu löschen, entferne es bei allen damit verbundenen "
|
||||
"Notizen."
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr ""
|
||||
@@ -130,7 +131,7 @@ msgstr "Notiz ist kein To-Do: \"%s\""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Verwaltet die E2EE-Konfiguration. Die Befehle lauten `enable`, `disable`, "
|
||||
"`decrypt`, `status` und `target-status`."
|
||||
@@ -599,18 +600,16 @@ msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportiere „%s“ ins „%s“ Format. Bitte warten..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
msgstr "Seitenleiste"
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
msgstr "Notizen-Liste"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Notizbuch-Titel:"
|
||||
msgstr "Notiz Titel"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Notizbücher"
|
||||
msgstr "Notiz Text"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
@@ -619,8 +618,8 @@ msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-Datei"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Datei"
|
||||
msgid "&File"
|
||||
msgstr "&Datei"
|
||||
|
||||
msgid "New note"
|
||||
msgstr "Neue Notiz"
|
||||
@@ -637,6 +636,9 @@ msgstr "Importieren"
|
||||
msgid "Export"
|
||||
msgstr "Exportieren"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchronisieren"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Drucken"
|
||||
|
||||
@@ -647,8 +649,8 @@ msgstr "%s ausblenden"
|
||||
msgid "Quit"
|
||||
msgstr "Verlassen"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
msgid "&Edit"
|
||||
msgstr "&Bearbeiten"
|
||||
|
||||
msgid "Copy"
|
||||
msgstr "Kopieren"
|
||||
@@ -669,7 +671,7 @@ msgid "Italic"
|
||||
msgstr "Kursiv"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
msgstr "Link"
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Datum / Uhrzeit einfügen"
|
||||
@@ -683,8 +685,8 @@ msgstr "Alle Notizen durchsuchen"
|
||||
msgid "Search in current note"
|
||||
msgstr "Aktuelle Notiz durchsuchen"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Ansicht"
|
||||
msgid "&View"
|
||||
msgstr "&Ansicht"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr "Seitenleiste umschalten"
|
||||
@@ -692,12 +694,11 @@ msgstr "Seitenleiste umschalten"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Editor-Layout umschalten"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Fokussiere Inhalt"
|
||||
msgstr "Fokus"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Werkzeuge"
|
||||
msgid "&Tools"
|
||||
msgstr "&Werkzeuge"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
msgstr "Status der Synchronisation"
|
||||
@@ -711,8 +712,8 @@ msgstr "Verschlüsselungsoptionen"
|
||||
msgid "General Options"
|
||||
msgstr "Allgemeine Einstellungen"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Hilfe"
|
||||
msgid "&Help"
|
||||
msgstr "&Hilfe"
|
||||
|
||||
msgid "Website and documentation"
|
||||
msgstr "Webseite und Dokumentation"
|
||||
@@ -748,19 +749,19 @@ msgstr "Die aktuelle Version ist auf dem neuesten Stand."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
msgstr "%s (Vorabversion)"
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
"Es ist eine Aktualisierung verfügbar. Soll sie jetzt heruntergeladen werden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
msgid "Your version: %s"
|
||||
msgstr "Deine Version: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
msgid "New version: %s"
|
||||
msgstr "Neue Version: %s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
@@ -769,7 +770,7 @@ msgid "No"
|
||||
msgstr "Nein"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr "Token wurde in die Zwischenablage kopiert."
|
||||
msgstr "Token wurde in die Zwischenablage kopiert!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr ""
|
||||
@@ -843,7 +844,7 @@ msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Notizen und Einstellungen werden gespeichert in: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
msgstr "Durchsuche..."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Überprüfen der Synchronisationseinstellungen"
|
||||
@@ -941,9 +942,9 @@ msgstr "Status"
|
||||
msgid "Encryption is:"
|
||||
msgstr "Die Verschlüsselung ist:"
|
||||
|
||||
#, fuzzy
|
||||
# 'Nutzung', 'Gebrauch', or 'Verwendung' - depends on the context
|
||||
msgid "Usage"
|
||||
msgstr "Nutzung: %s"
|
||||
msgstr "Nutzung"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Zurück"
|
||||
@@ -1050,7 +1051,7 @@ msgstr ""
|
||||
"und die Notiz zu bearbeiten."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
msgstr "Nur eine Notiz kann gedruckt oder als PDF exportiert werden."
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "Fetter Text"
|
||||
@@ -1138,8 +1139,19 @@ msgstr "Verschlüsselungsoptionen"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Clipper-Einstellungen"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
msgstr "Dieses Schlagwort von allen Notizen entfernen?"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Notizbuch \"%s\" wirklich löschen?\n"
|
||||
"\n"
|
||||
"Alle Notizen und Unternotizen darin werden ebenfalls gelöscht."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Schlagwort \"%s\" von allen Notizen entfernen?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Diese Suche von der Seitenleiste entfernen?"
|
||||
@@ -1150,9 +1162,6 @@ msgstr "Löschen"
|
||||
msgid "Rename"
|
||||
msgstr "Umbenennen"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchronisieren"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Notizbücher"
|
||||
|
||||
@@ -1168,6 +1177,9 @@ msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
"Bitte wähle aus, wohin der Synchronisations-Status exportiert werden soll"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr "Inhaltsverzeichnis"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Schlagwörter hinzufügen oder entfernen"
|
||||
|
||||
@@ -1190,13 +1202,13 @@ msgstr "Zu To-Do-Typ wechseln"
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdown-Link kopieren"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Notizbuch \"%s\" löschen?"
|
||||
msgstr "Notiz \"%s\" löschen?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Sollen diese Notizen gelöscht werden?"
|
||||
msgstr "Sollen diese %d Notizen gelöscht werden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
@@ -1316,6 +1328,12 @@ msgstr "Verschlüsselt"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Verschlüsselte Objekte können nicht verändert werden"
|
||||
|
||||
msgid "title"
|
||||
msgstr "Titel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "Aktualisierungsdatum"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Konflikte"
|
||||
|
||||
@@ -1327,12 +1345,6 @@ msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr ""
|
||||
"Notizbuch kann nicht \"%s\" genannt werden. Dieser Name ist reserviert.."
|
||||
|
||||
msgid "title"
|
||||
msgstr "Titel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "Aktualisierungsdatum"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "Erstelldatum"
|
||||
|
||||
@@ -1377,6 +1389,9 @@ msgstr "Sortiere Notizen nach"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Sortierreihenfolge umdrehen"
|
||||
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Sortiere Notizbücher nach"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Momentanen Standort zusammen mit Notizen speichern"
|
||||
|
||||
@@ -1431,11 +1446,11 @@ msgid "Automatically update the application"
|
||||
msgstr "Die Applikation automatisch aktualisieren"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
msgstr "Lade auch Vorabversionen herunter"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
msgstr "Weitere Informationen findest Du auf der Vorabversionsseite: %s"
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synchronisationsinterval"
|
||||
@@ -1536,25 +1551,21 @@ msgstr "Ignoriere TLS-Zertifikatfehler"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Ungültiger Optionswert: \"%s\". Mögliche Werte sind: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Allgemeine Einstellungen"
|
||||
msgstr "Allgemeines"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Status der Synchronisation"
|
||||
msgstr "Synchronisation"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
msgstr "Erscheinungsbild"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Notizbücher"
|
||||
msgstr "Notiz"
|
||||
|
||||
# Please note: The term 'Location' is assumed to be the geographical location where the note has been created. For this the german word 'Standort' fits better than the previously used 'Ablageort'. The latter one is used for the folder where files are stored.
|
||||
#, fuzzy
|
||||
# 'Applikation' or 'Anwendung' - both translations are correct.
|
||||
msgid "Application"
|
||||
msgstr "Standort"
|
||||
msgstr "Applikation"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
@@ -1576,6 +1587,9 @@ msgstr "Evernote Export Datei"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Json Export Verzeichnis"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Datei"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Verzeichnis"
|
||||
|
||||
@@ -1717,7 +1731,7 @@ msgstr ""
|
||||
"korrekt sind und das das Synchronisierungsziel erreichbar ist. Fehlermeldung:"
|
||||
|
||||
msgid "The application has been authorised!"
|
||||
msgstr "Das Programm wurde erfolgreich autorisiert."
|
||||
msgstr "Das Programm wurde erfolgreich autorisiert!"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -1768,10 +1782,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Website von Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Datenbank v%s"
|
||||
@@ -1868,6 +1878,9 @@ msgstr "Auf der Karte anzeigen"
|
||||
msgid "Go to source URL"
|
||||
msgstr "Zur Quell-URL gehen"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Notizbuch löschen"
|
||||
|
||||
@@ -1893,6 +1906,12 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Willkommen"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
||||
#~ msgid "Remove?"
|
||||
#~ msgstr "Löschen?"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Notizen löschen?"
|
||||
|
||||
|
@@ -119,7 +119,7 @@ msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter master password:"
|
||||
@@ -527,7 +527,7 @@ msgstr ""
|
||||
msgid "PDF File"
|
||||
msgstr ""
|
||||
|
||||
msgid "File"
|
||||
msgid "&File"
|
||||
msgstr ""
|
||||
|
||||
msgid "New note"
|
||||
@@ -545,6 +545,9 @@ msgstr ""
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
@@ -555,7 +558,7 @@ msgstr ""
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgid "&Edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy"
|
||||
@@ -591,7 +594,7 @@ msgstr ""
|
||||
msgid "Search in current note"
|
||||
msgstr ""
|
||||
|
||||
msgid "View"
|
||||
msgid "&View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -603,7 +606,7 @@ msgstr ""
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
msgid "&Tools"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -618,7 +621,7 @@ msgstr ""
|
||||
msgid "General Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Help"
|
||||
msgid "&Help"
|
||||
msgstr ""
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -661,11 +664,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1009,7 +1012,15 @@ msgstr ""
|
||||
msgid "Clipper Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1021,9 +1032,6 @@ msgstr ""
|
||||
msgid "Rename"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr ""
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr ""
|
||||
|
||||
@@ -1038,6 +1046,9 @@ msgstr ""
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr ""
|
||||
|
||||
@@ -1178,6 +1189,12 @@ msgstr ""
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr ""
|
||||
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
msgid "updated date"
|
||||
msgstr ""
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr ""
|
||||
|
||||
@@ -1188,12 +1205,6 @@ msgstr ""
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr ""
|
||||
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
msgid "updated date"
|
||||
msgstr ""
|
||||
|
||||
msgid "created date"
|
||||
msgstr ""
|
||||
|
||||
@@ -1238,6 +1249,9 @@ msgstr ""
|
||||
msgid "Reverse sort order"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sort notebooks by"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr ""
|
||||
|
||||
@@ -1410,6 +1424,9 @@ msgstr ""
|
||||
msgid "Json Export Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
@@ -1580,10 +1597,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1679,6 +1692,9 @@ msgstr ""
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr ""
|
||||
|
||||
|
@@ -1,19 +1,21 @@
|
||||
# Joplin translation to Spanish (Spain)
|
||||
# Copyright (C) 2017 Lucas Vieites
|
||||
# Copyright (C) 2019 Andros Fenollosa
|
||||
# This file is distributed under the same license as the Joplin-CLI package.
|
||||
# Lucas Vieites <lucas.vieites@gmail.com>, 2017.
|
||||
# Andros Fenollosa <andros@fenollosa.email>, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: Fernando Martín <f@mrtn.es>\n"
|
||||
"Last-Translator: Andros Fenollosa <andros@fenollosa.email>\n"
|
||||
"Language-Team: Spanish <lucas.vieites@gmail.com>\n"
|
||||
"Language: es_ES\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
@@ -35,7 +37,7 @@ msgid "No notebook selected."
|
||||
msgstr "No se ha seleccionado ninguna libreta."
|
||||
|
||||
msgid "No notebook has been specified."
|
||||
msgstr "Ninguna libreta fue especificada"
|
||||
msgstr "Ninguna libreta fue especificada."
|
||||
|
||||
msgid "Y"
|
||||
msgstr "Y"
|
||||
@@ -125,9 +127,10 @@ msgstr "Marca una tarea como hecha."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "La nota no es una tarea: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Maneja la configuración E2EE. Comandos disponibles `enable`, `disable`, "
|
||||
"`decrypt`, `status` y `target-status`."
|
||||
@@ -458,12 +461,11 @@ msgid "Starting synchronisation..."
|
||||
msgstr "Iniciando sincronización..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "Descargando recursos..."
|
||||
|
||||
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 "
|
||||
@@ -586,18 +588,16 @@ msgid "Exporting to \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Exportando el formato de \"%s\" a \"%s\". Por favor espere..."
|
||||
|
||||
msgid "Sidebar"
|
||||
msgstr ""
|
||||
msgstr "Barra lateral"
|
||||
|
||||
msgid "Note list"
|
||||
msgstr ""
|
||||
msgstr "Lista de notas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note title"
|
||||
msgstr "Título de libreta:"
|
||||
msgstr "Titulo de nota"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note body"
|
||||
msgstr "Libretas"
|
||||
msgstr "Cuerpo de nota"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
@@ -606,8 +606,8 @@ msgstr "Importando el formato de \"%s\" a \"%s\". Por favor espere..."
|
||||
msgid "PDF File"
|
||||
msgstr "Archivo PDF"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Archivo"
|
||||
msgid "&File"
|
||||
msgstr "&Archivo"
|
||||
|
||||
msgid "New note"
|
||||
msgstr "Nueva nota"
|
||||
@@ -624,6 +624,9 @@ msgstr "Importar"
|
||||
msgid "Export"
|
||||
msgstr "Exportar"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizar"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Imprimir"
|
||||
|
||||
@@ -634,8 +637,8 @@ msgstr "Oculta %s"
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
msgid "&Edit"
|
||||
msgstr "&Editar"
|
||||
|
||||
msgid "Copy"
|
||||
msgstr "Copiar"
|
||||
@@ -646,9 +649,8 @@ msgstr "Cortar"
|
||||
msgid "Paste"
|
||||
msgstr "Pegar"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Select all"
|
||||
msgstr "Seleccione fecha"
|
||||
msgstr "Seleccionar todo"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "Negrita"
|
||||
@@ -657,7 +659,7 @@ msgid "Italic"
|
||||
msgstr "Cursiva"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
msgstr "Enlace"
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "Introduce fecha"
|
||||
@@ -668,12 +670,11 @@ msgstr "Editar con un editor externo"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Buscar en todas las notas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Buscar en todas las notas"
|
||||
msgstr "Buscar en nota actual"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Ver"
|
||||
msgid "&View"
|
||||
msgstr "&Ver"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr "Cambia la barra lateral"
|
||||
@@ -681,12 +682,11 @@ msgstr "Cambia la barra lateral"
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Cambia el diseño del editor"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Focus"
|
||||
msgstr "Foco en el cuerpo"
|
||||
msgstr "Foco"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Herramientas"
|
||||
msgid "&Tools"
|
||||
msgstr "&Herramientas"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
msgstr "Estado de la sincronización"
|
||||
@@ -700,8 +700,8 @@ msgstr "Opciones de cifrado"
|
||||
msgid "General Options"
|
||||
msgstr "Opciones generales"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Ayuda"
|
||||
msgid "&Help"
|
||||
msgstr "&Ayuda"
|
||||
|
||||
msgid "Website and documentation"
|
||||
msgstr "Sitio web y documentación"
|
||||
@@ -737,18 +737,18 @@ msgstr "La versión actual está actualizada."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
msgstr "%s (pre-lanzamiento)"
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hay disponible una actualización. ¿Quiere descargarla ahora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
msgid "Your version: %s"
|
||||
msgstr "Tu versión: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
msgid "New version: %s"
|
||||
msgstr "Nueva versión: %s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
@@ -757,7 +757,7 @@ msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr ""
|
||||
msgstr "¡El token ha sido copiado al portapapeles!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr ""
|
||||
@@ -809,15 +809,14 @@ msgstr "Paso 2: Instalar la extensión"
|
||||
msgid "Download and install the relevant extension for your browser:"
|
||||
msgstr "Descargar e instalar para su navegador:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Advanced options"
|
||||
msgstr "Mostrar opciones avanzadas"
|
||||
msgstr "Opciones avanzadas"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr ""
|
||||
msgstr "Token de autorización:"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr ""
|
||||
msgstr "Copiar token"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
@@ -829,7 +828,7 @@ msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Las notas y los ajustes se guardan en: %s"
|
||||
|
||||
msgid "Browse..."
|
||||
msgstr ""
|
||||
msgstr "Explorar..."
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "Comprobar sincronización"
|
||||
@@ -927,9 +926,8 @@ msgstr "Estado"
|
||||
msgid "Encryption is:"
|
||||
msgstr "El cifrado está:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Usage"
|
||||
msgstr "Uso: %s"
|
||||
msgstr "Uso"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "Atrás"
|
||||
@@ -949,7 +947,7 @@ msgid "Notebook title:"
|
||||
msgstr "Título de libreta:"
|
||||
|
||||
msgid "Add or remove tags:"
|
||||
msgstr "Agregar o borrar etiquetas: "
|
||||
msgstr "Agregar o borrar etiquetas:"
|
||||
|
||||
msgid "Separate each tag by a comma."
|
||||
msgstr "Separar cada etiqueta por una coma."
|
||||
@@ -989,13 +987,13 @@ msgid ""
|
||||
msgstr "No hay ninguna libreta. Cree una pulsando en «Libreta nueva»."
|
||||
|
||||
msgid "Location"
|
||||
msgstr ""
|
||||
msgstr "Localización"
|
||||
|
||||
msgid "URL"
|
||||
msgstr ""
|
||||
msgstr "URL"
|
||||
|
||||
msgid "Note properties"
|
||||
msgstr ""
|
||||
msgstr "Propiedades de nota"
|
||||
|
||||
msgid "Open..."
|
||||
msgstr "Abrir..."
|
||||
@@ -1014,7 +1012,7 @@ msgid "Copy Link Address"
|
||||
msgstr "Copiar enlace"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
msgstr "El adjunto no ha sido descargado o desencriptado todavía."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1029,7 +1027,7 @@ msgstr ""
|
||||
"editar la nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
msgstr "Solo una nota puede ser impresa o exportada a PDF a la vez."
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "texto destacado"
|
||||
@@ -1117,8 +1115,19 @@ msgstr "Opciones de cifrado"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Opciones de recorte"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
msgstr "¿Desea eliminar esta etiqueta de todas las notas?"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Borrar Libreta \"%s\"?\n"
|
||||
"\n"
|
||||
"Todas las notas y sublibretas de esta libreta serán borradas."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Desea borrar las etiquetas pertenecientes a \"%s\" de todas las notas?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "¿Desea eliminar esta búsqueda de la barra lateral?"
|
||||
@@ -1129,23 +1138,23 @@ msgstr "Eliminar"
|
||||
msgid "Rename"
|
||||
msgstr "Renombrar"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizar"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Libretas"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "Descifrando elementos: %d/%d."
|
||||
msgstr "Descifrando elementos: %d/%d"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "Recursos: %d."
|
||||
msgstr "Obteniendo refuersos: %d"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Seleccione a dónde se debería exportar el estado de sincronización"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Añadir o borrar etiquetas"
|
||||
|
||||
@@ -1159,24 +1168,22 @@ msgstr "%s - Copiar"
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
msgstr "Cambiar a nota"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Cambiar entre nota y lista de tareas"
|
||||
msgstr "Cambiar a lista de tareas"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copiar el enlace de Markdown"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Elimina una libreta \"%s\"?"
|
||||
msgstr "¿Borrar nota \"%s\"?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "¿Desea borrar estas notas?"
|
||||
msgstr "Borrar %d notas?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
@@ -1296,6 +1303,12 @@ msgstr "Cifrado"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Los elementos cifrados no pueden ser modificados"
|
||||
|
||||
msgid "title"
|
||||
msgstr "título"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "fecha de actualización"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflictos"
|
||||
|
||||
@@ -1307,12 +1320,6 @@ 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."
|
||||
|
||||
msgid "title"
|
||||
msgstr "título"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "fecha de actualización"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "fecha de creación"
|
||||
|
||||
@@ -1357,6 +1364,10 @@ msgstr "Ordenar notas por"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Invierte el orden"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Ordenar notas por"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Guardar geolocalización en las notas"
|
||||
|
||||
@@ -1383,16 +1394,18 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"Esto permitirá que Joplin se ejecute en segundo plano. Se recomienda "
|
||||
"habilitar esta configuración para que sus notas estén sincronizadas "
|
||||
"constantemente, reduciendo así el número de conflictos."
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr ""
|
||||
msgstr "Iniciar aplicación minimizada en el icono de la bandeja"
|
||||
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Establecer el porcentaje de aumento de la aplicación"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Fuente del editor"
|
||||
msgstr "Editar tamaño de fuente"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Fuente del editor"
|
||||
@@ -1409,11 +1422,11 @@ msgid "Automatically update the application"
|
||||
msgstr "Actualizar la aplicación automáticamente"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
msgstr "Obtenga pre-lanzamientos cuando busque actualizaciones"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
msgstr "Ver la página de pre-lanzamiento para más detalles: %s"
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalo de sincronización"
|
||||
@@ -1474,6 +1487,9 @@ msgid ""
|
||||
"to it before syncing, otherwise all files will be removed! See the FAQ for "
|
||||
"more details: %s"
|
||||
msgstr ""
|
||||
"Atención: Si cambias esta ubicación, asegúrate de copiar todo tu contenido "
|
||||
"antes de sincronizarlo, de lo contrario todos los archivos serán eliminados. "
|
||||
"Consulte las preguntas frecuentes para obtener más detalles: %s"
|
||||
|
||||
msgid "Nextcloud username"
|
||||
msgstr "Usuario de Nextcloud"
|
||||
@@ -1512,28 +1528,24 @@ msgstr "Ignorar errores en certificados TLS"
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Opción inválida: «%s». Los valores posibles son: %s."
|
||||
|
||||
#, fuzzy
|
||||
msgid "General"
|
||||
msgstr "Opciones generales"
|
||||
msgstr "General"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Synchronisation"
|
||||
msgstr "Estado de la sincronización"
|
||||
msgstr "Sincronización"
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr ""
|
||||
msgstr "Apariencia"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Note"
|
||||
msgstr "Libretas"
|
||||
msgstr "Nota"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Application"
|
||||
msgstr "Salir de la aplicación."
|
||||
msgstr "Aplicación"
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
msgstr "La etiqueta \"%s\" ya existe. Por favor, busque un nuevo nombre."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Archivo de exportación de Joplin"
|
||||
@@ -1547,9 +1559,11 @@ msgstr "Directorio para exportar de Joplin"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Archivo exportado de Evernote"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Directorio para exportar de Joplin"
|
||||
msgstr "Directorio para exportar JSON"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Archivo"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Directorio"
|
||||
@@ -1626,10 +1640,10 @@ msgid "On %s: %s"
|
||||
msgstr "En %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "Permiso para usar tu cámara"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
msgstr "El permiso para usar tu cámara es necesario."
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr "No hay notas. Cree una pulsando en el botón (+)."
|
||||
@@ -1659,9 +1673,8 @@ 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 "Clear alarm"
|
||||
msgstr "Establecer alarma"
|
||||
msgstr "Quitar alarma"
|
||||
|
||||
msgid "Save alarm"
|
||||
msgstr "Establecer alarma"
|
||||
@@ -1675,22 +1688,21 @@ msgstr "Confirmar"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "Cancelar sincronización"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Checking... Please wait."
|
||||
msgstr "Cancelando... Por favor espere."
|
||||
msgstr "Comprobando... Por favor espere."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Success! Synchronisation configuration appears to be correct."
|
||||
msgstr "Comprobar sincronización"
|
||||
msgstr "¡Éxito! La configuración de sincronización es correcta."
|
||||
|
||||
msgid ""
|
||||
"Error. Please check that URL, username, password, etc. are correct and that "
|
||||
"the sync target is accessible. The reported error was:"
|
||||
msgstr ""
|
||||
"Error. Por favor comprueba URL, nombre de usuario, contraseña, etc. son "
|
||||
"correctos y el servicio a sincronizar este accesible. El código de error fue:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "The application has been authorised!"
|
||||
msgstr "La aplicacion ha sido autorizada éxitosamente."
|
||||
msgstr "¡La aplicacion ha sido autorizada!"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -1700,10 +1712,15 @@ msgid ""
|
||||
"\n"
|
||||
"Please try again."
|
||||
msgstr ""
|
||||
"No se pudo autorizar aplicación:\n"
|
||||
"\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"Por favor, vuelva a intentarlo."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Decrypted items: %s / %s"
|
||||
msgstr "Descifrando elementos: %d/%d."
|
||||
msgstr "Descifrando elementos: %s / %s"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr "Nuevas etiquetas:"
|
||||
@@ -1737,24 +1754,19 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
msgstr "Base de datos v%s"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Borrar: %d"
|
||||
msgstr "FTS activado: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Acceder con Dropbox"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Entrar en modo línea de comandos"
|
||||
msgstr "Introduce código aquí"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
@@ -1808,9 +1820,8 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipo de imagen no soportado: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Adjuntar foto"
|
||||
msgstr "Tomar foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Adjuntar foto"
|
||||
@@ -1837,7 +1848,10 @@ msgid "View on map"
|
||||
msgstr "Ver en un mapa"
|
||||
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
msgstr "Ir a origen URL"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Borrar libreta"
|
||||
@@ -1862,6 +1876,12 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Bienvenido"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
||||
#~ msgid "Remove?"
|
||||
#~ msgstr "¿Borrar?"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "¿Desea eliminar notas?"
|
||||
|
||||
|
@@ -125,9 +125,10 @@ msgstr "Markatu zeregina egindakotzat."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Oharra ez da zeregina: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"E2EEren konfigurazioa erabiltzen du. Komandoak dira `enable`, `disable`, "
|
||||
"`decrypt`, `status` eta `target-status`."
|
||||
@@ -604,7 +605,8 @@ msgstr ""
|
||||
msgid "PDF File"
|
||||
msgstr "Fitxategia"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Fitxategia"
|
||||
|
||||
msgid "New note"
|
||||
@@ -623,6 +625,9 @@ msgstr "Inportatu"
|
||||
msgid "Export"
|
||||
msgstr "Inportatu"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sinkronizatu"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
@@ -633,7 +638,8 @@ msgstr ""
|
||||
msgid "Quit"
|
||||
msgstr "Irten"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Editatu"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -671,7 +677,7 @@ msgstr "Bilatu ohar guztietan"
|
||||
msgid "Search in current note"
|
||||
msgstr "Bilatu ohar guztietan"
|
||||
|
||||
msgid "View"
|
||||
msgid "&View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -683,7 +689,8 @@ msgstr ""
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Tresnak"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -698,7 +705,8 @@ msgstr "Zifratzeko aukerak"
|
||||
msgid "General Options"
|
||||
msgstr "Ezarpenak"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Laguntza"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -742,11 +750,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1116,7 +1124,15 @@ msgstr "Zifratzeko aukerak"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Ezarpenak"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr "Koadernoa ezabatu? Dituen ohar guztiak ere ezabatuko dira."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Kendu etiketa hori ohar guztietatik?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1128,9 +1144,6 @@ msgstr "Ezabatu"
|
||||
msgid "Rename"
|
||||
msgstr "Berrizendatu"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sinkronizatu"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Koadernoak"
|
||||
|
||||
@@ -1146,6 +1159,9 @@ msgstr "Baliabideak: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Aukeratu nora esportatu sinkronizazioaren egoera, mesedez"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Gehitu edo ezabatu etiketak"
|
||||
|
||||
@@ -1298,6 +1314,14 @@ msgstr "Zifratuta"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Zifratutako itemak ezin aldatu daitezke"
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Titulu gabekoa"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Eguneratuta: %d."
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Gatazkak"
|
||||
|
||||
@@ -1310,14 +1334,6 @@ msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr ""
|
||||
"Koadernoak ezin izendatu daitezke \"%s\", izen hori Joplinek gordeta dauka"
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Titulu gabekoa"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Eguneratuta: %d."
|
||||
|
||||
#, fuzzy
|
||||
msgid "created date"
|
||||
msgstr "Sortuta: %d."
|
||||
@@ -1366,6 +1382,10 @@ msgstr ""
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Alderantziz antolatzen du."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Editatu koadernoa"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Gore geokokapena oharrekin"
|
||||
|
||||
@@ -1560,6 +1580,9 @@ msgstr "Evernotetik esportatutako fitxategiak"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Evernotetik esportatutako fitxategiak"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fitxategia"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
@@ -1738,10 +1761,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1840,6 +1859,9 @@ msgstr "Ikusi mapan"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Editatu"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Ezabatu koadernoa"
|
||||
|
||||
|
@@ -125,10 +125,11 @@ msgstr "La note n'est pas une tâche : \"%s\""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Gérer la configuration E2EE (Chiffrement de bout à bout). Les commandes sont "
|
||||
"`enable`, `disable`, `decrypt` et `status` et `target-status`."
|
||||
"`enable`, `disable`, `decrypt` et `status`, `decrypt-file` et `target-"
|
||||
"status`."
|
||||
|
||||
msgid "Enter master password:"
|
||||
msgstr "Entrer le mot de passe maître :"
|
||||
@@ -602,8 +603,8 @@ msgstr "Importer depuis \"%s\" au format \"%s\". Veuillez patienter..."
|
||||
msgid "PDF File"
|
||||
msgstr "Fichier PDF"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fichier"
|
||||
msgid "&File"
|
||||
msgstr "&Fichier"
|
||||
|
||||
msgid "New note"
|
||||
msgstr "Nouvelle note"
|
||||
@@ -620,6 +621,9 @@ msgstr "Importer"
|
||||
msgid "Export"
|
||||
msgstr "Exporter"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchroniser"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Imprimer"
|
||||
|
||||
@@ -630,8 +634,8 @@ msgstr "Cacher %s"
|
||||
msgid "Quit"
|
||||
msgstr "Quitter"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Édition"
|
||||
msgid "&Edit"
|
||||
msgstr "&Édition"
|
||||
|
||||
msgid "Copy"
|
||||
msgstr "Copier"
|
||||
@@ -666,8 +670,8 @@ msgstr "Chercher dans toutes les notes"
|
||||
msgid "Search in current note"
|
||||
msgstr "Chercher dans la note en cours"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Affichage"
|
||||
msgid "&View"
|
||||
msgstr "&Affichage"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr "Basculer barre latérale"
|
||||
@@ -678,8 +682,8 @@ msgstr "Basculer l'agencement de l'éditeur"
|
||||
msgid "Focus"
|
||||
msgstr "Naviguer"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "Outils"
|
||||
msgid "&Tools"
|
||||
msgstr "&Outils"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
msgstr "État de la synchronisation"
|
||||
@@ -693,8 +697,8 @@ msgstr "Options de chiffrement"
|
||||
msgid "General Options"
|
||||
msgstr "Options générales"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Aide"
|
||||
msgid "&Help"
|
||||
msgstr "&Aide"
|
||||
|
||||
msgid "Website and documentation"
|
||||
msgstr "Documentation en ligne"
|
||||
@@ -737,12 +741,12 @@ msgstr ""
|
||||
"Une mise à jour est disponible, souhaitez vous la télécharger maintenant ?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "Votre version : v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr "Votre version : %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "Nouvelle version : v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr "Nouvelle version : %s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Oui"
|
||||
@@ -1120,8 +1124,19 @@ msgstr "Options de chiffrement"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Options du Web Clipper"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
msgstr "Enlever cette étiquette de toutes les notes ?"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Effacer le carnet \"%s\" ?\n"
|
||||
"\n"
|
||||
"Toutes les notes et sous-carnets dans ce carnet seront également effacés."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Enlever l’étiquette \"%s\" de toutes les notes ?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "Enlever cette recherche de la barre latérale ?"
|
||||
@@ -1132,9 +1147,6 @@ msgstr "Supprimer"
|
||||
msgid "Rename"
|
||||
msgstr "Renommer"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchroniser"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Carnets"
|
||||
|
||||
@@ -1150,6 +1162,9 @@ msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
"Veuillez sélectionner un répertoire ou exporter l'état de la synchronisation"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr "Table des matières"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Gérer les étiquettes"
|
||||
|
||||
@@ -1298,6 +1313,12 @@ msgstr "Chiffré"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Les objets chiffrés ne peuvent être modifiés"
|
||||
|
||||
msgid "title"
|
||||
msgstr "titre"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "date de modification"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflits"
|
||||
|
||||
@@ -1308,12 +1329,6 @@ msgstr "Impossible de déplacer le carnet à cet endroit"
|
||||
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é."
|
||||
|
||||
msgid "title"
|
||||
msgstr "titre"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "date de modification"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "date de création"
|
||||
|
||||
@@ -1358,6 +1373,9 @@ msgstr "Trier les notes par"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Inverser l'ordre"
|
||||
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Trier les carnets par"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Enregistrer l'emplacement avec les notes"
|
||||
|
||||
@@ -1551,6 +1569,9 @@ msgstr "Fichiers d'export Evernote"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Dossier d'export JSON"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fichier"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Dossier"
|
||||
|
||||
@@ -1741,10 +1762,6 @@ msgstr "- Position : Pour attacher à une note les coordonnées GPS."
|
||||
msgid "Joplin website"
|
||||
msgstr "Site web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Base de données v%s"
|
||||
@@ -1841,6 +1858,9 @@ msgstr "Voir sur carte"
|
||||
msgid "Go to source URL"
|
||||
msgstr "Aller à l'URL source"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Édition"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Supprimer le carnet"
|
||||
|
||||
@@ -1865,6 +1885,12 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Bienvenue"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
||||
#~ msgid "Remove?"
|
||||
#~ msgstr "Supprimer ?"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Supprimer les notes ?"
|
||||
|
||||
|
@@ -122,9 +122,10 @@ msgstr "Marca unha tarefa como feita."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "A nota non é unha tarefa: «%s»"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Xestiona a configuración E2EE. As orde son «enable», «disable», «decrypt», "
|
||||
"«status» e «target-status»."
|
||||
@@ -597,7 +598,8 @@ msgstr "Importando de «%s» como formato «%s». Agarde..."
|
||||
msgid "PDF File"
|
||||
msgstr "Ficheiro PDF"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Ficheiro"
|
||||
|
||||
msgid "New note"
|
||||
@@ -615,6 +617,9 @@ msgstr "Importar"
|
||||
msgid "Export"
|
||||
msgstr "Exportar"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizar"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Imprimir"
|
||||
|
||||
@@ -625,7 +630,8 @@ msgstr "Ocultar %s"
|
||||
msgid "Quit"
|
||||
msgstr "Saír"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Edtar"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -663,7 +669,8 @@ msgstr "Buscar en todas as notas"
|
||||
msgid "Search in current note"
|
||||
msgstr "Buscar en todas as notas"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Vista"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -676,7 +683,8 @@ msgstr "Cambiar a disposición do editor"
|
||||
msgid "Focus"
|
||||
msgstr "Focar no corpo"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Ferramentas"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -691,7 +699,8 @@ msgstr "Opcións de cifrado"
|
||||
msgid "General Options"
|
||||
msgstr "Opcións xerais"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Axuda"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -734,11 +743,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hai unha actualización dispoñíbel, desexa descargala agora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1102,7 +1111,16 @@ msgstr "Opcións de cifrado"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Opcións xerais"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Desexa eliminar o caderno? Tamén se eliminarán todas as notas deste caderno."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Desexa eliminar esta etiqueta de todas as notas?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1114,9 +1132,6 @@ msgstr "Eliminar"
|
||||
msgid "Rename"
|
||||
msgstr "Renomear"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizar"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Cadernos"
|
||||
|
||||
@@ -1131,6 +1146,9 @@ msgstr "Recursos: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Seleccione onde exportar o estado da sincronización"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Engadir ou eliminar etiquetas"
|
||||
|
||||
@@ -1283,6 +1301,14 @@ msgstr "Cifrado"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Non é posíbel modificar elementos cifrados"
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Sen título"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Actualizado: %d."
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflitos"
|
||||
|
||||
@@ -1294,14 +1320,6 @@ msgstr "Non é posíbel mover a nota ao caderno «%s»"
|
||||
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."
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Sen título"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Actualizado: %d."
|
||||
|
||||
#, fuzzy
|
||||
msgid "created date"
|
||||
msgstr "Creado: %d."
|
||||
@@ -1348,6 +1366,10 @@ msgstr "Ordenar notas por"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Orde inversa"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Ordenar notas por"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Gardar xeolocalización coas notas"
|
||||
|
||||
@@ -1537,6 +1559,9 @@ msgstr "Ficheiro de exportación de Evernote"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Cartafol de exportación do Joplin"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Ficheiro"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Cartafol"
|
||||
|
||||
@@ -1717,10 +1742,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1818,6 +1839,9 @@ msgstr "Ver no mapa"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Edtar"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Eliminar caderno"
|
||||
|
||||
@@ -1840,6 +1864,10 @@ msgstr "Non ten cadernos actualmente. Cree un premendo no botón (+)."
|
||||
msgid "Welcome"
|
||||
msgstr "Benvido/a"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Sitio web de Joplin"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Estado: %s."
|
||||
|
||||
|
@@ -128,7 +128,7 @@ msgstr "Bilješka nije zadatak: \"%s\""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter master password:"
|
||||
@@ -601,7 +601,8 @@ msgstr ""
|
||||
msgid "PDF File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
msgid "New note"
|
||||
@@ -620,6 +621,9 @@ msgstr "Uvoz"
|
||||
msgid "Export"
|
||||
msgstr "Uvoz"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sinkroniziraj"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
@@ -630,7 +634,8 @@ msgstr ""
|
||||
msgid "Quit"
|
||||
msgstr "Izađi"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Uredi"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -668,7 +673,7 @@ msgstr "Pretraži u svim bilješkama"
|
||||
msgid "Search in current note"
|
||||
msgstr "Pretraži u svim bilješkama"
|
||||
|
||||
msgid "View"
|
||||
msgid "&View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -681,7 +686,8 @@ msgstr ""
|
||||
msgid "Focus"
|
||||
msgstr "Naslov bilješke:"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Alati"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -697,7 +703,8 @@ msgstr ""
|
||||
msgid "General Options"
|
||||
msgstr "Opcije"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Pomoć"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -741,11 +748,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1103,7 +1110,16 @@ msgstr ""
|
||||
msgid "Clipper Options"
|
||||
msgstr "Opcije"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Obrisati bilježnicu? Sve bilješke u toj bilježnici će također biti obrisane."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Makni ovu oznaku iz svih bilješki?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1115,9 +1131,6 @@ msgstr "Obriši"
|
||||
msgid "Rename"
|
||||
msgstr "Preimenuj"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sinkroniziraj"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Bilježnice"
|
||||
|
||||
@@ -1132,6 +1145,9 @@ msgstr "Resursi: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Odaberi lokaciju za izvoz statusa sinkronizacije"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Dodaj ili makni oznake"
|
||||
|
||||
@@ -1282,6 +1298,14 @@ msgstr ""
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Neke stavke se ne mogu sinkronizirati."
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Nenaslovljen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Ažurirano: %d."
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Sukobi"
|
||||
|
||||
@@ -1293,14 +1317,6 @@ msgstr "Ne mogu premjestiti bilješku u bilježnicu %s"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "Naslov \"%s\" je rezerviran i ne može se koristiti."
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Nenaslovljen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Ažurirano: %d."
|
||||
|
||||
#, fuzzy
|
||||
msgid "created date"
|
||||
msgstr "Stvoreno: %d."
|
||||
@@ -1349,6 +1365,10 @@ msgstr ""
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Mijenja redoslijed."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Uredi bilježnicu"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Spremi geolokacijske podatke sa bilješkama"
|
||||
|
||||
@@ -1538,6 +1558,9 @@ msgstr "Evernote izvozne datoteke"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Evernote izvozne datoteke"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
@@ -1714,10 +1737,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1817,6 +1836,9 @@ msgstr "Vidi na karti"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Uredi"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Obriši bilježnicu"
|
||||
|
||||
|
@@ -124,9 +124,10 @@ msgstr "Segna un \"Cose-da-fare\" come completato."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "La nota non è un \"Cose-da-fare\": \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Gestisci la configurazione E2EE. I comandi sono `abilita`, `disabilita`, "
|
||||
"`decripta`, `stato` e `stato-target`."
|
||||
@@ -610,7 +611,8 @@ msgstr "Importazione da \"%s\" come formato \"%s\". Si prega di attendere..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF File"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "File"
|
||||
|
||||
msgid "New note"
|
||||
@@ -628,6 +630,9 @@ msgstr "Importa"
|
||||
msgid "Export"
|
||||
msgstr "Esporta"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizza"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Stampa"
|
||||
|
||||
@@ -638,7 +643,8 @@ msgstr "Nascondi %s"
|
||||
msgid "Quit"
|
||||
msgstr "Esci"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Modifica"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -674,7 +680,8 @@ msgstr "Cerca in tutte le note"
|
||||
msgid "Search in current note"
|
||||
msgstr "Cerca nella nota corrente"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Vista"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -687,7 +694,8 @@ msgstr "Attiva / disattiva il layout dell'editor"
|
||||
msgid "Focus"
|
||||
msgstr "Focus sul testo"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Strumenti"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -702,7 +710,8 @@ msgstr "Opzioni Crittografia"
|
||||
msgid "General Options"
|
||||
msgstr "Opzioni Generali"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Aiuto"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -745,11 +754,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "È disponibile un aggiornamento, vuoi scaricarlo ora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1123,7 +1132,17 @@ msgstr "Opzioni di crittografia"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Opzioni Clipper"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Eliminare taccuino? Anche tutte le note e cartelle di questo taccuino "
|
||||
"saranno cancellati."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Rimuovere questa etichetta da tutte le note?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1135,9 +1154,6 @@ msgstr "Elimina"
|
||||
msgid "Rename"
|
||||
msgstr "Rinomina"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizza"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Taccuini"
|
||||
|
||||
@@ -1152,6 +1168,9 @@ msgstr "Risorse: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Aggiungi o rimuovi etichetta"
|
||||
|
||||
@@ -1300,6 +1319,12 @@ msgstr "Crittografato"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Gli elementi crittografati non possono essere modificati"
|
||||
|
||||
msgid "title"
|
||||
msgstr "Titolo"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "Data di aggiornamento"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflitti"
|
||||
|
||||
@@ -1310,12 +1335,6 @@ msgstr "Impossibile spostare il Taccuino in questa posizione"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "I blocchi non possono essere chiamati \"%s\". È un titolo riservato."
|
||||
|
||||
msgid "title"
|
||||
msgstr "Titolo"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "Data di aggiornamento"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "Data di creazione"
|
||||
|
||||
@@ -1360,6 +1379,10 @@ msgstr "Ordina le note per"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Inverti l'ordine"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Ordina le note per"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Salva geolocalizzazione con le note"
|
||||
|
||||
@@ -1554,6 +1577,9 @@ msgstr "Esporta files di Evernote"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Cartella di esportazione JSON"
|
||||
|
||||
msgid "File"
|
||||
msgstr "File"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Cartella"
|
||||
|
||||
@@ -1741,10 +1767,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Sito web Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Database v%s"
|
||||
@@ -1841,6 +1863,9 @@ msgstr "Guarda sulla mappa"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Modifica"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Cancella Taccuino"
|
||||
|
||||
@@ -1864,6 +1889,9 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Benvenuto"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Eliminare le note?"
|
||||
|
||||
|
@@ -123,9 +123,10 @@ msgstr "ToDoを完了としてマークします。"
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "ノートはToDoリストではありません:\"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"E2EEの設定を変更します。コマンドは `enable`, `disable`, `decrypt`, `status` "
|
||||
"and `target-status` です。"
|
||||
@@ -592,7 +593,8 @@ msgstr ""
|
||||
msgid "PDF File"
|
||||
msgstr "PDF ファイル"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "ファイル"
|
||||
|
||||
msgid "New note"
|
||||
@@ -610,6 +612,9 @@ msgstr "インポート"
|
||||
msgid "Export"
|
||||
msgstr "エクスポート"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "同期"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "印刷"
|
||||
|
||||
@@ -620,7 +625,8 @@ msgstr "%s を隠す"
|
||||
msgid "Quit"
|
||||
msgstr "終了"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "編集"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -656,7 +662,8 @@ msgstr "すべてのノートを検索"
|
||||
msgid "Search in current note"
|
||||
msgstr "現在のノートを検索"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "表示"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -669,7 +676,8 @@ msgstr "エディターレイアウトの表示切り替え"
|
||||
msgid "Focus"
|
||||
msgstr "本文にフォーカス"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "ツール"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -684,7 +692,8 @@ msgstr "暗号化のオプション"
|
||||
msgid "General Options"
|
||||
msgstr "全般のオプション"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "ヘルプ"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -727,11 +736,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "アップデートがあります。すぐにダウンロードしますか?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1100,7 +1109,17 @@ msgstr "暗号化のオプション"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Clipperのオプション"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"ノートブックを削除しますか? このノートブックにあるノートとサブノートはすべ"
|
||||
"て消えてしまいます。"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "すべてのノートからこのタグを削除しますか?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1112,9 +1131,6 @@ msgstr "削除"
|
||||
msgid "Rename"
|
||||
msgstr "名前の変更"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "同期"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "ノートブック"
|
||||
|
||||
@@ -1129,6 +1145,9 @@ msgstr "取得中のリソース: %d"
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "同期状況の出力先を選択してください"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "タグの追加と削除"
|
||||
|
||||
@@ -1277,6 +1296,12 @@ msgstr "暗号化済"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "暗号化したアイテムは修正できません"
|
||||
|
||||
msgid "title"
|
||||
msgstr "タイトル"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "アップデート日"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "衝突"
|
||||
|
||||
@@ -1289,12 +1314,6 @@ msgstr ""
|
||||
"\"%s\" というノートブックの名称はシステムで使用するために予約済みです。名称の"
|
||||
"変更はできません。"
|
||||
|
||||
msgid "title"
|
||||
msgstr "タイトル"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "アップデート日"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "作成日"
|
||||
|
||||
@@ -1339,6 +1358,10 @@ msgstr "ノートのソート方法"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "逆順に並び替え"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "ノートのソート方法"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "ノートに位置情報を保存"
|
||||
|
||||
@@ -1391,11 +1414,11 @@ msgid "Automatically update the application"
|
||||
msgstr "アプリケーションを自動的にアップデート"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
msgstr "更新をチェックする時、開発版を取得する"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
msgstr "詳細についてはプレリリースページを参照してください: %s"
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "同期間隔"
|
||||
@@ -1532,6 +1555,9 @@ msgstr "Evernote エクスポートファイル"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Json エクスポートディレクトリ"
|
||||
|
||||
msgid "File"
|
||||
msgstr "ファイル"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "ディレクトリ"
|
||||
|
||||
@@ -1718,10 +1744,6 @@ msgstr "- 位置情報: ノートに位置情報を添付するのに必要で
|
||||
msgid "Joplin website"
|
||||
msgstr "JoplinのWebサイト"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "JoplinのWebサイト"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1818,6 +1840,9 @@ msgstr "地図上に表示"
|
||||
msgid "Go to source URL"
|
||||
msgstr "ソースURLに行く"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "編集"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "ノートブックを削除"
|
||||
|
||||
@@ -1842,6 +1867,10 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "ようこそ"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "JoplinのWebサイト"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "状態: \"%s\"."
|
||||
|
||||
|
@@ -119,7 +119,7 @@ msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter master password:"
|
||||
@@ -527,7 +527,7 @@ msgstr ""
|
||||
msgid "PDF File"
|
||||
msgstr ""
|
||||
|
||||
msgid "File"
|
||||
msgid "&File"
|
||||
msgstr ""
|
||||
|
||||
msgid "New note"
|
||||
@@ -545,6 +545,9 @@ msgstr ""
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr ""
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
@@ -555,7 +558,7 @@ msgstr ""
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgid "&Edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Copy"
|
||||
@@ -591,7 +594,7 @@ msgstr ""
|
||||
msgid "Search in current note"
|
||||
msgstr ""
|
||||
|
||||
msgid "View"
|
||||
msgid "&View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -603,7 +606,7 @@ msgstr ""
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
msgid "&Tools"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -618,7 +621,7 @@ msgstr ""
|
||||
msgid "General Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Help"
|
||||
msgid "&Help"
|
||||
msgstr ""
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -661,11 +664,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1009,7 +1012,15 @@ msgstr ""
|
||||
msgid "Clipper Options"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1021,9 +1032,6 @@ msgstr ""
|
||||
msgid "Rename"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr ""
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr ""
|
||||
|
||||
@@ -1038,6 +1046,9 @@ msgstr ""
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr ""
|
||||
|
||||
@@ -1178,6 +1189,12 @@ msgstr ""
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr ""
|
||||
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
msgid "updated date"
|
||||
msgstr ""
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr ""
|
||||
|
||||
@@ -1188,12 +1205,6 @@ msgstr ""
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr ""
|
||||
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
msgid "updated date"
|
||||
msgstr ""
|
||||
|
||||
msgid "created date"
|
||||
msgstr ""
|
||||
|
||||
@@ -1238,6 +1249,9 @@ msgstr ""
|
||||
msgid "Reverse sort order"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sort notebooks by"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr ""
|
||||
|
||||
@@ -1410,6 +1424,9 @@ msgstr ""
|
||||
msgid "Json Export Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
@@ -1580,10 +1597,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1679,6 +1692,9 @@ msgstr ""
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr ""
|
||||
|
||||
|
@@ -124,9 +124,10 @@ msgstr "'할 일' 항목을 완료로 표시합니다."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "노트는 '할 일' 항목이 아닙니다: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"E2EE(종단간 암호화) 설정을 관리합니다. 명령어는 `enable`, `disable`, "
|
||||
"`decrypt`, `status`, `target-status` 입니다."
|
||||
@@ -589,7 +590,8 @@ msgstr "\"%s\"에서 \"%s\" 포맷으로 가져오는 중입니다. 잠시만
|
||||
msgid "PDF File"
|
||||
msgstr "PDF 파일"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "파일"
|
||||
|
||||
msgid "New note"
|
||||
@@ -607,6 +609,9 @@ msgstr "가져오기"
|
||||
msgid "Export"
|
||||
msgstr "내보내기"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "동기화"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "인쇄"
|
||||
|
||||
@@ -617,7 +622,8 @@ msgstr "%s 숨기기"
|
||||
msgid "Quit"
|
||||
msgstr "종료"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "편집"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -653,7 +659,8 @@ msgstr "모든 노트에서 검색"
|
||||
msgid "Search in current note"
|
||||
msgstr "현재 노트에서 검색"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "보기"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -666,7 +673,8 @@ msgstr "편집기 배치 형태 전환"
|
||||
msgid "Focus"
|
||||
msgstr "내용에 포커스"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "도구"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -681,7 +689,8 @@ msgstr "암호화 옵션"
|
||||
msgid "General Options"
|
||||
msgstr "일반 옵션"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "도움말"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -724,12 +733,12 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "업데이트가 있습니다. 지금 다운로드할까요?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "현재 버전: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr "현재 버전: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "새 버전: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr "새 버전: %s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "예"
|
||||
@@ -1094,7 +1103,17 @@ msgstr "암호화 옵션"
|
||||
msgid "Clipper Options"
|
||||
msgstr "수집기 옵션"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"노트북을 삭제할까요? 이 노트북 안에 있는 모든 노트와 하위 노트북들도 함께 삭"
|
||||
"제됩니다."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "모든 노트에서 이 태그를 제거할까요?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1106,9 +1125,6 @@ msgstr "삭제"
|
||||
msgid "Rename"
|
||||
msgstr "이름 바꾸기"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "동기화"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "노트북"
|
||||
|
||||
@@ -1123,6 +1139,9 @@ msgstr "리소스 가져오는 중: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "동기화 상태를 내보낼 대상을 선택하세요"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "태그 추가 및 제거"
|
||||
|
||||
@@ -1271,6 +1290,12 @@ msgstr "암호화됨"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "암호화된 항목은 변경될 수 없습니다"
|
||||
|
||||
msgid "title"
|
||||
msgstr "제목"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "업데이트된 날짜"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "충돌"
|
||||
|
||||
@@ -1281,12 +1306,6 @@ msgstr "노트북을 이 위치로 옮길 수 없습니다"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "노트북을 \"%s\" 제목으로 정할 수 없습니다. 이미 예약중입니다."
|
||||
|
||||
msgid "title"
|
||||
msgstr "제목"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "업데이트된 날짜"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "만들어진 날짜"
|
||||
|
||||
@@ -1331,6 +1350,10 @@ msgstr "노트를 다음 기준으로 정렬"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "정렬 순서 반전"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "노트를 다음 기준으로 정렬"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "노트에 지리적 위치 정보 포함시키기"
|
||||
|
||||
@@ -1524,6 +1547,9 @@ msgstr "에버노트 내보내기 파일"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Json 내보내기 폴더"
|
||||
|
||||
msgid "File"
|
||||
msgstr "파일"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "폴더"
|
||||
|
||||
@@ -1710,10 +1736,6 @@ msgstr "- 위치: 지리적 위치 정보를 노트에 첨부하기 위해서
|
||||
msgid "Joplin website"
|
||||
msgstr "조플린 웹사이트"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "조플린 v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "데이터베이스 v%s"
|
||||
@@ -1809,6 +1831,9 @@ msgstr "지도에 표시"
|
||||
msgid "Go to source URL"
|
||||
msgstr "소스 URL로 이동"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "편집"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "노트북 삭제"
|
||||
|
||||
@@ -1831,6 +1856,9 @@ msgstr "노트북이 없습니다. (+) 버튼을 눌러 새로 만드세요."
|
||||
msgid "Welcome"
|
||||
msgstr "환영합니다"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "조플린 v%s"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "상태: %s."
|
||||
|
||||
|
@@ -124,9 +124,10 @@ msgstr "Markerer et gjøremål som ferdig."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Notat er ikke et gjøremål: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Utfører E2EE-konfiguration. Tilgjengelige kommandoer er: `enable`(aktiver), "
|
||||
"`disable`(lukk), `decrypt`(dekrypter), `status` og `target-status` (mottager-"
|
||||
@@ -597,7 +598,8 @@ msgstr "Importerer fra \"%s\" i \"%s\"-format. Vennligst vent..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-fil"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Fil"
|
||||
|
||||
msgid "New note"
|
||||
@@ -615,6 +617,9 @@ msgstr "Importer"
|
||||
msgid "Export"
|
||||
msgstr "Eksport"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synkroniser"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Skriv ut"
|
||||
|
||||
@@ -625,7 +630,8 @@ msgstr "Skjul %s"
|
||||
msgid "Quit"
|
||||
msgstr "Avslutt"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Rediger"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -662,7 +668,8 @@ msgstr "Søk i alle notater"
|
||||
msgid "Search in current note"
|
||||
msgstr "Søk i nåværende notat"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Vis"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -675,7 +682,8 @@ msgstr "Bytt editorutseende"
|
||||
msgid "Focus"
|
||||
msgstr "Fokuser på brødtekst"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Verktøy"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -690,7 +698,8 @@ msgstr "Krypteringsvalg"
|
||||
msgid "General Options"
|
||||
msgstr "Generelle innstillinger"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Hjelp"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -733,12 +742,12 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "En oppdatering er tilgjengelig, vil du laste den ned nå?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "Din versjon: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr "Din versjon: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "Ny versjon: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr "Ny versjon: %s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
@@ -1109,7 +1118,17 @@ msgstr "Krypteringsinnstillinger"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Clipper-innstillinger"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Slette notatbok? Alle notater og underliggende notatbøker i denne notatboken "
|
||||
"vil også bli slettet."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Fjern denne merkelappen fra alle notater?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1121,9 +1140,6 @@ msgstr "Slett"
|
||||
msgid "Rename"
|
||||
msgstr "Gi nytt navn"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synkroniser"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Notatbøker"
|
||||
|
||||
@@ -1138,6 +1154,9 @@ msgstr "Henter ressurser: %d"
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Velg hvor synkroniseringsstatusen skal eksporteres til"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Legg til eller fjern merkelapper"
|
||||
|
||||
@@ -1286,6 +1305,12 @@ msgstr "Kryptert"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Krypterte elementer kan ikke modifiseres"
|
||||
|
||||
msgid "title"
|
||||
msgstr "tittel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "sist oppdatert"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Konflikter"
|
||||
|
||||
@@ -1296,12 +1321,6 @@ msgstr "Kan ikke flytte notatboken til denne plasseringen"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "Notatbøker kan ikke hete %s, som er en reservert tittel."
|
||||
|
||||
msgid "title"
|
||||
msgstr "tittel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "sist oppdatert"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "opprettet"
|
||||
|
||||
@@ -1346,6 +1365,10 @@ msgstr "Sorter notater etter"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Reverser sorteringsrekkefølge"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Sorter notater etter"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Lagre stedsinformasjon med notater"
|
||||
|
||||
@@ -1542,6 +1565,9 @@ msgstr "Evernote-eksportert fil"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Json-eksportert katalog"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fil"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Katalog"
|
||||
|
||||
@@ -1728,10 +1754,6 @@ msgstr "- Sted: for å legge ved stedsinformation til notatet."
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplins nettsted"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Database v%s"
|
||||
@@ -1828,6 +1850,9 @@ msgstr "Se på kart"
|
||||
msgid "Go to source URL"
|
||||
msgstr "Gå til kilde-URL"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Rediger"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Slett notatbok"
|
||||
|
||||
@@ -1849,3 +1874,7 @@ msgstr "Du har enda ingen notatbok. Lag en ved å klikke på (+)-knappen."
|
||||
|
||||
msgid "Welcome"
|
||||
msgstr "Velkommen"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
@@ -125,9 +125,10 @@ msgstr "Markeer een to-do als voltooid. "
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Notitie is geen to-do: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Beheert E2EE configuratie. Commando's zijn `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
@@ -606,7 +607,8 @@ msgstr ""
|
||||
msgid "PDF File"
|
||||
msgstr "Bestand"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Bestand"
|
||||
|
||||
msgid "New note"
|
||||
@@ -625,6 +627,9 @@ msgstr "Importeer"
|
||||
msgid "Export"
|
||||
msgstr "Importeer"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchroniseer"
|
||||
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
@@ -635,7 +640,8 @@ msgstr ""
|
||||
msgid "Quit"
|
||||
msgstr "Stop"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Bewerk"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -673,7 +679,7 @@ msgstr "Zoek in alle notities"
|
||||
msgid "Search in current note"
|
||||
msgstr "Zoek in alle notities"
|
||||
|
||||
msgid "View"
|
||||
msgid "&View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -685,7 +691,8 @@ msgstr ""
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Tools"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -700,7 +707,8 @@ msgstr "Versleutelopties"
|
||||
msgid "General Options"
|
||||
msgstr "Algemene opties"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Help"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -744,11 +752,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1119,7 +1127,17 @@ msgstr "Versleutelopties"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Algemene opties"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Notitieboek verwijderen? Alle notities in dit notitieboek zullen ook "
|
||||
"verwijderd worden."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Deze tag verwijderen van alle notities?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1131,9 +1149,6 @@ msgstr "Verwijderen"
|
||||
msgid "Rename"
|
||||
msgstr "Hernoem"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchroniseer"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Notitieboeken"
|
||||
|
||||
@@ -1148,6 +1163,9 @@ msgstr "Middelen: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Selecteer waar de synchronisatie status naar geëxporteerd moet worden"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Voeg tag toe of verwijder tag"
|
||||
|
||||
@@ -1300,6 +1318,14 @@ msgstr "Versleuteld"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Versleutelde items kunnen niet aangepast worden"
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Untitled"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Bijgewerkt: %d."
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflicten"
|
||||
|
||||
@@ -1313,14 +1339,6 @@ msgstr ""
|
||||
"Notitieboeken kunnen niet \"%s\" genoemd worden, dit is een gereserveerd "
|
||||
"woord."
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Untitled"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Bijgewerkt: %d."
|
||||
|
||||
#, fuzzy
|
||||
msgid "created date"
|
||||
msgstr "Aangemaakt: %d."
|
||||
@@ -1369,6 +1387,10 @@ msgstr ""
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Draait de sorteervolgorde om."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Bewerk notitieboek"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Sla geo-locatie op bij notities"
|
||||
|
||||
@@ -1560,6 +1582,9 @@ msgstr "Exporteer Evernote bestanden"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Exporteer Evernote bestanden"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Bestand"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
@@ -1740,10 +1765,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1842,6 +1863,9 @@ msgstr "Toon op de kaart"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Bewerk"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Verwijder notitieboek"
|
||||
|
||||
|
@@ -127,9 +127,10 @@ msgstr "Markeert een taak als afgerond."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Notitie is geen taak: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Beheert de E2EE-configuratie. Opdrachten zijn: `enable`, `disable`, "
|
||||
"`decrypt`, `status` en `target-status`."
|
||||
@@ -606,7 +607,8 @@ msgstr "Bezig met importeren van \"%s\" in het formaat \"%s\". Even geduld..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-bestand"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Bestand"
|
||||
|
||||
msgid "New note"
|
||||
@@ -624,6 +626,9 @@ msgstr "Importeren"
|
||||
msgid "Export"
|
||||
msgstr "Exporteren"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchroniseren"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Afdrukken"
|
||||
|
||||
@@ -634,7 +639,8 @@ msgstr "%s verbergen"
|
||||
msgid "Quit"
|
||||
msgstr "Afsluiten"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Bewerken"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -672,7 +678,8 @@ msgstr "Alle notities doorzoeken"
|
||||
msgid "Search in current note"
|
||||
msgstr "Alle notities doorzoeken"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Beeld"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -685,7 +692,8 @@ msgstr "Bewerkindeling tonen/verbergen"
|
||||
msgid "Focus"
|
||||
msgstr "Inhoud focussen"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Hulpmiddelen"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -700,7 +708,8 @@ msgstr "Versleutelingsopties"
|
||||
msgid "General Options"
|
||||
msgstr "Algemene opties"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Hulp"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -743,11 +752,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Er is een update beschikbaar. Wil je deze nu downloaden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1123,7 +1132,17 @@ msgstr "Versleutelopties"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Webclipperopties"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Notitieboek verwijderen? Alle notities en sub-notitieboeken worden eveneens "
|
||||
"verwijderd."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Wil je dit label verwijderen van alle notities?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1135,9 +1154,6 @@ msgstr "Verwijderen"
|
||||
msgid "Rename"
|
||||
msgstr "Naam wijzigen"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synchroniseren"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Notitieboeken"
|
||||
|
||||
@@ -1152,6 +1168,9 @@ msgstr "Bronnen: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Kies waar de synchronisatiestatus naar moet worden geëxporteerd"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Labels toevoegen of verwijderen"
|
||||
|
||||
@@ -1302,6 +1321,12 @@ msgstr "Versleuteld"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Versleutelde items kunnen niet worden bewerkt"
|
||||
|
||||
msgid "title"
|
||||
msgstr "titel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "bijgewerkt op"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflicten"
|
||||
|
||||
@@ -1312,12 +1337,6 @@ msgstr "Kan notitieboek niet verplaatsen naar deze locatie"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "Notitieboeken mogen niet \"%s\" heten; dit is een gereserveerde titel."
|
||||
|
||||
msgid "title"
|
||||
msgstr "titel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "bijgewerkt op"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "gecreëerd op"
|
||||
|
||||
@@ -1362,6 +1381,10 @@ msgstr "Notities sorteren op"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Sorteervolgorde omdraaien"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Notities sorteren op"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Locatie opslaan in notities"
|
||||
|
||||
@@ -1556,6 +1579,9 @@ msgstr "Evernote-exportbestand"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin-exportmap"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Bestand"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Map"
|
||||
|
||||
@@ -1744,10 +1770,6 @@ msgstr "- Locatie: zodat je locatie-informatie kunt toevoegen aan een notitie."
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin-website"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin-website"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1844,6 +1866,9 @@ msgstr "Tonen op kaart"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Bewerken"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Notitieboek verwijderen"
|
||||
|
||||
@@ -1868,6 +1893,10 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Welkom"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin-website"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Status: %s."
|
||||
|
||||
|
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.0.7\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -124,9 +124,10 @@ msgstr "Marca uma tarefa como feita."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Nota não é uma tarefa: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Gerencia a configuração E2EE. Os comandos são `enable`, `disable`, "
|
||||
"`decrypt`, `status` e `target-status`."
|
||||
@@ -603,7 +604,8 @@ msgstr "Importando de \"%s\" com o formato \"%s\". Por favor, aguarde..."
|
||||
msgid "PDF File"
|
||||
msgstr "Arquivo PDF"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Arquivo"
|
||||
|
||||
msgid "New note"
|
||||
@@ -621,6 +623,9 @@ msgstr "Importar"
|
||||
msgid "Export"
|
||||
msgstr "Exportar"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizar"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Imprimir"
|
||||
|
||||
@@ -631,7 +636,8 @@ msgstr "Ocultar %s"
|
||||
msgid "Quit"
|
||||
msgstr "Sair"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -667,7 +673,8 @@ msgstr "Pesquisar em todas as notas"
|
||||
msgid "Search in current note"
|
||||
msgstr "Pesquisar na nota atual"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Visualizar"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -680,7 +687,8 @@ msgstr "Alternar layout do editor"
|
||||
msgid "Focus"
|
||||
msgstr "Focar no corpo"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Ferramentas"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -695,7 +703,8 @@ msgstr "Opções de Encriptação"
|
||||
msgid "General Options"
|
||||
msgstr "Opções Gerais"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Ajuda"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -738,11 +747,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Uma atualização está disponível, você quer baixar agora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -752,7 +761,7 @@ msgid "No"
|
||||
msgstr "Não"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr "Token foi copiado para a \\u00e1rea de transfer\\u00eancia!"
|
||||
msgstr "Token foi copiado para a área de transferência!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr ""
|
||||
@@ -807,17 +816,17 @@ msgid "Advanced options"
|
||||
msgstr "Mostrar opções avançadas"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr "Token de autoriza\\u00e7\\u00e3o:"
|
||||
msgstr "Token de autorização:"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr "Copira token"
|
||||
msgstr "Copiar token"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
"Esse token de autoriza\\u00e7\\u00e3o só é necess\\u00e1rio para permitir "
|
||||
"que aplicativos de terceiros acessem o Joplin."
|
||||
"Esse token de autorização só é necessário para permitir que aplicativos de "
|
||||
"terceiros acessem o Joplin."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notes and settings are stored in: %s"
|
||||
@@ -1113,7 +1122,17 @@ msgstr "Opções de Encriptação"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Opções do clipper"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"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 "
|
||||
"excluídas."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Remover esta tag de todas as notas?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1125,9 +1144,6 @@ msgstr "Excluir"
|
||||
msgid "Rename"
|
||||
msgstr "Renomear"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizar"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Cadernos"
|
||||
|
||||
@@ -1144,6 +1160,9 @@ msgstr ""
|
||||
"Favor selecionar o local para onde o status de sincronia deveria ser "
|
||||
"exportado"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Adicionar ou remover tags"
|
||||
|
||||
@@ -1292,6 +1311,12 @@ msgstr "Encriptado"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Itens encriptados não podem ser modificados"
|
||||
|
||||
msgid "title"
|
||||
msgstr "título"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data de atualização"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflitos"
|
||||
|
||||
@@ -1303,12 +1328,6 @@ 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."
|
||||
|
||||
msgid "title"
|
||||
msgstr "título"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data de atualização"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "data de criação"
|
||||
|
||||
@@ -1353,6 +1372,10 @@ msgstr "Ordenar notas por"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Inverter ordem de classificação"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Ordenar notas por"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Salvar geolocalização com notas"
|
||||
|
||||
@@ -1549,6 +1572,9 @@ msgstr "Arquivo de Exportação do Evernote"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Diretório de Exportação JSON"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Arquivo"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Diretório"
|
||||
|
||||
@@ -1625,10 +1651,10 @@ msgid "On %s: %s"
|
||||
msgstr "Em %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr "Permissão para utilizar sua c\\u00e2mera"
|
||||
msgstr "Permissão para utilizar sua câmera"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr "É necessária a sua permissão para utilizar sua c\\u00e2mera."
|
||||
msgstr "É necessária a sua permissão para utilizar sua câmera."
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr "Atualmente, não há notas. Crie uma, clicando no botão (+)."
|
||||
@@ -1740,10 +1766,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Site do Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Site do Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1840,6 +1862,9 @@ msgstr "Ver no mapa"
|
||||
msgid "Go to source URL"
|
||||
msgstr "Ir para a URL de origem"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Excluir caderno"
|
||||
|
||||
@@ -1862,6 +1887,10 @@ msgstr "Você não possui cadernos. Crie um clicando no botão (+)."
|
||||
msgid "Welcome"
|
||||
msgstr "Bem-vindo"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Site do Joplin"
|
||||
|
||||
#~ msgid "Delete notes?"
|
||||
#~ msgstr "Excluir notas?"
|
||||
|
||||
|
@@ -123,7 +123,7 @@ msgstr "Notița nu este o sarcină: \"%s\""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter master password:"
|
||||
@@ -542,7 +542,8 @@ msgstr ""
|
||||
msgid "PDF File"
|
||||
msgstr "Fișier PDF"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Fișier"
|
||||
|
||||
msgid "New note"
|
||||
@@ -560,6 +561,9 @@ msgstr "Importați"
|
||||
msgid "Export"
|
||||
msgstr "Exportați"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizați"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Printați"
|
||||
|
||||
@@ -570,7 +574,8 @@ msgstr "Ascundeți %s"
|
||||
msgid "Quit"
|
||||
msgstr "Ieșiți"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Editați"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -608,7 +613,8 @@ msgstr "Căutați în toate notițele"
|
||||
msgid "Search in current note"
|
||||
msgstr "Căutați în toate notițele"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Vizualizați"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -620,7 +626,8 @@ msgstr ""
|
||||
msgid "Focus"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Unelte"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -635,7 +642,8 @@ msgstr "Opțiuni de criptare"
|
||||
msgid "General Options"
|
||||
msgstr "Opțiuni Generale"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Ajutor"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -678,11 +686,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1028,7 +1036,15 @@ msgstr "Opțiuni de criptare"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Opțiuni Clipper"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1040,9 +1056,6 @@ msgstr "Ștergeți"
|
||||
msgid "Rename"
|
||||
msgstr "Redenumiți"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sincronizați"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Caiete de notițe"
|
||||
|
||||
@@ -1057,6 +1070,9 @@ msgstr "Resurse: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Adăugați ori eliminați etichete"
|
||||
|
||||
@@ -1200,6 +1216,12 @@ msgstr "Criptat"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Itemii criptați nu pot fi editați"
|
||||
|
||||
msgid "title"
|
||||
msgstr "titlu"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data actualizării"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Conflicte"
|
||||
|
||||
@@ -1210,12 +1232,6 @@ msgstr "Nu se poate muta caietul de notițe în această locație"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr ""
|
||||
|
||||
msgid "title"
|
||||
msgstr "titlu"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data actualizării"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "data creării"
|
||||
|
||||
@@ -1260,6 +1276,10 @@ msgstr "Sortați notițele după"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Inversați ordinea sortării"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Sortați notițele după"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Salvați geo-locația în notițe"
|
||||
|
||||
@@ -1437,6 +1457,9 @@ msgstr ""
|
||||
msgid "Json Export Directory"
|
||||
msgstr ""
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fișier"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr ""
|
||||
|
||||
@@ -1609,10 +1632,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Website Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Website Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1709,6 +1728,9 @@ msgstr "Vizualizați pe hartă"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Editați"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Ștergeți caiet de notițe"
|
||||
|
||||
@@ -1732,6 +1754,10 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Bine ați venit"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Website Joplin"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Statut: %s."
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -123,9 +123,10 @@ msgstr "Označi seznam opravil kot končan."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Zabeležka ni formata seznam opravil: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Upravlja z E2EE nastavitvami. Ukazi so `enable`, `disable`, `decrypt`, "
|
||||
"`status` in `target-status`."
|
||||
@@ -603,7 +604,8 @@ msgstr "Uvažam v \"%s\" kot \"%s\" format. Prosim počakajte..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF datoteka"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
msgid "New note"
|
||||
@@ -621,6 +623,9 @@ msgstr "Uvozi"
|
||||
msgid "Export"
|
||||
msgstr "Izvozi"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sinhroniziraj"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Natisni"
|
||||
|
||||
@@ -631,7 +636,8 @@ msgstr "Skrij %s"
|
||||
msgid "Quit"
|
||||
msgstr "Izhod"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Uredi"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -669,7 +675,8 @@ msgstr "Išči znotraj vseh zabeležk"
|
||||
msgid "Search in current note"
|
||||
msgstr "Išči znotraj vseh zabeležk"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Pogled"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -682,7 +689,8 @@ msgstr "Spremeni izgled urejevalnika"
|
||||
msgid "Focus"
|
||||
msgstr "Fokusiraj vsebino"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Orodja"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -697,7 +705,8 @@ msgstr "Možnosti enkripcije"
|
||||
msgid "General Options"
|
||||
msgstr "Splošne možnosti"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Pomoč"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -740,11 +749,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Posodobitev je na voljo, jo želite prenesti sedaj?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1116,7 +1125,17 @@ msgstr "Možnosti enkripcije"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Splošne možnosti"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Želite izbrisati beležnico? Vse zabeležke znotraj beležke bodo hkrati "
|
||||
"izbrisane."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Odstranite to oznako iz vseh zabeležk?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1128,9 +1147,6 @@ msgstr "Izbriši"
|
||||
msgid "Rename"
|
||||
msgstr "Preimenuj"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Sinhroniziraj"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Beležnice"
|
||||
|
||||
@@ -1145,6 +1161,9 @@ msgstr "Viri: %d."
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Prosim izberite, kam želite izvoziti sinhronizacijski status"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Dodaj ali odstrani oznake"
|
||||
|
||||
@@ -1297,6 +1316,14 @@ msgstr "Enkriptirano"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Enkriptirani predmeti ne morejo biti spremenjeni"
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Neimenovano"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Posodobljeno: %d."
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Konfikti"
|
||||
|
||||
@@ -1308,14 +1335,6 @@ msgstr "Ni moč premakniti zabeležke v \"%s\" beležnico"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "Beležnica ne more biti imenovana \"%s\", ker je to rezerviran naslov."
|
||||
|
||||
#, fuzzy
|
||||
msgid "title"
|
||||
msgstr "Neimenovano"
|
||||
|
||||
#, fuzzy
|
||||
msgid "updated date"
|
||||
msgstr "Posodobljeno: %d."
|
||||
|
||||
#, fuzzy
|
||||
msgid "created date"
|
||||
msgstr "Ustvarjeno: %d."
|
||||
@@ -1362,6 +1381,10 @@ msgstr "Razporedi zabeležko po"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Obrni vrstni red"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Razporedi zabeležko po"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Shrani geo-lokacijo z zabeležkami"
|
||||
|
||||
@@ -1551,6 +1574,9 @@ msgstr "Evernote izvozna datoteka"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin izvozno mesto"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Mesto datoteke"
|
||||
|
||||
@@ -1731,10 +1757,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin spletna stran"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin spletna stran"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1832,6 +1854,9 @@ msgstr "Prikaži na zemljevidu"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Uredi"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Izbriši beležnico"
|
||||
|
||||
@@ -1854,6 +1879,10 @@ msgstr "Trenutno nimate nobene beležnice. Ustvarite jo s klikom na (+) gumb."
|
||||
msgid "Welcome"
|
||||
msgstr "Dobrodošli"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin spletna stran"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Stanje: %s."
|
||||
|
||||
|
@@ -124,9 +124,10 @@ msgstr "Märker en att-göra som gjord."
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "Anteckning är inte en att-göra: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"Hanterar E2EE-konfiguration. Kommandon är `enable`,` disable`, `decrypt`,` "
|
||||
"status` och `target-status`."
|
||||
@@ -607,7 +608,8 @@ msgstr "Importerar från \"%s\" som \"%s\" format. Vänta..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-fil"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Fil"
|
||||
|
||||
msgid "New note"
|
||||
@@ -625,6 +627,9 @@ msgstr "Importera"
|
||||
msgid "Export"
|
||||
msgstr "Exportera"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synkronisera"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Skriv ut"
|
||||
|
||||
@@ -635,7 +640,8 @@ msgstr "Dölj %s"
|
||||
msgid "Quit"
|
||||
msgstr "Avsluta"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Redigera"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -671,7 +677,8 @@ msgstr "Sök i alla anteckningarna"
|
||||
msgid "Search in current note"
|
||||
msgstr "Sök i aktuell anteckning"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "Visa"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -683,7 +690,8 @@ msgstr "Växla redigeringslayout"
|
||||
msgid "Focus"
|
||||
msgstr "Fokus"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Verktyg"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -698,7 +706,8 @@ msgstr "Krypteringsinställningar"
|
||||
msgid "General Options"
|
||||
msgstr "Allmänna inställningar"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Hjälp"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -741,12 +750,12 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "En uppdatering är tillgänglig, vill du hämta den nu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "Din version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr "Din version: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "Ny version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr "Ny version: %s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
@@ -1119,7 +1128,17 @@ msgstr "Krypteringsinställningar"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Clipper-inställningar"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Ta bort anteckningsboken? Alla anteckningar och delanteckningsböcker i den "
|
||||
"här anteckningsboken tas bort också."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Ta bort den här taggen från alla anteckningar?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1131,9 +1150,6 @@ msgstr "Ta bort"
|
||||
msgid "Rename"
|
||||
msgstr "Byt namn"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Synkronisera"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Anteckningsböcker"
|
||||
|
||||
@@ -1148,6 +1164,9 @@ msgstr "Hämtar resurser: %d"
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Välj vart synkroniseringstillståndet ska exporteras till"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Lägg till eller ta bort taggar"
|
||||
|
||||
@@ -1298,6 +1317,12 @@ msgstr "Krypterad"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Krypterade objekt kan inte ändras"
|
||||
|
||||
msgid "title"
|
||||
msgstr "titel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "uppdaterad datum"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "Konflikter"
|
||||
|
||||
@@ -1309,12 +1334,6 @@ msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr ""
|
||||
"Anteckningsböcker kan inte namnges \"%s\", vilket är en reserverad titel."
|
||||
|
||||
msgid "title"
|
||||
msgstr "titel"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "uppdaterad datum"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "skapad datum"
|
||||
|
||||
@@ -1359,6 +1378,10 @@ msgstr "Sortera anteckningar efter"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Omvänd sorteringsordning"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Sortera anteckningar efter"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Spara geolokalisering med anteckningar"
|
||||
|
||||
@@ -1553,6 +1576,9 @@ msgstr "Evernote-exporteringsfil"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin-exportkatalog"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Fil"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Katalog"
|
||||
|
||||
@@ -1745,10 +1771,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin-webbplats"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Databas v%s"
|
||||
@@ -1845,6 +1867,9 @@ msgstr "Visa på karta"
|
||||
msgid "Go to source URL"
|
||||
msgstr "Gå till källans URL"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Redigera"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Ta bort anteckningsbok"
|
||||
|
||||
@@ -1870,6 +1895,9 @@ msgstr ""
|
||||
msgid "Welcome"
|
||||
msgstr "Välkommen"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "Tillstånd: %s."
|
||||
|
||||
|
@@ -126,7 +126,7 @@ msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter master password:"
|
||||
@@ -139,6 +139,8 @@ msgid ""
|
||||
"Starting decryption... Please wait as it may take several minutes depending "
|
||||
"on how much there is to decrypt."
|
||||
msgstr ""
|
||||
"Şifre çözme başlatılıyor... Çözülecek dosya sayısına bağlı olarak biraz "
|
||||
"zaman alabilir, lütfen bekleyiniz."
|
||||
|
||||
msgid "Completed decryption."
|
||||
msgstr "Şifre çözümü tamamlandı."
|
||||
@@ -159,6 +161,8 @@ msgstr "Notu düzenle."
|
||||
msgid ""
|
||||
"No text editor is defined. Please set it using `config editor <editor-path>`"
|
||||
msgstr ""
|
||||
"Hiçbir metin editörü tanımlanmadı. Lütfen `config editor <editor-path>` ı "
|
||||
"kullanarak editörü ayarlayınız."
|
||||
|
||||
msgid "No active notebook."
|
||||
msgstr "Aktif not defteri yok."
|
||||
@@ -172,7 +176,7 @@ msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Error opening note in editor: %s"
|
||||
msgstr ""
|
||||
msgstr "Editörde not açılırken hata oluştu: %s"
|
||||
|
||||
msgid "Note has been saved."
|
||||
msgstr "Not kaydedildi."
|
||||
@@ -228,7 +232,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
msgid "To move from one pane to another, press Tab or Shift+Tab."
|
||||
msgstr ""
|
||||
msgstr "Bir bölmeden diğerine geçmek için Tab veya Shift+Tab tuşlarına basın."
|
||||
|
||||
msgid ""
|
||||
"Use the arrows and page up/down to scroll the lists and text areas "
|
||||
@@ -236,13 +240,13 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
msgid "To maximise/minimise the console, press \"tc\"."
|
||||
msgstr ""
|
||||
msgstr "Konsolu büyütmek/küçültmek için, \"tc\" ye basınız."
|
||||
|
||||
msgid "To enter command line mode, press \":\""
|
||||
msgstr "Komut satırı moduna girmek için \":\" e basın"
|
||||
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr ""
|
||||
msgstr "Komut satırı modundan çıkmak için ESC tuşuna basın."
|
||||
|
||||
msgid ""
|
||||
"For the list of keyboard shortcuts and config options, type `help keymap`"
|
||||
@@ -270,7 +274,7 @@ msgstr "Yaratıldı: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Updated: %d."
|
||||
msgstr "Güncellendi: %d."
|
||||
msgstr "Güncellenme: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Skipped: %d."
|
||||
@@ -295,12 +299,16 @@ msgid ""
|
||||
"Displays the notes in the current notebook. Use `ls /` to display the list "
|
||||
"of notebooks."
|
||||
msgstr ""
|
||||
"Geçerli not defterindeki notları görüntüler. Not defteri listesini "
|
||||
"görüntülemek için `ls /` kullanın."
|
||||
|
||||
msgid "Displays only the first top <num> notes."
|
||||
msgstr ""
|
||||
msgstr "Yalnızca ilk üstteki <num> notlarını görüntüler."
|
||||
|
||||
msgid "Sorts the item by <field> (eg. title, updated_time, created_time)."
|
||||
msgstr ""
|
||||
"Öğeyi <field> olarak sıralar (örneğin, başlık, güncellenme_zamanı, "
|
||||
"oluşturulma_zamanı)."
|
||||
|
||||
msgid "Reverses the sorting order."
|
||||
msgstr "Sıralama düzenini tersine çevirir."
|
||||
@@ -312,7 +320,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
msgid "Either \"text\" or \"json\""
|
||||
msgstr ""
|
||||
msgstr "\"metin\" ya da \"json\""
|
||||
|
||||
msgid ""
|
||||
"Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, "
|
||||
@@ -366,7 +374,7 @@ msgid "Delete note?"
|
||||
msgstr "Notu sil?"
|
||||
|
||||
msgid "Searches for the given <pattern> in all the notes."
|
||||
msgstr ""
|
||||
msgstr "Tüm notlarda girilen <pattern> i arar."
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -384,10 +392,12 @@ msgstr "Uzak depolama ile senkronize eder."
|
||||
|
||||
msgid "Sync to provided target (defaults to sync.target config value)"
|
||||
msgstr ""
|
||||
"Sağlanan hedefe senkronize et (varsayılan olarak sync.target değeri "
|
||||
"kullanılır)"
|
||||
|
||||
msgid ""
|
||||
"Authentication was not completed (did not receive an authentication token)."
|
||||
msgstr ""
|
||||
msgstr "Yetkilendirme tamamlanmadı (yetkilendirme anahtarı karşılanmadı)"
|
||||
|
||||
msgid ""
|
||||
"To allow Joplin to synchronise with Dropbox, please follow the steps below:"
|
||||
@@ -403,7 +413,7 @@ msgstr "Adım 2: Dropbox tarafından sağlanan kodu girin:"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Not authentified with %s. Please provide any missing credentials."
|
||||
msgstr ""
|
||||
msgstr "%s ile doğrulama sağlanamadı. Lütfen eksik olan tüm bilgileri girin."
|
||||
|
||||
msgid "Synchronisation is already in progress."
|
||||
msgstr "Senkronizasyon zaten devam ediyor."
|
||||
@@ -414,6 +424,8 @@ msgid ""
|
||||
"taking place, you may delete the lock file at \"%s\" and resume the "
|
||||
"operation."
|
||||
msgstr ""
|
||||
"Kilit dosyası zaten tutuluyor. Eşitleme yapılmadığını biliyorsanız, kilit "
|
||||
"dosyasını \"%s\" konumunda silebilir ve işleme devam edebilirsiniz."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation target: %s (%s)"
|
||||
@@ -449,19 +461,21 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
msgid "Marks a to-do as non-completed."
|
||||
msgstr ""
|
||||
msgstr "Yapılacağı tamamlanmamış olarak işaretler."
|
||||
|
||||
msgid ""
|
||||
"Switches to [notebook] - all further operations will happen within this "
|
||||
"notebook."
|
||||
msgstr ""
|
||||
"[notebook] 'a geçer - daha sonraki tüm işlemler bu not defterinde "
|
||||
"gerçekleşecektir."
|
||||
|
||||
msgid "Displays version information"
|
||||
msgstr "Sürüm bilgisini görüntüler"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s %s (%s)"
|
||||
msgstr ""
|
||||
msgstr "%s %s (%s)"
|
||||
|
||||
msgid "Enum"
|
||||
msgstr "Enum"
|
||||
@@ -502,6 +516,11 @@ msgid ""
|
||||
"any files outside this directory nor to any other personal data. No data "
|
||||
"will be shared with any third party."
|
||||
msgstr ""
|
||||
"Lütfen uygulamayı doğrulamak için tarayıcınızda aşağıdaki URL'yi açın. "
|
||||
"Uygulama \"Uygulamalar/Joplin\" de bir dizin oluşturacak ve sadece bu "
|
||||
"dizindeki dosyaları okuyacak ve yazacaktır. Bu dizin dışındaki hiçbir "
|
||||
"dosyaya veya diğer kişisel verilere erişemeyecektir. Hiçbir veri üçüncü "
|
||||
"şahıslarla paylaşılmayacaktır."
|
||||
|
||||
msgid "Search:"
|
||||
msgstr "Ara:"
|
||||
@@ -556,7 +575,8 @@ msgstr "\"%s\" den \"%s\" biçiminde içe aktarılıyor. Lütfen bekleyin..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF Dosyası"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "Dosya"
|
||||
|
||||
msgid "New note"
|
||||
@@ -574,8 +594,11 @@ msgstr "İçe aktar"
|
||||
msgid "Export"
|
||||
msgstr "Dışa aktar"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Senkronize"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Yazır"
|
||||
msgstr "Yazdır"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -584,7 +607,8 @@ msgstr "Gizle %s"
|
||||
msgid "Quit"
|
||||
msgstr "Çıkış"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "Düzenle"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -620,7 +644,8 @@ msgstr "Tüm notlarda ara"
|
||||
msgid "Search in current note"
|
||||
msgstr "Mevcut notta ara"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "İncele"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -632,14 +657,15 @@ msgstr "Editör düzenini aç / kapat"
|
||||
msgid "Focus"
|
||||
msgstr "Odaklan"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "Araçlar"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
msgstr "Senkronizasyon durumu"
|
||||
|
||||
msgid "Web clipper options"
|
||||
msgstr ""
|
||||
msgstr "Web alıntılama ayarları"
|
||||
|
||||
msgid "Encryption options"
|
||||
msgstr "Şifreleme seçenekleri"
|
||||
@@ -647,7 +673,8 @@ msgstr "Şifreleme seçenekleri"
|
||||
msgid "General Options"
|
||||
msgstr "Genel seçenekler"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "Yardım"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -690,12 +717,12 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Güncelleme mevcut, şimdi indirmek ister misiniz?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "Sürümün: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr "Sürümün: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "Yeni sürüm: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr "Yeni sürüm: %s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Evet"
|
||||
@@ -704,10 +731,11 @@ msgid "No"
|
||||
msgstr "Hayır"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr ""
|
||||
msgstr "Anahtar panoya kopyalandı!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr ""
|
||||
"Web alıntılama servisi aktif edildi ve otomatik başlatılması için ayarlandı."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Status: Started on port %d"
|
||||
@@ -718,24 +746,26 @@ msgid "Status: %s"
|
||||
msgstr "Durum: %s"
|
||||
|
||||
msgid "Disable Web Clipper Service"
|
||||
msgstr ""
|
||||
msgstr "Web Alıntılama Servisini Kapat"
|
||||
|
||||
msgid "The web clipper service is not enabled."
|
||||
msgstr ""
|
||||
msgstr "Web alıntılama servisi aktif edilmedi."
|
||||
|
||||
msgid "Enable Web Clipper Service"
|
||||
msgstr ""
|
||||
msgstr "Web Alıntılama Servisini Aç"
|
||||
|
||||
msgid ""
|
||||
"Joplin Web Clipper allows saving web pages and screenshots from your browser "
|
||||
"to Joplin."
|
||||
msgstr ""
|
||||
"Joplin Web Alıntılama, tarayıcınızdaki web sayfalarını ve ekran "
|
||||
"görüntülerini Joplin'e kaydetmenizi sağlar."
|
||||
|
||||
msgid "In order to use the web clipper, you need to do the following:"
|
||||
msgstr ""
|
||||
msgstr "Web alıntı aracını kullanmak için aşağıdakileri yapmanız gerekir:"
|
||||
|
||||
msgid "Step 1: Enable the clipper service"
|
||||
msgstr ""
|
||||
msgstr "Adım 1: Alıntılama servisini aktif et"
|
||||
|
||||
msgid ""
|
||||
"This service allows the browser extension to communicate with Joplin. When "
|
||||
@@ -756,10 +786,10 @@ msgid "Advanced options"
|
||||
msgstr "Gelişmiş seçenekler"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr ""
|
||||
msgstr "Yetkilendirme anahtarı:"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr ""
|
||||
msgstr "Anahtarı kopyala"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
@@ -802,6 +832,11 @@ 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 ""
|
||||
"Şifrelemeyi aktif etmek *tüm* notlarınızın ve eklerinizin yeniden senkronize "
|
||||
"edileceği ve senkronizasyon hedefine şifrelenmiş olarak gönderileceği "
|
||||
"anlamına gelir. Şifrenizi kaybetmeyin, verilerinizin şifresini çözmenin "
|
||||
"\"*tek yolu* bu şifreyi girmek olacaktır. Şifrelemeyi etkinleştirmek için "
|
||||
"lütfen şifrenizi aşağıya girin."
|
||||
|
||||
msgid "Disable encryption"
|
||||
msgstr "Şifrelemeyi devre dışı bırak"
|
||||
@@ -969,6 +1004,8 @@ msgid ""
|
||||
"This note has no content. Click on \"%s\" to toggle the editor and edit the "
|
||||
"note."
|
||||
msgstr ""
|
||||
"Bu nota içerik girilmemiş. Editöre geçiş yapıp notu düzenlemek için \"%s\" "
|
||||
"butonuna tıklayın."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
@@ -998,7 +1035,7 @@ msgstr "Alarm kur"
|
||||
|
||||
#, javascript-format
|
||||
msgid "In: %s"
|
||||
msgstr ""
|
||||
msgstr "İçinde: %s"
|
||||
|
||||
msgid "Hyperlink"
|
||||
msgstr "Köprü"
|
||||
@@ -1059,9 +1096,18 @@ msgid "Encryption Options"
|
||||
msgstr "Şifreleme Seçenekleri"
|
||||
|
||||
msgid "Clipper Options"
|
||||
msgstr ""
|
||||
msgstr "Alıntılama Seçenekleri"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"Not defterini sil? Bu defterdeki tüm notlar ve alt defterler de silinecek."
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "Bu etiket tüm notlardan kaldırılsın mı?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1073,9 +1119,6 @@ msgstr "Sil"
|
||||
msgid "Rename"
|
||||
msgstr "Yeniden adlandır"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "Senkronize"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "Not defterleri"
|
||||
|
||||
@@ -1090,17 +1133,20 @@ msgstr "Kaynaklar alınıyor: %d"
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "Lütfen senkronizasyon durumunun nereye aktarılacağını seçin"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Add or remove tags"
|
||||
msgstr "Etiket ekle veya kaldır:"
|
||||
msgstr "Etiket ekle veya kaldır"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Duplicate"
|
||||
msgstr "Uygulama"
|
||||
msgstr "Tekrarla"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "Kopyala"
|
||||
msgstr "%s - Kopyala"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr ""
|
||||
@@ -1116,11 +1162,11 @@ msgstr "Markdown bağlantısını kopyala"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "Notu sil?"
|
||||
msgstr "\"%s\" Notunu sil?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "Bu notlar silinsin mi?"
|
||||
msgstr "Bu notlar ( %d ) silinsin mi?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
@@ -1128,7 +1174,7 @@ msgstr "Kullanım: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unknown flag: %s"
|
||||
msgstr ""
|
||||
msgstr "Bilinmeyen etiket: %s"
|
||||
|
||||
msgid "Dropbox"
|
||||
msgstr "Dropbox"
|
||||
@@ -1150,16 +1196,18 @@ msgstr "WebDAV"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unknown log level: %s"
|
||||
msgstr ""
|
||||
msgstr "Bilinmeyen log seviyesi: %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unknown level ID: %s"
|
||||
msgstr ""
|
||||
msgstr "Bilinmeyen ID seviyesi: %s"
|
||||
|
||||
msgid ""
|
||||
"Cannot refresh token: authentication data is missing. Starting the "
|
||||
"synchronisation again may fix the problem."
|
||||
msgstr ""
|
||||
"Anahtar yenilenemiyor: kimlik doğrulama verileri eksik. Senkronizasyonu "
|
||||
"tekrar başlatmak sorunu çözebilir."
|
||||
|
||||
msgid "Untitled"
|
||||
msgstr "Başlıksız"
|
||||
@@ -1172,6 +1220,12 @@ msgid ""
|
||||
"\n"
|
||||
"Please consider using a regular OneDrive account."
|
||||
msgstr ""
|
||||
"OneDrive ile senkronize edilemedi.\n"
|
||||
"\n"
|
||||
"Ne yazık ki bu hata genelde desteklenemeyen OneDrive İş'i kullanırken "
|
||||
"meydana gelir.\n"
|
||||
"\n"
|
||||
"Lütfen normal bir OneDrive hesabı kullanmayı deneyin."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot access %s"
|
||||
@@ -1179,31 +1233,31 @@ msgstr "%s erişilemiyor"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Created local items: %d."
|
||||
msgstr ""
|
||||
msgstr "Oluşturulan yerel öğeler: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Updated local items: %d."
|
||||
msgstr ""
|
||||
msgstr "Güncellenen yerel öğeler: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Created remote items: %d."
|
||||
msgstr ""
|
||||
msgstr "Oluşturulan uzak öğeler: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Updated remote items: %d."
|
||||
msgstr ""
|
||||
msgstr "Güncellenen uzak öğeler: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Deleted local items: %d."
|
||||
msgstr ""
|
||||
msgstr "Silinen yerel öğeler: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Deleted remote items: %d."
|
||||
msgstr ""
|
||||
msgstr "Silinen uzaktaki öğeler: %d."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Fetched items: %d/%d."
|
||||
msgstr ""
|
||||
msgstr "Alınan öğeler: %d/%d."
|
||||
|
||||
msgid "Cancelling..."
|
||||
msgstr "İptal ediliyor..."
|
||||
@@ -1217,14 +1271,14 @@ msgid "Last error: %s"
|
||||
msgstr "Son hata: %s"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr ""
|
||||
msgstr "Boşta"
|
||||
|
||||
msgid "In progress"
|
||||
msgstr "Devam etmekte"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Synchronisation is already in progress. State: %s"
|
||||
msgstr ""
|
||||
msgstr "Senkronizasyon zaten devam ediyor. Durum: %s"
|
||||
|
||||
msgid "Encrypted"
|
||||
msgstr "Şifrelenmiş"
|
||||
@@ -1232,21 +1286,21 @@ msgstr "Şifrelenmiş"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "Şifrelenmiş öğeler değiştirilemez"
|
||||
|
||||
msgid "title"
|
||||
msgstr "başlık"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "güncelleme zamanı"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr ""
|
||||
msgstr "Çakışmalar"
|
||||
|
||||
msgid "Cannot move notebook to this location"
|
||||
msgstr "Not defteri bu konuma taşınamıyor"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr ""
|
||||
|
||||
msgid "title"
|
||||
msgstr "başlık"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "güncelleme zamanı"
|
||||
msgstr "Not defterine ayrılmış bir başlık adı olan \"%s\" adı verilemez."
|
||||
|
||||
msgid "created date"
|
||||
msgstr "oluşturma zamanı"
|
||||
@@ -1281,10 +1335,10 @@ msgid "Dark"
|
||||
msgstr "Karanlık"
|
||||
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr ""
|
||||
msgstr "Tamamlanmamış yap-list yukarıda"
|
||||
|
||||
msgid "Show completed to-dos"
|
||||
msgstr ""
|
||||
msgstr "Tamamlanan yap-lis göster"
|
||||
|
||||
msgid "Sort notes by"
|
||||
msgstr "Notları sırala"
|
||||
@@ -1292,17 +1346,21 @@ msgstr "Notları sırala"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "Sıralamayı değiştir"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "Notları sırala"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "Coğrafi konumu notlarla kaydedin"
|
||||
|
||||
msgid "When creating a new to-do:"
|
||||
msgstr ""
|
||||
msgstr "Yeni bir yapılacak oluşturulurken:"
|
||||
|
||||
msgid "Focus title"
|
||||
msgstr ""
|
||||
msgstr "Başlığa odaklan"
|
||||
|
||||
msgid "Focus body"
|
||||
msgstr ""
|
||||
msgstr "Gövde kısmına odaklan"
|
||||
|
||||
msgid "When creating a new note:"
|
||||
msgstr "Yeni bir not oluştururken:"
|
||||
@@ -1338,6 +1396,9 @@ 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 ""
|
||||
"Bu font *monospace* olmalıdır, aksi halde düzgün çalışmayacaktır. Yazı tipi "
|
||||
"yanlış seçilmiş veya boş bırakılmışsa, varsayılan monospace yazı tipi "
|
||||
"kullanılacaktır."
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Uygulamayı otomatik olarak güncelle"
|
||||
@@ -1481,6 +1542,9 @@ msgstr "Evernote Dosya Dışa Aktarım"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Json Dışa Aktarım Dizini"
|
||||
|
||||
msgid "File"
|
||||
msgstr "Dosya"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Dizin"
|
||||
|
||||
@@ -1535,7 +1599,7 @@ msgstr "Toplam: %d/%d"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Conflicted: %d"
|
||||
msgstr "Çelişki: %d"
|
||||
msgstr "Çakışan: %d"
|
||||
|
||||
#, javascript-format
|
||||
msgid "To delete: %d"
|
||||
@@ -1668,10 +1732,6 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin Web Sitesi"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Veritabanı v%s"
|
||||
@@ -1692,7 +1752,7 @@ msgstr "Ana Şifre %s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Created: %s"
|
||||
msgstr "Oluşturuldu: %s"
|
||||
msgstr "Oluşturulma: %s"
|
||||
|
||||
msgid "Password:"
|
||||
msgstr "Şifre:"
|
||||
@@ -1768,6 +1828,9 @@ msgstr "Haritada gör"
|
||||
msgid "Go to source URL"
|
||||
msgstr "URL kaynağına git"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "Düzenle"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Not defterini sil"
|
||||
|
||||
@@ -1790,3 +1853,6 @@ msgstr ""
|
||||
|
||||
msgid "Welcome"
|
||||
msgstr "Hoşgeldiniz"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
@@ -123,10 +123,10 @@ msgstr "笔记非待办事项:\"%s\""
|
||||
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"管理E2EE配置。命令为:`enable`, `disable`, `decrypt`, `status` 和 `target-"
|
||||
"status`。"
|
||||
"管理 E2EE 配置。命令为:`enable`、`disable`、`decrypt`、`status、`decrypt-"
|
||||
"file` 和 `target-status`。"
|
||||
|
||||
msgid "Enter master password:"
|
||||
msgstr "输入主密码:"
|
||||
@@ -138,7 +138,7 @@ msgid ""
|
||||
"Starting decryption... Please wait as it may take several minutes depending "
|
||||
"on how much there is to decrypt."
|
||||
msgstr ""
|
||||
"开始解密... 请稍后。因解密环节取决于需解密的文件数量,可能需要等待几分钟。"
|
||||
"开始解密,请稍候... 取决于需解密的文件数量,解密环节可能需要等待几分钟。"
|
||||
|
||||
msgid "Completed decryption."
|
||||
msgstr "已完成解密。"
|
||||
@@ -151,7 +151,7 @@ msgstr "已禁用"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Encryption is: %s"
|
||||
msgstr "加密为:%s"
|
||||
msgstr "加密状态:%s"
|
||||
|
||||
msgid "Edit note."
|
||||
msgstr "编辑笔记。"
|
||||
@@ -201,7 +201,7 @@ msgid "Displays a geolocation URL for the note."
|
||||
msgstr "显示该笔记的地理定位 URL 地址。"
|
||||
|
||||
msgid "Displays usage information."
|
||||
msgstr "显示用量信息。"
|
||||
msgstr "显示用法提示。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "For information on how to customise the shortcuts please visit %s"
|
||||
@@ -215,7 +215,7 @@ msgid ""
|
||||
"all` for the complete usage information."
|
||||
msgstr ""
|
||||
"输入 `help [command]` 来获取有关该命令的更多信息;或输入 `help all` 获取完整"
|
||||
"的使用说明。"
|
||||
"的用法提示。"
|
||||
|
||||
msgid "The possible commands are:"
|
||||
msgstr "可用的命令有:"
|
||||
@@ -240,7 +240,7 @@ msgid "To maximise/minimise the console, press \"tc\"."
|
||||
msgstr "按 \"TC\" 最大化/最小化控制台。"
|
||||
|
||||
msgid "To enter command line mode, press \":\""
|
||||
msgstr "按 \":\" 键进入命令行模式"
|
||||
msgstr "按“:”键进入命令行模式"
|
||||
|
||||
msgid "To exit command line mode, press ESCAPE"
|
||||
msgstr "按 ESC 键退出命令行模式"
|
||||
@@ -363,7 +363,7 @@ msgstr "删除笔记(不要求确认)。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%d notes match this pattern. Delete them?"
|
||||
msgstr "有%d条笔记符合此模式。是否删除?"
|
||||
msgstr "有 %d 条笔记匹配。是否删除?"
|
||||
|
||||
msgid "Delete note?"
|
||||
msgstr "是否删除笔记?"
|
||||
@@ -397,7 +397,7 @@ 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 "步骤一:在浏览器中打开此 URL 来授权应用程序:"
|
||||
@@ -407,10 +407,10 @@ msgstr "步骤二:输入 Dropbox 提供的代码:"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Not authentified with %s. Please provide any missing credentials."
|
||||
msgstr "%s 并未被验证。请提供缺少的凭证。"
|
||||
msgstr "未授予 %s 的权限。请提供缺少的凭据。"
|
||||
|
||||
msgid "Synchronisation is already in progress."
|
||||
msgstr "同步已在进行中。"
|
||||
msgstr "已经在同步。"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -435,7 +435,7 @@ msgid "Downloading resources..."
|
||||
msgstr "下载资源中..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "正在取消... 请稍后。"
|
||||
msgstr "正在取消... 请稍候。"
|
||||
|
||||
msgid ""
|
||||
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
||||
@@ -501,10 +501,10 @@ 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 "
|
||||
@@ -566,8 +566,8 @@ msgstr "从 \"%s\" 导入,导入格式为 \"%s\" 。请稍等…"
|
||||
msgid "PDF File"
|
||||
msgstr "PDF 文件"
|
||||
|
||||
msgid "File"
|
||||
msgstr "文件"
|
||||
msgid "&File"
|
||||
msgstr "文件 (&F)"
|
||||
|
||||
msgid "New note"
|
||||
msgstr "新建笔记"
|
||||
@@ -584,6 +584,9 @@ msgstr "导入"
|
||||
msgid "Export"
|
||||
msgstr "导出"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "同步"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "打印"
|
||||
|
||||
@@ -594,8 +597,8 @@ msgstr "隐藏 %s"
|
||||
msgid "Quit"
|
||||
msgstr "退出"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "编辑"
|
||||
msgid "&Edit"
|
||||
msgstr "编辑 (&E)"
|
||||
|
||||
msgid "Copy"
|
||||
msgstr "复制"
|
||||
@@ -610,13 +613,13 @@ msgid "Select all"
|
||||
msgstr "全选"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "粗体"
|
||||
msgstr "加粗"
|
||||
|
||||
msgid "Italic"
|
||||
msgstr "斜体"
|
||||
|
||||
msgid "Link"
|
||||
msgstr ""
|
||||
msgstr "链接"
|
||||
|
||||
msgid "Insert Date Time"
|
||||
msgstr "插入时间"
|
||||
@@ -630,8 +633,8 @@ msgstr "在所有笔记内搜索"
|
||||
msgid "Search in current note"
|
||||
msgstr "在当前笔记内搜索"
|
||||
|
||||
msgid "View"
|
||||
msgstr "视图"
|
||||
msgid "&View"
|
||||
msgstr "界面 (&V)"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr "切换边栏"
|
||||
@@ -642,8 +645,8 @@ msgstr "切换编辑器布局"
|
||||
msgid "Focus"
|
||||
msgstr "聚焦于"
|
||||
|
||||
msgid "Tools"
|
||||
msgstr "工具"
|
||||
msgid "&Tools"
|
||||
msgstr "工具 (&T)"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
msgstr "同步状态"
|
||||
@@ -657,8 +660,8 @@ msgstr "加密选项"
|
||||
msgid "General Options"
|
||||
msgstr "通用选项"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "帮助"
|
||||
msgid "&Help"
|
||||
msgstr "帮助 (&H)"
|
||||
|
||||
msgid "Website and documentation"
|
||||
msgstr "网站与文档"
|
||||
@@ -700,12 +703,12 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "有更新可用,是否现在进行下载?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "您的版本:v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr "您的版本:%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "最新版本:v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr "最新版本:%s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "是"
|
||||
@@ -714,10 +717,10 @@ msgid "No"
|
||||
msgstr "否"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr "Token 令牌已被复制到剪贴板!"
|
||||
msgstr "Token 令牌已复制到剪贴板!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr "网页剪辑服务已启用并设置为自动启动。"
|
||||
msgstr "网页剪辑服务已启用且将自动启动。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Status: Started on port %d"
|
||||
@@ -822,7 +825,7 @@ msgid "Master Keys"
|
||||
msgstr "主密码"
|
||||
|
||||
msgid "Active"
|
||||
msgstr "活动状态"
|
||||
msgstr "正在使用"
|
||||
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
@@ -847,11 +850,11 @@ msgid ""
|
||||
"as \"active\"). Any of the keys might be used for decryption, depending on "
|
||||
"how the notes or notebooks were originally encrypted."
|
||||
msgstr ""
|
||||
"注意:仅有一个主密码可用于加密(被标记为 \"active\" 的主密码)。但列出的任何"
|
||||
"密码都可用于解密,这取决于笔记或笔记本最初是如何加密的。"
|
||||
"注意:仅有一个主密码会用于加密(被标记为“正在使用”的主密码)。但列出的所有密"
|
||||
"码都可用于解密,这取决于笔记或笔记本最初是如何加密的。"
|
||||
|
||||
msgid "Missing Master Keys"
|
||||
msgstr "缺失主密码"
|
||||
msgstr "缺少主密码"
|
||||
|
||||
msgid ""
|
||||
"The master keys with these IDs are used to encrypt some of your items, "
|
||||
@@ -870,10 +873,10 @@ msgid "Status"
|
||||
msgstr "状态"
|
||||
|
||||
msgid "Encryption is:"
|
||||
msgstr "加密为:"
|
||||
msgstr "加密状态:"
|
||||
|
||||
msgid "Usage"
|
||||
msgstr "使用量"
|
||||
msgstr "用法提示"
|
||||
|
||||
msgid "Back"
|
||||
msgstr "返回"
|
||||
@@ -881,7 +884,7 @@ msgstr "返回"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"New notebook \"%s\" will be created and file \"%s\" will be imported into it"
|
||||
msgstr "将新建的笔记本 \"%s\" 和文件 \"%s\" 导入到其中"
|
||||
msgstr "将新建的笔记本“%s”,并将文件 \"%s\" 导入其中"
|
||||
|
||||
msgid "Please create a notebook first."
|
||||
msgstr "请先创建笔记本。"
|
||||
@@ -896,7 +899,7 @@ msgid "Add or remove tags:"
|
||||
msgstr "添加或删除标签:"
|
||||
|
||||
msgid "Separate each tag by a comma."
|
||||
msgstr "用半角逗号 \",\" 分开每个标签。"
|
||||
msgstr "用半角逗号“,”分开每个标签。"
|
||||
|
||||
msgid "Rename notebook:"
|
||||
msgstr "重命名笔记本:"
|
||||
@@ -958,7 +961,7 @@ msgid "Copy Link Address"
|
||||
msgstr "复制链接地址"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr "该附件没有下载或者没有解密"
|
||||
msgstr "该附件没有下载或者尚未解密。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1059,11 +1062,22 @@ msgstr "加密选项"
|
||||
msgid "Clipper Options"
|
||||
msgstr "网页剪辑选项"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
msgstr "从所有笔记中删除该标签?"
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr ""
|
||||
"是否删除笔记本“%s”?\n"
|
||||
"\n"
|
||||
"所有在该笔记本内的笔记和下级笔记本也将同时被删除。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "从所有笔记中删除标签“%s”?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
msgstr "从侧栏中删除该项搜索?"
|
||||
msgstr "从边栏中删除该项搜索?"
|
||||
|
||||
msgid "Delete"
|
||||
msgstr "删除"
|
||||
@@ -1071,28 +1085,28 @@ msgstr "删除"
|
||||
msgid "Rename"
|
||||
msgstr "重命名"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "同步"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "笔记本"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "解密项目:%d/%d"
|
||||
msgstr "正在解密项目:%d/%d"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "获取资源:%d。"
|
||||
msgstr "正在获取资源:%d"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "请选择同步状态的导出位置"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr "目录"
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "添加或删除标签"
|
||||
|
||||
msgid "Duplicate"
|
||||
msgstr "重复的"
|
||||
msgstr "创建副本"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
@@ -1110,13 +1124,13 @@ msgstr "切换到待办事项"
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "复制 Markdown 链接"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Delete note \"%s\"?"
|
||||
msgstr "是否删除笔记?"
|
||||
msgstr "是否删除笔记“%s”?"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Delete these %d notes?"
|
||||
msgstr "是否删除这些笔记?"
|
||||
msgstr "是否删除这 %d 条笔记?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Usage: %s"
|
||||
@@ -1155,7 +1169,7 @@ msgstr "未知级别的 ID:%s"
|
||||
msgid ""
|
||||
"Cannot refresh token: authentication data is missing. Starting the "
|
||||
"synchronisation again may fix the problem."
|
||||
msgstr "无法刷新 Token 令牌:缺失认证数据。重新开始同步可能会修复此错误。"
|
||||
msgstr "无法刷新 Token 令牌:缺少认证数据。重新同步可能会修正此错误。"
|
||||
|
||||
msgid "Untitled"
|
||||
msgstr "无标题"
|
||||
@@ -1218,20 +1232,26 @@ msgid "Last error: %s"
|
||||
msgstr "最后错误:%s"
|
||||
|
||||
msgid "Idle"
|
||||
msgstr "闲置"
|
||||
msgstr "空闲"
|
||||
|
||||
msgid "In progress"
|
||||
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 "title"
|
||||
msgstr "标题"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "更新日期"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "冲突"
|
||||
@@ -1241,13 +1261,7 @@ msgstr "无法移动笔记本到该位置"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "笔记本无法被命名为 \"%s\",该标题为保留标题。"
|
||||
|
||||
msgid "title"
|
||||
msgstr "标题"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "更新日期"
|
||||
msgstr "笔记本无法被命名为 \"%s\",这个标题被留作他用。"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "创建日期"
|
||||
@@ -1257,11 +1271,11 @@ msgstr "该笔记不包含地理定位信息。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot copy note to \"%s\" notebook"
|
||||
msgstr "无法复制笔记到 \"%s\" 笔记本"
|
||||
msgstr "无法复制笔记到笔记本“%s”"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Cannot move note to \"%s\" notebook"
|
||||
msgstr "无法移动笔记到 \"%s\" 笔记本"
|
||||
msgstr "无法移动笔记到笔记本“%s”"
|
||||
|
||||
msgid "Language"
|
||||
msgstr "语言"
|
||||
@@ -1276,10 +1290,10 @@ msgid "Theme"
|
||||
msgstr "主题"
|
||||
|
||||
msgid "Light"
|
||||
msgstr "浅色"
|
||||
msgstr "明亮"
|
||||
|
||||
msgid "Dark"
|
||||
msgstr "深色"
|
||||
msgstr "深邃"
|
||||
|
||||
msgid "Uncompleted to-dos on top"
|
||||
msgstr "将未完成的待办事项置顶"
|
||||
@@ -1291,7 +1305,10 @@ msgid "Sort notes by"
|
||||
msgstr "排序笔记"
|
||||
|
||||
msgid "Reverse sort order"
|
||||
msgstr "反转排序顺序"
|
||||
msgstr "倒序"
|
||||
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "笔记本排序依据"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "保存地理定位信息到笔记中"
|
||||
@@ -1312,15 +1329,15 @@ msgid "Show tray icon"
|
||||
msgstr "显示托盘图标"
|
||||
|
||||
msgid "Note: Does not work in all desktop environments."
|
||||
msgstr "注意:在所有桌面环境下无法正常工作。"
|
||||
msgstr "注意:某些桌面环境下无效。"
|
||||
|
||||
msgid ""
|
||||
"This will allow Joplin to run in the background. It is recommended to enable "
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"该选项允许 Joplin 在后台运行,如果你的笔记时常发生变化,推荐启用该设置来减少"
|
||||
"可能的冲突"
|
||||
"该选项允许 Joplin 在后台运行,如果你经常修改和同步笔记,推荐启用该设置来减少"
|
||||
"可能的冲突。"
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr "应用程序启动时最小化到托盘"
|
||||
@@ -1345,7 +1362,7 @@ msgid "Automatically update the application"
|
||||
msgstr "自动更新程序"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr "检查更新时获取预发布版本。"
|
||||
msgstr "检查更新时获取预发布版本"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
@@ -1477,6 +1494,9 @@ msgstr "Evernote 导出文件"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Json 导出目录"
|
||||
|
||||
msgid "File"
|
||||
msgstr "文件"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "文件目录"
|
||||
|
||||
@@ -1512,34 +1532,34 @@ msgid ""
|
||||
"target. In order to find these items, either search for the title or the ID "
|
||||
"(which is displayed in brackets above)."
|
||||
msgstr ""
|
||||
"这些项目将保留于设备中,但不会上传到同步目标。若需查找这些项目,请搜索标题或"
|
||||
"ID(显示在上方括号中)。"
|
||||
"这些项目将只保存在本设备上,不会上传到同步目标。若需查找这些项目,请搜索标题"
|
||||
"或 ID(显示在上方括号中)。"
|
||||
|
||||
msgid "Sync status (synced items / total items)"
|
||||
msgstr "同步状态(已同步项目/项目总数)"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s: %d/%d"
|
||||
msgstr "%s:%d/%d条"
|
||||
msgstr "%s:%d/%d 条"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Total: %d/%d"
|
||||
msgstr "总数:%d/%d条"
|
||||
msgstr "总数:%d/%d 条"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Conflicted: %d"
|
||||
msgstr "有冲突的:%d条"
|
||||
msgstr "有冲突:%d 条"
|
||||
|
||||
#, javascript-format
|
||||
msgid "To delete: %d"
|
||||
msgstr "将删除:%d条"
|
||||
msgstr "将删除:%d 条"
|
||||
|
||||
msgid "Folders"
|
||||
msgstr "文件夹"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s: %d notes"
|
||||
msgstr "%s: %d条笔记"
|
||||
msgstr "%s:%d 条笔记"
|
||||
|
||||
msgid "Coming alarms"
|
||||
msgstr "临近提醒"
|
||||
@@ -1552,7 +1572,7 @@ msgid "Permission to use camera"
|
||||
msgstr "使用摄像头的权限"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr "使用摄像头的权限是必须的"
|
||||
msgstr "您须要授予相机权限。"
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr "当前没有任何笔记。点击 (+) 按钮创建。"
|
||||
@@ -1577,10 +1597,10 @@ msgstr "移动到笔记本..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Move %d notes to notebook \"%s\"?"
|
||||
msgstr "是否移动%d条笔记到 \"%s\" 笔记本?"
|
||||
msgstr "是否移动 %d 条笔记到笔记本“%s”?"
|
||||
|
||||
msgid "Press to set the decryption password."
|
||||
msgstr "按键将设置解密密码。"
|
||||
msgstr "按此设置解密密码。"
|
||||
|
||||
msgid "Clear alarm"
|
||||
msgstr "清除提醒"
|
||||
@@ -1598,10 +1618,10 @@ msgid "Cancel synchronisation"
|
||||
msgstr "取消同步"
|
||||
|
||||
msgid "Checking... Please wait."
|
||||
msgstr "正在检查... 请稍后。"
|
||||
msgstr "正在检查... 请稍候。"
|
||||
|
||||
msgid "Success! Synchronisation configuration appears to be correct."
|
||||
msgstr "成功!同步配置似乎是正确的。"
|
||||
msgstr "成功!同步配置看起来没问题。"
|
||||
|
||||
msgid ""
|
||||
"Error. Please check that URL, username, password, etc. are correct and that "
|
||||
@@ -1611,7 +1631,7 @@ msgstr ""
|
||||
"如下:"
|
||||
|
||||
msgid "The application has been authorised!"
|
||||
msgstr "此程序已被成功授权。"
|
||||
msgstr "已成功授予本应用程序权限!"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -1621,11 +1641,11 @@ msgid ""
|
||||
"\n"
|
||||
"Please try again."
|
||||
msgstr ""
|
||||
"无法授权应用:\n"
|
||||
"无法授权本程序:\n"
|
||||
"\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"请重新尝试"
|
||||
"请重试。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Decrypted items: %s / %s"
|
||||
@@ -1641,8 +1661,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 "
|
||||
@@ -1650,7 +1670,7 @@ msgid ""
|
||||
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 "- 定位:允许将地理位置信息附加到一条笔记中。"
|
||||
@@ -1658,10 +1678,6 @@ msgstr "- 定位:允许将地理位置信息附加到一条笔记中。"
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin 官网"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "数据库 v%s"
|
||||
@@ -1728,7 +1744,7 @@ msgid "Unsupported image type: %s"
|
||||
msgstr "不支持的图片格式:%s"
|
||||
|
||||
msgid "Take photo"
|
||||
msgstr "附加照片"
|
||||
msgstr "拍照"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "附加照片"
|
||||
@@ -1740,10 +1756,10 @@ msgid "Share"
|
||||
msgstr "分享"
|
||||
|
||||
msgid "Convert to note"
|
||||
msgstr "转换到笔记"
|
||||
msgstr "转换为笔记"
|
||||
|
||||
msgid "Convert to todo"
|
||||
msgstr "转换到待办事项"
|
||||
msgstr "转换为待办事项"
|
||||
|
||||
msgid "Hide metadata"
|
||||
msgstr "隐藏元数据"
|
||||
@@ -1757,6 +1773,9 @@ msgstr "查看地图"
|
||||
msgid "Go to source URL"
|
||||
msgstr "定位到源 URL"
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "编辑"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "删除笔记本"
|
||||
|
||||
@@ -1777,6 +1796,9 @@ msgstr "您目前未有笔记本。点击 (+) 按钮创建。"
|
||||
msgid "Welcome"
|
||||
msgstr "欢迎"
|
||||
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin v%s"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "状态:%s。"
|
||||
|
||||
|
@@ -122,9 +122,10 @@ msgstr "標記待辦事項為完成。"
|
||||
msgid "Note is not a to-do: \"%s\""
|
||||
msgstr "記事不等於待辨事項: \"%s\""
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, "
|
||||
"`status` and `target-status`."
|
||||
"`status`, `decrypt-file` and `target-status`."
|
||||
msgstr ""
|
||||
"管理 E2EE 設置。命令是 `enable`,`disable`,`decrypt`,`status` 和 `target-"
|
||||
"status`。"
|
||||
@@ -569,7 +570,8 @@ msgstr "從 \"%s\" 匯入為 \"%s\" 格式。請稍候..."
|
||||
msgid "PDF File"
|
||||
msgstr "PDF 檔案"
|
||||
|
||||
msgid "File"
|
||||
#, fuzzy
|
||||
msgid "&File"
|
||||
msgstr "檔案"
|
||||
|
||||
msgid "New note"
|
||||
@@ -587,6 +589,9 @@ msgstr "匯入"
|
||||
msgid "Export"
|
||||
msgstr "匯出"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "進行同步"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "列印"
|
||||
|
||||
@@ -597,7 +602,8 @@ msgstr "隱藏 %s"
|
||||
msgid "Quit"
|
||||
msgstr "結束"
|
||||
|
||||
msgid "Edit"
|
||||
#, fuzzy
|
||||
msgid "&Edit"
|
||||
msgstr "編輯"
|
||||
|
||||
msgid "Copy"
|
||||
@@ -635,7 +641,8 @@ msgstr "在所有記事中搜尋"
|
||||
msgid "Search in current note"
|
||||
msgstr "在所有記事中搜尋"
|
||||
|
||||
msgid "View"
|
||||
#, fuzzy
|
||||
msgid "&View"
|
||||
msgstr "檢視"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
@@ -648,7 +655,8 @@ msgstr "切換編輯器佈局"
|
||||
msgid "Focus"
|
||||
msgstr "游標置於內文"
|
||||
|
||||
msgid "Tools"
|
||||
#, fuzzy
|
||||
msgid "&Tools"
|
||||
msgstr "工具"
|
||||
|
||||
msgid "Synchronisation status"
|
||||
@@ -663,7 +671,8 @@ msgstr "加密選項"
|
||||
msgid "General Options"
|
||||
msgstr "一般選項"
|
||||
|
||||
msgid "Help"
|
||||
#, fuzzy
|
||||
msgid "&Help"
|
||||
msgstr "說明"
|
||||
|
||||
msgid "Website and documentation"
|
||||
@@ -706,11 +715,11 @@ msgid "An update is available, do you want to download it now?"
|
||||
msgstr "有可用的更新,您需要立即下載嗎?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgid "Your version: %s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgid "New version: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
@@ -1067,7 +1076,15 @@ msgstr "加密選項"
|
||||
msgid "Clipper Options"
|
||||
msgstr "Clipper 選項"
|
||||
|
||||
msgid "Remove this tag from all the notes?"
|
||||
#, fuzzy, javascript-format
|
||||
msgid ""
|
||||
"Delete notebook \"%s\"?\n"
|
||||
"\n"
|
||||
"All notes and sub-notebooks within this notebook will also be deleted."
|
||||
msgstr "決定刪除記事本?此記事本中的所有記事和子記事本也將被刪除。"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Remove tag \"%s\" from all notes?"
|
||||
msgstr "是否從所有記事中刪除此標籤?"
|
||||
|
||||
msgid "Remove this search from the sidebar?"
|
||||
@@ -1079,9 +1096,6 @@ msgstr "刪除"
|
||||
msgid "Rename"
|
||||
msgstr "重新命名"
|
||||
|
||||
msgid "Synchronise"
|
||||
msgstr "進行同步"
|
||||
|
||||
msgid "Notebooks"
|
||||
msgstr "記事本"
|
||||
|
||||
@@ -1096,6 +1110,9 @@ msgstr "資源: %d。"
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "請選擇將同步狀態導出到的位置"
|
||||
|
||||
msgid "Table of contents"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add or remove tags"
|
||||
msgstr "新增或移除標籤"
|
||||
|
||||
@@ -1243,6 +1260,12 @@ msgstr "已加密"
|
||||
msgid "Encrypted items cannot be modified"
|
||||
msgstr "無法修改已加密項目"
|
||||
|
||||
msgid "title"
|
||||
msgstr "標題"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "更新日期"
|
||||
|
||||
msgid "Conflicts"
|
||||
msgstr "衝突"
|
||||
|
||||
@@ -1253,12 +1276,6 @@ msgstr "無法移動記事本到此位置"
|
||||
msgid "Notebooks cannot be named \"%s\", which is a reserved title."
|
||||
msgstr "筆記本無法命名為 \"%s\",這標題已被保留。"
|
||||
|
||||
msgid "title"
|
||||
msgstr "標題"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "更新日期"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "建立日期"
|
||||
|
||||
@@ -1303,6 +1320,10 @@ msgstr "排序記事"
|
||||
msgid "Reverse sort order"
|
||||
msgstr "顛倒排序順序"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Sort notebooks by"
|
||||
msgstr "排序記事"
|
||||
|
||||
msgid "Save geo-location with notes"
|
||||
msgstr "在記事中保存地理位置資訊"
|
||||
|
||||
@@ -1490,6 +1511,9 @@ msgstr "Evernote 匯出檔"
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin 匯出目錄"
|
||||
|
||||
msgid "File"
|
||||
msgstr "檔案"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "目錄"
|
||||
|
||||
@@ -1668,10 +1692,6 @@ msgstr "- 位置: 允許將地理位置資訊附加到筆記。"
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin 官方網站"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin 官方網站"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
@@ -1768,6 +1788,9 @@ msgstr "在地圖上顯示"
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit"
|
||||
msgstr "編輯"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "刪除記事本"
|
||||
|
||||
@@ -1788,6 +1811,10 @@ msgstr "您當前沒有任何筆記本。通過按一下 (+) 鍵去建立一本
|
||||
msgid "Welcome"
|
||||
msgstr "歡迎"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Joplin v%s"
|
||||
#~ msgstr "Joplin 官方網站"
|
||||
|
||||
#~ msgid "State: %s."
|
||||
#~ msgstr "狀態: %s。"
|
||||
|
||||
|
@@ -52,4 +52,53 @@ describe('models_Folder', function() {
|
||||
expect(all.length).toBe(0);
|
||||
}));
|
||||
|
||||
it('should sort by last modified, based on content', asyncTest(async () => {
|
||||
let folders;
|
||||
|
||||
let f1 = await Folder.save({ title: "folder1" }); await sleep(0.1);
|
||||
let f2 = await Folder.save({ title: "folder2" }); await sleep(0.1);
|
||||
let f3 = await Folder.save({ title: "folder3" }); await sleep(0.1);
|
||||
let n1 = await Note.save({ title: 'note1', parent_id: f2.id });
|
||||
|
||||
folders = await Folder.orderByLastModified(await Folder.all(), 'desc');
|
||||
expect(folders.length).toBe(3);
|
||||
expect(folders[0].id).toBe(f2.id);
|
||||
expect(folders[1].id).toBe(f3.id);
|
||||
expect(folders[2].id).toBe(f1.id);
|
||||
|
||||
let n2 = await Note.save({ title: 'note1', parent_id: f1.id });
|
||||
|
||||
folders = await Folder.orderByLastModified(await Folder.all(), 'desc');
|
||||
expect(folders[0].id).toBe(f1.id);
|
||||
expect(folders[1].id).toBe(f2.id);
|
||||
expect(folders[2].id).toBe(f3.id);
|
||||
|
||||
await Note.save({ id: n1.id, title: 'note1 mod' });
|
||||
|
||||
folders = await Folder.orderByLastModified(await Folder.all(), 'desc');
|
||||
expect(folders[0].id).toBe(f2.id);
|
||||
expect(folders[1].id).toBe(f1.id);
|
||||
expect(folders[2].id).toBe(f3.id);
|
||||
|
||||
folders = await Folder.orderByLastModified(await Folder.all(), 'asc');
|
||||
expect(folders[0].id).toBe(f3.id);
|
||||
expect(folders[1].id).toBe(f1.id);
|
||||
expect(folders[2].id).toBe(f2.id);
|
||||
}));
|
||||
|
||||
it('should sort by last modified, based on content (sub-folders too)', asyncTest(async () => {
|
||||
let folders;
|
||||
|
||||
let f1 = await Folder.save({ title: "folder1" }); await sleep(0.1);
|
||||
let f2 = await Folder.save({ title: "folder2" }); await sleep(0.1);
|
||||
let f3 = await Folder.save({ title: "folder3", parent_id: f1.id }); await sleep(0.1);
|
||||
let n1 = await Note.save({ title: 'note1', parent_id: f3.id });
|
||||
|
||||
folders = await Folder.orderByLastModified(await Folder.all(), 'desc');
|
||||
expect(folders.length).toBe(3);
|
||||
expect(folders[0].id).toBe(f1.id);
|
||||
expect(folders[1].id).toBe(f3.id);
|
||||
expect(folders[2].id).toBe(f2.id);
|
||||
}));
|
||||
|
||||
});
|
@@ -111,6 +111,58 @@ describe('services_SearchEngine', function() {
|
||||
expect(rows[4].id).toBe(n5.id);
|
||||
}));
|
||||
|
||||
it('should order search results by relevance (last updated first)', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const n1 = await Note.save({ title: "abcd" });
|
||||
await sleep(0.1);
|
||||
const n2 = await Note.save({ title: "abcd" });
|
||||
await sleep(0.1);
|
||||
const n3 = await Note.save({ title: "abcd" });
|
||||
await sleep(0.1);
|
||||
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('abcd');
|
||||
|
||||
expect(rows[0].id).toBe(n3.id);
|
||||
expect(rows[1].id).toBe(n2.id);
|
||||
expect(rows[2].id).toBe(n1.id);
|
||||
|
||||
await Note.save({ id: n1.id, title: "abcd" });
|
||||
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('abcd');
|
||||
expect(rows[0].id).toBe(n1.id);
|
||||
expect(rows[1].id).toBe(n3.id);
|
||||
expect(rows[2].id).toBe(n2.id);
|
||||
}));
|
||||
|
||||
it('should order search results by relevance (completed to-dos last)', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const n1 = await Note.save({ title: "abcd", is_todo: 1 });
|
||||
await sleep(0.1);
|
||||
const n2 = await Note.save({ title: "abcd", is_todo: 1 });
|
||||
await sleep(0.1);
|
||||
const n3 = await Note.save({ title: "abcd", is_todo: 1 });
|
||||
await sleep(0.1);
|
||||
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('abcd');
|
||||
|
||||
expect(rows[0].id).toBe(n3.id);
|
||||
expect(rows[1].id).toBe(n2.id);
|
||||
expect(rows[2].id).toBe(n1.id);
|
||||
|
||||
await Note.save({ id: n3.id, todo_completed: Date.now() });
|
||||
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('abcd');
|
||||
expect(rows[0].id).toBe(n2.id);
|
||||
expect(rows[1].id).toBe(n1.id);
|
||||
expect(rows[2].id).toBe(n3.id);
|
||||
}));
|
||||
|
||||
it('should supports various query types', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
|
@@ -1100,11 +1100,8 @@ describe('Synchronizer', function() {
|
||||
expect(note2.title).toBe("un UPDATE");
|
||||
}));
|
||||
|
||||
it("should sync Welcome notebook and not duplicate it", asyncTest(async () => {
|
||||
// Create the Welcome items on two separate clients and verify
|
||||
// that they appear only once (due to having hard-coded IDs), that they are not duplicated.
|
||||
|
||||
Setting.setConstant('env', 'prod');
|
||||
it("should create a new Welcome notebook on each client", asyncTest(async () => {
|
||||
// Create the Welcome items on two separate clients
|
||||
|
||||
await WelcomeUtils.createWelcomeItems();
|
||||
await synchronizer().start();
|
||||
@@ -1114,7 +1111,7 @@ describe('Synchronizer', function() {
|
||||
await WelcomeUtils.createWelcomeItems();
|
||||
const beforeFolderCount = (await Folder.all()).length;
|
||||
const beforeNoteCount = (await Note.all()).length;
|
||||
expect(beforeFolderCount >= 1).toBe(true);
|
||||
expect(beforeFolderCount === 1).toBe(true);
|
||||
expect(beforeNoteCount > 1).toBe(true);
|
||||
|
||||
await synchronizer().start();
|
||||
@@ -1122,8 +1119,8 @@ describe('Synchronizer', function() {
|
||||
const afterFolderCount = (await Folder.all()).length;
|
||||
const afterNoteCount = (await Note.all()).length;
|
||||
|
||||
expect(afterFolderCount).toBe(beforeFolderCount);
|
||||
expect(afterNoteCount).toBe(beforeNoteCount);
|
||||
expect(afterFolderCount).toBe(beforeFolderCount * 2);
|
||||
expect(afterNoteCount).toBe(beforeNoteCount * 2);
|
||||
|
||||
// Changes to the Welcome items should be synced to all clients
|
||||
|
||||
@@ -1136,8 +1133,13 @@ describe('Synchronizer', function() {
|
||||
|
||||
await synchronizer().start();
|
||||
|
||||
const f1_1 = (await Folder.all())[0];
|
||||
const f1_1 = await Folder.load(f1.id);
|
||||
expect(f1_1.title).toBe('Welcome MOD');
|
||||
|
||||
// Now check that it created the duplicate tag
|
||||
|
||||
const tags = await Tag.modelSelectAll('SELECT * FROM tags WHERE title = "organising"');
|
||||
expect(tags.length).toBe(2);
|
||||
}));
|
||||
|
||||
});
|
||||
|
@@ -249,6 +249,10 @@
|
||||
|
||||
return {};
|
||||
|
||||
} else if (command.name === "pageUrl") {
|
||||
let url = location.origin + location.pathname + location.search;
|
||||
return clippedContentResponse(pageTitle(), url, getImageSizes(document));
|
||||
|
||||
} else {
|
||||
throw new Error('Unknown command: ' + JSON.stringify(command));
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@
|
||||
"description": "Capture and save web pages and screenshots from your browser to Joplin.",
|
||||
"homepage_url": "https://joplin.cozic.net",
|
||||
"icons": {
|
||||
"32": "icons/32.png",
|
||||
"48": "icons/48.png",
|
||||
"96": "icons/96.png"
|
||||
},
|
||||
|
22036
Clipper/joplin-webclipper/popup/package-lock.json
generated
22036
Clipper/joplin-webclipper/popup/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@
|
||||
"react": "^16.3.2",
|
||||
"react-dom": "^16.3.2",
|
||||
"react-redux": "^5.0.7",
|
||||
"react-scripts": "1.1.4",
|
||||
"react-scripts": "^2.1.5",
|
||||
"redux": "^4.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
@@ -19,7 +19,13 @@
|
||||
"postinstall": "node scripts/postinstall.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cra-build-watch": "^1.0.1",
|
||||
"cra-build-watch": "^1.4.0",
|
||||
"fs-extra": "^6.0.1"
|
||||
}
|
||||
},
|
||||
"browserslist": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not ie <= 11",
|
||||
"not op_mini all"
|
||||
]
|
||||
}
|
||||
|
@@ -49,6 +49,12 @@ class AppComponent extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
this.clipUrl_click = () => {
|
||||
bridge().sendCommandToActiveTab({
|
||||
name: 'pageUrl',
|
||||
});
|
||||
}
|
||||
|
||||
this.clipScreenshot_click = async () => {
|
||||
try {
|
||||
const baseUrl = await bridge().clipperServerBaseUrl();
|
||||
@@ -296,6 +302,7 @@ class AppComponent extends Component {
|
||||
<li><a className="Button" onClick={this.clipComplete_click}>Clip complete page</a></li>
|
||||
<li><a className="Button" onClick={this.clipSelection_click}>Clip selection</a></li>
|
||||
<li><a className="Button" onClick={this.clipScreenshot_click}>Clip screenshot</a></li>
|
||||
<li><a className="Button" onClick={this.clipUrl_click}>Clip URL</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{ foldersComp() }
|
||||
|
@@ -54,6 +54,9 @@ class ElectronAppWrapper {
|
||||
y: windowState.y,
|
||||
width: windowState.width,
|
||||
height: windowState.height,
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
},
|
||||
};
|
||||
|
||||
// Linux icon workaround for bug https://github.com/electron-userland/electron-builder/issues/2098
|
||||
@@ -77,7 +80,7 @@ class ElectronAppWrapper {
|
||||
}))
|
||||
|
||||
// Uncomment this to view errors if the application does not start
|
||||
if (this.env_ === 'dev') this.win_.webContents.openDevTools();
|
||||
// if (this.env_ === 'dev') this.win_.webContents.openDevTools();
|
||||
|
||||
this.win_.on('close', (event) => {
|
||||
// If it's on macOS, the app is completely closed only if the user chooses to close the app (willQuitApp_ will be true)
|
||||
@@ -191,19 +194,24 @@ class ElectronAppWrapper {
|
||||
ensureSingleInstance() {
|
||||
if (this.env_ === 'dev') return false;
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const alreadyRunning = this.electronApp_.makeSingleInstance((commandLine, workingDirectory) => {
|
||||
const win = this.window();
|
||||
if (!win) return;
|
||||
if (win.isMinimized()) win.restore();
|
||||
win.show();
|
||||
win.focus();
|
||||
});
|
||||
const gotTheLock = this.electronApp_.requestSingleInstanceLock();
|
||||
|
||||
if (alreadyRunning) this.electronApp_.quit();
|
||||
if (!gotTheLock) {
|
||||
// Another instance is already running - exit
|
||||
this.electronApp_.quit();
|
||||
return true;
|
||||
}
|
||||
|
||||
resolve(alreadyRunning);
|
||||
// Someone tried to open a second instance - focus our window instead
|
||||
this.electronApp_.on('second-instance', (event, commandLine, workingDirectory) => {
|
||||
const win = this.window();
|
||||
if (!win) return;
|
||||
if (win.isMinimized()) win.restore();
|
||||
win.show();
|
||||
win.focus();
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
async start() {
|
||||
@@ -211,8 +219,8 @@ class ElectronAppWrapper {
|
||||
// the "ready" event. So we use the function below to make sure that the app is ready.
|
||||
await this.waitForElectronAppReady();
|
||||
|
||||
const alreadyRunning = await this.ensureSingleInstance();
|
||||
if (alreadyRunning) return;
|
||||
const alreadyRunning = this.ensureSingleInstance();
|
||||
if (alreadyRunning) return;
|
||||
|
||||
this.createWindow();
|
||||
|
||||
|
@@ -245,22 +245,41 @@ class Application extends BaseApplication {
|
||||
updateMenu(screen) {
|
||||
if (this.lastMenuScreen_ === screen) return;
|
||||
|
||||
const sortNoteItems = [];
|
||||
const sortNoteOptions = Setting.enumOptions('notes.sortOrder.field');
|
||||
for (let field in sortNoteOptions) {
|
||||
if (!sortNoteOptions.hasOwnProperty(field)) continue;
|
||||
sortNoteItems.push({
|
||||
label: sortNoteOptions[field],
|
||||
screens: ['Main'],
|
||||
const sortNoteFolderItems = (type) => {
|
||||
const sortItems = [];
|
||||
const sortOptions = Setting.enumOptions(type + '.sortOrder.field');
|
||||
for (let field in sortOptions) {
|
||||
if (!sortOptions.hasOwnProperty(field)) continue;
|
||||
sortItems.push({
|
||||
label: sortOptions[field],
|
||||
screens: ['Main'],
|
||||
type: 'checkbox',
|
||||
checked: Setting.value(type + '.sortOrder.field') === field,
|
||||
click: () => {
|
||||
Setting.setValue(type + '.sortOrder.field', field);
|
||||
this.refreshMenu();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
sortItems.push({ type: 'separator' });
|
||||
|
||||
sortItems.push({
|
||||
label: Setting.settingMetadata(type + '.sortOrder.reverse').label(),
|
||||
type: 'checkbox',
|
||||
checked: Setting.value('notes.sortOrder.field') === field,
|
||||
checked: Setting.value(type + '.sortOrder.reverse'),
|
||||
screens: ['Main'],
|
||||
click: () => {
|
||||
Setting.setValue('notes.sortOrder.field', field);
|
||||
this.refreshMenu();
|
||||
}
|
||||
Setting.setValue(type + '.sortOrder.reverse', !Setting.value(type + '.sortOrder.reverse'));
|
||||
},
|
||||
});
|
||||
|
||||
return sortItems;
|
||||
}
|
||||
|
||||
const sortNoteItems = sortNoteFolderItems('notes');
|
||||
const sortFolderItems = sortNoteFolderItems('folders');
|
||||
|
||||
const focusItems = [];
|
||||
|
||||
focusItems.push({
|
||||
@@ -368,7 +387,11 @@ class Application extends BaseApplication {
|
||||
|
||||
const template = [
|
||||
{
|
||||
label: _('File'),
|
||||
label: _('&File'),
|
||||
/* `&` before one of the char in the label name mean, that
|
||||
* <Alt + F> will open this menu. It's needed becase electron
|
||||
* opens the first menu on Alt press if no hotkey assigned.
|
||||
* Issue: https://github.com/laurent22/joplin/issues/934 */
|
||||
submenu: [{
|
||||
label: _('New note'),
|
||||
accelerator: 'CommandOrControl+N',
|
||||
@@ -408,6 +431,18 @@ class Application extends BaseApplication {
|
||||
submenu: exportItems,
|
||||
}, {
|
||||
type: 'separator',
|
||||
}, {
|
||||
label: _('Synchronise'),
|
||||
accelerator: 'CommandOrControl+S',
|
||||
screens: ['Main'],
|
||||
click: async () => {
|
||||
this.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'synchronize',
|
||||
});
|
||||
}
|
||||
}, {
|
||||
type: 'separator',
|
||||
}, {
|
||||
label: _('Print'),
|
||||
accelerator: 'CommandOrControl+P',
|
||||
@@ -434,7 +469,7 @@ class Application extends BaseApplication {
|
||||
click: () => { bridge().electronApp().quit() }
|
||||
}]
|
||||
}, {
|
||||
label: _('Edit'),
|
||||
label: _('&Edit'),
|
||||
submenu: [{
|
||||
label: _('Copy'),
|
||||
role: 'copy',
|
||||
@@ -535,7 +570,7 @@ class Application extends BaseApplication {
|
||||
},
|
||||
}],
|
||||
}, {
|
||||
label: _('View'),
|
||||
label: _('&View'),
|
||||
submenu: [{
|
||||
label: _('Toggle sidebar'),
|
||||
screens: ['Main'],
|
||||
@@ -564,13 +599,9 @@ class Application extends BaseApplication {
|
||||
screens: ['Main'],
|
||||
submenu: sortNoteItems,
|
||||
}, {
|
||||
label: Setting.settingMetadata('notes.sortOrder.reverse').label(),
|
||||
type: 'checkbox',
|
||||
checked: Setting.value('notes.sortOrder.reverse'),
|
||||
label: Setting.settingMetadata('folders.sortOrder.field').label(),
|
||||
screens: ['Main'],
|
||||
click: () => {
|
||||
Setting.setValue('notes.sortOrder.reverse', !Setting.value('notes.sortOrder.reverse'));
|
||||
},
|
||||
submenu: sortFolderItems,
|
||||
}, {
|
||||
label: Setting.settingMetadata('uncompletedTodosOnTop').label(),
|
||||
type: 'checkbox',
|
||||
@@ -596,7 +627,7 @@ class Application extends BaseApplication {
|
||||
submenu: focusItems,
|
||||
}],
|
||||
}, {
|
||||
label: _('Tools'),
|
||||
label: _('&Tools'),
|
||||
submenu: [{
|
||||
label: _('Synchronisation status'),
|
||||
click: () => {
|
||||
@@ -635,7 +666,7 @@ class Application extends BaseApplication {
|
||||
}
|
||||
}],
|
||||
}, {
|
||||
label: _('Help'),
|
||||
label: _('&Help'),
|
||||
submenu: [{
|
||||
label: _('Website and documentation'),
|
||||
accelerator: 'F1',
|
||||
|
@@ -120,14 +120,18 @@ function checkForUpdates(inBackground, window, logFilePath, options) {
|
||||
autoUpdateLogger_.info('Is Pre-release:', release.prerelease);
|
||||
|
||||
if (compareVersions(release.version, packageInfo.version) <= 0) {
|
||||
if (!checkInBackground_) dialog.showMessageBox({ message: _('Current version is up-to-date.') })
|
||||
if (!checkInBackground_) dialog.showMessageBox({
|
||||
type: 'info',
|
||||
message: _('Current version is up-to-date.'),
|
||||
buttons: [_('OK')],
|
||||
})
|
||||
} else {
|
||||
const releaseNotes = release.notes.trim() ? "\n\n" + release.notes.trim() : '';
|
||||
const newVersionString = release.prerelease ? _('%s (pre-release)', release.version) : release.version;
|
||||
|
||||
const buttonIndex = dialog.showMessageBox(parentWindow_, {
|
||||
type: 'info',
|
||||
message: _('An update is available, do you want to download it now?') + '\n\n' + _('Your version: v%s', packageInfo.version) + '\n' + _('New version: v%s', newVersionString) + releaseNotes,
|
||||
message: _('An update is available, do you want to download it now?') + '\n\n' + _('Your version: %s', packageInfo.version) + '\n' + _('New version: %s', newVersionString) + releaseNotes,
|
||||
buttons: [_('Yes'), _('No')]
|
||||
});
|
||||
|
||||
|
@@ -43,6 +43,7 @@ fs.readdirSync(guiPath).forEach((filename) => {
|
||||
const libContent = [
|
||||
fs.readFileSync(basePath + '/ReactNativeClient/lib/string-utils-common.js', 'utf8'),
|
||||
fs.readFileSync(basePath + '/ReactNativeClient/lib/markJsUtils.js', 'utf8'),
|
||||
fs.readFileSync(basePath + '/ReactNativeClient/lib/MdToHtml/webviewLib.js', 'utf8'),
|
||||
];
|
||||
|
||||
fs.writeFileSync(__dirname + '/gui/note-viewer/lib.js', libContent.join('\n'), 'utf8');
|
||||
|
50
ElectronClient/app/electronRebuild.js
Normal file
50
ElectronClient/app/electronRebuild.js
Normal file
@@ -0,0 +1,50 @@
|
||||
const execCommand = function(command) {
|
||||
const exec = require('child_process').exec
|
||||
|
||||
console.info('Running: ' + command);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let childProcess = exec(command, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
if (error.signal == 'SIGTERM') {
|
||||
resolve('Process was killed');
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
} else {
|
||||
resolve(stdout.trim());
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
const isLinux = () => {
|
||||
return process && process.platform === 'linux';
|
||||
}
|
||||
|
||||
const isWindows = () => {
|
||||
return process && process.platform === 'win32';
|
||||
}
|
||||
|
||||
const isMac = () => {
|
||||
return process && process.platform === 'darwin';
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// electron-rebuild --arch ia32 && electron-rebuild --arch x64
|
||||
|
||||
let exePath = __dirname + '/node_modules/.bin/electron-rebuild';
|
||||
if (isWindows()) exePath += '.cmd';
|
||||
|
||||
if (isWindows()) {
|
||||
console.info(await execCommand(['"' + exePath + '"', '--arch ia32'].join(' ')));
|
||||
console.info(await execCommand(['"' + exePath + '"', '--arch x64'].join(' ')));
|
||||
} else {
|
||||
console.info(await execCommand(['"' + exePath + '"'].join(' ')));
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
});
|
@@ -17,6 +17,7 @@ const { _ } = require('lib/locale.js');
|
||||
const layoutUtils = require('lib/layout-utils.js');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const eventManager = require('../eventManager');
|
||||
const VerticalResizer = require('./VerticalResizer.min');
|
||||
|
||||
class MainScreenComponent extends React.Component {
|
||||
|
||||
@@ -24,6 +25,16 @@ class MainScreenComponent extends React.Component {
|
||||
super();
|
||||
|
||||
this.notePropertiesDialog_close = this.notePropertiesDialog_close.bind(this);
|
||||
this.sidebar_onDrag = this.sidebar_onDrag.bind(this);
|
||||
this.noteList_onDrag = this.noteList_onDrag.bind(this);
|
||||
}
|
||||
|
||||
sidebar_onDrag(event) {
|
||||
Setting.setValue('style.sidebar.width', this.props.sidebarWidth + event.deltaX);
|
||||
}
|
||||
|
||||
noteList_onDrag(event) {
|
||||
Setting.setValue('style.noteList.width', Setting.value('style.noteList.width') + event.deltaX);
|
||||
}
|
||||
|
||||
notePropertiesDialog_close() {
|
||||
@@ -265,8 +276,8 @@ class MainScreenComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
styles(themeId, width, height, messageBoxVisible, isSidebarVisible) {
|
||||
const styleKey = themeId + '_' + width + '_' + height + '_' + messageBoxVisible + '_' + (+isSidebarVisible);
|
||||
styles(themeId, width, height, messageBoxVisible, isSidebarVisible, sidebarWidth, noteListWidth) {
|
||||
const styleKey = [themeId, width, height, messageBoxVisible, (+isSidebarVisible), sidebarWidth, noteListWidth].join('_');
|
||||
if (styleKey === this.styleKey_) return this.styles_;
|
||||
|
||||
const theme = themeStyle(themeId);
|
||||
@@ -288,10 +299,16 @@ class MainScreenComponent extends React.Component {
|
||||
backgroundColor: theme.warningBackgroundColor,
|
||||
}
|
||||
|
||||
this.styles_.verticalResizer = {
|
||||
width: 5,
|
||||
height: height,
|
||||
display: 'inline-block',
|
||||
};
|
||||
|
||||
const rowHeight = height - theme.headerHeight - (messageBoxVisible ? this.styles_.messageBox.height : 0);
|
||||
|
||||
this.styles_.sideBar = {
|
||||
width: Math.floor(layoutUtils.size(width * .2, 150, 300)),
|
||||
width: sidebarWidth - this.styles_.verticalResizer.width,
|
||||
height: rowHeight,
|
||||
display: 'inline-block',
|
||||
verticalAlign: 'top',
|
||||
@@ -303,14 +320,14 @@ class MainScreenComponent extends React.Component {
|
||||
}
|
||||
|
||||
this.styles_.noteList = {
|
||||
width: Math.floor(layoutUtils.size(width * .2, 150, 300)),
|
||||
width: noteListWidth - this.styles_.verticalResizer.width,
|
||||
height: rowHeight,
|
||||
display: 'inline-block',
|
||||
verticalAlign: 'top',
|
||||
};
|
||||
|
||||
this.styles_.noteText = {
|
||||
width: Math.floor(layoutUtils.size(width - this.styles_.sideBar.width - this.styles_.noteList.width, 0)),
|
||||
width: Math.floor(width - this.styles_.sideBar.width - this.styles_.noteList.width - 10),
|
||||
height: rowHeight,
|
||||
display: 'inline-block',
|
||||
verticalAlign: 'top',
|
||||
@@ -346,7 +363,7 @@ class MainScreenComponent extends React.Component {
|
||||
const notes = this.props.notes;
|
||||
const messageBoxVisible = this.props.hasDisabledSyncItems || this.props.showMissingMasterKeyMessage;
|
||||
const sidebarVisibility = this.props.sidebarVisibility;
|
||||
const styles = this.styles(this.props.theme, style.width, style.height, messageBoxVisible, sidebarVisibility);
|
||||
const styles = this.styles(this.props.theme, style.width, style.height, messageBoxVisible, sidebarVisibility, this.props.sidebarWidth, this.props.noteListWidth);
|
||||
const selectedFolderId = this.props.selectedFolderId;
|
||||
const onConflictFolder = this.props.selectedFolderId === Folder.conflictFolderId();
|
||||
|
||||
@@ -375,7 +392,7 @@ class MainScreenComponent extends React.Component {
|
||||
|
||||
headerItems.push({
|
||||
title: _('New notebook'),
|
||||
iconName: 'fa-folder-o',
|
||||
iconName: 'fa-book',
|
||||
onClick: () => { this.doCommand({ name: 'newNotebook' }) },
|
||||
});
|
||||
|
||||
@@ -462,7 +479,9 @@ class MainScreenComponent extends React.Component {
|
||||
<Header style={styles.header} showBackButton={false} items={headerItems} />
|
||||
{messageComp}
|
||||
<SideBar style={styles.sideBar} />
|
||||
<VerticalResizer style={styles.verticalResizer} onDrag={this.sidebar_onDrag}/>
|
||||
<NoteList style={styles.noteList} />
|
||||
<VerticalResizer style={styles.verticalResizer} onDrag={this.noteList_onDrag}/>
|
||||
<NoteText style={styles.noteText} visiblePanes={this.props.noteVisiblePanes} />
|
||||
</div>
|
||||
);
|
||||
@@ -482,6 +501,8 @@ const mapStateToProps = (state) => {
|
||||
showMissingMasterKeyMessage: state.notLoadedMasterKeys.length && state.masterKeys.length,
|
||||
selectedFolderId: state.selectedFolderId,
|
||||
sidebarVisibility: state.sidebarVisibility,
|
||||
sidebarWidth: state.settings['style.sidebar.width'],
|
||||
noteListWidth: state.settings['style.noteList.width'],
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -17,7 +17,11 @@ class NavigatorComponent extends Component {
|
||||
}
|
||||
|
||||
updateWindowTitle(title) {
|
||||
bridge().window().setTitle(title);
|
||||
try {
|
||||
if (bridge().window()) bridge().window().setTitle(title);
|
||||
} catch (error) {
|
||||
console.warn('updateWindowTitle', error);
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
|
@@ -381,7 +381,7 @@ class NoteListComponent extends React.Component {
|
||||
const theme = themeStyle(this.props.theme);
|
||||
const style = this.props.style;
|
||||
let notes = this.props.notes.slice();
|
||||
|
||||
|
||||
if (!notes.length) {
|
||||
const padding = 10;
|
||||
const emptyDivStyle = Object.assign({
|
||||
@@ -396,16 +396,16 @@ class NoteListComponent extends React.Component {
|
||||
return <div style={emptyDivStyle}>{ this.props.folders.length ? _('No notes in here. Create one by clicking on "New note".') : _('There is currently no notebook. Create one by clicking on "New notebook".')}</div>
|
||||
}
|
||||
|
||||
return (
|
||||
return (
|
||||
<ItemList
|
||||
ref={this.itemListRef}
|
||||
itemHeight={this.style().listItem.height}
|
||||
style={style}
|
||||
className={"note-list"}
|
||||
items={notes}
|
||||
style={style}
|
||||
itemRenderer={this.itemRenderer}
|
||||
onKeyDown={this.onKeyDown}
|
||||
></ItemList>
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -36,6 +36,7 @@ const ResourceFetcher = require('lib/services/ResourceFetcher');
|
||||
const { toSystemSlashes, safeFilename } = require('lib/path-utils');
|
||||
const { clipboard } = require('electron');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const ModelCache = require('lib/services/ModelCache');
|
||||
const NoteTextViewer = require('./NoteTextViewer.min');
|
||||
|
||||
require('brace/mode/markdown');
|
||||
@@ -75,6 +76,7 @@ class NoteTextComponent extends React.Component {
|
||||
// to automatically set the title.
|
||||
newAndNoTitleChangeNoteId: null,
|
||||
bodyHtml: '',
|
||||
lastRenderCssFiles: [],
|
||||
lastKeys: [],
|
||||
showLocalSearch: false,
|
||||
localSearch: Object.assign({}, this.localSearchDefaultState),
|
||||
@@ -226,9 +228,10 @@ class NoteTextComponent extends React.Component {
|
||||
if (!this.state.note || !this.state.note.body) return;
|
||||
const resourceIds = await Note.linkedResourceIds(this.state.note.body);
|
||||
if (resourceIds.indexOf(resource.id) >= 0) {
|
||||
this.mdToHtml().clearCache();
|
||||
// this.mdToHtml().clearCache();
|
||||
this.lastSetHtml_ = '';
|
||||
this.updateHtml(this.state.note.body);
|
||||
this.scheduleHtmlUpdate();
|
||||
//this.updateHtml(this.state.note.body);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -563,6 +566,8 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
// if (newState.note) await shared.refreshAttachedResources(this, newState.note.body);
|
||||
|
||||
this.updateHtml(newState.note ? newState.note.body : '');
|
||||
}
|
||||
|
||||
@@ -635,7 +640,7 @@ class NoteTextComponent extends React.Component {
|
||||
const arg0 = args && args.length >= 1 ? args[0] : null;
|
||||
const arg1 = args && args.length >= 2 ? args[1] : null;
|
||||
|
||||
reg.logger().debug('Got ipc-message: ' + msg, args);
|
||||
console.info('Got ipc-message: ' + msg, args);
|
||||
|
||||
if (msg.indexOf('checkboxclick:') === 0) {
|
||||
// Ugly hack because setting the body here will make the scrollbar
|
||||
@@ -644,7 +649,7 @@ class NoteTextComponent extends React.Component {
|
||||
// "afterRender" event has been called.
|
||||
this.restoreScrollTop_ = this.editorScrollTop();
|
||||
|
||||
const newBody = this.mdToHtml_.handleCheckboxClick(msg, this.state.note.body);
|
||||
const newBody = shared.toggleCheckbox(msg, this.state.note.body);
|
||||
this.saveOneProperty('body', newBody);
|
||||
} else if (msg === 'setMarkerCount') {
|
||||
const ls = Object.assign({}, this.state.localSearch);
|
||||
@@ -724,6 +729,7 @@ class NoteTextComponent extends React.Component {
|
||||
// When using the file:// protocol, openExternal doesn't work (does nothing) with URL-encoded paths
|
||||
require('electron').shell.openExternal(urlDecode(msg));
|
||||
} else {
|
||||
console.info('OPEN URL');
|
||||
require('electron').shell.openExternal(msg);
|
||||
}
|
||||
} else if (msg.indexOf('#') === 0) {
|
||||
@@ -794,7 +800,7 @@ class NoteTextComponent extends React.Component {
|
||||
});
|
||||
|
||||
if (Setting.value('env') === 'dev') {
|
||||
// this.webviewRef_.current.wrappedInstance.openDevTools();
|
||||
this.webviewRef_.current.wrappedInstance.openDevTools();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -891,30 +897,22 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
updateHtml(body = null, options = null) {
|
||||
async updateHtml(body = null, options = null) {
|
||||
if (!options) options = {};
|
||||
if (!('useCustomCss' in options)) options.useCustomCss = true;
|
||||
|
||||
const mdOptions = {
|
||||
onResourceLoaded: () => {
|
||||
if (this.resourceLoadedTimeoutId_) {
|
||||
clearTimeout(this.resourceLoadedTimeoutId_);
|
||||
this.resourceLoadedTimeoutId_ = null;
|
||||
}
|
||||
|
||||
this.resourceLoadedTimeoutId_ = setTimeout(() => {
|
||||
this.resourceLoadedTimeoutId_ = null;
|
||||
this.updateHtml();
|
||||
this.forceUpdate();
|
||||
}, 100);
|
||||
},
|
||||
postMessageSyntax: 'ipcProxySendToHost',
|
||||
};
|
||||
let bodyToRender = body;
|
||||
if (bodyToRender === null) bodyToRender = this.state.note && this.state.note.body ? this.state.note.body : '';
|
||||
|
||||
const theme = themeStyle(this.props.theme);
|
||||
|
||||
let bodyToRender = body;
|
||||
if (bodyToRender === null) bodyToRender = this.state.note && this.state.note.body ? this.state.note.body : '';
|
||||
const mdOptions = {
|
||||
codeTheme: theme.codeThemeCss,
|
||||
postMessageSyntax: 'ipcProxySendToHost',
|
||||
userCss: options.useCustomCss ? this.props.customCss : '',
|
||||
resources: await shared.attachedResources(bodyToRender),
|
||||
};
|
||||
|
||||
let bodyHtml = '';
|
||||
|
||||
const visiblePanes = this.props.visiblePanes || ['editor', 'viewer'];
|
||||
@@ -924,11 +922,12 @@ class NoteTextComponent extends React.Component {
|
||||
bodyToRender = '*' + _('This note has no content. Click on "%s" to toggle the editor and edit the note.', _('Layout')) + '*';
|
||||
}
|
||||
|
||||
if (options.useCustomCss) bodyToRender = '<style>' + this.props.customCss + '</style>\n' + bodyToRender;
|
||||
const result = this.mdToHtml().render(bodyToRender, theme, mdOptions);
|
||||
|
||||
bodyHtml = this.mdToHtml().render(bodyToRender, theme, mdOptions);
|
||||
|
||||
this.setState({ bodyHtml: bodyHtml });
|
||||
this.setState({
|
||||
bodyHtml: result.html,
|
||||
lastRenderCssFiles: result.cssFiles,
|
||||
});
|
||||
}
|
||||
|
||||
titleField_keyDown(event) {
|
||||
@@ -1062,7 +1061,7 @@ class NoteTextComponent extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
printTo_(target, options) {
|
||||
async printTo_(target, options) {
|
||||
if (this.props.selectedNoteIds.length !== 1 || !this.webviewRef_.current) {
|
||||
throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
|
||||
}
|
||||
@@ -1073,13 +1072,13 @@ class NoteTextComponent extends React.Component {
|
||||
const previousTheme = Setting.value('theme');
|
||||
Setting.setValue('theme', Setting.THEME_LIGHT);
|
||||
this.lastSetHtml_ = '';
|
||||
this.updateHtml(tempBody, { useCustomCss: false });
|
||||
await this.updateHtml(tempBody, { useCustomCss: false });
|
||||
this.forceUpdate();
|
||||
|
||||
const restoreSettings = () => {
|
||||
const restoreSettings = async () => {
|
||||
Setting.setValue('theme', previousTheme);
|
||||
this.lastSetHtml_ = '';
|
||||
this.updateHtml(previousBody);
|
||||
await this.updateHtml(previousBody);
|
||||
this.forceUpdate();
|
||||
}
|
||||
|
||||
@@ -1101,7 +1100,7 @@ class NoteTextComponent extends React.Component {
|
||||
}, 100);
|
||||
}
|
||||
|
||||
commandSavePdf() {
|
||||
async commandSavePdf() {
|
||||
try {
|
||||
if (!this.state.note) throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
|
||||
|
||||
@@ -1112,15 +1111,15 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
if (!path) return;
|
||||
|
||||
this.printTo_('pdf', { path: path });
|
||||
await this.printTo_('pdf', { path: path });
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
commandPrint() {
|
||||
async commandPrint() {
|
||||
try {
|
||||
this.printTo_('printer');
|
||||
await this.printTo_('printer');
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
}
|
||||
@@ -1374,7 +1373,7 @@ class NoteTextComponent extends React.Component {
|
||||
if (note && this.state.folder && ['Search', 'Tag'].includes(this.props.notesParentType)) {
|
||||
toolbarItems.push({
|
||||
title: _('In: %s', this.state.folder.title),
|
||||
iconName: 'fa-folder-o',
|
||||
iconName: 'fa-book',
|
||||
enabled: false,
|
||||
});
|
||||
}
|
||||
@@ -1712,7 +1711,9 @@ class NoteTextComponent extends React.Component {
|
||||
|
||||
const htmlHasChanged = this.lastSetHtml_ !== html;
|
||||
if (htmlHasChanged) {
|
||||
let options = {codeTheme: theme.codeThemeCss};
|
||||
let options = {
|
||||
cssFiles: this.state.lastRenderCssFiles,
|
||||
};
|
||||
this.webviewRef_.current.wrappedInstance.send('setHtml', html, options);
|
||||
this.lastSetHtml_ = html;
|
||||
}
|
||||
|
@@ -40,6 +40,20 @@ class NoteTextViewerComponent extends React.Component {
|
||||
const fn = this.webviewListeners_[n];
|
||||
wv.addEventListener(n, fn);
|
||||
}
|
||||
|
||||
let isAlreadyReady = false;
|
||||
try {
|
||||
isAlreadyReady = !this.webviewRef_.current.isLoading()
|
||||
} catch (error) {
|
||||
// Ignore - it means the view has not started loading, and the DOM ready event has not been emitted yet
|
||||
// Error is "The WebView must be attached to the DOM and the dom-ready event emitted before this method can be called."
|
||||
}
|
||||
|
||||
// Edge-case - the webview was already ready by the time initWebview was
|
||||
// called - so manually call the domReady event to notify caller.
|
||||
if (isAlreadyReady) {
|
||||
this.webview_domReady({});
|
||||
}
|
||||
}
|
||||
|
||||
destroyWebview() {
|
||||
@@ -73,11 +87,21 @@ class NoteTextViewerComponent extends React.Component {
|
||||
}
|
||||
|
||||
printToPDF(options, callback) {
|
||||
return this.webviewRef_.current.printToPDF(options, callback);
|
||||
// In Electron 4x, printToPDF is broken so need to use this hack:
|
||||
// https://github.com/electron/electron/issues/16171#issuecomment-451090245
|
||||
|
||||
// return this.webviewRef_.current.printToPDF(options, callback);
|
||||
return this.webviewRef_.current.getWebContents().printToPDF(options, callback);
|
||||
}
|
||||
|
||||
print(options = {}) {
|
||||
return this.webviewRef_.current.print(options);
|
||||
// In Electron 4x, print is broken so need to use this hack:
|
||||
// https://github.com/electron/electron/issues/16219#issuecomment-451454948
|
||||
// Note that this is not a perfect workaround since it means the options are ignored
|
||||
// In particular it means that background images and colours won't be printed (printBackground property will be ignored)
|
||||
|
||||
// return this.webviewRef_.current.getWebContents().print({});
|
||||
return this.webviewRef_.current.getWebContents().executeJavaScript("window.print()")
|
||||
}
|
||||
|
||||
openDevTools() {
|
||||
|
@@ -13,6 +13,7 @@ const { bridge } = require("electron").remote.require("./bridge");
|
||||
const Menu = bridge().Menu;
|
||||
const MenuItem = bridge().MenuItem;
|
||||
const InteropServiceHelper = require("../InteropServiceHelper.js");
|
||||
const { substrWithEllipsis } = require('lib/string-utils');
|
||||
const { shim } = require('lib/shim');
|
||||
|
||||
class SideBarComponent extends React.Component {
|
||||
@@ -219,6 +220,8 @@ class SideBarComponent extends React.Component {
|
||||
if (anchorRef) anchorRef.current.focus();
|
||||
}
|
||||
}
|
||||
} else if (command.name === 'synchronize') {
|
||||
this.sync_click();
|
||||
} else {
|
||||
commandProcessed = false;
|
||||
}
|
||||
@@ -259,7 +262,7 @@ class SideBarComponent extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
itemContextMenu(event) {
|
||||
async itemContextMenu(event) {
|
||||
const itemId = event.target.getAttribute("data-id");
|
||||
if (itemId === Folder.conflictFolderId()) return;
|
||||
|
||||
@@ -268,9 +271,11 @@ class SideBarComponent extends React.Component {
|
||||
|
||||
let deleteMessage = "";
|
||||
if (itemType === BaseModel.TYPE_FOLDER) {
|
||||
deleteMessage = _("Delete notebook? All notes and sub-notebooks within this notebook will also be deleted.");
|
||||
const folder = await Folder.load(itemId);
|
||||
deleteMessage = _('Delete notebook "%s"?\n\nAll notes and sub-notebooks within this notebook will also be deleted.', substrWithEllipsis(folder.title, 0, 32));
|
||||
} else if (itemType === BaseModel.TYPE_TAG) {
|
||||
deleteMessage = _("Remove this tag from all the notes?");
|
||||
const tag = await Tag.load(itemId);
|
||||
deleteMessage = _('Remove tag "%s" from all notes?', substrWithEllipsis(tag.title, 0, 32));
|
||||
} else if (itemType === BaseModel.TYPE_SEARCH) {
|
||||
deleteMessage = _("Remove this search from the sidebar?");
|
||||
}
|
||||
@@ -728,7 +733,8 @@ class SideBarComponent extends React.Component {
|
||||
|
||||
return (
|
||||
<div ref={this.rootRef} onKeyDown={this.onKeyDown} className="side-bar" style={style}>
|
||||
<div style={{flex:1, overflowY: 'auto'}}>
|
||||
|
||||
<div style={{flex:1, overflowX: 'hidden', overflowY: 'auto'}}>
|
||||
{items}
|
||||
</div>
|
||||
<div style={{flex:0}}>
|
||||
|
102
ElectronClient/app/gui/VerticalResizer.jsx
Normal file
102
ElectronClient/app/gui/VerticalResizer.jsx
Normal file
@@ -0,0 +1,102 @@
|
||||
const React = require("react");
|
||||
const electron = require('electron');
|
||||
|
||||
class VerticalResizer extends React.PureComponent {
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.state = {
|
||||
parentRight: 0,
|
||||
parentHeight: 0,
|
||||
parentWidth: 0,
|
||||
drag: {
|
||||
startX: 0,
|
||||
lastX: 0,
|
||||
},
|
||||
};
|
||||
|
||||
this.onDragStart = this.onDragStart.bind(this);
|
||||
this.onDrag = this.onDrag.bind(this);
|
||||
this.onDragEnd = this.onDragEnd.bind(this);
|
||||
this.document_onDragOver = this.document_onDragOver.bind(this);
|
||||
}
|
||||
|
||||
document_onDragOver(event) {
|
||||
// This is just to prevent the cursor from changing to a "+" as it's dragged
|
||||
// over other elements. With this it stays a normal cursor.
|
||||
event.dataTransfer.dropEffect = 'none';
|
||||
}
|
||||
|
||||
onDragStart(event) {
|
||||
document.addEventListener('dragover', this.document_onDragOver)
|
||||
|
||||
event.dataTransfer.dropEffect= 'none';
|
||||
|
||||
const cursor = electron.screen.getCursorScreenPoint();
|
||||
|
||||
this.setState({
|
||||
drag: {
|
||||
startX: cursor.x,
|
||||
lastX: cursor.x,
|
||||
}
|
||||
});
|
||||
|
||||
if (this.props.onDragStart) this.props.onDragStart({});
|
||||
}
|
||||
|
||||
onDrag(event) {
|
||||
// If we got a drag event with no buttons pressed, it's the last drag event
|
||||
// that we should ignore, because it's sometimes use to put the dragged element
|
||||
// back to its original position (if there was no valid drop target), which we don't want.
|
||||
// Also if clientX, screenX, etc. are 0, it's also the last event and we want to ignore these buggy values.
|
||||
// const e = event.nativeEvent;
|
||||
// if (!e.buttons || (!e.clientX && !e.clientY && !e.screenX && !e.screenY)) return;
|
||||
|
||||
const cursor = electron.screen.getCursorScreenPoint();
|
||||
const newX = cursor.x;
|
||||
const delta = newX - this.state.drag.lastX;
|
||||
if (!delta) return;
|
||||
|
||||
this.setState({
|
||||
drag: Object.assign({}, this.state.drag, { lastX: newX }),
|
||||
}, () => {
|
||||
this.props.onDrag({ deltaX: delta });
|
||||
});
|
||||
}
|
||||
|
||||
onDragEnd(event) {
|
||||
document.removeEventListener('dragover', this.document_onDragOver);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
document.removeEventListener('dragover', this.document_onDragOver);
|
||||
}
|
||||
|
||||
render() {
|
||||
const debug = false;
|
||||
|
||||
const rootStyle = Object.assign({}, {
|
||||
height: '100%',
|
||||
width:5,
|
||||
borderColor:'red',
|
||||
borderWidth: debug ? 1 : 0,
|
||||
borderStyle:'solid',
|
||||
cursor: 'col-resize',
|
||||
boxSizing: 'border-box',
|
||||
opacity: 0,
|
||||
}, this.props.style);
|
||||
|
||||
return (
|
||||
<div
|
||||
style={rootStyle}
|
||||
draggable={true}
|
||||
onDragStart={this.onDragStart}
|
||||
onDrag={this.onDrag}
|
||||
onDragEnd={this.onDragEnd}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = VerticalResizer;
|
@@ -28,13 +28,11 @@
|
||||
ul ul, ul ol, ol ul, ol ol {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.katex { font-size: 1.3em; } /* This controls the global Katex font size*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body id="body">
|
||||
<div id="hlScriptContainer"></div>
|
||||
<div id="styleContainer"></div>
|
||||
<div id="markScriptContainer"></div>
|
||||
<div id="content" ondragstart="return false;" ondrop="return false;"></div>
|
||||
<script src="./lib.js"></script>
|
||||
@@ -58,62 +56,18 @@
|
||||
}
|
||||
});
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Handle dynamically loading HLJS when a code element is present
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
let hljsScriptAdded = false;
|
||||
let hljsLoaded = false;
|
||||
|
||||
function loadHljs(options) {
|
||||
hljsScriptAdded = true;
|
||||
|
||||
const script = document.createElement('script');
|
||||
script.onload = function () {
|
||||
hljsLoaded = true;
|
||||
applyHljs();
|
||||
};
|
||||
script.src = 'highlight/highlight.pack.js';
|
||||
document.getElementById('hlScriptContainer').appendChild(script);
|
||||
|
||||
const link = document.createElement('link');
|
||||
link.rel = 'stylesheet';
|
||||
// https://ace.c9.io/build/kitchen-sink.html
|
||||
// https://highlightjs.org/static/demo/
|
||||
link.href = 'highlight/styles/' + options.codeTheme;
|
||||
document.getElementById('hlScriptContainer').appendChild(link);
|
||||
}
|
||||
|
||||
function loadAndApplyHljs(options) {
|
||||
var codeElements = document.getElementsByClassName('code');
|
||||
if (!codeElements.length) return;
|
||||
|
||||
if (!hljsScriptAdded) {
|
||||
this.loadHljs(options);
|
||||
return;
|
||||
}
|
||||
|
||||
// If HLJS is not loaded yet, no need to do anything. When it loads
|
||||
// it will automatically apply the style to all the code elements.
|
||||
if (hljsLoaded) applyHljs(codeElements);
|
||||
}
|
||||
|
||||
function applyHljs(codeElements) {
|
||||
if (typeof codeElements === 'undefined') codeElements = document.getElementsByClassName('code');
|
||||
|
||||
for (var i = 0; i < codeElements.length; i++) {
|
||||
try {
|
||||
hljs.highlightBlock(codeElements[i]);
|
||||
} catch (error) {
|
||||
console.warn('Cannot highlight code', error);
|
||||
}
|
||||
const loadedCssFiles_ = {};
|
||||
function loadCssFiles(cssFiles) {
|
||||
for (let i = 0; i < cssFiles.length; i++) {
|
||||
const f = cssFiles[i];
|
||||
if (loadedCssFiles_[f]) continue;
|
||||
const link = document.createElement('link');
|
||||
link.rel = 'stylesheet';
|
||||
link.href = f;
|
||||
document.getElementById('styleContainer').appendChild(link);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// / Handle dynamically loading HLJS when a code element is present
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
// Note: the scroll position source of truth is "percentScroll_". This is easier to manage than scrollTop because
|
||||
// the scrollTop value depends on the images being loaded or not. For example, if the scrollTop is saved while
|
||||
// images are being displayed then restored while images are being reloaded, the new scrollTop might be changed
|
||||
@@ -150,21 +104,6 @@
|
||||
|
||||
contentElement.innerHTML = html;
|
||||
|
||||
loadAndApplyHljs(event.options);
|
||||
|
||||
// Remove the bullet from "ul" for checkbox lists and extra padding
|
||||
// const checkboxes = document.getElementsByClassName('checkbox');
|
||||
// for (let i = 0; i < checkboxes.length; i++) {
|
||||
// const cb = checkboxes[i];
|
||||
// const ul = cb.parentElement.parentElement;
|
||||
// if (!ul) {
|
||||
// console.warn('Unexpected layout for checkbox');
|
||||
// continue;
|
||||
// }
|
||||
// ul.style.listStyleType = 'none';
|
||||
// ul.style.paddingLeft = 0;
|
||||
// }
|
||||
|
||||
let previousContentHeight = contentElement.scrollHeight;
|
||||
let startTime = Date.now();
|
||||
ignoreNextScrollEvent = true;
|
||||
@@ -184,6 +123,8 @@
|
||||
}
|
||||
}, 1);
|
||||
}
|
||||
|
||||
loadCssFiles(event.options.cssFiles);
|
||||
}
|
||||
|
||||
let ignoreNextScrollEvent = false;
|
||||
@@ -347,49 +288,8 @@
|
||||
}
|
||||
});
|
||||
|
||||
function handleInternalLink(event, anchorNode) {
|
||||
const href = anchorNode.getAttribute('href');
|
||||
if (href.indexOf('#') === 0) {
|
||||
event.preventDefault();
|
||||
location.hash = href;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getParentAnchorElement(element) {
|
||||
let counter = 0;
|
||||
while (true) {
|
||||
|
||||
if (counter++ >= 10000) {
|
||||
console.warn('been looping for too long - exiting')
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!element) return null;
|
||||
if (element.nodeName === 'A') return element;
|
||||
element = element.parentElement;
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('click', function(event) {
|
||||
const anchor = getParentAnchorElement(event.target);
|
||||
if (!anchor) return;
|
||||
|
||||
// Prevent URLs added via <a> tags from being opened within the application itself
|
||||
// otherwise it would open the whole website within the WebView.
|
||||
if (!anchor.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, anchor)) return;
|
||||
|
||||
event.preventDefault();
|
||||
ipcProxySendToHost(anchor.getAttribute('href'));
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is an internal link, jump to the anchor directly
|
||||
if (anchor.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, anchor)) return;
|
||||
}
|
||||
webviewLib.initialize({
|
||||
postMessage: ipcProxySendToHost,
|
||||
});
|
||||
|
||||
// Disable drag and drop otherwise it's possible to drop a URL
|
||||
|
@@ -2,6 +2,11 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<!--
|
||||
No CPS because we need to allow everything due to some dependencies (eg. depd, which comes from maybe Node or Electron
|
||||
uses 'eval'.
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval'">
|
||||
-->
|
||||
<title>Joplin</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<link rel="stylesheet" href="css/fork-awesome.min.css">
|
||||
|
1
ElectronClient/app/locales/ar.json
Normal file
1
ElectronClient/app/locales/ar.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
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
@@ -1,5 +1,6 @@
|
||||
var locales = {};
|
||||
locales['en_GB'] = require('./en_GB.json');
|
||||
locales['ar'] = require('./ar.json');
|
||||
locales['ca'] = require('./ca.json');
|
||||
locales['cs_CZ'] = require('./cs_CZ.json');
|
||||
locales['da_DK'] = require('./da_DK.json');
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
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
1774
ElectronClient/app/package-lock.json
generated
1774
ElectronClient/app/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Joplin",
|
||||
"version": "1.0.127",
|
||||
"version": "1.0.140",
|
||||
"description": "Joplin for Desktop",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
@@ -8,7 +8,7 @@
|
||||
"pack": "node_modules/.bin/electron-builder --dir",
|
||||
"dist": "node_modules/.bin/electron-builder",
|
||||
"publish": "build -p always",
|
||||
"postinstall": "node compile.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts && install-app-deps",
|
||||
"postinstall": "node compile.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts && node electronRebuild.js",
|
||||
"compile": "node compile.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts"
|
||||
},
|
||||
"repository": {
|
||||
@@ -22,10 +22,12 @@
|
||||
},
|
||||
"build": {
|
||||
"appId": "net.cozic.joplin-desktop",
|
||||
"npmRebuild": false,
|
||||
"extraResources": [
|
||||
"build/icons/*"
|
||||
],
|
||||
"win": {
|
||||
"rfc3161TimeStampServer": "http://sha256timestamp.ws.symantec.com/sha256/timestamp",
|
||||
"icon": "../../Assets/Joplin.ico",
|
||||
"target": [
|
||||
{
|
||||
@@ -70,8 +72,9 @@
|
||||
"app-builder-bin": "^1.9.11",
|
||||
"babel-cli": "^6.26.0",
|
||||
"babel-preset-react": "^6.24.1",
|
||||
"electron": "^1.8.7",
|
||||
"electron-builder": "20.14.7"
|
||||
"electron": "4.0.5",
|
||||
"electron-builder": "20.38.5",
|
||||
"electron-rebuild": "^1.8.4"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"7zip-bin-linux": "^1.0.1",
|
||||
@@ -93,7 +96,7 @@
|
||||
"form-data": "^2.3.2",
|
||||
"formatcoords": "^1.1.3",
|
||||
"fs-extra": "^5.0.0",
|
||||
"highlight.js": "^9.12.0",
|
||||
"highlight.js": "^9.15.6",
|
||||
"html-entities": "^1.2.1",
|
||||
"image-type": "^3.0.0",
|
||||
"joplin-turndown": "^4.0.11",
|
||||
@@ -106,7 +109,6 @@
|
||||
"markdown-it": "^8.4.1",
|
||||
"markdown-it-katex": "^2.0.3",
|
||||
"md5": "^2.2.1",
|
||||
"mermaid": "^8.0.0-rc.8",
|
||||
"mime": "^2.3.1",
|
||||
"moment": "^2.22.2",
|
||||
"multiparty": "^4.2.1",
|
||||
@@ -125,13 +127,13 @@
|
||||
"server-destroy": "^1.0.1",
|
||||
"smalltalk": "^2.5.1",
|
||||
"sprintf-js": "^1.1.1",
|
||||
"sqlite3": "^4.0.4",
|
||||
"sqlite3": "^4.0.6",
|
||||
"string-padding": "^1.0.2",
|
||||
"string-to-stream": "^1.1.1",
|
||||
"syswide-cas": "^5.1.0",
|
||||
"tar": "^4.4.4",
|
||||
"tcp-port-used": "^0.1.2",
|
||||
"url-parse": "^1.4.1",
|
||||
"url-parse": "^1.4.3",
|
||||
"uuid": "^3.2.1",
|
||||
"valid-url": "^1.0.9",
|
||||
"xml2js": "^0.4.19"
|
||||
|
@@ -24,6 +24,11 @@ table td, table th {
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-corner {
|
||||
background: none;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
|
11
ElectronClient/package-lock.json
generated
11
ElectronClient/package-lock.json
generated
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"requires": true,
|
||||
"lockfileVersion": 1,
|
||||
"dependencies": {
|
||||
"diacritics": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
|
||||
"integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E="
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,17 +0,0 @@
|
||||
#!/bin/bash
|
||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
APP_DIR="$ROOT_DIR/app"
|
||||
|
||||
cd "$APP_DIR"
|
||||
VERSION="$(npm version patch)"
|
||||
git add -A
|
||||
git commit -m "Electron release $VERSION"
|
||||
git tag $VERSION
|
||||
git push && git push --tags
|
||||
|
||||
echo ""
|
||||
echo "Create a draft release at: https://github.com/laurent22/joplin/releases/tag/$VERSION"
|
||||
echo ""
|
||||
echo "Then run:"
|
||||
echo ""
|
||||
echo "git pull && node $APP_DIR/update-readme-download.js && git add -A && git commit -m 'Update website' && git push && git push --tags"
|
@@ -1,20 +1,26 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
# Title
|
||||
echo " _ _ _ _ _ _ "
|
||||
echo " | | (_) (_) | | | | | "
|
||||
echo " | | ___ _ __ _ _ __ _ _ __ ___| |_ __ _| | | ___ _ __ "
|
||||
echo " _ | |/ _ \\\| '_ \| | '_ \\ | | '_ \\\/ __| __/ _\` | | |/ _ \ '__|"
|
||||
echo " | |__| | (_) | |_) | | | | | | | | | \__ \ || (_| | | | __/ | "
|
||||
echo " \____/ \___/| .__/|_|_| |_| |_|_| |_|___/\__\__,_|_|_|\___|_| "
|
||||
echo " | | "
|
||||
echo " |_| "
|
||||
echo " _ _ _ "
|
||||
echo " | | ___ _ __ | (_)_ __ "
|
||||
echo " _ | |/ _ \| '_ \| | | '_ \ "
|
||||
echo "| |_| | (_) | |_) | | | | | |"
|
||||
echo " \___/ \___/| .__/|_|_|_| |_|"
|
||||
echo " |_|"
|
||||
echo ""
|
||||
echo "Linux Installer and Updater"
|
||||
|
||||
#-----------------------------------------------------
|
||||
# Variables
|
||||
#-----------------------------------------------------
|
||||
COLOR_RED=`tput setaf 1`
|
||||
COLOR_GREEN=`tput setaf 2`
|
||||
COLOR_RESET=`tput sgr0`
|
||||
|
||||
# Check and warn if running as root.
|
||||
if [[ $EUID = 0 ]] ; then
|
||||
if [[ $* != *--allow-root* ]] ; then
|
||||
echo "It is not recommended (nor necessary) to run this script as root. To do so anyway, please use '--allow-root'"
|
||||
echo "${COLOR_RED}It is not recommended (nor necessary) to run this script as root. To do so anyway, please use '--allow-root'${COLOR_RESET}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
@@ -27,8 +33,9 @@ fi
|
||||
version=$(curl --silent "https://api.github.com/repos/laurent22/joplin/releases/latest" | grep -Po '"tag_name": "v\K.*?(?=")')
|
||||
|
||||
# Check if it's in the latest version
|
||||
if [[ $(< ~/.joplin/VERSION) != "$version" ]]; then
|
||||
if [[ ! -e ~/.joplin/VERSION ]] || [[ $(< ~/.joplin/VERSION) != "$version" ]]; then
|
||||
|
||||
echo 'Downloading Joplin...'
|
||||
# Delete previous version
|
||||
rm -f ~/.joplin/*.AppImage ~/.local/share/applications/joplin.desktop ~/.joplin/VERSION
|
||||
|
||||
@@ -36,17 +43,21 @@ if [[ $(< ~/.joplin/VERSION) != "$version" ]]; then
|
||||
mkdir -p ~/.joplin/
|
||||
|
||||
# Download the latest version
|
||||
wget -O ~/.joplin/Joplin.AppImage https://github.com/laurent22/joplin/releases/download/v$version/Joplin-$version-x86_64.AppImage
|
||||
wget -nv --show-progress -O ~/.joplin/Joplin.AppImage https://github.com/laurent22/joplin/releases/download/v$version/Joplin-$version-x86_64.AppImage
|
||||
|
||||
# Gives execution privileges
|
||||
chmod +x ~/.joplin/Joplin.AppImage
|
||||
|
||||
echo "${COLOR_GREEN}OK${COLOR_RESET}"
|
||||
|
||||
#-----------------------------------------------------
|
||||
# Icon
|
||||
#-----------------------------------------------------
|
||||
|
||||
# Download icon
|
||||
wget -O ~/.joplin/Icon512.png https://joplin.cozic.net/images/Icon512.png
|
||||
echo 'Downloading icon...'
|
||||
wget -nv -O ~/.joplin/Icon512.png https://joplin.cozic.net/images/Icon512.png
|
||||
echo "${COLOR_GREEN}OK${COLOR_RESET}"
|
||||
|
||||
# Detect desktop environment
|
||||
if [ "$XDG_CURRENT_DESKTOP" = "" ]
|
||||
@@ -58,9 +69,13 @@ if [[ $(< ~/.joplin/VERSION) != "$version" ]]; then
|
||||
desktop=${desktop,,} # convert to lower case
|
||||
|
||||
# Create icon for Gnome
|
||||
if [[ $desktop =~ .*gnome.* ]] || [[ $desktop =~ .*kde.* ]]
|
||||
echo 'Create Desktop icon.'
|
||||
if [[ $desktop =~ .*gnome.*|.*kde.*|.*xfce.*|.*mate.* ]]
|
||||
then
|
||||
echo -e "[Desktop Entry]\nEncoding=UTF-8\nName=Joplin\nExec=/home/$USER/.joplin/Joplin.AppImage\nIcon=/home/$USER/.joplin/Icon512.png\nType=Application\nCategories=Application;" >> ~/.local/share/applications/joplin.desktop
|
||||
echo "${COLOR_GREEN}OK${COLOR_RESET}"
|
||||
else
|
||||
echo "${COLOR_RED}NOT DONE${COLOR_RESET}"
|
||||
fi
|
||||
|
||||
#-----------------------------------------------------
|
||||
@@ -68,10 +83,11 @@ if [[ $(< ~/.joplin/VERSION) != "$version" ]]; then
|
||||
#-----------------------------------------------------
|
||||
|
||||
# Informs the user that it has been installed and cleans variables
|
||||
echo 'Joplin installed in the version' $version
|
||||
echo "${COLOR_GREEN}Joplin version${COLOR_RESET}" $version "${COLOR_GREEN}installed.${COLOR_RESET}"
|
||||
# Add version
|
||||
echo $version > ~/.joplin/VERSION
|
||||
else
|
||||
echo 'You are now in the latest version.'
|
||||
echo "${COLOR_GREEN}You already have the latest version${COLOR_RESET}" $version "${COLOR_GREEN}installed.${COLOR_RESET}"
|
||||
fi
|
||||
echo 'Bye!'
|
||||
unset version
|
||||
|
73
README.md
73
README.md
@@ -20,9 +20,9 @@ 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.120/Joplin-Setup-1.0.120.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.120/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.120/Joplin-1.0.120.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.120/Joplin-1.0.120-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.135/Joplin-Setup-1.0.135.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.135/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.135/Joplin-1.0.135.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.135/Joplin-1.0.135-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.
|
||||
|
||||
@@ -36,7 +36,7 @@ wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_insta
|
||||
|
||||
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.237/joplin-v1.0.237.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.240/joplin-v1.0.240.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
|
||||
@@ -251,6 +251,24 @@ You can create a link to a note by specifying its ID in the URL. For example:
|
||||
|
||||
Since getting the ID of a note is not straightforward, each app provides a way to create such link. In the **desktop app**, right click on a note an select "Copy Markdown link". In the **mobile app**, open a note and, in the top right menu, select "Copy Markdown link". You can then paste this link anywhere in another note.
|
||||
|
||||
## Charts
|
||||
|
||||
You can create charts in Joplin using the [Mermaid syntax](https://mermaidjs.github.io/). To add such a graph, wrap the Mermaid script inside a "\`\`\`mermaid" code block like this:
|
||||
|
||||
```mermaid
|
||||
graph TD;
|
||||
A-->B;
|
||||
A-->C;
|
||||
B-->D;
|
||||
C-->D;
|
||||
```
|
||||
|
||||
This is how it would look with the Markdown on the left, and rendered graph on the right:
|
||||
|
||||
<img src="https://joplin.cozic.net/images/Mermaid.png" height="232px">
|
||||
|
||||
Note that Mermaid graphs are always rendered on a white background regardless of the current theme. This is because they can contain various colours that may not be compatible with the current theme.
|
||||
|
||||
## Math notation
|
||||
|
||||
Math expressions can be added using the [KaTeX notation](https://khan.github.io/KaTeX/). To add an inline equation, wrap the expression in `$EXPRESSION$`, eg. `$\sqrt{3x-1}+(1+x)^2$`. To create an expression block, wrap it as follow:
|
||||
@@ -269,7 +287,7 @@ For example:
|
||||
|
||||
Here is an example with the Markdown and rendered result side by side:
|
||||
|
||||
<img src="https://joplin.cozic.net/images/Katex.png" style="max-width: 100%; max-height: 35em;">
|
||||
<img src="https://joplin.cozic.net/images/Katex.png" height="400px">
|
||||
|
||||
## Checkboxes
|
||||
|
||||
@@ -340,30 +358,31 @@ Current translations:
|
||||
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
||||
| Language | Po File | Last translator | Percent done
|
||||
---|---|---|---|---
|
||||
 | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 57%
|
||||
 | Catalan | [ca](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ca.po) | jmontane, 2018 | 82%
|
||||
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić (trbuhom@net.hr) | 46%
|
||||
 | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt (lukas@aiya.cz) | 72%
|
||||
 | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | Morten Juhl-Johansen Zölde-Fejér (mjjzf@syntaktisk. | 74%
|
||||
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Michael Sonntag (ms@editorei.de) | 95%
|
||||
 | Arabic | [ar](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ar.po) | عبد الناصر سعيد (as@althobaity.com) | 73%
|
||||
 | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 56%
|
||||
 | Catalan | [ca](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ca.po) | jmontane, 2018 | 80%
|
||||
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić (trbuhom@net.hr) | 45%
|
||||
 | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt (lukas@aiya.cz) | 71%
|
||||
 | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | Morten Juhl-Johansen Zölde-Fejér (mjjzf@syntaktisk. | 72%
|
||||
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Michael Sonntag (ms@editorei.de) | 100%
|
||||
 | English | [en_GB](https://github.com/laurent22/joplin/blob/master/CliClient/locales/en_GB.po) | | 100%
|
||||
 | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín (f@mrtn.es) | 87%
|
||||
 | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Andros Fenollosa (andros@fenollosa.email) | 99%
|
||||
 | Français | [fr_FR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/fr_FR.po) | Laurent Cozic | 100%
|
||||
 | Galician | [gl_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/gl_ES.po) | Marcos Lans (marcoslansgarza@gmail.com) | 73%
|
||||
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 90%
|
||||
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 58%
|
||||
 | Nederlands | [nl_NL](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_NL.po) | Heimen Stoffels (vistausss@outlook.com) | 87%
|
||||
 | Norwegian | [nb_NO](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nb_NO.po) | Mats Estensen (code@mxe.no) | 95%
|
||||
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos (rnbastos@gmail.com) | 94%
|
||||
 | Română | [ro](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ro.po) | | 57%
|
||||
 | Slovenian | [sl_SI](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sl_SI.po) | | 72%
|
||||
 | Svenska | [sv](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sv.po) | Jonatan Nyberg (jonatan@autistici.org) | 98%
|
||||
 | Türkçe | [tr_TR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/tr_TR.po) | Zorbey Doğangüneş (zorbeyd@gmail.com) | 83%
|
||||
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov (artyom.karlov@gmail.com) | 88%
|
||||
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 99%
|
||||
 | 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_TW.po) | penguinsam (samliu@gmail.com) | 87%
|
||||
 | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | AWASHIRO Ikuya (ikunya@gmail.com) | 94%
|
||||
 | 한국말 | [ko](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ko.po) | | 96%
|
||||
 | Galician | [gl_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/gl_ES.po) | Marcos Lans (marcoslansgarza@gmail.com) | 71%
|
||||
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 88%
|
||||
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 56%
|
||||
 | Nederlands | [nl_NL](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_NL.po) | Heimen Stoffels (vistausss@outlook.com) | 86%
|
||||
 | Norwegian | [nb_NO](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nb_NO.po) | Mats Estensen (code@mxe.no) | 93%
|
||||
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos (rnbastos@gmail.com) | 93%
|
||||
 | Română | [ro](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ro.po) | | 56%
|
||||
 | Slovenian | [sl_SI](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sl_SI.po) | | 70%
|
||||
 | Svenska | [sv](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sv.po) | Jonatan Nyberg (jonatan@autistici.org) | 96%
|
||||
 | Türkçe | [tr_TR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/tr_TR.po) | Zorbey Doğangüneş (zorbeyd@gmail.com) | 93%
|
||||
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov (artyom.karlov@gmail.com) | 97%
|
||||
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 100%
|
||||
 | 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_TW.po) | penguinsam (samliu@gmail.com) | 86%
|
||||
 | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | AWASHIRO Ikuya (ikunya@gmail.com) | 93%
|
||||
 | 한국말 | [ko](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ko.po) | | 94%
|
||||
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
||||
|
||||
# Known bugs
|
||||
|
@@ -90,8 +90,8 @@ android {
|
||||
applicationId "net.cozic.joplin"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2097473
|
||||
versionName "1.0.237"
|
||||
versionCode 2097476
|
||||
versionName "1.0.240"
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "x86"
|
||||
}
|
||||
|
@@ -17,11 +17,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>10.0.29</string>
|
||||
<string>10.0.30</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>29</string>
|
||||
<string>30</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
|
@@ -299,16 +299,21 @@ class BaseApplication {
|
||||
const result = next(action);
|
||||
const newState = store.getState();
|
||||
let refreshNotes = false;
|
||||
let refreshTags = false;
|
||||
let refreshFolders = false;
|
||||
// let refreshTags = false;
|
||||
let refreshNotesUseSelectedNoteId = false;
|
||||
|
||||
reduxSharedMiddleware(store, next, action);
|
||||
await reduxSharedMiddleware(store, next, action);
|
||||
|
||||
if (this.hasGui() && ["NOTE_UPDATE_ONE", "NOTE_DELETE", "FOLDER_UPDATE_ONE", "FOLDER_DELETE"].indexOf(action.type) >= 0) {
|
||||
if (!await reg.syncTarget().syncStarted()) reg.scheduleSync(30 * 1000, { syncSteps: ["update_remote", "delete_remote"] });
|
||||
SearchEngine.instance().scheduleSyncTables();
|
||||
}
|
||||
|
||||
if (this.hasGui() && ["FOLDER_UPDATE_ONE", "FOLDER_UPDATE_ALL"].indexOf(action.type) >= 0) {
|
||||
refreshFolders = true;
|
||||
}
|
||||
|
||||
if (action.type == 'FOLDER_SELECT' || action.type === 'FOLDER_DELETE' || action.type === 'FOLDER_AND_NOTE_SELECT' || (action.type === 'SEARCH_UPDATE' && newState.notesParentType === 'Folder')) {
|
||||
Setting.setValue('activeFolderId', newState.selectedFolderId);
|
||||
this.currentFolder_ = newState.selectedFolderId ? await Folder.load(newState.selectedFolderId) : null;
|
||||
@@ -337,20 +342,20 @@ class BaseApplication {
|
||||
refreshNotes = true;
|
||||
}
|
||||
|
||||
if (action.type == 'NOTE_DELETE') {
|
||||
refreshTags = true;
|
||||
}
|
||||
// if (action.type == 'NOTE_DELETE') {
|
||||
// refreshTags = true;
|
||||
// }
|
||||
|
||||
if (refreshNotes) {
|
||||
await this.refreshNotes(newState, refreshNotesUseSelectedNoteId);
|
||||
}
|
||||
|
||||
if (refreshTags) {
|
||||
this.dispatch({
|
||||
type: 'TAG_UPDATE_ALL',
|
||||
items: await Tag.allWithNotes(),
|
||||
});
|
||||
}
|
||||
// if (refreshTags) {
|
||||
// this.dispatch({
|
||||
// type: 'TAG_UPDATE_ALL',
|
||||
// items: await Tag.allWithNotes(),
|
||||
// });
|
||||
// }
|
||||
|
||||
if ((action.type == 'SETTING_UPDATE_ONE' && (action.key == 'dateFormat' || action.key == 'timeFormat')) || (action.type == 'SETTING_UPDATE_ALL')) {
|
||||
time.setDateFormat(Setting.value('dateFormat'));
|
||||
@@ -389,10 +394,11 @@ class BaseApplication {
|
||||
}
|
||||
|
||||
if (action.type === 'NOTE_UPDATE_ONE') {
|
||||
// If there is a conflict, we refresh the folders so as to display "Conflicts" folder
|
||||
if (action.note && action.note.is_conflict) {
|
||||
await FoldersScreenUtils.refreshFolders();
|
||||
}
|
||||
refreshFolders = true;
|
||||
}
|
||||
|
||||
if (this.hasGui() && ((action.type == 'SETTING_UPDATE_ONE' && action.key.indexOf('folders.sortOrder') === 0) || action.type == 'SETTING_UPDATE_ALL')) {
|
||||
refreshFolders = 'now';
|
||||
}
|
||||
|
||||
if (this.hasGui() && action.type == 'SETTING_UPDATE_ONE' && action.key == 'sync.interval' || action.type == 'SETTING_UPDATE_ALL') {
|
||||
@@ -407,6 +413,14 @@ class BaseApplication {
|
||||
ResourceFetcher.instance().queueDownload(action.id);
|
||||
}
|
||||
|
||||
if (refreshFolders) {
|
||||
if (refreshFolders === 'now') {
|
||||
await FoldersScreenUtils.refreshFolders();
|
||||
} else {
|
||||
await FoldersScreenUtils.scheduleRefreshFolders();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@@ -195,6 +195,17 @@ class BaseModel {
|
||||
return this.modelSelectAll(q.sql);
|
||||
}
|
||||
|
||||
static async byIds(ids, options = null) {
|
||||
if (!ids.length) return [];
|
||||
if (!options) options = {};
|
||||
if (!options.fields) options.fields = '*';
|
||||
|
||||
let sql = 'SELECT ' + this.db().escapeFields(options.fields) + ' FROM `' + this.tableName() + '`';
|
||||
sql += ' WHERE id IN ("' + ids.join('","') + '")';
|
||||
let q = this.applySqlOptions(options, sql);
|
||||
return this.modelSelectAll(q.sql);
|
||||
}
|
||||
|
||||
static async search(options = null) {
|
||||
if (!options) options = {};
|
||||
if (!options.fields) options.fields = '*';
|
||||
|
@@ -148,7 +148,12 @@ class ClipperServer {
|
||||
writeResponse(200, response ? response : '');
|
||||
} catch (error) {
|
||||
this.logger().error(error);
|
||||
writeResponse(error.httpCode ? error.httpCode : 500, error.message);
|
||||
const httpCode = error.httpCode ? error.httpCode : 500;
|
||||
const msg = [];
|
||||
if (httpCode >= 500) msg.push('Internal Server Error');
|
||||
if (error.message) msg.push(error.message);
|
||||
|
||||
writeResponse(httpCode, { error: msg.join(': ') });
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,421 +2,32 @@ const MarkdownIt = require('markdown-it');
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = (new Entities()).encode;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const ObjectUtils = require('lib/ObjectUtils');
|
||||
const { shim } = require('lib/shim.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const md5 = require('md5');
|
||||
const MdToHtml_Katex = require('lib/MdToHtml_Katex');
|
||||
const StringUtils = require('lib/string-utils.js');
|
||||
const noteStyle = require('./MdToHtml/noteStyle');
|
||||
const rules = {
|
||||
image: require('./MdToHtml/rules/image'),
|
||||
checkbox: require('./MdToHtml/rules/checkbox'),
|
||||
katex: require('./MdToHtml/rules/katex'),
|
||||
link_open: require('./MdToHtml/rules/link_open'),
|
||||
html_block: require('./MdToHtml/rules/html_block'),
|
||||
html_inline: require('./MdToHtml/rules/html_inline'),
|
||||
highlight_keywords: require('./MdToHtml/rules/highlight_keywords'),
|
||||
};
|
||||
const setupLinkify = require('./MdToHtml/setupLinkify');
|
||||
const hljs = require('highlight.js');
|
||||
|
||||
class MdToHtml {
|
||||
|
||||
constructor(options = null) {
|
||||
if (!options) options = {};
|
||||
|
||||
this.loadedResources_ = {};
|
||||
this.cachedContent_ = null;
|
||||
this.cachedContentKey_ = null;
|
||||
|
||||
// Must include last "/"
|
||||
this.resourceBaseUrl_ = ('resourceBaseUrl' in options) ? options.resourceBaseUrl : null;
|
||||
}
|
||||
|
||||
makeContentKey(resources, body, style, options) {
|
||||
let k = [];
|
||||
for (let n in resources) {
|
||||
if (!resources.hasOwnProperty(n)) continue;
|
||||
const r = resources[n];
|
||||
k.push(r.id);
|
||||
}
|
||||
|
||||
k.push(md5(escape(body))); // https://github.com/pvorb/node-md5/issues/41
|
||||
k.push(md5(JSON.stringify(style)));
|
||||
k.push(md5(JSON.stringify(options)));
|
||||
return k.join('_');
|
||||
}
|
||||
|
||||
clearCache() {
|
||||
this.cachedContent_ = null;
|
||||
this.cachedContentKey_ = null;
|
||||
}
|
||||
|
||||
renderAttrs_(attrs) {
|
||||
if (!attrs) return '';
|
||||
|
||||
let output = [];
|
||||
for (let i = 0; i < attrs.length; i++) {
|
||||
const n = attrs[i][0];
|
||||
const v = attrs[i].length >= 2 ? attrs[i][1] : null;
|
||||
|
||||
if (n === 'alt' && !v) {
|
||||
continue;
|
||||
} else if (n === 'src') {
|
||||
output.push('src="' + htmlentities(v) + '"');
|
||||
} else {
|
||||
output.push(n + '="' + (v ? htmlentities(v) : '') + '"');
|
||||
}
|
||||
}
|
||||
return output.join(' ');
|
||||
}
|
||||
|
||||
getAttr_(attrs, name, defaultValue = null) {
|
||||
for (let i = 0; i < attrs.length; i++) {
|
||||
if (attrs[i][0] === name) return attrs[i].length > 1 ? attrs[i][1] : null;
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
setAttr_(attrs, name, value) {
|
||||
for (let i = 0; i < attrs.length; i++) {
|
||||
if (attrs[i][0] === name) {
|
||||
attrs[i][1] = value;
|
||||
return attrs;
|
||||
}
|
||||
}
|
||||
attrs.push([name, value]);
|
||||
return attrs;
|
||||
}
|
||||
|
||||
async loadResource(id, options) {
|
||||
// Initially set to to an empty object to make
|
||||
// it clear that it is being loaded. Otherwise
|
||||
// it sometimes results in multiple calls to
|
||||
// loadResource() for the same resource.
|
||||
this.loadedResources_[id] = {};
|
||||
|
||||
const resource = await Resource.load(id);
|
||||
|
||||
if (!resource) {
|
||||
// Can happen for example if an image is attached to a note, but the resource hasn't
|
||||
// been downloaded from the sync target yet.
|
||||
console.info('Cannot load resource: ' + id);
|
||||
delete this.loadedResources_[id];
|
||||
return;
|
||||
}
|
||||
|
||||
const localState = await Resource.localState(resource);
|
||||
|
||||
if (localState.fetch_status !== Resource.FETCH_STATUS_DONE) {
|
||||
delete this.loadedResources_[id];
|
||||
console.info('Resource not yet fetched: ' + id);
|
||||
return;
|
||||
}
|
||||
|
||||
this.loadedResources_[id] = resource;
|
||||
|
||||
if (options.onResourceLoaded) options.onResourceLoaded();
|
||||
}
|
||||
|
||||
renderImage_(attrs, options) {
|
||||
const title = this.getAttr_(attrs, 'title');
|
||||
const href = this.getAttr_(attrs, 'src');
|
||||
|
||||
if (!Resource.isResourceUrl(href)) {
|
||||
return '<img data-from-md title="' + htmlentities(title) + '" src="' + href + '"/>';
|
||||
}
|
||||
|
||||
const resourceId = Resource.urlToId(href);
|
||||
const resource = this.loadedResources_[resourceId];
|
||||
if (!resource) {
|
||||
this.loadResource(resourceId, options);
|
||||
return '';
|
||||
}
|
||||
|
||||
if (!resource.id) return ''; // Resource is being loaded
|
||||
|
||||
const mime = resource.mime ? resource.mime.toLowerCase() : '';
|
||||
if (Resource.isSupportedImageMimeType(mime)) {
|
||||
let src = './' + Resource.filename(resource);
|
||||
if (this.resourceBaseUrl_ !== null) src = this.resourceBaseUrl_ + src;
|
||||
let output = '<img data-from-md data-resource-id="' + resource.id + '" title="' + htmlentities(title) + '" src="' + src + '"/>';
|
||||
return output;
|
||||
}
|
||||
|
||||
return '[Image: ' + htmlentities(resource.title) + ' (' + htmlentities(mime) + ')]';
|
||||
}
|
||||
|
||||
renderImageHtml_(before, src, after, options) {
|
||||
const resourceId = Resource.urlToId(src);
|
||||
const resource = this.loadedResources_[resourceId];
|
||||
if (!resource) {
|
||||
this.loadResource(resourceId, options);
|
||||
return '';
|
||||
}
|
||||
|
||||
if (!resource.id) return ''; // Resource is being loaded
|
||||
|
||||
const mime = resource.mime ? resource.mime.toLowerCase() : '';
|
||||
if (Resource.isSupportedImageMimeType(mime)) {
|
||||
let newSrc = './' + Resource.filename(resource);
|
||||
if (this.resourceBaseUrl_ !== null) newSrc = this.resourceBaseUrl_ + newSrc;
|
||||
let output = '<img ' + before + ' data-resource-id="' + resource.id + '" src="' + newSrc + '" ' + after + '/>';
|
||||
return output;
|
||||
}
|
||||
|
||||
return '[Image: ' + htmlentities(resource.title) + ' (' + htmlentities(mime) + ')]';
|
||||
}
|
||||
|
||||
renderOpenLink_(attrs, options) {
|
||||
let href = this.getAttr_(attrs, 'href');
|
||||
const text = this.getAttr_(attrs, 'text');
|
||||
const isResourceUrl = Resource.isResourceUrl(href);
|
||||
const title = isResourceUrl ? this.getAttr_(attrs, 'title') : href;
|
||||
|
||||
let resourceIdAttr = "";
|
||||
let icon = "";
|
||||
let hrefAttr = '#';
|
||||
if (isResourceUrl) {
|
||||
const resourceId = Resource.pathToId(href);
|
||||
href = "joplin://" + resourceId;
|
||||
resourceIdAttr = "data-resource-id='" + resourceId + "'";
|
||||
icon = '<span class="resource-icon"></span>';
|
||||
} else {
|
||||
// If the link is a plain URL (as opposed to a resource link), set the href to the actual
|
||||
// link. This allows the link to be exported too when exporting to PDF.
|
||||
hrefAttr = href;
|
||||
}
|
||||
|
||||
const js = options.postMessageSyntax + "(" + JSON.stringify(href) + "); return false;";
|
||||
let output = "<a data-from-md " + resourceIdAttr + " title='" + htmlentities(title) + "' href='" + hrefAttr + "' onclick='" + js + "'>" + icon;
|
||||
return output;
|
||||
}
|
||||
|
||||
renderCloseLink_(attrs, options) {
|
||||
return '</a>';
|
||||
}
|
||||
|
||||
rendererPlugin_(language) {
|
||||
if (!language) return null;
|
||||
|
||||
if (!this.rendererPlugins_) {
|
||||
this.rendererPlugins_ = {};
|
||||
this.rendererPlugins_['katex'] = new MdToHtml_Katex();
|
||||
}
|
||||
|
||||
return language in this.rendererPlugins_ ? this.rendererPlugins_[language] : null;
|
||||
}
|
||||
|
||||
parseInlineCodeLanguage_(content) {
|
||||
const m = content.match(/^\{\.([a-zA-Z0-9]+)\}/);
|
||||
if (m && m.length >= 2) {
|
||||
const language = m[1];
|
||||
return {
|
||||
language: language,
|
||||
newContent: content.substr(language.length + 3),
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
urldecode_(str) {
|
||||
try {
|
||||
return decodeURIComponent((str+'').replace(/\+/g, '%20'));
|
||||
} catch (error) {
|
||||
// decodeURIComponent can throw if the string contains non-encoded data (for example "100%")
|
||||
// so in this case just return the non encoded string.
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
renderTokens_(markdownIt, tokens, options) {
|
||||
let output = [];
|
||||
let previousToken = null;
|
||||
let anchorAttrs = [];
|
||||
let extraCssBlocks = {};
|
||||
let anchorHrefs = [];
|
||||
|
||||
for (let i = 0; i < tokens.length; i++) {
|
||||
let t = tokens[i];
|
||||
const nextToken = i < tokens.length ? tokens[i+1] : null;
|
||||
|
||||
let tag = t.tag;
|
||||
let openTag = null;
|
||||
let closeTag = null;
|
||||
let attrs = t.attrs ? t.attrs : [];
|
||||
let tokenContent = t.content ? t.content : '';
|
||||
const isCodeBlock = tag === 'code' && t.block;
|
||||
const isInlineCode = t.type === 'code_inline';
|
||||
const codeBlockLanguage = t && t.info ? t.info : null;
|
||||
let rendererPlugin = null;
|
||||
let rendererPluginOptions = { tagType: 'inline' };
|
||||
let linkHref = null;
|
||||
|
||||
if (isCodeBlock) rendererPlugin = this.rendererPlugin_(codeBlockLanguage);
|
||||
|
||||
if (isInlineCode) {
|
||||
openTag = null;
|
||||
} else if (tag && (t.type.indexOf('html_inline') >= 0 || t.type.indexOf('html_block') >= 0)) {
|
||||
openTag = null;
|
||||
} else if (tag && t.type.indexOf('_open') >= 0) {
|
||||
openTag = tag;
|
||||
} else if (tag && t.type.indexOf('_close') >= 0) {
|
||||
closeTag = tag;
|
||||
} else if (tag && t.type.indexOf('inline') >= 0) {
|
||||
openTag = tag;
|
||||
} else if (t.type === 'link_open') {
|
||||
openTag = 'a';
|
||||
} else if (isCodeBlock) {
|
||||
if (rendererPlugin) {
|
||||
openTag = null;
|
||||
} else {
|
||||
openTag = 'pre';
|
||||
}
|
||||
}
|
||||
|
||||
if (openTag) {
|
||||
if (openTag === 'a') {
|
||||
anchorAttrs.push(attrs);
|
||||
anchorHrefs.push(this.getAttr_(attrs, 'href'));
|
||||
output.push(this.renderOpenLink_(attrs, options));
|
||||
} else {
|
||||
const attrsHtml = this.renderAttrs_(attrs);
|
||||
output.push('<' + openTag + (attrsHtml ? ' ' + attrsHtml : '') + '>');
|
||||
}
|
||||
}
|
||||
|
||||
if (isCodeBlock) {
|
||||
const codeAttrs = ['code'];
|
||||
if (!rendererPlugin) {
|
||||
if (codeBlockLanguage) codeAttrs.push(t.info); // t.info contains the language when the token is a codeblock
|
||||
output.push('<code class="' + codeAttrs.join(' ') + '">');
|
||||
}
|
||||
} else if (isInlineCode) {
|
||||
const result = this.parseInlineCodeLanguage_(tokenContent);
|
||||
if (result) {
|
||||
rendererPlugin = this.rendererPlugin_(result.language);
|
||||
tokenContent = result.newContent;
|
||||
}
|
||||
|
||||
if (!rendererPlugin) {
|
||||
output.push('<code class="inline-code">');
|
||||
}
|
||||
}
|
||||
|
||||
if (t.type === 'math_inline' || t.type === 'math_block') {
|
||||
rendererPlugin = this.rendererPlugin_('katex');
|
||||
rendererPluginOptions = { tagType: t.type === 'math_block' ? 'block' : 'inline' };
|
||||
}
|
||||
|
||||
if (rendererPlugin) {
|
||||
rendererPlugin.loadAssets().catch((error) => {
|
||||
console.warn('MdToHtml: Error loading assets for ' + rendererPlugin.name() + ': ', error.message);
|
||||
});
|
||||
}
|
||||
|
||||
if (t.type === 'image') {
|
||||
if (tokenContent) attrs.push(['title', tokenContent]);
|
||||
output.push(this.renderImage_(attrs, options));
|
||||
} else if (t.type === 'html_inline' || t.type === 'html_block') {
|
||||
output.push(t.content);
|
||||
} else if (t.type === 'softbreak') {
|
||||
output.push('<br/>');
|
||||
} else if (t.type === 'hardbreak') {
|
||||
output.push('<br/>');
|
||||
} else if (t.type === 'hr') {
|
||||
output.push('<hr/>');
|
||||
} else {
|
||||
if (t.children) {
|
||||
const parsedChildren = this.renderTokens_(markdownIt, t.children, options);
|
||||
output = output.concat(parsedChildren);
|
||||
} else {
|
||||
if (tokenContent) {
|
||||
if ((isCodeBlock || isInlineCode) && rendererPlugin) {
|
||||
output = rendererPlugin.processContent(output, tokenContent, isCodeBlock ? 'block' : 'inline');
|
||||
} else if (rendererPlugin) {
|
||||
output = rendererPlugin.processContent(output, tokenContent, rendererPluginOptions.tagType);
|
||||
} else {
|
||||
output.push(htmlentities(tokenContent));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (nextToken && nextToken.tag === 'li' && t.tag === 'p') {
|
||||
closeTag = null;
|
||||
} else if (t.type === 'link_close') {
|
||||
closeTag = 'a';
|
||||
} else if (tag && t.type.indexOf('inline') >= 0) {
|
||||
closeTag = openTag;
|
||||
} else if (isCodeBlock) {
|
||||
if (!rendererPlugin) closeTag = openTag;
|
||||
}
|
||||
|
||||
if (isCodeBlock) {
|
||||
if (!rendererPlugin) {
|
||||
output.push('</code>');
|
||||
}
|
||||
} else if (isInlineCode) {
|
||||
if (!rendererPlugin) {
|
||||
output.push('</code>');
|
||||
}
|
||||
}
|
||||
|
||||
if (closeTag) {
|
||||
if (closeTag === 'a') {
|
||||
const currentAnchorAttrs = anchorAttrs.pop();
|
||||
|
||||
// NOTE: Disabled for now due to this:
|
||||
// https://github.com/laurent22/joplin/issues/318#issuecomment-375854848
|
||||
|
||||
// const previousContent = output.length ? output[output.length - 1].trim() : '';
|
||||
// const anchorHref = this.getAttr_(currentAnchorAttrs, 'href', '').trim();
|
||||
|
||||
// Optimisation: If the content of the anchor is the same as the URL, we replace the content
|
||||
// by (Link). This is to shorten the text, which is important especially when the note comes
|
||||
// from imported HTML, which can contain many such links and make the text unreadble. An example
|
||||
// would be a movie review that has multiple links to allow a user to rate the film from 1 to 5 stars.
|
||||
// In the original page, it might be rendered as stars, via CSS, but in the imported note it would look like this:
|
||||
// http://example.com/rate/1 http://example.com/rate/2 http://example.com/rate/3
|
||||
// http://example.com/rate/4 http://example.com/rate/5
|
||||
// which would take a lot of screen space even though it doesn't matter since the user is unlikely
|
||||
// to rate the film from the note. This is actually a nice example, still readable, but there is way
|
||||
// worse that this in notes that come from web-clipped content.
|
||||
// With this change, the links will still be preserved but displayed like
|
||||
// (link) (link) (link) (link) (link)
|
||||
|
||||
// if (this.urldecode_(previousContent) === htmlentities(this.urldecode_(anchorHref))) {
|
||||
// output.pop();
|
||||
// output.push(_('(Link)'));
|
||||
// }
|
||||
|
||||
output.push(this.renderCloseLink_(currentAnchorAttrs, options));
|
||||
} else {
|
||||
output.push('</' + closeTag + '>');
|
||||
}
|
||||
}
|
||||
|
||||
if (rendererPlugin) {
|
||||
const extraCss = rendererPlugin.extraCss();
|
||||
const name = rendererPlugin.name();
|
||||
if (extraCss && !(name in extraCssBlocks)) {
|
||||
extraCssBlocks[name] = extraCss;
|
||||
}
|
||||
}
|
||||
|
||||
previousToken = t;
|
||||
}
|
||||
|
||||
// Insert the extra CSS at the top of the HTML
|
||||
|
||||
if (!ObjectUtils.isEmpty(extraCssBlocks)) {
|
||||
const temp = ['<style>'];
|
||||
for (let n in extraCssBlocks) {
|
||||
if (!extraCssBlocks.hasOwnProperty(n)) continue;
|
||||
temp.push(extraCssBlocks[n]);
|
||||
}
|
||||
temp.push('</style>');
|
||||
|
||||
output = temp.concat(output);
|
||||
}
|
||||
|
||||
return output.join('');
|
||||
}
|
||||
|
||||
applyHighlightedKeywords_(body, keywords) {
|
||||
if (!keywords.length) return body;
|
||||
return StringUtils.surroundKeywords(keywords, body, '<span class="highlighted-keyword">', '</span>');
|
||||
this.cachedOutputs_ = {};
|
||||
}
|
||||
|
||||
render(body, style, options = null) {
|
||||
@@ -425,325 +36,90 @@ class MdToHtml {
|
||||
if (!options.paddingBottom) options.paddingBottom = '0';
|
||||
if (!options.highlightedKeywords) options.highlightedKeywords = [];
|
||||
|
||||
const cacheKey = this.makeContentKey(this.loadedResources_, body, style, options);
|
||||
if (this.cachedContentKey_ === cacheKey) return this.cachedContent_;
|
||||
const cacheKey = md5(escape(body + JSON.stringify(options) + JSON.stringify(style)));
|
||||
const cachedOutput = this.cachedOutputs_[cacheKey];
|
||||
if (cachedOutput) return cachedOutput;
|
||||
|
||||
const md = new MarkdownIt({
|
||||
const context = {
|
||||
css: {},
|
||||
cssFiles: {},
|
||||
assetLoaders: {},
|
||||
};
|
||||
|
||||
const markdownIt = new MarkdownIt({
|
||||
breaks: true,
|
||||
linkify: true,
|
||||
html: true,
|
||||
highlight: function(str, lang) {
|
||||
try {
|
||||
let hlCode = '';
|
||||
|
||||
if (lang && hljs.getLanguage(lang)) {
|
||||
hlCode = hljs.highlight(lang, str, true).value;
|
||||
} else {
|
||||
hlCode = hljs.highlightAuto(str).value;
|
||||
}
|
||||
|
||||
if (shim.isReactNative()) {
|
||||
context.css['hljs'] = shim.loadCssFromJs(options.codeTheme);
|
||||
} else {
|
||||
context.cssFiles['hljs'] = 'highlight/styles/' + options.codeTheme;
|
||||
}
|
||||
|
||||
return '<pre class="hljs"><code>' + hlCode + '</code></pre>';
|
||||
} catch (error) {
|
||||
return '<pre class="hljs"><code>' + markdownIt.utils.escapeHtml(str) + '</code></pre>';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
body = this.applyHighlightedKeywords_(body, options.highlightedKeywords);
|
||||
const ruleOptions = Object.assign({}, options, { resourceBaseUrl: this.resourceBaseUrl_ });
|
||||
|
||||
// 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) {
|
||||
// matches all local file URI on Win/Unix/MacOS systems including reserved characters in some OS (i.e. no OS specific sanity check)
|
||||
self.re.file = new RegExp('^[\\/]{2,3}[\\S]+');
|
||||
}
|
||||
if (self.re.file.test(tail)) {
|
||||
return tail.match(self.re.file)[0].length;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
markdownIt.use(rules.image(context, ruleOptions));
|
||||
markdownIt.use(rules.checkbox(context, ruleOptions));
|
||||
markdownIt.use(rules.link_open(context, ruleOptions));
|
||||
markdownIt.use(rules.html_block(context, ruleOptions));
|
||||
markdownIt.use(rules.katex(context, ruleOptions));
|
||||
markdownIt.use(rules.highlight_keywords(context, ruleOptions));
|
||||
|
||||
// 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);/;
|
||||
setupLinkify(markdownIt);
|
||||
|
||||
// url should be normalized at this point, and existing entities are decoded
|
||||
var str = url.trim().toLowerCase();
|
||||
const renderedBody = markdownIt.render(body);
|
||||
|
||||
return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;
|
||||
const cssStrings = noteStyle(style, options);
|
||||
|
||||
for (let k in context.css) {
|
||||
if (!context.css.hasOwnProperty(k)) continue;
|
||||
cssStrings.push(context.css[k]);
|
||||
}
|
||||
|
||||
// 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
|
||||
// Katex and use an up-to-date version of Katex (as of 2018, the plugin is still using 0.6, which is
|
||||
// buggy instead of 0.9).
|
||||
md.use(require('markdown-it-katex'));
|
||||
|
||||
// Hack to make checkboxes clickable. Ideally, checkboxes should be parsed properly in
|
||||
// renderTokens_(), but for now this hack works. Marking it with HORRIBLE_HACK so
|
||||
// that it can be removed and replaced later on.
|
||||
const HORRIBLE_HACK = true;
|
||||
|
||||
if (HORRIBLE_HACK) {
|
||||
let counter = -1;
|
||||
while (body.indexOf('- [ ]') >= 0 || body.indexOf('- [X]') >= 0 || body.indexOf('- [x]') >= 0) {
|
||||
body = body.replace(/- \[(X| |x)\]/, function(v, p1) {
|
||||
let s = p1 == ' ' ? 'NOTICK' : 'TICK';
|
||||
counter++;
|
||||
return '- mJOPmCHECKBOXm' + s + 'm' + counter + 'm';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const env = {};
|
||||
const tokens = md.parse(body, env);
|
||||
|
||||
let renderedBody = this.renderTokens_(md, tokens, options);
|
||||
|
||||
// console.info(body);
|
||||
// console.info(tokens);
|
||||
// console.info(renderedBody);
|
||||
|
||||
if (HORRIBLE_HACK) {
|
||||
let loopCount = 0;
|
||||
while (renderedBody.indexOf('mJOPm') >= 0) {
|
||||
renderedBody = renderedBody.replace(/mJOPmCHECKBOXm([A-Z]+)m(\d+)m/, function(v, type, index) {
|
||||
const js = options.postMessageSyntax + "('checkboxclick:" + type + ':' + index + "'); this.classList.contains('tick') ? this.classList.remove('tick') : this.classList.add('tick'); return false;";
|
||||
return '<a data-from-md href="#" onclick="' + js + '" class="checkbox ' + (type == 'NOTICK' ? '' : 'tick') + '"><span>' + '' + '</span></a>';
|
||||
});
|
||||
if (loopCount++ >= 9999) break;
|
||||
}
|
||||
}
|
||||
|
||||
renderedBody = renderedBody.replace(/<img(.*?)src=["'](.*?)["'](.*?)\/>/g, (v, before, src, after) => {
|
||||
if (!Resource.isResourceUrl(src)) return '<img ' + before + ' src="' + src + '" ' + after + '/>';
|
||||
return this.renderImageHtml_(before, src, after, options);
|
||||
});
|
||||
|
||||
// To disable meta tags that would refresh the page - eg "<meta http-equiv="refresh" content="5; url=/">"
|
||||
// Also disable a few other tags that are likely not meant to be rendered.
|
||||
// https://github.com/laurent22/joplin/issues/769
|
||||
renderedBody = renderedBody.replace(/<(meta|title|body|html|script)/, '<$1');
|
||||
|
||||
// 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}
|
||||
article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}
|
||||
pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}
|
||||
b,strong{font-weight:bolder}small{font-size:80%}img{border-style:none}
|
||||
`;
|
||||
|
||||
const fontFamily = "'Avenir', 'Arial', sans-serif";
|
||||
|
||||
const css = `
|
||||
body {
|
||||
font-size: ` + style.htmlFontSize + `;
|
||||
color: ` + style.htmlColor + `;
|
||||
line-height: ` + style.htmlLineHeight + `;
|
||||
background-color: ` + style.htmlBackgroundColor + `;
|
||||
font-family: ` + fontFamily + `;
|
||||
padding-bottom: ` + options.paddingBottom + `;
|
||||
}
|
||||
::-webkit-scrollbar {
|
||||
width: 7px;
|
||||
}
|
||||
::-webkit-scrollbar-track {
|
||||
border: none;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: rgba(100, 100, 100, 0.3);
|
||||
border-radius: 5px;
|
||||
}
|
||||
::-webkit-scrollbar-track:hover {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: rgba(100, 100, 100, 0.7);
|
||||
}
|
||||
p, h1, h2, h3, h4, h5, h6, ul, table {
|
||||
margin-top: .6em;
|
||||
margin-bottom: .65em;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
line-height: 1.5em;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid ` + style.htmlDividerColor + `;
|
||||
padding-bottom: .3em;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.3em;
|
||||
font-weight: bold;
|
||||
padding-bottom: .1em; */
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
h4, h5, h6 {
|
||||
font-size: 1em;
|
||||
font-weight: bold;
|
||||
}
|
||||
a {
|
||||
color: ` + style.htmlLinkColor + `;
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 0;
|
||||
margin-left: 1.7em;
|
||||
}
|
||||
li {
|
||||
margin-bottom: .4em;
|
||||
}
|
||||
li p {
|
||||
margin-top: 0.2em;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.resource-icon {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
top: .5em;
|
||||
text-decoration: none;
|
||||
width: 1.15em;
|
||||
height: 1.45em;
|
||||
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>");
|
||||
}
|
||||
blockquote {
|
||||
border-left: 4px solid ` + style.htmlCodeBorderColor + `;
|
||||
padding-left: 1.2em;
|
||||
margin-left: 0;
|
||||
opacity: .7;
|
||||
}
|
||||
table {
|
||||
text-align: left-align;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
background-color: ` + style.htmlBackgroundColor + `;
|
||||
}
|
||||
td, th {
|
||||
padding: .5em 1em .5em 1em;
|
||||
font-size: ` + style.htmlFontSize + `;
|
||||
color: ` + style.htmlColor + `;
|
||||
font-family: ` + fontFamily + `;
|
||||
}
|
||||
td {
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
}
|
||||
th {
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
border-bottom: 2px solid ` + style.htmlCodeBorderColor + `;
|
||||
background-color: ` + style.htmlTableBackgroundColor + `;
|
||||
}
|
||||
tr:nth-child(even) {
|
||||
background-color: ` + style.htmlTableBackgroundColor + `;
|
||||
}
|
||||
tr:hover {
|
||||
background-color: ` + style.raisedBackgroundColor + `;
|
||||
}
|
||||
hr {
|
||||
border: none;
|
||||
border-bottom: 2px solid ` + style.htmlDividerColor + `;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
.inline-code {
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
background-color: ` + style.htmlCodeBackgroundColor + `;
|
||||
padding-right: .2em;
|
||||
padding-left: .2em;
|
||||
border-radius: .25em;
|
||||
color: ` + style.htmlCodeColor + `;
|
||||
font-size: ` + style.htmlCodeFontSize + `;
|
||||
}
|
||||
|
||||
.highlighted-keyword {
|
||||
background-color: #F3B717;
|
||||
color: black;
|
||||
}
|
||||
|
||||
/*
|
||||
This is to fix https://github.com/laurent22/joplin/issues/764
|
||||
Without this, the tag attached to an equation float at an absolute position of the page,
|
||||
instead of a position relative to the container.
|
||||
*/
|
||||
.katex-display>.katex>.katex-html {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
a.checkbox {
|
||||
border: 1pt solid ` + style.htmlColor + `;
|
||||
border-radius: 2pt;
|
||||
width: 1.1em;
|
||||
height: 1.1em;
|
||||
background-color: rgba(0,0,0,0);
|
||||
text-decoration: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
top: -0.3em;
|
||||
margin-right: 0.3em;
|
||||
}
|
||||
|
||||
a.checkbox.tick:after {
|
||||
content: "✓";
|
||||
}
|
||||
|
||||
a.checkbox.tick {
|
||||
color: ` + style.htmlColor + `;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body {
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.code, .inline-code {
|
||||
border: 1px solid #CBCBCB;
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
// To style the checkboxes in print when webkit-print-color-adjust is not enabled.
|
||||
// Keep it there for now in case that CSS parameter needs to be removed.
|
||||
|
||||
const styleHtml = '<style>' + normalizeCss + "\n" + css + '</style>';
|
||||
|
||||
const output = styleHtml + renderedBody;
|
||||
|
||||
// console.info('<!DOCTYPE html><html><head><meta charset="UTF-8">' + output + '</body></html>');
|
||||
|
||||
this.cachedContent_ = output;
|
||||
this.cachedContentKey_ = cacheKey;
|
||||
return this.cachedContent_;
|
||||
}
|
||||
|
||||
toggleTickAt(body, index) {
|
||||
let counter = -1;
|
||||
while (body.indexOf('- [ ]') >= 0 || body.indexOf('- [X]') >= 0 || body.indexOf('- [x]') >= 0) {
|
||||
counter++;
|
||||
|
||||
body = body.replace(/- \[(X| |x)\]/, function(v, p1) {
|
||||
let s = p1 == ' ' ? 'NOTICK' : 'TICK';
|
||||
if (index == counter) {
|
||||
s = s == 'NOTICK' ? 'TICK' : 'NOTICK';
|
||||
}
|
||||
return '°°JOP°CHECKBOX°' + s + '°°';
|
||||
for (let k in context.assetLoaders) {
|
||||
if (!context.assetLoaders.hasOwnProperty(k)) continue;
|
||||
context.assetLoaders[k]().catch(error => {
|
||||
console.warn('MdToHtml: Error loading assets for ' + k + ': ', error.message);
|
||||
});
|
||||
}
|
||||
|
||||
body = body.replace(/°°JOP°CHECKBOX°NOTICK°°/g, '- [ ]');
|
||||
body = body.replace(/°°JOP°CHECKBOX°TICK°°/g, '- [x]');
|
||||
if (options.userCss) cssStrings.push(options.userCss);
|
||||
|
||||
return body;
|
||||
const styleHtml = '<style>' + cssStrings.join('\n') + '</style>';
|
||||
|
||||
const html = styleHtml + '<div id="rendered-md">' + renderedBody + '</div>';
|
||||
|
||||
const output = {
|
||||
html: html,
|
||||
cssFiles: Object.keys(context.cssFiles).map(k => context.cssFiles[k]),
|
||||
};
|
||||
|
||||
// Fow now, we keep only the last entry in the cache
|
||||
this.cachedOutputs_ = {};
|
||||
this.cachedOutputs_[cacheKey] = output;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
handleCheckboxClick(msg, noteBody) {
|
||||
msg = msg.split(':');
|
||||
let index = Number(msg[msg.length - 1]);
|
||||
let currentState = msg[msg.length - 2]; // Not really needed but keep it anyway
|
||||
return this.toggleTickAt(noteBody, index);
|
||||
injectedJavaScript() {
|
||||
return '';
|
||||
}
|
||||
|
||||
}
|
||||
|
221
ReactNativeClient/lib/MdToHtml/noteStyle.js
Normal file
221
ReactNativeClient/lib/MdToHtml/noteStyle.js
Normal file
@@ -0,0 +1,221 @@
|
||||
module.exports = function(style, options) {
|
||||
// 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}
|
||||
article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}
|
||||
pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}
|
||||
b,strong{font-weight:bolder}small{font-size:80%}img{border-style:none}
|
||||
`;
|
||||
|
||||
const fontFamily = "'Avenir', 'Arial', sans-serif";
|
||||
const listMarginLeft = '1.7em';
|
||||
|
||||
const css = `
|
||||
body {
|
||||
font-size: ` + style.htmlFontSize + `;
|
||||
color: ` + style.htmlColor + `;
|
||||
line-height: ` + style.htmlLineHeight + `;
|
||||
background-color: ` + style.htmlBackgroundColor + `;
|
||||
font-family: ` + fontFamily + `;
|
||||
padding-bottom: ` + options.paddingBottom + `;
|
||||
}
|
||||
::-webkit-scrollbar {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
}
|
||||
::-webkit-scrollbar-corner {
|
||||
background: none;
|
||||
}
|
||||
::-webkit-scrollbar-track {
|
||||
border: none;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: rgba(100, 100, 100, 0.3);
|
||||
border-radius: 5px;
|
||||
}
|
||||
::-webkit-scrollbar-track:hover {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: rgba(100, 100, 100, 0.7);
|
||||
}
|
||||
|
||||
/* Remove top padding and margin from first child so that top of rendered text is aligned to top of text editor text */
|
||||
#rendered-md h1:first-child,
|
||||
#rendered-md h2:first-child,
|
||||
#rendered-md h3:first-child,
|
||||
#rendered-md h4:first-child,
|
||||
#rendered-md ul:first-child,
|
||||
#rendered-md ol:first-child,
|
||||
#rendered-md table:first-child,
|
||||
#rendered-md blockquote:first-child,
|
||||
#rendered-md img:first-child,
|
||||
#rendered-md p:first-child {
|
||||
margin-top: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
p, h1, h2, h3, h4, h5, h6, ul, table {
|
||||
margin-top: .6em;
|
||||
margin-bottom: .65em;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
line-height: 1.5em;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid ` + style.htmlDividerColor + `;
|
||||
padding-bottom: .3em;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.3em;
|
||||
font-weight: bold;
|
||||
padding-bottom: .1em; */
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
h4, h5, h6 {
|
||||
font-size: 1em;
|
||||
font-weight: bold;
|
||||
}
|
||||
a {
|
||||
color: ` + style.htmlLinkColor + `;
|
||||
}
|
||||
ul, ol {
|
||||
padding-left: 0;
|
||||
margin-left: ` + listMarginLeft + `;
|
||||
}
|
||||
li {
|
||||
margin-bottom: .4em;
|
||||
}
|
||||
li p {
|
||||
margin-top: 0.2em;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.resource-icon {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
top: .5em;
|
||||
text-decoration: none;
|
||||
width: 1.15em;
|
||||
height: 1.45em;
|
||||
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>");
|
||||
}
|
||||
blockquote {
|
||||
border-left: 4px solid ` + style.htmlCodeBorderColor + `;
|
||||
padding-left: 1.2em;
|
||||
margin-left: 0;
|
||||
opacity: .7;
|
||||
}
|
||||
table {
|
||||
text-align: left-align;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
background-color: ` + style.htmlBackgroundColor + `;
|
||||
}
|
||||
td, th {
|
||||
padding: .5em 1em .5em 1em;
|
||||
font-size: ` + style.htmlFontSize + `;
|
||||
color: ` + style.htmlColor + `;
|
||||
font-family: ` + fontFamily + `;
|
||||
}
|
||||
td {
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
}
|
||||
th {
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
border-bottom: 2px solid ` + style.htmlCodeBorderColor + `;
|
||||
background-color: ` + style.htmlTableBackgroundColor + `;
|
||||
}
|
||||
tr:nth-child(even) {
|
||||
background-color: ` + style.htmlTableBackgroundColor + `;
|
||||
}
|
||||
tr:hover {
|
||||
background-color: ` + style.raisedBackgroundColor + `;
|
||||
}
|
||||
hr {
|
||||
border: none;
|
||||
border-bottom: 2px solid ` + style.htmlDividerColor + `;
|
||||
}
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
.inline-code {
|
||||
border: 1px solid ` + style.htmlCodeBorderColor + `;
|
||||
background-color: ` + style.htmlCodeBackgroundColor + `;
|
||||
padding-right: .2em;
|
||||
padding-left: .2em;
|
||||
border-radius: .25em;
|
||||
color: ` + style.htmlCodeColor + `;
|
||||
font-size: ` + style.htmlCodeFontSize + `;
|
||||
}
|
||||
|
||||
.highlighted-keyword {
|
||||
background-color: #F3B717;
|
||||
color: black;
|
||||
}
|
||||
|
||||
/*
|
||||
This is to fix https://github.com/laurent22/joplin/issues/764
|
||||
Without this, the tag attached to an equation float at an absolute position of the page,
|
||||
instead of a position relative to the container.
|
||||
*/
|
||||
.katex-display>.katex>.katex-html {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li.md-checkbox {
|
||||
list-style-type: none;
|
||||
margin-left: -` + listMarginLeft + `;
|
||||
}
|
||||
|
||||
li.md-checkbox input[type=checkbox] {
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
a.checkbox {
|
||||
border: 1pt solid ` + style.htmlColor + `;
|
||||
border-radius: 2pt;
|
||||
width: 1.1em;
|
||||
height: 1.1em;
|
||||
background-color: rgba(0,0,0,0);
|
||||
text-decoration: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
top: -0.3em;
|
||||
margin-right: 0.3em;
|
||||
}
|
||||
|
||||
a.checkbox.tick:after {
|
||||
content: "✓";
|
||||
}
|
||||
|
||||
a.checkbox.tick {
|
||||
color: ` + style.htmlColor + `;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body {
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.code, .inline-code {
|
||||
border: 1px solid #CBCBCB;
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
return [normalizeCss, css];
|
||||
}
|
105
ReactNativeClient/lib/MdToHtml/rules/checkbox.js
Normal file
105
ReactNativeClient/lib/MdToHtml/rules/checkbox.js
Normal file
@@ -0,0 +1,105 @@
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = (new Entities()).encode;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const utils = require('../utils');
|
||||
|
||||
let checkboxIndex_ = -1;
|
||||
|
||||
function createPrefixTokens(Token, id, checked, label, postMessageSyntax, sourceToken) {
|
||||
let token = null;
|
||||
const tokens = [];
|
||||
|
||||
// A bit hard to handle errors here and it's unlikely that the token won't have a valid
|
||||
// map parameter, but if it does set it to a very high value, which will be more easy to notice
|
||||
// in calling code.
|
||||
const lineIndex = sourceToken.map && sourceToken.map.length ? sourceToken.map[0] : 99999999;
|
||||
const checkedString = checked ? 'checked' : 'unchecked';
|
||||
const js = postMessageSyntax + "('checkboxclick:" + checkedString + ':' + lineIndex + "'); return true;";
|
||||
|
||||
token = new Token('checkbox_input', 'input', 0);
|
||||
token.attrs = [
|
||||
['type', 'checkbox'],
|
||||
['id', id],
|
||||
['onclick', js],
|
||||
];
|
||||
if (checked) token.attrs.push(['checked', 'true']);
|
||||
tokens.push(token);
|
||||
|
||||
token = new Token('label_open', 'label', 1);
|
||||
token.attrs = [['for', id]];
|
||||
tokens.push(token);
|
||||
|
||||
if (label) {
|
||||
token = new Token('text', '', 0);
|
||||
token.content = label;
|
||||
tokens.push(token);
|
||||
}
|
||||
|
||||
return tokens;
|
||||
}
|
||||
|
||||
function createSuffixTokens(Token) {
|
||||
return [new Token('label_close', 'label', -1)];
|
||||
}
|
||||
|
||||
function installRule(markdownIt, mdOptions, ruleOptions) {
|
||||
markdownIt.core.ruler.push('checkbox', state => {
|
||||
const tokens = state.tokens;
|
||||
const Token = state.Token;
|
||||
|
||||
const checkboxPattern = /^\[([x|X| ])\] (.*)$/
|
||||
let currentListItem = null;
|
||||
let processedFirstInline = false;
|
||||
for (let i = 0; i < tokens.length; i++) {
|
||||
const token = tokens[i];
|
||||
|
||||
if (token.type === 'list_item_open') {
|
||||
currentListItem = token;
|
||||
processedFirstInline = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (token.type === 'list_item_close') {
|
||||
currentListItem = null;
|
||||
processedFirstInline = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (currentListItem && !processedFirstInline && token.type === 'inline') {
|
||||
processedFirstInline = true;
|
||||
const firstChild = token.children && token.children.length ? token.children[0] : null;
|
||||
if (!firstChild) continue;
|
||||
|
||||
const matches = checkboxPattern.exec(firstChild.content);
|
||||
if (!matches || matches.length < 2) continue;
|
||||
|
||||
checkboxIndex_++;
|
||||
const checked = matches[1] !== ' ';
|
||||
const id = 'md-checkbox-' + checkboxIndex_;
|
||||
const label = matches.length >= 3 ? matches[2] : '';
|
||||
|
||||
// Prepend the text content with the checkbox markup and the opening <label> tag
|
||||
// then append the </label> tag at the end of the text content.
|
||||
|
||||
const prefix = createPrefixTokens(Token, id, checked, label, ruleOptions.postMessageSyntax, token);
|
||||
const suffix = createSuffixTokens(Token);
|
||||
|
||||
token.children = markdownIt.utils.arrayReplaceAt(token.children, 0, prefix);
|
||||
token.children = token.children.concat(suffix);
|
||||
|
||||
// Add a class to the <li> container so that it can be targetted with CSS.
|
||||
|
||||
let itemClass = currentListItem.attrGet('class');
|
||||
if (!itemClass) itemClass = '';
|
||||
itemClass += ' md-checkbox';
|
||||
currentListItem.attrSet('class', itemClass.trim());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = function(context, ruleOptions) {
|
||||
return function(md, mdOptions) {
|
||||
installRule(md, mdOptions, ruleOptions);
|
||||
};
|
||||
};
|
71
ReactNativeClient/lib/MdToHtml/rules/highlight_keywords.js
Normal file
71
ReactNativeClient/lib/MdToHtml/rules/highlight_keywords.js
Normal file
@@ -0,0 +1,71 @@
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = (new Entities()).encode;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const utils = require('../utils');
|
||||
const StringUtils = require('lib/string-utils.js');
|
||||
const md5 = require('md5');
|
||||
|
||||
function createHighlightedTokens(Token, splitted) {
|
||||
let token;
|
||||
const output = [];
|
||||
|
||||
for (let i = 0; i < splitted.length; i++) {
|
||||
const text = splitted[i];
|
||||
if (!text) continue;
|
||||
|
||||
if (i % 2 === 0) {
|
||||
token = new Token('text', '', 0);
|
||||
token.content = text;
|
||||
output.push(token);
|
||||
} else {
|
||||
token = new Token('highlighted_keyword_open', 'span', 1);
|
||||
token.attrs = [['class', 'highlighted-keyword']];
|
||||
output.push(token);
|
||||
|
||||
token = new Token('text', '', 0);
|
||||
token.content = text;
|
||||
output.push(token);
|
||||
|
||||
token = new Token('highlighted_keyword_close', 'span', -1);
|
||||
output.push(token);
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
function installRule(markdownIt, mdOptions, ruleOptions) {
|
||||
const divider = md5(Date.now().toString() + Math.random().toString());
|
||||
|
||||
markdownIt.core.ruler.push('highlight_keywords', state => {
|
||||
const keywords = ruleOptions.highlightedKeywords;
|
||||
if (!keywords || !keywords.length) return;
|
||||
|
||||
const tokens = state.tokens;
|
||||
const Token = state.Token;
|
||||
|
||||
for (let i = 0; i < tokens.length; i++) {
|
||||
const token = tokens[i];
|
||||
|
||||
if (token.type !== 'inline') continue;
|
||||
|
||||
for (let j = 0; j < token.children.length; j++) {
|
||||
const child = token.children[j];
|
||||
if (child.type !== 'text') continue;
|
||||
|
||||
const splitted = StringUtils.surroundKeywords(keywords, child.content, divider, divider).split(divider);
|
||||
const splittedTokens = createHighlightedTokens(Token, splitted);
|
||||
if (splittedTokens.length <= 1) continue;
|
||||
|
||||
token.children = markdownIt.utils.arrayReplaceAt(token.children, j, splittedTokens);
|
||||
j += splittedTokens.length - 1;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = function(context, ruleOptions) {
|
||||
return function(md, mdOptions) {
|
||||
installRule(md, mdOptions, ruleOptions);
|
||||
};
|
||||
};
|
45
ReactNativeClient/lib/MdToHtml/rules/html_block.js
Normal file
45
ReactNativeClient/lib/MdToHtml/rules/html_block.js
Normal file
@@ -0,0 +1,45 @@
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = (new Entities()).encode;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const utils = require('../utils');
|
||||
|
||||
function renderImageHtml(before, src, after, ruleOptions) {
|
||||
const resourceId = Resource.urlToId(src);
|
||||
const resource = ruleOptions.resources[resourceId];
|
||||
if (!resource) return '<div>' + utils.loaderImage() + '</div>';
|
||||
|
||||
const mime = resource.mime ? resource.mime.toLowerCase() : '';
|
||||
if (Resource.isSupportedImageMimeType(mime)) {
|
||||
let newSrc = './' + Resource.filename(resource);
|
||||
if (ruleOptions.resourceBaseUrl) newSrc = ruleOptions.resourceBaseUrl + newSrc;
|
||||
return '<img ' + before + ' data-resource-id="' + resource.id + '" src="' + newSrc + '" ' + after + '/>';
|
||||
}
|
||||
|
||||
return '[Image: ' + htmlentities(resource.title) + ' (' + htmlentities(mime) + ')]';
|
||||
}
|
||||
|
||||
function installRule(markdownIt, mdOptions, ruleOptions) {
|
||||
const defaultRender = markdownIt.renderer.rules.html_block || function(tokens, idx, options, env, self) {
|
||||
return self.renderToken(tokens, idx, options);
|
||||
};
|
||||
|
||||
const imageRegex = /<img(.*?)src=["'](.*?)["'](.*?)\/>/
|
||||
|
||||
markdownIt.renderer.rules.html_block = function(tokens, idx, options, env, self) {
|
||||
const token = tokens[idx];
|
||||
const content = token.content;
|
||||
|
||||
if (!content.match(imageRegex)) return defaultRender(tokens, idx, options, env, self);
|
||||
|
||||
return content.replace(imageRegex, (v, before, src, after) => {
|
||||
if (!Resource.isResourceUrl(src)) return defaultRender(tokens, idx, options, env, self);
|
||||
return renderImageHtml(before, src, after, ruleOptions);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function(context, ruleOptions) {
|
||||
return function(md, mdOptions) {
|
||||
installRule(md, mdOptions, ruleOptions);
|
||||
};
|
||||
};
|
39
ReactNativeClient/lib/MdToHtml/rules/html_inline.js
Normal file
39
ReactNativeClient/lib/MdToHtml/rules/html_inline.js
Normal file
@@ -0,0 +1,39 @@
|
||||
// This rule is no longer needed because HTML anchors (as opposed to those generated from Markdown)
|
||||
// are handled in webviewLib. Keeping it here for reference.
|
||||
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = (new Entities()).encode;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const utils = require('../utils');
|
||||
|
||||
function installRule(markdownIt, mdOptions, ruleOptions) {
|
||||
const defaultRender = markdownIt.renderer.rules.html_block || function(tokens, idx, options, env, self) {
|
||||
return self.renderToken(tokens, idx, options);
|
||||
};
|
||||
|
||||
const anchorRegex = /<a (.*)>/
|
||||
|
||||
markdownIt.renderer.rules.html_inline = function(tokens, idx, options, env, self) {
|
||||
const token = tokens[idx];
|
||||
const content = token.content;
|
||||
|
||||
if (!content.match(anchorRegex)) return defaultRender(tokens, idx, options, env, self);
|
||||
|
||||
return content.replace(anchorRegex, (v, content) => {
|
||||
let js = `
|
||||
var href = this.getAttribute('href');
|
||||
if (!href || href.indexOf('http') < 0) return true;
|
||||
` + ruleOptions.postMessageSyntax + `(href);
|
||||
return false;
|
||||
`;
|
||||
js = js.split('\n').join(' ').replace(/\t/g, '');
|
||||
return '<a onclick="' + js + '" ' + content + '>';
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function(context, ruleOptions) {
|
||||
return function(md, mdOptions) {
|
||||
installRule(md, mdOptions, ruleOptions);
|
||||
};
|
||||
};
|
36
ReactNativeClient/lib/MdToHtml/rules/image.js
Normal file
36
ReactNativeClient/lib/MdToHtml/rules/image.js
Normal file
@@ -0,0 +1,36 @@
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = (new Entities()).encode;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const utils = require('../utils');
|
||||
|
||||
function installRule(markdownIt, mdOptions, ruleOptions) {
|
||||
const defaultRender = markdownIt.renderer.rules.image;
|
||||
|
||||
markdownIt.renderer.rules.image = (tokens, idx, options, env, self) => {
|
||||
const token = tokens[idx];
|
||||
const src = utils.getAttr(token.attrs, 'src');
|
||||
const title = utils.getAttr(token.attrs, 'title');
|
||||
|
||||
if (!Resource.isResourceUrl(src)) return defaultRender(tokens, idx, options, env, self);
|
||||
|
||||
const resourceId = Resource.urlToId(src);
|
||||
const resource = ruleOptions.resources[resourceId];
|
||||
if (!resource) return '<div>' + utils.loaderImage() + '</div>';
|
||||
|
||||
const mime = resource.mime ? resource.mime.toLowerCase() : '';
|
||||
if (Resource.isSupportedImageMimeType(mime)) {
|
||||
let realSrc = './' + Resource.filename(resource);
|
||||
if (ruleOptions.resourceBaseUrl) realSrc = ruleOptions.resourceBaseUrl + realSrc;
|
||||
let output = '<img data-from-md data-resource-id="' + resource.id + '" title="' + htmlentities(title) + '" src="' + realSrc + '"/>';
|
||||
return output;
|
||||
}
|
||||
|
||||
return defaultRender(tokens, idx, options, env, self);
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function(context, ruleOptions) {
|
||||
return function(md, mdOptions) {
|
||||
installRule(md, mdOptions, ruleOptions);
|
||||
};
|
||||
};
|
244
ReactNativeClient/lib/MdToHtml/rules/katex.js
Normal file
244
ReactNativeClient/lib/MdToHtml/rules/katex.js
Normal file
@@ -0,0 +1,244 @@
|
||||
// Based on https://github.com/waylonflinn/markdown-it-katex
|
||||
|
||||
'use strict';
|
||||
|
||||
const { shim } = require('lib/shim');
|
||||
const Setting = require('lib/models/Setting');
|
||||
var katex = require('katex');
|
||||
const katexCss = require('lib/csstojs/katex.css.js');
|
||||
const md5 = require('md5');
|
||||
|
||||
// Test if potential opening or closing delimieter
|
||||
// Assumes that there is a "$" at state.src[pos]
|
||||
function isValidDelim(state, pos) {
|
||||
var prevChar, nextChar,
|
||||
max = state.posMax,
|
||||
can_open = true,
|
||||
can_close = true;
|
||||
|
||||
prevChar = pos > 0 ? state.src.charCodeAt(pos - 1) : -1;
|
||||
nextChar = pos + 1 <= max ? state.src.charCodeAt(pos + 1) : -1;
|
||||
|
||||
// Check non-whitespace conditions for opening and closing, and
|
||||
// check that closing delimeter isn't followed by a number
|
||||
if (prevChar === 0x20/* " " */ || prevChar === 0x09/* \t */ ||
|
||||
(nextChar >= 0x30/* "0" */ && nextChar <= 0x39/* "9" */)) {
|
||||
can_close = false;
|
||||
}
|
||||
if (nextChar === 0x20/* " " */ || nextChar === 0x09/* \t */) {
|
||||
can_open = false;
|
||||
}
|
||||
|
||||
return {
|
||||
can_open: can_open,
|
||||
can_close: can_close
|
||||
};
|
||||
}
|
||||
|
||||
function math_inline(state, silent) {
|
||||
var start, match, token, res, pos, esc_count;
|
||||
|
||||
if (state.src[state.pos] !== "$") { return false; }
|
||||
|
||||
res = isValidDelim(state, state.pos);
|
||||
if (!res.can_open) {
|
||||
if (!silent) { state.pending += "$"; }
|
||||
state.pos += 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
// First check for and bypass all properly escaped delimieters
|
||||
// This loop will assume that the first leading backtick can not
|
||||
// be the first character in state.src, which is known since
|
||||
// we have found an opening delimieter already.
|
||||
start = state.pos + 1;
|
||||
match = start;
|
||||
while ( (match = state.src.indexOf("$", match)) !== -1) {
|
||||
// Found potential $, look for escapes, pos will point to
|
||||
// first non escape when complete
|
||||
pos = match - 1;
|
||||
while (state.src[pos] === "\\") { pos -= 1; }
|
||||
|
||||
// Even number of escapes, potential closing delimiter found
|
||||
if ( ((match - pos) % 2) == 1 ) { break; }
|
||||
match += 1;
|
||||
}
|
||||
|
||||
// No closing delimter found. Consume $ and continue.
|
||||
if (match === -1) {
|
||||
if (!silent) { state.pending += "$"; }
|
||||
state.pos = start;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check if we have empty content, ie: $$. Do not parse.
|
||||
if (match - start === 0) {
|
||||
if (!silent) { state.pending += "$$"; }
|
||||
state.pos = start + 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check for valid closing delimiter
|
||||
res = isValidDelim(state, match);
|
||||
if (!res.can_close) {
|
||||
if (!silent) { state.pending += "$"; }
|
||||
state.pos = start;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!silent) {
|
||||
token = state.push('math_inline', 'math', 0);
|
||||
token.markup = "$";
|
||||
token.content = state.src.slice(start, match);
|
||||
}
|
||||
|
||||
state.pos = match + 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
function math_block(state, start, end, silent){
|
||||
var firstLine, lastLine, next, lastPos, found = false, token,
|
||||
pos = state.bMarks[start] + state.tShift[start],
|
||||
max = state.eMarks[start]
|
||||
|
||||
if(pos + 2 > max){ return false; }
|
||||
if(state.src.slice(pos,pos+2)!=='$$'){ return false; }
|
||||
|
||||
pos += 2;
|
||||
firstLine = state.src.slice(pos,max);
|
||||
|
||||
if(silent){ return true; }
|
||||
if(firstLine.trim().slice(-2)==='$$'){
|
||||
// Single line expression
|
||||
firstLine = firstLine.trim().slice(0, -2);
|
||||
found = true;
|
||||
}
|
||||
|
||||
for(next = start; !found; ){
|
||||
|
||||
next++;
|
||||
|
||||
if(next >= end){ break; }
|
||||
|
||||
pos = state.bMarks[next]+state.tShift[next];
|
||||
max = state.eMarks[next];
|
||||
|
||||
if(pos < max && state.tShift[next] < state.blkIndent){
|
||||
// non-empty line with negative indent should stop the list:
|
||||
break;
|
||||
}
|
||||
|
||||
if(state.src.slice(pos,max).trim().slice(-2)==='$$'){
|
||||
lastPos = state.src.slice(0,max).lastIndexOf('$$');
|
||||
lastLine = state.src.slice(pos,lastPos);
|
||||
found = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
state.line = next + 1;
|
||||
|
||||
token = state.push('math_block', 'math', 0);
|
||||
token.block = true;
|
||||
token.content = (firstLine && firstLine.trim() ? firstLine + '\n' : '')
|
||||
+ state.getLines(start + 1, next, state.tShift[start], true)
|
||||
+ (lastLine && lastLine.trim() ? lastLine : '');
|
||||
token.map = [ start, state.line ];
|
||||
token.markup = '$$';
|
||||
return true;
|
||||
}
|
||||
|
||||
let assetsLoaded_ = false;
|
||||
let cache_ = {};
|
||||
|
||||
module.exports = function(context, ruleOptions) {
|
||||
// Keep macros that persist across Katex blocks to allow defining a macro
|
||||
// in one block and re-using it later in other blocks.
|
||||
// https://github.com/laurent22/joplin/issues/1105
|
||||
context.__katex = { macros: {} };
|
||||
|
||||
const addContextAssets = () => {
|
||||
context.css['katex'] = katexCss;
|
||||
context.assetLoaders['katex'] = async () => {
|
||||
if (assetsLoaded_) return;
|
||||
|
||||
// In node, the fonts are simply copied using copycss to where Katex expects to find them, which is under app/gui/note-viewer/fonts
|
||||
|
||||
// In React Native, it's more complicated and we need to download and copy them to the right directory. Ideally, we should embed
|
||||
// them as an asset and copy them from there (or load them from there by modifying Katex CSS), but for now that will do.
|
||||
|
||||
if (shim.isReactNative()) {
|
||||
// Fonts must go under the resourceDir directory because this is the baseUrl of NoteBodyViewer
|
||||
const baseDir = Setting.value('resourceDir');
|
||||
await shim.fsDriver().mkdir(baseDir + '/fonts');
|
||||
|
||||
await shim.fetchBlob('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0-beta1/fonts/KaTeX_Main-Regular.woff2', { overwrite: false, path: baseDir + '/fonts/KaTeX_Main-Regular.woff2' });
|
||||
await shim.fetchBlob('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0-beta1/fonts/KaTeX_Math-Italic.woff2', { overwrite: false, path: baseDir + '/fonts/KaTeX_Math-Italic.woff2' });
|
||||
await shim.fetchBlob('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0-beta1/fonts/KaTeX_Size1-Regular.woff2', { overwrite: false, path: baseDir + '/fonts/KaTeX_Size1-Regular.woff2' });
|
||||
}
|
||||
|
||||
assetsLoaded_ = true;
|
||||
};
|
||||
}
|
||||
|
||||
function renderToStringWithCache(latex, options) {
|
||||
const cacheKey = md5(escape(latex) + escape(JSON.stringify(options)));
|
||||
if (cacheKey in cache_) {
|
||||
return cache_[cacheKey];
|
||||
} else {
|
||||
const beforeMacros = JSON.stringify(options.macros);
|
||||
const output = katex.renderToString(latex, options);
|
||||
const afterMacros = JSON.stringify(options.macros);
|
||||
|
||||
// Don't cache the formulas that add macros, otherwise
|
||||
// they won't be added on second run.
|
||||
if (beforeMacros === afterMacros) cache_[cacheKey] = output;
|
||||
return output;
|
||||
}
|
||||
}
|
||||
|
||||
return function(md, options) {
|
||||
// Default options
|
||||
|
||||
options = options || {};
|
||||
options.macros = context.__katex.macros;
|
||||
|
||||
// set KaTeX as the renderer for markdown-it-simplemath
|
||||
var katexInline = function(latex){
|
||||
options.displayMode = false;
|
||||
try{
|
||||
return renderToStringWithCache(latex, options);
|
||||
} catch(error){
|
||||
if(options.throwOnError){ console.log(error); }
|
||||
return latex;
|
||||
}
|
||||
};
|
||||
|
||||
var inlineRenderer = function(tokens, idx){
|
||||
addContextAssets();
|
||||
return katexInline(tokens[idx].content);
|
||||
};
|
||||
|
||||
var katexBlock = function(latex){
|
||||
options.displayMode = true;
|
||||
try{
|
||||
return "<p>" + renderToStringWithCache(latex, options) + "</p>";
|
||||
} catch(error){
|
||||
if(options.throwOnError){ console.log(error); }
|
||||
return latex;
|
||||
}
|
||||
}
|
||||
|
||||
var blockRenderer = function(tokens, idx){
|
||||
addContextAssets();
|
||||
return katexBlock(tokens[idx].content) + '\n';
|
||||
}
|
||||
|
||||
md.inline.ruler.after('escape', 'math_inline', math_inline);
|
||||
md.block.ruler.after('blockquote', 'math_block', math_block, {
|
||||
alt: [ 'paragraph', 'reference', 'blockquote', 'list' ]
|
||||
});
|
||||
md.renderer.rules.math_inline = inlineRenderer;
|
||||
md.renderer.rules.math_block = blockRenderer;
|
||||
};
|
||||
};
|
43
ReactNativeClient/lib/MdToHtml/rules/link_open.js
Normal file
43
ReactNativeClient/lib/MdToHtml/rules/link_open.js
Normal file
@@ -0,0 +1,43 @@
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = (new Entities()).encode;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const utils = require('../utils');
|
||||
|
||||
const loaderImage = '<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" width="16px" height="16px" viewBox="0 0 128 128" xml:space="preserve"><g><circle cx="16" cy="64" r="16" fill="#000000" fill-opacity="1"/><circle cx="16" cy="64" r="16" fill="#555555" fill-opacity="0.67" transform="rotate(45,64,64)"/><circle cx="16" cy="64" r="16" fill="#949494" fill-opacity="0.42" transform="rotate(90,64,64)"/><circle cx="16" cy="64" r="16" fill="#cccccc" fill-opacity="0.2" transform="rotate(135,64,64)"/><circle cx="16" cy="64" r="16" fill="#e1e1e1" fill-opacity="0.12" transform="rotate(180,64,64)"/><circle cx="16" cy="64" r="16" fill="#e1e1e1" fill-opacity="0.12" transform="rotate(225,64,64)"/><circle cx="16" cy="64" r="16" fill="#e1e1e1" fill-opacity="0.12" transform="rotate(270,64,64)"/><circle cx="16" cy="64" r="16" fill="#e1e1e1" fill-opacity="0.12" transform="rotate(315,64,64)"/><animateTransform attributeName="transform" type="rotate" values="0 64 64;315 64 64;270 64 64;225 64 64;180 64 64;135 64 64;90 64 64;45 64 64" calcMode="discrete" dur="720ms" repeatCount="indefinite"></animateTransform></g></svg>';
|
||||
|
||||
function installRule(markdownIt, mdOptions, ruleOptions) {
|
||||
markdownIt.renderer.rules.link_open = function (tokens, idx, options, env, self) {
|
||||
const token = tokens[idx];
|
||||
let href = utils.getAttr(token.attrs, 'href');
|
||||
const text = utils.getAttr(token.attrs, 'text');
|
||||
const isResourceUrl = Resource.isResourceUrl(href);
|
||||
const title = isResourceUrl ? utils.getAttr(token.attrs, 'title') : href;
|
||||
|
||||
console.info(href, isResourceUrl);
|
||||
|
||||
let resourceIdAttr = "";
|
||||
let icon = "";
|
||||
let hrefAttr = '#';
|
||||
if (isResourceUrl) {
|
||||
const resourceId = Resource.pathToId(href);
|
||||
href = "joplin://" + resourceId;
|
||||
resourceIdAttr = "data-resource-id='" + resourceId + "'";
|
||||
icon = '<span class="resource-icon"></span>';
|
||||
} else {
|
||||
// If the link is a plain URL (as opposed to a resource link), set the href to the actual
|
||||
// link. This allows the link to be exported too when exporting to PDF.
|
||||
hrefAttr = href;
|
||||
}
|
||||
|
||||
let js = ruleOptions.postMessageSyntax + "(" + JSON.stringify(href) + "); return false;";
|
||||
if (hrefAttr.indexOf('#') === 0 && href.indexOf('#') === 0) js = ''; // If it's an internal anchor, don't add any JS since the webview is going to handle navigating to the right place
|
||||
if (js) hrefAttr = '#';
|
||||
return "<a data-from-md " + resourceIdAttr + " title='" + htmlentities(title) + "' href='" + hrefAttr + "' onclick='" + js + "'>" + icon;
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function(context, ruleOptions) {
|
||||
return function(md, mdOptions) {
|
||||
installRule(md, mdOptions, ruleOptions);
|
||||
};
|
||||
};
|
29
ReactNativeClient/lib/MdToHtml/setupLinkify.js
Normal file
29
ReactNativeClient/lib/MdToHtml/setupLinkify.js
Normal file
@@ -0,0 +1,29 @@
|
||||
module.exports = function(markdownIt) {
|
||||
// Add `file:` protocol in linkify to allow text in the format of "file://..." to translate into
|
||||
// file-URL links in html view
|
||||
markdownIt.linkify.add('file:', {
|
||||
validate: function (text, pos, self) {
|
||||
var tail = text.slice(pos);
|
||||
if (!self.re.file) {
|
||||
// matches all local file URI on Win/Unix/MacOS systems including reserved characters in some OS (i.e. no OS specific sanity check)
|
||||
self.re.file = new RegExp('^[\\/]{2,3}[\\S]+');
|
||||
}
|
||||
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://...)
|
||||
markdownIt.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;
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user