You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-24 20:19:10 +02:00
Compare commits
84 Commits
android-v1
...
android-v1
Author | SHA1 | Date | |
---|---|---|---|
|
4847fd76de | ||
|
25b711a8da | ||
|
b5e50fa62e | ||
|
28e40a5c86 | ||
|
a8a7b7c07b | ||
|
299008688d | ||
|
42a674008f | ||
|
8fdc0bf17c | ||
|
4e3896c108 | ||
|
96cd56548e | ||
|
739fb2c3d2 | ||
|
0c98573700 | ||
|
8dc0b34fdc | ||
|
384ca09842 | ||
|
97d86825c2 | ||
|
f5a824b1e6 | ||
|
4fc11e77e8 | ||
|
8d16ad7035 | ||
|
3b1d84b00b | ||
|
3f540da31b | ||
|
3a20f1c245 | ||
|
e803f0c545 | ||
|
c9495c23a6 | ||
|
26aae9eea5 | ||
|
7d92136467 | ||
|
a7896b43d7 | ||
|
2e12b2655b | ||
|
a1f0bd1e6c | ||
|
4472590133 | ||
|
64f1214ad9 | ||
|
bd465a72cf | ||
|
1d1c2a6925 | ||
|
d68ba32533 | ||
|
d1a316032d | ||
|
b465042a56 | ||
|
8ff2418b02 | ||
|
f6640bcc32 | ||
|
fa3c0fd18a | ||
|
2ac03c18c4 | ||
|
51ee6128f3 | ||
|
53478056de | ||
|
83c791564a | ||
|
65d0032995 | ||
|
37c4f99341 | ||
|
adbc873b2a | ||
|
3567a57d6a | ||
|
b4e9fb157f | ||
|
1be3646a04 | ||
|
46b82f877b | ||
|
ef56eb4a52 | ||
|
6989f9fd16 | ||
|
7c3e8547de | ||
|
8268c3edba | ||
|
a8cc8763b0 | ||
|
09b4acf087 | ||
|
3b719ce53b | ||
|
83281197f1 | ||
|
ffda04f9b4 | ||
|
606893286a | ||
|
075b71746a | ||
|
01f1f3e957 | ||
|
88a9d5e802 | ||
|
7eebfae1c3 | ||
|
340fe76b8f | ||
|
e83678df3a | ||
|
0bbbb49a31 | ||
|
0e61115857 | ||
|
8d3ac6f6fe | ||
|
86e644be9a | ||
|
30201249b5 | ||
|
41155f5ef4 | ||
|
f308fe71f9 | ||
|
5a00214fd2 | ||
|
1b3e0f65e1 | ||
|
7cfc537870 | ||
|
53513db5b5 | ||
|
59402cf198 | ||
|
12efc02d91 | ||
|
f38b907680 | ||
|
8fcb46ca4a | ||
|
71ec9a193f | ||
|
393a545548 | ||
|
f88449fbb0 | ||
|
50ad4d05f2 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -40,4 +40,5 @@ Tools/github_oauth_token.txt
|
||||
_releases
|
||||
ReactNativeClient/lib/csstojs/
|
||||
ElectronClient/app/gui/note-viewer/fonts/
|
||||
ElectronClient/app/gui/note-viewer/lib.js
|
||||
Tools/commit_hook.txt
|
@@ -1,3 +1,7 @@
|
||||
**IMPORTANT:** At the moment pull requests for new features are no longer being accepted. More info there: https://github.com/laurent22/joplin/issues/1112
|
||||
|
||||
* * *
|
||||
|
||||
# User support
|
||||
|
||||
For general discussion about Joplin, user support, software development questions, and to discuss new features, please go to the [Joplin Forum](https://discourse.joplin.cozic.net/). It is possible to login with your GitHub account.
|
||||
|
@@ -49,35 +49,6 @@ class Command extends BaseCommand {
|
||||
type: 'SEARCH_SELECT',
|
||||
id: searchId,
|
||||
});
|
||||
|
||||
// let fields = Note.previewFields();
|
||||
// fields.push('body');
|
||||
// const notes = await Note.previews(folder ? folder.id : null, {
|
||||
// fields: fields,
|
||||
// anywherePattern: '*' + pattern + '*',
|
||||
// });
|
||||
|
||||
// const fragmentLength = 50;
|
||||
|
||||
// let parents = {};
|
||||
|
||||
// for (let i = 0; i < notes.length; i++) {
|
||||
// const note = notes[i];
|
||||
// const parent = parents[note.parent_id] ? parents[note.parent_id] : await Folder.load(note.parent_id);
|
||||
// parents[note.parent_id] = parent;
|
||||
|
||||
// const idx = note.body.indexOf(pattern);
|
||||
// let line = '';
|
||||
// if (idx >= 0) {
|
||||
// let fragment = note.body.substr(Math.max(0, idx - fragmentLength / 2), fragmentLength);
|
||||
// fragment = fragment.replace(/\n/g, ' ');
|
||||
// line = sprintf('%s: %s / %s: %s', BaseModel.shortId(note.id), parent.title, note.title, fragment);
|
||||
// } else {
|
||||
// line = sprintf('%s: %s / %s', BaseModel.shortId(note.id), parent.title, note.title);
|
||||
// }
|
||||
|
||||
// this.stdout(line);
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -117,7 +117,6 @@ class Command extends BaseCommand {
|
||||
this.releaseLockFn_ = null;
|
||||
|
||||
// Lock is unique per profile/database
|
||||
// TODO: use SQLite database to do lock?
|
||||
const lockFilePath = require('os').tmpdir() + '/synclock_' + md5(escape(Setting.value('profileDir'))); // https://github.com/pvorb/node-md5/issues/41
|
||||
if (!await fs.pathExists(lockFilePath)) await fs.writeFile(lockFilePath, 'synclock');
|
||||
|
||||
|
@@ -139,7 +139,8 @@ class FolderListWidget extends ListWidget {
|
||||
const orderFolders = (parentId) => {
|
||||
for (let i = 0; i < this.folders.length; i++) {
|
||||
const f = this.folders[i];
|
||||
if (f.parent_id === parentId) {
|
||||
const folderParentId = f.parent_id ? f.parent_id : '';
|
||||
if (folderParentId === parentId) {
|
||||
newItems.push(f);
|
||||
if (this.folderHasChildren_(this.folders, f.id)) orderFolders(f.id);
|
||||
}
|
||||
|
@@ -718,9 +718,21 @@ msgstr "Cancel·la"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versió actual està actualitzada"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hi ha disponible una actualització. Voleu baixar-la ara?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
@@ -1025,6 +1037,9 @@ msgstr ""
|
||||
"Aquesta nota no té contingut. Feu clic a «%s» per a anar a l'editor i "
|
||||
"modificar-la."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1367,6 +1382,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualitza automàticament l'aplicació"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Interval de sincronització"
|
||||
|
||||
@@ -1665,9 +1687,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Lloc web del Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Lloc web del Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Per suprimir: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Inicia sessió amb Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Clau mestra %s"
|
||||
|
@@ -700,9 +700,21 @@ msgstr "Zrušit"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Současná verze je aktuální."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Je k dispozici update, chcete jej stáhnout?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ano"
|
||||
|
||||
@@ -994,6 +1006,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr "Tato poznámka je prázdný. Klikněte na \"%s\" pro otevření editoru."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1342,6 +1357,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automaticky updatovat aplikaci"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Interval synchronizace"
|
||||
|
||||
@@ -1634,10 +1656,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Web Joplinu"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Web Joplinu"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "K smazání: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Přihlásit se pomocí OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Master heslo %s"
|
||||
|
@@ -705,9 +705,21 @@ msgstr "Fortryd"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Aktuel version er nyeste."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Opdatering er til rådighed, vil du hente den nu?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
@@ -1003,6 +1015,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr "Denne note er tom. Klik på \"%s\" for at starte editor og rette noten."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1351,6 +1366,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automatisk app update"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synkroniserings interval"
|
||||
|
||||
@@ -1643,10 +1665,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin hjemmeside"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin hjemmeside"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Til sletning: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Log på med OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hoved nøgle %s"
|
||||
|
@@ -472,10 +472,10 @@ msgid "Starting synchronisation..."
|
||||
msgstr "Starte Synchronisation..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "Lade Anhänge herunter..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "Abbrechen… Bitte warten."
|
||||
msgstr "Abbrechen... Bitte warten."
|
||||
|
||||
msgid ""
|
||||
"<tag-command> can be \"add\", \"remove\" or \"list\" to assign or remove "
|
||||
@@ -600,7 +600,7 @@ msgstr "Exportiere „%s“ ins „%s“ Format. Bitte warten..."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Importing from \"%s\" as \"%s\" format. Please wait..."
|
||||
msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten…"
|
||||
msgstr "Importiere „%s“ ins „%s“ Format. Bitte warten..."
|
||||
|
||||
msgid "PDF File"
|
||||
msgstr "PDF-Datei"
|
||||
@@ -663,15 +663,14 @@ msgstr "Im externen Editor bearbeiten"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Alle Notizen durchsuchen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Alle Notizen durchsuchen"
|
||||
msgstr "Aktuelle Notiz durchsuchen"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Ansicht"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr "Seitenleiste ein/aus"
|
||||
msgstr "Seitenleiste umschalten"
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Editor-Layout umschalten"
|
||||
@@ -701,7 +700,7 @@ msgid "Make a donation"
|
||||
msgstr "Spenden"
|
||||
|
||||
msgid "Check for updates..."
|
||||
msgstr "Überprüfe auf Updates…"
|
||||
msgstr "Überprüfe auf Aktualisierungen..."
|
||||
|
||||
msgid "About Joplin"
|
||||
msgstr "Über Joplin"
|
||||
@@ -724,10 +723,23 @@ msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Die aktuelle Version ist up-to-date."
|
||||
msgstr "Die aktuelle Version ist auf dem neuesten Stand."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Es ist ein Update verfügbar. Soll es jetzt heruntergeladen werden?"
|
||||
msgstr ""
|
||||
"Es ist eine Aktualisierung verfügbar. Soll sie jetzt heruntergeladen werden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
@@ -883,7 +895,7 @@ msgstr ""
|
||||
"Notizbücher ursprünglich verschlüsselt wurden."
|
||||
|
||||
msgid "Missing Master Keys"
|
||||
msgstr "Fehlender Hauptschlüssel"
|
||||
msgstr "Fehlende Hauptschlüssel"
|
||||
|
||||
msgid ""
|
||||
"The master keys with these IDs are used to encrypt some of your items, "
|
||||
@@ -965,7 +977,7 @@ msgstr "Duplizieren"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s - Copy"
|
||||
msgstr "%s kopieren"
|
||||
msgstr "%s - Kopieren"
|
||||
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Zwischen Notiz und To-Do Typ wechseln"
|
||||
@@ -1023,6 +1035,7 @@ msgstr "Link-Adresse kopieren"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
"Dieser Anhang wurde nicht heruntergeladen oder noch nicht entschlüsselt."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1036,6 +1049,9 @@ msgstr ""
|
||||
"Diese Notiz hat keinen Inhalt. Klicke auf „%s“ um den Editor zu aktivieren "
|
||||
"und die Notiz zu bearbeiten."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "Fetter Text"
|
||||
|
||||
@@ -1141,9 +1157,9 @@ msgstr "Notizbücher"
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "Entschlüsselte Objekte: %d/%d"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "Anhänge: %d."
|
||||
msgstr "Ressourcen abrufen: %d"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr ""
|
||||
@@ -1354,6 +1370,9 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"Dadurch kann Joplin im Hintergrund laufen. Es wird empfohlen,diese "
|
||||
"Einstellung zu aktivieren, damit deine Notizen ständig synchronisiertwerden "
|
||||
"und somit die Anzahl der Konflikte reduziert wird."
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr "Starte die Anwendung minimiert im Tray"
|
||||
@@ -1361,12 +1380,11 @@ msgstr "Starte die Anwendung minimiert im Tray"
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Zoomstufe der Benutzeroberfläche"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Editor Schriftenfamilie"
|
||||
msgstr "Schriftgröße im Editor"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Editor Schriftenfamilie"
|
||||
msgstr "Schriftfamilie im Editor"
|
||||
|
||||
msgid ""
|
||||
"This must be *monospace* font or it will not work properly. If the font is "
|
||||
@@ -1379,6 +1397,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Die Applikation automatisch aktualisieren"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synchronisationsinterval"
|
||||
|
||||
@@ -1495,9 +1520,8 @@ msgstr "Joplin Export Verzeichnis"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote Export Datei"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin Export Verzeichnis"
|
||||
msgstr "Json Export Verzeichnis"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Verzeichnis"
|
||||
@@ -1575,10 +1599,10 @@ msgid "On %s: %s"
|
||||
msgstr "Auf %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "Berechtigung zur Verwendung der Kamera"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
msgstr "Deine Zustimmung zur Verwendung deiner Kamera ist erforderlich."
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr ""
|
||||
@@ -1691,9 +1715,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Website von Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Datenbank v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS aktiviert: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Mit Dropbox anmelden"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Hier Code eingeben"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hauptschlüssel %s"
|
||||
@@ -1746,9 +1786,8 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Nicht unterstütztes Fotoformat: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Foto anhängen"
|
||||
msgstr "Foto aufnehmen"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Foto anhängen"
|
||||
@@ -1775,7 +1814,7 @@ msgid "View on map"
|
||||
msgstr "Auf der Karte anzeigen"
|
||||
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
msgstr "Zur Quell-URL gehen"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "Notizbuch löschen"
|
||||
@@ -1845,9 +1884,6 @@ msgstr "Willkommen"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Das vorherige Fenster fokussieren"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Zum Terminal-Modus wechseln"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Den Terminal-Modus verlassen"
|
||||
|
||||
|
@@ -635,9 +635,21 @@ msgstr ""
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -912,6 +924,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1241,6 +1256,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr ""
|
||||
|
||||
@@ -1514,9 +1536,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr ""
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
|
@@ -714,9 +714,21 @@ msgstr "Cancelar"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versión actual está actualizada."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hay disponible una actualización. ¿Quiere descargarla ahora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
@@ -1018,6 +1030,9 @@ msgstr ""
|
||||
"Esta nota no tiene contenido. Pulse en \"%s\" para cambiar al editor y "
|
||||
"editar la nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "texto destacado"
|
||||
|
||||
@@ -1360,6 +1375,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualizar la aplicación automáticamente"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalo de sincronización"
|
||||
|
||||
@@ -1663,9 +1685,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Borrar: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Acceder con Dropbox"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Entrar en modo línea de comandos"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Clave maestra %s"
|
||||
@@ -1822,9 +1860,6 @@ msgstr "Bienvenido"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Enfocar el panel anterior"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Entrar en modo línea de comandos"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Salir del modo línea de comandos"
|
||||
|
||||
|
@@ -714,9 +714,21 @@ msgstr "Utzi"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -1013,6 +1025,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1369,6 +1384,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automatikoki eguneratu aplikazioa"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Sinkronizazio tartea"
|
||||
|
||||
@@ -1664,10 +1686,26 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Ezabatzeko: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Login with OneDrive"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Sartu komando-lerro moduan "
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Pasahitz Nagusia %s"
|
||||
@@ -1814,9 +1852,6 @@ msgstr "Ongi etorri!"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Eraman fokua aurreko panelera"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Sartu komando-lerro moduan "
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Irten komando-lerro modutik"
|
||||
|
||||
|
@@ -710,10 +710,22 @@ msgstr "Annuler"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La version actuelle est à jour."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr "%s (pré-release)"
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
"Une mise à jour est disponible, souhaitez vous la télécharger maintenant ?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr "Votre version : v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr "Nouvelle version : v%s"
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Oui"
|
||||
|
||||
@@ -1021,6 +1033,11 @@ msgstr ""
|
||||
"Cette note n'a pas de contenu. Cliquer sur \"%s\" pour basculer vers "
|
||||
"l'éditeur et éditer cette note."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
"Les notes ne peuvent être imprimées ou exportées en PDF qu'une seule à la "
|
||||
"fois."
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "texte en gras"
|
||||
|
||||
@@ -1365,6 +1382,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Mettre à jour le logiciel automatiquement"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr "Recevoir les pré-release lors de la vérification des mises à jour"
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr "Voir la page des pré-release pour plus de détails : %s"
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalle de synchronisation"
|
||||
|
||||
@@ -1673,9 +1697,24 @@ msgstr "- Position : Pour attacher à une note les coordonnées GPS."
|
||||
msgid "Joplin website"
|
||||
msgstr "Site web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Base de données v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS activé : %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Se connecter à Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "Entrez le code ici"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Clef maître %s"
|
||||
@@ -1832,9 +1871,6 @@ msgstr "Bienvenue"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Activer le volet précédent"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Démarrer le mode de ligne de commande"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Sortir du mode de ligne de commande"
|
||||
|
||||
|
@@ -705,9 +705,21 @@ msgstr "Cancelar"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "A versión actual está actualizada."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Hai unha actualización dispoñíbel, desexa descargala agora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Si"
|
||||
|
||||
@@ -1002,6 +1014,9 @@ msgstr ""
|
||||
"Esta nota non ten contido. Prema en «%s» para ir ao editor e modificar a "
|
||||
"nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1350,6 +1365,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualizar automaticamente o aplicativo"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalo de sincronización"
|
||||
|
||||
@@ -1642,10 +1664,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Sitio web de Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Borrar: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Acceder con OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Chave mestra %s"
|
||||
|
@@ -712,9 +712,21 @@ msgstr "Odustani"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -1000,6 +1012,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1351,6 +1366,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Automatsko instaliranje nove verzije"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Interval sinkronizacije"
|
||||
|
||||
@@ -1639,10 +1661,26 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Za brisanje: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Prijavi se u OneDrive"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Otvori naredbeni redak"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
@@ -1789,9 +1827,6 @@ msgstr "Dobro došli"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Fokusiraj prethodno okno"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Otvori naredbeni redak"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Napusti naredbeni redak"
|
||||
|
||||
|
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.1.1\n"
|
||||
"X-Generator: Poedit 2.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -462,7 +462,7 @@ msgid "Starting synchronisation..."
|
||||
msgstr "Inizio sincronizzazione..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "Scaricamento risorse…"
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "Cancellazione... Attendere per favore."
|
||||
@@ -566,6 +566,13 @@ msgid ""
|
||||
"\n"
|
||||
"For example, to create a notebook press `mb`; to create a note press `mn`."
|
||||
msgstr ""
|
||||
"Benvenuto in Joplin!\n"
|
||||
"\n"
|
||||
"Digita `:help shortcuts` per la lista delle scorciatoie da tastiera, oppure "
|
||||
"solo `:help` per le informazioni di utilizzo.\n"
|
||||
"\n"
|
||||
"Per esempio, per creare un taccuino digita `mb`; per creare una nota digita "
|
||||
"`mn`."
|
||||
|
||||
msgid ""
|
||||
"One or more items are currently encrypted and you may need to supply a "
|
||||
@@ -629,9 +636,8 @@ msgstr "Taglia"
|
||||
msgid "Paste"
|
||||
msgstr "Incolla"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Select all"
|
||||
msgstr "Seleziona la data"
|
||||
msgstr "Seleziona tutto"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "Grasseto"
|
||||
@@ -648,9 +654,8 @@ msgstr "Modifica in un editor esterno"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Cerca in tutte le note"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Cerca in tutte le note"
|
||||
msgstr "Cerca nella nota corrente"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Vista"
|
||||
@@ -711,9 +716,21 @@ msgstr "Cancella"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "La versione attuale è aggiornata."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "È disponibile un aggiornamento, vuoi scaricarlo ora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sì"
|
||||
|
||||
@@ -952,13 +969,11 @@ msgstr "%s - Copia"
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
|
||||
msgstr "Converti in nota"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "Converti nota in \"Cose-da-fare\" e viceversa"
|
||||
msgstr "Converti in \"Cose-da-fare\""
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Copia il link Markdown"
|
||||
@@ -1004,7 +1019,7 @@ msgid "Copy Link Address"
|
||||
msgstr "Copia l'indirizzo del link"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
msgstr "Questo allegato non è ancora stato scaricato o decriptato."
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1018,6 +1033,9 @@ msgstr ""
|
||||
"Questa nota non ha contenuto. Fai clic su \"%s\" per attivare l'editor e "
|
||||
"modificare la nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "Testo grasseto"
|
||||
|
||||
@@ -1316,10 +1334,10 @@ msgid "When creating a new to-do:"
|
||||
msgstr "Quando crei un nuovo \"Cose-da-fare\":"
|
||||
|
||||
msgid "Focus title"
|
||||
msgstr ""
|
||||
msgstr "Focus sul titolo"
|
||||
|
||||
msgid "Focus body"
|
||||
msgstr ""
|
||||
msgstr "Focus sul testo"
|
||||
|
||||
msgid "When creating a new note:"
|
||||
msgstr "Quando si crea una nuova nota:"
|
||||
@@ -1335,6 +1353,9 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"Questo consentirà Joplin di essere in esecuzione in background. E’ "
|
||||
"raccomandata l’attivazione di questa impostazione per sincronizzare "
|
||||
"costantemente le tue note e quindi ridurre il numero di conflitti."
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr ""
|
||||
@@ -1342,12 +1363,11 @@ msgstr ""
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Percentuale di zoom globale"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Editor Famiglia Caratteri"
|
||||
msgstr "Editor dimensione caratteri"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Editor Famiglia Caratteri"
|
||||
msgstr "Editor famiglia caratteri"
|
||||
|
||||
msgid ""
|
||||
"This must be *monospace* font or it will not work properly. If the font is "
|
||||
@@ -1360,6 +1380,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Aggiorna automaticamente l'applicazione"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervallo di sincronizzazione"
|
||||
|
||||
@@ -1454,14 +1481,14 @@ msgstr "Ignora gli errori del certificato TLS"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Invalid option value: \"%s\". Possible values are: %s."
|
||||
msgstr "Oprione non valida: \"%s\". I valori possibili sono: %s."
|
||||
msgstr "Opzione non valida: \"%s\". I valori possibili sono: %s."
|
||||
|
||||
#, javascript-format
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr ""
|
||||
msgstr "Il tag \"%s\" esiste già. Scegliere un nome differente."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Esposta files di Joplin"
|
||||
msgstr "Esporta file di Joplin"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr "Markdown"
|
||||
@@ -1472,9 +1499,8 @@ msgstr "Cartella di esportazione di Joplin"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Esporta files di Evernote"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Cartella di esportazione di Joplin"
|
||||
msgstr "Cartella di esportazione JSON"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Cartella"
|
||||
@@ -1551,7 +1577,7 @@ msgid "On %s: %s"
|
||||
msgstr "Su %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "Permesso di usare la fotocamera"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
@@ -1661,11 +1687,26 @@ msgstr ""
|
||||
"geografica ad una nota."
|
||||
|
||||
msgid "Joplin website"
|
||||
msgstr "Siro web Joplin"
|
||||
msgstr "Sito web Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr "Database v%s"
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "FTS attivato: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Login Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "Inserisci qui il codice"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Chiave Master %s"
|
||||
@@ -1718,9 +1759,8 @@ msgstr ""
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipo di immagine non supportata: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Allega foto"
|
||||
msgstr "Scatta foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Allega foto"
|
||||
@@ -1829,9 +1869,6 @@ msgstr "Benvenuto"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Pannello precedente"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Accedi alla modalità linea di comando"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Esci dalla modalità linea di comando"
|
||||
|
||||
|
@@ -236,7 +236,7 @@ msgstr ""
|
||||
"ムを参照できます。"
|
||||
|
||||
msgid "To move from one pane to another, press Tab or Shift+Tab."
|
||||
msgstr "ペイン間を移動するには、TabかShift+Tabをおしてください。"
|
||||
msgstr "ペイン間を移動するには、TabかShift+Tabを押してください。"
|
||||
|
||||
msgid ""
|
||||
"Use the arrows and page up/down to scroll the lists and text areas "
|
||||
@@ -446,7 +446,7 @@ msgid "Starting synchronisation..."
|
||||
msgstr "同期を開始中..."
|
||||
|
||||
msgid "Downloading resources..."
|
||||
msgstr ""
|
||||
msgstr "リソースをダウンロード中..."
|
||||
|
||||
msgid "Cancelling... Please wait."
|
||||
msgstr "中止中...お待ちください。"
|
||||
@@ -618,9 +618,8 @@ msgstr "切り取り"
|
||||
msgid "Paste"
|
||||
msgstr "貼り付け"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Select all"
|
||||
msgstr "日付の選択"
|
||||
msgstr "すべて選択"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "太字"
|
||||
@@ -637,9 +636,8 @@ msgstr "外部エディターで編集"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "すべてのノートを検索"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "すべてのノートを検索"
|
||||
msgstr "現在のノートを検索"
|
||||
|
||||
msgid "View"
|
||||
msgstr "表示"
|
||||
@@ -700,9 +698,21 @@ msgstr "キャンセル"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "現在のバージョンは最新版です。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "アップデートがあります。すぐにダウンロードしますか?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Yes"
|
||||
|
||||
@@ -710,7 +720,7 @@ msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
msgid "Token has been copied to the clipboard!"
|
||||
msgstr ""
|
||||
msgstr "トークンをクリップボードにコピーしました!"
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr "Webクリッパーサービスは有効で、自動起動します。"
|
||||
@@ -760,20 +770,21 @@ msgstr "ステップ2: 拡張機能のインストール"
|
||||
msgid "Download and install the relevant extension for your browser:"
|
||||
msgstr "関連する拡張機能をブラウザーにインストールします:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Advanced options"
|
||||
msgstr "詳細な設定の表示"
|
||||
msgstr "詳細な設定"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr ""
|
||||
msgstr "認証するトークン:"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr ""
|
||||
msgstr "トークンのコピー"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
"access Joplin."
|
||||
msgstr ""
|
||||
"この認証トークンはサードパーティアプリケーションがJoplinにアクセスするためだ"
|
||||
"けに必要です。"
|
||||
|
||||
msgid "Check synchronisation configuration"
|
||||
msgstr "同期の設定を確認する"
|
||||
@@ -938,13 +949,11 @@ msgstr "%s - コピー"
|
||||
msgid "Switch between note and to-do type"
|
||||
msgstr "ノートとToDoを切り替え"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to note type"
|
||||
msgstr "ノートとToDoを切り替え"
|
||||
msgstr "ノートに切り替え"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Switch to to-do type"
|
||||
msgstr "ノートとToDoを切り替え"
|
||||
msgstr "ToDoに切り替え"
|
||||
|
||||
msgid "Copy Markdown link"
|
||||
msgstr "Markdownのリンクをコピー"
|
||||
@@ -963,13 +972,13 @@ msgid ""
|
||||
msgstr "ノートブックがありません。新しいノートブックを作成してください。"
|
||||
|
||||
msgid "Location"
|
||||
msgstr ""
|
||||
msgstr "場所"
|
||||
|
||||
msgid "URL"
|
||||
msgstr ""
|
||||
msgstr "URL"
|
||||
|
||||
msgid "Note properties"
|
||||
msgstr ""
|
||||
msgstr "ノートのプロパティ"
|
||||
|
||||
msgid "Open..."
|
||||
msgstr "開く..."
|
||||
@@ -988,7 +997,7 @@ msgid "Copy Link Address"
|
||||
msgstr "リンクアドレスをコピー"
|
||||
|
||||
msgid "This attachment is not downloaded or not decrypted yet."
|
||||
msgstr ""
|
||||
msgstr "この添付ファイルはダウンロードできないか、まだ復号できません。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Unsupported link or message: %s"
|
||||
@@ -1002,6 +1011,9 @@ msgstr ""
|
||||
"このノートには中身がありません。 \"%s\" をクリックしてエディターを表示し、"
|
||||
"ノートを編集してください。"
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "文字を太字に"
|
||||
|
||||
@@ -1015,7 +1027,7 @@ msgid "Insert Hyperlink"
|
||||
msgstr "ハイパーリンクの挿入"
|
||||
|
||||
msgid "Attach file"
|
||||
msgstr "ファイルを添付"
|
||||
msgstr "ファイルを添付する"
|
||||
|
||||
msgid "Tags"
|
||||
msgstr "タグ"
|
||||
@@ -1107,9 +1119,9 @@ msgstr "ノートブック"
|
||||
msgid "Decrypting items: %d/%d"
|
||||
msgstr "復号中のアイテム: %d/%d"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Fetching resources: %d"
|
||||
msgstr "リソース: %d."
|
||||
msgstr "取得中のリソース: %d"
|
||||
|
||||
msgid "Please select where the sync status should be exported to"
|
||||
msgstr "同期状況の出力先を選択してください"
|
||||
@@ -1320,6 +1332,8 @@ msgid ""
|
||||
"this setting so that your notes are constantly being synchronised, thus "
|
||||
"reducing the number of conflicts."
|
||||
msgstr ""
|
||||
"有効にすると、Joplinがバックグラウンドで動作するようになります。ノートを定期"
|
||||
"的に同期し、衝突を減らすために強くおすすめする設定です。"
|
||||
|
||||
msgid "Start application minimised in the tray icon"
|
||||
msgstr "アプリケーションをトレイアンコンで最小化して起動"
|
||||
@@ -1327,9 +1341,8 @@ msgstr "アプリケーションをトレイアンコンで最小化して起動
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "全体ズームの割合"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "エディターのフォントファミリー"
|
||||
msgstr "エディターのフォントサイズ"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "エディターのフォントファミリー"
|
||||
@@ -1342,7 +1355,14 @@ msgstr ""
|
||||
"誤っているか空の場合は、一般的な等幅フォントが指定されるでしょう。"
|
||||
|
||||
msgid "Automatically update the application"
|
||||
msgstr "アプリケーションの自動更新"
|
||||
msgstr "アプリケーションを自動的にアップデート"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "同期間隔"
|
||||
@@ -1457,9 +1477,8 @@ msgstr "Joplin エクスポートディレクトリ"
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote エクスポートファイル"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Joplin エクスポートディレクトリ"
|
||||
msgstr "Json エクスポートディレクトリ"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "ディレクトリ"
|
||||
@@ -1536,10 +1555,10 @@ msgid "On %s: %s"
|
||||
msgstr "日時 %s: %s"
|
||||
|
||||
msgid "Permission to use camera"
|
||||
msgstr ""
|
||||
msgstr "カメラ使用の許可"
|
||||
|
||||
msgid "Your permission to use your camera is required."
|
||||
msgstr ""
|
||||
msgstr "カメラを使用するには権限が必要です。"
|
||||
|
||||
msgid "There are currently no notes. Create one by clicking on the (+) button."
|
||||
msgstr "ノートがありません。(+)ボタンを押して新しいノートを作成してください。"
|
||||
@@ -1569,9 +1588,8 @@ msgstr "%d個のノートを\"%s\"に移動しますか?"
|
||||
msgid "Press to set the decryption password."
|
||||
msgstr "復号するパスワードを入力してください。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Clear alarm"
|
||||
msgstr "アラームをセット"
|
||||
msgstr "アラームをクリア"
|
||||
|
||||
msgid "Save alarm"
|
||||
msgstr "アラームの保存"
|
||||
@@ -1585,22 +1603,21 @@ msgstr "確認"
|
||||
msgid "Cancel synchronisation"
|
||||
msgstr "同期の中止"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Checking... Please wait."
|
||||
msgstr "中止中...お待ちください。"
|
||||
msgstr "確認中...お待ちください。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Success! Synchronisation configuration appears to be correct."
|
||||
msgstr "同期の設定を確認する"
|
||||
msgstr "成功です! 同期の設定は正しいようです。"
|
||||
|
||||
msgid ""
|
||||
"Error. Please check that URL, username, password, etc. are correct and that "
|
||||
"the sync target is accessible. The reported error was:"
|
||||
msgstr ""
|
||||
"エラーです。URL、ユーザー名、パスワードなどを修正し、同期するターゲットにアク"
|
||||
"セスできるかを確認してください。次が報告されたエラーです:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "The application has been authorised!"
|
||||
msgstr "アプリケーションは問題なく認証されました。"
|
||||
msgstr "アプリケーションは問題なく認証されました!"
|
||||
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
@@ -1610,10 +1627,15 @@ msgid ""
|
||||
"\n"
|
||||
"Please try again."
|
||||
msgstr ""
|
||||
"アプリケーションが認証できません:\n"
|
||||
"\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"やり直してください。"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
#, javascript-format
|
||||
msgid "Decrypted items: %s / %s"
|
||||
msgstr "復号中のアイテム: %d/%d"
|
||||
msgstr "復号中のアイテム: %s/%s"
|
||||
|
||||
msgid "New tags:"
|
||||
msgstr "新しいタグ:"
|
||||
@@ -1644,9 +1666,25 @@ msgstr "- 位置情報: ノートに位置情報を添付するのに必要で
|
||||
msgid "Joplin website"
|
||||
msgstr "JoplinのWebサイト"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "JoplinのWebサイト"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "削除予定: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Dropboxでログイン"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "コマンドラインモードに入る"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "マスターキー %s"
|
||||
@@ -1698,9 +1736,8 @@ msgstr "Joplinモバイルアプリは次のタイプのリンクをまだサポ
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "サポートされていない画像の形式: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "写真を添付"
|
||||
msgstr "写真を撮影する"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "写真を添付"
|
||||
@@ -1727,7 +1764,7 @@ msgid "View on map"
|
||||
msgstr "地図上に表示"
|
||||
|
||||
msgid "Go to source URL"
|
||||
msgstr ""
|
||||
msgstr "ソースURLに行く"
|
||||
|
||||
msgid "Delete notebook"
|
||||
msgstr "ノートブックを削除"
|
||||
@@ -1793,9 +1830,6 @@ msgstr "ようこそ"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "前のペインへ"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "コマンドラインモードに入る"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "コマンドラインモードの終了"
|
||||
|
||||
|
@@ -635,9 +635,21 @@ msgstr ""
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -912,6 +924,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1241,6 +1256,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr ""
|
||||
|
||||
@@ -1514,9 +1536,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr ""
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
|
@@ -697,9 +697,21 @@ msgstr "취소"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "현재 버전은 최신입니다."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "업데이트가 있습니다. 지금 다운로드할까요?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "예"
|
||||
|
||||
@@ -996,6 +1008,9 @@ msgstr ""
|
||||
"비어있는 노트입니다. \"%s\" 항목을 선택해서 편집기를 전환하고 노트를 편집하세"
|
||||
"요."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "중요 텍스트"
|
||||
|
||||
@@ -1337,6 +1352,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "애플리케이션을 자동으로 업데이트"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "동기화 간격"
|
||||
|
||||
@@ -1634,9 +1656,24 @@ msgstr "- 위치: 지리적 위치 정보를 노트에 첨부하기 위해서
|
||||
msgid "Joplin website"
|
||||
msgstr "조플린 웹사이트"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "조플린 웹사이트"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "삭제: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Dropbox로 로그인"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "관리자 키 %s"
|
||||
|
@@ -1,13 +1,13 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Laurent Cozic
|
||||
# This file is distributed under the same license as the Joplin-CLI package.
|
||||
# Mats Estensen <matsest@mxe.no>, 2018
|
||||
# Mats Estensen <code@mxe.no>, 2018
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Joplin-CLI 1.0.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: Mats Estensen <matsest@mxe.no>\n"
|
||||
"Last-Translator: Mats Estensen <code@mxe.no>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: nb_NO\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -602,7 +602,7 @@ msgid "Export"
|
||||
msgstr "Eksport"
|
||||
|
||||
msgid "Print"
|
||||
msgstr "Skriv Ut"
|
||||
msgstr "Skriv ut"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Hide %s"
|
||||
@@ -624,7 +624,7 @@ msgid "Paste"
|
||||
msgstr "Lim inn"
|
||||
|
||||
msgid "Select all"
|
||||
msgstr "Velg alle"
|
||||
msgstr "Marker alt"
|
||||
|
||||
msgid "Bold"
|
||||
msgstr "Fet"
|
||||
@@ -643,7 +643,7 @@ msgstr "Søk i alle notater"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Søk i alle notater"
|
||||
msgstr "Søk i nåværende notat"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Utseende"
|
||||
@@ -693,7 +693,7 @@ msgid "Open %s"
|
||||
msgstr "Åpne %s"
|
||||
|
||||
msgid "Exit"
|
||||
msgstr "Gå ut"
|
||||
msgstr "Avslutt"
|
||||
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
@@ -704,9 +704,21 @@ msgstr "Avbryt"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Nåværende versjon er den siste tilgjengelige."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
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 ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
@@ -1008,6 +1020,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Dette notatet har ikke noe innhold. Klikk på \"%s\" for å redigere notatet."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "fet tekst"
|
||||
|
||||
@@ -1024,7 +1039,7 @@ msgid "Attach file"
|
||||
msgstr "Legg ved fil"
|
||||
|
||||
msgid "Tags"
|
||||
msgstr "Merkelapp"
|
||||
msgstr "Merkelapper"
|
||||
|
||||
msgid "Set alarm"
|
||||
msgstr "Angi alarm"
|
||||
@@ -1302,7 +1317,7 @@ msgid "Save geo-location with notes"
|
||||
msgstr "Lagre stedsinformasjon med notater"
|
||||
|
||||
msgid "When creating a new to-do:"
|
||||
msgstr "Når nytt gjøre mål opprettes:"
|
||||
msgstr "Når nytt gjøremål opprettes:"
|
||||
|
||||
msgid "Focus title"
|
||||
msgstr "Fokuser på tittel"
|
||||
@@ -1336,7 +1351,7 @@ msgstr "Global forstørrelse"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Editor skrifttype"
|
||||
msgstr "Editor skriftstørrelse"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Editor skrifttype"
|
||||
@@ -1352,6 +1367,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Oppdater applikasjonen automatisk"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synkroniserinsintervall"
|
||||
|
||||
@@ -1454,19 +1476,19 @@ msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
msgstr "Merkelappen \"%s\" eksiterer allerede. Vennligst velg et annet navn."
|
||||
|
||||
msgid "Joplin Export File"
|
||||
msgstr "Joplin Eksporter Fil"
|
||||
msgstr "Joplin-eksportert fil"
|
||||
|
||||
msgid "Markdown"
|
||||
msgstr "Markdown"
|
||||
|
||||
msgid "Joplin Export Directory"
|
||||
msgstr "Joplin Eksporter Katalog"
|
||||
msgstr "Joplin-eksportert katalog"
|
||||
|
||||
msgid "Evernote Export File"
|
||||
msgstr "Evernote Eksporter Fil"
|
||||
msgstr "Evernote-eksportert fil"
|
||||
|
||||
msgid "Json Export Directory"
|
||||
msgstr "Json Eksporter Katalog"
|
||||
msgstr "Json-eksportert katalog"
|
||||
|
||||
msgid "Directory"
|
||||
msgstr "Katalog"
|
||||
@@ -1654,9 +1676,24 @@ 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"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Fulltekstsøk aktivert: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Innlogging med Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr "Skriv inn kode her"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Masternøkkel: %s"
|
||||
@@ -1710,7 +1747,7 @@ msgstr "Bildetypen er ikke støttet: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Legg ved et bilde"
|
||||
msgstr "Ta et bilde"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Legg ved et bilde"
|
||||
|
@@ -716,9 +716,21 @@ msgstr "Annuleer"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
@@ -1017,6 +1029,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1371,6 +1386,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Update de applicatie automatisch"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synchronisatie interval"
|
||||
|
||||
@@ -1666,10 +1688,26 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Verwijderen: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Log in met OneDrive"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Ga naar command line modus"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hoofdsleutel: %s"
|
||||
@@ -1818,9 +1856,6 @@ msgstr "Welkom"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Focus op het vorige paneel"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Ga naar command line modus"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Ga uit command line modus"
|
||||
|
||||
|
@@ -714,9 +714,21 @@ msgstr "Annuleren"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "De huidige versie is up-to-date."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Er is een update beschikbaar. Wil je deze nu downloaden?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
@@ -1024,6 +1036,9 @@ msgstr ""
|
||||
"Deze notitie bevat geen inhoud. Klik op \"%s\" om de bewerker te openen en "
|
||||
"de notitie te bewerken."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "vetgedrukte tekst"
|
||||
|
||||
@@ -1365,6 +1380,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Applicatie automatisch bijwerken"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synchronisatietussenpoos"
|
||||
|
||||
@@ -1670,9 +1692,24 @@ msgstr "- Locatie: zodat je locatie-informatie kunt toevoegen aan een notitie."
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin-website"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin-website"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Te verwijderen: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Inloggen met Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Hoofdsleutel %s"
|
||||
|
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2\n"
|
||||
"X-Generator: Poedit 2.0.7\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -647,9 +647,8 @@ msgstr "Editar com editor externo"
|
||||
msgid "Search in all the notes"
|
||||
msgstr "Pesquisar em todas as notas"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Search in current note"
|
||||
msgstr "Pesquisar em todas as notas"
|
||||
msgstr "Pesquisar na nota atual"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Visualizar"
|
||||
@@ -710,9 +709,21 @@ msgstr "Cancelar"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "A versão atual está atualizada."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Uma atualização está disponível, você quer baixar agora?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Sim"
|
||||
|
||||
@@ -1013,6 +1024,9 @@ msgstr ""
|
||||
"Esta nota não possui conteúdo. Clique em \"%s\" para alternar para o editor, "
|
||||
"e edite a nota."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "texto forte"
|
||||
|
||||
@@ -1260,7 +1274,7 @@ msgid "title"
|
||||
msgstr "título"
|
||||
|
||||
msgid "updated date"
|
||||
msgstr "data de ataualização"
|
||||
msgstr "data de atualização"
|
||||
|
||||
msgid "created date"
|
||||
msgstr "data de criação"
|
||||
@@ -1342,9 +1356,8 @@ msgstr "Iniciar aplicativo minimizado na barra de tarefas"
|
||||
msgid "Global zoom percentage"
|
||||
msgstr "Porcentagem global do zoom"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Editor font size"
|
||||
msgstr "Família de fontes do editor"
|
||||
msgstr "Tamanho da fonte no Editor"
|
||||
|
||||
msgid "Editor font family"
|
||||
msgstr "Família de fontes do editor"
|
||||
@@ -1359,6 +1372,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Atualizar automaticamente o aplicativo"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalo de sincronização"
|
||||
|
||||
@@ -1668,9 +1688,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Site do Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Site do Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Para excluir: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Login com Dropbox"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Entrar no modo de linha de comando"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Chave Master %s"
|
||||
@@ -1722,9 +1758,8 @@ msgstr "O app mobile do Joplin não suporta, atualmente, esse tipo de link: %s"
|
||||
msgid "Unsupported image type: %s"
|
||||
msgstr "Tipo de imagem não suportada: %s"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Take photo"
|
||||
msgstr "Anexar foto"
|
||||
msgstr "Tirar foto"
|
||||
|
||||
msgid "Attach photo"
|
||||
msgstr "Anexar foto"
|
||||
@@ -1818,9 +1853,6 @@ msgstr "Bem-vindo"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Dar o foco para o painel anterior"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Entrar no modo de linha de comando"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Sair do modo de linha de comando"
|
||||
|
||||
|
@@ -650,9 +650,21 @@ msgstr "Anulați"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Versiunea curentă este actualizată."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Da"
|
||||
|
||||
@@ -930,6 +942,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr ""
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1260,6 +1275,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Actualizați automat aplicația"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Intervalul de sincronizare"
|
||||
|
||||
@@ -1535,9 +1557,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Website Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Website Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "De șters: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Autentificați-vă cu Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr ""
|
||||
|
@@ -657,7 +657,7 @@ msgid "View"
|
||||
msgstr "Вид"
|
||||
|
||||
msgid "Toggle sidebar"
|
||||
msgstr ""
|
||||
msgstr "Переключить панель"
|
||||
|
||||
msgid "Toggle editor layout"
|
||||
msgstr "Переключить вид редактора"
|
||||
@@ -669,7 +669,7 @@ msgid "Synchronisation status"
|
||||
msgstr "Статус синхронизации"
|
||||
|
||||
msgid "Web clipper options"
|
||||
msgstr ""
|
||||
msgstr "Настройки веб-клиппера"
|
||||
|
||||
msgid "Encryption options"
|
||||
msgstr "Настройки шифрования"
|
||||
@@ -712,9 +712,21 @@ msgstr "Отмена"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Вы используете самую свежую версию."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Доступно обновление. Желаете скачать его сейчас?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Да"
|
||||
|
||||
@@ -725,7 +737,7 @@ msgid "Token has been copied to the clipboard!"
|
||||
msgstr ""
|
||||
|
||||
msgid "The web clipper service is enabled and set to auto-start."
|
||||
msgstr ""
|
||||
msgstr "Веб-клиппер включен"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Status: Started on port %d"
|
||||
@@ -736,13 +748,13 @@ msgid "Status: %s"
|
||||
msgstr "Статус: «%s»."
|
||||
|
||||
msgid "Disable Web Clipper Service"
|
||||
msgstr ""
|
||||
msgstr "Выключить веб-клиппер"
|
||||
|
||||
msgid "The web clipper service is not enabled."
|
||||
msgstr ""
|
||||
msgstr "Веб-клиппер остановлен"
|
||||
|
||||
msgid "Enable Web Clipper Service"
|
||||
msgstr ""
|
||||
msgstr "Включить веб-клиппер"
|
||||
|
||||
msgid ""
|
||||
"Joplin Web Clipper allows saving web pages and screenshots from your browser "
|
||||
@@ -753,7 +765,7 @@ msgid "In order to use the web clipper, you need to do the following:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Step 1: Enable the clipper service"
|
||||
msgstr ""
|
||||
msgstr "Шаг 1: включить веб-клиппер"
|
||||
|
||||
msgid ""
|
||||
"This service allows the browser extension to communicate with Joplin. When "
|
||||
@@ -762,20 +774,20 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
msgid "Step 2: Install the extension"
|
||||
msgstr ""
|
||||
msgstr "Шаг 2: установить расширение"
|
||||
|
||||
msgid "Download and install the relevant extension for your browser:"
|
||||
msgstr ""
|
||||
msgstr "Скачайте и установите расширение для вашего браузера"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Advanced options"
|
||||
msgstr "Показывать расширенные настройки"
|
||||
|
||||
msgid "Authorisation token:"
|
||||
msgstr ""
|
||||
msgstr "Токен авторизации"
|
||||
|
||||
msgid "Copy token"
|
||||
msgstr ""
|
||||
msgstr "Скопировать токен"
|
||||
|
||||
msgid ""
|
||||
"This authorisation token is only needed to allow third-party applications to "
|
||||
@@ -790,10 +802,10 @@ msgid "Notes and settings are stored in: %s"
|
||||
msgstr "Заметки и настройки сохранены в: %s"
|
||||
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
msgstr "Применить"
|
||||
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
msgstr "Отправить"
|
||||
|
||||
msgid "Save"
|
||||
msgstr "Сохранить"
|
||||
@@ -1012,6 +1024,9 @@ msgstr ""
|
||||
"Заметка пуста. Нажмите на «%s», чтобы переключиться в редактор и "
|
||||
"отредактировать её."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1360,6 +1375,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Автоматически обновлять приложение"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Интервал синхронизации"
|
||||
|
||||
@@ -1653,10 +1675,26 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Сайт Joplin"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Сайт Joplin"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "К удалению: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Войти в OneDrive"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Enter code here"
|
||||
msgstr "Войти в режим командной строки"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Мастер-ключ %s"
|
||||
@@ -1802,9 +1840,6 @@ msgstr "Добро пожаловать"
|
||||
#~ msgid "Give focus to previous pane"
|
||||
#~ msgstr "Переключиться на предыдущую панель"
|
||||
|
||||
#~ msgid "Enter command line mode"
|
||||
#~ msgstr "Войти в режим командной строки"
|
||||
|
||||
#~ msgid "Exit command line mode"
|
||||
#~ msgstr "Выйти из режима командной строки"
|
||||
|
||||
|
@@ -711,9 +711,21 @@ msgstr "Prekliči"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Sedanja verzija je najnovejša."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "Posodobitev je na voljo, jo želite prenesti sedaj?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Da"
|
||||
|
||||
@@ -1016,6 +1028,9 @@ msgstr ""
|
||||
"Ta zabeležka nima vsebine. Kliknite na \"%s\" da menjate med urejevalnikom "
|
||||
"in urejanje zabeležke."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr ""
|
||||
|
||||
@@ -1364,6 +1379,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Samodejno posodobi aplikacijo"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Časovni interval sinhronizacije"
|
||||
|
||||
@@ -1656,10 +1678,25 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin spletna stran"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin spletna stran"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "Za izbris: %d"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Prijavi se z OneDrive"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Glavno geslo %s"
|
||||
|
@@ -718,9 +718,21 @@ msgstr "Avbryt"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "Nuvarande version är uppdaterad."
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
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 ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
@@ -1025,6 +1037,9 @@ msgstr ""
|
||||
"Den här anteckningen har inget innehåll. Klicka på \"%s\" för att växla "
|
||||
"redigeraren och redigera anteckningen."
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "stark text"
|
||||
|
||||
@@ -1367,6 +1382,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "Uppdatera programmet automatiskt"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "Synkroniseringsintervall"
|
||||
|
||||
@@ -1672,9 +1694,24 @@ msgstr ""
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin-webbplats"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin-webbplats"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "För att ta bort: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "Logga in med Dropbox"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "Huvudnyckel %s"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Laurent Cozic
|
||||
# This file is distributed under the same license as the Joplin-CLI package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
# Yukio Usuzumi <anohigisavay@gmail.com>, 2018.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -19,7 +19,7 @@ msgid "To delete a tag, untag the associated notes."
|
||||
msgstr "移除相关笔记的标签后才可删除此标签。"
|
||||
|
||||
msgid "Please select the note or notebook to be deleted first."
|
||||
msgstr "请选择最先删除的笔记或笔记本。"
|
||||
msgstr "请先选择需要删除的笔记或笔记本。"
|
||||
|
||||
msgid "Press Ctrl+D or type \"exit\" to exit the application"
|
||||
msgstr "按 Ctrl+D 或输入 \"exit\" 退出程序"
|
||||
@@ -32,7 +32,7 @@ msgid "No notebook selected."
|
||||
msgstr "未选择笔记本。"
|
||||
|
||||
msgid "No notebook has been specified."
|
||||
msgstr "无指定笔记本。"
|
||||
msgstr "未指定笔记本。"
|
||||
|
||||
msgid "Y"
|
||||
msgstr "是"
|
||||
@@ -47,7 +47,7 @@ msgid "y"
|
||||
msgstr "是"
|
||||
|
||||
msgid "Cancelling background synchronisation... Please wait."
|
||||
msgstr "正在取消后台同步... 请稍后。"
|
||||
msgstr "正在取消后台同步... 请稍候。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "No such command: %s"
|
||||
@@ -677,9 +677,21 @@ msgstr "取消"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "当前版本为最新版。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "软件有更新,是否下载最新版?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "是"
|
||||
|
||||
@@ -968,6 +980,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr "此笔记没有任何内容。点击 \"%s\" 切换至编辑器并编辑笔记。"
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "加粗文本"
|
||||
|
||||
@@ -1275,7 +1290,7 @@ 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 "
|
||||
@@ -1308,6 +1323,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "自动更新此程序"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "同步间隔"
|
||||
|
||||
@@ -1606,9 +1628,24 @@ msgstr "- 定位:允许将地理位置信息附加到一条笔记中。"
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin 官网"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin 官网"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "将删除:%d条"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "通过 Dropbox 登录"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "主密码 %s"
|
||||
|
@@ -677,9 +677,21 @@ msgstr "取消"
|
||||
msgid "Current version is up-to-date."
|
||||
msgstr "此版本是最新的。"
|
||||
|
||||
#, javascript-format
|
||||
msgid "%s (pre-release)"
|
||||
msgstr ""
|
||||
|
||||
msgid "An update is available, do you want to download it now?"
|
||||
msgstr "有可用的更新,您需要立即下載嗎?"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Your version: v%s"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "New version: v%s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Yes"
|
||||
msgstr "是"
|
||||
|
||||
@@ -968,6 +980,9 @@ msgid ""
|
||||
"note."
|
||||
msgstr "此筆記沒有內容。按一下 \"%s\" 切換到編輯模式並編輯筆記。"
|
||||
|
||||
msgid "Only one note can be printed or exported to PDF at a time."
|
||||
msgstr ""
|
||||
|
||||
msgid "strong text"
|
||||
msgstr "重要文字 <strong>"
|
||||
|
||||
@@ -1305,6 +1320,13 @@ msgstr ""
|
||||
msgid "Automatically update the application"
|
||||
msgstr "自動更新應用程式"
|
||||
|
||||
msgid "Get pre-releases when checking for updates"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "See the pre-release page for more details: %s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Synchronisation interval"
|
||||
msgstr "同步時間間隔"
|
||||
|
||||
@@ -1594,9 +1616,24 @@ msgstr "- 位置: 允許將地理位置資訊附加到筆記。"
|
||||
msgid "Joplin website"
|
||||
msgstr "Joplin 官方網站"
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "Joplin v%s"
|
||||
msgstr "Joplin 官方網站"
|
||||
|
||||
#, javascript-format
|
||||
msgid "Database v%s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, javascript-format
|
||||
msgid "FTS enabled: %d"
|
||||
msgstr "標示刪除: %d"
|
||||
|
||||
msgid "Login with Dropbox"
|
||||
msgstr "以 Dropbox 登錄"
|
||||
|
||||
msgid "Enter code here"
|
||||
msgstr ""
|
||||
|
||||
#, javascript-format
|
||||
msgid "Master Key %s"
|
||||
msgstr "主密碼 %s"
|
||||
|
7
CliClient/package-lock.json
generated
7
CliClient/package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "joplin",
|
||||
"version": "1.0.119",
|
||||
"version": "1.0.120",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -555,6 +555,11 @@
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
|
||||
},
|
||||
"diacritics": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
|
||||
"integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E="
|
||||
},
|
||||
"domexception": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
|
||||
|
@@ -15,11 +15,12 @@
|
||||
"years": [
|
||||
2016,
|
||||
2017,
|
||||
2018
|
||||
2018,
|
||||
2019
|
||||
],
|
||||
"owner": "Laurent Cozic"
|
||||
},
|
||||
"version": "1.0.119",
|
||||
"version": "1.0.120",
|
||||
"bin": {
|
||||
"joplin": "./main.js"
|
||||
},
|
||||
@@ -31,6 +32,7 @@
|
||||
"async-mutex": "^0.1.3",
|
||||
"base-64": "^0.1.0",
|
||||
"compare-version": "^0.1.2",
|
||||
"diacritics": "^1.3.0",
|
||||
"es6-promise-pool": "^2.5.0",
|
||||
"follow-redirects": "^1.2.4",
|
||||
"form-data": "^2.1.4",
|
||||
|
@@ -29,8 +29,10 @@ npm test tests-build/models_BaseItem.js
|
||||
npm test tests-build/models_Folder.js
|
||||
npm test tests-build/models_Note.js
|
||||
npm test tests-build/models_Tag.js
|
||||
npm test tests-build/models_ItemChange.js
|
||||
npm test tests-build/models_Setting.js
|
||||
npm test tests-build/pathUtils.js
|
||||
npm test tests-build/StringUtils.js
|
||||
npm test tests-build/services_InteropService.js
|
||||
npm test tests-build/services_ResourceService.js
|
||||
npm test tests-build/urlUtils.js
|
||||
|
45
CliClient/tests/StringUtils.js
Normal file
45
CliClient/tests/StringUtils.js
Normal file
@@ -0,0 +1,45 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const StringUtils = require('lib/string-utils');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
});
|
||||
|
||||
describe('StringUtils', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
done();
|
||||
});
|
||||
|
||||
it('should surround keywords with strings', async (done) => {
|
||||
const testCases = [
|
||||
[[], 'test', 'a', 'b', 'test'],
|
||||
[['test'], 'test', 'a', 'b', 'atestb'],
|
||||
[['test'], 'Test', 'a', 'b', 'aTestb'],
|
||||
[['te[]st'], 'Te[]st', 'a', 'b', 'aTe[]stb'],
|
||||
[['test1', 'test2'], 'bla test1 blabla test1 bla test2 not this one - test22', 'a', 'b', 'bla atest1b blabla atest1b bla atest2b not this one - test22'],
|
||||
[['test1', 'test2'], 'bla test1 test1 bla test2', '<span class="highlighted-keyword">', '</span>', 'bla <span class="highlighted-keyword">test1</span> <span class="highlighted-keyword">test1</span> bla <span class="highlighted-keyword">test2</span>'],
|
||||
[[{ type:'regex', value:'test.*?'}], 'bla test1 test1 bla test2 test tttest', 'a', 'b', 'bla atest1b atest1b bla atest2b atestb tttest'],
|
||||
];
|
||||
|
||||
for (let i = 0; i < testCases.length; i++) {
|
||||
const t = testCases[i];
|
||||
|
||||
const keywords = t[0];
|
||||
const input = t[1];
|
||||
const prefix = t[2];
|
||||
const suffix = t[3];
|
||||
const expected = t[4];
|
||||
|
||||
const actual = StringUtils.surroundKeywords(keywords, input, prefix, suffix);
|
||||
|
||||
expect(actual).toBe(expected);
|
||||
}
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
53
CliClient/tests/models_ItemChange.js
Normal file
53
CliClient/tests/models_ItemChange.js
Normal file
@@ -0,0 +1,53 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { asyncTest, fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const ResourceService = require('lib/services/ResourceService');
|
||||
const ItemChangeUtils = require('lib/services/ItemChangeUtils');
|
||||
const Note = require('lib/models/Note');
|
||||
const Setting = require('lib/models/Setting');
|
||||
const ItemChange = require('lib/models/ItemChange');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
});
|
||||
|
||||
let searchEngine = null;
|
||||
|
||||
describe('models_ItemChange', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
await setupDatabaseAndSynchronizer(1);
|
||||
searchEngine = new SearchEngine();
|
||||
searchEngine.setDb(db());
|
||||
done();
|
||||
});
|
||||
|
||||
it('should delete old changes that have been processed', asyncTest(async () => {
|
||||
const n1 = await Note.save({ title: "abcd efgh" }); // 3
|
||||
|
||||
await ItemChange.waitForAllSaved();
|
||||
|
||||
expect(await ItemChange.lastChangeId()).toBe(1);
|
||||
|
||||
const resourceService = new ResourceService();
|
||||
|
||||
await searchEngine.syncTables();
|
||||
|
||||
// If we run this now, it should not delete any change because
|
||||
// the resource service has not yet processed the change
|
||||
await ItemChangeUtils.deleteProcessedChanges();
|
||||
|
||||
expect(await ItemChange.lastChangeId()).toBe(1);
|
||||
|
||||
await resourceService.indexNoteResources();
|
||||
|
||||
// Now that the resource service has processed the change,
|
||||
// the change can be deleted.
|
||||
await ItemChangeUtils.deleteProcessedChanges();
|
||||
|
||||
expect(await ItemChange.lastChangeId()).toBe(0);
|
||||
}));
|
||||
|
||||
});
|
@@ -1,9 +1,11 @@
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, clearDatabase, switchClient, syncTargetId, objectsEqual, checkThrowAsync } = require('test-utils.js');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const Note = require('lib/models/Note');
|
||||
const ItemChange = require('lib/models/ItemChange');
|
||||
const Setting = require('lib/models/Setting');
|
||||
|
||||
process.on('unhandledRejection', (reason, p) => {
|
||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||
@@ -23,53 +25,71 @@ describe('services_SearchEngine', function() {
|
||||
done();
|
||||
});
|
||||
|
||||
it('should keep the content and FTS table in sync', async (done) => {
|
||||
it('should keep the content and FTS table in sync', asyncTest(async () => {
|
||||
let rows, n1, n2, n3;
|
||||
|
||||
n1 = await Note.save({ title: "a" });
|
||||
n2 = await Note.save({ title: "b" });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('a');
|
||||
expect(rows.length).toBe(1);
|
||||
expect(rows[0].title).toBe('a');
|
||||
|
||||
await Note.delete(n1.id);
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('a');
|
||||
expect(rows.length).toBe(0);
|
||||
rows = await engine.search('b');
|
||||
expect(rows[0].title).toBe('b');
|
||||
|
||||
await Note.save({ id: n2.id, title: 'c' });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('b');
|
||||
expect(rows.length).toBe(0);
|
||||
rows = await engine.search('c');
|
||||
expect(rows[0].title).toBe('c');
|
||||
|
||||
await Note.save({ id: n2.id, encryption_applied: 1 });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('c');
|
||||
expect(rows.length).toBe(0);
|
||||
|
||||
await Note.save({ id: n2.id, encryption_applied: 0 });
|
||||
await engine.syncTables();
|
||||
rows = await engine.search('c');
|
||||
expect(rows.length).toBe(1);
|
||||
}));
|
||||
|
||||
done();
|
||||
});
|
||||
it('should, after initial indexing, save the last change ID', asyncTest(async () => {
|
||||
const n1 = await Note.save({ title: "abcd efgh" }); // 3
|
||||
const n2 = await Note.save({ title: "abcd aaaaa abcd abcd" }); // 1
|
||||
|
||||
it('should order search results by relevance (1)', async (done) => {
|
||||
expect(Setting.value('searchEngine.initialIndexingDone')).toBe(false);
|
||||
|
||||
await ItemChange.waitForAllSaved();
|
||||
const lastChangeId = await ItemChange.lastChangeId();
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect(Setting.value('searchEngine.lastProcessedChangeId')).toBe(lastChangeId);
|
||||
expect(Setting.value('searchEngine.initialIndexingDone')).toBe(true);
|
||||
}));
|
||||
|
||||
|
||||
it('should order search results by relevance (1)', asyncTest(async () => {
|
||||
const n1 = await Note.save({ title: "abcd efgh" }); // 3
|
||||
const n2 = await Note.save({ title: "abcd aaaaa abcd abcd" }); // 1
|
||||
const n3 = await Note.save({ title: "abcd aaaaa bbbb eeee abcd" }); // 2
|
||||
|
||||
await engine.syncTables();
|
||||
const rows = await engine.search('abcd');
|
||||
|
||||
expect(rows[0].id).toBe(n2.id);
|
||||
expect(rows[1].id).toBe(n3.id);
|
||||
expect(rows[2].id).toBe(n1.id);
|
||||
}));
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should order search results by relevance (2)', async (done) => {
|
||||
it('should order search results by relevance (2)', asyncTest(async () => {
|
||||
// 1
|
||||
const n1 = await Note.save({ title: "abcd efgh", body: "XX abcd XX efgh" });
|
||||
// 4
|
||||
@@ -81,6 +101,7 @@ describe('services_SearchEngine', function() {
|
||||
// 5
|
||||
const n5 = await Note.save({ title: "occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh occurence many times but very abcd spread appart spread appart spread appart spread appart spread appart efgh" });
|
||||
|
||||
await engine.syncTables();
|
||||
const rows = await engine.search('abcd efgh');
|
||||
|
||||
expect(rows[0].id).toBe(n1.id);
|
||||
@@ -88,15 +109,18 @@ describe('services_SearchEngine', function() {
|
||||
expect(rows[2].id).toBe(n3.id);
|
||||
expect(rows[3].id).toBe(n2.id);
|
||||
expect(rows[4].id).toBe(n5.id);
|
||||
}));
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should supports various query types', async (done) => {
|
||||
it('should supports various query types', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const n1 = await Note.save({ title: "abcd efgh ijkl", body: "aaaa bbbb" });
|
||||
const n2 = await Note.save({ title: "iiii efgh bbbb", body: "aaaa bbbb" });
|
||||
const n3 = await Note.save({ title: "Агентство Рейтер" });
|
||||
const n4 = await Note.save({ title: "Dog" });
|
||||
const n5 = await Note.save({ title: "СООБЩИЛО" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
rows = await engine.search('abcd ijkl');
|
||||
expect(rows.length).toBe(1);
|
||||
@@ -122,10 +146,65 @@ describe('services_SearchEngine', function() {
|
||||
rows = await engine.search('body:bbbb iiii');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
done();
|
||||
});
|
||||
rows = await engine.search('Рейтер');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
it('should parse normal query strings', async (done) => {
|
||||
rows = await engine.search('рейтер');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('Dog');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('dog');
|
||||
expect(rows.length).toBe(1);
|
||||
|
||||
rows = await engine.search('сообщило');
|
||||
expect(rows.length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with or without accents', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "père noël" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('père')).length).toBe(1);
|
||||
expect((await engine.search('pere')).length).toBe(1);
|
||||
expect((await engine.search('noe*')).length).toBe(1);
|
||||
expect((await engine.search('noë*')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with Chinese characters', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "我是法国人" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('我')).length).toBe(1);
|
||||
expect((await engine.search('法国人')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with Japanese characters', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "私は日本語を話すことができません" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('日本')).length).toBe(1);
|
||||
expect((await engine.search('できません')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should support queries with Korean characters', asyncTest(async () => {
|
||||
let rows;
|
||||
const n1 = await Note.save({ title: "이것은 한국말이다" });
|
||||
|
||||
await engine.syncTables();
|
||||
|
||||
expect((await engine.search('이것은')).length).toBe(1);
|
||||
expect((await engine.search('말')).length).toBe(1);
|
||||
}));
|
||||
|
||||
it('should parse normal query strings', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const testCases = [
|
||||
@@ -146,11 +225,9 @@ describe('services_SearchEngine', function() {
|
||||
expect(JSON.stringify(actual.terms.title)).toBe(JSON.stringify(expected.title));
|
||||
expect(JSON.stringify(actual.terms.body)).toBe(JSON.stringify(expected.body));
|
||||
}
|
||||
}));
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
it('should parse query strings with wildcards', async (done) => {
|
||||
it('should parse query strings with wildcards', asyncTest(async () => {
|
||||
let rows;
|
||||
|
||||
const testCases = [
|
||||
@@ -172,17 +249,9 @@ describe('services_SearchEngine', function() {
|
||||
const r = shouldMatch[j].match(regex);
|
||||
expect(!!r).toBe(true, '"' + input + '" should match "' + shouldMatch[j] + '"');
|
||||
}
|
||||
|
||||
// for (let j = 0; j < shouldNotMatch.length; j++) {
|
||||
// const r = shouldNotMatch[j].match(regex);
|
||||
// // console.info(input, shouldNotMatch)
|
||||
// expect(!!r).toBe(false, '"' + input + '" should not match "' + shouldNotMatch[j] + '"');
|
||||
// }
|
||||
}
|
||||
|
||||
expect(engine.parseQuery('*').termCount).toBe(0);
|
||||
|
||||
done();
|
||||
});
|
||||
}));
|
||||
|
||||
});
|
@@ -137,6 +137,7 @@ async function clearDatabase(id = null) {
|
||||
'DELETE FROM settings',
|
||||
'DELETE FROM deleted_items',
|
||||
'DELETE FROM sync_items',
|
||||
'DELETE FROM notes_normalized',
|
||||
];
|
||||
|
||||
await databases_[id].transactionExecBatch(queries);
|
||||
|
1
CliClientDemo/.gitignore
vendored
1
CliClientDemo/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
node_modules
|
Binary file not shown.
@@ -1,31 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
const spawn = require('child_process').spawn;
|
||||
const os = require('os');
|
||||
const fs = require('fs-extra');
|
||||
|
||||
const joplinPath = __dirname + '/node_modules/.bin/joplin';
|
||||
const profileDir = os.homedir() + '/.config/demo-joplin';
|
||||
const dbFilename = 'database.sqlite';
|
||||
|
||||
fs.ensureDirSync(profileDir);
|
||||
if (!fs.pathExistsSync(profileDir + '/' + dbFilename)) {
|
||||
fs.copySync(__dirname + '/' + dbFilename, profileDir + '/' + dbFilename);
|
||||
}
|
||||
|
||||
const opt = {
|
||||
cwd: __dirname,
|
||||
env: (function() {
|
||||
process.env.NODE_PATH = '.';
|
||||
return process.env;
|
||||
}()),
|
||||
stdio: [process.stdin, process.stdout, process.stderr]
|
||||
};
|
||||
|
||||
const app = spawn(joplinPath, ['--is-demo', '--profile', profileDir], opt);
|
||||
|
||||
app.on('close', (code) => {
|
||||
process.exit(code);
|
||||
});
|
2124
CliClientDemo/package-lock.json
generated
2124
CliClientDemo/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"name": "demo-joplin",
|
||||
"version": "1.0.8",
|
||||
"description": "Demo for Joplin CLI",
|
||||
"bin": {
|
||||
"demo-joplin": "./index.js"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/laurent22/joplin/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laurent22/joplin"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.7.0"
|
||||
},
|
||||
"copyright": {
|
||||
"title": "Demo for Joplin CLI",
|
||||
"years": [
|
||||
2016,
|
||||
2017,
|
||||
2018
|
||||
],
|
||||
"owner": "Laurent Cozic"
|
||||
},
|
||||
"dependencies": {
|
||||
"fs-extra": "^4.0.2",
|
||||
"joplin": "^0.10.69"
|
||||
},
|
||||
"author": "Laurent Cozic",
|
||||
"license": "MIT"
|
||||
}
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
npm version patch
|
||||
npm publish
|
@@ -58,7 +58,7 @@ class ElectronAppWrapper {
|
||||
|
||||
// Linux icon workaround for bug https://github.com/electron-userland/electron-builder/issues/2098
|
||||
// Fix: https://github.com/electron-userland/electron-builder/issues/2269
|
||||
if (shim.isLinux()) windowOptions.icon = __dirname + '/build/icons/128x128.png';
|
||||
if (shim.isLinux()) windowOptions.icon = path.join(__dirname, '..', 'build/icons/128x128.png');
|
||||
|
||||
require('electron-context-menu')({
|
||||
shouldShowMenu: (event, params) => {
|
||||
@@ -231,4 +231,4 @@ class ElectronAppWrapper {
|
||||
|
||||
}
|
||||
|
||||
module.exports = { ElectronAppWrapper };
|
||||
module.exports = { ElectronAppWrapper };
|
||||
|
@@ -23,7 +23,6 @@ const DecryptionWorker = require('lib/services/DecryptionWorker');
|
||||
const InteropService = require('lib/services/InteropService');
|
||||
const InteropServiceHelper = require('./InteropServiceHelper.js');
|
||||
const ResourceService = require('lib/services/ResourceService');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const ClipperServer = require('lib/ClipperServer');
|
||||
const ExternalEditWatcher = require('lib/services/ExternalEditWatcher');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
@@ -198,10 +197,6 @@ class Application extends BaseApplication {
|
||||
this.updateEditorFont();
|
||||
}
|
||||
|
||||
if (["NOTE_UPDATE_ONE", "NOTE_DELETE", "FOLDER_UPDATE_ONE", "FOLDER_DELETE"].indexOf(action.type) >= 0) {
|
||||
if (!await reg.syncTarget().syncStarted()) reg.scheduleSync(30 * 1000, { syncSteps: ["update_remote", "delete_remote"] });
|
||||
}
|
||||
|
||||
if (['EVENT_NOTE_ALARM_FIELD_CHANGE', 'NOTE_DELETE'].indexOf(action.type) >= 0) {
|
||||
await AlarmService.updateNoteNotification(action.id, action.type === 'NOTE_DELETE');
|
||||
}
|
||||
@@ -589,7 +584,7 @@ class Application extends BaseApplication {
|
||||
}, {
|
||||
label: _('Check for updates...'),
|
||||
click: () => {
|
||||
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath());
|
||||
bridge().checkForUpdates(false, bridge().window(), this.checkForUpdateLoggerPath(), { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
|
||||
}
|
||||
}, {
|
||||
type: 'separator',
|
||||
@@ -601,7 +596,7 @@ class Application extends BaseApplication {
|
||||
let message = [
|
||||
p.description,
|
||||
'',
|
||||
'Copyright © 2016-2018 Laurent Cozic',
|
||||
'Copyright © 2016-2019 Laurent Cozic',
|
||||
_('%s %s (%s, %s)', p.name, p.version, Setting.value('env'), process.platform),
|
||||
];
|
||||
bridge().showInfoMessageBox(message.join('\n'), {
|
||||
@@ -772,7 +767,7 @@ class Application extends BaseApplication {
|
||||
if (shim.isWindows() || shim.isMac()) {
|
||||
const runAutoUpdateCheck = () => {
|
||||
if (Setting.value('autoUpdateEnabled')) {
|
||||
bridge().checkForUpdates(true, bridge().window(), this.checkForUpdateLoggerPath());
|
||||
bridge().checkForUpdates(true, bridge().window(), this.checkForUpdateLoggerPath(), { includePreReleases: Setting.value('autoUpdate.includePreReleases') });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -794,9 +789,6 @@ class Application extends BaseApplication {
|
||||
|
||||
ResourceService.runInBackground();
|
||||
|
||||
SearchEngine.instance().setDb(reg.db());
|
||||
SearchEngine.instance().setLogger(reg.logger());
|
||||
|
||||
if (Setting.value('env') === 'dev') {
|
||||
AlarmService.updateAllNotifications();
|
||||
} else {
|
||||
|
@@ -116,9 +116,9 @@ class Bridge {
|
||||
return require('electron').shell.openItem(fullPath)
|
||||
}
|
||||
|
||||
checkForUpdates(inBackground, window, logFilePath) {
|
||||
checkForUpdates(inBackground, window, logFilePath, options) {
|
||||
const { checkForUpdates } = require('./checkForUpdates.js');
|
||||
checkForUpdates(inBackground, window, logFilePath);
|
||||
checkForUpdates(inBackground, window, logFilePath, options);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -29,15 +29,35 @@ function onCheckEnded() {
|
||||
isCheckingForUpdate_ = false;
|
||||
}
|
||||
|
||||
async function fetchLatestRelease() {
|
||||
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
|
||||
async function fetchLatestRelease(options) {
|
||||
options = Object.assign({}, { includePreReleases: false }, options);
|
||||
|
||||
if (!response.ok) {
|
||||
const responseText = await response.text();
|
||||
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
let json = null;
|
||||
|
||||
if (options.includePreReleases) {
|
||||
// This end-point will include all releases, including pre-releases (but not draft), so we take
|
||||
// whatever is the latest release. It might be the same as releases/latest, or it might be
|
||||
// a pre-release.
|
||||
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases');
|
||||
|
||||
if (!response.ok) {
|
||||
const responseText = await response.text();
|
||||
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
}
|
||||
|
||||
json = await response.json();
|
||||
if (!json.length) throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
json = json[0];
|
||||
} else {
|
||||
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
|
||||
|
||||
if (!response.ok) {
|
||||
const responseText = await response.text();
|
||||
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
||||
}
|
||||
|
||||
json = await response.json();
|
||||
}
|
||||
|
||||
const json = await response.json();
|
||||
|
||||
const version = json.tag_name.substr(1);
|
||||
let downloadUrl = null;
|
||||
@@ -69,10 +89,11 @@ async function fetchLatestRelease() {
|
||||
downloadUrl: downloadUrl,
|
||||
notes: json.body,
|
||||
pageUrl: json.html_url,
|
||||
prerelease: json.prerelease,
|
||||
};
|
||||
}
|
||||
|
||||
function checkForUpdates(inBackground, window, logFilePath) {
|
||||
function checkForUpdates(inBackground, window, logFilePath, options) {
|
||||
if (isCheckingForUpdate_) {
|
||||
autoUpdateLogger_.info('checkForUpdates: Skipping check because it is already running');
|
||||
return;
|
||||
@@ -91,18 +112,22 @@ function checkForUpdates(inBackground, window, logFilePath) {
|
||||
|
||||
checkInBackground_ = inBackground;
|
||||
|
||||
fetchLatestRelease().then(release => {
|
||||
autoUpdateLogger_.info('checkForUpdates: Checking with options ' + JSON.stringify(options));
|
||||
|
||||
fetchLatestRelease(options).then(release => {
|
||||
autoUpdateLogger_.info('Current version: ' + packageInfo.version);
|
||||
autoUpdateLogger_.info('Latest version: ' + release.version);
|
||||
autoUpdateLogger_.info('Is Pre-release:', release.prerelease);
|
||||
|
||||
if (compareVersions(release.version, packageInfo.version) <= 0) {
|
||||
if (!checkInBackground_) dialog.showMessageBox({ message: _('Current version is up-to-date.') })
|
||||
} else {
|
||||
const releaseNotes = release.notes.trim() ? "\n\n" + release.notes.trim() : '';
|
||||
const newVersionString = release.prerelease ? _('%s (pre-release)', release.version) : release.version;
|
||||
|
||||
const buttonIndex = dialog.showMessageBox(parentWindow_, {
|
||||
type: 'info',
|
||||
message: _('An update is available, do you want to download it now?' + releaseNotes),
|
||||
message: _('An update is available, do you want to download it now?') + '\n\n' + _('Your version: v%s', packageInfo.version) + '\n' + _('New version: v%s', newVersionString) + releaseNotes,
|
||||
buttons: [_('Yes'), _('No')]
|
||||
});
|
||||
|
||||
|
@@ -2,6 +2,7 @@ const fs = require('fs-extra');
|
||||
const spawnSync = require('child_process').spawnSync;
|
||||
|
||||
const babelPath = __dirname + '/node_modules/.bin/babel' + (process.platform === 'win32' ? '.cmd' : '');
|
||||
const basePath = __dirname + '/../..';
|
||||
const guiPath = __dirname + '/gui';
|
||||
|
||||
function fileIsNewerThan(path1, path2) {
|
||||
@@ -27,7 +28,7 @@ fs.readdirSync(guiPath).forEach((filename) => {
|
||||
|
||||
if (fileIsNewerThan(jsxPath, jsPath)) {
|
||||
console.info('Compiling ' + jsxPath + '...');
|
||||
const result = spawnSync(babelPath, ['--presets', 'react', '--out-file',jsPath, jsxPath]);
|
||||
const result = spawnSync(babelPath, ['--presets', 'react', '--out-file', jsPath, jsxPath]);
|
||||
if (result.status !== 0) {
|
||||
const msg = [];
|
||||
if (result.stdout) msg.push(result.stdout.toString());
|
||||
@@ -38,3 +39,10 @@ fs.readdirSync(guiPath).forEach((filename) => {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const libContent = [
|
||||
fs.readFileSync(basePath + '/ReactNativeClient/lib/string-utils-common.js', 'utf8'),
|
||||
fs.readFileSync(basePath + '/ReactNativeClient/lib/markJsUtils.js', 'utf8'),
|
||||
];
|
||||
|
||||
fs.writeFileSync(__dirname + '/gui/note-viewer/lib.js', libContent.join('\n'), 'utf8');
|
@@ -4,6 +4,7 @@ const { connect } = require('react-redux');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { themeStyle } = require('../theme.js');
|
||||
const BaseModel = require('lib/BaseModel');
|
||||
const markJsUtils = require('lib/markJsUtils');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { bridge } = require('electron').remote.require('./bridge');
|
||||
const Menu = bridge().Menu;
|
||||
@@ -14,6 +15,7 @@ const InteropServiceHelper = require('../InteropServiceHelper.js');
|
||||
const Search = require('lib/models/Search');
|
||||
const Mark = require('mark.js/dist/mark.min.js');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
const { replaceRegexDiacritics, pregQuote } = require('lib/string-utils');
|
||||
|
||||
class NoteListComponent extends React.Component {
|
||||
|
||||
@@ -155,12 +157,14 @@ class NoteListComponent extends React.Component {
|
||||
}}));
|
||||
}
|
||||
|
||||
exportMenu.append(new MenuItem({ label: 'PDF - ' + _('PDF File') , click: () => {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'exportPdf',
|
||||
});
|
||||
}}));
|
||||
if (noteIds.length === 1) {
|
||||
exportMenu.append(new MenuItem({ label: 'PDF - ' + _('PDF File') , click: () => {
|
||||
this.props.dispatch({
|
||||
type: 'WINDOW_COMMAND',
|
||||
name: 'exportPdf',
|
||||
});
|
||||
}}));
|
||||
}
|
||||
|
||||
const exportMenuItem = new MenuItem({label: _('Export'), submenu: exportMenu});
|
||||
|
||||
@@ -276,11 +280,10 @@ class NoteListComponent extends React.Component {
|
||||
for (let i = 0; i < highlightedWords.length; i++) {
|
||||
const w = highlightedWords[i];
|
||||
|
||||
if (w.type === 'regex') {
|
||||
mark.markRegExp(new RegExp(w.value, 'gmi'), { acrossElements: true });
|
||||
} else {
|
||||
mark.mark([w]);
|
||||
}
|
||||
markJsUtils.markKeyword(mark, w, {
|
||||
pregQuote: pregQuote,
|
||||
replaceRegexDiacritics: replaceRegexDiacritics,
|
||||
});
|
||||
}
|
||||
|
||||
// Note: in this case it is safe to use dangerouslySetInnerHTML because titleElement
|
||||
|
@@ -16,6 +16,8 @@ class NotePropertiesDialog extends React.Component {
|
||||
|
||||
this.okButton_click = this.okButton_click.bind(this);
|
||||
this.cancelButton_click = this.cancelButton_click.bind(this);
|
||||
this.onKeyDown = this.onKeyDown.bind(this);
|
||||
this.okButton = React.createRef();
|
||||
|
||||
this.state = {
|
||||
formNote: null,
|
||||
@@ -43,6 +45,12 @@ class NotePropertiesDialog extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
if (this.state.editedKey == null) {
|
||||
this.okButton.current.focus();
|
||||
}
|
||||
}
|
||||
|
||||
async loadNote(noteId) {
|
||||
if (!noteId) {
|
||||
this.setState({ formNote: null });
|
||||
@@ -184,6 +192,14 @@ class NotePropertiesDialog extends React.Component {
|
||||
this.closeDialog(false);
|
||||
}
|
||||
|
||||
onKeyDown(event) {
|
||||
if (event.keyCode === 13) {
|
||||
this.closeDialog(true);
|
||||
} else if (event.keyCode === 27) {
|
||||
this.closeDialog(false);
|
||||
}
|
||||
}
|
||||
|
||||
editPropertyButtonClick(key, initialValue) {
|
||||
this.setState({
|
||||
editedKey: key,
|
||||
@@ -222,6 +238,7 @@ class NotePropertiesDialog extends React.Component {
|
||||
|
||||
async cancelProperty() {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.okButton.current.focus();
|
||||
this.setState({
|
||||
editedKey: null,
|
||||
editedValue: null
|
||||
@@ -347,7 +364,17 @@ class NotePropertiesDialog extends React.Component {
|
||||
const formNote = this.state.formNote;
|
||||
|
||||
const buttonComps = [];
|
||||
buttonComps.push(<button key="ok" style={styles.button} onClick={this.okButton_click}>{_('Apply')}</button>);
|
||||
buttonComps.push(
|
||||
<button
|
||||
key="ok"
|
||||
style={styles.button}
|
||||
onClick={this.okButton_click}
|
||||
ref={this.okButton}
|
||||
onKeyDown={this.onKeyDown}
|
||||
>
|
||||
{_('Apply')}
|
||||
</button>
|
||||
);
|
||||
buttonComps.push(<button key="cancel" style={styles.button} onClick={this.cancelButton_click}>{_('Cancel')}</button>);
|
||||
|
||||
const noteComps = [];
|
||||
|
@@ -6,7 +6,7 @@ const Search = require('lib/models/Search.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { IconButton } = require('./IconButton.min.js');
|
||||
const { urlDecode, escapeHtml } = require('lib/string-utils');
|
||||
const { urlDecode, escapeHtml, pregQuote, scriptType } = require('lib/string-utils');
|
||||
const Toolbar = require('./Toolbar.min.js');
|
||||
const TagList = require('./TagList.min.js');
|
||||
const { connect } = require('react-redux');
|
||||
@@ -734,7 +734,7 @@ class NoteTextComponent extends React.Component {
|
||||
webviewReady: true,
|
||||
});
|
||||
|
||||
// if (Setting.value('env') === 'dev') this.webview_.openDevTools();
|
||||
if (Setting.value('env') === 'dev') this.webview_.openDevTools();
|
||||
}
|
||||
|
||||
webview_ref(element) {
|
||||
@@ -909,24 +909,28 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
|
||||
async doCommand(command) {
|
||||
if (!command || !this.state.note) return;
|
||||
if (!command) return;
|
||||
|
||||
let fn = null;
|
||||
|
||||
if (command.name === 'exportPdf' && this.webview_) {
|
||||
if (command.name === 'exportPdf') {
|
||||
fn = this.commandSavePdf;
|
||||
} else if (command.name === 'print' && this.webview_) {
|
||||
} else if (command.name === 'print') {
|
||||
fn = this.commandPrint;
|
||||
} else if (command.name === 'textBold') {
|
||||
fn = this.commandTextBold;
|
||||
} else if (command.name === 'textItalic') {
|
||||
fn = this.commandTextItalic;
|
||||
} else if (command.name === 'insertDateTime' ) {
|
||||
fn = this.commandDateTime;
|
||||
} else if (command.name === 'commandStartExternalEditing') {
|
||||
fn = this.commandStartExternalEditing;
|
||||
} else if (command.name === 'showLocalSearch') {
|
||||
fn = this.commandShowLocalSearch;
|
||||
}
|
||||
|
||||
if (this.state.note) {
|
||||
if (command.name === 'textBold') {
|
||||
fn = this.commandTextBold;
|
||||
} else if (command.name === 'textItalic') {
|
||||
fn = this.commandTextItalic;
|
||||
} else if (command.name === 'insertDateTime' ) {
|
||||
fn = this.commandDateTime;
|
||||
} else if (command.name === 'commandStartExternalEditing') {
|
||||
fn = this.commandStartExternalEditing;
|
||||
} else if (command.name === 'showLocalSearch') {
|
||||
fn = this.commandShowLocalSearch;
|
||||
}
|
||||
}
|
||||
|
||||
if (!fn) return;
|
||||
@@ -998,6 +1002,10 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
|
||||
printTo_(target, options) {
|
||||
if (this.props.selectedNoteIds.length !== 1 || !this.webview_) {
|
||||
throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
|
||||
}
|
||||
|
||||
const previousBody = this.state.note.body;
|
||||
const tempBody = "# " + this.state.note.title + "\n\n" + previousBody;
|
||||
|
||||
@@ -1033,18 +1041,28 @@ class NoteTextComponent extends React.Component {
|
||||
}
|
||||
|
||||
commandSavePdf() {
|
||||
const path = bridge().showSaveDialog({
|
||||
filters: [{ name: _('PDF File'), extensions: ['pdf']}],
|
||||
defaultPath: safeFilename(this.state.note.title),
|
||||
});
|
||||
try {
|
||||
if (!this.state.note) throw new Error(_('Only one note can be printed or exported to PDF at a time.'));
|
||||
|
||||
const path = bridge().showSaveDialog({
|
||||
filters: [{ name: _('PDF File'), extensions: ['pdf']}],
|
||||
defaultPath: safeFilename(this.state.note.title),
|
||||
});
|
||||
|
||||
if (!path) return;
|
||||
|
||||
if (path) {
|
||||
this.printTo_('pdf', { path: path });
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
commandPrint() {
|
||||
this.printTo_('printer');
|
||||
try {
|
||||
this.printTo_('printer');
|
||||
} catch (error) {
|
||||
bridge().showErrorMessageBox(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
async commandStartExternalEditing() {
|
||||
@@ -1570,7 +1588,11 @@ class NoteTextComponent extends React.Component {
|
||||
const markerOptions = {};
|
||||
|
||||
if (this.state.showLocalSearch) {
|
||||
keywords = [this.state.localSearch.query];
|
||||
keywords = [{
|
||||
type: 'text',
|
||||
value: this.state.localSearch.query,
|
||||
accuracy: 'partially',
|
||||
}]
|
||||
markerOptions.selectedIndex = this.state.localSearch.selectedIndex;
|
||||
} else {
|
||||
const search = BaseModel.byId(this.props.searches, this.props.selectedSearchId);
|
||||
@@ -1705,6 +1727,7 @@ class NoteTextComponent extends React.Component {
|
||||
const mapStateToProps = (state) => {
|
||||
return {
|
||||
noteId: state.selectedNoteIds.length === 1 ? state.selectedNoteIds[0] : null,
|
||||
selectedNoteIds: state.selectedNoteIds,
|
||||
noteTags: state.selectedNoteTags,
|
||||
folderId: state.selectedFolderId,
|
||||
itemType: state.selectedItemType,
|
||||
|
@@ -3,6 +3,7 @@ const { connect } = require("react-redux");
|
||||
const shared = require("lib/components/shared/side-menu-shared.js");
|
||||
const { Synchronizer } = require("lib/synchronizer.js");
|
||||
const BaseModel = require("lib/BaseModel.js");
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Folder = require("lib/models/Folder.js");
|
||||
const Note = require("lib/models/Note.js");
|
||||
const Tag = require("lib/models/Tag.js");
|
||||
@@ -23,7 +24,7 @@ class SideBarComponent extends React.Component {
|
||||
this.onFolderDragStart_ = (event) => {
|
||||
const folderId = event.currentTarget.getAttribute('folderid');
|
||||
if (!folderId) return;
|
||||
|
||||
|
||||
event.dataTransfer.setDragImage(new Image(), 1, 1);
|
||||
event.dataTransfer.clearData();
|
||||
event.dataTransfer.setData('text/x-jop-folder-ids', JSON.stringify([folderId]));
|
||||
@@ -79,6 +80,11 @@ class SideBarComponent extends React.Component {
|
||||
id: folderId,
|
||||
});
|
||||
};
|
||||
|
||||
this.state = {
|
||||
tagHeaderIsExpanded: Setting.value('tagHeaderIsExpanded'),
|
||||
folderHeaderIsExpanded: Setting.value('folderHeaderIsExpanded')
|
||||
};
|
||||
}
|
||||
|
||||
style() {
|
||||
@@ -190,7 +196,7 @@ class SideBarComponent extends React.Component {
|
||||
if (shim.isLinux()) {
|
||||
// For some reason, the UI seems to sleep in some Linux distro during
|
||||
// sync. Cannot find the reason for it and cannot replicate, so here
|
||||
// as a test force the update at regular intervals.
|
||||
// as a test force the update at regular intervals.
|
||||
// https://github.com/laurent22/joplin/issues/312#issuecomment-429472193
|
||||
if (!prevProps.syncStarted && this.props.syncStarted) {
|
||||
this.clearForceUpdateDuringSync();
|
||||
@@ -201,7 +207,7 @@ class SideBarComponent extends React.Component {
|
||||
}
|
||||
|
||||
if (prevProps.syncStarted && !this.props.syncStarted) this.clearForceUpdateDuringSync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
@@ -303,7 +309,7 @@ class SideBarComponent extends React.Component {
|
||||
);
|
||||
}
|
||||
|
||||
if (itemType === BaseModel.TYPE_TAG) {
|
||||
if (itemType === BaseModel.TYPE_TAG) {
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: _('Rename'),
|
||||
@@ -440,14 +446,48 @@ class SideBarComponent extends React.Component {
|
||||
makeHeader(key, label, iconName, extraProps = {}) {
|
||||
const style = this.style().header;
|
||||
const icon = <i style={{ fontSize: style.fontSize * 1.2, marginRight: 5 }} className={"fa " + iconName} />;
|
||||
|
||||
if (extraProps.toggleblock || extraProps.onClick) {
|
||||
style.cursor = "pointer";
|
||||
}
|
||||
|
||||
let headerClick = extraProps.onClick || null;
|
||||
delete extraProps.onClick;
|
||||
|
||||
// check if toggling option is set.
|
||||
let toggleIcon = null;
|
||||
const toggleKey = `${key}IsExpanded`;
|
||||
if (extraProps.toggleblock) {
|
||||
let isExpanded = this.state[toggleKey];
|
||||
toggleIcon = <i className={`fa ${isExpanded ? 'fa-chevron-down' : 'fa-chevron-left'}`} style={{ fontSize: style.fontSize * 0.75,
|
||||
marginRight: 12, marginLeft: 5, marginTop: style.fontSize * 0.125}}></i>;
|
||||
}
|
||||
return (
|
||||
<div style={style} key={key} {...extraProps}>
|
||||
<div style={style} key={key} {...extraProps} onClick={(event) => {
|
||||
// if a custom click event is attached, trigger that.
|
||||
if (headerClick) {
|
||||
headerClick(key, event);
|
||||
}
|
||||
this.onHeaderClick_(key, event);
|
||||
}}>
|
||||
{icon}
|
||||
{label}
|
||||
<span style={{flex: 1 }}>{label}</span>
|
||||
{toggleIcon}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
onHeaderClick_(key, event) {
|
||||
const currentHeader = event.currentTarget;
|
||||
const toggleBlock = +currentHeader.getAttribute('toggleblock');
|
||||
if (toggleBlock) {
|
||||
const toggleKey = `${key}IsExpanded`;
|
||||
const isExpanded = this.state[toggleKey];
|
||||
this.setState({ [toggleKey]: !isExpanded });
|
||||
Setting.setValue(toggleKey, !isExpanded);
|
||||
}
|
||||
}
|
||||
|
||||
synchronizeButton(type) {
|
||||
const style = this.style().button;
|
||||
const iconName = type === "sync" ? "fa-refresh" : "fa-times";
|
||||
@@ -477,24 +517,27 @@ class SideBarComponent extends React.Component {
|
||||
});
|
||||
|
||||
let items = [];
|
||||
|
||||
items.push(this.makeHeader("folderHeader", _("Notebooks"), "fa-folder-o", {
|
||||
onDrop: this.onFolderDrop_,
|
||||
folderid: '',
|
||||
toggleblock: 1
|
||||
}));
|
||||
|
||||
if (this.props.folders.length) {
|
||||
const folderItems = shared.renderFolders(this.props, this.folderItem.bind(this));
|
||||
items = items.concat(folderItems);
|
||||
items.push(<div className="folders" key="folder_items" style={{display: this.state.folderHeaderIsExpanded ? 'block': 'none'}}>
|
||||
{folderItems}</div>);
|
||||
}
|
||||
|
||||
items.push(this.makeHeader("tagHeader", _("Tags"), "fa-tags"));
|
||||
items.push(this.makeHeader("tagHeader", _("Tags"), "fa-tags", {
|
||||
toggleblock: 1
|
||||
}));
|
||||
|
||||
if (this.props.tags.length) {
|
||||
const tagItems = shared.renderTags(this.props, this.tagItem.bind(this));
|
||||
|
||||
items.push(
|
||||
<div className="tags" key="tag_items">
|
||||
<div className="tags" key="tag_items" style={{display: this.state.tagHeaderIsExpanded ? 'block': 'none'}}>
|
||||
{tagItems}
|
||||
</div>
|
||||
);
|
||||
|
@@ -37,6 +37,7 @@
|
||||
<div id="hlScriptContainer"></div>
|
||||
<div id="markScriptContainer"></div>
|
||||
<div id="content" ondragstart="return false;" ondrop="return false;"></div>
|
||||
<script src="./lib.js"></script>
|
||||
|
||||
<script>
|
||||
const contentElement = document.getElementById('content');
|
||||
@@ -226,6 +227,8 @@
|
||||
function setMarkers(keywords, options = null) {
|
||||
if (!options) options = {};
|
||||
|
||||
// TODO: Add support for scriptType on mobile and CLI
|
||||
|
||||
if (!mark_) {
|
||||
mark_ = new Mark(document.getElementById('content'), {
|
||||
exclude: ['img'],
|
||||
@@ -255,19 +258,14 @@
|
||||
}
|
||||
|
||||
for (let i = 0; i < keywords.length; i++) {
|
||||
const keyword = keywords[i];
|
||||
let keyword = keywords[i];
|
||||
|
||||
if (keyword.type === 'regex') {
|
||||
mark_.markRegExp(new RegExp(keyword.value, 'gmi'), {
|
||||
each: onEachElement,
|
||||
acrossElements: true,
|
||||
});
|
||||
} else {
|
||||
mark_.mark([keyword], {
|
||||
each: onEachElement,
|
||||
accuracy: 'exactly',
|
||||
});
|
||||
}
|
||||
markJsUtils.markKeyword(mark_, keyword, {
|
||||
pregQuote: pregQuote,
|
||||
replaceRegexDiacritics: replaceRegexDiacritics,
|
||||
}, {
|
||||
each: onEachElement,
|
||||
});
|
||||
}
|
||||
|
||||
ipcProxySendToHost('setMarkerCount', elementIndex);
|
||||
@@ -359,22 +357,38 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
function getParentAnchorElement(element) {
|
||||
let counter = 0;
|
||||
while (true) {
|
||||
|
||||
if (counter++ >= 10000) {
|
||||
console.warn('been looping for too long - exiting')
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!element) return null;
|
||||
if (element.nodeName === 'A') return element;
|
||||
element = element.parentElement;
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('click', function(event) {
|
||||
const t = event.target;
|
||||
const anchor = getParentAnchorElement(event.target);
|
||||
if (!anchor) return;
|
||||
|
||||
// Prevent URLs added via <a> tags from being opened within the application itself
|
||||
// otherwise it would open the whole website within the WebView.
|
||||
if (t && t.nodeName === 'A' && !t.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, t)) return;
|
||||
if (!anchor.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, anchor)) return;
|
||||
|
||||
event.preventDefault();
|
||||
ipcProxySendToHost(t.getAttribute('href'));
|
||||
ipcProxySendToHost(anchor.getAttribute('href'));
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is an internal link, jump to the anchor directly
|
||||
if (t && t.nodeName === 'A' && t.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, t)) return;
|
||||
if (anchor.hasAttribute('data-from-md')) {
|
||||
if (handleInternalLink(event, anchor)) return;
|
||||
}
|
||||
});
|
||||
|
||||
|
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
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
920
ElectronClient/app/package-lock.json
generated
920
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.119",
|
||||
"version": "1.0.124",
|
||||
"description": "Joplin for Desktop",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
@@ -8,8 +8,8 @@
|
||||
"pack": "node_modules/.bin/electron-builder --dir",
|
||||
"dist": "node_modules/.bin/electron-builder",
|
||||
"publish": "build -p always",
|
||||
"postinstall": "node compile-jsx.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts && install-app-deps",
|
||||
"compile": "node compile-jsx.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts"
|
||||
"postinstall": "node compile.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts && install-app-deps",
|
||||
"compile": "node compile.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -58,6 +58,9 @@
|
||||
"linux": {
|
||||
"asar": false,
|
||||
"category": "Office",
|
||||
"desktop": {
|
||||
"Icon": "joplin"
|
||||
},
|
||||
"target": "AppImage"
|
||||
}
|
||||
},
|
||||
@@ -81,6 +84,7 @@
|
||||
"base-64": "^0.1.0",
|
||||
"chokidar": "^2.0.3",
|
||||
"compare-versions": "^3.2.1",
|
||||
"diacritics": "^1.3.0",
|
||||
"electron-context-menu": "^0.9.1",
|
||||
"electron-is-dev": "^0.3.0",
|
||||
"electron-window-state": "^4.1.1",
|
||||
|
@@ -1,12 +1,9 @@
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
|
||||
const zoomRatio = Setting.value('style.zoom') / 100;
|
||||
const editorFontSize = Setting.value('style.editor.fontSize');
|
||||
|
||||
// globalStyle should be used for properties that do not change across themes
|
||||
// i.e. should not be used for colors
|
||||
const globalStyle = {
|
||||
fontSize: Math.round(12 * zoomRatio),
|
||||
fontSize: 12,
|
||||
fontFamily: 'sans-serif',
|
||||
margin: 15, // No text and no interactive component should be within this margin
|
||||
itemMarginTop: 10,
|
||||
@@ -15,8 +12,8 @@ const globalStyle = {
|
||||
disabledOpacity: 0.3,
|
||||
buttonMinWidth: 50,
|
||||
buttonMinHeight: 30,
|
||||
editorFontSize: editorFontSize,
|
||||
textAreaLineHeight: Math.round(17 * editorFontSize / 12),
|
||||
editorFontSize: 12,
|
||||
textAreaLineHeight: 17,
|
||||
|
||||
headerHeight: 35,
|
||||
headerButtonHPadding: 6,
|
||||
@@ -25,10 +22,6 @@ const globalStyle = {
|
||||
tagItemPadding: 3,
|
||||
};
|
||||
|
||||
// For WebView - must correspond to the properties above
|
||||
globalStyle.htmlFontSize = globalStyle.fontSize + 'px';
|
||||
globalStyle.htmlLineHeight = Math.round(20 * zoomRatio) + 'px';
|
||||
|
||||
globalStyle.marginRight = globalStyle.margin;
|
||||
globalStyle.marginLeft = globalStyle.margin;
|
||||
globalStyle.marginTop = globalStyle.margin;
|
||||
@@ -43,39 +36,6 @@ globalStyle.lineInput = {
|
||||
fontFamily: globalStyle.fontFamily,
|
||||
};
|
||||
|
||||
globalStyle.textStyle = {
|
||||
fontFamily: globalStyle.fontFamily,
|
||||
fontSize: globalStyle.fontSize,
|
||||
lineHeight: '1.6em',
|
||||
};
|
||||
|
||||
globalStyle.textStyle2 = Object.assign({}, globalStyle.textStyle, {});
|
||||
|
||||
globalStyle.urlStyle = Object.assign({}, globalStyle.textStyle, { textDecoration: 'underline' });
|
||||
|
||||
globalStyle.h1Style = Object.assign({}, globalStyle.textStyle);
|
||||
globalStyle.h1Style.fontSize *= 1.5;
|
||||
globalStyle.h1Style.fontWeight = 'bold';
|
||||
|
||||
globalStyle.h2Style = Object.assign({}, globalStyle.textStyle);
|
||||
globalStyle.h2Style.fontSize *= 1.3;
|
||||
globalStyle.h2Style.fontWeight = 'bold';
|
||||
|
||||
globalStyle.toolbarStyle = {
|
||||
height: globalStyle.toolbarHeight,
|
||||
minWidth: globalStyle.toolbarHeight,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
paddingLeft: globalStyle.headerButtonHPadding,
|
||||
paddingRight: globalStyle.headerButtonHPadding,
|
||||
textDecoration: 'none',
|
||||
fontFamily: globalStyle.fontFamily,
|
||||
fontSize: globalStyle.fontSize,
|
||||
boxSizing: 'border-box',
|
||||
cursor: 'default',
|
||||
justifyContent: 'center',
|
||||
};
|
||||
|
||||
globalStyle.headerStyle = {};
|
||||
|
||||
globalStyle.inputStyle = {
|
||||
@@ -180,6 +140,59 @@ function addExtraStyles(style) {
|
||||
color: style.raisedColor,
|
||||
};
|
||||
|
||||
style.toolbarStyle = {
|
||||
height: style.toolbarHeight,
|
||||
minWidth: style.toolbarHeight,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
paddingLeft: style.headerButtonHPadding,
|
||||
paddingRight: style.headerButtonHPadding,
|
||||
textDecoration: 'none',
|
||||
fontFamily: style.fontFamily,
|
||||
fontSize: style.fontSize,
|
||||
boxSizing: 'border-box',
|
||||
cursor: 'default',
|
||||
justifyContent: 'center',
|
||||
color: style.color,
|
||||
};
|
||||
|
||||
style.textStyle = {
|
||||
fontFamily: globalStyle.fontFamily,
|
||||
fontSize: style.fontSize,
|
||||
lineHeight: '1.6em',
|
||||
color: style.color
|
||||
};
|
||||
|
||||
style.textStyle2 = Object.assign({}, style.textStyle,
|
||||
{ color: style.color2, }
|
||||
);
|
||||
|
||||
style.urlStyle = Object.assign({}, style.textStyle,
|
||||
{
|
||||
textDecoration: 'underline',
|
||||
color: style.urlColor
|
||||
}
|
||||
);
|
||||
|
||||
style.h1Style = Object.assign({},
|
||||
style.textStyle,
|
||||
{
|
||||
color: style.color,
|
||||
fontSize: style.textStyle.fontSize * 1.5,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
);
|
||||
|
||||
style.h2Style = Object.assign({},
|
||||
style.textStyle,
|
||||
{
|
||||
color: style.color,
|
||||
fontSize: style.textStyle.fontSize * 1.3,
|
||||
fontWeight: 'bold'
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
@@ -187,26 +200,38 @@ let themeCache_ = {};
|
||||
|
||||
function themeStyle(theme) {
|
||||
if (!theme) throw new Error('Theme must be specified');
|
||||
if (themeCache_[theme]) return themeCache_[theme];
|
||||
|
||||
var zoomRatio = Setting.value('style.zoom') / 100;
|
||||
var editorFontSize = Setting.value('style.editor.fontSize');
|
||||
|
||||
const cacheKey = [theme, zoomRatio, editorFontSize].join('-');
|
||||
if (themeCache_[cacheKey]) return themeCache_[cacheKey];
|
||||
|
||||
let fontSizes = {
|
||||
fontSize: Math.round(12 * zoomRatio),
|
||||
editorFontSize: editorFontSize,
|
||||
textAreaLineHeight: Math.round(17 * editorFontSize / 12),
|
||||
|
||||
// For WebView - must correspond to the properties above
|
||||
htmlFontSize: Math.round(12 * zoomRatio) + 'px',
|
||||
htmlLineHeight: Math.round(20 * zoomRatio) + 'px'
|
||||
}
|
||||
|
||||
let output = {};
|
||||
output.zoomRatio = zoomRatio;
|
||||
output.editorFontSize = editorFontSize;
|
||||
if (theme == Setting.THEME_LIGHT) {
|
||||
output = Object.assign({}, globalStyle, lightStyle);
|
||||
output = Object.assign({}, globalStyle, fontSizes, lightStyle);
|
||||
}
|
||||
else if (theme == Setting.THEME_DARK) {
|
||||
output = Object.assign({}, globalStyle, darkStyle);
|
||||
output = Object.assign({}, globalStyle, fontSizes, darkStyle);
|
||||
}
|
||||
|
||||
// TODO: All the theme specific things should go in addExtraStyles
|
||||
// Note: All the theme specific things should go in addExtraStyles
|
||||
// so that their definition is not split between here and the
|
||||
// beginning of the file. At least new styles should go in
|
||||
// addExtraStyles.
|
||||
|
||||
output.textStyle = Object.assign({},
|
||||
output.textStyle,
|
||||
{ color: output.color }
|
||||
);
|
||||
|
||||
output.icon = Object.assign({},
|
||||
output.icon,
|
||||
{ color: output.color }
|
||||
@@ -220,31 +245,6 @@ function themeStyle(theme) {
|
||||
}
|
||||
);
|
||||
|
||||
output.textStyle2 = Object.assign({},
|
||||
output.textStyle2,
|
||||
{ color: output.color2, }
|
||||
);
|
||||
|
||||
output.urlStyle = Object.assign({},
|
||||
output.urlStyle,
|
||||
{ color: output.urlColor }
|
||||
);
|
||||
|
||||
output.h1Style = Object.assign({},
|
||||
output.h1Style,
|
||||
{ color: output.color }
|
||||
);
|
||||
|
||||
output.h2Style = Object.assign({},
|
||||
output.h2Style,
|
||||
{ color: output.color }
|
||||
);
|
||||
|
||||
output.toolbarStyle = Object.assign({},
|
||||
output.toolbarStyle,
|
||||
{ color: output.color }
|
||||
);
|
||||
|
||||
output.headerStyle = Object.assign({},
|
||||
output.headerStyle,
|
||||
{
|
||||
@@ -281,8 +281,8 @@ function themeStyle(theme) {
|
||||
|
||||
output = addExtraStyles(output);
|
||||
|
||||
themeCache_[theme] = output;
|
||||
return themeCache_[theme];
|
||||
themeCache_[cacheKey] = output;
|
||||
return themeCache_[cacheKey];
|
||||
}
|
||||
|
||||
module.exports = { themeStyle };
|
||||
|
11
ElectronClient/package-lock.json
generated
Normal file
11
ElectronClient/package-lock.json
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"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="
|
||||
}
|
||||
}
|
||||
}
|
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016-2018 Laurent Cozic
|
||||
Copyright (c) 2016-2019 Laurent Cozic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
54
README.md
54
README.md
@@ -14,15 +14,15 @@ The application is available for Windows, Linux, macOS, Android and iOS. A [Web
|
||||
|
||||
# Installation
|
||||
|
||||
Three types of applications are available: for the **desktop** (Windows, macOS and Linux), for **mobile** (Android and iOS) and for **terminal** (Windows, macOS and Linux). All applications have similar user interfaces and can synchronise with each others.
|
||||
Three types of applications are available: for the **desktop** (Windows, macOS and Linux), for **mobile** (Android and iOS) and for **terminal** (Windows, macOS and Linux). All applications have similar user interfaces and can synchronise with each other.
|
||||
|
||||
## Desktop applications
|
||||
|
||||
Operating System | Download | Alternative
|
||||
-----------------|--------|-------------------
|
||||
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v1.0.117/Joplin-Setup-1.0.117.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.117/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.117/Joplin-1.0.117.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.117/Joplin-1.0.117-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.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).
|
||||
|
||||
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.181/joplin-v1.0.181.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.235/joplin-v1.0.235.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
|
||||
@@ -335,29 +335,29 @@ 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 | 61%
|
||||
 | Catalan | [ca](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ca.po) | jmontane, 2018 | 86%
|
||||
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić (trbuhom@net.hr) | 49%
|
||||
 | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt (lukas@aiya.cz) | 76%
|
||||
 | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | Morten Juhl-Johansen Zölde-Fejér (mjjzf@syntaktisk. | 78%
|
||||
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Michael Sonntag (ms@editorei.de) | 97%
|
||||
 | Basque | [eu](https://github.com/laurent22/joplin/blob/master/CliClient/locales/eu.po) | juan.abasolo@ehu.eus | 59%
|
||||
 | Catalan | [ca](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ca.po) | jmontane, 2018 | 84%
|
||||
 | Croatian | [hr_HR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/hr_HR.po) | Hrvoje Mandić (trbuhom@net.hr) | 48%
|
||||
 | Czech | [cs_CZ](https://github.com/laurent22/joplin/blob/master/CliClient/locales/cs_CZ.po) | Lukas Helebrandt (lukas@aiya.cz) | 75%
|
||||
 | Dansk | [da_DK](https://github.com/laurent22/joplin/blob/master/CliClient/locales/da_DK.po) | Morten Juhl-Johansen Zölde-Fejér (mjjzf@syntaktisk. | 76%
|
||||
 | Deutsch | [de_DE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/de_DE.po) | Michael Sonntag (ms@editorei.de) | 98%
|
||||
 | 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) | 92%
|
||||
 | Español | [es_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/es_ES.po) | Fernando Martín (f@mrtn.es) | 90%
|
||||
 | 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) | 77%
|
||||
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 91%
|
||||
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 61%
|
||||
 | Nederlands | [nl_NL](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_NL.po) | Heimen Stoffels (vistausss@outlook.com) | 92%
|
||||
 | Norwegian | [nb_NO](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nb_NO.po) | Mats Estensen (matsest@mxe.no) | 99%
|
||||
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos (rnbastos@gmail.com) | 99%
|
||||
 | Română | [ro](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ro.po) | | 60%
|
||||
 | Slovenian | [sl_SI](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sl_SI.po) | | 76%
|
||||
 | Svenska | [sv](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sv.po) | Jonatan Nyberg (jonatan@autistici.org) | 91%
|
||||
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov (artyom.karlov@gmail.com) | 76%
|
||||
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 95%
|
||||
 | 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_TW.po) | penguinsam (samliu@gmail.com) | 92%
|
||||
 | 日本語 | [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) | | 92%
|
||||
 | Galician | [gl_ES](https://github.com/laurent22/joplin/blob/master/CliClient/locales/gl_ES.po) | Marcos Lans (marcoslansgarza@gmail.com) | 75%
|
||||
 | Italiano | [it_IT](https://github.com/laurent22/joplin/blob/master/CliClient/locales/it_IT.po) | | 93%
|
||||
 | Nederlands | [nl_BE](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_BE.po) | | 60%
|
||||
 | Nederlands | [nl_NL](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nl_NL.po) | Heimen Stoffels (vistausss@outlook.com) | 90%
|
||||
 | Norwegian | [nb_NO](https://github.com/laurent22/joplin/blob/master/CliClient/locales/nb_NO.po) | Mats Estensen (code@mxe.no) | 97%
|
||||
 | Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/master/CliClient/locales/pt_BR.po) | Renato Nunes Bastos (rnbastos@gmail.com) | 97%
|
||||
 | Română | [ro](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ro.po) | | 59%
|
||||
 | Slovenian | [sl_SI](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sl_SI.po) | | 74%
|
||||
 | Svenska | [sv](https://github.com/laurent22/joplin/blob/master/CliClient/locales/sv.po) | Jonatan Nyberg (jonatan@autistici.org) | 89%
|
||||
 | Русский | [ru_RU](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ru_RU.po) | Artyom Karlov (artyom.karlov@gmail.com) | 77%
|
||||
 | 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_CN.po) | | 93%
|
||||
 | 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/master/CliClient/locales/zh_TW.po) | penguinsam (samliu@gmail.com) | 90%
|
||||
 | 日本語 | [ja_JP](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ja_JP.po) | AWASHIRO Ikuya (ikunya@gmail.com) | 97%
|
||||
 | 한국말 | [ko](https://github.com/laurent22/joplin/blob/master/CliClient/locales/ko.po) | | 90%
|
||||
<!-- LOCALE-TABLE-AUTO-GENERATED -->
|
||||
|
||||
# Known bugs
|
||||
@@ -370,7 +370,7 @@ Current translations:
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016-2018 Laurent Cozic
|
||||
Copyright (c) 2016-2019 Laurent Cozic
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
@@ -90,8 +90,8 @@ android {
|
||||
applicationId "net.cozic.joplin"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2097417
|
||||
versionName "1.0.181"
|
||||
versionCode 2097471
|
||||
versionName "1.0.235"
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "x86"
|
||||
}
|
||||
@@ -137,7 +137,7 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':react-native-firebase')
|
||||
compile project(':react-native-push-notification')
|
||||
implementation (project(':react-native-camera')) {
|
||||
// This is required because com.google.firebase requires v16.0.x of com.google.android.gms
|
||||
// while react-native-camera requires v15.x, which results in broken dependencies with
|
||||
@@ -167,8 +167,6 @@ dependencies {
|
||||
implementation "com.facebook.react:react-native:+"
|
||||
|
||||
implementation "com.google.android.gms:play-services-base:16.0.1" // For Firebase
|
||||
implementation "com.google.firebase:firebase-core:16.0.4" // For Firebase
|
||||
implementation "com.google.firebase:firebase-messaging:17.3.4" // For Firebase
|
||||
implementation 'me.leolin:ShortcutBadger:1.1.21@aar' // For Firebase - this line if you wish to use badge on Android
|
||||
|
||||
// To fix the error below, which happened after adding react-native-camera.
|
||||
@@ -197,5 +195,4 @@ task copyDownloadableDepsToLibs(type: Copy) {
|
||||
into 'libs'
|
||||
}
|
||||
|
||||
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
|
||||
apply plugin: 'com.google.gms.google-services' // For Firebase
|
||||
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
|
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"project_info": {
|
||||
"project_number": "790045682275",
|
||||
"firebase_url": "https://joplin-b5b20.firebaseio.com",
|
||||
"project_id": "joplin-b5b20",
|
||||
"storage_bucket": "joplin-b5b20.appspot.com"
|
||||
},
|
||||
"client": [
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:790045682275:android:8b68903cf881e9f7",
|
||||
"android_client_info": {
|
||||
"package_name": "net.cozic.joplin"
|
||||
}
|
||||
},
|
||||
"oauth_client": [
|
||||
{
|
||||
"client_id": "790045682275-fkusmvsm7gv3nve7h0sg0uuor9njf4sm.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "AIzaSyCbHjUWAKcbldLTuoN7JybJ8dfznwBG_gM"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"analytics_service": {
|
||||
"status": 1
|
||||
},
|
||||
"appinvite_service": {
|
||||
"status": 1,
|
||||
"other_platform_oauth_client": []
|
||||
},
|
||||
"ads_service": {
|
||||
"status": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"configuration_version": "1"
|
||||
}
|
@@ -11,18 +11,18 @@
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
|
||||
|
||||
|
||||
<!-- ============================= -->
|
||||
<!-- START RNFirebaseNotifications -->
|
||||
<!-- START RN-push-notitication -->
|
||||
<!-- ============================= -->
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" />
|
||||
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
<!-- ============================= -->
|
||||
<!-- END RNFirebaseNotifications -->
|
||||
<!-- END RN-push-notitication -->
|
||||
<!-- ============================= -->
|
||||
|
||||
|
||||
|
||||
<!-- Make these features optional to enable Chromebooks -->
|
||||
<!-- https://github.com/laurent22/joplin/issues/37 -->
|
||||
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
||||
@@ -39,56 +39,41 @@
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:theme="@style/AppTheme">
|
||||
|
||||
|
||||
|
||||
<!-- ============================= -->
|
||||
<!-- START RNFirebaseNotifications -->
|
||||
<!-- START RN-push-notitication -->
|
||||
<!-- ============================= -->
|
||||
<meta-data android:name="com.dieam.reactnativepushnotification.notification_channel_name" android:value="@string/default_notification_channel_id"/>
|
||||
<meta-data android:name="com.dieam.reactnativepushnotification.notification_channel_description" android:value="Allow displaying a notification for Joplin's alarms"/>
|
||||
<meta-data android:name="com.dieam.reactnativepushnotification.notification_color" android:resource="@android:color/white"/>
|
||||
|
||||
<meta-data
|
||||
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||
android:resource="@drawable/ic_stat_access_alarm" />
|
||||
<meta-data
|
||||
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||
android:value="@string/default_notification_channel_id"/>
|
||||
<receiver android:name="io.invertase.firebase.notifications.RNFirebaseNotificationReceiver"/>
|
||||
<receiver android:enabled="true" android:exported="true" android:name="io.invertase.firebase.notifications.RNFirebaseNotificationsRebootReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED"/>
|
||||
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
|
||||
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
<receiver
|
||||
android:name="com.google.android.gms.gcm.GcmReceiver"
|
||||
android:exported="true"
|
||||
android:permission="com.google.android.c2dm.permission.SEND" >
|
||||
<intent-filter>
|
||||
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
||||
<category android:name="${applicationId}" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
|
||||
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationRegistrationService"/>
|
||||
|
||||
<service
|
||||
android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerServiceGcm"
|
||||
android:exported="false" >
|
||||
<intent-filter>
|
||||
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
<!-- ============================= -->
|
||||
<!-- END RNFirebaseNotifications -->
|
||||
<!-- END RN-push-notitication -->
|
||||
<!-- ============================= -->
|
||||
|
||||
|
||||
|
||||
<!-- ============================= -->
|
||||
<!-- START RNFirebaseNotifications -->
|
||||
<!-- ============================= -->
|
||||
<service android:name="io.invertase.firebase.messaging.RNFirebaseMessagingService">
|
||||
<intent-filter>
|
||||
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
<service android:name="io.invertase.firebase.messaging.RNFirebaseInstanceIdService">
|
||||
<intent-filter>
|
||||
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<!-- "If you want to be able to react to data-only messages when your app is in the background, e.g. to display a heads up notification" -->
|
||||
<service android:name="io.invertase.firebase.messaging.RNFirebaseBackgroundMessagingService" />
|
||||
<!-- ============================= -->
|
||||
<!-- END RNFirebaseNotifications -->
|
||||
<!-- ============================= -->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- 2018-12-16: Changed android:launchMode from "singleInstance" to "singleTop" for Firebase notification -->
|
||||
<!-- Previously singleInstance was necessary to prevent multiple instance of the RN app from running at the same time, but maybe no longer needed. -->
|
||||
|
@@ -3,9 +3,7 @@ package net.cozic.joplin;
|
||||
import android.app.Application;
|
||||
|
||||
import com.facebook.react.ReactApplication;
|
||||
import io.invertase.firebase.RNFirebasePackage;
|
||||
import io.invertase.firebase.notifications.RNFirebaseNotificationsPackage;
|
||||
import io.invertase.firebase.messaging.RNFirebaseMessagingPackage;
|
||||
import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage;
|
||||
import org.reactnative.camera.RNCameraPackage;
|
||||
import com.vinzscam.reactnativefileviewer.RNFileViewerPackage;
|
||||
import net.rhogan.rnsecurerandom.RNSecureRandomPackage;
|
||||
@@ -41,10 +39,8 @@ public class MainApplication extends Application implements ReactApplication {
|
||||
protected List<ReactPackage> getPackages() {
|
||||
return Arrays.<ReactPackage>asList(
|
||||
new MainReactPackage(),
|
||||
new ReactNativePushNotificationPackage(),
|
||||
new ImageResizerPackage(),
|
||||
new RNFirebasePackage(),
|
||||
new RNFirebaseMessagingPackage(),
|
||||
new RNFirebaseNotificationsPackage(),
|
||||
new RNCameraPackage(),
|
||||
new RNFileViewerPackage(),
|
||||
new RNSecureRandomPackage(),
|
||||
|
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<color name="white">#FFF</color>
|
||||
</resources>
|
@@ -14,7 +14,6 @@ buildscript {
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.2.0' // Upgraded from 3.1.4 to 3.2.0 for Firebase
|
||||
classpath 'com.google.gms:google-services:4.0.1' // For Firebase
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
@@ -1,6 +1,4 @@
|
||||
rootProject.name = 'Joplin'
|
||||
include ':react-native-firebase'
|
||||
project(':react-native-firebase').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-firebase/android')
|
||||
include ':react-native-camera'
|
||||
project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')
|
||||
include ':react-native-file-viewer'
|
||||
@@ -33,3 +31,6 @@ include ':app', ':react-native-share-extension'
|
||||
project(':react-native-share-extension').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-share-extension/android')
|
||||
include ':react-native-version-info'
|
||||
project(':react-native-version-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-version-info/android')
|
||||
|
||||
include ':react-native-push-notification'
|
||||
project(':react-native-push-notification').projectDir = file('../node_modules/react-native-push-notification/android')
|
@@ -17,15 +17,17 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>10.0.27</string>
|
||||
<string>10.0.28</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>27</string>
|
||||
<string>28</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
<key>NSExceptionDomains</key>
|
||||
<dict>
|
||||
<key>localhost</key>
|
||||
|
@@ -37,6 +37,7 @@ const ResourceFetcher = require('lib/services/ResourceFetcher');
|
||||
const SearchEngineUtils = require('lib/services/SearchEngineUtils');
|
||||
const DecryptionWorker = require('lib/services/DecryptionWorker');
|
||||
const BaseService = require('lib/services/BaseService');
|
||||
const SearchEngine = require('lib/services/SearchEngine');
|
||||
|
||||
SyncTargetRegistry.addClass(SyncTargetFilesystem);
|
||||
SyncTargetRegistry.addClass(SyncTargetOneDrive);
|
||||
@@ -281,6 +282,11 @@ class BaseApplication {
|
||||
|
||||
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 (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;
|
||||
@@ -477,7 +483,7 @@ class BaseApplication {
|
||||
this.dbLogger_.setLevel(initArgs.logLevel);
|
||||
|
||||
if (Setting.value('env') === 'dev') {
|
||||
this.dbLogger_.setLevel(Logger.LEVEL_WARN);
|
||||
this.dbLogger_.setLevel(Logger.LEVEL_INFO);
|
||||
}
|
||||
|
||||
this.logger_.info('Profile directory: ' + profileDir);
|
||||
@@ -527,6 +533,10 @@ class BaseApplication {
|
||||
ResourceFetcher.instance().setLogger(this.logger_);
|
||||
ResourceFetcher.instance().start();
|
||||
|
||||
SearchEngine.instance().setDb(reg.db());
|
||||
SearchEngine.instance().setLogger(reg.logger());
|
||||
SearchEngine.instance().scheduleSyncTables();
|
||||
|
||||
let currentFolderId = Setting.value('activeFolderId');
|
||||
let currentFolder = null;
|
||||
if (currentFolderId) currentFolder = await Folder.load(currentFolderId);
|
||||
|
@@ -7,7 +7,7 @@ const { shim } = require('lib/shim.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const md5 = require('md5');
|
||||
const MdToHtml_Katex = require('lib/MdToHtml_Katex');
|
||||
const { pregQuote } = require('lib/string-utils.js');
|
||||
const StringUtils = require('lib/string-utils.js');
|
||||
|
||||
class MdToHtml {
|
||||
|
||||
@@ -415,22 +415,8 @@ class MdToHtml {
|
||||
}
|
||||
|
||||
applyHighlightedKeywords_(body, keywords) {
|
||||
for (let i = 0; i < keywords.length; i++) {
|
||||
const k = keywords[i];
|
||||
|
||||
let regexString = '';
|
||||
|
||||
if (k.type === 'regex') {
|
||||
regexString = k.value;
|
||||
} else {
|
||||
regexString = pregQuote(k);
|
||||
}
|
||||
|
||||
const re = new RegExp('(^|\n|\b)(' + regexString + ')(\n|\b|$)', 'gi');
|
||||
body = body.replace(re, '$1<span class="highlighted-keyword">$2</span>$3');
|
||||
}
|
||||
|
||||
return body;
|
||||
if (!keywords.length) return body;
|
||||
return StringUtils.surroundKeywords(keywords, body, '<span class="highlighted-keyword">', '</span>');
|
||||
}
|
||||
|
||||
render(body, style, options = null) {
|
||||
@@ -526,6 +512,10 @@ class MdToHtml {
|
||||
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 = `
|
||||
@@ -699,7 +689,7 @@ class MdToHtml {
|
||||
}
|
||||
|
||||
body = body.replace(/°°JOP°CHECKBOX°NOTICK°°/g, '- [ ]');
|
||||
body = body.replace(/°°JOP°CHECKBOX°TICK°°/g, '- [X]');
|
||||
body = body.replace(/°°JOP°CHECKBOX°TICK°°/g, '- [x]');
|
||||
|
||||
return body;
|
||||
}
|
||||
|
@@ -29,6 +29,10 @@ class NoteBodyViewer extends Component {
|
||||
}
|
||||
|
||||
onLoadEnd() {
|
||||
setTimeout(() => {
|
||||
if (this.props.onLoadEnd) this.props.onLoadEnd();
|
||||
}, 100);
|
||||
|
||||
if (this.state.webViewLoaded) return;
|
||||
|
||||
// Need to display after a delay to avoid a white flash before
|
||||
|
@@ -9,6 +9,7 @@ const { themeStyle } = require('lib/components/global-style.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const shared = require('lib/components/shared/config-shared.js');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||
const { reg } = require('lib/registry.js');
|
||||
import VersionInfo from 'react-native-version-info';
|
||||
|
||||
class ConfigScreenComponent extends BaseScreenComponent {
|
||||
@@ -248,8 +249,20 @@ class ConfigScreenComponent extends BaseScreenComponent {
|
||||
);
|
||||
|
||||
settingComps.push(
|
||||
<View key="version_info" style={this.styles().settingContainer}>
|
||||
<Text key="version" style={this.styles().settingText}>Version {VersionInfo.appVersion}</Text>
|
||||
<View key="version_info_app" style={this.styles().settingContainer}>
|
||||
<Text style={this.styles().settingText}>{_('Joplin v%s', VersionInfo.appVersion)}</Text>
|
||||
</View>
|
||||
);
|
||||
|
||||
settingComps.push(
|
||||
<View key="version_info_db" style={this.styles().settingContainer}>
|
||||
<Text style={this.styles().settingText}>{_('Database v%s', reg.db().version())}</Text>
|
||||
</View>
|
||||
);
|
||||
|
||||
settingComps.push(
|
||||
<View key="version_info_fts" style={this.styles().settingContainer}>
|
||||
<Text style={this.styles().settingText}>{_('FTS enabled: %d', this.props.settings['db.ftsEnabled'])}</Text>
|
||||
</View>
|
||||
);
|
||||
|
||||
|
@@ -113,7 +113,7 @@ class FolderScreenComponent extends BaseScreenComponent {
|
||||
saveButtonDisabled={saveButtonDisabled}
|
||||
onSaveButtonPress={() => this.saveFolderButton_press()}
|
||||
/>
|
||||
<TextInput selectionColor={theme.textSelectionColor} style={this.styles().textInput} autoFocus={true} value={this.state.folder.title} onChangeText={(text) => this.title_changeText(text)} />
|
||||
<TextInput underlineColorAndroid={theme.strongDividerColor} selectionColor={theme.textSelectionColor} style={this.styles().textInput} autoFocus={true} value={this.state.folder.title} onChangeText={(text) => this.title_changeText(text)} />
|
||||
<dialogs.DialogBox ref={dialogbox => { this.dialogbox = dialogbox }}/>
|
||||
</View>
|
||||
);
|
||||
|
@@ -63,6 +63,15 @@ class NoteScreenComponent extends BaseScreenComponent {
|
||||
noteTagDialogShown: false,
|
||||
fromShare: false,
|
||||
showCamera: false,
|
||||
|
||||
// HACK: For reasons I can't explain, when the WebView is present, the TextInput initially does not display (It's just a white rectangle with
|
||||
// no visible text). It will only appear when tapping it or doing certain action like selecting text on the webview. The bug started to
|
||||
// appear one day and did not go away - reverting to an old RN version did not help, undoing all
|
||||
// the commits till a working version did not help. The bug also does not happen in the simulator which makes it hard to fix.
|
||||
// Eventually, a way that "worked" is to add a 1px margin on top of the text input just after the webview has loaded, then removing this
|
||||
// margin. This forces RN to update the text input and to display it. Maybe that hack can be removed once RN is upgraded.
|
||||
// See https://github.com/laurent22/joplin/issues/1057
|
||||
HACK_webviewLoadingState: 0,
|
||||
};
|
||||
|
||||
// iOS doesn't support multiline text fields properly so disable it
|
||||
@@ -588,13 +597,16 @@ class NoteScreenComponent extends BaseScreenComponent {
|
||||
this.saveOneProperty('body', newBody);
|
||||
};
|
||||
|
||||
// Currently keyword highlighting is supported only when FTS is available.
|
||||
let keywords = [];
|
||||
if (this.props.searchQuery) {
|
||||
if (this.props.searchQuery && !!this.props.ftsEnabled) {
|
||||
const parsedQuery = SearchEngine.instance().parseQuery(this.props.searchQuery);
|
||||
keywords = SearchEngine.instance().allParsedQueryTerms(parsedQuery);
|
||||
}
|
||||
|
||||
bodyComponent = <NoteBodyViewer
|
||||
// Note: as of 2018-12-29 it's important not to display the viewer if the note body is empty,
|
||||
// to avoid the HACK_webviewLoadingState related bug.
|
||||
bodyComponent = !note || !note.body.trim() ? null : <NoteBodyViewer
|
||||
onJoplinLinkClick={this.onJoplinLinkClick_}
|
||||
ref="noteBodyViewer"
|
||||
style={this.styles().noteBodyViewer}
|
||||
@@ -602,6 +614,14 @@ class NoteScreenComponent extends BaseScreenComponent {
|
||||
note={note}
|
||||
highlightedKeywords={keywords}
|
||||
onCheckboxChange={(newBody) => { onCheckboxChange(newBody) }}
|
||||
onLoadEnd={() => {
|
||||
setTimeout(() => {
|
||||
this.setState({ HACK_webviewLoadingState: 1 });
|
||||
setTimeout(() => {
|
||||
this.setState({ HACK_webviewLoadingState: 0 });
|
||||
}, 50);
|
||||
}, 5);
|
||||
}}
|
||||
/>
|
||||
} else {
|
||||
const focusBody = !isNew && !!note.title;
|
||||
@@ -649,6 +669,7 @@ class NoteScreenComponent extends BaseScreenComponent {
|
||||
|
||||
let titleTextInputStyle = {
|
||||
flex: 1,
|
||||
marginTop: 0,
|
||||
paddingLeft: 0,
|
||||
color: theme.color,
|
||||
backgroundColor: theme.backgroundColor,
|
||||
@@ -668,6 +689,10 @@ class NoteScreenComponent extends BaseScreenComponent {
|
||||
paddingBottom: 10, // Added for iOS (Not needed for Android??)
|
||||
}
|
||||
|
||||
if (this.state.HACK_webviewLoadingState === 1) {
|
||||
titleTextInputStyle.marginTop = 1;
|
||||
}
|
||||
|
||||
const dueDate = isTodo && note.todo_due ? new Date(note.todo_due) : null;
|
||||
|
||||
const titleComp = (
|
||||
@@ -747,6 +772,7 @@ const NoteScreen = connect(
|
||||
folders: state.folders,
|
||||
searchQuery: state.searchQuery,
|
||||
theme: state.settings.theme,
|
||||
ftsEnabled: state.settings['db.ftsEnabled'],
|
||||
sharedData: state.sharedData,
|
||||
showAdvancedOptions: state.settings.showAdvancedOptions,
|
||||
};
|
||||
|
@@ -114,7 +114,7 @@ class NotesScreenComponent extends BaseScreenComponent {
|
||||
if (props.notesParentType == 'Folder') {
|
||||
notes = await Note.previews(props.selectedFolderId, options);
|
||||
} else {
|
||||
notes = await Tag.notes(props.selectedTagId, options); // TODO: should also return previews
|
||||
notes = await Tag.notes(props.selectedTagId, options);
|
||||
}
|
||||
|
||||
this.props.dispatch({
|
||||
|
@@ -106,22 +106,22 @@ class SearchScreenComponent extends BaseScreenComponent {
|
||||
let notes = []
|
||||
|
||||
if (query) {
|
||||
notes = await SearchEngineUtils.notesForQuery(query);
|
||||
|
||||
// Keeping the code below in case of compatibility issue with old versions
|
||||
// of Android and SQLite FTS.
|
||||
if (!!this.props.settings['db.ftsEnabled']) {
|
||||
notes = await SearchEngineUtils.notesForQuery(query);
|
||||
} else {
|
||||
let p = query.split(' ');
|
||||
let temp = [];
|
||||
for (let i = 0; i < p.length; i++) {
|
||||
let t = p[i].trim();
|
||||
if (!t) continue;
|
||||
temp.push(t);
|
||||
}
|
||||
|
||||
// let p = query.split(' ');
|
||||
// let temp = [];
|
||||
// for (let i = 0; i < p.length; i++) {
|
||||
// let t = p[i].trim();
|
||||
// if (!t) continue;
|
||||
// temp.push(t);
|
||||
// }
|
||||
|
||||
// notes = await Note.previews(null, {
|
||||
// anywherePattern: '*' + temp.join('*') + '*',
|
||||
// });
|
||||
notes = await Note.previews(null, {
|
||||
anywherePattern: '*' + temp.join('*') + '*',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.isMounted_) return;
|
||||
@@ -193,6 +193,7 @@ const SearchScreen = connect(
|
||||
return {
|
||||
query: state.searchQuery,
|
||||
theme: state.settings.theme,
|
||||
settings: state.settings,
|
||||
noteSelectionEnabled: state.noteSelectionEnabled,
|
||||
};
|
||||
}
|
||||
|
@@ -310,7 +310,7 @@ function isImageMimeType(m) {
|
||||
}
|
||||
|
||||
function addResourceTag(lines, resource, alt = "") {
|
||||
// TODO: refactor to use Resource.markdownTag
|
||||
// Note: refactor to use Resource.markdownTag
|
||||
|
||||
let tagAlt = alt == "" ? resource.alt : alt;
|
||||
if (!tagAlt) tagAlt = '';
|
||||
@@ -512,7 +512,6 @@ function enexXmlToMdArray(stream, resources) {
|
||||
} else if (n == 'q') {
|
||||
section.lines.push('"');
|
||||
} else if (n == 'img') {
|
||||
// TODO: TEST IMAGE
|
||||
if (nodeAttributes.src) { // Many (most?) img tags don't have no source associated, especially when they were imported from HTML
|
||||
let s = '![';
|
||||
if (nodeAttributes.alt) s += nodeAttributes.alt;
|
||||
|
@@ -125,6 +125,7 @@ class JoplinDatabase extends Database {
|
||||
super(driver);
|
||||
this.initialized_ = false;
|
||||
this.tableFields_ = null;
|
||||
this.version_ = null;
|
||||
}
|
||||
|
||||
initialized() {
|
||||
@@ -261,7 +262,8 @@ class JoplinDatabase extends Database {
|
||||
// default value and thus might cause problems. In that case, the default value
|
||||
// must be set in the synchronizer too.
|
||||
|
||||
const existingDatabaseVersions = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
|
||||
// Note: v16 and v17 don't do anything. They were used to debug an issue.
|
||||
const existingDatabaseVersions = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
|
||||
|
||||
let currentVersionIndex = existingDatabaseVersions.indexOf(fromVersion);
|
||||
|
||||
@@ -269,7 +271,9 @@ class JoplinDatabase extends Database {
|
||||
// version of the database, so that migration is not run in this case.
|
||||
if (currentVersionIndex < 0) throw new Error('Unknown profile version. Most likely this is an old version of Joplin, while the profile was created by a newer version. Please upgrade Joplin at https://joplin.cozic.net and try again.');
|
||||
|
||||
if (currentVersionIndex == existingDatabaseVersions.length - 1) return false;
|
||||
if (currentVersionIndex == existingDatabaseVersions.length - 1) return fromVersion;
|
||||
|
||||
let latestVersion = fromVersion;
|
||||
|
||||
while (currentVersionIndex < existingDatabaseVersions.length - 1) {
|
||||
const targetVersion = existingDatabaseVersions[currentVersionIndex + 1];
|
||||
@@ -470,15 +474,84 @@ class JoplinDatabase extends Database {
|
||||
END;`);
|
||||
}
|
||||
|
||||
queries.push({ sql: 'UPDATE version SET version = ?', params: [targetVersion] });
|
||||
await this.transactionExecBatch(queries);
|
||||
if (targetVersion == 18) {
|
||||
const notesNormalized = `
|
||||
CREATE TABLE notes_normalized (
|
||||
id TEXT NOT NULL,
|
||||
title TEXT NOT NULL DEFAULT "",
|
||||
body TEXT NOT NULL DEFAULT ""
|
||||
);
|
||||
`;
|
||||
|
||||
queries.push(this.sqlStringToLines(notesNormalized)[0]);
|
||||
|
||||
queries.push('CREATE INDEX notes_normalized_id ON notes_normalized (id)');
|
||||
|
||||
queries.push('DROP TRIGGER IF EXISTS notes_fts_before_update');
|
||||
queries.push('DROP TRIGGER IF EXISTS notes_fts_before_delete');
|
||||
queries.push('DROP TRIGGER IF EXISTS notes_after_update');
|
||||
queries.push('DROP TRIGGER IF EXISTS notes_after_insert');
|
||||
queries.push('DROP TABLE IF EXISTS notes_fts');
|
||||
|
||||
queries.push('CREATE VIRTUAL TABLE notes_fts USING fts4(content="notes_normalized", notindexed="id", id, title, body)');
|
||||
|
||||
// Keep the content tables (notes) and the FTS table (notes_fts) in sync.
|
||||
// More info at https://www.sqlite.org/fts3.html#_external_content_fts4_tables_
|
||||
queries.push(`
|
||||
CREATE TRIGGER notes_fts_before_update BEFORE UPDATE ON notes_normalized BEGIN
|
||||
DELETE FROM notes_fts WHERE docid=old.rowid;
|
||||
END;`);
|
||||
queries.push(`
|
||||
CREATE TRIGGER notes_fts_before_delete BEFORE DELETE ON notes_normalized BEGIN
|
||||
DELETE FROM notes_fts WHERE docid=old.rowid;
|
||||
END;`);
|
||||
queries.push(`
|
||||
CREATE TRIGGER notes_after_update AFTER UPDATE ON notes_normalized BEGIN
|
||||
INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes_normalized WHERE new.rowid = notes_normalized.rowid;
|
||||
END;`);
|
||||
queries.push(`
|
||||
CREATE TRIGGER notes_after_insert AFTER INSERT ON notes_normalized BEGIN
|
||||
INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes_normalized WHERE new.rowid = notes_normalized.rowid;
|
||||
END;`);
|
||||
}
|
||||
|
||||
queries.push({ sql: 'UPDATE version SET version = ?', params: [targetVersion] });
|
||||
|
||||
try {
|
||||
await this.transactionExecBatch(queries);
|
||||
} catch (error) {
|
||||
if (targetVersion === 15 || targetVersion === 18) {
|
||||
this.logger().warn('Could not upgrade to database v15 or v18 - FTS feature will not be used', error);
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
latestVersion = targetVersion;
|
||||
|
||||
currentVersionIndex++;
|
||||
}
|
||||
|
||||
return latestVersion;
|
||||
}
|
||||
|
||||
async ftsEnabled() {
|
||||
try {
|
||||
await this.selectOne('SELECT count(*) FROM notes_fts');
|
||||
} catch (error) {
|
||||
this.logger().warn('FTS check failed', error);
|
||||
return false;
|
||||
}
|
||||
|
||||
this.logger().info('FTS check succeeded');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
version() {
|
||||
return this.version_;
|
||||
}
|
||||
|
||||
async initialize() {
|
||||
this.logger().info('Checking for database schema update...');
|
||||
|
||||
@@ -495,10 +568,12 @@ class JoplinDatabase extends Database {
|
||||
}
|
||||
|
||||
const version = !versionRow ? 0 : versionRow.version;
|
||||
this.version_ = version;
|
||||
this.logger().info('Current database version', version);
|
||||
|
||||
const upgraded = await this.upgradeDatabase(version);
|
||||
if (upgraded) await this.refreshTableFields();
|
||||
const newVersion = await this.upgradeDatabase(version);
|
||||
this.version_ = newVersion;
|
||||
if (newVersion !== version) await this.refreshTableFields();
|
||||
|
||||
this.tableFields_ = {};
|
||||
|
||||
|
34
ReactNativeClient/lib/markJsUtils.js
Normal file
34
ReactNativeClient/lib/markJsUtils.js
Normal file
@@ -0,0 +1,34 @@
|
||||
const markJsUtils = {}
|
||||
|
||||
markJsUtils.markKeyword = (mark, keyword, stringUtils, extraOptions = null) => {
|
||||
if (typeof keyword === 'string') {
|
||||
keyword = {
|
||||
type: 'text',
|
||||
value: keyword,
|
||||
};
|
||||
}
|
||||
|
||||
const isBasicSearch = ['ja', 'zh', 'ko'].indexOf(keyword.scriptType) >= 0;
|
||||
|
||||
let value = keyword.value;
|
||||
let accuracy = keyword.accuracy ? keyword.accuracy : { value: 'exactly', limiters: ":;.,-–—‒_(){}[]!'\"+=".split("") };
|
||||
if (isBasicSearch) accuracy = 'partially';
|
||||
if (keyword.type === 'regex') {
|
||||
accuracy = 'complementary';
|
||||
// Remove the trailing wildcard and "accuracy = complementary" will take care of
|
||||
// highlighting the relevant keywords.
|
||||
|
||||
// Known bug: it will also highlight word that contain the term as a suffix for example for "ent*", it will highlight "present"
|
||||
// which is incorrect (it should only highlight what starts with "ent") but for now will do. Mark.js doesn't have an option
|
||||
// to tweak this behaviour.
|
||||
value = keyword.value.substr(0, keyword.value.length - 1);
|
||||
}
|
||||
|
||||
mark.mark([value], Object.assign({}, {
|
||||
accuracy: accuracy,
|
||||
}, extraOptions));
|
||||
}
|
||||
|
||||
if (typeof module !== 'undefined') {
|
||||
module.exports = markJsUtils;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user