diff --git a/.travis.yml b/.travis.yml index bcdee3635..760aef880 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,13 +28,17 @@ matrix: before_install: # HOMEBREW_NO_AUTO_UPDATE needed so that Homebrew doesn't upgrade to the next # version, which requires Ruby 2.3, which is not available on the Travis VM. + + # Silence apt-get update errors (for example when a module doesn't exist) since + # otherwise it will make the whole build fails, even though all we need is yarn. - | if [ "$TRAVIS_OS_NAME" == "osx" ]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install yarn else curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list - sudo apt-get update && sudo apt-get install yarn + sudo apt-get update || true + sudo apt-get install -y yarn fi script: diff --git a/CliClient/app/app-gui.js b/CliClient/app/app-gui.js index f65833d08..0ee800893 100644 --- a/CliClient/app/app-gui.js +++ b/CliClient/app/app-gui.js @@ -6,6 +6,7 @@ const { Note } = require('lib/models/note.js'); const { Resource } = require('lib/models/resource.js'); const { cliUtils } = require('./cli-utils.js'); const { reducer, defaultState } = require('lib/reducer.js'); +const { splitCommandString } = require('lib/string-utils.js'); const { reg } = require('lib/registry.js'); const { _ } = require('lib/locale.js'); @@ -520,7 +521,7 @@ class AppGui { let note = this.widget('noteList').currentItem; let folder = this.widget('folderList').currentItem; - let args = cliUtils.splitCommandString(cmd); + let args = splitCommandString(cmd); for (let i = 0; i < args.length; i++) { if (args[i] == '$n') { diff --git a/CliClient/app/cli-utils.js b/CliClient/app/cli-utils.js index 0bfa510b5..3bf8a6680 100644 --- a/CliClient/app/cli-utils.js +++ b/CliClient/app/cli-utils.js @@ -5,75 +5,6 @@ const stringPadding = require('string-padding'); const cliUtils = {}; -cliUtils.splitCommandString = function(command) { - let args = []; - let state = "start" - let current = "" - let quote = "\"" - let escapeNext = false; - for (let i = 0; i < command.length; i++) { - let c = command[i] - - if (state == "quotes") { - if (c != quote) { - current += c - } else { - args.push(current) - current = "" - state = "start" - } - continue - } - - if (escapeNext) { - current += c; - escapeNext = false; - continue; - } - - if (c == "\\") { - escapeNext = true; - continue; - } - - if (c == '"' || c == '\'') { - state = "quotes" - quote = c - continue - } - - if (state == "arg") { - if (c == ' ' || c == '\t') { - args.push(current) - current = "" - state = "start" - } else { - current += c - } - continue - } - - if (c != ' ' && c != "\t") { - state = "arg" - current += c - } - } - - if (state == "quotes") { - throw new Error("Unclosed quote in command line: " + command) - } - - if (current != "") { - args.push(current) - } - - if (args.length <= 0) { - throw new Error("Empty command line") - } - - return args; -} - cliUtils.printArray = function(logFunction, rows, headers = null) { if (!rows.length) return ''; diff --git a/CliClient/locales/en_GB.po b/CliClient/locales/en_GB.po index 4cc900fb5..48576b152 100644 --- a/CliClient/locales/en_GB.po +++ b/CliClient/locales/en_GB.po @@ -544,6 +544,9 @@ msgstr "" msgid "Separate each tag by a comma." msgstr "" +msgid "Rename notebook:" +msgstr "" + msgid "Layout" msgstr "" @@ -584,6 +587,9 @@ msgstr "" msgid "Remove this tag from all the notes?" msgstr "" +msgid "Rename" +msgstr "" + msgid "Notebooks" msgstr "" diff --git a/CliClient/locales/fr_FR.po b/CliClient/locales/fr_FR.po index b223aacbe..aab7ae9f3 100644 --- a/CliClient/locales/fr_FR.po +++ b/CliClient/locales/fr_FR.po @@ -603,6 +603,10 @@ msgstr "Modifier les étiquettes" msgid "Separate each tag by a comma." msgstr "" +#, fuzzy +msgid "Rename notebook:" +msgstr "Nouveau carnet" + msgid "Layout" msgstr "" @@ -649,6 +653,9 @@ msgstr "Supprimer le carnet ?" msgid "Remove this tag from all the notes?" msgstr "" +msgid "Rename" +msgstr "" + #, fuzzy msgid "Notebooks" msgstr "Nouveau carnet" diff --git a/CliClient/locales/joplin.pot b/CliClient/locales/joplin.pot index 4cc900fb5..48576b152 100644 --- a/CliClient/locales/joplin.pot +++ b/CliClient/locales/joplin.pot @@ -544,6 +544,9 @@ msgstr "" msgid "Separate each tag by a comma." msgstr "" +msgid "Rename notebook:" +msgstr "" + msgid "Layout" msgstr "" @@ -584,6 +587,9 @@ msgstr "" msgid "Remove this tag from all the notes?" msgstr "" +msgid "Rename" +msgstr "" + msgid "Notebooks" msgstr "" diff --git a/CliClient/package-lock.json b/CliClient/package-lock.json index b0613b0d6..5866c5a9c 100644 --- a/CliClient/package-lock.json +++ b/CliClient/package-lock.json @@ -1,6 +1,6 @@ { "name": "joplin", - "version": "0.10.68", + "version": "0.10.69", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/CliClient/package.json b/CliClient/package.json index 211bb6f33..2e5644040 100644 --- a/CliClient/package.json +++ b/CliClient/package.json @@ -18,7 +18,7 @@ ], "owner": "Laurent Cozic" }, - "version": "0.10.68", + "version": "0.10.69", "bin": { "joplin": "./main.js" }, diff --git a/ElectronClient/app/app.js b/ElectronClient/app/app.js index cd37bcc42..3c606cba4 100644 --- a/ElectronClient/app/app.js +++ b/ElectronClient/app/app.js @@ -280,16 +280,6 @@ class Application extends BaseApplication { this.initRedux(); - // const windowSize = Setting.value('windowSize'); - // const width = windowSize && windowSize.width ? windowSize.width : 800; - // const height = windowSize && windowSize.height ? windowSize.height : 800; - // bridge().windowSetSize(width, height); - - // this.store().dispatch({ - // type: 'WINDOW_CONTENT_SIZE_SET', - // size: bridge().windowContentSize(), - // }); - // Since the settings need to be loaded before the store is created, it will never // receive the SETTING_UPDATE_ALL even, which mean state.settings will not be // initialised. So we manually call dispatchUpdateAll() to force an update. diff --git a/ElectronClient/app/gui/MainScreen.jsx b/ElectronClient/app/gui/MainScreen.jsx index 2286bc1d8..9c52887d2 100644 --- a/ElectronClient/app/gui/MainScreen.jsx +++ b/ElectronClient/app/gui/MainScreen.jsx @@ -97,13 +97,14 @@ class MainScreenComponent extends React.Component { folder = await Folder.save({ title: answer }, { userSideValidation: true }); } catch (error) { bridge().showErrorMessageBox(error.message); - return; } - this.props.dispatch({ - type: 'FOLDER_SELECT', - id: folder.id, - }); + if (folder) { + this.props.dispatch({ + type: 'FOLDER_SELECT', + id: folder.id, + }); + } } this.setState({ promptOptions: null }); @@ -128,6 +129,26 @@ class MainScreenComponent extends React.Component { } }, }); + } else if (command.name === 'renameNotebook') { + const folder = await Folder.load(command.id); + if (!folder) return; + + this.setState({ + promptOptions: { + label: _('Rename notebook:'), + value: folder.title, + onClose: async (answer) => { + if (answer !== null) { + try { + await Folder.save({ id: folder.id, title: answer }, { userSideValidation: true }); + } catch (error) { + bridge().showErrorMessageBox(error.message); + } + } + this.setState({ promptOptions: null }); + } + }, + }); } else { commandProcessed = false; } diff --git a/ElectronClient/app/gui/SideBar.jsx b/ElectronClient/app/gui/SideBar.jsx index c9a3acbaf..f3f0feccb 100644 --- a/ElectronClient/app/gui/SideBar.jsx +++ b/ElectronClient/app/gui/SideBar.jsx @@ -115,6 +115,14 @@ class SideBarComponent extends React.Component { } }})) + menu.append(new MenuItem({label: _('Rename'), click: async () => { + this.props.dispatch({ + type: 'WINDOW_COMMAND', + name: 'renameNotebook', + id: itemId, + }); + }})) + menu.popup(bridge().window()); } diff --git a/ElectronClient/app/locales/en_GB.json b/ElectronClient/app/locales/en_GB.json index 41a5aa7a6..7f335afd7 100644 --- a/ElectronClient/app/locales/en_GB.json +++ b/ElectronClient/app/locales/en_GB.json @@ -1 +1 @@ -{"Give focus to next pane":"","Give focus to previous pane":"","Enter command line mode":"","Exit command line mode":"","Edit the selected note":"","Cancel the current command.":"","Exit the application.":"","Delete the currently selected note or notebook.":"","To delete a tag, untag the associated notes.":"","Please select the note or notebook to be deleted first.":"","Set a to-do as completed / not completed":"","[t]oggle [c]onsole between maximized/minimized/hidden/visible.":"","Search":"","[t]oggle note [m]etadata.":"","[M]ake a new [n]ote":"","[M]ake a new [t]odo":"","[M]ake a new note[b]ook":"","Copy ([Y]ank) the [n]ote to a notebook.":"","Move the note to a notebook.":"","Press Ctrl+D or type \"exit\" to exit the application":"","More than one item match \"%s\". Please narrow down your query.":"","No notebook selected.":"","No notebook has been specified.":"","Y":"","n":"","N":"","y":"","Cancelling background synchronisation... Please wait.":"","The command \"%s\" is only available in GUI mode":"","Missing required argument: %s":"","%s: %s":"","Your choice: ":"","Invalid answer: %s":"","Attaches the given file to the note.":"","Cannot find \"%s\".":"","Displays the given note.":"","Displays the complete information about note.":"","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"","Also displays unset and hidden config variables.":"","%s = %s (%s)":"","%s = %s":"","Duplicates the notes matching to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"","Marks a to-do as done.":"","Note is not a to-do: \"%s\"":"","Edit note.":"","No text editor is defined. Please set it using `config editor `":"","No active notebook.":"","Note does not exist: \"%s\". Create it?":"","Starting to edit note. Close the editor to get back to the prompt.":"","Note has been saved.":"","Exits the application.":"","Exports Joplin data to the given directory. By default, it will export the complete database including notebooks, notes, tags and resources.":"","Exports only the given note.":"","Exports only the given notebook.":"","Displays a geolocation URL for the note.":"","Displays usage information.":"","Shortcuts are not available in CLI mode.":"","Type `help [command]` for more information about a command.":"","The possible commands are:":"","In any command, a note or notebook can be refered to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"","To move from one pane to another, press Tab or Shift+Tab.":"","Use the arrows and page up/down to scroll the lists and text areas (including this console).":"","To maximise/minimise the console, press \"TC\".":"","To enter command line mode, press \":\"":"","To exit command line mode, press ESCAPE":"","For the complete list of available keyboard shortcuts, type `help shortcuts`":"","Imports an Evernote notebook file (.enex file).":"","Do not ask for confirmation.":"","File \"%s\" will be imported into existing notebook \"%s\". Continue?":"","New notebook \"%s\" will be created and file \"%s\" will be imported into it. Continue?":"","Found: %d.":"","Created: %d.":"","Updated: %d.":"","Skipped: %d.":"","Resources: %d.":"","Tagged: %d.":"","Importing notes...":"","The notes have been imported: %s":"","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"","Displays only the first top notes.":"","Sorts the item by (eg. title, updated_time, created_time).":"","Reverses the sorting order.":"","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"","Either \"text\" or \"json\"":"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"","Please select a notebook first.":"","Creates a new notebook.":"","Creates a new note.":"","Notes can only be created within a notebook.":"","Creates a new to-do.":"","Moves the notes matching to [notebook].":"","Renames the given (note or notebook) to .":"","Deletes the given notebook.":"","Deletes the notebook without asking for confirmation.":"","Delete notebook \"%s\"?":"","Deletes the notes matching .":"","Deletes the notes without asking for confirmation.":"","%d notes match this pattern. Delete them?":"","Delete note?":"","Searches for the given in all the notes.":"","Sets the property of the given to the given [value].":"","Displays summary about the notes and notebooks.":"","Synchronises with remote storage.":"","Sync to provided target (defaults to sync.target config value)":"","Synchronisation is already in progress.":"","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"","Authentication was not completed (did not receive an authentication token).":"","Synchronisation target: %s (%s)":"","Cannot initialize synchroniser.":"","Starting synchronisation...":"","Cancelling... Please wait.":""," can be \"add\", \"remove\" or \"list\" to assign or remove [tag] from [note], or to list the notes associated with [tag]. The command `tag list` can be used to list all the tags.":"","Invalid command: \"%s\"":""," can either be \"toggle\" or \"clear\". Use \"toggle\" to toggle the given to-do between completed and uncompleted state (If the target is a regular note it will be converted to a to-do). Use \"clear\" to convert the to-do back to a regular note.":"","Marks a to-do as non-completed.":"","Switches to [notebook] - all further operations will happen within this notebook.":"","Displays version information":"","%s %s (%s)":"","Enum":"","Type: %s.":"","Possible values: %s.":"","Default: %s":"","Possible keys/values:":"","Fatal error:":"","The application has been authorised - you may now close this browser tab.":"","The application has been successfully authorised.":"","Please open the following URL in your browser to authenticate the application. The application will create a directory in \"Apps/Joplin\" and will only read and write files in this directory. It will have no access to any files outside this directory nor to any other personal data. No data will be shared with any third party.":"","Search:":"","File":"","New note":"","New to-do":"","New notebook":"","Import Evernote notes":"","Evernote Export Files":"","Quit":"","Tools":"","Options":"","Help":"","Website and documentation":"","About Joplin":"","%s %s (%s, %s)":"","OK":"","Cancel":"","Back":"","New notebook \"%s\" will be created and file \"%s\" will be imported into it":"","Please create a notebook first.":"","Note title:":"","Please create a notebook first":"","To-do title:":"","Notebook title:":"","Add or remove tags:":"","Separate each tag by a comma.":"","Layout":"","Add or remove tags":"","Switch between note and to-do":"","Delete":"","No notes in here. Create one by clicking on \"New note\".":"","Unsupported link or message: %s":"","Attach file":"","Refresh":"","OneDrive Login":"","Import":"","Configuration":"","Delete notebook?":"","Remove this tag from all the notes?":"","Notebooks":"","Tags":"","Synchronise":"","Usage: %s":"","Unknown flag: %s":"","Unknown log level: %s":"","Unknown level ID: %s":"","Cannot refresh token: authentication data is missing. Starting the synchronisation again may fix the problem.":"","Please set the \"sync.2.path\" config value to the desired synchronisation destination.":"","Cannot access %s":"","Created local items: %d.":"","Updated local items: %d.":"","Created remote items: %d.":"","Updated remote items: %d.":"","Deleted local items: %d.":"","Deleted remote items: %d.":"","State: \"%s\".":"","Cancelling...":"","Completed: %s":"","Synchronisation is already in progress. State: %s":"","Conflicts":"","A notebook with this title already exists: \"%s\"":"","Notebooks cannot be named \"%s\", which is a reserved title.":"","Untitled":"","This note does not have geolocation information.":"","Cannot copy note to \"%s\" notebook":"","Cannot move note to \"%s\" notebook":"","Invalid option value: \"%s\". Possible values are: %s.":"","File system synchronisation target directory":"","The path to synchronise with when file system synchronisation is enabled. See `sync.target`.":"","Synchronisation target":"","The target to synchonise to. If synchronising with the file system, set `sync.2.path` to specify the target directory.":"","File system":"","OneDrive":"","Text editor":"","The editor that will be used to open a note. If none is provided it will try to auto-detect the default editor.":"","Language":"","Theme":"","Light":"","Dark":"","Show uncompleted todos on top of the lists":"","Save geo-location with notes":"","Synchronisation interval":"","Disabled":"","%d minutes":"","%d hour":"","%d hours":"","Show advanced options":"","Sync status (synced items / total items)":"","%s: %d/%d":"","Total: %d/%d":"","Conflicted: %d":"","To delete: %d":"","Folders":"","%s: %d notes":"","There are currently no notes. Create one by clicking on the (+) button.":"","Log":"","Status":"","Cancel synchronisation":"","The notebook could not be saved: %s":"","Edit notebook":"","This note has been modified:":"","Save changes":"","Discard changes":"","Delete note":"","Convert to regular note":"","Convert to todo":"","Hide metadata":"","Show metadata":"","View location on map":"","Edit":"","Delete notebook":"","Login with OneDrive":"","Click on the (+) button to create a new note or notebook. Click on the side menu to access your existing notebooks.":"","You currently have no notebook. Create one by clicking on (+) button.":"","Welcome":""} \ No newline at end of file +{"Give focus to next pane":"","Give focus to previous pane":"","Enter command line mode":"","Exit command line mode":"","Edit the selected note":"","Cancel the current command.":"","Exit the application.":"","Delete the currently selected note or notebook.":"","To delete a tag, untag the associated notes.":"","Please select the note or notebook to be deleted first.":"","Set a to-do as completed / not completed":"","[t]oggle [c]onsole between maximized/minimized/hidden/visible.":"","Search":"","[t]oggle note [m]etadata.":"","[M]ake a new [n]ote":"","[M]ake a new [t]odo":"","[M]ake a new note[b]ook":"","Copy ([Y]ank) the [n]ote to a notebook.":"","Move the note to a notebook.":"","Press Ctrl+D or type \"exit\" to exit the application":"","More than one item match \"%s\". Please narrow down your query.":"","No notebook selected.":"","No notebook has been specified.":"","Y":"","n":"","N":"","y":"","Cancelling background synchronisation... Please wait.":"","The command \"%s\" is only available in GUI mode":"","Missing required argument: %s":"","%s: %s":"","Your choice: ":"","Invalid answer: %s":"","Attaches the given file to the note.":"","Cannot find \"%s\".":"","Displays the given note.":"","Displays the complete information about note.":"","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"","Also displays unset and hidden config variables.":"","%s = %s (%s)":"","%s = %s":"","Duplicates the notes matching to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"","Marks a to-do as done.":"","Note is not a to-do: \"%s\"":"","Edit note.":"","No text editor is defined. Please set it using `config editor `":"","No active notebook.":"","Note does not exist: \"%s\". Create it?":"","Starting to edit note. Close the editor to get back to the prompt.":"","Note has been saved.":"","Exits the application.":"","Exports Joplin data to the given directory. By default, it will export the complete database including notebooks, notes, tags and resources.":"","Exports only the given note.":"","Exports only the given notebook.":"","Displays a geolocation URL for the note.":"","Displays usage information.":"","Shortcuts are not available in CLI mode.":"","Type `help [command]` for more information about a command.":"","The possible commands are:":"","In any command, a note or notebook can be refered to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"","To move from one pane to another, press Tab or Shift+Tab.":"","Use the arrows and page up/down to scroll the lists and text areas (including this console).":"","To maximise/minimise the console, press \"TC\".":"","To enter command line mode, press \":\"":"","To exit command line mode, press ESCAPE":"","For the complete list of available keyboard shortcuts, type `help shortcuts`":"","Imports an Evernote notebook file (.enex file).":"","Do not ask for confirmation.":"","File \"%s\" will be imported into existing notebook \"%s\". Continue?":"","New notebook \"%s\" will be created and file \"%s\" will be imported into it. Continue?":"","Found: %d.":"","Created: %d.":"","Updated: %d.":"","Skipped: %d.":"","Resources: %d.":"","Tagged: %d.":"","Importing notes...":"","The notes have been imported: %s":"","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"","Displays only the first top notes.":"","Sorts the item by (eg. title, updated_time, created_time).":"","Reverses the sorting order.":"","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"","Either \"text\" or \"json\"":"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"","Please select a notebook first.":"","Creates a new notebook.":"","Creates a new note.":"","Notes can only be created within a notebook.":"","Creates a new to-do.":"","Moves the notes matching to [notebook].":"","Renames the given (note or notebook) to .":"","Deletes the given notebook.":"","Deletes the notebook without asking for confirmation.":"","Delete notebook \"%s\"?":"","Deletes the notes matching .":"","Deletes the notes without asking for confirmation.":"","%d notes match this pattern. Delete them?":"","Delete note?":"","Searches for the given in all the notes.":"","Sets the property of the given to the given [value].":"","Displays summary about the notes and notebooks.":"","Synchronises with remote storage.":"","Sync to provided target (defaults to sync.target config value)":"","Synchronisation is already in progress.":"","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"","Authentication was not completed (did not receive an authentication token).":"","Synchronisation target: %s (%s)":"","Cannot initialize synchroniser.":"","Starting synchronisation...":"","Cancelling... Please wait.":""," can be \"add\", \"remove\" or \"list\" to assign or remove [tag] from [note], or to list the notes associated with [tag]. The command `tag list` can be used to list all the tags.":"","Invalid command: \"%s\"":""," can either be \"toggle\" or \"clear\". Use \"toggle\" to toggle the given to-do between completed and uncompleted state (If the target is a regular note it will be converted to a to-do). Use \"clear\" to convert the to-do back to a regular note.":"","Marks a to-do as non-completed.":"","Switches to [notebook] - all further operations will happen within this notebook.":"","Displays version information":"","%s %s (%s)":"","Enum":"","Type: %s.":"","Possible values: %s.":"","Default: %s":"","Possible keys/values:":"","Fatal error:":"","The application has been authorised - you may now close this browser tab.":"","The application has been successfully authorised.":"","Please open the following URL in your browser to authenticate the application. The application will create a directory in \"Apps/Joplin\" and will only read and write files in this directory. It will have no access to any files outside this directory nor to any other personal data. No data will be shared with any third party.":"","Search:":"","File":"","New note":"","New to-do":"","New notebook":"","Import Evernote notes":"","Evernote Export Files":"","Quit":"","Tools":"","Options":"","Help":"","Website and documentation":"","About Joplin":"","%s %s (%s, %s)":"","OK":"","Cancel":"","Back":"","New notebook \"%s\" will be created and file \"%s\" will be imported into it":"","Please create a notebook first.":"","Note title:":"","Please create a notebook first":"","To-do title:":"","Notebook title:":"","Add or remove tags:":"","Separate each tag by a comma.":"","Rename notebook:":"","Layout":"","Add or remove tags":"","Switch between note and to-do":"","Delete":"","No notes in here. Create one by clicking on \"New note\".":"","Unsupported link or message: %s":"","Attach file":"","Refresh":"","OneDrive Login":"","Import":"","Configuration":"","Delete notebook?":"","Remove this tag from all the notes?":"","Rename":"","Notebooks":"","Tags":"","Synchronise":"","Usage: %s":"","Unknown flag: %s":"","Unknown log level: %s":"","Unknown level ID: %s":"","Cannot refresh token: authentication data is missing. Starting the synchronisation again may fix the problem.":"","Please set the \"sync.2.path\" config value to the desired synchronisation destination.":"","Cannot access %s":"","Created local items: %d.":"","Updated local items: %d.":"","Created remote items: %d.":"","Updated remote items: %d.":"","Deleted local items: %d.":"","Deleted remote items: %d.":"","State: \"%s\".":"","Cancelling...":"","Completed: %s":"","Synchronisation is already in progress. State: %s":"","Conflicts":"","A notebook with this title already exists: \"%s\"":"","Notebooks cannot be named \"%s\", which is a reserved title.":"","Untitled":"","This note does not have geolocation information.":"","Cannot copy note to \"%s\" notebook":"","Cannot move note to \"%s\" notebook":"","Invalid option value: \"%s\". Possible values are: %s.":"","File system synchronisation target directory":"","The path to synchronise with when file system synchronisation is enabled. See `sync.target`.":"","Synchronisation target":"","The target to synchonise to. If synchronising with the file system, set `sync.2.path` to specify the target directory.":"","File system":"","OneDrive":"","Text editor":"","The editor that will be used to open a note. If none is provided it will try to auto-detect the default editor.":"","Language":"","Theme":"","Light":"","Dark":"","Show uncompleted todos on top of the lists":"","Save geo-location with notes":"","Synchronisation interval":"","Disabled":"","%d minutes":"","%d hour":"","%d hours":"","Show advanced options":"","Sync status (synced items / total items)":"","%s: %d/%d":"","Total: %d/%d":"","Conflicted: %d":"","To delete: %d":"","Folders":"","%s: %d notes":"","There are currently no notes. Create one by clicking on the (+) button.":"","Log":"","Status":"","Cancel synchronisation":"","The notebook could not be saved: %s":"","Edit notebook":"","This note has been modified:":"","Save changes":"","Discard changes":"","Delete note":"","Convert to regular note":"","Convert to todo":"","Hide metadata":"","Show metadata":"","View location on map":"","Edit":"","Delete notebook":"","Login with OneDrive":"","Click on the (+) button to create a new note or notebook. Click on the side menu to access your existing notebooks.":"","You currently have no notebook. Create one by clicking on (+) button.":"","Welcome":""} \ No newline at end of file diff --git a/ElectronClient/app/locales/fr_FR.json b/ElectronClient/app/locales/fr_FR.json index c145703d5..b2076f5d2 100644 --- a/ElectronClient/app/locales/fr_FR.json +++ b/ElectronClient/app/locales/fr_FR.json @@ -1 +1 @@ -{"Give focus to next pane":"Activer le volet suivant","Give focus to previous pane":"Activer le volet précédent","Enter command line mode":"Démarrer le mode de ligne de commande","Exit command line mode":"Sortir du mode de ligne de commande","Edit the selected note":"Editer la note sélectionnée","Cancel the current command.":"Annuler la commande en cours.","Exit the application.":"Quitter le logiciel.","Delete the currently selected note or notebook.":"Supprimer la note ou carnet sélectionné.","To delete a tag, untag the associated notes.":"Pour supprimer une vignette, enlever là des notes associées.","Please select the note or notebook to be deleted first.":"Veuillez d'abord sélectionner un carnet.","Set a to-do as completed / not completed":"Marquer une tâches comme complétée / non-complétée","[t]oggle [c]onsole between maximized/minimized/hidden/visible.":"Maximiser, minimiser, cacher ou rendre visible la console.","Search":"Chercher","[t]oggle note [m]etadata.":"Afficher/Cacher les métadonnées des notes.","[M]ake a new [n]ote":"Créer une nouvelle note","[M]ake a new [t]odo":"Créer une nouvelle tâche","[M]ake a new note[b]ook":"Créer un nouveau carnet","Copy ([Y]ank) the [n]ote to a notebook.":"Copier la note dans un autre carnet.","Move the note to a notebook.":"Déplacer la note vers un carnet.","Press Ctrl+D or type \"exit\" to exit the application":"Appuyez sur Ctrl+D ou tapez \"exit\" pour sortir du logiciel","More than one item match \"%s\". Please narrow down your query.":"Plus d'un objet correspond à \"%s\". Veuillez préciser votre requête.","No notebook selected.":"Aucun carnet n'est sélectionné.","No notebook has been specified.":"Aucun carnet n'est spécifié.","Y":"O","n":"n","N":"N","y":"o","Cancelling background synchronisation... Please wait.":"Annulation de la synchronisation... Veuillez patienter.","The command \"%s\" is only available in GUI mode":"La commande \"%s\" est disponible uniquement en mode d'interface graphique","Missing required argument: %s":"Paramètre requis manquant : %s","%s: %s":"%s : %s","Your choice: ":"Votre choix :","Invalid answer: %s":"Réponse invalide : %s","Attaches the given file to the note.":"Joindre le fichier fourni à la note.","Cannot find \"%s\".":"Impossible de trouver \"%s\".","Displays the given note.":"Affiche la note.","Displays the complete information about note.":"Affiche tous les détails de la note.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtient ou modifie une valeur de configuration. Si la [valeur] n'est pas fournie, la valeur de [nom] est affichée. Si ni le [nom] ni la [valeur] ne sont fournis, la configuration complète est affichée.","Also displays unset and hidden config variables.":"Afficher également les variables cachées.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Copie les notes correspondant à vers [carnet]. Si aucun carnet n'est spécifié, la note est dupliquée sur place.","Marks a to-do as done.":"Marquer la tâche comme complétée.","Note is not a to-do: \"%s\"":"La note n'est pas une tâche : \"%s\"","Edit note.":"Editer la note.","No text editor is defined. Please set it using `config editor `":"Aucun éditeur de texte n'est défini. Veuillez le définir en utilisant la commande `config editor `","No active notebook.":"Aucun carnet actif.","Note does not exist: \"%s\". Create it?":"Cette note n'existe pas : \"%s\". La créer ?","Starting to edit note. Close the editor to get back to the prompt.":"Edition de la note en cours. Fermez l'éditeur de texte pour retourner à l'invite de commande.","Note has been saved.":"La note a été enregistrée.","Exits the application.":"Quitter le logiciel.","Exports Joplin data to the given directory. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exporter les données de Joplin vers le dossier fourni. Par défaut, la base de donnée complète sera exportée, y compris les carnets, notes, tags et resources.","Exports only the given note.":"Exporter uniquement la note spécifiée.","Exports only the given notebook.":"Exporter uniquement le carnet spécifié.","Displays a geolocation URL for the note.":"Afficher l'URL de l'emplacement de la note.","Displays usage information.":"Affiche les informations d'utilisation.","Shortcuts are not available in CLI mode.":"Les raccourcis ne sont pas disponible en mode de ligne de commande.","Type `help [command]` for more information about a command.":"Tapez `help [command]` pour plus d'information sur une commande.","The possible commands are:":"Les commandes possibles sont :","In any command, a note or notebook can be refered to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"Dans n'importe quelle commande, une note ou carnet peut être référé par titre ou identifiant, ou en utilisant les raccourcis `$n` et `$b` pour, respectivement, la note sélectionnée et le carnet sélectionné. `$c` peut être utilisé pour faire référence à l'objet sélectionné en cours.","To move from one pane to another, press Tab or Shift+Tab.":"Pour aller d'un volet à l'autre, pressez Tab ou Maj+Tab.","Use the arrows and page up/down to scroll the lists and text areas (including this console).":"Utilisez les touches fléchées et page précédente/suivante pour faire défiler les listes et zones de texte (y compris cette console).","To maximise/minimise the console, press \"TC\".":"Pour maximiser ou minimiser la console, pressez \"TC\".","To enter command line mode, press \":\"":"Pour démarrer le mode ligne de commande, pressez \":\"","To exit command line mode, press ESCAPE":"Pour sortir du mode ligne de commande, pressez ECHAP","For the complete list of available keyboard shortcuts, type `help shortcuts`":"Pour la liste complète des raccourcis disponibles, tapez `help shortcuts`","Imports an Evernote notebook file (.enex file).":"Importer un carnet Evernote (fichier .enex).","Do not ask for confirmation.":"Ne pas demander de confirmation.","File \"%s\" will be imported into existing notebook \"%s\". Continue?":"Le fichier \"%s\" va être importé dans le carnet existant \"%s\". Continuer ?","New notebook \"%s\" will be created and file \"%s\" will be imported into it. Continue?":"Un nouveau carnet \"%s\" va être créé et le fichier \"%s\" va être importé dedans. Continuer ?","Found: %d.":"Trouvés : %d.","Created: %d.":"Créés : %d.","Updated: %d.":"Mise à jour : %d.","Skipped: %d.":"Ignorés : %d.","Resources: %d.":"Ressources : %d.","Tagged: %d.":"Etiquettes : %d.","Importing notes...":"Importation des notes...","The notes have been imported: %s":"Les notes ont été importées : %s","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Affiche les notes dans le carnet. Utilisez `ls /` pour afficher la liste des carnets.","Displays only the first top notes.":"Affiche uniquement les premières notes.","Sorts the item by (eg. title, updated_time, created_time).":"Trier les notes par (par exemple, title, updated_time, created_time).","Reverses the sorting order.":"Inverser l'ordre.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Affiche uniquement les notes du ou des types spécifiés. Le type peut-être `n` pour les notes, `t` pour les tâches (par exemple, `-tt` affiche uniquement les tâches, tandis que `-ttd` affiche les notes et les tâches).","Either \"text\" or \"json\"":"Soit \"text\" soit \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Utilise le format de liste longue. Le format est ID, NOMBRE_DE_NOTES (pour les carnets), DATE, TACHE_TERMINE (pour les tâches), TITRE","Please select a notebook first.":"Veuillez d'abord sélectionner un carnet.","Creates a new notebook.":"Créer un carnet.","Creates a new note.":"Créer une note.","Notes can only be created within a notebook.":"Les notes ne peuvent être créées que dans un carnet.","Creates a new to-do.":"Créer une nouvelle tâche.","Moves the notes matching to [notebook].":"Déplacer les notes correspondant à vers [notebook].","Renames the given (note or notebook) to .":"Renommer l'objet (note ou carnet) en .","Deletes the given notebook.":"Supprimer le carnet.","Deletes the notebook without asking for confirmation.":"Supprimer le carnet sans demander la confirmation.","Delete notebook \"%s\"?":"Supprimer le carnet \"%s\" ?","Deletes the notes matching .":"Supprimer les notes correspondants à .","Deletes the notes without asking for confirmation.":"Supprimer les notes sans demander la confirmation.","%d notes match this pattern. Delete them?":"%d notes correspondent à ce motif. Les supprimer ?","Delete note?":"Supprimer la note ?","Searches for the given in all the notes.":"Chercher le motif dans toutes les notes.","Sets the property of the given to the given [value].":"Assigner la valeur [value] à la propriété de la donnée.","Displays summary about the notes and notebooks.":"Afficher un résumé des notes et carnets.","Synchronises with remote storage.":"Synchroniser les notes et carnets.","Sync to provided target (defaults to sync.target config value)":"Synchroniser avec la cible donnée (par défaut, la valeur de configuration `sync.target`).","Synchronisation is already in progress.":"La synchronisation est déjà en cours.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"La synchronisation est déjà en cours ou ne s'est pas interrompue correctement. Si vous savez qu'aucune autre synchronisation est en cours, vous pouvez supprimer le fichier \"%s\" pour reprendre l'opération.","Authentication was not completed (did not receive an authentication token).":"Impossible d'autoriser le logiciel (jeton d'identification non-reçu).","Synchronisation target: %s (%s)":"Cible de la synchronisation : %s (%s)","Cannot initialize synchroniser.":"Impossible d'initialiser la synchronisation.","Starting synchronisation...":"Commencement de la synchronisation...","Cancelling... Please wait.":"Annulation... Veuillez attendre."," can be \"add\", \"remove\" or \"list\" to assign or remove [tag] from [note], or to list the notes associated with [tag]. The command `tag list` can be used to list all the tags.":" peut être \"add\", \"remove\" ou \"list\" pour assigner ou enlever l'étiquette [tag] de la [note], our pour lister les notes associées avec l'étiquette [tag]. La commande `tag list` peut être utilisée pour lister les étiquettes.","Invalid command: \"%s\"":"Commande invalide : \"%s\""," can either be \"toggle\" or \"clear\". Use \"toggle\" to toggle the given to-do between completed and uncompleted state (If the target is a regular note it will be converted to a to-do). Use \"clear\" to convert the to-do back to a regular note.":"Gère le status des tâches. peut être \"toggle\" ou \"clear\". Utilisez \"toggle\" pour basculer la tâche entre le status terminé et non-terminé (Si la cible est une note, elle sera convertie en tâche). Utilisez \"clear\" pour convertir la tâche en note.","Marks a to-do as non-completed.":"Marquer une tâche comme non-complétée.","Switches to [notebook] - all further operations will happen within this notebook.":"Changer de carnet - toutes les opérations à venir se feront dans ce carnet.","Displays version information":"Affiche les informations de version","%s %s (%s)":"%s %s (%s)","Enum":"Enum","Type: %s.":"Type : %s.","Possible values: %s.":"Valeurs possibles : %s.","Default: %s":"Défaut : %s","Possible keys/values:":"Clefs/Valeurs possibles :","Fatal error:":"Erreur fatale :","The application has been authorised - you may now close this browser tab.":"Le logiciel a été autorisé. Vous pouvez maintenant fermer cet onglet.","The application has been successfully authorised.":"Le logiciel a été autorisé.","Please open the following URL in your browser to authenticate the application. The application will create a directory in \"Apps/Joplin\" and will only read and write files in this directory. It will have no access to any files outside this directory nor to any other personal data. No data will be shared with any third party.":"Veuillez ouvrir le lien ci-dessous dans votre browser pour authentifier le logiciel. Joplin va créer un répertoire \"Apps/Joplin\" et lire/écrira des fichiers uniquement dans ce répertoire. Le logiciel n'aura pas d'accès à aucun fichier en dehors de ce répertoire, ni à d'autres données personnelles. Aucune donnée ne sera partagé avec aucun tier.","Search:":"Search:","File":"","New note":"Nouvelle note","New to-do":"Nouvelle tâche","New notebook":"Nouveau carnet","Import Evernote notes":"Importer notes d'Evernotes","Evernote Export Files":"Fichiers d'export Evernote","Quit":"Quitter","Tools":"Outils","Options":"Options","Help":"Aide","Website and documentation":"Website and documentation","About Joplin":"A props de Joplin","%s %s (%s, %s)":"%s %s (%s, %s)","OK":"OK","Cancel":"Annulation","Back":"Retour","New notebook \"%s\" will be created and file \"%s\" will be imported into it":"New notebook \"%s\" will be created and file \"%s\" will be imported into it","Please create a notebook first.":"Please create a notebook first.","Note title:":"Note title:","Please create a notebook first":"Please create a notebook first","To-do title:":"To-do title:","Notebook title:":"Notebook title:","Add or remove tags:":"Modifier les étiquettes","Separate each tag by a comma.":"","Layout":"","Add or remove tags":"","Switch between note and to-do":"","Delete":"Delete","No notes in here. Create one by clicking on \"New note\".":"No notes in here. Create one by clicking on \"New note\".","Unsupported link or message: %s":"","Attach file":"Attacher un fichier","Refresh":"Rafraîchir","OneDrive Login":"OneDrive Login","Import":"Import","Configuration":"Configuration","Delete notebook?":"Supprimer le carnet ?","Remove this tag from all the notes?":"","Notebooks":"Notebooks","Tags":"","Synchronise":"Synchroniser","Usage: %s":"Utilisation : %s","Unknown flag: %s":"Paramètre inconnu : %s","Unknown log level: %s":"Paramètre inconnu : %s","Unknown level ID: %s":"Paramètre inconnu : %s","Cannot refresh token: authentication data is missing. Starting the synchronisation again may fix the problem.":"Impossible de rafraîchir la connection à OneDrive. Démarrez la synchronisation à nouveau pour corriger le problème.","Please set the \"sync.2.path\" config value to the desired synchronisation destination.":"Veuillez attribuer une valeur au paramètre de configuration \"sync.2.path\" pour indiquer le dossier où devra se faire la synchronisation.","Cannot access %s":"Impossible d'accéder à %s","Created local items: %d.":"Objets créés localement : %d.","Updated local items: %d.":"Objets mis à jour localement : %d.","Created remote items: %d.":"Objets distants créés : %d.","Updated remote items: %d.":"Objets distants mis à jour : %d.","Deleted local items: %d.":"Objets supprimés localement : %d.","Deleted remote items: %d.":"Objets distants supprimés : %d.","State: \"%s\".":"Etat : \"%s\".","Cancelling...":"Annulation...","Completed: %s":"Terminé : %s","Synchronisation is already in progress. State: %s":"La synchronisation est déjà en cours. Etat : %s","Conflicts":"Conflits","A notebook with this title already exists: \"%s\"":"Un carnet avec ce titre existe déjà : \"%s\"","Notebooks cannot be named \"%s\", which is a reserved title.":"Les carnets ne peuvent être nommés \"%s\" car c'est un nom réservé.","Untitled":"Sans titre","This note does not have geolocation information.":"Cette note n'a pas d'information d'emplacement.","Cannot copy note to \"%s\" notebook":"Impossible de copier la note vers le carnet \"%s\"","Cannot move note to \"%s\" notebook":"Impossible de déplacer la note vers le carnet \"%s\"","Invalid option value: \"%s\". Possible values are: %s.":"Option invalide: \"%s\". Les valeurs possibles sont : %s.","File system synchronisation target directory":"Cible de la synchronisation sur le disque dur","The path to synchronise with when file system synchronisation is enabled. See `sync.target`.":"Le chemin du répertoire avec lequel synchroniser lorsque la synchronisation par système de fichier est activée. Voir `sync.target`.","Synchronisation target":"Cible de la synchronisation","The target to synchonise to. If synchronising with the file system, set `sync.2.path` to specify the target directory.":"La cible avec laquelle synchroniser. Pour synchroniser avec le système de fichier, veuillez spécifier le répertoire avec `sync.2.path`.","File system":"Système de fichier","OneDrive":"OneDrive","Text editor":"Editeur de texte","The editor that will be used to open a note. If none is provided it will try to auto-detect the default editor.":"L'éditeur de texte pour ouvrir et modifier les notes. Si aucun n'est spécifié, il sera détecté automatiquement.","Language":"Langue","Theme":"Apparence","Light":"Clair","Dark":"Sombre","Show uncompleted todos on top of the lists":"Tâches non-terminées en haut des listes","Save geo-location with notes":"Enregistrer l'emplacement avec les notes","Synchronisation interval":"Interval de synchronisation","Disabled":"Désactivé","%d minutes":"%d minutes","%d hour":"%d heure","%d hours":"%d heures","Show advanced options":"Montrer les options avancées","Sync status (synced items / total items)":"Status de la synchronisation (objets synchro. / total)","%s: %d/%d":"%s: %d/%d","Total: %d/%d":"Total : %d/%d","Conflicted: %d":"Conflits : %d","To delete: %d":"A supprimer : %d","Folders":"Carnets","%s: %d notes":"%s : %d notes","There are currently no notes. Create one by clicking on the (+) button.":"Ce carnet ne contient aucune note. Créez-en une en appuyant sur le bouton (+).","Log":"Journal","Status":"Etat","Cancel synchronisation":"Annuler synchronisation","The notebook could not be saved: %s":"Ce carnet n'a pas pu être sauvegardé : %s","Edit notebook":"Editer le carnet","This note has been modified:":"Cette note a été modifiée :","Save changes":"Enregistrer les changements","Discard changes":"Ignorer les changements","Delete note":"Supprimer la note","Convert to regular note":"Convertir en note","Convert to todo":"Convertir en tâche","Hide metadata":"Cacher les métadonnées","Show metadata":"Afficher les métadonnées","View location on map":"Voir l'emplacement sur la carte","Edit":"Editer","Delete notebook":"Supprimer le carnet","Login with OneDrive":"Se connecter avec OneDrive","Click on the (+) button to create a new note or notebook. Click on the side menu to access your existing notebooks.":"Appuyez sur le bouton (+) pour créer une nouvelle note ou carnet. Ouvrez le menu latéral pour accéder à vos carnets.","You currently have no notebook. Create one by clicking on (+) button.":"Vous n'avez pour l'instant pas de carnets. Créez-en un en pressant le bouton (+).","Welcome":"Bienvenue"} \ No newline at end of file +{"Give focus to next pane":"Activer le volet suivant","Give focus to previous pane":"Activer le volet précédent","Enter command line mode":"Démarrer le mode de ligne de commande","Exit command line mode":"Sortir du mode de ligne de commande","Edit the selected note":"Editer la note sélectionnée","Cancel the current command.":"Annuler la commande en cours.","Exit the application.":"Quitter le logiciel.","Delete the currently selected note or notebook.":"Supprimer la note ou carnet sélectionné.","To delete a tag, untag the associated notes.":"Pour supprimer une vignette, enlever là des notes associées.","Please select the note or notebook to be deleted first.":"Veuillez d'abord sélectionner un carnet.","Set a to-do as completed / not completed":"Marquer une tâches comme complétée / non-complétée","[t]oggle [c]onsole between maximized/minimized/hidden/visible.":"Maximiser, minimiser, cacher ou rendre visible la console.","Search":"Chercher","[t]oggle note [m]etadata.":"Afficher/Cacher les métadonnées des notes.","[M]ake a new [n]ote":"Créer une nouvelle note","[M]ake a new [t]odo":"Créer une nouvelle tâche","[M]ake a new note[b]ook":"Créer un nouveau carnet","Copy ([Y]ank) the [n]ote to a notebook.":"Copier la note dans un autre carnet.","Move the note to a notebook.":"Déplacer la note vers un carnet.","Press Ctrl+D or type \"exit\" to exit the application":"Appuyez sur Ctrl+D ou tapez \"exit\" pour sortir du logiciel","More than one item match \"%s\". Please narrow down your query.":"Plus d'un objet correspond à \"%s\". Veuillez préciser votre requête.","No notebook selected.":"Aucun carnet n'est sélectionné.","No notebook has been specified.":"Aucun carnet n'est spécifié.","Y":"O","n":"n","N":"N","y":"o","Cancelling background synchronisation... Please wait.":"Annulation de la synchronisation... Veuillez patienter.","The command \"%s\" is only available in GUI mode":"La commande \"%s\" est disponible uniquement en mode d'interface graphique","Missing required argument: %s":"Paramètre requis manquant : %s","%s: %s":"%s : %s","Your choice: ":"Votre choix :","Invalid answer: %s":"Réponse invalide : %s","Attaches the given file to the note.":"Joindre le fichier fourni à la note.","Cannot find \"%s\".":"Impossible de trouver \"%s\".","Displays the given note.":"Affiche la note.","Displays the complete information about note.":"Affiche tous les détails de la note.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtient ou modifie une valeur de configuration. Si la [valeur] n'est pas fournie, la valeur de [nom] est affichée. Si ni le [nom] ni la [valeur] ne sont fournis, la configuration complète est affichée.","Also displays unset and hidden config variables.":"Afficher également les variables cachées.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Copie les notes correspondant à vers [carnet]. Si aucun carnet n'est spécifié, la note est dupliquée sur place.","Marks a to-do as done.":"Marquer la tâche comme complétée.","Note is not a to-do: \"%s\"":"La note n'est pas une tâche : \"%s\"","Edit note.":"Editer la note.","No text editor is defined. Please set it using `config editor `":"Aucun éditeur de texte n'est défini. Veuillez le définir en utilisant la commande `config editor `","No active notebook.":"Aucun carnet actif.","Note does not exist: \"%s\". Create it?":"Cette note n'existe pas : \"%s\". La créer ?","Starting to edit note. Close the editor to get back to the prompt.":"Edition de la note en cours. Fermez l'éditeur de texte pour retourner à l'invite de commande.","Note has been saved.":"La note a été enregistrée.","Exits the application.":"Quitter le logiciel.","Exports Joplin data to the given directory. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exporter les données de Joplin vers le dossier fourni. Par défaut, la base de donnée complète sera exportée, y compris les carnets, notes, tags et resources.","Exports only the given note.":"Exporter uniquement la note spécifiée.","Exports only the given notebook.":"Exporter uniquement le carnet spécifié.","Displays a geolocation URL for the note.":"Afficher l'URL de l'emplacement de la note.","Displays usage information.":"Affiche les informations d'utilisation.","Shortcuts are not available in CLI mode.":"Les raccourcis ne sont pas disponible en mode de ligne de commande.","Type `help [command]` for more information about a command.":"Tapez `help [command]` pour plus d'information sur une commande.","The possible commands are:":"Les commandes possibles sont :","In any command, a note or notebook can be refered to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"Dans n'importe quelle commande, une note ou carnet peut être référé par titre ou identifiant, ou en utilisant les raccourcis `$n` et `$b` pour, respectivement, la note sélectionnée et le carnet sélectionné. `$c` peut être utilisé pour faire référence à l'objet sélectionné en cours.","To move from one pane to another, press Tab or Shift+Tab.":"Pour aller d'un volet à l'autre, pressez Tab ou Maj+Tab.","Use the arrows and page up/down to scroll the lists and text areas (including this console).":"Utilisez les touches fléchées et page précédente/suivante pour faire défiler les listes et zones de texte (y compris cette console).","To maximise/minimise the console, press \"TC\".":"Pour maximiser ou minimiser la console, pressez \"TC\".","To enter command line mode, press \":\"":"Pour démarrer le mode ligne de commande, pressez \":\"","To exit command line mode, press ESCAPE":"Pour sortir du mode ligne de commande, pressez ECHAP","For the complete list of available keyboard shortcuts, type `help shortcuts`":"Pour la liste complète des raccourcis disponibles, tapez `help shortcuts`","Imports an Evernote notebook file (.enex file).":"Importer un carnet Evernote (fichier .enex).","Do not ask for confirmation.":"Ne pas demander de confirmation.","File \"%s\" will be imported into existing notebook \"%s\". Continue?":"Le fichier \"%s\" va être importé dans le carnet existant \"%s\". Continuer ?","New notebook \"%s\" will be created and file \"%s\" will be imported into it. Continue?":"Un nouveau carnet \"%s\" va être créé et le fichier \"%s\" va être importé dedans. Continuer ?","Found: %d.":"Trouvés : %d.","Created: %d.":"Créés : %d.","Updated: %d.":"Mise à jour : %d.","Skipped: %d.":"Ignorés : %d.","Resources: %d.":"Ressources : %d.","Tagged: %d.":"Etiquettes : %d.","Importing notes...":"Importation des notes...","The notes have been imported: %s":"Les notes ont été importées : %s","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Affiche les notes dans le carnet. Utilisez `ls /` pour afficher la liste des carnets.","Displays only the first top notes.":"Affiche uniquement les premières notes.","Sorts the item by (eg. title, updated_time, created_time).":"Trier les notes par (par exemple, title, updated_time, created_time).","Reverses the sorting order.":"Inverser l'ordre.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Affiche uniquement les notes du ou des types spécifiés. Le type peut-être `n` pour les notes, `t` pour les tâches (par exemple, `-tt` affiche uniquement les tâches, tandis que `-ttd` affiche les notes et les tâches).","Either \"text\" or \"json\"":"Soit \"text\" soit \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Utilise le format de liste longue. Le format est ID, NOMBRE_DE_NOTES (pour les carnets), DATE, TACHE_TERMINE (pour les tâches), TITRE","Please select a notebook first.":"Veuillez d'abord sélectionner un carnet.","Creates a new notebook.":"Créer un carnet.","Creates a new note.":"Créer une note.","Notes can only be created within a notebook.":"Les notes ne peuvent être créées que dans un carnet.","Creates a new to-do.":"Créer une nouvelle tâche.","Moves the notes matching to [notebook].":"Déplacer les notes correspondant à vers [notebook].","Renames the given (note or notebook) to .":"Renommer l'objet (note ou carnet) en .","Deletes the given notebook.":"Supprimer le carnet.","Deletes the notebook without asking for confirmation.":"Supprimer le carnet sans demander la confirmation.","Delete notebook \"%s\"?":"Supprimer le carnet \"%s\" ?","Deletes the notes matching .":"Supprimer les notes correspondants à .","Deletes the notes without asking for confirmation.":"Supprimer les notes sans demander la confirmation.","%d notes match this pattern. Delete them?":"%d notes correspondent à ce motif. Les supprimer ?","Delete note?":"Supprimer la note ?","Searches for the given in all the notes.":"Chercher le motif dans toutes les notes.","Sets the property of the given to the given [value].":"Assigner la valeur [value] à la propriété de la donnée.","Displays summary about the notes and notebooks.":"Afficher un résumé des notes et carnets.","Synchronises with remote storage.":"Synchroniser les notes et carnets.","Sync to provided target (defaults to sync.target config value)":"Synchroniser avec la cible donnée (par défaut, la valeur de configuration `sync.target`).","Synchronisation is already in progress.":"La synchronisation est déjà en cours.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"La synchronisation est déjà en cours ou ne s'est pas interrompue correctement. Si vous savez qu'aucune autre synchronisation est en cours, vous pouvez supprimer le fichier \"%s\" pour reprendre l'opération.","Authentication was not completed (did not receive an authentication token).":"Impossible d'autoriser le logiciel (jeton d'identification non-reçu).","Synchronisation target: %s (%s)":"Cible de la synchronisation : %s (%s)","Cannot initialize synchroniser.":"Impossible d'initialiser la synchronisation.","Starting synchronisation...":"Commencement de la synchronisation...","Cancelling... Please wait.":"Annulation... Veuillez attendre."," can be \"add\", \"remove\" or \"list\" to assign or remove [tag] from [note], or to list the notes associated with [tag]. The command `tag list` can be used to list all the tags.":" peut être \"add\", \"remove\" ou \"list\" pour assigner ou enlever l'étiquette [tag] de la [note], our pour lister les notes associées avec l'étiquette [tag]. La commande `tag list` peut être utilisée pour lister les étiquettes.","Invalid command: \"%s\"":"Commande invalide : \"%s\""," can either be \"toggle\" or \"clear\". Use \"toggle\" to toggle the given to-do between completed and uncompleted state (If the target is a regular note it will be converted to a to-do). Use \"clear\" to convert the to-do back to a regular note.":"Gère le status des tâches. peut être \"toggle\" ou \"clear\". Utilisez \"toggle\" pour basculer la tâche entre le status terminé et non-terminé (Si la cible est une note, elle sera convertie en tâche). Utilisez \"clear\" pour convertir la tâche en note.","Marks a to-do as non-completed.":"Marquer une tâche comme non-complétée.","Switches to [notebook] - all further operations will happen within this notebook.":"Changer de carnet - toutes les opérations à venir se feront dans ce carnet.","Displays version information":"Affiche les informations de version","%s %s (%s)":"%s %s (%s)","Enum":"Enum","Type: %s.":"Type : %s.","Possible values: %s.":"Valeurs possibles : %s.","Default: %s":"Défaut : %s","Possible keys/values:":"Clefs/Valeurs possibles :","Fatal error:":"Erreur fatale :","The application has been authorised - you may now close this browser tab.":"Le logiciel a été autorisé. Vous pouvez maintenant fermer cet onglet.","The application has been successfully authorised.":"Le logiciel a été autorisé.","Please open the following URL in your browser to authenticate the application. The application will create a directory in \"Apps/Joplin\" and will only read and write files in this directory. It will have no access to any files outside this directory nor to any other personal data. No data will be shared with any third party.":"Veuillez ouvrir le lien ci-dessous dans votre browser pour authentifier le logiciel. Joplin va créer un répertoire \"Apps/Joplin\" et lire/écrira des fichiers uniquement dans ce répertoire. Le logiciel n'aura pas d'accès à aucun fichier en dehors de ce répertoire, ni à d'autres données personnelles. Aucune donnée ne sera partagé avec aucun tier.","Search:":"Search:","File":"","New note":"Nouvelle note","New to-do":"Nouvelle tâche","New notebook":"Nouveau carnet","Import Evernote notes":"Importer notes d'Evernotes","Evernote Export Files":"Fichiers d'export Evernote","Quit":"Quitter","Tools":"Outils","Options":"Options","Help":"Aide","Website and documentation":"Website and documentation","About Joplin":"A props de Joplin","%s %s (%s, %s)":"%s %s (%s, %s)","OK":"OK","Cancel":"Annulation","Back":"Retour","New notebook \"%s\" will be created and file \"%s\" will be imported into it":"New notebook \"%s\" will be created and file \"%s\" will be imported into it","Please create a notebook first.":"Please create a notebook first.","Note title:":"Note title:","Please create a notebook first":"Please create a notebook first","To-do title:":"To-do title:","Notebook title:":"Notebook title:","Add or remove tags:":"Modifier les étiquettes","Separate each tag by a comma.":"","Rename notebook:":"Rename notebook:","Layout":"","Add or remove tags":"","Switch between note and to-do":"","Delete":"Delete","No notes in here. Create one by clicking on \"New note\".":"No notes in here. Create one by clicking on \"New note\".","Unsupported link or message: %s":"","Attach file":"Attacher un fichier","Refresh":"Rafraîchir","OneDrive Login":"OneDrive Login","Import":"Import","Configuration":"Configuration","Delete notebook?":"Supprimer le carnet ?","Remove this tag from all the notes?":"","Rename":"","Notebooks":"Notebooks","Tags":"","Synchronise":"Synchroniser","Usage: %s":"Utilisation : %s","Unknown flag: %s":"Paramètre inconnu : %s","Unknown log level: %s":"Paramètre inconnu : %s","Unknown level ID: %s":"Paramètre inconnu : %s","Cannot refresh token: authentication data is missing. Starting the synchronisation again may fix the problem.":"Impossible de rafraîchir la connection à OneDrive. Démarrez la synchronisation à nouveau pour corriger le problème.","Please set the \"sync.2.path\" config value to the desired synchronisation destination.":"Veuillez attribuer une valeur au paramètre de configuration \"sync.2.path\" pour indiquer le dossier où devra se faire la synchronisation.","Cannot access %s":"Impossible d'accéder à %s","Created local items: %d.":"Objets créés localement : %d.","Updated local items: %d.":"Objets mis à jour localement : %d.","Created remote items: %d.":"Objets distants créés : %d.","Updated remote items: %d.":"Objets distants mis à jour : %d.","Deleted local items: %d.":"Objets supprimés localement : %d.","Deleted remote items: %d.":"Objets distants supprimés : %d.","State: \"%s\".":"Etat : \"%s\".","Cancelling...":"Annulation...","Completed: %s":"Terminé : %s","Synchronisation is already in progress. State: %s":"La synchronisation est déjà en cours. Etat : %s","Conflicts":"Conflits","A notebook with this title already exists: \"%s\"":"Un carnet avec ce titre existe déjà : \"%s\"","Notebooks cannot be named \"%s\", which is a reserved title.":"Les carnets ne peuvent être nommés \"%s\" car c'est un nom réservé.","Untitled":"Sans titre","This note does not have geolocation information.":"Cette note n'a pas d'information d'emplacement.","Cannot copy note to \"%s\" notebook":"Impossible de copier la note vers le carnet \"%s\"","Cannot move note to \"%s\" notebook":"Impossible de déplacer la note vers le carnet \"%s\"","Invalid option value: \"%s\". Possible values are: %s.":"Option invalide: \"%s\". Les valeurs possibles sont : %s.","File system synchronisation target directory":"Cible de la synchronisation sur le disque dur","The path to synchronise with when file system synchronisation is enabled. See `sync.target`.":"Le chemin du répertoire avec lequel synchroniser lorsque la synchronisation par système de fichier est activée. Voir `sync.target`.","Synchronisation target":"Cible de la synchronisation","The target to synchonise to. If synchronising with the file system, set `sync.2.path` to specify the target directory.":"La cible avec laquelle synchroniser. Pour synchroniser avec le système de fichier, veuillez spécifier le répertoire avec `sync.2.path`.","File system":"Système de fichier","OneDrive":"OneDrive","Text editor":"Editeur de texte","The editor that will be used to open a note. If none is provided it will try to auto-detect the default editor.":"L'éditeur de texte pour ouvrir et modifier les notes. Si aucun n'est spécifié, il sera détecté automatiquement.","Language":"Langue","Theme":"Apparence","Light":"Clair","Dark":"Sombre","Show uncompleted todos on top of the lists":"Tâches non-terminées en haut des listes","Save geo-location with notes":"Enregistrer l'emplacement avec les notes","Synchronisation interval":"Interval de synchronisation","Disabled":"Désactivé","%d minutes":"%d minutes","%d hour":"%d heure","%d hours":"%d heures","Show advanced options":"Montrer les options avancées","Sync status (synced items / total items)":"Status de la synchronisation (objets synchro. / total)","%s: %d/%d":"%s: %d/%d","Total: %d/%d":"Total : %d/%d","Conflicted: %d":"Conflits : %d","To delete: %d":"A supprimer : %d","Folders":"Carnets","%s: %d notes":"%s : %d notes","There are currently no notes. Create one by clicking on the (+) button.":"Ce carnet ne contient aucune note. Créez-en une en appuyant sur le bouton (+).","Log":"Journal","Status":"Etat","Cancel synchronisation":"Annuler synchronisation","The notebook could not be saved: %s":"Ce carnet n'a pas pu être sauvegardé : %s","Edit notebook":"Editer le carnet","This note has been modified:":"Cette note a été modifiée :","Save changes":"Enregistrer les changements","Discard changes":"Ignorer les changements","Delete note":"Supprimer la note","Convert to regular note":"Convertir en note","Convert to todo":"Convertir en tâche","Hide metadata":"Cacher les métadonnées","Show metadata":"Afficher les métadonnées","View location on map":"Voir l'emplacement sur la carte","Edit":"Editer","Delete notebook":"Supprimer le carnet","Login with OneDrive":"Se connecter avec OneDrive","Click on the (+) button to create a new note or notebook. Click on the side menu to access your existing notebooks.":"Appuyez sur le bouton (+) pour créer une nouvelle note ou carnet. Ouvrez le menu latéral pour accéder à vos carnets.","You currently have no notebook. Create one by clicking on (+) button.":"Vous n'avez pour l'instant pas de carnets. Créez-en un en pressant le bouton (+).","Welcome":"Bienvenue"} \ No newline at end of file diff --git a/ElectronClient/app/package-lock.json b/ElectronClient/app/package-lock.json index b16518153..2122c0e55 100644 --- a/ElectronClient/app/package-lock.json +++ b/ElectronClient/app/package-lock.json @@ -1,6 +1,6 @@ { "name": "Joplin", - "version": "0.10.16", + "version": "0.10.18", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -10,14 +10,22 @@ "integrity": "sha512-+rr4OgeTNrLuJAf09o3USdttEYiXvZshWMkhD6wR9v1ieXH0JM1Q2yT41/cJuJcqiPpSXlM/g3aR+Y5MWQdr0Q==", "dev": true, "requires": { - "7zip-bin-mac": "1.0.1" + "7zip-bin-win": "2.1.1" + }, + "dependencies": { + "7zip-bin-win": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz", + "integrity": "sha512-6VGEW7PXGroTsoI2QW3b0ea95HJmbVBHvfANKLLMzSzFA1zKqVX5ybNuhmeGpf6vA0x8FJTt6twpprDANsY5WQ==", + "dev": true, + "optional": true + } } }, - "7zip-bin-mac": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz", - "integrity": "sha1-Pmh3i78JJq3GgVlCcHRQXUdVXAI=", - "optional": true + "7zip-bin-win": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz", + "integrity": "sha512-6VGEW7PXGroTsoI2QW3b0ea95HJmbVBHvfANKLLMzSzFA1zKqVX5ybNuhmeGpf6vA0x8FJTt6twpprDANsY5WQ==" }, "@types/node": { "version": "7.0.46", diff --git a/ElectronClient/app/package.json b/ElectronClient/app/package.json index acfc0bcae..c99fb66b6 100644 --- a/ElectronClient/app/package.json +++ b/ElectronClient/app/package.json @@ -1,6 +1,6 @@ { "name": "Joplin", - "version": "0.10.16", + "version": "0.10.18", "description": "Joplin for Desktop", "main": "main.js", "scripts": { @@ -39,7 +39,7 @@ "optionalDependencies": { "7zip-bin-mac": "^1.0.1", "7zip-bin-linux": "^1.0.1", - "7zip-bin-win": "^1.0.1" + "7zip-bin-win": "^2.1.1" }, "dependencies": { "app-module-path": "^2.2.0", diff --git a/ElectronClient/release_version.sh b/ElectronClient/release_version.sh index e6a8252a1..e34aa4297 100755 --- a/ElectronClient/release_version.sh +++ b/ElectronClient/release_version.sh @@ -5,6 +5,8 @@ APP_DIR="$ROOT_DIR/app" cd "$APP_DIR" VERSION="$(npm version patch)" git add -A -git commit -m "Version $VERSION" +git commit -m "Electron release $VERSION" git tag $VERSION -git push && git push --tags \ No newline at end of file +git push && git push --tags + +echo "Open https://github.com/laurent22/joplin/tags and create a draft release for tag $VERSION" \ No newline at end of file diff --git a/ReactNativeClient/android/app/build.gradle b/ReactNativeClient/android/app/build.gradle index 2374a1a1b..590221184 100644 --- a/ReactNativeClient/android/app/build.gradle +++ b/ReactNativeClient/android/app/build.gradle @@ -90,8 +90,8 @@ android { applicationId "net.cozic.joplin" minSdkVersion 16 targetSdkVersion 22 - versionCode 55 - versionName "0.9.42" + versionCode 56 + versionName "0.9.43" ndk { abiFilters "armeabi-v7a", "x86" } diff --git a/ReactNativeClient/lib/BaseApplication.js b/ReactNativeClient/lib/BaseApplication.js index a0b0d3ec2..9ab2ae0ad 100644 --- a/ReactNativeClient/lib/BaseApplication.js +++ b/ReactNativeClient/lib/BaseApplication.js @@ -11,6 +11,7 @@ const { Note } = require('lib/models/note.js'); const { Tag } = require('lib/models/tag.js'); const { Setting } = require('lib/models/setting.js'); const { Logger } = require('lib/logger.js'); +const { splitCommandString } = require('lib/string-utils.js'); const { sprintf } = require('sprintf-js'); const { reg } = require('lib/registry.js'); const { fileExtension } = require('lib/path-utils.js'); @@ -63,7 +64,7 @@ class BaseApplication { // Handles the initial flags passed to main script and // returns the remaining args. - async handleStartFlags_(argv) { + async handleStartFlags_(argv, setDefaults = true) { let matched = {}; argv = argv.slice(0); argv.splice(0, 2); // First arguments are the node executable, and the node JS file @@ -118,8 +119,10 @@ class BaseApplication { } } - if (!matched.logLevel) matched.logLevel = Logger.LEVEL_INFO; - if (!matched.env) matched.env = 'prod'; + if (setDefaults) { + if (!matched.logLevel) matched.logLevel = Logger.LEVEL_INFO; + if (!matched.env) matched.env = 'prod'; + } return { matched: matched, @@ -272,6 +275,22 @@ class BaseApplication { reg.dispatch = this.store().dispatch; } + async readFlagsFromFile(flagPath) { + if (!fs.existsSync(flagPath)) return {}; + let flagContent = fs.readFileSync(flagPath, 'utf8'); + if (!flagContent) return {}; + + flagContent = flagContent.trim(); + + let flags = splitCommandString(flagContent); + flags.splice(0, 0, 'cmd'); + flags.splice(0, 0, 'node'); + + flags = await this.handleStartFlags_(flags, false); + + return flags.matched; + } + async start(argv) { let startFlags = await this.handleStartFlags_(argv); @@ -302,6 +321,9 @@ class BaseApplication { await fs.mkdirp(resourceDir, 0o755); await fs.mkdirp(tempDir, 0o755); + const extraFlags = await this.readFlagsFromFile(profileDir + '/flags.txt'); + initArgs = Object.assign(initArgs, extraFlags); + this.logger_.addTarget('file', { path: profileDir + '/log.txt' }); //this.logger_.addTarget('console'); this.logger_.setLevel(initArgs.logLevel); diff --git a/ReactNativeClient/lib/string-utils.js b/ReactNativeClient/lib/string-utils.js index 47c6c6ffe..b794063bf 100644 --- a/ReactNativeClient/lib/string-utils.js +++ b/ReactNativeClient/lib/string-utils.js @@ -122,4 +122,73 @@ function wrap(text, indent, width) { }); } -module.exports = { removeDiacritics, escapeFilename, wrap }; \ No newline at end of file +function splitCommandString(command) { + let args = []; + let state = "start" + let current = "" + let quote = "\"" + let escapeNext = false; + for (let i = 0; i < command.length; i++) { + let c = command[i] + + if (state == "quotes") { + if (c != quote) { + current += c + } else { + args.push(current) + current = "" + state = "start" + } + continue + } + + if (escapeNext) { + current += c; + escapeNext = false; + continue; + } + + if (c == "\\") { + escapeNext = true; + continue; + } + + if (c == '"' || c == '\'') { + state = "quotes" + quote = c + continue + } + + if (state == "arg") { + if (c == ' ' || c == '\t') { + args.push(current) + current = "" + state = "start" + } else { + current += c + } + continue + } + + if (c != ' ' && c != "\t") { + state = "arg" + current += c + } + } + + if (state == "quotes") { + throw new Error("Unclosed quote in command line: " + command) + } + + if (current != "") { + args.push(current) + } + + if (args.length <= 0) { + throw new Error("Empty command line") + } + + return args; +} + +module.exports = { removeDiacritics, escapeFilename, wrap, splitCommandString }; \ No newline at end of file