changeset 3573:813595f88612

merge changes from main branch
author Goffi <goffi@goffi.org>
date Thu, 17 Jun 2021 13:05:58 +0200
parents 888109774673 (current diff) b3fa179417e7 (diff)
children 8dd5e1bac9c3
files sat/core/xmpp.py sat/plugins/plugin_xep_0045.py sat/plugins/plugin_xep_0313.py sat/plugins/plugin_xep_0329.py setup.py
diffstat 69 files changed, 26013 insertions(+), 8196 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu Jun 03 15:21:43 2021 +0200
+++ b/.hgignore	Thu Jun 17 13:05:58 2021 +0200
@@ -15,3 +15,5 @@
 build
 ctags_links/
 Session.vim
+.build
+.pytest_cache
--- a/doc/configuration.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/configuration.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -6,14 +6,14 @@
 
 Libervia main configuration is set in a file named ``libervia.conf`` (which may be prefixed
 by a ``.`` if you want to hide it on suitable platforms). It is a common file used both by
-backend and all frontends (and even related project like SàT Pubsub).
+backend and all frontends (and even related project like Libervia Pubsub).
 
 This file can be located in the following paths (in order of parsing):
   - ``/etc``
   - ``~`` (``$HOME`` or your home directory)
   - XDG directory for configuration (most of time it is
     ``~/.config/libervia/``)
-  - the parent directory of SàT installation path
+  - the parent directory of Libervia installation path
 
 If several configurations files are found, they are merged. In case of conflict, the
 option parsed last is the one used (in other words: if you have an option set in
@@ -31,7 +31,7 @@
 
 Each frontend can have specific section with its name in lowercase (sections are case
 sensitive), and some backend plugin can use specific sections too (usually named ``plugin
-<plugin name>``). The ``pubsub`` section is used by ``SàT PubSub``. A section can also
+<plugin name>``). The ``pubsub`` section is used by ``Libervia PubSub``. A section can also
 have the name of a web site used with Libervia web framework.
 
 
@@ -53,7 +53,7 @@
   - ``[plugin muc]``
   - ``[plugin search]``
 ``[pubsub]``
-  SàT PubSub settings
+  Libervia PubSub settings
 ``[<website name>]``
   the settings of a website for Libervia web framework
 
@@ -83,7 +83,7 @@
 .. sourcecode:: cfg
 
     [DEFAULT]
-    ; where SàT media are located
+    ; where Libervia media are located
     media_dir = ~/workspace/sat_media
     log_level = debug
     ; domain used for new accounts
--- a/doc/installation.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/installation.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -4,7 +4,7 @@
 Installation
 ============
 
-This are the instructions to install SàT using Python.
+This are the instructions to install Libervia using Python.
 Note that if you are using GNU/Linux, Libervia may already be present on your distribution.
 
 Libervia is made of one backend, and several frontends. To use it, the first thing to do is to install the backend.
@@ -42,28 +42,28 @@
 
   $ cd
 
-And enter the following commands (here we install SàT with SVG support, which is needed to
+And enter the following commands (here we install Libervia with SVG support, which is needed to
 display SVG avatars on some frontends)::
 
-  $ python3 -m venv sat
-  $ source sat/bin/activate
-  $ pip install wheel
-  $ pip install hg+https://repos.goffi.org/sat_tmp hg+https://repos.goffi.org/sat_templates "hg+https://repos.goffi.org/sat#egg=sat[SVG]"
+  $ python3 -m venv libervia
+  $ source libervia/bin/activate
+  $ pip install -U pip wheel
+  $ pip install -r requirements.txt
 
-Don't worry if you see the following message, SàT should work anyway::
+Don't worry if you see the following message, Libervia should work anyway::
 
   Failed building wheel for pygobject
 
-After installing SàT, you need to install the media::
+After installing Libervia, you need to install the media::
 
   $ cd
   $ hg clone https://repos.goffi.org/sat_media
 
-then, create the directory ``~/.config/sat``::
+then, create the directory ``~/.config/libervia``::
 
-  $ mkdir -p ~/.config/sat
+  $ mkdir -p ~/.config/libervia
 
-and the file ``~/.config/sat/libervia.conf`` containing:
+and the file ``~/.config/libervia/libervia.conf`` containing:
 
 .. sourcecode:: cfg
 
@@ -77,38 +77,41 @@
 Usage
 =====
 
-To launch the sat backend, enter::
+To launch the Libervia backend, enter::
 
-  $ sat
+  $ libervia-backend
 
 …or, if you want to launch it in foreground::
 
-  $ sat fg
+  $ libervia-backend fg
 
 You can stop it with::
 
-  $ sat stop
+  $ libervia-backend stop
 
 To know if backend is launched or not::
 
-  $ sat status
+  $ libervia-backend status
 
-**NOTE**: since SàT v0.5.0, the backend is automatically launched when a frontend needs it.
+**NOTE**: if ``misc/org.libervia.Libervia.service`` is installed correctly (which should
+be done by during the installation), the backend is automatically launched when a frontend
+needs it.
 
-You can check that SàT is installed correctly by trying jp (the backend need to be launched first, check below)::
+You can check that Libervia is installed correctly by trying jp (the backend need to be
+launched first, check below)::
 
-  $ jp --version
-  jp 0.8.0D « La Cecília » (rev df26f1a9020a [M] (default 2020-04-14 21:01 +0200) +231) Copyright (C) 2009-2020 Jérôme Poisson, Adrien Cossa
+  $ li --version
+  Libervia CLI 0.8.0D « La Cecília » (rev 184c66256bbc [M] (default 2021-06-09 11:35 +0200) +524) Copyright (C) 2009-2021 Jérôme Poisson, Adrien Cossa
   This program comes with ABSOLUTELY NO WARRANTY;
   This is free software, and you are welcome to redistribute it under certain conditions.
 
-If you have a similar output, SàT is working.
+If you have a similar output, Libervia is working.
 
 .. note::
 
   if you have the message ``/!\ D-Bus is not launched, please see README to see
   instructions on how to launch it`` that mean that the D-Bus service is not launched, this
-  usually happens when launching SàT on a server, without graphic interface like X.org or
+  usually happens when launching Libervia on a server, without graphic interface like X.org or
   Wayland (in which case D-Bus service should be launcher automatically).
 
   As the message states, instructions on how to launch the service are given in the README
@@ -119,27 +122,27 @@
 
 So far, the following frontends exist and are actively maintained:
 
-Cagou
+Libervia Desktop (aka Cagou)
   desktop/mobile (Android) frontend
 
-Libervia
+Libervia Web
   the web frontend
 
-Primitivus
+Libervia TUI (aka Primitivus)
   Text User Interface
 
-jp
+Libervia CLI (aka jp or li)
   Command Line Interface
 
-To launch Primitivus, just type::
+To launch Libervia TUI, just type::
 
-  $ primitivus
+  $ libervia-tui
 
 then create a profile (XMPP account must already exist).
 
-To use jp, follow its help::
+To use Libervia CLI, follow its help (``li`` is a shortcut for ``libervia-cli``)::
 
-  $ jp --help
+  $ li --help
 
 
 There are some other frontends:
--- a/doc/libervia-cli/account.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/account.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -16,14 +16,14 @@
 ``-P PORT, --port PORT``. You may also specify an e-mail address using ``-e EMAIL, --email
 EMAIL`` (use of this data depend of the server implementation).
 
-By default, no SàT profile is created and associated to this new XMPP account, but you can
+By default, no Libervia profile is created and associated to this new XMPP account, but you can
 use ``-p PROFILE, --profile PROFILE`` if you are willing to have one.
 
 example
 -------
 
 Create account for the new user Nestor at ``nestor@example.org`` and associate it with the
-SàT profile ``nestor``::
+Libervia profile ``nestor``::
 
   $ li account create nestor@example.org some_password -p nestor
 
@@ -37,9 +37,9 @@
 .. note::
 
    Only the XMPP password on the server is changed, not the one registered in the
-   parameter of SàT. You may have to update the parameter of your profile if the new
+   parameter of Libervia. You may have to update the parameter of your profile if the new
    password doesn't correspond to your parameters one (you can do that with li param set
-   or with most SàT frontends in parameters).
+   or with most Libervia frontends in parameters).
 
 example
 -------
--- a/doc/libervia-cli/ad-hoc.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/ad-hoc.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -102,7 +102,7 @@
 
 .. note::
 
-   SàT already creates automatically a remote control if it finds a media player. This
+   Libervia already creates automatically a remote control if it finds a media player. This
    manual way to create a remote control predate the automatic remote control, and is
    currently more flexible in that you can specify who can access the remote control
    (automatic remote control is only accessible by the jid of the profile).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/libervia-cli/appication.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -0,0 +1,68 @@
+=============================================
+application: external applications management
+=============================================
+
+Libervia can launch and manage external applications. This is useful to integrate external
+services, notably in the web frontend. The command can be used either with ``application``
+or the shortcut ``app``.
+
+list
+====
+
+List available applications. This command can show either the list of available
+application (which could be launched) and/or the list of running application.
+
+By default both available and running application are shown, this can be filtered by using
+``-f {available,running}, --filter {available,running}``
+
+example
+-------
+
+List available applications::
+
+  $ li app list -f available
+
+start
+=====
+
+Start an application. Depending on the application and its availability locally, this make
+take some time (resources may have to be downloaded).
+
+example
+-------
+
+Start Weblate::
+
+  $ li app start weblate
+
+.. _li_app_stop:
+
+stop
+=====
+
+Stop an application. If several instances of the same application are running, ``-i ID,
+--id ID`` can be used to specify which one must be stopped.
+
+example
+-------
+
+Stop Weblate::
+
+  $ li app stop weblate
+
+
+exposed
+=======
+
+List exposed values from a running application. Exposed values may be the port used,
+passwords automatically generated, or fields useful for web integration.
+
+As for :ref:`li_app_stop`, if several instances of the same application are running, one
+can be specified using ``-i ID, --id ID``.
+
+example
+-------
+
+Show exposed values of a running Weblate::
+
+  $ li account application exposed weblate
--- a/doc/libervia-cli/avatar.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/avatar.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -2,7 +2,7 @@
 avatar: retrieve/upload avatars
 ===============================
 
-Avatars are images associated to an XMPP entity. Several XMPP extensions are in use, SàT
+Avatars are images associated to an XMPP entity. Several XMPP extensions are in use, Libervia
 tries to hide the technical details so avatar are as easy as possible to manipulate for
 end-user.
 
@@ -12,11 +12,11 @@
 Retrieve the avatar of the given entity. Entity jid is specified as positional argument.
 
 If an avatar is found, a path to its cached file is printed. Please note that this is the
-cache used by all SàT ecosystem, **do not modify the cached image**. You may use it for
+cache used by all Libervia ecosystem, **do not modify the cached image**. You may use it for
 read-only access, or copy it if you want to modify the image.
 
 You may use the ``-s, --show`` argument to display the found avatar. The software used to
-display the image can be specified in SàT configuration (cf. :ref:`configuration`), in the
+display the image can be specified in Libervia configuration (cf. :ref:`configuration`), in the
 ``[li]`` section: the ``image_cmd`` setting let you specify the path to the software. If
 ``image_cmd`` is not used, ``li`` will try some common software, and if none is found, it
 will try to open the image in a browser (which may sometimes result in using the default
--- a/doc/libervia-cli/blog.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/blog.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -243,6 +243,20 @@
 the first ``markdown`` is the name of the syntax (could be an other syntax like ``xhtml``),
 while the second if the file extension.
 
+rename
+======
+
+Move a item to a new ID. This works the same as :ref:`li-pubsub_rename`, the only
+difference is that node defaults to microblog default namespace.
+
+example
+-------
+
+After a typo, a use want to rename the blog item with ID ``my_great_tittle_123a`` to
+``my_great_title_123a``::
+
+  $ li blog rename -i my_great_tittle_123a my_great_title_123a
+
 preview
 =======
 
@@ -250,12 +264,12 @@
 detected. Configuration is the same as for `edit preview <edit_preview_>`_. This can be
 used if you have already started an edition with ``li blog edit`` but forgot to use the ``-P, --preview`` arguments.
 
-example:
---------
+example
+-------
 
-Preview the draft at ``~/local/sat/blog/some_name/blog_something.md``::
+Preview the draft at ``~/.local/share/libervia/blog/some_name/blog_something.md``::
 
-  $ li blog preview ~/local/sat/blog/some_name/blog_something.md
+  $ li blog preview ~/.local/share/libervia/blog/some_name/blog_something.md
 
 .. _libervia-cli_blog_import:
 
--- a/doc/libervia-cli/bookmarks.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/bookmarks.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -3,13 +3,13 @@
 ============================
 
 Bookmarks are links to MUC rooms or URLs with a few metadata. Due to historical reasons,
-XMPP has several ways to handle bookmarks, and SàT handle them as transparently as
+XMPP has several ways to handle bookmarks, and Libervia handle them as transparently as
 possible.
 
-With SàT there are 3 places where you can get/store your bookmarks:
+With Libervia there are 3 places where you can get/store your bookmarks:
 
 local
-  the bookmarks is stored only locally in the database of SàT. It won't be available to
+  the bookmarks is stored only locally in the database of Libervia. It won't be available to
   other devices.
 private
   the bookmarks use the old private XML storage (`XEP-0049`_). It is not recommended to
@@ -18,7 +18,7 @@
   the bookmarks use PEP storage (`XEP-0223`_), this is the currently recommended way to
   store bookmarks.
 
-When possible, you can specify ``auto`` to let SàT choose the best location (i.e.
+When possible, you can specify ``auto`` to let Libervia choose the best location (i.e.
 ``pubsub`` if available, then ``private`` then ``local`` if nothing else is possible).
 
 .. _XEP-0049: https://xmpp.org/extensions/xep-0049.html
@@ -95,4 +95,4 @@
 
 Add a link to Libervia official website::
 
-  $ li bookmarks add -t url https://www.salut-a-toi.org -n "SàT officiel"
+  $ li bookmarks add -t url https://www.salut-a-toi.org -n "Libervia officiel"
--- a/doc/libervia-cli/debug.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/debug.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -2,7 +2,7 @@
 debug: tools to help debugging/monitoring Libervia
 =====================================================
 
-``debug`` groups commands to monitor or manipulate SàT and XMPP stream.
+``debug`` groups commands to monitor or manipulate Libervia and XMPP stream.
 
 .. _libervia-cli_debug_bridge_method:
 
@@ -37,7 +37,7 @@
 
   This is for debugging only, if you want to send message with li, use :ref:`libervia-cli_message_send`.
 
-Get version string of SàT::
+Get version string of Libervia::
 
   $ li debug bridge method getVersion
 
--- a/doc/libervia-cli/encryption.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/encryption.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -3,7 +3,7 @@
 ========================================
 
 Libervia being an XMPP client does encryption by default between client and server. In
-addition, SàT is also capable of doing end-to-end (e2e) encryption, meaning that the
+addition, Libervia is also capable of doing end-to-end (e2e) encryption, meaning that the
 payload of messages are encrypted to be hidden from the servers (and their
 administrators).  The ``encryption`` commands are here to handle those e2e encryption
 sessions and algorithms.
@@ -56,7 +56,7 @@
 You need to specify the JID of the entity you want to start a session with as a positional
 argument.
 
-By default, SàT will select itself the algorithm to use among those available, but you can
+By default, Libervia will select itself the algorithm to use among those available, but you can
 specify one using either its name with ``-n NAME, --name NAME`` or its namespace using
 ``-N NAMESPACE, --namespace``. ``NAME`` is the short name of the algorithm, e.g. ``omemo``
 while the namespace is the longer (e.g. ``urn:xmpp:otr:0``).
@@ -72,7 +72,7 @@
 examples
 --------
 
-Start e2e encryption with Pierre, using the algorithm selected by SàT::
+Start e2e encryption with Pierre, using the algorithm selected by Libervia::
 
   $ li encryption start louise@example.net
 
@@ -87,7 +87,7 @@
 argument.
 
 After this command is run, the messages with specified entity will not be e2e encrypted
-anymore (but this won't affect encryption between SàT and XMPP server and between XMPP
+anymore (but this won't affect encryption between Libervia and XMPP server and between XMPP
 servers).
 
 example
--- a/doc/libervia-cli/file.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/file.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -31,7 +31,7 @@
 specify another one.
 
 The path and namespace (set with ``-d PATH, --path PATH`` and ``-N NAMESPACE, --namespace
-NAMESPACE``) are non-standard metadata used by SàT to organise files (``PATH`` being like
+NAMESPACE``) are non-standard metadata used by Libervia to organise files (``PATH`` being like
 a file path on locale file system, and ``NAMESPACE`` being a name to associate to a group
 of files, for instance for a photo album).
 
@@ -56,7 +56,7 @@
 metadata, which can be the file name (with ``-n NAME, --name NAME``), its hash (with ``-H
 HASH, --hash HASH`` and the algorithm may be specified with ``-a HASH_ALGO, --hash-algo
 HASH_ALGO``), its path (with ``-d PATH, --path PATH``) and its namespace (with ``-N
-NAMESPACE, --namespace NAMESPACE``). Note that ``PATH`` and ``NAMESPACE`` are SàT specific
+NAMESPACE, --namespace NAMESPACE``). Note that ``PATH`` and ``NAMESPACE`` are Libervia specific
 and not (yet?) XMPP standards.
 
 If you already know the hash, it's the most efficient and recommended way to retrieve a
--- a/doc/libervia-cli/file_share_affiliations.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/file_share_affiliations.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -7,7 +7,7 @@
 ``affiliations`` let you manage access permission to your shared files repository, in a
 way similar as for pubsub.
 
-Affiliations with file sharing are not standard and will only work with the SàT file
+Affiliations with file sharing are not standard and will only work with the Libervia file
 sharing component.
 
 Affiliations are similar to pubsub ones:
--- a/doc/libervia-cli/file_share_configuration.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/file_share_configuration.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -5,7 +5,7 @@
 =========================================================
 
 ``configuration`` commands are use to check or modify settings of a file sharing node.
-This is not standard and specific to SàT file sharing component.
+This is not standard and specific to Libervia file sharing component.
 
 The configuration is similar as pubsub one.
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/libervia-cli/list.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -0,0 +1,111 @@
+=================================
+list: create and manage lists
+=================================
+
+list is a generic tools to create items with metadata and states (where state can be
+``queued``, ``done``, etc). This can be used for many things, from TODO list to bugs
+management.
+
+get
+===
+
+Retrieve one or more lists and display them. A project may use magic string in README to
+indicate PubSub service and node to use, in which case use just need to be in the
+directory of the project.
+
+examples
+--------
+
+Retrieve last 5 lists (ordered by creation) from a project using magic string in README::
+
+  $ li list get -m 5 -o creation
+
+Retrieve the list with id ``123`` on service ``pubsub.example.org``::
+
+  $ li list get -s pubsub.example.org -i 123
+
+
+set
+===
+
+Create/replace or update a list item. You can specify fields using the ``-f NAME [VALUES
+...], --field NAME [VALUES ...]``, several values can be set. For ``text-multi`` (multiple
+lines of text), each line is set in distinct value.
+
+The ``-U {auto,true,false}, --update {auto,true,false}`` indicates if the item must be
+updated (non specified values are kept) or fully replaced (non specified values would then
+be default, even if they were previously set in the item). If ``auto`` is used (this is
+the default), ``--update=true`` is used when ``item_id`` is specified, otherwise a new
+item is created.
+
+If ``-n NODE, --node NODE`` is not specified, it uses tickets default namespace.
+
+examples
+--------
+
+Modify priority of a ticket with id ``123`` to ``major`` (the ticket is updated and not
+replaced due to the default ``--update auto``)::
+
+  $ li list set -s pubsub.example.org -i 123 -f priority major
+
+Set ``body`` for a new item when its schemas makes it a ``text-multi``::
+
+  $ li list set -s pubsub.example.org -f body "line 1" "line 2" "line 3"
+
+delete
+======
+
+Delete an item from a list. The options are the same as for :ref:`li_pubsub_delete`, the
+only different is that ``-n NODE, --node NODE`` defaults to tickets namespace.
+
+example
+-------
+
+Delete item with id ``456`` from tickets on PubSub service ``pubsub.example.org``::
+
+  $ li pubsub delete -s pubsub.example.org -i 456
+
+import
+======
+
+Import lists from an external source. This works in the same way as
+:ref:`libervia-cli_blog_import`: you need to specify an importer and a data location. If you let
+both positional argument empty, you'll get list of importers, if you specify importer but
+not data location, you'll get a description on how the importer works.
+
+If you want to see a progress bar for the import, use the ``-P, --progress`` option, this
+is recommended for most imports.
+
+Some importers may have specific option (check description for details), you can specify
+them with ``o NAME VALUE, --option NAME VALUE``
+
+When you import a list, the list will be created according to the schema of the PubSub
+node. By default, the metadata of the original list will be put to the one of the same
+name in the dest PubSub item. But of course the schema of your destination PubSub node may
+differ from the original metadata. In this case, you can use ``-m IMPORTED_FIELD
+DEST_FIELD, --map IMPORTED_FIELD DEST_FIELD`` to specify how the mapping mus be done
+(``IMPORTED_FIELD is the name of the field in the original list, while ``DEST_FIELD`` if
+the name of the field in your node schema).
+
+
+examples
+--------
+
+Get list of list importers::
+
+  $ li list import
+
+Get description of list importer for Bugzilla::
+
+  $ li list import bugzilla
+
+Import lists from a Bugzilla XML export file at ``~/bugzilla_export.xml`` to the
+``pubsub.example.org`` PubSub service. We use default lists node and want a progression
+bar::
+
+  $ li list import -P -s pubsub.example.org ~/bugzilla_export.xml
+
+Same import, but this time we want to map the field ``assigned_to_name`` from Bugzilla to
+the field ``assigned_to`` in our schema::
+
+  $ li list import -P -s pubsub.example.org -m assigned_to_name assigned_to ~/bugzilla_export.xml
--- a/doc/libervia-cli/message.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/message.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -50,10 +50,10 @@
 
   $ li message mam -S "2 days ago"
 
-Retrieve messages from last 5 hours on SàT official chat room::
+Retrieve messages from last 5 hours on Libervia official chat room::
 
   $ li message mam -S "5 hours ago" -s sat@chat.jabberfr.org
 
-Retrieve 2 first messages of 2019 on SàT official chat room::
+Retrieve 2 first messages of 2019 on Libervia official chat room::
 
   $ li message mam -S 2019-01-01 -s sat@chat.jabberfr.org -m 2
--- a/doc/libervia-cli/param.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/param.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -1,6 +1,6 @@
-============================
-param: manage SàT parameters
-============================
+=================================
+param: manage Libervia parameters
+=================================
 
 ``param`` commands allows to retrieve or set parameters as well as to export/import them
 to a XML file.
@@ -63,7 +63,7 @@
 set
 ===
 
-As expected, this command set a SàT parameter. The ``category``, ``name`` and ``value``
+As expected, this command set a Libervia parameter. The ``category``, ``name`` and ``value``
 are needed as positional arguments.
 
 ``--security-limit SECURITY_LIMIT`` can be used if you want an update to be rejected if
--- a/doc/libervia-cli/pipe.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/pipe.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -36,8 +36,8 @@
 
 Send a video to louise::
 
- $ li pipe out louise@example.org/sat < some_video.webm
+ $ li pipe out louise@example.org/libervia.123 < some_video.webm
 
 Send output from ``cal`` command to louise::
 
- $ cal | li pipe out louise@example.org/sat
+ $ cal | li pipe out louise@example.org/libervia.123
--- a/doc/libervia-cli/profile.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/profile.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -1,8 +1,8 @@
-=============================
-profile: SàT profile handling
-=============================
+==================================
+profile: Libervia profile handling
+==================================
 
-Profiles are the names associated with accounts in SàT, for more informations you can
+Profiles are the names associated with accounts in Libervia, for more informations you can
 check :ref:`glossary`. The `profile` commands help you create/delete/modify and manage
 profiles.
 
@@ -12,7 +12,7 @@
 
 Unsurprisingly this command connects your profile, i.e. log-in your XMPP account. This
 command uses :ref:`libervia-cli_common_profile` common commands, so you can use either ``-c,
---connect`` to connect to XMPP server, or ``--start-session`` if you want to start SàT
+--connect`` to connect to XMPP server, or ``--start-session`` if you want to start Libervia
 profile session without connecting to XMPP server (for instance if you want to modify
 parameters without connecting to XMPP server).
 
@@ -45,13 +45,13 @@
 create
 ======
 
-Create a new SàT profile. The only mandatory argument is the profile name, but you'll
+Create a new Libervia profile. The only mandatory argument is the profile name, but you'll
 probably want to associate an XMPP jid with ``-j JID, --jid JID`` and a profile password
 with ``-p PASSWORD, --password PASSWORD``. By default, profile password will be used for
 XMPP password (see note below), but you may specify XMPP password with ``-x PASSWORD,
 --xmpp-password PASSWORD``.
 
-SàT is also capable to manage components, which can be seen as XMPP server independent
+Libervia is also capable to manage components, which can be seen as XMPP server independent
 plugins. To create a component profile, you'll have to use ``-C COMPONENT, --component
 COMPONENT`` where ``COMPONENT`` is the component entry point (check the documentation of
 the component that you want to use to get its entry point).
@@ -62,12 +62,12 @@
 .. note::
 
    profile password and XMPP password are not the same: the profile password is the
-   password of your SàT profile, while the XMPP password is the one checked by your XMPP
+   password of your Libervia profile, while the XMPP password is the one checked by your XMPP
    server. If specify a jid with ``--jid`` and you don't specify an XMPP password, the
    profile password will be used by default.
 
    The reason to have distinct password is that you may use a different password for
-   profile, including an empty one if you want SàT to connect your profile without
+   profile, including an empty one if you want Libervia to connect your profile without
    having to enter a password. Also the XMPP password is encrypted in database using the
    profile password (which is not stored in database, only a hash is kept).
 
@@ -77,7 +77,7 @@
    passwords in li are currently specified directly on the command-line and not prompted,
    this is not safe from a security point of view as people can see it on the screen, it
    may stay in your shell history, or visible on process list. Keep that in mind if you're
-   in a public environment or on a public machine. This will be improved for SàT 0.8.
+   in a public environment or on a public machine. This will be improved for Libervia 0.8.
 
 examples
 --------
@@ -91,10 +91,11 @@
 ``file_sharing``). The jid of the service is specified with ``--jid`` (note that we don't
 use a node as it is a jid of a component) and the ``--xmpp-password`` is the shared
 secret. Here the profile password is kept empty to not have to enter manually the XMPP
-password each time we connect the service::
+password each time we connect the service. We use the ``-A`` option to set
+autoconnection::
 
   $ li profile create file_sharing -j files.example.org -p "" --xmpp-password
-  some_shared_secret -C file_sharing
+  some_shared_secret -C file_sharing -A
 
 
 default
@@ -115,7 +116,7 @@
 delete
 ======
 
-Delete a profile and all its associated data. This delete the SàT profile and associated
+Delete a profile and all its associated data. This delete the Libervia profile and associated
 data (i.e. local data), but doesn't request the XMPP server to delete anything.
 
 By default a confirmation is requested, use ``-f, --force`` to avoid it (be cautious with
@@ -175,8 +176,8 @@
 .. note::
 
    Be cautious with ``--disable-password`` that means that no password will be needed with
-   any frontend of SàT to use this profile, and that XMPP password will be easy to
-   retrieve for anybody having an access to the machine where SàT is installed
+   any frontend of Libervia to use this profile, and that XMPP password will be easy to
+   retrieve for anybody having an access to the machine where Libervia is installed
 
 examples
 --------
--- a/doc/libervia-cli/pubsub.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/pubsub.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -45,6 +45,8 @@
 
   $ li pubsub get -n notes -m 5
 
+.. _li_pubsub_delete:
+
 delete
 ======
 
@@ -77,6 +79,25 @@
 
   $ li pubsub edit -n notes -L
 
+.. _li-pubsub_rename:
+
+rename
+======
+
+Move a item to a new ID. As there is currently no "rename" or "move" operation in XMPP
+PubSub, this is done by republishing the item with the new ID, then deleting the old item
+if the publication succeed.
+
+This is notably useful when user friendly URL based on ID are used, and one need to fix a
+typo or something else.
+
+example
+-------
+
+Rename a PubSub item with ID ``123`` to ``456``::
+
+  $ li pubsub rename -n some_node -i 123 456
+
 subscribe
 =========
 
@@ -292,7 +313,7 @@
 
 If you have to modify the ``publisher`` of an item, you need specific privileges. The
 ``--admin`` allows you do to that, but it must be supported by your PubSub service
-(currently only ``SàT PubSub`` supports this non standard feature).
+(currently only ``Libervia PubSub`` supports this non standard feature).
 
 To modify all items of a node, use the ``-A, --all`` option. This will use `RSM`_
 repetitively until all items are treated. Of course that means that your PubSub service
--- a/doc/libervia-cli/pubsub_hook.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/pubsub_hook.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -19,13 +19,13 @@
 
 ``python_code``
   Python code which will be directly executed. 3 variables will be set: ``host`` which
-  contain the main SàT instance, ``client`` which contain the session attached to the
+  contain the main Libervia instance, ``client`` which contain the session attached to the
   profile, and ``item`` which contain the item attached to the event.
 
 .. note::
 
-   Hooks are executed in SàT context, and must be asynchronous. If they block, the whole
-   SàT execution will be blocked. They have access to everything, so don't run a code that
+   Hooks are executed in Libervia context, and must be asynchronous. If they block, the whole
+   Libervia execution will be blocked. They have access to everything, so don't run a code that
    you don't absolutely trust.
 
 .. note::
--- a/doc/libervia-cli/pubsub_node_schema.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/pubsub_node_schema.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -5,7 +5,7 @@
 =========================================
 
 ``node schema`` is an experimental feature to associate a data form with a PubSub node, and
-reject items not following this form. This feature is currently only available with SàT
+reject items not following this form. This feature is currently only available with Libervia
 PubSub.
 
 Those commands can only be used by an owner of the node.
--- a/doc/libervia-cli/roster.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/roster.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -107,9 +107,9 @@
 This command is used to remove from the roster all contacts which have no subscription or
 only partial subscription.
 
-By default, only contacts without subscription at all are removed. With ``--no_from`` you
+By default, only contacts without subscription at all are removed. With ``--no-from`` you
 also remove contacts which have no subscription to you (but you have a subscription to
-them), and with ``--no_to`` you also remove contacts that you are not subscribed to (but
+them), and with ``--no-to`` you also remove contacts that you are not subscribed to (but
 who are subscribed to you).
 
 example
@@ -118,12 +118,12 @@
 Remove all contacts from default profile which have no subscription at all or from which
 the default profile is not subscribed to::
 
-  $ li roster purge --no_to
+  $ li roster purge --no-to
 
 resync
 ======
 
-SàT uses `roster versioning`_ to optimize the synchronisation of roster with server on
+Libervia uses `roster versioning`_ to optimize the synchronisation of roster with server on
 client connection. This means that once the roster has been retrieved, on each following
 connection, only the difference of contacts (i.e. which new or removed contacts) is
 received.
--- a/doc/libervia-cli/shell.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/libervia-cli/shell.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -1,6 +1,6 @@
-========================
-shell: use SàT with REPL
-========================
+=============================
+shell: use Libervia with REPL
+=============================
 
 ``shell`` launch a read–eval–print loop (REPL) with some helpers to launch li commands.
 This is useful if you are willing to a session when you'll use several commands in a row
--- a/doc/libervia-cli/ticket.rst	Thu Jun 03 15:21:43 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-=================================
-ticket: create and manage tickets
-=================================
-
-Ticket is a generic tools to create items with metadata and states (where state can be
-``queued``, ``done``, etc). This can be used for many things, from TODO list to bugs
-management.
-
-get
-===
-
-Retrieve one or more tickets and display them. A project may use magic string in README to
-indicate PubSub service and node to use, in which case use just need to be in the
-directory of the project.
-
-examples
---------
-
-Retrieve last 5 tickets (ordered by creation) from a project using magic string in README::
-
-  $ li ticket get -m 5 -o creation
-
-Retrieve the ticket with id ``123`` on service ``pubsub.example.org``::
-
-  $ li ticket get -s pubsub.example.org -i 123
-
-
-
-import
-======
-
-Import tickets from an external source. This works in the same way as
-:ref:`libervia-cli_blog_import`: you need to specify an importer and a data location. If you let
-both positional argument empty, you'll get list of importers, if you specify importer but
-not data location, you'll get a description on how the importer works.
-
-If you want to see a progress bar for the import, use the ``-P, --progress`` option, this
-is recommended for most imports.
-
-Some importers may have specific option (check description for details), you can specify
-them with ``o NAME VALUE, --option NAME VALUE``
-
-When you import a ticket, the ticket will be created according to the schema of the PubSub
-node. By default, the metadata of the original ticket will be put to the one of the same
-name in the dest PubSub item. But of course the schema of your destination PubSub node may
-differ from the original metadata. In this case, you can use ``-m IMPORTED_FIELD
-DEST_FIELD, --map IMPORTED_FIELD DEST_FIELD`` to specify how the mapping mus be done
-(``IMPORTED_FIELD is the name of the field in the original ticket, while ``DEST_FIELD`` if
-the name of the field in your node schema).
-
-
-examples
---------
-
-Get list of ticket importers::
-
-  $ li ticket import
-
-Get description of ticket importer for Bugzilla::
-
-  $ li ticket import bugzilla
-
-Import tickets from a Bugzilla XML export file at ``~/bugzilla_export.xml`` to the
-``pubsub.example.org`` PubSub service. We use default tickets node and want a progression
-bar::
-
-  $ li ticket import -P -s pubsub.example.org ~/bugzilla_export.xml
-
-Same import, but this time we want to map the field ``assigned_to_name`` from Bugzilla to
-the field ``assigned_to`` in our schema::
-
-  $ li ticket import -P -s pubsub.example.org -m assigned_to_name assigned_to ~/bugzilla_export.xml
--- a/doc/overview.rst	Thu Jun 03 15:21:43 2021 +0200
+++ b/doc/overview.rst	Thu Jun 17 13:05:58 2021 +0200
@@ -41,13 +41,14 @@
 It takes its main configuration from a file named ``libervia.conf`` and can be in different
 locations (see below). It uses data in a directory called ``local_dir``, and which
 default, on suitable platforms, to the corresponding `XDG directory`_, which is most of
-time ``~/.local/share/sat``. In this directory, you'll find the main database in the
-``sat.db`` file, which is a `SQLite`_ database.
+time ``~/.local/share/libervia``. In this directory, you'll find the main database in the
+``libervia.db`` file, which is a `SQLite`_ database.
 
-The backend is run and stopped with the ``sat`` executable. Running it without argument
-launch the backend in the background, with ``sat fg`` you run it in the foreground (you'll
-see log directly and can stop the backend with ``Ctrl + c``). The ``sat status`` commands
-help you discover if the backend is running or stopped.
+The backend is run and stopped with the ``libervia-backend`` executable. Running it
+without argument launch the backend in the background, with ``libervia-backend fg`` you
+run it in the foreground (you'll see log directly and can stop the backend with
+``Ctrl + c``). The ``libervia-backend status`` commands help you discover if the backend
+is running or stopped.
 
 .. _XDG directory: https://www.freedesktop.org/wiki/Software/xdg-user-dirs/
 .. _SQLite: https://sqlite.org
--- a/i18n/fr.po	Thu Jun 03 15:21:43 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4286 +0,0 @@
-# JP French Translation.
-# Copyright (C) 2009, 2010 Jérôme Poisson
-# This file is distributed under the same license as the jp package.
-# Jérôme Poisson <goffi@goffi.org>, 2009, 2010.
-# Goffi <goffi@goffi.org>, 2010.
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: 0.0.2\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-24 19:12+0100\n"
-"PO-Revision-Date: 2010-03-05 19:24+1100\n"
-"Last-Translator: Goffi <goffi@goffi.org>\n"
-"Language-Team: French <goffi@goffi.org>\n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: frontends/src/bridge/DBus.py:62
-#: src/bridge/bridge_constructor/dbus_frontend_template.py:62
-#: src/bridge/bridge_constructor/generated/DBus.py:62
-#, fuzzy
-msgid "Unknown interface"
-msgstr "Type d'action inconnu"
-
-#: frontends/src/constants.py:38 frontends/src/constants.py:44
-#: frontends/src/wix/constants.py:39 src/plugins/plugin_xep_0050.py:52
-msgid "Online"
-msgstr "En ligne"
-
-#: frontends/src/constants.py:39 frontends/src/constants.py:45
-#: frontends/src/wix/constants.py:40 src/plugins/plugin_xep_0050.py:54
-msgid "Free for chat"
-msgstr "Libre pour discuter"
-
-#: frontends/src/constants.py:40 frontends/src/constants.py:46
-msgid "Away from keyboard"
-msgstr ""
-
-#: frontends/src/constants.py:41 frontends/src/constants.py:47
-#: src/plugins/plugin_xep_0050.py:55
-msgid "Do not disturb"
-msgstr ""
-
-#: frontends/src/constants.py:42 frontends/src/constants.py:48
-#: frontends/src/wix/constants.py:43 src/plugins/plugin_xep_0050.py:53
-msgid "Away"
-msgstr "Absent"
-
-#: frontends/src/jp/base.py:46
-msgid ""
-"ProgressBar not available, please download it at http://pypi.python.org/pypi/"
-"progressbar"
-msgstr ""
-"ProgressBar n'est pas disponible, veuillez le télécharger à http://pypi."
-"python.org/pypi/progressbar"
-
-#: frontends/src/jp/base.py:47
-msgid ""
-"Progress bar deactivated\n"
-"--\n"
-msgstr ""
-"Barre de progression désactivée\n"
-"--\n"
-
-#: frontends/src/jp/base.py:79 frontends/src/quick_frontend/quick_app.py:43
-msgid "Can't connect to SàT backend, are you sure it's launched ?"
-msgstr ""
-"Impossible de se connecter au démon SàT, êtes vous sûr qu'il est lancé ?"
-
-#: frontends/src/jp/base.py:82 frontends/src/quick_frontend/quick_app.py:46
-#, fuzzy
-msgid "Can't init bridge"
-msgstr "Construction du jeu de Tarot"
-
-#: frontends/src/jp/base.py:90
-msgid "Available commands"
-msgstr ""
-
-#: frontends/src/jp/base.py:112
-#, python-format
-msgid "Use PROFILE profile key (default: %(default)s)"
-msgstr ""
-
-#: frontends/src/jp/base.py:113
-msgid "Connect the profile before doing anything else"
-msgstr ""
-
-#: frontends/src/jp/base.py:117
-msgid "Show progress bar"
-msgstr "Affiche la barre de progression"
-
-#: frontends/src/jp/base.py:145
-#, python-format
-msgid "Invalid module %s"
-msgstr ""
-
-#: frontends/src/jp/base.py:161
-msgid "User interruption: good bye"
-msgstr "Interrompu par l'utilisateur: au revoir"
-
-#: frontends/src/jp/base.py:203
-#, python-format
-msgid "%s is not a valid JID !"
-msgstr "%s n'est pas un JID valide !"
-
-#: frontends/src/jp/base.py:226
-#, fuzzy
-msgid "Can't connect profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/jp/base.py:232
-#, fuzzy, python-format
-msgid "The profile [%s] doesn't exist"
-msgstr "Le fichier [%s] n'existe pas !"
-
-#: frontends/src/jp/base.py:241
-#, fuzzy, python-format
-msgid ""
-"Profile [%(profile)s] is not connected, please connect it before using jp, "
-"or use --connect option"
-msgstr "SAT n'est pas connecté, veuillez le connecter avant d'utiliser jp"
-
-#: frontends/src/jp/base.py:269
-msgid "Progress: "
-msgstr "Progression: "
-
-#: frontends/src/jp/cmd_adhoc.py:34
-#, fuzzy
-msgid "Remote control a software"
-msgstr "Supp&rimer un contact"
-
-#: frontends/src/jp/cmd_adhoc.py:37
-msgid "Software name"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:38
-msgid "Jids allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:39
-msgid "Groups allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:40
-msgid "Groups that are *NOT* allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:41
-msgid "Jids that are *NOT* allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:42
-msgid "Loop on the commands"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:56
-#, fuzzy, python-format
-msgid "Bus name found: [%s]"
-msgstr "Fonctionnalité trouvée: %s"
-
-#: frontends/src/jp/cmd_adhoc.py:59
-#, python-format
-msgid "Command found: (path:%(path)s, iface: %(iface)s) [%(command)s]"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:68
-msgid "Ad-hoc commands"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:33
-#, fuzzy
-msgid "Send a file to a contact"
-msgstr "Attend qu'un fichier soit envoyé par un contact"
-
-#: frontends/src/jp/cmd_file.py:36
-msgid "A list of file"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:37 frontends/src/jp/cmd_message.py:36
-#: frontends/src/jp/cmd_pipe.py:37
-msgid "The destination jid"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:38
-msgid "Make a bzip2 tarball"
-msgstr "Fait un fichier compressé bzip2"
-
-#: frontends/src/jp/cmd_file.py:50
-#, fuzzy, python-format
-msgid "file [%s] doesn't exist !"
-msgstr "Le fichier [%s] n'existe pas !"
-
-#: frontends/src/jp/cmd_file.py:53
-#, python-format
-msgid "[%s] is a dir ! Please send files inside or use compression"
-msgstr ""
-"[%s] est un répertoire ! Veuillez envoyer les fichiers qu'il contient ou "
-"utiliser la compression."
-
-#: frontends/src/jp/cmd_file.py:61
-#, fuzzy, python-format
-msgid "tmp file_ (%s) already exists ! Please remove it"
-msgstr "le fichier temporaire (%s) existe déjà ! Veuillez le supprimer"
-
-#: frontends/src/jp/cmd_file.py:63
-msgid "bz2 is an experimental option at an early dev stage, use with caution"
-msgstr ""
-"bz2 est une option expérimentale à un stade de développement peu avancé, "
-"utilisez-là avec prudence"
-
-#: frontends/src/jp/cmd_file.py:65
-msgid "Starting compression, please wait..."
-msgstr "Lancement de la compression, veuillez patienter..."
-
-#: frontends/src/jp/cmd_file.py:69
-#, python-format
-msgid "Adding %s"
-msgstr "Ajout de %s"
-
-#: frontends/src/jp/cmd_file.py:72
-#, fuzzy
-msgid "Done !"
-msgstr "N° de Tél:"
-
-#: frontends/src/jp/cmd_file.py:85
-msgid "Wait for a file to be sent by a contact"
-msgstr "Attend qu'un fichier soit envoyé par un contact"
-
-#: frontends/src/jp/cmd_file.py:92 frontends/src/jp/cmd_pipe.py:68
-msgid "Jids accepted (none means \"accept everything\")"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:93
-msgid "Accept multiple files (you'll have to stop manually)"
-msgstr ""
-"Accepte plusieurs fichiers (vous devrez arrêter le programme à la main)"
-
-#: frontends/src/jp/cmd_file.py:94
-msgid "Force overwritting of existing files"
-msgstr "Force le remplacement des fichiers existants"
-
-#: frontends/src/jp/cmd_file.py:103
-#, python-format
-msgid "Accepted file [%(filename)s] from %(sender)s"
-msgstr "Le fichier [%(filename)s] de %(sender)s a été accepté"
-
-#: frontends/src/jp/cmd_file.py:107
-#, python-format
-msgid ""
-"Refused file [%(filename)s] from %(sender)s: a file with the same name "
-"already exist"
-msgstr ""
-"Le fichier [%(filename)s] de %(sender)s a été refusé: un fichier avec le "
-"même nom existe déjà"
-
-#: frontends/src/jp/cmd_file.py:125
-msgid "File sending/receiving"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:31
-#, fuzzy
-msgid "Send a message to a contact"
-msgstr "Attend qu'un fichier soit envoyé par un contact"
-
-#: frontends/src/jp/cmd_message.py:34
-msgid ""
-"Separate xmpp messages: send one message per line instead of one message "
-"alone."
-msgstr ""
-"Sépare les messages xmpp: envoi un message par ligne plutôt qu'un seul "
-"message global."
-
-#: frontends/src/jp/cmd_message.py:35
-msgid "Add a new line at the beginning of the input (usefull for ascii art ;))"
-msgstr ""
-"Ajoute un saut de ligne au début de l'entrée (utile pour l'art ascii ;))"
-
-#: frontends/src/jp/cmd_pipe.py:34
-msgid "Pipe a stream out"
-msgstr ""
-
-#: frontends/src/jp/cmd_pipe.py:61
-msgid "Wait for the reception of a pipe stream"
-msgstr ""
-
-#: frontends/src/jp/cmd_pipe.py:87
-msgid "Stream piping through XMPP"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:30
-#, fuzzy
-msgid "The name of the profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/jp/cmd_profile.py:35
-#, fuzzy
-msgid "Delete a profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/jp/cmd_profile.py:50
-#, fuzzy
-msgid "Get information about a profile"
-msgstr "Demande de contacts pour un profile inexistant"
-
-#: frontends/src/jp/cmd_profile.py:76
-#, fuzzy
-msgid "List profiles"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/jp/cmd_profile.py:89
-#, fuzzy
-msgid "Create a new profile"
-msgstr "Veuillez entrer le nom du nouveau profile"
-
-#: frontends/src/jp/cmd_profile.py:92
-#, fuzzy
-msgid "the name of the profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/jp/cmd_profile.py:93
-#, fuzzy
-msgid "the jid of the profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/jp/cmd_profile.py:94
-msgid "the password of the profile"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:115
-#, fuzzy
-msgid "Profile commands"
-msgstr "Mauvais nom de profile"
-
-#: frontends/src/primitivus/card_game.py:266
-#: frontends/src/wix/card_game.py:103
-msgid "Please choose your contrat"
-msgstr "Veuillez choisir votre contrat"
-
-#: frontends/src/primitivus/card_game.py:288
-#: frontends/src/wix/card_game.py:114 src/plugins/plugin_misc_tarot.py:239
-msgid "Draw game"
-msgstr ""
-
-#: frontends/src/primitivus/card_game.py:290
-#: frontends/src/wix/card_game.py:116
-msgid "You win \\o/"
-msgstr "Victoire \\o/"
-
-#: frontends/src/primitivus/card_game.py:290
-#: frontends/src/wix/card_game.py:116
-msgid "You loose :("
-msgstr "Vous perdez :("
-
-#: frontends/src/primitivus/card_game.py:302
-#: frontends/src/wix/card_game.py:134
-msgid "Cards played are invalid !"
-msgstr "Les cartes jouées sont invalides !"
-
-#: frontends/src/primitivus/card_game.py:335
-#: frontends/src/wix/card_game.py:242
-msgid "Do you put these cards in chien ?"
-msgstr "Voulez-vous placer ces cartes au chien ?"
-
-#: frontends/src/primitivus/chat.py:134
-msgid "Game"
-msgstr "Jeu"
-
-#: frontends/src/primitivus/chat.py:135
-msgid "MUC"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:137
-#, fuzzy
-msgid "Configure room"
-msgstr " Configurer l'application"
-
-#: frontends/src/primitivus/chat.py:139
-#, fuzzy
-msgid "Action"
-msgstr "Connexion..."
-
-#: frontends/src/primitivus/chat.py:139
-#, fuzzy
-msgid "Send file"
-msgstr "Envoi un fichier"
-
-#: frontends/src/primitivus/chat.py:318
-#, python-format
-msgid "Primitivus: %s is talking to you"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:320
-#, fuzzy, python-format
-msgid "Primitivus: %(user)s mentioned you in room '%(room)s'"
-msgstr "L'utilisateur %(nick)s a rejoint le salon (%(room_id)s)"
-
-#: frontends/src/primitivus/chat.py:337 frontends/src/wix/chat.py:273
-#, fuzzy
-msgid "Can't start game"
-msgstr "Construction du jeu de Tarot"
-
-#: frontends/src/primitivus/chat.py:337 frontends/src/wix/chat.py:273
-msgid "You need to be exactly 4 peoples in the room to start a Tarot game"
-msgstr ""
-"Vous devez être exactement 4 personnes dans le salon pour commencer un jeu "
-"de Tarot"
-
-#: frontends/src/primitivus/chat.py:345
-#: frontends/src/primitivus/primitivus:458
-#: frontends/src/primitivus/primitivus:460
-#: frontends/src/primitivus/primitivus:523
-#: frontends/src/primitivus/primitivus:549
-#: frontends/src/primitivus/primitivus:559
-#: frontends/src/primitivus/primitivus:578
-#: frontends/src/primitivus/primitivus:597 frontends/src/wix/card_game.py:134
-#: frontends/src/wix/main_window.py:248 frontends/src/wix/main_window.py:255
-#: frontends/src/wix/main_window.py:323 frontends/src/wix/main_window.py:410
-#: frontends/src/wix/main_window.py:458 frontends/src/wix/main_window.py:481
-msgid "Error"
-msgstr "Erreur"
-
-#: frontends/src/primitivus/contact_list.py:44
-#, fuzzy
-msgid "Contacts"
-msgstr "&Contacts"
-
-#: frontends/src/primitivus/primitivus:108
-#, fuzzy, python-format
-msgid "Error while sending message (%s)"
-msgstr "Erreur en tentant de rejoindre le salon"
-
-#: frontends/src/primitivus/primitivus:273
-msgid "Pleeeeasse, I can't even breathe !"
-msgstr "Pitiééééééééé, je ne peux même pas respirer !"
-
-#: frontends/src/primitivus/primitivus:285 frontends/src/wix/profile.py:83
-msgid "General"
-msgstr "Général"
-
-#: frontends/src/primitivus/primitivus:286
-#: frontends/src/primitivus/profile_manager.py:49
-#: frontends/src/wix/profile_manager.py:69
-#, fuzzy
-msgid "Connect"
-msgstr "Connexion..."
-
-#: frontends/src/primitivus/primitivus:287 src/plugins/plugin_xep_0050.py:57
-#, fuzzy
-msgid "Disconnect"
-msgstr "Déconnexion..."
-
-#: frontends/src/primitivus/primitivus:288
-#, fuzzy
-msgid "Parameters"
-msgstr "&Paramètres"
-
-#: frontends/src/primitivus/primitivus:289
-#: frontends/src/primitivus/primitivus:603
-msgid "About"
-msgstr "À propos"
-
-#: frontends/src/primitivus/primitivus:290
-#, fuzzy
-msgid "Exit"
-msgstr "Quitter"
-
-#: frontends/src/primitivus/primitivus:291
-#, fuzzy
-msgid "Contact"
-msgstr "&Contacts"
-
-#: frontends/src/primitivus/primitivus:292
-#, fuzzy
-msgid "Add contact"
-msgstr "&Ajouter un contact"
-
-#: frontends/src/primitivus/primitivus:293
-#, fuzzy
-msgid "Remove contact"
-msgstr "Supp&rimer un contact"
-
-#: frontends/src/primitivus/primitivus:294 src/plugins/plugin_xep_0055.py:56
-#, fuzzy
-msgid "Communication"
-msgstr "Connexion..."
-
-#: frontends/src/primitivus/primitivus:295
-msgid "Join room"
-msgstr "Rejoindre un salon"
-
-#: frontends/src/primitivus/primitivus:307
-#, fuzzy
-msgid "Main menu"
-msgstr "Construction des menus"
-
-#: frontends/src/primitivus/primitivus:354
-#: frontends/src/primitivus/primitivus:382
-#, fuzzy
-msgid "Chat menu"
-msgstr "Construction des menus"
-
-#: frontends/src/primitivus/primitivus:420
-#: frontends/src/wix/main_window.py:203
-#, fuzzy, python-format
-msgid "unmanaged dialog type: %s"
-msgstr "type d'erreur inconnu: %s"
-
-#: frontends/src/primitivus/primitivus:435
-msgid "INTERNAL ERROR: Unexpected class for main widget's footer"
-msgstr ""
-"ERREUR INTERNE: Classe inattendue pour le pied de page du widget principal"
-
-#: frontends/src/primitivus/primitivus:458
-#: frontends/src/wix/main_window.py:247
-#, fuzzy
-msgid "Unmanaged action result"
-msgstr "Tab inconnu"
-
-#: frontends/src/primitivus/primitivus:477
-#: frontends/src/wix/main_window.py:277
-msgid "Where do you want to save the file ?"
-msgstr "Où voulez-vous sauvegarder le fichier ?"
-
-#: frontends/src/primitivus/primitivus:489
-#: frontends/src/wix/main_window.py:271
-#, python-format
-msgid ""
-"The contact %(jid)s wants to send you the file %(filename)s\n"
-"Do you accept ?"
-msgstr ""
-"Le contact %(jid)s veut vous envoyer le fichier %(filename)s\n"
-"Êtes vous d'accord ?"
-
-#: frontends/src/primitivus/primitivus:502
-#: frontends/src/wix/main_window.py:308
-msgid "unknown id, ignoring"
-msgstr "id inconnue, on l'ignore"
-
-#: frontends/src/primitivus/primitivus:508
-#: frontends/src/wix/main_window.py:244 frontends/src/wix/main_window.py:330
-msgid "XML user interface received"
-msgstr "Interface utilisateur XML reçue"
-
-#: frontends/src/primitivus/primitivus:511
-#: frontends/src/wix/main_window.py:333
-msgid "Form"
-msgstr "Formulaire"
-
-#: frontends/src/primitivus/primitivus:513
-#: frontends/src/wix/main_window.py:335
-#, fuzzy
-msgid "Registration"
-msgstr "Échec de l'inscription"
-
-#: frontends/src/primitivus/primitivus:537
-#: frontends/src/wix/main_window.py:352
-#, fuzzy, python-format
-msgid "FIXME FIXME FIXME: type [%s] not implemented"
-msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
-
-#: frontends/src/primitivus/primitivus:547
-#: frontends/src/primitivus/primitivus:557
-#: frontends/src/wix/main_window.py:448 frontends/src/wix/main_window.py:508
-#, fuzzy, python-format
-msgid "'%s' is an invalid JID !"
-msgstr "%s n'est pas un JID valide !"
-
-#: frontends/src/primitivus/primitivus:563
-#: frontends/src/wix/main_window.py:471
-#, python-format
-msgid "Unsubscribing %s presence"
-msgstr "Désinscription à la présence de %s"
-
-#: frontends/src/primitivus/primitivus:578
-#, fuzzy
-msgid "Can't get parameters"
-msgstr "Impossible de charger les paramètres !"
-
-#: frontends/src/primitivus/primitivus:587
-#: frontends/src/wix/main_window.py:502
-msgid "Entering a MUC room"
-msgstr "Entrée dans le salon MUC"
-
-#: frontends/src/primitivus/primitivus:587
-#: frontends/src/wix/main_window.py:500
-#, fuzzy
-msgid "Please enter MUC's JID"
-msgstr "Veuillez entrer le JID de votre nouveau contact"
-
-#: frontends/src/primitivus/primitivus:591
-#: frontends/src/wix/main_window.py:441
-msgid "Adding a contact"
-msgstr "Ajout d'un contact"
-
-#: frontends/src/primitivus/primitivus:591
-#: frontends/src/wix/main_window.py:440
-msgid "Please enter new contact JID"
-msgstr "Veuillez entrer le JID de votre nouveau contact"
-
-#: frontends/src/primitivus/primitivus:597
-#, fuzzy
-msgid "You have not selected any contact to delete !"
-msgstr "Vous n'avez sélectionné aucun contact !"
-
-#: frontends/src/primitivus/primitivus:599
-#, fuzzy, python-format
-msgid "Are you sure you want to delete the contact [%s] ?"
-msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
-
-#: frontends/src/primitivus/profile_manager.py:35
-#, fuzzy
-msgid "Login:"
-msgstr "Identifiant"
-
-#: frontends/src/primitivus/profile_manager.py:36
-#: frontends/src/wix/profile_manager.py:66
-msgid "Password:"
-msgstr "Mot de passe:"
-
-#: frontends/src/primitivus/profile_manager.py:41
-#: frontends/src/wix/profile_manager.py:51
-msgid "New"
-msgstr "Nouveau"
-
-#: frontends/src/primitivus/profile_manager.py:42
-#: frontends/src/wix/profile_manager.py:52
-msgid "Delete"
-msgstr "Suppression"
-
-#: frontends/src/primitivus/profile_manager.py:54
-#, fuzzy
-msgid "Profile Manager"
-msgstr "Mauvais nom de profile"
-
-#: frontends/src/primitivus/profile_manager.py:82
-#, fuzzy
-msgid "A profile with this name already exists"
-msgstr "Ce nom de profile existe déjà"
-
-#: frontends/src/primitivus/profile_manager.py:84
-msgid "Profile creation cancelled by backend"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:86
-msgid "Database error"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:88
-#, fuzzy, python-format
-msgid "Unknown reason (%s)"
-msgstr "Type d'action inconnu"
-
-#: frontends/src/primitivus/profile_manager.py:89
-msgid "Can't create profile"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:100
-#: frontends/src/wix/profile_manager.py:95
-#, fuzzy
-msgid "New profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/primitivus/profile_manager.py:100
-#, fuzzy
-msgid "Please enter a new profile name"
-msgstr "Veuillez entrer le nom du nouveau profile"
-
-#: frontends/src/primitivus/profile_manager.py:104
-#, fuzzy, python-format
-msgid "Are you sure you want to delete the profile %s ?"
-msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
-
-#: frontends/src/primitivus/profile_manager.py:123
-#: frontends/src/wix/profile_manager.py:131
-msgid "No profile selected"
-msgstr "Aucun profile sélectionné"
-
-#: frontends/src/primitivus/profile_manager.py:123
-#, fuzzy
-msgid "You need to create and select a profile before connecting"
-msgstr ""
-"Vous devez sélectionner un profile ou en créer un nouveau avant de vous "
-"connecter."
-
-#: frontends/src/primitivus/profile_manager.py:126
-#: frontends/src/wix/profile_manager.py:100
-#: frontends/src/wix/profile_manager.py:134
-msgid "Bad profile name"
-msgstr "Mauvais nom de profile"
-
-#: frontends/src/primitivus/profile_manager.py:126
-#: frontends/src/wix/profile_manager.py:100
-#: frontends/src/wix/profile_manager.py:134
-msgid "A profile name can't start with a @"
-msgstr "Un nom de profile ne peut pas commencer avec un @"
-
-#: frontends/src/primitivus/profile_manager.py:152
-#: frontends/src/quick_frontend/quick_app.py:119
-#: frontends/src/wix/profile_manager.py:158
-#, fuzzy
-msgid "Can't get profile parameter"
-msgstr "Mauvais nom de profile"
-
-#: frontends/src/primitivus/progress.py:33
-msgid "Clear progress list"
-msgstr "Effacer la liste"
-
-#: frontends/src/primitivus/status.py:46
-msgid "Set your presence"
-msgstr ""
-
-#: frontends/src/primitivus/status.py:50
-msgid "Set your status"
-msgstr ""
-
-#: frontends/src/primitivus/status.py:50
-msgid "New status"
-msgstr ""
-
-#: frontends/src/primitivus/xmlui.py:76
-#, fuzzy
-msgid "Unknown div_char"
-msgstr "Type d'action inconnu"
-
-#: frontends/src/primitivus/xmlui.py:225 frontends/src/wix/xmlui.py:255
-msgid "Submit"
-msgstr "Envoyer"
-
-#: frontends/src/primitivus/xmlui.py:227 frontends/src/primitivus/xmlui.py:235
-msgid "Cancel"
-msgstr "Annuler"
-
-#: frontends/src/primitivus/xmlui.py:234
-msgid "Save"
-msgstr "Sauvegarder"
-
-#: frontends/src/quick_frontend/quick_app.py:98
-#, fuzzy, python-format
-msgid "Trying to plug an unknown profile (%s)"
-msgstr "Tentative d'appel d'un profile inconnue"
-
-#: frontends/src/quick_frontend/quick_app.py:104
-#, fuzzy
-msgid ""
-"\n"
-"        %prog [options]\n"
-"\n"
-"        %prog --help for options list\n"
-"        "
-msgstr ""
-"\n"
-"        %prog [options] [FICHIER1 FICHIER2 ...] JID\n"
-"        %prog -w [options] [JID1 JID2 ...]\n"
-"\n"
-"        %prog --help pour la liste des options\n"
-"        "
-
-#: frontends/src/quick_frontend/quick_app.py:111
-msgid "Select the profile to use"
-msgstr "Veuillez sélectionner le profile à utiliser"
-
-#: frontends/src/quick_frontend/quick_app.py:124
-msgid "There is already one profile plugged (we are in single profile mode) !"
-msgstr "Il y a déjà un profile utilisé (nous comme en mode profile unique) !"
-
-#: frontends/src/quick_frontend/quick_app.py:128
-#, fuzzy
-msgid "The profile asked doesn't exist"
-msgstr "Le fichier [%s] n'existe pas !"
-
-#: frontends/src/quick_frontend/quick_app.py:131
-#, fuzzy
-msgid "The profile is already plugged"
-msgstr "Ce nom de profile existe déjà"
-
-#: frontends/src/quick_frontend/quick_app.py:153
-msgid "Error during autoconnection"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:207
-msgid "This profile is not plugged"
-msgstr "Ce profile n'est pas utilisé"
-
-#: frontends/src/quick_frontend/quick_app.py:218
-#, fuzzy
-msgid "Connected"
-msgstr "Connexion..."
-
-#: frontends/src/quick_frontend/quick_app.py:225
-#, fuzzy
-msgid "Disconnected"
-msgstr "Déconnexion..."
-
-#: frontends/src/quick_frontend/quick_app.py:233
-#, fuzzy
-msgid "Connection Error"
-msgstr "Connexion..."
-
-#: frontends/src/quick_frontend/quick_app.py:236
-msgid "Can't connect to account, please check your password"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:236
-#, fuzzy
-msgid "Connection error"
-msgstr "Connexion..."
-
-#: frontends/src/quick_frontend/quick_app.py:238
-#, fuzzy, python-format
-msgid "FIXME: error_type %s not implemented"
-msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
-
-#: frontends/src/quick_frontend/quick_app.py:290
-msgid "sendMessage Error"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:306
-#, fuzzy, python-format
-msgid ""
-"presence update for %(jid)s (show=%(show)s, priority=%(priority)s, statuses="
-"%(statuses)s) [profile:%(profile)s]"
-msgstr ""
-"Mise à jour des information de présence pour [%(entity)s] (available, show="
-"%(show)s statuses=%(statuses)s priority=%(priority)d)"
-
-#: frontends/src/quick_frontend/quick_app.py:323
-#, fuzzy, python-format
-msgid "Watched jid [%s] is connected !"
-msgstr "Vous êtes déjà connecté !"
-
-#: frontends/src/quick_frontend/quick_app.py:336
-#, fuzzy, python-format
-msgid "Room [%(room_jid)s] joined by %(profile)s, users presents:%(users)s"
-msgstr ""
-"%(profile)s a rejoint le salon [%(room_name)s], utilisateurs présents:"
-"%(users)s"
-
-#: frontends/src/quick_frontend/quick_app.py:347
-#, fuzzy, python-format
-msgid "Room [%(room_jid)s] left by %(profile)s"
-msgstr "contrat [%(contrat)s] choisi par %(profile)s"
-
-#: frontends/src/quick_frontend/quick_app.py:357
-#, fuzzy, python-format
-msgid "user [%(user_nick)s] joined room [%(room_jid)s]"
-msgstr "L'utilisateur %(nick)s a rejoint le salon (%(room_id)s)"
-
-#: frontends/src/quick_frontend/quick_app.py:365
-#, fuzzy, python-format
-msgid "user [%(user_nick)s] left room [%(room_jid)s]"
-msgstr "L'utilisateur %(nick)s a quitté le salon (%(room_id)s)"
-
-#: frontends/src/quick_frontend/quick_app.py:373
-#, fuzzy, python-format
-msgid ""
-"user [%(old_nick)s] is now known as [%(new_nick)s] in room [%(room_jid)s]"
-msgstr "L'utilisateur %(nick)s a rejoint le salon (%(room_id)s)"
-
-#: frontends/src/quick_frontend/quick_app.py:381
-#, fuzzy, python-format
-msgid "new subject for room [%(room_jid)s]: %(subject)s"
-msgstr "Nouveau sujet pour le salon (%(room_id)s): %(subject)s"
-
-#: frontends/src/quick_frontend/quick_app.py:386
-#, fuzzy
-msgid "Tarot Game Started \\o/"
-msgstr "Un jeu de Tarot est déjà lancé dans le salon %s"
-
-#: frontends/src/quick_frontend/quick_app.py:389
-#, python-format
-msgid ""
-"new Tarot game started by [%(referee)s] in room [%(room_jid)s] with "
-"%(players)s"
-msgstr ""
-"nouveau jeu de Tarot lancé par [%(referee)s] dans le salon [%(room_jid)s] "
-"avec %(players)s"
-
-#: frontends/src/quick_frontend/quick_app.py:394
-#, fuzzy
-msgid "New Tarot Game"
-msgstr "nouveau jeu de Tarot"
-
-#: frontends/src/quick_frontend/quick_app.py:402
-#, fuzzy
-msgid "Tarot: need to select a contrat"
-msgstr "Vous essayez de ré-attribuer une constante"
-
-#: frontends/src/quick_frontend/quick_app.py:409
-#, fuzzy
-msgid "Show cards"
-msgstr "Affichage du chat"
-
-#: frontends/src/quick_frontend/quick_app.py:416
-msgid "My turn to play"
-msgstr "C'est à moi de jouer"
-
-#: frontends/src/quick_frontend/quick_app.py:424
-#, fuzzy
-msgid "Tarot: score received"
-msgstr "tarot: chien reçu"
-
-#: frontends/src/quick_frontend/quick_app.py:431
-#, fuzzy, python-format
-msgid "Card(s) played (%(player)s): %(cards)s"
-msgstr "Cartes jouées par %(profile)s: [%(cards)s]"
-
-#: frontends/src/quick_frontend/quick_app.py:438
-#, python-format
-msgid "Cards played are not valid: %s"
-msgstr "Les cartes jouées sont invalides: %s"
-
-#: frontends/src/quick_frontend/quick_app.py:445
-#, fuzzy
-msgid "Quiz Game Started \\o/"
-msgstr "Un jeu de Tarot est déjà lancé dans le salon %s"
-
-#: frontends/src/quick_frontend/quick_app.py:448
-#, fuzzy, python-format
-msgid ""
-"new Quiz game started by [%(referee)s] in room [%(room_jid)s] with "
-"%(players)s"
-msgstr ""
-"nouveau jeu de Tarot lancé par [%(referee)s] dans le salon [%(room_jid)s] "
-"avec %(players)s"
-
-#: frontends/src/quick_frontend/quick_app.py:453
-#, fuzzy
-msgid "New Quiz Game"
-msgstr "nouveau jeu de Tarot"
-
-#: frontends/src/quick_frontend/quick_app.py:461
-#, python-format
-msgid "Quiz: new question: %s"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:514
-#, python-format
-msgid "The contact %s has accepted your subscription"
-msgstr "Le contact %s a accepté votre inscription"
-
-#: frontends/src/quick_frontend/quick_app.py:514
-#: frontends/src/quick_frontend/quick_app.py:520
-#, fuzzy
-msgid "Subscription confirmation"
-msgstr "désinscription confirmée pour [%s]"
-
-#: frontends/src/quick_frontend/quick_app.py:517
-#, python-format
-msgid "The contact %s has refused your subscription"
-msgstr "Le contact %s a refusé votre inscription"
-
-#: frontends/src/quick_frontend/quick_app.py:517
-#, fuzzy
-msgid "Subscription refusal"
-msgstr "demande d'inscription pour [%s]"
-
-#: frontends/src/quick_frontend/quick_app.py:520
-#, python-format
-msgid ""
-"The contact %s wants to subscribe to your presence.\n"
-"Do you accept ?"
-msgstr ""
-"Le contact %s veut s'inscrire à vos informations de présence\n"
-"Acceptez vous ?"
-
-#: frontends/src/quick_frontend/quick_app.py:531
-#, python-format
-msgid "param update: [%(namespace)s] %(name)s = %(value)s"
-msgstr "Le paramètre [%(namespace)s] %(name)s vaut désormais %(value)s"
-
-#: frontends/src/quick_frontend/quick_app.py:533
-#, python-format
-msgid "Changing JID to %s"
-msgstr "Changement du JID pour %s"
-
-#: frontends/src/quick_frontend/quick_chat.py:47
-#, python-format
-msgid "Adding users %s to room"
-msgstr "Ajout de l'utilisateur %s dans le salon"
-
-#: frontends/src/quick_frontend/quick_chat.py:49
-msgid "[INTERNAL] trying to set presents nicks for a non group chat window"
-msgstr ""
-"[INTERNAL] tentative d'indiquer les utilisateurs présents pour une fenêtre "
-"de chat qui n'est pas un chat de groupe"
-
-#: frontends/src/quick_frontend/quick_chat.py:55 frontends/src/wix/chat.py:146
-#, python-format
-msgid "Replacing user %s"
-msgstr "Remplacement de l'utilisateur %s"
-
-#: frontends/src/quick_frontend/quick_chat.py:57 frontends/src/wix/chat.py:148
-msgid "[INTERNAL] trying to replace user for a non group chat window"
-msgstr ""
-"[INTERNAL] tentative de remplacer un utilisateur pour une fenêtre de chat "
-"qui n'est pas un chat de groupe"
-
-#: frontends/src/quick_frontend/quick_chat.py:66
-#, fuzzy, python-format
-msgid "Removing user %s"
-msgstr "suppression de %s"
-
-#: frontends/src/quick_frontend/quick_chat.py:68
-msgid "[INTERNAL] trying to remove user for a non group chat window"
-msgstr ""
-"[INTERNAL] tentative de supprimer un utilisateur pour une fenêtre de chat "
-"qui n'est pas un chat de groupe"
-
-#: frontends/src/quick_frontend/quick_chat.py:83
-#, python-format
-msgid "Changing nick of user %(old_nick)s to %(new_nick)s"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_chat.py:85
-#, fuzzy
-msgid "[INTERNAL] trying to change user nick for a non group chat window"
-msgstr ""
-"[INTERNAL] tentative de remplacer un utilisateur pour une fenêtre de chat "
-"qui n'est pas un chat de groupe"
-
-#: frontends/src/quick_frontend/quick_chat.py:93
-#, fuzzy, python-format
-msgid "Setting subject to %s"
-msgstr "Envoi du message jabber à %s"
-
-#: frontends/src/quick_frontend/quick_chat.py:95
-msgid "[INTERNAL] trying to set subject for a non group chat window"
-msgstr ""
-"[INTERNAL] tentative de changer le sujet pour une fenêtre de chat qui n'est "
-"pas un chat de groupe"
-
-#: frontends/src/quick_frontend/quick_chat.py:100
-msgid "now we print history"
-msgstr "Maintenant on affiche l'historique"
-
-#: frontends/src/quick_frontend/quick_chat.py:110
-#, fuzzy
-msgid "Can't get history"
-msgstr "Impossible de charger l'historique !"
-
-#: frontends/src/quick_frontend/quick_chat.py:149
-msgid "startGame is not implemented in this frontend"
-msgstr "startGame n'est pas implémenté dans ce frontend"
-
-#: frontends/src/quick_frontend/quick_chat.py:154
-msgid "getGame is not implemented in this frontend"
-msgstr "getGame n'est pas implémenté dans ce frontend"
-
-#: frontends/src/quick_frontend/quick_contact_list.py:28
-msgid "Contact List init"
-msgstr "Initialisation de la liste de contacts"
-
-#: frontends/src/quick_frontend/quick_contact_management.py:71
-#, fuzzy
-msgid "Trying to get attribute for an unknown contact"
-msgstr "Tentative d'assigner un paramètre à un profile inconnu"
-
-#: frontends/src/quick_frontend/quick_contact_management.py:87
-#, fuzzy
-msgid "INTERNAL ERROR: Key error"
-msgstr "ERREUR INTERNE: paramètres xml non valides"
-
-#: frontends/src/quick_frontend/quick_contact_management.py:99
-#, fuzzy, python-format
-msgid "Trying to update an unknown contact: %s"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: frontends/src/tools/xmlui.py:191
-msgid "XMLUI can have only one main container"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:240
-#, fuzzy, python-format
-msgid "Unknown container [%s], using default one"
-msgstr "Disposition inconnue, utilisation de celle par defaut"
-
-#: frontends/src/tools/xmlui.py:249
-msgid "Internal Error, container has not _xmluiAppend method"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:315
-#, fuzzy, python-format
-msgid "FIXME FIXME FIXME: widget type [%s] is not implemented"
-msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
-
-#: frontends/src/tools/xmlui.py:316
-#, fuzzy, python-format
-msgid "FIXME FIXME FIXME: type [%s] is not implemented"
-msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
-
-#: frontends/src/tools/xmlui.py:324
-#, python-format
-msgid "No change listener on [%s]"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:330
-#, fuzzy, python-format
-msgid "Unknown tag [%s]"
-msgstr "Type d'action inconnu"
-
-#: frontends/src/tools/xmlui.py:395
-#, fuzzy
-msgid "No callback_id found"
-msgstr "Aucun transport trouvé"
-
-#: frontends/src/tools/xmlui.py:436
-msgid "The form data is not sent back, the type is not managed properly"
-msgstr ""
-"Les données du formulaire ne sont pas envoyées, il y a une erreur dans la "
-"gestion du type"
-
-#: frontends/src/tools/xmlui.py:441
-msgid "Cancelling form"
-msgstr "Annulation du formulaire"
-
-#: frontends/src/wix/card_game.py:95
-#, fuzzy
-msgid "Contrat choosed"
-msgstr "Contact choisi: %s"
-
-#: frontends/src/wix/card_game.py:242
-msgid "Écart"
-msgstr "Écart"
-
-#: frontends/src/wix/chat.py:114
-#, fuzzy
-msgid "configure chat window for Tarot game"
-msgstr "Construction du jeu de Tarot"
-
-#: frontends/src/wix/chat.py:121
-#, fuzzy
-msgid "configure chat window for Quiz game"
-msgstr "Construction du jeu de Tarot"
-
-#: frontends/src/wix/chat.py:175
-msgid "&SendFile\tCTRL-s"
-msgstr "Envoi de fichier\tCTRL-s"
-
-#: frontends/src/wix/chat.py:175
-#, fuzzy
-msgid " Send a file to contact"
-msgstr "Attend qu'un fichier soit envoyé par un contact"
-
-#: frontends/src/wix/chat.py:176
-msgid "&Action"
-msgstr "&Action"
-
-#: frontends/src/wix/chat.py:187
-#, fuzzy
-msgid "Start &Tarot game\tCTRL-t"
-msgstr "Construction du jeu de Tarot"
-
-#: frontends/src/wix/chat.py:187
-#, fuzzy
-msgid " Start a Tarot card game"
-msgstr "Implementation de vcard-temp"
-
-#: frontends/src/wix/chat.py:188
-msgid "&Games"
-msgstr "Jeux"
-
-#: frontends/src/wix/chat.py:256
-msgid "Send File"
-msgstr "Envoi un fichier"
-
-#: frontends/src/wix/chat.py:257
-msgid "Choose a file to send"
-msgstr "Veuillez choisir le fichier à envoyer"
-
-#: frontends/src/wix/chat.py:259
-#, fuzzy, python-format
-msgid "filename: %s"
-msgstr "fichier enregistré dans %s"
-
-#: frontends/src/wix/chat.py:267 frontends/src/wix/main_window.py:281
-msgid "File Transfer"
-msgstr "Transfert de fichier"
-
-#: frontends/src/wix/chat.py:267 frontends/src/wix/main_window.py:281
-#, fuzzy, python-format
-msgid "Copying %s"
-msgstr "Ajout de %s"
-
-#: frontends/src/wix/chat.py:270
-#, fuzzy
-msgid "Starting Tarot game"
-msgstr "Construction du jeu de Tarot"
-
-#: frontends/src/wix/chat.py:271
-msgid "FIXME: temporary menu, must be changed"
-msgstr "CORRIGEZ-MOI: menu temporaire, doit être remplacé"
-
-#: frontends/src/wix/constants.py:36
-#, fuzzy
-msgid "offline"
-msgstr "En ligne"
-
-#: frontends/src/wix/constants.py:37
-#, fuzzy
-msgid "online"
-msgstr "En ligne"
-
-#: frontends/src/wix/constants.py:41
-msgid "AFK"
-msgstr "Loin du clavier"
-
-#: frontends/src/wix/constants.py:42
-msgid "DND"
-msgstr "Ne pas déranger"
-
-#: frontends/src/wix/contact_list.py:79
-#, python-format
-msgid "update %s"
-msgstr "mise à jour de %s"
-
-#: frontends/src/wix/contact_list.py:153
-#, fuzzy, python-format
-msgid "adding %s"
-msgstr "Ajout de %s"
-
-#: frontends/src/wix/contact_list.py:192
-#, fuzzy, python-format
-msgid "removing %s"
-msgstr "Ajout de %s"
-
-#: frontends/src/wix/main_window.py:87
-msgid "Wix jabber client"
-msgstr "client jabber Wix"
-
-#: frontends/src/wix/main_window.py:109
-#, python-format
-msgid "plugin profile %s"
-msgstr "branchement du profil %s"
-
-#: frontends/src/wix/main_window.py:118
-#, fuzzy
-msgid "Creating menus"
-msgstr "Construction du jeu de Tarot"
-
-#: frontends/src/wix/main_window.py:120
-msgid "&Connect\tCTRL-c"
-msgstr "&Connexion\tCTRL-c"
-
-#: frontends/src/wix/main_window.py:120
-#, fuzzy
-msgid " Connect to the server"
-msgstr "Connexion au démarrage des frontends"
-
-#: frontends/src/wix/main_window.py:121
-msgid "&Disconnect\tCTRL-d"
-msgstr "&Déconnexion\tCTRL-d"
-
-#: frontends/src/wix/main_window.py:121
-#, fuzzy
-msgid " Disconnect from the server"
-msgstr "Déconnexion à la fermeture des frontends"
-
-#: frontends/src/wix/main_window.py:122
-msgid "&Parameters"
-msgstr "&Paramètres"
-
-#: frontends/src/wix/main_window.py:122
-msgid " Configure the program"
-msgstr " Configurer l'application"
-
-#: frontends/src/wix/main_window.py:124
-msgid "A&bout"
-msgstr "À propos"
-
-#: frontends/src/wix/main_window.py:124
-#, python-format
-msgid " About %s"
-msgstr " À propos %s"
-
-#: frontends/src/wix/main_window.py:125
-msgid "E&xit"
-msgstr "Quitter"
-
-#: frontends/src/wix/main_window.py:125
-msgid " Terminate the program"
-msgstr " Ferme l'application"
-
-#: frontends/src/wix/main_window.py:127
-msgid "&Add contact"
-msgstr "&Ajouter un contact"
-
-#: frontends/src/wix/main_window.py:127
-msgid " Add a contact to your list"
-msgstr " Ajouter un contact à votre liste"
-
-#: frontends/src/wix/main_window.py:128
-msgid "&Remove contact"
-msgstr "Supp&rimer un contact"
-
-#: frontends/src/wix/main_window.py:128
-msgid " Remove the selected contact from your list"
-msgstr " Supprime le contact sélectionné de votre liste"
-
-#: frontends/src/wix/main_window.py:130
-#, fuzzy
-msgid "&Show profile"
-msgstr "Affiche la barre de progression"
-
-#: frontends/src/wix/main_window.py:130
-#, fuzzy
-msgid " Show contact's profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: frontends/src/wix/main_window.py:132
-msgid "&Join Room"
-msgstr "Re&joindre un salon"
-
-#: frontends/src/wix/main_window.py:132
-#, fuzzy
-msgid " Join a Multi-User Chat room"
-msgstr ""
-"Implémentation de l'initialisation de flux pour le transfert de fichier "
-
-#: frontends/src/wix/main_window.py:134
-msgid "&General"
-msgstr "&Général"
-
-#: frontends/src/wix/main_window.py:135
-msgid "&Contacts"
-msgstr "&Contacts"
-
-#: frontends/src/wix/main_window.py:136
-#, fuzzy
-msgid "&Communication"
-msgstr "Connexion..."
-
-#: frontends/src/wix/main_window.py:267
-#, fuzzy
-msgid "Confirmation asked"
-msgstr "inscription demandée pour"
-
-#: frontends/src/wix/main_window.py:270
-msgid "File transfer confirmation asked"
-msgstr "Demande de confirmation pour un transfer de fichier demandée"
-
-#: frontends/src/wix/main_window.py:272
-msgid "File Request"
-msgstr "Gestion de fichiers"
-
-#: frontends/src/wix/main_window.py:290
-msgid "Yes/No confirmation asked"
-msgstr "confirmation de type Oui/Non demandée"
-
-#: frontends/src/wix/main_window.py:292
-#: frontends/src/wix/profile_manager.py:111
-#, fuzzy
-msgid "Confirmation"
-msgstr "Connexion..."
-
-#: frontends/src/wix/main_window.py:306
-#, python-format
-msgid "actionResult: type = [%(type)s] id = [%(id)s] data = [%(data)s]"
-msgstr "actionResult: type = [%(type)s] id = [%(id)s] data = [%(data)s]"
-
-#: frontends/src/wix/main_window.py:315
-msgid "Success"
-msgstr "Succès"
-
-#: frontends/src/wix/main_window.py:334
-#, fuzzy
-msgid "registration"
-msgstr "enregistrement"
-
-#: frontends/src/wix/main_window.py:382
-#, python-format
-msgid "onContactActivated: %s"
-msgstr "onContactActivated: %s"
-
-#: frontends/src/wix/main_window.py:400
-msgid "Status change request"
-msgstr "Demande de changement de statut"
-
-#: frontends/src/wix/main_window.py:404
-msgid "Param request"
-msgstr "Gestion des paramètres"
-
-#: frontends/src/wix/main_window.py:406
-#, fuzzy
-msgid "Configuration"
-msgstr "Connexion..."
-
-#: frontends/src/wix/main_window.py:422
-#, python-format
-msgid "%(name)s is a SàT (Salut à Toi) frontend\n"
-msgstr "%(name)s est un frontend pour SàT (Salut à Toi)\n"
-
-#: frontends/src/wix/main_window.py:438
-msgid "Add contact request"
-msgstr "Demande d'ajout de contact"
-
-#: frontends/src/wix/main_window.py:441
-msgid "name@server.tld"
-msgstr "nom@serveur.ext"
-
-#: frontends/src/wix/main_window.py:454
-msgid "Remove contact request"
-msgstr "Demande de suppression de contact"
-
-#: frontends/src/wix/main_window.py:457 frontends/src/wix/main_window.py:480
-msgid "You haven't selected any contact !"
-msgstr "Vous n'avez sélectionné aucun contact !"
-
-#: frontends/src/wix/main_window.py:465
-#, python-format
-msgid "Are you sure you want to delete %s from your roster list ?"
-msgstr "Êtes vous sûr de vouloir supprimer %s de votre liste de contacts ?"
-
-#: frontends/src/wix/main_window.py:466
-msgid "Contact suppression"
-msgstr "Suppression de contact"
-
-#: frontends/src/wix/main_window.py:477
-msgid "Show contact's profile request"
-msgstr "Demande d'affichage du profile d'un contact"
-
-#: frontends/src/wix/main_window.py:493
-#, fuzzy, python-format
-msgid "Profile received: [%s]"
-msgstr "tarot: chien reçu"
-
-#: frontends/src/wix/main_window.py:512
-#, fuzzy
-msgid "Exiting..."
-msgstr "Déconnexion..."
-
-#: frontends/src/wix/main_window.py:519
-msgid "Tray Click"
-msgstr "Clic sur l'icône de la barre de tâches"
-
-#: frontends/src/wix/profile_manager.py:46
-msgid "Profile:"
-msgstr "Profile:"
-
-#: frontends/src/wix/profile_manager.py:59
-msgid "Login"
-msgstr "Identifiant"
-
-#: frontends/src/wix/profile_manager.py:95
-msgid "Please enter the new profile name"
-msgstr "Veuillez entrer le nom du nouveau profile"
-
-#: frontends/src/wix/profile_manager.py:111
-#, python-format
-msgid "Are you sure to delete the profile [%s]"
-msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
-
-#: frontends/src/wix/profile_manager.py:131
-msgid "You must select a profile or create a new one before connecting"
-msgstr ""
-"Vous devez sélectionner un profile ou en créer un nouveau avant de vous "
-"connecter."
-
-#: frontends/src/wix/profile_manager.py:148
-#, fuzzy
-msgid "Saving new JID and server"
-msgstr "Sauvegarde du nouveau JID"
-
-#: frontends/src/wix/profile_manager.py:152
-msgid "Saving new password"
-msgstr "Sauvegarde du nouveau mot de passe"
-
-#: frontends/src/wix/profile_manager.py:158
-#, fuzzy
-msgid "Profile error"
-msgstr "Mauvais nom de profile"
-
-#: frontends/src/wix/profile.py:34
-msgid "Full Name"
-msgstr "Nom complet"
-
-#: frontends/src/wix/profile.py:35
-msgid "Nickname"
-msgstr "Surnon"
-
-#: frontends/src/wix/profile.py:36
-msgid "Birthday"
-msgstr "Date de naissance"
-
-#: frontends/src/wix/profile.py:37
-msgid "Phone #"
-msgstr "N° de Tél:"
-
-#: frontends/src/wix/profile.py:38
-msgid "Website"
-msgstr "Site Web"
-
-#: frontends/src/wix/profile.py:39
-msgid "E-mail"
-msgstr "Courriel"
-
-#: frontends/src/wix/profile.py:40
-msgid "Avatar"
-msgstr "Avatar"
-
-#: frontends/src/wix/profile.py:88 frontends/src/wix/xmlui.py:297
-msgid "close"
-msgstr "fermeture"
-
-#: frontends/src/wix/quiz_game.py:168
-msgid ""
-"Quel dommage, personne n'a trouvé la réponse\n"
-"\n"
-"Attention, la prochaine question arrive..."
-msgstr ""
-
-#: frontends/src/wix/xmlui.py:137
-#, fuzzy, python-format
-msgid "Can't find value [%s] to select"
-msgstr "Impossible de trouver la VCard de %s"
-
-#: frontends/src/wix/xmlui.py:175
-msgid "select"
-msgstr ""
-
-#: src/core/sat_main.py:97
-#, python-format
-msgid "Constant %(name)s overrided with [%(value)s]"
-msgstr ""
-
-#: src/core/sat_main.py:102
-msgid "Trying to access an undefined constant"
-msgstr "Vous essayer d'utiliser une constante indéfinie"
-
-#: src/core/sat_main.py:109
-#, fuzzy
-msgid "Trying to redefine a constant"
-msgstr "Vous essayer d'utiliser une constante indéfinie"
-
-#: src/core/sat_main.py:177
-#, fuzzy
-msgid "Memory initialised"
-msgstr "Le flux XML est initialisé"
-
-#: src/core/sat_main.py:207
-#, python-format
-msgid "Dependency plugin not found: [%s]"
-msgstr ""
-
-#: src/core/sat_main.py:214
-#, python-format
-msgid "importing plugin: %s"
-msgstr "Importation du plugin: %s"
-
-#: src/core/sat_main.py:233
-msgid "Trying to connect a non-exsitant profile"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: src/core/sat_main.py:237
-#, fuzzy
-msgid "already connected !"
-msgstr "Vous  n'êtes pas connecté !"
-
-#: src/core/sat_main.py:255
-#, fuzzy
-msgid "Can't parse port value, using default value"
-msgstr "Pas de modèle de paramètres, utilisation du modèle par défaut"
-
-#: src/core/sat_main.py:283
-msgid "setting plugins parents"
-msgstr "Configuration des parents des extensions"
-
-#: src/core/sat_main.py:304
-msgid "not connected !"
-msgstr "Vous  n'êtes pas connecté !"
-
-#: src/core/sat_main.py:307
-#, fuzzy
-msgid "Disconnecting..."
-msgstr "Déconnexion..."
-
-#: src/core/sat_main.py:317 src/memory/memory.py:1027
-msgid "Asking contacts for a non-existant profile"
-msgstr "Demande de contacts pour un profile inexistant"
-
-#: src/core/sat_main.py:328
-#, fuzzy
-msgid "Asking group's contacts for a non-existant profile"
-msgstr "Demande de contacts pour un profile inexistant"
-
-#: src/core/sat_main.py:337
-msgid "Trying to remove reference to a client not referenced"
-msgstr ""
-
-#: src/core/sat_main.py:349
-msgid "running app"
-msgstr "Lancement de l'application"
-
-#: src/core/sat_main.py:353
-msgid "stopping app"
-msgstr "Arrêt de l'application"
-
-#: src/core/sat_main.py:414
-msgid "No user, password or server given, can't register new account."
-msgstr ""
-"L'utilisateur, le mot de passe ou le serveur n'ont pas été spécifiés, "
-"impossible d'inscrire un nouveau compte."
-
-#: src/core/sat_main.py:422
-#, python-format
-msgid "Are you sure to register new account [%(user)s] to server %(server)s ?"
-msgstr ""
-"Êtes vous sûr de vouloir inscrire le nouveau compte [%(user)s] au serveur "
-"%(server)s ?"
-
-#: src/core/sat_main.py:427
-#, fuzzy, python-format
-msgid "register Confirmation CB ! (%s)"
-msgstr "Callback de confirmation d'inscription !"
-
-#: src/core/sat_main.py:442
-#, python-format
-msgid "setting param: %(name)s=%(value)s in category %(category)s"
-msgstr ""
-"Le paramètre %(name)s vaut désormais %(value)s dans la catégorie %(category)s"
-
-#: src/core/sat_main.py:452
-msgid "asking connection status for a non-existant profile"
-msgstr "demande de l'état de connexion pour un profile qui n'existe pas"
-
-#: src/core/sat_main.py:518
-#, fuzzy, python-format
-msgid "Sending jabber message of type [%(type)s] to %(to)s..."
-msgstr "Envoi du message jabber à %s"
-
-#: src/core/sat_main.py:556
-#, fuzzy
-msgid "Trying to send a message with no profile"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: src/core/sat_main.py:603
-#, fuzzy, python-format
-msgid "subsciption request [%(subs_type)s] for %(jid)s"
-msgstr "demande d'inscription [%(type)s] pour %(jid)s"
-
-#: src/core/sat_main.py:716 src/core/sat_main.py:733
-#, python-format
-msgid "Requested disco info on %s"
-msgstr ""
-
-#: src/core/sat_main.py:718
-#, python-format
-msgid "Feature found: %s"
-msgstr "Fonctionnalité trouvée: %s"
-
-#: src/core/sat_main.py:721
-#, python-format
-msgid "Identity found: [%(category)s/%(type)s] %(identity)s"
-msgstr "Identité trouvée: [%(category)s/%(type)s] %(identity)s"
-
-#: src/core/sat_main.py:735
-#, fuzzy, python-format
-msgid "Identity added: (%(category)s,%(type)s) ==> %(entity)s [%(profile)s]"
-msgstr "Identité trouvée: [%(category)s/%(type)s] %(identity)s"
-
-#: src/core/sat_main.py:742
-#, python-format
-msgid ""
-"Can't get information on identity [%(entity)s] for profile [%(profile)s]"
-msgstr ""
-
-#: src/core/sat_main.py:747
-msgid ""
-"Using jabberfr workaround, be sure your domain has at least two levels (e.g. "
-"\"example.tld\", not \"example\" alone)"
-msgstr ""
-
-#: src/core/sat_main.py:771
-#, fuzzy
-msgid "action_type for actionResultExt must be DICT_DICT, fixing it"
-msgstr "Le type pour actionResultExt doit être DICT_DICT, correction"
-
-#: src/core/sat_main.py:785
-#, fuzzy
-msgid "Asking confirmation a non-existant profile"
-msgstr "Demande de contacts pour un profile inexistant"
-
-#: src/core/sat_main.py:787
-msgid "Attempt to register two callbacks for the same confirmation"
-msgstr "Tentative de déclaration de 2 callbacks pour la même configuration"
-
-#: src/core/sat_main.py:796
-#, fuzzy
-msgid "Confirmation answer from a non-existant profile"
-msgstr "demande de l'état de connexion pour un profile qui n'existe pas"
-
-#: src/core/sat_main.py:797
-#, fuzzy, python-format
-msgid "Received confirmation answer for conf_id [%(conf_id)s]: %(success)s"
-msgstr "Réponse pour confirmation reçu (id [%(id)s]): %(success)s"
-
-#: src/core/sat_main.py:797
-msgid "accepted"
-msgstr "accepté"
-
-#: src/core/sat_main.py:797
-msgid "refused"
-msgstr "refusé"
-
-#: src/core/sat_main.py:799
-#, fuzzy, python-format
-msgid "Received an unknown confirmation (%(id)s for %(profile)s)"
-msgstr "Confirmation inconnue reçue"
-
-#: src/core/sat_main.py:818
-msgid "Trying to remove an unknow progress callback"
-msgstr "Tentative d'effacement d'une callback de progression inconnue."
-
-#: src/core/sat_main.py:851
-#, fuzzy
-msgid "id already registered"
-msgstr "Vous êtes maintenant désinscrit"
-
-#: src/core/sat_main.py:880
-#, fuzzy
-msgid "trying to launch action with a non-existant profile"
-msgstr "Tentative d'ajout d'un contact à un profile inexistant"
-
-#: src/core/sat_main.py:935
-#, fuzzy
-msgid "A menu with the same path and type already exists"
-msgstr "Ce nom de profile existe déjà"
-
-#: src/core/xmpp.py:57
-#, python-format
-msgid "********** [%s] CONNECTED **********"
-msgstr "********** [%s] CONNECTÉ **********"
-
-#: src/core/xmpp.py:63
-msgid "XML stream is initialized"
-msgstr "Le flux XML est initialisé"
-
-#: src/core/xmpp.py:100
-#, python-format
-msgid "********** [%s] DISCONNECTED **********"
-msgstr "********** [%s] DÉCONNECTÉ **********"
-
-#: src/core/xmpp.py:104
-msgid "No keep_alife"
-msgstr "Pas de \"keep_alife\""
-
-#: src/core/xmpp.py:120
-#, python-format
-msgid "got message from: %s"
-msgstr "message reçu de: %s"
-
-#: src/core/xmpp.py:224
-#, python-format
-msgid "new contact in roster list: %s"
-msgstr "nouveau contact: %s"
-
-#: src/core/xmpp.py:235
-#, python-format
-msgid "removing %s from roster list"
-msgstr "supppression du contact %s"
-
-#: src/core/xmpp.py:293
-#, fuzzy, python-format
-msgid ""
-"presence update for [%(entity)s] (available, show=%(show)s statuses="
-"%(statuses)s priority=%(priority)d)"
-msgstr ""
-"Mise à jour de l'information de présence pour [%(entity)s] (unavailable, "
-"statuses=%(statuses)s)"
-
-#: src/core/xmpp.py:312
-#, python-format
-msgid "presence update for [%(entity)s] (unavailable, statuses=%(statuses)s)"
-msgstr ""
-"Mise à jour de l'information de présence pour [%(entity)s] (unavailable, "
-"statuses=%(statuses)s)"
-
-#: src/core/xmpp.py:355
-#, fuzzy
-msgid "sending automatic \"from\" subscription request"
-msgstr "envoi automatique de la demande d'inscription \"to\""
-
-#: src/core/xmpp.py:363
-#, python-format
-msgid "subscription approved for [%s]"
-msgstr "inscription approuvée pour [%s]"
-
-#: src/core/xmpp.py:367
-#, fuzzy, python-format
-msgid "unsubscription confirmed for [%s]"
-msgstr "demande de désinscription pour [%s]"
-
-#: src/core/xmpp.py:371
-#, fuzzy, python-format
-msgid "subscription request from [%s]"
-msgstr "inscription approuvée pour [%s]"
-
-#: src/core/xmpp.py:375
-#, fuzzy
-msgid "sending automatic subscription acceptance"
-msgstr "envoi automatique de la demande d'inscription \"to\""
-
-#: src/core/xmpp.py:382
-#, python-format
-msgid "unsubscription asked for [%s]"
-msgstr "demande de désinscription pour [%s]"
-
-#: src/core/xmpp.py:385
-#, fuzzy
-msgid "automatic contact deletion"
-msgstr "Sélection du contrat"
-
-#: src/core/xmpp.py:417
-#, fuzzy
-msgid "Registration asked for"
-msgstr "Éched de l'insciption (%s)"
-
-#: src/core/xmpp.py:438 src/plugins/plugin_xep_0077.py:90
-#, python-format
-msgid "registration answer: %s"
-msgstr "réponse à la demande d'inscription: %s"
-
-#: src/core/xmpp.py:440
-msgid "Registration successfull"
-msgstr "Inscription réussie"
-
-#: src/core/xmpp.py:445 src/plugins/plugin_xep_0077.py:86
-#: src/plugins/plugin_xep_0077.py:96
-#, python-format
-msgid "Registration failure: %s"
-msgstr "Échec de l'inscription: %s"
-
-#: src/core/xmpp.py:450 src/plugins/plugin_xep_0077.py:98
-msgid "Username already exists, please choose an other one"
-msgstr "Ce nom d'utilisateur existe déjà, veuillez en choisir un autre"
-
-#: src/core/xmpp.py:453
-#, python-format
-msgid "Registration failed (%s)"
-msgstr "Éched de l'insciption (%s)"
-
-#: src/memory/memory.py:143
-#, fuzzy
-msgid "Connection"
-msgstr "Connexion..."
-
-#: src/memory/memory.py:144
-msgid "Register new account"
-msgstr "Enregistrement d'un nouveau compte"
-
-#: src/memory/memory.py:145
-#, fuzzy
-msgid "Connect on frontend startup"
-msgstr "Connexion au démarrage des frontends"
-
-#: src/memory/memory.py:146
-#, fuzzy
-msgid "Disconnect on frontend closure"
-msgstr "Déconnexion à la fermeture des frontends"
-
-#: src/memory/memory.py:147 src/plugins/plugin_xep_0249.py:69
-msgid "Misc"
-msgstr "Divers"
-
-#: src/memory/memory.py:202
-#, fuzzy, python-format
-msgid "Trying to purge cache of a profile not in memory: [%s]"
-msgstr "Tentative d'appel d'un profile inconnue"
-
-#: src/memory/memory.py:223
-#, fuzzy, python-format
-msgid "The profile [%s] already exists"
-msgstr "Ce nom de profile existe déjà"
-
-#: src/memory/memory.py:239
-#, fuzzy
-msgid "The profile name already exists"
-msgstr "Ce nom de profile existe déjà"
-
-#: src/memory/memory.py:250
-#, fuzzy
-msgid "Trying to delete an unknown profile"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: src/memory/memory.py:253
-#, fuzzy
-msgid "Trying to delete a connected profile"
-msgstr "Tentative de suppression d'un contact pour un profile inexistant"
-
-#: src/memory/memory.py:268
-msgid "No default profile, returning first one"
-msgstr "Pas de profile par défaut, envoi du premier"
-
-#: src/memory/memory.py:272
-#, fuzzy
-msgid "No profile exist yet"
-msgstr "Aucun profile sélectionné"
-
-#: src/memory/memory.py:280
-msgid "Trying to access an unknown profile"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: src/memory/memory.py:361
-msgid "Trying to register frontends parameters with no specified app: aborted"
-msgstr ""
-
-#: src/memory/memory.py:366
-#, python-format
-msgid "Trying to register twice frontends parameters for %(app)s: aborted"
-msgstr ""
-
-#: src/memory/memory.py:377
-#, python-format
-msgid "Can't determine default value for [%(category)s/%(name)s]: %(reason)s"
-msgstr ""
-"Impossible de déterminer la valeur par défaut pour [%(category)s/%(name)s]: "
-"%(reason)s"
-
-#: src/memory/memory.py:392 src/memory/memory.py:437 src/memory/memory.py:472
-#, python-format
-msgid "Requested param [%(name)s] in category [%(category)s] doesn't exist !"
-msgstr ""
-"Le paramètre demandé  [%(name)s] dans la catégorie [%(category)s] n'existe "
-"pas !"
-
-#: src/memory/memory.py:448
-msgid "Requesting a param for an non-existant profile"
-msgstr "Demande d'un paramètre pour un profile inconnu"
-
-#: src/memory/memory.py:452
-#, fuzzy
-msgid "Requesting synchronous param for not connected profile"
-msgstr "Demande d'un paramètre pour un profile inconnu"
-
-#: src/memory/memory.py:476
-#, python-format
-msgid ""
-"Trying to get parameter '%(param)s' in category '%(cat)s' without "
-"authorization!!!"
-msgstr ""
-
-#: src/memory/memory.py:488
-#, fuzzy
-msgid "Requesting a param for a non-existant profile"
-msgstr "Demande d'un paramètre pour un profile inconnu"
-
-#: src/memory/memory.py:622 src/memory/memory.py:638 src/memory/memory.py:661
-msgid "Asking params for inexistant profile"
-msgstr "Demande de paramètres pour un profile inconnu"
-
-#: src/memory/memory.py:713
-#, fuzzy
-msgid "Trying to set parameter for an unknown profile"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: src/memory/memory.py:718
-#, python-format
-msgid "Requesting an unknown parameter (%(category)s/%(name)s)"
-msgstr "Demande d'un paramètre inconnu: (%(category)s/%(name)s)"
-
-#: src/memory/memory.py:723
-#, python-format
-msgid ""
-"Trying to set parameter '%(param)s' in category '%(cat)s' without "
-"authorization!!!"
-msgstr ""
-
-#: src/memory/memory.py:776
-msgid "Memory manager init"
-msgstr "Initialisation du gestionnaire de mémoire"
-
-#: src/memory/memory.py:791
-#, fuzzy
-msgid "Loading default params template"
-msgstr "Impossible de charger le modèle des paramètres !"
-
-#: src/memory/memory.py:804
-msgid "Can't read main config !"
-msgstr ""
-
-#: src/memory/memory.py:838
-#, python-format
-msgid "Parameters loaded from file: %s"
-msgstr ""
-
-#: src/memory/memory.py:841
-#, fuzzy, python-format
-msgid "Can't load parameters from file: %s"
-msgstr "Impossible de charger le modèle des paramètres !"
-
-#: src/memory/memory.py:857
-#, python-format
-msgid "[%s] Profile session started"
-msgstr ""
-
-#: src/memory/memory.py:863
-#, fuzzy, python-format
-msgid "[%s] Profile session purge"
-msgstr "Ce profile n'est pas utilisé"
-
-#: src/memory/memory.py:868
-#, python-format
-msgid "Trying to purge roster status cache for a profile not in memory: [%s]"
-msgstr ""
-
-#: src/memory/memory.py:878
-#, fuzzy, python-format
-msgid "Parameters saved to file: %s"
-msgstr "Échec de la désinscription: %s"
-
-#: src/memory/memory.py:881
-#, fuzzy, python-format
-msgid "Can't save parameters to file: %s"
-msgstr "Impossible de charger le modèle des paramètres !"
-
-#: src/memory/memory.py:967
-#, python-format
-msgid ""
-"Entities (%(category)s/%(type)s) of %(server)s not available, maybe they "
-"haven't been asked yet?"
-msgstr ""
-
-#: src/memory/memory.py:996
-#, fuzzy
-msgid "Trying find server feature for a non-existant profile"
-msgstr "Tentative d'ajout d'informations de présence à un profile inexistant"
-
-#: src/memory/memory.py:1004
-#, python-format
-msgid "Features of %s not available, maybe they haven't been asked yet?"
-msgstr ""
-
-#: src/memory/memory.py:1013
-#, fuzzy
-msgid "Asking contacts for a non-existant or not connected profile"
-msgstr "Demande de vcard pour un profile inexistant ou non connecté"
-
-#: src/memory/memory.py:1017
-msgid "Entity not in cache"
-msgstr ""
-
-#: src/memory/memory.py:1041
-msgid "Trying to add presence status to a non-existant profile"
-msgstr "Tentative d'ajout d'informations de présence à un profile inexistant"
-
-#: src/memory/memory.py:1061 src/memory/memory.py:1092
-#, fuzzy
-msgid "Trying to get entity data for a non-existant profile"
-msgstr "Tentative de suppression d'un contact pour un profile inexistant"
-
-#: src/memory/memory.py:1135
-msgid "Asking waiting subscriptions for a non-existant profile"
-msgstr "Demande des inscriptions en attente pour un profile inexistant"
-
-#: src/memory/persistent.py:38
-msgid "PersistentDict can't be used before memory initialisation"
-msgstr ""
-
-#: src/memory/sqlite.py:83
-msgid "Connecting database"
-msgstr ""
-
-#: src/memory/sqlite.py:88
-msgid "Can't activate foreign keys"
-msgstr ""
-
-#: src/memory/sqlite.py:91
-#, fuzzy
-msgid "The database is new, creating the tables"
-msgstr "Ce nom de profile existe déjà"
-
-#: src/memory/sqlite.py:162
-#, fuzzy, python-format
-msgid "Can't delete profile [%s]"
-msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
-
-#: src/memory/sqlite.py:167
-#, fuzzy, python-format
-msgid "Profile [%s] deleted"
-msgstr "Aucun profile sélectionné"
-
-#: src/memory/sqlite.py:181
-#, fuzzy
-msgid "loading general parameters from database"
-msgstr "Impossible de charger les paramètres généraux !"
-
-#: src/memory/sqlite.py:194
-#, fuzzy
-msgid "loading individual parameters from database"
-msgstr "Impossible de charger les paramètres individuels !"
-
-#: src/memory/sqlite.py:216
-#, fuzzy, python-format
-msgid "Can't set general parameter (%(category)s/%(name)s) in database"
-msgstr "Demande d'un paramètre inconnu: (%(category)s/%(name)s)"
-
-#: src/memory/sqlite.py:227
-#, fuzzy, python-format
-msgid ""
-"Can't set individual parameter (%(category)s/%(name)s) for [%(profile)s] in "
-"database"
-msgstr ""
-"Impossible de déterminer la valeur par défaut pour [%(category)s/%(name)s]: "
-"%(reason)s"
-
-#: src/memory/sqlite.py:247
-#, python-format
-msgid ""
-"Can't save following message in history: from [%(from_jid)s] to [%(to_jid)s] "
-"==> [%(message)s]"
-msgstr ""
-
-#: src/memory/sqlite.py:312
-#, python-format
-msgid "loading general private values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:314 src/memory/sqlite.py:330
-#, python-format
-msgid "No data present in database for namespace %s"
-msgstr ""
-
-#: src/memory/sqlite.py:327
-#, python-format
-msgid "loading individual private values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:339
-#, python-format
-msgid ""
-"Can't set general private value (%(key)s) [namespace:%(namespace)s] in "
-"database"
-msgstr ""
-
-#: src/memory/sqlite.py:351
-#, python-format
-msgid ""
-"Can't set individual private value (%(key)s) [namespace: %(namespace)s] for "
-"[%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:361
-#, python-format
-msgid ""
-"Can't delete general private value (%(key)s) [namespace:%(namespace)s] in "
-"database"
-msgstr ""
-
-#: src/memory/sqlite.py:372
-#, python-format
-msgid ""
-"Can't delete individual private value (%(key)s) [namespace: %(namespace)s] "
-"for [%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:386
-#, python-format
-msgid "loading general private binary values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:388 src/memory/sqlite.py:404
-#, python-format
-msgid "No binary data present in database for namespace %s"
-msgstr ""
-
-#: src/memory/sqlite.py:401
-#, python-format
-msgid "loading individual private binary values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:413
-#, python-format
-msgid ""
-"Can't set general private binary value (%(key)s) [namespace:%(namespace)s] "
-"in database"
-msgstr ""
-
-#: src/memory/sqlite.py:425
-#, python-format
-msgid ""
-"Can't set individual binary private value (%(key)s) [namespace: "
-"%(namespace)s] for [%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:435
-#, python-format
-msgid ""
-"Can't delete general private binary value (%(key)s) [namespace:"
-"%(namespace)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:446
-#, python-format
-msgid ""
-"Can't delete individual private binary value (%(key)s) [namespace: "
-"%(namespace)s] for [%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:512
-msgid ""
-"Your local schema is up-to-date, but database versions mismatch, fixing it..."
-msgstr ""
-
-#: src/memory/sqlite.py:522
-msgid ""
-"There is a schema mismatch, but as we are on a dev version, database will be "
-"updated"
-msgstr ""
-
-#: src/memory/sqlite.py:526
-msgid ""
-"schema version is up-to-date, but local schema differ from expected current "
-"schema"
-msgstr ""
-
-#: src/memory/sqlite.py:528
-#, python-format
-msgid ""
-"Here are the commands that should fix the situation, use at your own risk "
-"(do a backup before modifying database), you can go to SàT's MUC room at "
-"sat@chat.jabberfr.org for help\n"
-"### SQL###\n"
-"%s\n"
-"### END SQL ###\n"
-msgstr ""
-
-#: src/memory/sqlite.py:532
-msgid "Database schema has changed, local database will be updated"
-msgstr ""
-
-#: src/plugins/deprecated_misc_cs.py:50
-msgid ""
-"This plugin allow to manage your CouchSurfing account throught your SàT "
-"frontend"
-msgstr ""
-"Cette extension vous permet de gérer votre compte CouchSurfing à travers "
-"votre frontend SàT"
-
-#: src/plugins/deprecated_misc_cs.py:70
-#, fuzzy
-msgid "Plugin CS initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/deprecated_misc_cs.py:75
-msgid "Plugin"
-msgstr "Extension"
-
-#: src/plugins/deprecated_misc_cs.py:75
-#, fuzzy
-msgid "Launch CoushSurfing management interface"
-msgstr "Lancement de l'interface de gestion de CouchSurfing"
-
-#: src/plugins/deprecated_misc_cs.py:95
-msgid ""
-"Impossible to contact CS website, please check your login/password, "
-"connection or try again later"
-msgstr ""
-"Impossible de contacter le site CouchSurfing, veuillez vérifier vos "
-"identifiant/mot de passe, votre connexion, ou essayez un peu plus tard"
-
-#: src/plugins/deprecated_misc_cs.py:103
-msgid ""
-"You have to fill your CouchSurfing login & password in parameters before "
-"using this interface"
-msgstr ""
-"Vous devez remplir vos identifiant & mot de passe CouchSurfing dans les "
-"paramètres avant d'utiliser cette interface"
-
-#: src/plugins/deprecated_misc_cs.py:162
-msgid "Messages"
-msgstr "Messages"
-
-#: src/plugins/deprecated_misc_cs.py:163
-#, python-format
-msgid ""
-"G'day %(name)s, you have %(nb_message)i unread message%(plural_mess)s and "
-"%(unread_CR_mess)s unread couch request message%(plural_CR)s\n"
-"If you want to send a message, select the recipient(s) in the list below"
-msgstr ""
-"Bonjour %(name)s, vous avez %(nb_message)i message%(plural_mess)s non lus et "
-"%(unread_CR_mess)s requête%(plural_CR)s d'hébergement en attente\n"
-"Si vous voulez envoyer un message, sélectionnez le(s) destinataire(s) dans "
-"la liste ci-dessous."
-
-#: src/plugins/deprecated_misc_cs.py:165
-#, python-format
-msgid "Show unread message%(plural)s in external web browser"
-msgstr "Afficher le%(plural)s message%(plural)s non lu dans un navigateur web"
-
-#: src/plugins/deprecated_misc_cs.py:168
-msgid "Subject"
-msgstr "Sujet"
-
-#: src/plugins/deprecated_misc_cs.py:171
-msgid "Message"
-msgstr "Message"
-
-#: src/plugins/deprecated_misc_cs.py:174
-msgid "send"
-msgstr "envoyer"
-
-#: src/plugins/deprecated_misc_cs.py:195
-#, python-format
-msgid ""
-"CS friend found: %(friend_name)s (id: %(friend_id)s, link: %(friend_link)s)"
-msgstr ""
-"Amis CS trouvé: %(friend_name)s (id: %(friend_id)s, link: %(friend_link)s)"
-
-#: src/plugins/deprecated_misc_cs.py:218
-msgid ""
-"INTERNAL ERROR: no confirmation of message sent by CS, maybe the site has "
-"been modified ?"
-msgstr ""
-"ERREUR INTERNE: aucune confirmation du message envoyée par CS, peut être que "
-"le site a été modifié ?"
-
-#: src/plugins/deprecated_misc_cs.py:229
-#, fuzzy, python-format
-msgid "Sending message to %s"
-msgstr "Envoi du message jabber à %s"
-
-#: src/plugins/deprecated_misc_cs.py:230
-#, python-format
-msgid ""
-"\n"
-"subject: %(subject)s\n"
-"message: \n"
-"---\n"
-"%(message)s\n"
-"---\n"
-"\n"
-msgstr ""
-"\n"
-"sujet: %(subject)s\n"
-"message: \n"
-"---\n"
-"%(message)s\n"
-"---\n"
-"\n"
-
-#: src/plugins/deprecated_misc_cs.py:236
-msgid "Message sent"
-msgstr "Message envoyé"
-
-#: src/plugins/deprecated_misc_cs.py:237
-msgid "The message has been sent to every recipients"
-msgstr "Le message a été envoyé à tous les destinataires"
-
-#: src/plugins/deprecated_misc_cs.py:250
-msgid "There is not recipient selected for this message !"
-msgstr "Il n'y a aucun destinataire pour ce message !"
-
-#: src/plugins/deprecated_misc_cs.py:256
-#, python-format
-msgid "sending message to %(friends)s with subject [%(subject)s]"
-msgstr "Envoi du message à %(friends)s avec le sujet [%(subject)s]"
-
-#: src/plugins/plugin_adhoc_dbus.py:48
-#, fuzzy
-msgid "Add D-Bus management to Ad-Hoc commands"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_adhoc_dbus.py:55
-#, fuzzy
-msgid "plugin Ad-Hoc D-Bus initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_adhoc_dbus.py:164
-#, fuzzy
-msgid "Command selection"
-msgstr "Sélection du contrat"
-
-#: src/plugins/plugin_adhoc_dbus.py:201 src/plugins/plugin_xep_0050.py:372
-#, fuzzy
-msgid "Updated"
-msgstr "mise à jour de %s"
-
-#: src/plugins/plugin_adhoc_dbus.py:205
-msgid "Command sent"
-msgstr ""
-
-#: src/plugins/plugin_exp_command_export.py:36
-#, fuzzy
-msgid "Implementation of command export"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_exp_command_export.py:86
-#, fuzzy
-msgid "Plugin command export initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_exp_parrot.py:35
-msgid "Implementation of parrot mode (repeat messages between 2 entities)"
-msgstr ""
-
-#: src/plugins/plugin_exp_parrot.py:47
-#, fuzzy
-msgid "Plugin Parrot initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_exp_pipe.py:43
-#, fuzzy
-msgid "Implementation of SI Pipe Transfer"
-msgstr ""
-"Implémentation de l'initialisation de flux pour le transfert de fichier "
-
-#: src/plugins/plugin_exp_pipe.py:51
-#, fuzzy
-msgid "Plugin Pipe initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_exp_pipe.py:66
-#, python-format
-msgid "SI Pipe Transfer: TimeOut reached for id %s"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:71 src/plugins/plugin_xep_0096.py:70
-#, fuzzy
-msgid "kill id called on a non existant approval id"
-msgstr "Demande d'un contact pour un profile inexistant"
-
-#: src/plugins/plugin_exp_pipe.py:81
-msgid "EXP-PIPE file transfer requested"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:90
-#, fuzzy
-msgid "No pipe element found"
-msgstr "Aucun profile sélectionné"
-
-#: src/plugins/plugin_exp_pipe.py:100 src/plugins/plugin_xep_0096.py:117
-#, fuzzy
-msgid "No stream method found"
-msgstr "Aucune donnée trouvée"
-
-#: src/plugins/plugin_exp_pipe.py:104 src/plugins/plugin_xep_0096.py:121
-msgid "Can't find a valid stream method"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:108 src/plugins/plugin_xep_0096.py:125
-#, fuzzy
-msgid "No feature element found"
-msgstr "Aucune donnée trouvée"
-
-#: src/plugins/plugin_exp_pipe.py:133 src/plugins/plugin_xep_0096.py:159
-msgid "dest path not found in frontend_data"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:143 src/plugins/plugin_xep_0096.py:171
-msgid ""
-"Unknown stream method, this should not happen at this stage, cancelling "
-"transfer"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:153 src/plugins/plugin_xep_0096.py:186
-#, python-format
-msgid "Transfer [%s] refused"
-msgstr "Transfert [%s] refusé"
-
-#: src/plugins/plugin_exp_pipe.py:164 src/plugins/plugin_exp_pipe.py:249
-#: src/plugins/plugin_xep_0096.py:197
-#, fuzzy, python-format
-msgid "Transfer %s successfuly finished"
-msgstr "Transfert [%s] refusé"
-
-#: src/plugins/plugin_exp_pipe.py:175
-#, python-format
-msgid "Transfer %(id)s failed with stream method %(s_method)s"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:180 src/plugins/plugin_xep_0096.py:216
-msgid "All stream methods failed, can't transfer the file"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:187
-#, fuzzy, python-format
-msgid "Pipe transfer refused by %s"
-msgstr "Transfert [%s] refusé"
-
-#: src/plugins/plugin_exp_pipe.py:188
-#, fuzzy, python-format
-msgid "The contact %s refused your pipe stream"
-msgstr "Le contact %s a refusé votre inscription"
-
-#: src/plugins/plugin_exp_pipe.py:188
-msgid "Pipe stream refused"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:190
-#, python-format
-msgid "Error during pipe stream transfer with %s"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:191
-#, python-format
-msgid ""
-"Something went wrong during the pipe stream session intialisation with %s"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:191
-msgid "Pipe stream error"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:197 src/plugins/plugin_xep_0096.py:233
-msgid "Protocol error during file transfer"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:202 src/plugins/plugin_xep_0096.py:238
-msgid "No feature element"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:209 src/plugins/plugin_xep_0096.py:245
-#, fuzzy
-msgid "No stream method choosed"
-msgstr "Contact choisi: %s"
-
-#: src/plugins/plugin_exp_pipe.py:223 src/plugins/plugin_xep_0096.py:267
-msgid "Invalid stream method received"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:235 src/plugins/plugin_xep_0096.py:280
-#, fuzzy
-msgid "Trying to send a file from an unknown profile"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: src/plugins/plugin_exp_pipe.py:254
-#, python-format
-msgid "Transfer %(id)s failed with stream method %(s_method)s %(profile)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:38
-msgid "SàT account creation"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:79
-#, fuzzy
-msgid "Prosody registration success"
-msgstr "Inscription réussie"
-
-#: src/plugins/plugin_misc_account.py:82
-#, python-format
-msgid "Can't register Prosody account (error code: %(code)d): %(message)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:92
-#, fuzzy
-msgid "Plugin Account initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_account.py:100
-#, fuzzy, python-format
-msgid "Can't find %s"
-msgstr "Impossible de trouver la VCard de %s"
-
-#: src/plugins/plugin_misc_account.py:103
-#, fuzzy, python-format
-msgid "Prosody path found: %s"
-msgstr "Fonctionnalité trouvée: %s"
-
-#: src/plugins/plugin_misc_groupblog.py:61
-#, fuzzy
-msgid "Implementation of microblogging with roster access"
-msgstr "Implémentation de l'enregistrement en ligne"
-
-#: src/plugins/plugin_misc_groupblog.py:85
-#, fuzzy
-msgid "Group blog plugin initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_misc_groupblog.py:147
-#: src/plugins/plugin_misc_room_game.py:422
-#, python-format
-msgid "No client for this profile key: %s"
-msgstr ""
-
-#: src/plugins/plugin_misc_groupblog.py:153
-msgid "Looking for item-access power pubsub server"
-msgstr ""
-
-#: src/plugins/plugin_misc_groupblog.py:161
-#, python-format
-msgid "item-access powered pubsub service found: [%s]"
-msgstr ""
-
-#: src/plugins/plugin_misc_groupblog.py:171
-msgid "No item-access powered pubsub server found, can't use group blog"
-msgstr ""
-
-#: src/plugins/plugin_misc_groupblog.py:320
-#, fuzzy
-msgid "Unknown access_type"
-msgstr "Type d'action inconnu"
-
-#: src/plugins/plugin_misc_groupblog.py:376
-#, fuzzy
-msgid "Unknown access type"
-msgstr "Type d'action inconnu"
-
-#: src/plugins/plugin_misc_imap.py:46
-msgid ""
-"Create an Imap server that you can use to read your \"normal\" type messages"
-msgstr ""
-
-#: src/plugins/plugin_misc_imap.py:64
-#, fuzzy
-msgid "Plugin Imap Server initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_imap.py:71
-#, fuzzy, python-format
-msgid "Launching IMAP server on port %d"
-msgstr "Lancement du serveur de flux Socks5 sur le port %d"
-
-#: src/plugins/plugin_misc_imap.py:439
-#, fuzzy
-msgid "IMAP server connection started"
-msgstr "Connexion du serveur SOCKS 5 démarrée"
-
-#: src/plugins/plugin_misc_imap.py:442
-#, fuzzy, python-format
-msgid "IMAP server connection lost (reason: %s)"
-msgstr "Connexion du serveur SOCKS5 perdue (raison: %s)"
-
-#: src/plugins/plugin_misc_maildir.py:47
-msgid "Intercept \"normal\" type messages, and put them in a Maildir type box"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:60
-#, fuzzy
-msgid "Plugin Maildir initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_maildir.py:127
-#, fuzzy
-msgid "Trying to remove an mailboxUser not referenced"
-msgstr "Tentative d'effacement d'une callback générale inconnue."
-
-#: src/plugins/plugin_misc_maildir.py:128
-#: src/plugins/plugin_misc_maildir.py:147
-#: src/plugins/plugin_misc_maildir.py:286
-#: src/plugins/plugin_misc_maildir.py:290
-#: src/plugins/plugin_misc_maildir.py:294
-#, fuzzy
-msgid "INTERNAL ERROR: "
-msgstr "ERREUR INTERNE: paramètres xml non valides"
-
-#: src/plugins/plugin_misc_maildir.py:146
-msgid "Boxname doesn't exist in internal data"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:285
-#, fuzzy
-msgid "Trying to remove an observer for an inexistant mailbox"
-msgstr "Tentative de suppression d'un contact pour un profile inexistant"
-
-#: src/plugins/plugin_misc_maildir.py:289
-msgid "Trying to remove an inexistant observer, no observer for this signal"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:293
-#, fuzzy
-msgid "Trying to remove an inexistant observer"
-msgstr "Vous essayer de connecter un profile qui n'existe pas"
-
-#: src/plugins/plugin_misc_quiz.py:44
-#, fuzzy
-msgid "Implementation of Quiz game"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_misc_quiz.py:56
-#, fuzzy
-msgid "Plugin Quiz initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_quiz.py:182
-#: src/plugins/plugin_misc_room_game.py:522
-#: src/plugins/plugin_misc_room_game.py:545
-#: src/plugins/plugin_misc_tarot.py:392 src/plugins/plugin_misc_tarot.py:406
-#, python-format
-msgid "profile %s is unknown"
-msgstr "le profil %s est inconnu"
-
-#: src/plugins/plugin_misc_quiz.py:254
-msgid ""
-"Bienvenue dans cette partie rapide de quizz, le premier à atteindre le score "
-"de 9 remporte le jeu\n"
-"\n"
-"Attention, tu es prêt ?"
-msgstr ""
-
-#: src/plugins/plugin_misc_quiz.py:282 src/plugins/plugin_misc_tarot.py:474
-#, python-format
-msgid "Player %(player)s is ready to start [status: %(status)s]"
-msgstr "Le joueur %(player)s est prêt à commencer [statut: %(status)s]"
-
-#: src/plugins/plugin_misc_quiz.py:330 src/plugins/plugin_misc_radiocol.py:231
-#, fuzzy, python-format
-msgid "Unmanaged game element: %s"
-msgstr "élément de jeu de carte inconnu: %s"
-
-#: src/plugins/plugin_misc_radiocol.py:45
-#, fuzzy
-msgid "Implementation of radio collective"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_misc_radiocol.py:63
-#, fuzzy
-msgid "Radio collective initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_radiocol.py:101
-msgid "Can't access profile's data"
-msgstr ""
-
-#: src/plugins/plugin_misc_radiocol.py:125
-msgid "No more participants in the radiocol: cleaning data"
-msgstr ""
-
-#: src/plugins/plugin_misc_radiocol.py:161
-msgid "INTERNAL ERROR: can't find full path of the song to delete"
-msgstr ""
-
-#: src/plugins/plugin_misc_radiocol.py:168
-#, python-format
-msgid "INTERNAL ERROR: can't find %s on the file system"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:45
-msgid "Base class for MUC games"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:197
-#, python-format
-msgid "%(user)s not allowed to join the game %(game)s in %(room)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:331
-#, python-format
-msgid "%(user)s not allowed to invite for the game %(game)s in %(room)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:376
-#, python-format
-msgid ""
-"Still waiting for %(users)s before starting the game %(game)s in %(room)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:394
-#, python-format
-msgid "Preparing room for %s game"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:397 src/plugins/plugin_xep_0045.py:259
-#, fuzzy
-msgid "Unknown profile"
-msgstr "Afficher profile"
-
-#: src/plugins/plugin_misc_room_game.py:503
-#, fuzzy, python-format
-msgid "%(game)s game already created in room %(room)s"
-msgstr "%(profile)s est déjà dans le salon %(room_jid)s"
-
-#: src/plugins/plugin_misc_room_game.py:506
-#, python-format
-msgid "%(game)s game in room %(room)s can only be created by %(user)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:519
-#, fuzzy, python-format
-msgid "Creating %(game)s game in room %(room)s"
-msgstr "Construction du jeu de Tarot"
-
-#: src/plugins/plugin_misc_room_game.py:559
-#, python-format
-msgid "new round for %s game"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:624
-msgid "Message can not be sent without a sender profile"
-msgstr ""
-
-#: src/plugins/plugin_misc_smtp.py:46
-msgid ""
-"Create a SMTP server that you can use to send your \"normal\" type messages"
-msgstr ""
-
-#: src/plugins/plugin_misc_smtp.py:63
-#, fuzzy
-msgid "Plugin SMTP Server initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_smtp.py:70
-#, fuzzy, python-format
-msgid "Launching SMTP server on port %d"
-msgstr "Lancement du serveur de flux Socks5 sur le port %d"
-
-#: src/plugins/plugin_misc_smtp.py:96
-#, fuzzy, python-format
-msgid "Can't send message: %s"
-msgstr "message reçu de: %s"
-
-#: src/plugins/plugin_misc_smtp.py:201
-#, fuzzy
-msgid "SMTP server connection started"
-msgstr "Connexion du serveur SOCKS 5 démarrée"
-
-#: src/plugins/plugin_misc_smtp.py:205
-#, fuzzy, python-format
-msgid "SMTP server connection lost (reason: %s)"
-msgstr "Connexion du serveur SOCKS5 perdue (raison: %s)"
-
-#: src/plugins/plugin_misc_tarot.py:43
-#, fuzzy
-msgid "Implementation of Tarot card game"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_misc_tarot.py:55
-#, fuzzy
-msgid "Plugin Tarot initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_tarot.py:60
-msgid "Passe"
-msgstr "Passe"
-
-#: src/plugins/plugin_misc_tarot.py:60
-msgid "Petite"
-msgstr "Petite"
-
-#: src/plugins/plugin_misc_tarot.py:60
-msgid "Garde"
-msgstr "Garde"
-
-#: src/plugins/plugin_misc_tarot.py:60
-msgid "Garde Sans"
-msgstr "Garde Sans"
-
-#: src/plugins/plugin_misc_tarot.py:60
-msgid "Garde Contre"
-msgstr "Garde Contre"
-
-#: src/plugins/plugin_misc_tarot.py:102
-msgid "contrat selection"
-msgstr "Sélection du contrat"
-
-#: src/plugins/plugin_misc_tarot.py:115
-msgid "scores"
-msgstr "points"
-
-#: src/plugins/plugin_misc_tarot.py:196 src/plugins/plugin_misc_tarot.py:227
-#, python-format
-msgid ""
-"Player %(excuse_owner)s give %(card_waited)s to %(player_waiting)s for "
-"Excuse compensation"
-msgstr ""
-"Le joueur %(excuse_owner)s donne %(card_waited)s à %(player_waiting)s en "
-"compensation pour l'Excuse"
-
-#: src/plugins/plugin_misc_tarot.py:232
-#, python-format
-msgid ""
-"%(excuse_owner)s keep the Excuse but has not card to give, %(winner)s is "
-"waiting for one"
-msgstr ""
-"%(excuse_owner)s garde l'Excuse mais n'a aucune carte à donner, %(winner)s "
-"en attend une"
-
-#: src/plugins/plugin_misc_tarot.py:242 src/plugins/plugin_misc_tarot.py:314
-#, python-format
-msgid ""
-"\n"
-"--\n"
-"%(player)s:\n"
-"score for this game ==> %(score_game)i\n"
-"total score ==> %(total_score)i"
-msgstr ""
-"\n"
-"--\n"
-"%(player)s:\n"
-"points pour cette partie ==> %(score_game)i\n"
-"point au total ==> %(total_score)i"
-
-#: src/plugins/plugin_misc_tarot.py:292
-#, fuzzy
-msgid "INTERNAL ERROR: contrat not managed (mispelled ?)"
-msgstr "ERREUR INTERNE: contrat inconnu (mal orthographié ?)"
-
-#: src/plugins/plugin_misc_tarot.py:311
-#, python-format
-msgid ""
-"The attacker (%(attaquant)s) makes %(points)i and needs to make "
-"%(point_limit)i (%(nb_bouts)s oulder%(plural)s%(separator)s%(bouts)s): he "
-"%(victory)s"
-msgstr ""
-"L'attaquant (%(attaquant)s) fait %(points)i et joue pour %(point_limit)i "
-"(%(nb_bouts)s bout%(plural)s%(separator)s%(bouts)s): il %(victory)s"
-
-#: src/plugins/plugin_misc_tarot.py:372
-msgid "Internal error: unmanaged game stage"
-msgstr "ERREUR INTERNE: état de jeu inconnu"
-
-#: src/plugins/plugin_misc_tarot.py:394
-#, python-format
-msgid "contrat [%(contrat)s] choosed by %(profile)s"
-msgstr "contrat [%(contrat)s] choisi par %(profile)s"
-
-#: src/plugins/plugin_misc_tarot.py:408
-#, fuzzy, python-format
-msgid "Cards played by %(profile)s: [%(cards)s]"
-msgstr "Cartes jouées par %(profile)s: [%(cards)s]"
-
-#: src/plugins/plugin_misc_tarot.py:507
-msgid "Everybody is passing, round ended"
-msgstr ""
-
-#: src/plugins/plugin_misc_tarot.py:514
-#, python-format
-msgid "%(player)s win the bid with %(contrat)s"
-msgstr "%(player)s remporte l'enchère avec %(contrat)s"
-
-#: src/plugins/plugin_misc_tarot.py:535
-#, fuzzy
-msgid "tarot: chien received"
-msgstr "tarot: chien reçu"
-
-#: src/plugins/plugin_misc_tarot.py:586
-#, python-format
-msgid "The winner of this trick is %s"
-msgstr "le vainqueur de cette main est %s"
-
-#: src/plugins/plugin_misc_tarot.py:630
-#, fuzzy, python-format
-msgid "Unmanaged error type: %s"
-msgstr "type d'erreur inconnu: %s"
-
-#: src/plugins/plugin_misc_tarot.py:632
-#, python-format
-msgid "Unmanaged card game element: %s"
-msgstr "élément de jeu de carte inconnu: %s"
-
-#: src/plugins/plugin_misc_text_commands.py:32
-msgid "IRC like text commands"
-msgstr ""
-
-#: src/plugins/plugin_misc_text_commands.py:42
-#, fuzzy
-msgid "Text commands initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_misc_text_commands.py:230
-msgid "Invalid jid, can't whois"
-msgstr ""
-
-#: src/plugins/plugin_misc_text_commands.py:233
-#, python-format
-msgid "whois for %(jid)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_text_commands.py:255
-#, python-format
-msgid ""
-"Text commands available:\n"
-"%s"
-msgstr ""
-
-#: src/plugins/plugin_misc_text_syntaxes.py:33 src/test/constants.py:42
-#, fuzzy
-msgid "Composition"
-msgstr "Connexion..."
-
-#: src/plugins/plugin_misc_text_syntaxes.py:58
-msgid "Management of various text syntaxes (XHTML-IM, Markdown, etc)"
-msgstr ""
-
-#: src/plugins/plugin_misc_text_syntaxes.py:99
-#, fuzzy
-msgid "Text syntaxes plugin initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_misc_xmllog.py:33
-msgid "Send raw XML logs to bridge"
-msgstr ""
-
-#: src/plugins/plugin_misc_xmllog.py:46
-#, fuzzy
-msgid "INTERNAL ERROR: Unmanaged XML type"
-msgstr "ERREUR INTERNE: contrat inconnu (mal orthographié ?)"
-
-#: src/plugins/plugin_misc_xmllog.py:65
-#, fuzzy
-msgid "Activate XML log"
-msgstr "Lancement du flux"
-
-#: src/plugins/plugin_misc_xmllog.py:68
-#, fuzzy
-msgid "Plugin XML Log initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_misc_xmllog.py:79
-msgid "XML log activated"
-msgstr ""
-
-#: src/plugins/plugin_xep_0020.py:43
-#, fuzzy
-msgid "Implementation of Feature Negotiation"
-msgstr "Implémentation de l'enregistrement en ligne"
-
-#: src/plugins/plugin_xep_0020.py:50
-#, fuzzy
-msgid "Plugin XEP_0020 initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0020.py:71
-#, python-format
-msgid "More than one value choosed for %s, keeping the first one"
-msgstr ""
-
-#: src/plugins/plugin_xep_0033.py:64
-#, fuzzy
-msgid "Implementation of Extended Stanza Addressing"
-msgstr "Implémentation de l'enregistrement en ligne"
-
-#: src/plugins/plugin_xep_0033.py:73
-#, fuzzy
-msgid "Extended Stanza Addressing plugin initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_xep_0033.py:88
-msgid "XEP-0033 is being used but the server doesn't support it!"
-msgstr ""
-
-#: src/plugins/plugin_xep_0033.py:90
-#, python-format
-msgid ""
-"Stanzas using XEP-0033 should be addressed to %(expected)s, not %(current)s!"
-msgstr ""
-
-#: src/plugins/plugin_xep_0033.py:91
-msgid "TODO: addressing has be fixed by the backend... fix it in the frontend!"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:47
-#, fuzzy
-msgid "Implementation of Multi-User Chat"
-msgstr "Implémentation de l'enregistrement en ligne"
-
-#: src/plugins/plugin_xep_0045.py:58
-#, fuzzy
-msgid "Plugin XEP_0045 initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0045.py:83
-#, python-format
-msgid "Unknown or disconnected profile (%s)"
-msgstr "Profil inconnu ou déconnecté (%s)"
-
-#: src/plugins/plugin_xep_0045.py:103
-#, fuzzy
-msgid "Error while configuring the room"
-msgstr "Erreur en tentant de rejoindre le salon"
-
-#: src/plugins/plugin_xep_0045.py:114
-#, fuzzy, python-format
-msgid "Error while joining the room %s"
-msgstr "Erreur en tentant de rejoindre le salon"
-
-#: src/plugins/plugin_xep_0045.py:116 src/plugins/plugin_xep_0045.py:308
-msgid "Group chat error"
-msgstr "Erreur de salon de discussion"
-
-#: src/plugins/plugin_xep_0045.py:266
-#, fuzzy
-msgid "Can't find a MUC service"
-msgstr "Impossible de trouver la VCard de %s"
-
-#: src/plugins/plugin_xep_0045.py:281
-#, python-format
-msgid "%(profile)s is already in room %(room_jid)s"
-msgstr "%(profile)s est déjà dans le salon %(room_jid)s"
-
-#: src/plugins/plugin_xep_0045.py:283
-#, python-format
-msgid "[%(profile)s] is joining room %(room)s with nick %(nick)s"
-msgstr "[%(profile)s] rejoint %(room)s avec %(nick)s"
-
-#: src/plugins/plugin_xep_0045.py:306
-#, python-format
-msgid "Invalid room jid: %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:397
-#, fuzzy, python-format
-msgid "user %(nick)s has joined room (%(room_id)s)"
-msgstr "L'utilisateur %(nick)s a rejoint le salon (%(room_id)s)"
-
-#: src/plugins/plugin_xep_0045.py:409
-#, python-format
-msgid "Room [%(room)s] left (%(profile)s))"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:415
-#, fuzzy, python-format
-msgid "user %(nick)s left room (%(room_id)s)"
-msgstr "L'utilisateur %(nick)s a quitté le salon (%(room_id)s)"
-
-#: src/plugins/plugin_xep_0045.py:427
-#, fuzzy, python-format
-msgid "New subject for room (%(room_id)s): %(subject)s"
-msgstr "Nouveau sujet pour le salon (%(room_id)s): %(subject)s"
-
-#: src/plugins/plugin_xep_0047.py:56
-#, fuzzy
-msgid "Implementation of In-Band Bytestreams"
-msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
-
-#: src/plugins/plugin_xep_0047.py:64
-#, fuzzy
-msgid "In-Band Bytestreams plugin initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_xep_0047.py:79
-#, python-format
-msgid "In-Band Bytestream: TimeOut reached for id %(sid)s [%(profile)s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:89 src/plugins/plugin_xep_0065.py:517
-#, fuzzy
-msgid "Client no more in cache"
-msgstr "fichier [%s] déjà en cache"
-
-#: src/plugins/plugin_xep_0047.py:92 src/plugins/plugin_xep_0065.py:520
-#, fuzzy
-msgid "kill id called on a non existant id"
-msgstr "Demande d'un contact pour un profile inexistant"
-
-#: src/plugins/plugin_xep_0047.py:148
-msgid "IBB stream opening"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:158
-#, python-format
-msgid "malformed IBB transfer: %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:162
-#, python-format
-msgid "Ignoring unexpected IBB transfer: %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:166 src/plugins/plugin_xep_0047.py:242
-msgid "sended jid inconsistency (man in the middle attack attempt ?)"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:195
-msgid "IBB stream closing"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:235
-#, fuzzy
-msgid "Received data for an unknown session id"
-msgstr "Confirmation inconnue reçue"
-
-#: src/plugins/plugin_xep_0047.py:249
-msgid "Sequence error"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:262
-msgid "Invalid base64 data"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:295 src/plugins/plugin_xep_0065.py:561
-msgid "stream length not managed yet"
-msgstr ""
-
-#: src/plugins/plugin_xep_0047.py:324 src/plugins/plugin_xep_0065.py:604
-#, fuzzy
-msgid "Transfer failed"
-msgstr "Transfert [%s] refusé"
-
-#: src/plugins/plugin_xep_0050.py:56
-msgid "Left"
-msgstr ""
-
-#: src/plugins/plugin_xep_0050.py:66
-#, fuzzy
-msgid "Implementation of Ad-Hoc Commands"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_xep_0050.py:108
-#, fuzzy, python-format
-msgid "The groups [%(group)s] is unknown for profile [%(profile)s])"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: src/plugins/plugin_xep_0050.py:210
-#, fuzzy
-msgid "plugin XEP-0050 initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0050.py:218 src/plugins/plugin_xep_0100.py:65
-msgid "Service"
-msgstr ""
-
-#: src/plugins/plugin_xep_0050.py:218
-msgid "commands"
-msgstr ""
-
-#: src/plugins/plugin_xep_0050.py:218
-msgid "Execute ad-hoc commands"
-msgstr ""
-
-#: src/plugins/plugin_xep_0050.py:224
-msgid "Status"
-msgstr ""
-
-#: src/plugins/plugin_xep_0050.py:237
-#, fuzzy
-msgid "Please select a command"
-msgstr "Veuillez entrer le nom du nouveau profile"
-
-#: src/plugins/plugin_xep_0050.py:334
-#, fuzzy
-msgid "Please enter target jid"
-msgstr "Veuillez entrer le JID de votre nouveau contact"
-
-#: src/plugins/plugin_xep_0050.py:348
-#, fuzzy
-msgid "status selection"
-msgstr "Sélection du contrat"
-
-#: src/plugins/plugin_xep_0050.py:376
-msgid "Status updated"
-msgstr ""
-
-#: src/plugins/plugin_xep_0054.py:65
-msgid "Implementation of vcard-temp"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_xep_0054.py:75
-msgid "Plugin XEP_0054 initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0054.py:144
-#, python-format
-msgid "Photo of type [%s] found"
-msgstr "Photo du type [%s] trouvée"
-
-#: src/plugins/plugin_xep_0054.py:146
-msgid "Decoding binary"
-msgstr "Décodage des données"
-
-#: src/plugins/plugin_xep_0054.py:153
-#, fuzzy, python-format
-msgid "file saved to %s"
-msgstr "fichier enregistré dans %s"
-
-#: src/plugins/plugin_xep_0054.py:155
-#, python-format
-msgid "file [%s] already in cache"
-msgstr "fichier [%s] déjà en cache"
-
-#: src/plugins/plugin_xep_0054.py:161
-msgid "parsing vcard"
-msgstr "Analyse de la vcard"
-
-#: src/plugins/plugin_xep_0054.py:183
-#, python-format
-msgid "FIXME: [%s] VCard tag is not managed yet"
-msgstr "CORRIGEZ-MOI: la balise VCard [%s] VCard n'est pas encore gérée"
-
-#: src/plugins/plugin_xep_0054.py:189
-msgid "VCard found"
-msgstr "VCard trouvée"
-
-#: src/plugins/plugin_xep_0054.py:200
-msgid "FIXME: vCard not found as first child element"
-msgstr "CORRIGEZ-MOI: la vCard n'est pas le premier élément enfant"
-
-#: src/plugins/plugin_xep_0054.py:206
-#, python-format
-msgid "Can't find VCard of %s"
-msgstr "Impossible de trouver la VCard de %s"
-
-#: src/plugins/plugin_xep_0054.py:215
-#, fuzzy
-msgid "Asking vcard for a non-existant or not connected profile"
-msgstr "Demande de vcard pour un profile inexistant ou non connecté"
-
-#: src/plugins/plugin_xep_0054.py:219
-#, python-format
-msgid "Asking for %s's VCard"
-msgstr "Demande de la VCard de %s"
-
-#: src/plugins/plugin_xep_0054.py:234
-#, python-format
-msgid "Asking for an uncached avatar [%s]"
-msgstr "Demande d'un avatar qui n'est pas en cache [%s]"
-
-#: src/plugins/plugin_xep_0054.py:263
-#, fuzzy
-msgid "Trying to set avatar for a non-existant or not connected profile"
-msgstr "Demande de vcard pour un profile inexistant ou non connecté"
-
-#: src/plugins/plugin_xep_0054.py:308
-msgid "New avatar found, requesting vcard"
-msgstr "Nouvel avatar trouvé, demande de vcard"
-
-#: src/plugins/plugin_xep_0055.py:38
-#, fuzzy
-msgid "Implementation of Jabber Search"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_xep_0055.py:45
-#, fuzzy
-msgid "Jabber search plugin initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_xep_0055.py:56 src/plugins/plugin_xep_0055.py:76
-msgid "Search directory"
-msgstr ""
-
-#: src/plugins/plugin_xep_0055.py:56
-msgid "Search use directory"
-msgstr ""
-
-#: src/plugins/plugin_xep_0055.py:77
-#, fuzzy
-msgid "Please enter the search jid"
-msgstr "Veuillez entrer le nom du nouveau profile"
-
-#: src/plugins/plugin_xep_0055.py:107 src/plugins/plugin_xep_0055.py:165
-msgid "No query element found"
-msgstr ""
-
-#: src/plugins/plugin_xep_0055.py:112 src/plugins/plugin_xep_0055.py:170
-msgid "No data form found"
-msgstr "Aucune donnée trouvée"
-
-#: src/plugins/plugin_xep_0055.py:119
-#, fuzzy, python-format
-msgid "Fields request failure: %s"
-msgstr "Échec de l'inscription: %s"
-
-#: src/plugins/plugin_xep_0055.py:176
-#, fuzzy, python-format
-msgid "Search request failure: %s"
-msgstr "Échec de la désinscription: %s"
-
-#: src/plugins/plugin_xep_0060.py:34
-#, fuzzy
-msgid "Implementation of PubSub Protocol"
-msgstr "Implémentation du protocole de transports"
-
-#: src/plugins/plugin_xep_0060.py:51
-#, fuzzy
-msgid "PubSub plugin initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0060.py:85
-#, fuzzy, python-format
-msgid "Trying to %(action)s with an unknown profile key [%(profile_key)s]"
-msgstr "Tentative d'accès à un profile inconnu"
-
-#: src/plugins/plugin_xep_0060.py:93
-#, fuzzy
-msgid "INTERNAL ERROR: no handler for required profile"
-msgstr "ERREUR INTERNE: paramètres xml non valides"
-
-#: src/plugins/plugin_xep_0060.py:170
-msgid "Publish node deleted"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:90
-msgid "Implementation of SOCKS5 Bytestreams"
-msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
-
-#: src/plugins/plugin_xep_0065.py:142
-msgid "Protocol init"
-msgstr "Initialisation du protocole"
-
-#: src/plugins/plugin_xep_0065.py:338
-msgid "File transfer completed, closing connection"
-msgstr "Transfert de fichier terminé, fermeture de la connexion"
-
-#: src/plugins/plugin_xep_0065.py:404
-msgid "Socks 5 server connection started"
-msgstr "Connexion du serveur SOCKS 5 démarrée"
-
-#: src/plugins/plugin_xep_0065.py:407
-#, python-format
-msgid "Socks 5 server connection lost (reason: %s)"
-msgstr "Connexion du serveur SOCKS5 perdue (raison: %s)"
-
-#: src/plugins/plugin_xep_0065.py:432
-msgid "Socks 5 client connection started"
-msgstr "Connexion du client SOCKS 5 démarrée"
-
-#: src/plugins/plugin_xep_0065.py:435
-#, python-format
-msgid "Socks 5 client connection lost (reason: %s)"
-msgstr "Connexion du client SOCKS5 perdue (raison: %s)"
-
-#: src/plugins/plugin_xep_0065.py:462
-msgid "Plugin XEP_0065 initialization"
-msgstr "Initialisation du plugin XEP_0065"
-
-#: src/plugins/plugin_xep_0065.py:468
-#, fuzzy
-msgid "registering"
-msgstr "enregistrement"
-
-#: src/plugins/plugin_xep_0065.py:476
-#, python-format
-msgid "Launching Socks5 Stream server on port %d"
-msgstr "Lancement du serveur de flux Socks5 sur le port %d"
-
-#: src/plugins/plugin_xep_0065.py:507
-#, python-format
-msgid "Socks5 Bytestream: TimeOut reached for id %(sid)s [%(profile)s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:557
-msgid "Unknown profile, this should not happen"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:614
-#, fuzzy
-msgid "Internal error, can't do transfer"
-msgstr "ERREUR INTERNE: état de jeu inconnu"
-
-#: src/plugins/plugin_xep_0065.py:624 src/plugins/plugin_xep_0065.py:797
-msgid "No streamhost found in stream query"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:629
-msgid "A proxy server is used"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:634
-msgid "Proxy jid is not the same as in parameters, this should not happen"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:642 src/plugins/plugin_xep_0065.py:736
-#, fuzzy
-msgid "activating stream"
-msgstr "Lancement du flux"
-
-#: src/plugins/plugin_xep_0065.py:660
-#, fuzzy
-msgid "Can't activate the proxy stream"
-msgstr " Ferme l'application"
-
-#: src/plugins/plugin_xep_0065.py:690
-msgid "BS stream query"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:704
-#, python-format
-msgid "Ignoring unexpected BS transfer: %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:713
-#, python-format
-msgid "No streamhost found in stream query %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:722
-msgid "incomplete streamhost element"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:728
-#, fuzzy, python-format
-msgid "Stream proposed: host=[%(host)s] port=[%(port)s]"
-msgstr "Flux proposé: serveur=[%(host)s] port=[%(post)s]"
-
-#: src/plugins/plugin_xep_0065.py:789
-msgid "Can't determine proxy information"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:793
-msgid "Bad answer received from proxy"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:800
-msgid ""
-"Multiple streamhost elements in proxy not managed, keeping only the first one"
-msgstr ""
-
-#: src/plugins/plugin_xep_0065.py:813
-msgid "No proxy found on this server"
-msgstr ""
-
-#: src/plugins/plugin_xep_0071.py:44
-#, fuzzy
-msgid "Implementation of XHTML-IM"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_xep_0071.py:72
-#, fuzzy
-msgid "XHTML-IM plugin initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0071.py:114 src/plugins/plugin_xep_0277.py:259
-msgid "Can't have xhtml and rich content at the same time"
-msgstr ""
-
-#: src/plugins/plugin_xep_0077.py:39
-msgid "Implementation of in-band registration"
-msgstr "Implémentation de l'enregistrement en ligne"
-
-#: src/plugins/plugin_xep_0077.py:46
-msgid "Plugin XEP_0077 initialization"
-msgstr "Initialisation du plugin XEP_0077"
-
-#: src/plugins/plugin_xep_0077.py:64
-#, fuzzy
-msgid "Can't find data form"
-msgstr "Impossible de trouver la VCard de %s"
-
-#: src/plugins/plugin_xep_0077.py:65
-msgid "This gateway can't be managed by SàT, sorry :("
-msgstr "Ce transport ne peut être gérée par SàT, désolé :("
-
-#: src/plugins/plugin_xep_0077.py:109
-#, python-format
-msgid "Asking registration for [%s]"
-msgstr "Demande d'enregistrement pour [%s]"
-
-#: src/plugins/plugin_xep_0085.py:49
-#, fuzzy
-msgid "Implementation of Chat State Notifications Protocol"
-msgstr "Implémentation du protocole de transports"
-
-#: src/plugins/plugin_xep_0085.py:89
-msgid "Enable chat state notifications"
-msgstr ""
-
-#: src/plugins/plugin_xep_0085.py:93
-#, fuzzy
-msgid "Chat State Notifications plugin initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_xep_0095.py:51
-#, fuzzy
-msgid "Implementation of Stream Initiation"
-msgstr "Implémentation de l'enregistrement en ligne"
-
-#: src/plugins/plugin_xep_0095.py:58
-#, fuzzy
-msgid "Plugin XEP_0095 initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0095.py:75
-#, fuzzy
-msgid "XEP-0095 Stream initiation"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0095.py:161
-msgid "sending stream initiation accept answer"
-msgstr ""
-
-#: src/plugins/plugin_xep_0095.py:183
-msgid "Asking for an non-existant or not connected profile"
-msgstr "Demande d'un profile inexistant ou non connecté"
-
-#: src/plugins/plugin_xep_0095.py:188
-#, python-format
-msgid "Stream Session ID: %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0096.py:43
-msgid "Implementation of SI File Transfer"
-msgstr ""
-"Implémentation de l'initialisation de flux pour le transfert de fichier "
-
-#: src/plugins/plugin_xep_0096.py:50
-msgid "Plugin XEP_0096 initialization"
-msgstr "Initialisation du plugin XEP_0096"
-
-#: src/plugins/plugin_xep_0096.py:65
-#, python-format
-msgid "SI File Transfer: TimeOut reached for id %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0096.py:80
-msgid "XEP-0096 file transfer requested"
-msgstr ""
-
-#: src/plugins/plugin_xep_0096.py:100
-#, python-format
-msgid "File proposed: name=[%(name)s] size=%(size)s"
-msgstr "Fichier proposé: nom=[%(name)s] taille=%(size)s"
-
-#: src/plugins/plugin_xep_0096.py:107
-#, fuzzy
-msgid "No file element found"
-msgstr "Aucun profile sélectionné"
-
-#: src/plugins/plugin_xep_0096.py:208
-#, python-format
-msgid "Transfer %(id)s failed with stream method %(s_method)s: %(reason)s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0096.py:223
-#, fuzzy, python-format
-msgid "File transfer refused by %s"
-msgstr "Transfert [%s] refusé"
-
-#: src/plugins/plugin_xep_0096.py:224
-#, fuzzy, python-format
-msgid "The contact %s refused your file"
-msgstr "Le contact %s a refusé votre inscription"
-
-#: src/plugins/plugin_xep_0096.py:224
-#, fuzzy
-msgid "File refused"
-msgstr "refusé"
-
-#: src/plugins/plugin_xep_0096.py:226
-#, python-format
-msgid "Error during file transfer with %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0096.py:227
-#, python-format
-msgid ""
-"Something went wrong during the file transfer session intialisation with %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0096.py:227
-#, fuzzy
-msgid "File transfer error"
-msgstr "Transfert de fichier"
-
-#: src/plugins/plugin_xep_0096.py:299
-#, python-format
-msgid "Transfer %(sid)s successfuly finished [%(profile)s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0096.py:305
-#, python-format
-msgid ""
-"Transfer %(id)s failed with stream method %(s_method)s: %(reason)s "
-"[%(profile)s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:35
-msgid "Implementation of Gateways protocol"
-msgstr "Implémentation du protocole de transports"
-
-#: src/plugins/plugin_xep_0100.py:38
-#, fuzzy
-msgid ""
-"Be careful ! Gateways allow you to use an external IM (legacy IM), so you "
-"can see your contact as XMPP contacts.\n"
-"But when you do this, all your messages go throught the external legacy IM "
-"server, it is a huge privacy issue (i.e.: all your messages throught the "
-"gateway can be monitored, recorded, analysed by the external server, most of "
-"time a private company)."
-msgstr ""
-"Soyez prudent ! Les transports vous permettent d'utiliser une messagerie "
-"externe, de façon à pouvoir afficher vos contacts comme des contacts "
-"jabber.\n"
-"Mais si vous faites cela, tous vos messages passeront par les serveurs de la "
-"messagerie externe, c'est un gros problème pour votre vie privée (comprenez: "
-"tous vos messages à travers le transport pourront être affichés, "
-"enregistrés, analysés par ces serveurs externes, la plupart du temps une "
-"entreprise privée)."
-
-#: src/plugins/plugin_xep_0100.py:43
-msgid "Internet Relay Chat"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:44
-msgid "XMPP"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:45
-msgid "Tencent QQ"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:46
-msgid "SIP/SIMPLE"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:47
-msgid "ICQ"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:48
-msgid "Yahoo! Messenger"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:49
-msgid "Gadu-Gadu"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:50
-msgid "AOL Instant Messenger"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:51
-msgid "Windows Live Messenger"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:58
-msgid "Gateways plugin initialization"
-msgstr "Initialisation de l'extension pour les transports"
-
-#: src/plugins/plugin_xep_0100.py:65
-#, fuzzy
-msgid "gateways"
-msgstr "Chercher les transports"
-
-#: src/plugins/plugin_xep_0100.py:65
-#, fuzzy
-msgid "Find gateways"
-msgstr "Chercher les transports"
-
-#: src/plugins/plugin_xep_0100.py:77
-msgid "Invalid JID"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:84
-#, fuzzy, python-format
-msgid "Gateways manager (%s)"
-msgstr "Gestionnaire de transport"
-
-#: src/plugins/plugin_xep_0100.py:92
-#, python-format
-msgid "Failed (%s)"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:105
-#, fuzzy
-msgid "Use external XMPP server"
-msgstr "Utiliser un autre serveur XMPP:"
-
-#: src/plugins/plugin_xep_0100.py:107
-msgid "Go !"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:114
-#, fuzzy
-msgid "No gateway index selected"
-msgstr "Aucun profile sélectionné"
-
-#: src/plugins/plugin_xep_0100.py:128
-#, python-format
-msgid ""
-"INTERNAL ERROR: identity category should always be \"gateway\" in "
-"_getTypeString, got \"%s\""
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:132
-msgid "Unknown IM"
-msgstr "Messagerie inconnue"
-
-#: src/plugins/plugin_xep_0100.py:136
-msgid "Registration successful, doing the rest"
-msgstr "Inscription réussie, lancement du reste de la procédure"
-
-#: src/plugins/plugin_xep_0100.py:159
-msgid "Timeout"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:170
-#, fuzzy, python-format
-msgid "Found gateway [%(jid)s]: %(identity_name)s"
-msgstr "Transport trouvé (%(jid)s): %(identity)s"
-
-#: src/plugins/plugin_xep_0100.py:173
-#, python-format
-msgid "Skipping [%(jid)s] which is not a gateway"
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:180
-msgid "No gateway found"
-msgstr "Aucun transport trouvé"
-
-#: src/plugins/plugin_xep_0100.py:185
-#, python-format
-msgid "item found: %s"
-msgstr "object trouvé: %s"
-
-#: src/plugins/plugin_xep_0100.py:209
-#, fuzzy, python-format
-msgid "find gateways (target = %(target)s, profile = %(profile)s)"
-msgstr "transports trouvée (cible = %s)"
-
-#: src/plugins/plugin_xep_0115.py:54
-#, fuzzy
-msgid "Implementation of entity capabilities"
-msgstr "Implementation de vcard-temp"
-
-#: src/plugins/plugin_xep_0115.py:82
-#, fuzzy
-msgid "Plugin XEP_0115 initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0115.py:148
-#, python-format
-msgid "Capability hash generated: [%s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0163.py:42
-#, fuzzy
-msgid "Implementation of Personal Eventing Protocol"
-msgstr "Implémentation du protocole de transports"
-
-#: src/plugins/plugin_xep_0163.py:49
-#, fuzzy
-msgid "PEP plugin initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0163.py:97
-#, fuzzy, python-format
-msgid "Trying to send personal event with an unknown profile key [%s]"
-msgstr "Tentative d'appel d'un profile inconnue"
-
-#: src/plugins/plugin_xep_0163.py:100
-#, fuzzy
-msgid "Trying to send personal event for an unknown type"
-msgstr "Tentative d'assigner un paramètre à un profile inconnu"
-
-#: src/plugins/plugin_xep_0163.py:106
-#, fuzzy
-msgid "No item found"
-msgstr "Aucun transport trouvé"
-
-#: src/plugins/plugin_xep_0163.py:111
-msgid "Can't find mood element in mood event"
-msgstr ""
-
-#: src/plugins/plugin_xep_0163.py:115
-#, fuzzy
-msgid "No mood found"
-msgstr "Aucune donnée trouvée"
-
-#: src/plugins/plugin_xep_0249.py:51
-#, fuzzy
-msgid "Implementation of Direct MUC Invitations"
-msgstr "Implémentation de l'enregistrement en ligne"
-
-#: src/plugins/plugin_xep_0249.py:71
-msgid "Auto-join MUC on invitation"
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:77
-#, fuzzy
-msgid "Plugin XEP_0249 initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0249.py:95 src/plugins/plugin_xep_0249.py:123
-#, fuzzy
-msgid "Profile doesn't exists !"
-msgstr "Le fichier [%s] n'existe pas !"
-
-#: src/plugins/plugin_xep_0249.py:125
-#, python-format
-msgid "Invitation accepted for room %(room)s [%(profile)s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:137
-#, python-format
-msgid "Invitation received for room %(room)s [%(profile)s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:139
-msgid "Error while parsing invitation"
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:143
-msgid "Invitation silently discarded because user is already in the room."
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:154
-#, python-format
-msgid ""
-"You have been invited by %(user)s to join the room %(room)s. Do you accept?"
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:154 src/plugins/plugin_xep_0249.py:157
-#, fuzzy
-msgid "MUC invitation"
-msgstr "Connexion..."
-
-#: src/plugins/plugin_xep_0249.py:157
-#, python-format
-msgid ""
-"An invitation from %(user)s to join the room %(room)s has been declined "
-"according to your personal settings."
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:47
-#, fuzzy
-msgid "Implementation of microblogging Protocol"
-msgstr "Implémentation du protocole de transports"
-
-#: src/plugins/plugin_xep_0277.py:58
-#, fuzzy
-msgid "Microblogging plugin initialization"
-msgstr "Initialisation du plugin XEP_0054"
-
-#: src/plugins/plugin_xep_0277.py:132
-#, python-format
-msgid "No entry found in the pubsub item %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:155
-#, python-format
-msgid "Atom entry %s misses a required element"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:181
-#, python-format
-msgid "Can't parse the link element of pubsub entry %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:190
-#, python-format
-msgid "Can't find author element in pubsub entry %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:218
-msgid "Content of type XHTML must declare its namespace!"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:302
-msgid "Microblog data must contain at least 'content' key"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:306
-msgid "Microblog data's content value must not be empty"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:340
-#, fuzzy
-msgid "Can't find profile's jid"
-msgstr "Impossible de trouver la VCard de %s"
-
-#: src/plugins/plugin_xep_0277.py:347
-#, python-format
-msgid "Microblog node has now access %s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:351
-msgid "Can't set microblog access"
-msgstr ""
-
-#: src/test/constants.py:43
-msgid "Enable unibox"
-msgstr ""
-
-#: src/test/constants.py:44
-msgid "'Wysiwyg' edition"
-msgstr ""
-
-#: src/test/test_plugin_misc_room_game.py:43
-msgid "Dummy plugin to test room game"
-msgstr ""
-
-#: src/tools/misc.py:58
-#, python-format
-msgid "There is already a bound priority [%s]"
-msgstr ""
-
-#: src/tools/misc.py:60
-#, python-format
-msgid "There is already a trigger with the same priority [%s]"
-msgstr ""
-
-#: src/tools/xml_tools.py:177
-#, fuzzy
-msgid "INTERNAL ERROR: parameters xml not valid"
-msgstr "ERREUR INTERNE: les paramètres doivent avoir un nom"
-
-#: src/tools/xml_tools.py:186
-msgid "INTERNAL ERROR: params categories must have a name"
-msgstr "ERREUR INTERNE: les catégories des paramètres doivent avoir un nom"
-
-#: src/tools/xml_tools.py:194
-msgid "INTERNAL ERROR: params must have a name"
-msgstr "ERREUR INTERNE: les paramètres doivent avoir un nom"
-
-#: src/tools/xml_tools.py:276
-msgid "TabElement must be a child of TabsContainer"
-msgstr ""
-
-#: src/tools/xml_tools.py:316
-msgid "Can't set row index if auto_index is True"
-msgstr ""
-
-#: src/tools/xml_tools.py:416
-msgid "either items or columns need do be filled"
-msgstr ""
-
-#: src/tools/xml_tools.py:429
-msgid "Headers lenght doesn't correspond to columns"
-msgstr ""
-
-#: src/tools/xml_tools.py:475
-msgid "Incorrect number of items in list"
-msgstr ""
-
-#: src/tools/xml_tools.py:578
-msgid "Value must be 0, 1, false or true"
-msgstr ""
-
-#: src/tools/xml_tools.py:612
-msgid "empty \"options\" list"
-msgstr ""
-
-#: src/tools/xml_tools.py:614
-msgid "invalid styles"
-msgstr ""
-
-#: src/tools/xml_tools.py:652
-#, fuzzy, python-format
-msgid "Unknown panel type [%s]"
-msgstr "Type d'action inconnu"
-
-#: src/tools/xml_tools.py:654
-msgid "form XMLUI need a submit_id"
-msgstr ""
-
-#: src/tools/xml_tools.py:656
-msgid "container argument must be a string"
-msgstr ""
-
-#: src/tools/xml_tools.py:748
-#, fuzzy, python-format
-msgid "Unknown container type [%s]"
-msgstr "Type d'action inconnu"
-
-#: src/tools/xml_tools.py:767
-#, fuzzy, python-format
-msgid "Invalid type [%s]"
-msgstr "Type d'action inconnu"
-
-#~ msgid ""
-#~ "\n"
-#~ "        %prog [options] [FILE1 FILE2 ...] JID\n"
-#~ "        %prog -w [options] [JID1 JID2 ...]\n"
-#~ "\n"
-#~ "        %prog --help for options list\n"
-#~ "        "
-#~ msgstr ""
-#~ "\n"
-#~ "        %prog [options] [FICHIER1 FICHIER2 ...] JID\n"
-#~ "        %prog -w [options] [JID1 JID2 ...]\n"
-#~ "\n"
-#~ "        %prog --help pour la liste des options\n"
-#~ "        "
-
-#~ msgid "You must specify the destination JID (Jabber ID)"
-#~ msgstr "Vous devez préciser le JID (Jabber ID) de destination"
-
-#~ msgid "Option progress is not available, deactivated."
-#~ msgstr ""
-#~ "L'option « progress » (barre de progression) n'est pas disponible, elle "
-#~ "est désactivée."
-
-#~ msgid "OK !"
-#~ msgstr "C'est parti !"
-
-#~ msgid "FIXME: actionResult not implemented"
-#~ msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
-
-#~ msgid "GO !"
-#~ msgstr "C'est parti !"
-
-#, fuzzy
-#~ msgid "You must enter an external server JID"
-#~ msgstr "Utiliser un autre serveur XMPP:"
-
-#, fuzzy
-#~ msgid "Register"
-#~ msgstr "enregistrement"
-
-#, fuzzy
-#~ msgid "Unregister"
-#~ msgstr "enregistrement"
-
-#, fuzzy
-#~ msgid "Find gateways request"
-#~ msgstr "Demande de recherche de transports"
-
-#~ msgid "Unmanaged tag"
-#~ msgstr "Tab inconnu"
-
-#~ msgid "text node has no child !"
-#~ msgstr "le nœud text n'a pas d'enfant !"
-
-#, fuzzy
-#~ msgid "INTERNAL ERROR: Unmanaged show_type (%s)"
-#~ msgstr "ERREUR INTERNE: contrat inconnu (mal orthographié ?)"
-
-#, fuzzy
-#~ msgid "Opening gateways manager on [%s]"
-#~ msgstr "Envoi du message jabber à %s"
-
-#~ msgid "&Find Gateways"
-#~ msgstr "Trouver transports"
-
-#~ msgid " Find gateways to legacy IM"
-#~ msgstr " Trouve les transports vers les messageries externes"
-
-#~ msgid "Find Gateways request"
-#~ msgstr "Demande de recherche de transports"
-
-#, fuzzy
-#~ msgid "Parameters error"
-#~ msgstr "&Paramètres"
-
-#~ msgid "FIXME FIXME FIXME"
-#~ msgstr "CORRIGER-MOI"
-
-#~ msgid "Submitting form"
-#~ msgstr "Envoi du formulaire"
-
-#~ msgid "No user or server given"
-#~ msgstr "L'utilisateur ou le serveur n'ont pas été spécifié"
-
-#~ msgid "FIXME FIXME FIXME: Unmanaged action (%s) in submitForm"
-#~ msgstr ""
-#~ "CORRIGEZ-MOI CORRIGEZ-MOI CORRIGEZ-MOI: Action non gérée (%s) dans "
-#~ "\"submitForm\""
-
-#~ msgid "Your are now unregistred"
-#~ msgstr "Vous êtes maintenant désinscrit"
-
-#~ msgid "Unregistration failure: %s"
-#~ msgstr "Échec de la désinscription: %s"
-
-#~ msgid "Unregistration failed: %s"
-#~ msgstr "Échec de la désinscription: %s"
-
-#, fuzzy
-#~ msgid "Registration failed"
-#~ msgstr "Éched de l'insciption (%s)"
-
-#~ msgid "All items checked for id [%s]"
-#~ msgstr "Tous les points ont été vérifiés pour l'id [%s]"
-
-#, fuzzy
-#~ msgid "Error when discovering [%(jid)s]: %(error)s"
-#~ msgstr "Erreur en analysant [%(jid)s]: %(condition)s"
-
-#, fuzzy
-#~ msgid "Error when discovering [%(target)s]: %(condition)s"
-#~ msgstr "Erreur en analysant [%(jid)s]: %(condition)s"
-
-#~ msgid "Error while trying to discover %(target)s gateways: %(error_mess)s"
-#~ msgstr "Erreur en essayant d'analyser %(target)s portails: %(error_mess)s"
-
-#, fuzzy
-#~ msgid "Unknown layout type [%s]"
-#~ msgstr "Type d'action inconnu"
-
-#~ msgid "Trying to add a category without parent tabs layout"
-#~ msgstr ""
-#~ "Tentative d'ajout d'une catégorie sans disposition dans l'onglet parent"
-
-#~ msgid "parent layout of a category is not tabs"
-#~ msgstr "la disposition parente d'une catégorie n'est pas \"tabs\" (onglets)"
-
-#~ msgid "WARNING: unknown text type"
-#~ msgstr "ATTENTION: type de texte inconnu"
-
-#~ msgid "Ok"
-#~ msgstr "Ok"
-
-#~ msgid "Yes"
-#~ msgstr "Oui"
-
-#~ msgid "No"
-#~ msgstr "Non"
-
-#, fuzzy
-#~ msgid "INTERNAL ERROR: Tab not found"
-#~ msgstr "ERREUR INTERNE: paramètres xml non valides"
-
-#~ msgid "Impossible to list directory"
-#~ msgstr "Impossible de lister les répertoires"
-
-#~ msgid "Path: "
-#~ msgstr "Chemin:"
-
-#~ msgid "Bookmarks"
-#~ msgstr "Favoris"
-
-#~ msgid "No GTK bookmarks file found"
-#~ msgstr "Aucun fichier favori pour GTK trouvé"
-
-#~ msgid "No KDE bookmarks file found"
-#~ msgstr "Aucun fichier favori pour KDE trouvé"
-
-#~ msgid "Contact List"
-#~ msgstr "Liste de contacts"
-
-#~ msgid "Incomplete data"
-#~ msgstr "Données incomplétes"
-
-#, fuzzy
-#~ msgid "Trying to call unknown function (%s)"
-#~ msgstr "Tentative d'appel d'une fonction inconnue"
-
-#, fuzzy
-#~ msgid "Trying to access an unknown menu (%(category)s/%(name)s/%(type)s)"
-#~ msgstr "Demande d'un paramètre inconnu: (%(category)s/%(name)s)"
-
-#~ msgid "general params data loaded"
-#~ msgstr "Paramètres généraux chargés"
-
-#~ msgid "individual params data loaded"
-#~ msgstr "Paramètres individuels chargés"
-
-#~ msgid "params template loaded"
-#~ msgstr "Modèle des paramètres chargé"
-
-#~ msgid "params loaded"
-#~ msgstr "paramètres chargés"
-
-#~ msgid "history loaded"
-#~ msgstr "Historique chargée"
-
-#~ msgid "private values loaded"
-#~ msgstr "Données privées chargées"
-
-#~ msgid "Can't load private values !"
-#~ msgstr "Impossible de charger les données privées !"
-
-#~ msgid "params saved"
-#~ msgstr "Paramètres sauvés"
-
-#~ msgid "history saved"
-#~ msgstr "Historique sauvée"
-
-#~ msgid "private values saved"
-#~ msgstr "Données privées sauvées"
-
-#~ msgid "source JID not found !"
-#~ msgstr "JID source introuvable !"
-
-#~ msgid "dest JID not found !"
-#~ msgstr "JID destination introuvable !"
-
-#~ msgid "Trying to add a contact to a non-existant profile"
-#~ msgstr "Tentative d'ajout d'un contact à un profile inexistant"
-
-#~ msgid "Adding connection: %(address)s, %(connection)s"
-#~ msgstr "Ajout d'une connexion: %(address)s, %(connection)s"
-
-#~ msgid "Saving file in %s."
-#~ msgstr "Sauvegarde du fichier dans %s."
-
-#~ msgid "Launching socks5 initiator"
-#~ msgstr "Lancement de socks5 en mode initiateur"
-
-#~ msgid "XEP-0096 management"
-#~ msgstr "Gestion de XEP-0096"
-
-#~ msgid "Transfer [%s] accepted"
-#~ msgstr "Transfert [%s] accepté"
-
-#~ msgid "Approved unknow id !"
-#~ msgstr "id inconnue approuvée !"
-
-#~ msgid "Feature negociation"
-#~ msgstr "Négociation de fonctionnalités"
-
-#~ msgid "presence update for [%s]"
-#~ msgstr "mise à jour de l'information de présence pour [%s]"
-
-#, fuzzy
-#~ msgid "hiding %s"
-#~ msgstr "Ajout de %s"
-
-#, fuzzy
-#~ msgid "showing %s"
-#~ msgstr "Ajout de %s"
-
-#, fuzzy
-#~ msgid "FIXME: askConfirmation not implemented"
-#~ msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/fr/LC_MESSAGES/sat.po	Thu Jun 17 13:05:58 2021 +0200
@@ -0,0 +1,9225 @@
+# French translations for Libervia.
+# Copyright (C) 2021 ORGANIZATION
+# This file is distributed under the same license as the Libervia project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version:  0.0.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-06-15 10:11+0200\n"
+"PO-Revision-Date: 2010-03-05 19:24+1100\n"
+"Last-Translator: Goffi <goffi@goffi.org>\n"
+"Language: fr\n"
+"Language-Team: French <goffi@goffi.org>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.9.0\n"
+
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_core_template.py:273
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:85
+#: sat/bridge/bridge_constructor/generated/dbus_bridge.py:85
+#: sat/bridge/dbus_bridge.py:747 sat_frontends/bridge/dbus_bridge.py:85
+msgid ""
+"D-Bus is not launched, please see README to see instructions on how to "
+"launch it"
+msgstr ""
+
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:99
+#: sat/bridge/bridge_constructor/generated/dbus_bridge.py:99
+#: sat_frontends/bridge/dbus_bridge.py:99
+#, fuzzy
+msgid "Unknown interface"
+msgstr "Type d'action inconnu"
+
+#: sat/core/sat_main.py:212
+#, fuzzy
+msgid "Memory initialised"
+msgstr "Le flux XML est initialisé"
+
+#: sat/core/sat_main.py:219
+msgid "Could not initialize backend: {reason}"
+msgstr ""
+
+#: sat/core/sat_main.py:227
+msgid "Backend is ready"
+msgstr ""
+
+#: sat/core/sat_main.py:238
+msgid "Following profiles will be connected automatically: {profiles}"
+msgstr ""
+
+#: sat/core/sat_main.py:251
+#, fuzzy
+msgid "Can't autoconnect profile {profile}: {reason}"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat/core/sat_main.py:321
+msgid ""
+"Can't import plugin [{path}]:\n"
+"{error}"
+msgstr ""
+
+#: sat/core/sat_main.py:340
+msgid "{type} type must be used with {mode} mode, ignoring plugin"
+msgstr ""
+
+#: sat/core/sat_main.py:349
+msgid ""
+"Name conflict for import name [{import_name}], can't import plugin "
+"[{name}]"
+msgstr ""
+
+#: sat/core/sat_main.py:385
+msgid "Recommended plugin not found: {}"
+msgstr ""
+
+#: sat/core/sat_main.py:406
+msgid "Can't import plugin {name}: {error}"
+msgstr ""
+
+#: sat/core/sat_main.py:478
+#, fuzzy
+msgid "already connected !"
+msgstr "Vous  n'êtes pas connecté !"
+
+#: sat/core/sat_main.py:495
+msgid "not connected !"
+msgstr "Vous  n'êtes pas connecté !"
+
+#: sat/core/sat_main.py:591
+msgid "Trying to remove reference to a client not referenced"
+msgstr ""
+
+#: sat/core/sat_main.py:604
+msgid "running app"
+msgstr "Lancement de l'application"
+
+#: sat/core/sat_main.py:608
+msgid "stopping app"
+msgstr "Arrêt de l'application"
+
+#: sat/core/sat_main.py:646
+msgid "profile_key must not be empty"
+msgstr ""
+
+#: sat/core/sat_main.py:666
+msgid "Unexpected error: {failure_}"
+msgstr ""
+
+#: sat/core/sat_main.py:921
+msgid "asking connection status for a non-existant profile"
+msgstr "demande de l'état de connexion pour un profile qui n'existe pas"
+
+#: sat/core/sat_main.py:1020
+#, fuzzy, python-format
+msgid "subsciption request [%(subs_type)s] for %(jid)s"
+msgstr "demande d'inscription [%(type)s] pour %(jid)s"
+
+#: sat/core/sat_main.py:1162
+msgid "Can't find features for service {service_jid}, ignoring"
+msgstr ""
+
+#: sat/core/sat_main.py:1221
+msgid "Can't retrieve {full_jid} infos, ignoring"
+msgstr ""
+
+#: sat/core/sat_main.py:1292
+msgid "Trying to remove an unknow progress callback"
+msgstr "Tentative d'effacement d'une callback de progression inconnue."
+
+#: sat/core/sat_main.py:1382
+#, fuzzy
+msgid "id already registered"
+msgstr "Vous êtes maintenant désinscrit"
+
+#: sat/core/sat_main.py:1424
+#, fuzzy
+msgid "trying to launch action with a non-existant profile"
+msgstr "Tentative d'ajout d'un contact à un profile inexistant"
+
+#: sat/core/sat_main.py:1520
+#, fuzzy
+msgid "A menu with the same path and type already exists"
+msgstr "Ce nom de profile existe déjà"
+
+#: sat/core/sat_main.py:1619
+#, fuzzy
+msgid "help_string"
+msgstr "enregistrement"
+
+#: sat/core/xmpp.py:196
+#, fuzzy
+msgid "Can't parse port value, using default value"
+msgstr "Pas de modèle de paramètres, utilisation du modèle par défaut"
+
+#: sat/core/xmpp.py:223
+msgid "We'll use the stable resource {resource}"
+msgstr ""
+
+#: sat/core/xmpp.py:255
+msgid "setting plugins parents"
+msgstr "Configuration des parents des extensions"
+
+#: sat/core/xmpp.py:275
+#, fuzzy
+msgid "Plugins initialisation error"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/core/xmpp.py:297
+msgid "Error while disconnecting: {}"
+msgstr ""
+
+#: sat/core/xmpp.py:301
+#, fuzzy
+msgid "{profile} identified"
+msgstr "Aucun profile sélectionné"
+
+#: sat/core/xmpp.py:309
+msgid "XML stream is initialized"
+msgstr "Le flux XML est initialisé"
+
+#: sat/core/xmpp.py:317
+#, fuzzy, python-format
+msgid "********** [{profile}] CONNECTED **********"
+msgstr "********** [%s] CONNECTÉ **********"
+
+#: sat/core/xmpp.py:343
+#, python-format
+msgid "ERROR: XMPP connection failed for profile '%(profile)s': %(reason)sprofile"
+msgstr ""
+
+#: sat/core/xmpp.py:398
+msgid "stopping connection because of network disabled"
+msgstr ""
+
+#: sat/core/xmpp.py:421
+msgid "network is available, trying to connect"
+msgstr ""
+
+#: sat/core/xmpp.py:445
+#, fuzzy, python-format
+msgid "********** [{profile}] DISCONNECTED **********"
+msgstr "********** [%s] CONNECTÉ **********"
+
+#: sat/core/xmpp.py:464
+msgid ""
+"Your server certificate is not valid (its identity can't be checked).\n"
+"\n"
+"This should never happen and may indicate that somebody is trying to spy "
+"on you.\n"
+"Please contact your server administrator."
+msgstr ""
+
+#: sat/core/xmpp.py:515
+#, fuzzy
+msgid "Disconnecting..."
+msgstr "Déconnexion..."
+
+#: sat/core/xmpp.py:688
+#, fuzzy, python-format
+msgid "Sending message (type {type}, to {to})"
+msgstr "Envoi du message jabber à %s"
+
+#: sat/core/xmpp.py:696
+msgid ""
+"Triggers, storage and echo have been inhibited by the 'send_only' "
+"parameter"
+msgstr ""
+
+#: sat/core/xmpp.py:762
+#, fuzzy, python-format
+msgid "No message found"
+msgstr "message reçu de: %s"
+
+#: sat/core/xmpp.py:814
+msgid "invalid data used for host: {data}"
+msgstr ""
+
+#: sat/core/xmpp.py:839
+msgid ""
+"Certificate validation is deactivated, this is unsecure and somebody may "
+"be spying on you. If you have no good reason to disable certificate "
+"validation, please activate \"Check certificate\" in your settings in "
+"\"Connection\" tab."
+msgstr ""
+
+#: sat/core/xmpp.py:843
+msgid "Security notice"
+msgstr ""
+
+#: sat/core/xmpp.py:978
+msgid "The requested entry point ({entry_point}) is not available"
+msgstr ""
+
+#: sat/core/xmpp.py:1016
+msgid ""
+"Plugin {current_name} is needed for {entry_name}, but it doesn't handle "
+"component mode"
+msgstr ""
+
+#: sat/core/xmpp.py:1024
+msgid "invalid plugin mode"
+msgstr ""
+
+#: sat/core/xmpp.py:1128
+msgid "parseMessage used with a non <message/> stanza, ignoring: {xml}"
+msgstr ""
+
+#: sat/core/xmpp.py:1140
+msgid "received <message> with a wrong namespace: {xml}"
+msgstr ""
+
+#: sat/core/xmpp.py:1226
+#, fuzzy, python-format
+msgid "got message from: {from_}"
+msgstr "message reçu de: %s"
+
+#: sat/core/xmpp.py:1341
+msgid "There's no subscription between you and [{}]!"
+msgstr ""
+
+#: sat/core/xmpp.py:1346
+msgid "You are not subscribed to [{}]!"
+msgstr ""
+
+#: sat/core/xmpp.py:1348
+msgid "[{}] is not subscribed to you!"
+msgstr ""
+
+#: sat/core/xmpp.py:1384
+msgid "our server support roster versioning, we use it"
+msgstr ""
+
+#: sat/core/xmpp.py:1390
+msgid "no roster in cache, we start fresh"
+msgstr ""
+
+#: sat/core/xmpp.py:1394
+msgid "We have roster v{version} in cache"
+msgstr ""
+
+#: sat/core/xmpp.py:1405
+msgid "our server doesn't support roster versioning"
+msgstr ""
+
+#: sat/core/xmpp.py:1462
+msgid "adding {entity} to roster"
+msgstr ""
+
+#: sat/core/xmpp.py:1486
+#, fuzzy, python-format
+msgid "removing {entity} from roster"
+msgstr "supppression du contact %s"
+
+#: sat/core/xmpp.py:1640
+#, python-format
+msgid "presence update for [%(entity)s] (unavailable, statuses=%(statuses)s)"
+msgstr ""
+"Mise à jour de l'information de présence pour [%(entity)s] (unavailable, "
+"statuses=%(statuses)s)"
+
+#: sat/core/xmpp.py:1724
+#, fuzzy
+msgid "sending automatic \"from\" subscription request"
+msgstr "envoi automatique de la demande d'inscription \"to\""
+
+#: sat/core/xmpp.py:1732
+#, python-format
+msgid "subscription approved for [%s]"
+msgstr "inscription approuvée pour [%s]"
+
+#: sat/core/xmpp.py:1736
+#, fuzzy, python-format
+msgid "unsubscription confirmed for [%s]"
+msgstr "demande de désinscription pour [%s]"
+
+#: sat/core/xmpp.py:1741
+#, fuzzy, python-format
+msgid "subscription request from [%s]"
+msgstr "inscription approuvée pour [%s]"
+
+#: sat/core/xmpp.py:1747
+#, fuzzy
+msgid "sending automatic subscription acceptance"
+msgstr "envoi automatique de la demande d'inscription \"to\""
+
+#: sat/core/xmpp.py:1759
+#, python-format
+msgid "unsubscription asked for [%s]"
+msgstr "demande de désinscription pour [%s]"
+
+#: sat/core/xmpp.py:1763
+#, fuzzy
+msgid "automatic contact deletion"
+msgstr "Sélection du contrat"
+
+#: sat/memory/cache.py:69
+msgid "Can't read metadata file at {path}"
+msgstr ""
+
+#: sat/memory/cache.py:80
+msgid "Invalid cache metadata at {path}"
+msgstr ""
+
+#: sat/memory/cache.py:87
+msgid "cache {cache_file!r} references an inexisting file: {filepath!r}"
+msgstr ""
+
+#: sat/memory/cache.py:102
+msgid "following file is missing while purging cache: {path}"
+msgstr ""
+
+#: sat/memory/cache.py:200
+msgid "missing filename for cache {uid!r}"
+msgstr ""
+
+#: sat/memory/cache.py:207
+msgid "missing file referenced in cache {uid!r}: {filename}"
+msgstr ""
+
+#: sat/memory/disco.py:95
+msgid ""
+"no feature/identity found in disco element (hash: {cap_hash}), ignoring: "
+"{xml}"
+msgstr ""
+
+#: sat/memory/disco.py:274
+#, python-format
+msgid "Error while requesting [%(jid)s]: %(error)s"
+msgstr ""
+
+#: sat/memory/disco.py:338
+msgid "received an item without jid"
+msgstr ""
+
+#: sat/memory/disco.py:410
+msgid "Capability hash generated: [{cap_hash}]"
+msgstr ""
+
+#: sat/memory/disco.py:459
+msgid "invalid item (no jid)"
+msgstr ""
+
+#: sat/memory/encryption.py:71
+msgid "Could not restart {namespace!r} encryption with {entity}: {err}"
+msgstr ""
+
+#: sat/memory/encryption.py:74
+msgid "encryption sessions restored"
+msgstr ""
+
+#: sat/memory/encryption.py:116
+msgid "Encryption plugin registered: {name}"
+msgstr ""
+
+#: sat/memory/encryption.py:127
+msgid "Can't find requested encryption plugin: {namespace}"
+msgstr ""
+
+#: sat/memory/encryption.py:148
+msgid "Can't find a plugin with the name \"{name}\"."
+msgstr ""
+
+#: sat/memory/encryption.py:213
+msgid "No encryption plugin is registered, an encryption session can't be started"
+msgstr ""
+
+#: sat/memory/encryption.py:226
+msgid "Session with {bare_jid} is already encrypted with {name}. Nothing to do."
+msgstr ""
+
+#: sat/memory/encryption.py:237
+msgid ""
+"Session with {bare_jid} is already encrypted with {name}. Please stop "
+"encryption session before changing algorithm."
+msgstr ""
+
+#: sat/memory/encryption.py:249
+msgid "No resource found for {destinee}, can't encrypt with {name}"
+msgstr ""
+
+#: sat/memory/encryption.py:251
+msgid "No resource specified to encrypt with {name}, using {destinee}."
+msgstr ""
+
+#: sat/memory/encryption.py:257
+msgid "{name} encryption must be used with bare jids."
+msgstr ""
+
+#: sat/memory/encryption.py:261
+msgid "Encryption session has been set for {entity_jid} with {encryption_name}"
+msgstr ""
+
+#: sat/memory/encryption.py:268
+msgid ""
+"Encryption session started: your messages with {destinee} are now end to "
+"end encrypted using {name} algorithm."
+msgstr ""
+
+#: sat/memory/encryption.py:273
+msgid "Message are encrypted only for {nb_devices} device(s): {devices_list}."
+msgstr ""
+
+#: sat/memory/encryption.py:291
+msgid "There is no encryption session with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:295
+msgid ""
+"The encryption session is not run with the expected plugin: encrypted "
+"with {current_name} and was expecting {expected_name}"
+msgstr ""
+
+#: sat/memory/encryption.py:304
+msgid ""
+"There is a session for the whole entity (i.e. all devices of the entity),"
+" not a directed one. Please use bare jid if you want to stop the whole "
+"encryption with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:312
+msgid "There is no directed session with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:327
+msgid "encryption session stopped with entity {entity}"
+msgstr ""
+
+#: sat/memory/encryption.py:335
+msgid ""
+"Encryption session finished: your messages with {destinee} are NOT end to"
+" end encrypted anymore.\n"
+"Your server administrators or {destinee} server administrators will be "
+"able to read them."
+msgstr ""
+
+#: sat/memory/encryption.py:389 sat/memory/encryption.py:397
+#: sat/memory/encryption.py:404
+#, fuzzy
+msgid "Encryption"
+msgstr "Connexion..."
+
+#: sat/memory/encryption.py:389
+msgid "unencrypted (plain text)"
+msgstr ""
+
+#: sat/memory/encryption.py:392
+msgid "End encrypted session"
+msgstr ""
+
+#: sat/memory/encryption.py:400
+msgid "Start {name} session"
+msgstr ""
+
+#: sat/memory/encryption.py:404
+msgid "⛨ {name} trust"
+msgstr ""
+
+#: sat/memory/encryption.py:407
+msgid "Manage {name} trust"
+msgstr ""
+
+#: sat/memory/encryption.py:470
+msgid "Starting e2e session with {peer_jid} as we receive encrypted messages"
+msgstr ""
+
+#: sat/memory/memory.py:230
+msgid "Memory manager init"
+msgstr "Initialisation du gestionnaire de mémoire"
+
+#: sat/memory/memory.py:249
+#, fuzzy
+msgid "Loading default params template"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat/memory/memory.py:281
+#, python-format
+msgid "Parameters loaded from file: %s"
+msgstr ""
+
+#: sat/memory/memory.py:284
+#, fuzzy, python-format
+msgid "Can't load parameters from file: %s"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat/memory/memory.py:299
+#, fuzzy, python-format
+msgid "Parameters saved to file: %s"
+msgstr "Échec de la désinscription: %s"
+
+#: sat/memory/memory.py:302
+#, fuzzy, python-format
+msgid "Can't save parameters to file: %s"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat/memory/memory.py:404
+msgid "Authentication failure of profile {profile}"
+msgstr ""
+
+#: sat/memory/memory.py:431
+#, fuzzy, python-format
+msgid "[%s] Profile session purge"
+msgstr "Ce profile n'est pas utilisé"
+
+#: sat/memory/memory.py:437
+#, python-format
+msgid "Trying to purge roster status cache for a profile not in memory: [%s]"
+msgstr ""
+
+#: sat/memory/memory.py:451
+msgid "requesting no profiles at all"
+msgstr ""
+
+#: sat/memory/memory.py:508
+msgid "Can't find component {component} entry point"
+msgstr ""
+
+#: sat/memory/memory.py:996
+msgid "Need a bare jid to delete all resources"
+msgstr ""
+
+#: sat/memory/memory.py:1028
+#, python-format
+msgid "Trying to encrypt a value for %s while the personal key is undefined!"
+msgstr ""
+
+#: sat/memory/memory.py:1048
+#, python-format
+msgid "Trying to decrypt a value for %s while the personal key is undefined!"
+msgstr ""
+
+#: sat/memory/memory.py:1069
+#, python-format
+msgid "Personal data (%(ns)s, %(key)s) has been successfuly encrypted"
+msgstr ""
+
+#: sat/memory/memory.py:1097
+msgid "Asking waiting subscriptions for a non-existant profile"
+msgstr "Demande des inscriptions en attente pour un profile inexistant"
+
+#: sat/memory/memory.py:1218
+msgid "invalid permission"
+msgstr ""
+
+#: sat/memory/memory.py:1249
+#, fuzzy
+msgid "unknown access type: {type}"
+msgstr "Type d'action inconnu"
+
+#: sat/memory/memory.py:1284
+msgid "You can't use path and parent at the same time"
+msgstr ""
+
+#: sat/memory/memory.py:1288
+msgid "\"..\" or \".\" can't be used in path"
+msgstr ""
+
+#: sat/memory/memory.py:1307
+msgid "Several directories found, this should not happen"
+msgstr ""
+
+#: sat/memory/memory.py:1766
+msgid "Can't delete directory, it is not empty"
+msgstr ""
+
+#: sat/memory/memory.py:1778
+msgid "deleting file {name} with hash {file_hash}"
+msgstr ""
+
+#: sat/memory/memory.py:1787
+msgid "no reference left to {file_path}, deleting"
+msgstr ""
+
+#: sat/memory/params.py:85 sat_frontends/primitivus/base.py:533
+msgid "General"
+msgstr "Général"
+
+#: sat/memory/params.py:86
+#, fuzzy
+msgid "Connection"
+msgstr "Connexion..."
+
+#: sat/memory/params.py:88
+msgid "Chat history limit"
+msgstr ""
+
+#: sat/memory/params.py:90
+msgid "Show offline contacts"
+msgstr ""
+
+#: sat/memory/params.py:92
+msgid "Show empty groups"
+msgstr ""
+
+#: sat/memory/params.py:95
+#, fuzzy
+msgid "Connect on backend startup"
+msgstr "Connexion au démarrage des frontends"
+
+#: sat/memory/params.py:96
+#, fuzzy
+msgid "Connect on frontend startup"
+msgstr "Connexion au démarrage des frontends"
+
+#: sat/memory/params.py:97
+#, fuzzy
+msgid "Disconnect on frontend closure"
+msgstr "Déconnexion à la fermeture des frontends"
+
+#: sat/memory/params.py:98
+msgid "Check certificate (don't uncheck if unsure)"
+msgstr ""
+
+#: sat/memory/params.py:163
+#, fuzzy, python-format
+msgid "Trying to purge cache of a profile not in memory: [%s]"
+msgstr "Tentative d'appel d'un profile inconnue"
+
+#: sat/memory/params.py:188
+#, fuzzy
+msgid "The profile name already exists"
+msgstr "Ce nom de profile existe déjà"
+
+#: sat/memory/params.py:203
+#, fuzzy
+msgid "Trying to delete an unknown profile"
+msgstr "Tentative d'accès à un profile inconnu"
+
+#: sat/memory/params.py:209
+#, fuzzy
+msgid "Trying to delete a connected profile"
+msgstr "Tentative de suppression d'un contact pour un profile inexistant"
+
+#: sat/memory/params.py:228
+msgid "No default profile, returning first one"
+msgstr "Pas de profile par défaut, envoi du premier"
+
+#: sat/memory/params.py:234
+#, fuzzy
+msgid "No profile exist yet"
+msgstr "Aucun profile sélectionné"
+
+#: sat/memory/params.py:244
+#, fuzzy, python-format
+msgid "Trying to access an unknown profile (%s)"
+msgstr "Tentative d'accès à un profile inconnu"
+
+#: sat/memory/params.py:338
+msgid "Trying to register frontends parameters with no specified app: aborted"
+msgstr ""
+
+#: sat/memory/params.py:347
+#, python-format
+msgid "Trying to register twice frontends parameters for %(app)s: abortedapp"
+msgstr ""
+
+#: sat/memory/params.py:363
+#, python-format
+msgid "Can't determine default value for [%(category)s/%(name)s]: %(reason)s"
+msgstr ""
+"Impossible de déterminer la valeur par défaut pour "
+"[%(category)s/%(name)s]: %(reason)s"
+
+#: sat/memory/params.py:385 sat/memory/params.py:563 sat/memory/params.py:624
+#, python-format
+msgid "Requested param [%(name)s] in category [%(category)s] doesn't exist !"
+msgstr ""
+"Le paramètre demandé  [%(name)s] dans la catégorie [%(category)s] "
+"n'existe pas !"
+
+#: sat/memory/params.py:440
+#, python-format
+msgid ""
+"Unset parameter (%(cat)s, %(param)s) of type list will use the default "
+"option '%(value)s'"
+msgstr ""
+
+#: sat/memory/params.py:448
+#, python-format
+msgid "Parameter (%(cat)s, %(param)s) of type list has no default option!"
+msgstr ""
+
+#: sat/memory/params.py:455
+#, python-format
+msgid ""
+"Parameter (%(cat)s, %(param)s) of type list has more than one default "
+"option!"
+msgstr ""
+
+#: sat/memory/params.py:585
+msgid "Requesting a param for an non-existant profile"
+msgstr "Demande d'un paramètre pour un profile inconnu"
+
+#: sat/memory/params.py:589
+#, fuzzy
+msgid "Requesting synchronous param for not connected profile"
+msgstr "Demande d'un paramètre pour un profile inconnu"
+
+#: sat/memory/params.py:633
+#, python-format
+msgid ""
+"Trying to get parameter '%(param)s' in category '%(cat)s' without "
+"authorization!!!param"
+msgstr ""
+
+#: sat/memory/params.py:649
+#, fuzzy
+msgid "Requesting a param for a non-existant profile"
+msgstr "Demande d'un paramètre pour un profile inconnu"
+
+#: sat/memory/params.py:962
+#, fuzzy
+msgid "Trying to set parameter for an unknown profile"
+msgstr "Tentative d'accès à un profile inconnu"
+
+#: sat/memory/params.py:968
+#, python-format
+msgid "Requesting an unknown parameter (%(category)s/%(name)s)"
+msgstr "Demande d'un paramètre inconnu: (%(category)s/%(name)s)"
+
+#: sat/memory/params.py:974
+msgid ""
+"{profile!r} is trying to set parameter {name!r} in category {category!r} "
+"without authorization!!!"
+msgstr ""
+
+#: sat/memory/params.py:992
+msgid ""
+"Trying to set parameter {name} in category {category} withan non-integer "
+"value"
+msgstr ""
+
+#: sat/memory/params.py:1011
+#, fuzzy, python-format
+msgid "Setting parameter (%(category)s, %(name)s) = %(value)s"
+msgstr "Demande d'un paramètre inconnu: (%(category)s/%(name)s)"
+
+#: sat/memory/params.py:1043
+msgid "Trying to encrypt a password while the personal key is undefined!"
+msgstr ""
+
+#: sat/memory/persistent.py:45
+msgid "PersistentDict can't be used before memory initialisation"
+msgstr ""
+
+#: sat/memory/persistent.py:175
+msgid "Calling load on LazyPersistentBinaryDict while it's not needed"
+msgstr ""
+
+#: sat/memory/sqlite.py:163
+msgid ""
+"too many db tries, we abandon! Error message: {msg}\n"
+"query was {query}"
+msgstr ""
+
+#: sat/memory/sqlite.py:166
+msgid "exception while running query, retrying ({try_}): {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:188
+msgid ""
+"too many interaction tries, we abandon! Error message: {msg}\n"
+"interaction method was: {interaction}\n"
+"interaction arguments were: {args}"
+msgstr ""
+
+#: sat/memory/sqlite.py:191
+msgid "exception while running interaction, retrying ({try_}): {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:210
+msgid "Connecting database"
+msgstr ""
+
+#: sat/memory/sqlite.py:223
+#, fuzzy
+msgid "The database is new, creating the tables"
+msgstr "Ce nom de profile existe déjà"
+
+#: sat/memory/sqlite.py:337
+#, fuzzy, python-format
+msgid "Can't delete profile [%s]"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat/memory/sqlite.py:354
+#, fuzzy, python-format
+msgid "Profile [%s] deleted"
+msgstr "Aucun profile sélectionné"
+
+#: sat/memory/sqlite.py:370
+#, fuzzy
+msgid "loading general parameters from database"
+msgstr "Impossible de charger les paramètres généraux !"
+
+#: sat/memory/sqlite.py:385
+#, fuzzy
+msgid "loading individual parameters from database"
+msgstr "Impossible de charger les paramètres individuels !"
+
+#: sat/memory/sqlite.py:426
+#, fuzzy, python-format
+msgid "Can't set general parameter (%(category)s/%(name)s) in databasecategory"
+msgstr "Demande d'un paramètre inconnu: (%(category)s/%(name)s)"
+
+#: sat/memory/sqlite.py:439
+#, fuzzy, python-format
+msgid ""
+"Can't set individual parameter (%(category)s/%(name)s) for [%(profile)s] "
+"in databasecategory"
+msgstr ""
+"Impossible de déterminer la valeur par défaut pour "
+"[%(category)s/%(name)s]: %(reason)s"
+
+#: sat/memory/sqlite.py:459
+msgid "Can't save following {key} in history (uid: {uid}, lang:{lang}): {value}"
+msgstr ""
+
+#: sat/memory/sqlite.py:473
+msgid ""
+"Can't save following thread in history (uid: {uid}): thread: {thread}), "
+"parent:{parent}"
+msgstr ""
+
+#: sat/memory/sqlite.py:498
+msgid ""
+"Can't save following message in history: from [{from_jid}] to [{to_jid}] "
+"(uid: {uid})"
+msgstr ""
+
+#: sat/memory/sqlite.py:701
+msgid ""
+"Can't {operation} data in database for namespace "
+"{namespace}{and_key}{for_profile}: {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:752
+msgid ""
+"getting {type}{binary} private values from database for namespace "
+"{namespace}{keys}"
+msgstr ""
+
+#: sat/memory/sqlite.py:986
+msgid "Can't save file metadata for [{profile}]: {reason}"
+msgstr ""
+
+#: sat/memory/sqlite.py:1025
+msgid "table not updated, probably due to race condition, trying again ({tries})"
+msgstr ""
+
+#: sat/memory/sqlite.py:1027
+msgid "Can't update file table"
+msgstr ""
+
+#: sat/memory/sqlite.py:1132
+msgid ""
+"Your local schema is up-to-date, but database versions mismatch, fixing "
+"it..."
+msgstr ""
+
+#: sat/memory/sqlite.py:1142
+msgid ""
+"There is a schema mismatch, but as we are on a dev version, database will"
+" be updated"
+msgstr ""
+
+#: sat/memory/sqlite.py:1146
+msgid ""
+"schema version is up-to-date, but local schema differ from expected "
+"current schema"
+msgstr ""
+
+#: sat/memory/sqlite.py:1149
+#, python-format
+msgid ""
+"Here are the commands that should fix the situation, use at your own risk"
+" (do a backup before modifying database), you can go to SàT's MUC room at"
+" sat@chat.jabberfr.org for help\n"
+"### SQL###\n"
+"%s\n"
+"### END SQL ###\n"
+msgstr ""
+
+#: sat/memory/sqlite.py:1153
+msgid ""
+"You database version is higher than the one used in this SàT version, are"
+" you using several version at the same time? We can't run SàT with this "
+"database."
+msgstr ""
+
+#: sat/memory/sqlite.py:1161
+msgid ""
+"Database content needs a specific processing, local database will be "
+"updated"
+msgstr ""
+
+#: sat/memory/sqlite.py:1163
+msgid "Database schema has changed, local database will be updated"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:91
+#, fuzzy
+msgid "Add D-Bus management to Ad-Hoc commands"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_adhoc_dbus.py:98
+#, fuzzy
+msgid "plugin Ad-Hoc D-Bus initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_adhoc_dbus.py:127
+msgid "Media Players"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:255
+#, fuzzy
+msgid "Command selection"
+msgstr "Sélection du contrat"
+
+#: sat/plugins/plugin_adhoc_dbus.py:298
+#, fuzzy
+msgid "Updated"
+msgstr "mise à jour de %s"
+
+#: sat/plugins/plugin_adhoc_dbus.py:302
+msgid "Command sent"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:367
+msgid "Can't retrieve remote controllers on {device_jid}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:405
+#, fuzzy
+msgid "No media player found."
+msgstr "Aucune donnée trouvée"
+
+#: sat/plugins/plugin_adhoc_dbus.py:409 sat/plugins/plugin_adhoc_dbus.py:451
+#, fuzzy
+msgid "Media Player Selection"
+msgstr "Sélection du contrat"
+
+#: sat/plugins/plugin_adhoc_dbus.py:414
+msgid "Ignoring MPRIS bus without suffix"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:428
+msgid "missing media_player value"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:431
+msgid ""
+"Media player ad-hoc command trying to use non MPRIS bus. Hack attempt? "
+"Refused bus: {bus_name}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:434
+msgid "Invalid player name."
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:440
+msgid "Can't get D-Bus proxy: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:441
+msgid "Media player is not available anymore"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:460
+msgid "Can't retrieve attribute {name}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import.py:45
+msgid ""
+"Blog import management:\n"
+"This plugin manage the different blog importers which can register to it,"
+" and handle generic importing tasks."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import.py:64
+#, fuzzy
+msgid "plugin Blog Import initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:58
+msgid "Blog importer for Dokuwiki blog engine."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:61
+msgid "import posts from Dokuwiki blog engine"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:63
+msgid ""
+"This importer handle Dokuwiki blog engine.\n"
+"\n"
+"To use it, you need an admin access to a running Dokuwiki website\n"
+"(local or on the Internet). The importer retrieves the data using\n"
+"the XMLRPC Dokuwiki API.\n"
+"\n"
+"You can specify a namespace (that could be a namespace directory\n"
+"or a single post) or leave it empty to use the root namespace \"/\"\n"
+"and import all the posts.\n"
+"\n"
+"You can specify a new media repository to modify the internal\n"
+"media links and make them point to the URL of your choice, but\n"
+"note that the upload is not done automatically: a temporary\n"
+"directory will be created on your local drive and you will\n"
+"need to upload it yourself to your repository via SSH or FTP.\n"
+"\n"
+"Following options are recognized:\n"
+"\n"
+"location: DokuWiki site URL\n"
+"user: DokuWiki admin user\n"
+"passwd: DokuWiki admin password\n"
+"namespace: DokuWiki namespace to import (default: root namespace \"/\")\n"
+"media_repo: URL to the new remote media repository (default: none)\n"
+"limit: maximal number of posts to import (default: 100)\n"
+"\n"
+"Example of usage (with jp frontend):\n"
+"\n"
+"jp import dokuwiki -p dave --pwd xxxxxx --connect\n"
+"    http://127.0.1.1 -o user souliane -o passwd qwertz\n"
+"    -o namespace public:2015:10\n"
+"    -o media_repo http://media.diekulturvermittlung.at\n"
+"\n"
+"This retrieves the 100 last blog posts from http://127.0.1.1 that\n"
+"are inside the namespace \"public:2015:10\" using the Dokuwiki user\n"
+"\"souliane\", and it imports them to sat profile dave's microblog node.\n"
+"Internal Dokuwiki media that were hosted on http://127.0.1.1 are now\n"
+"pointing to http://media.diekulturvermittlung.at.\n"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:351
+#, fuzzy
+msgid "plugin Dokuwiki Import initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:383
+msgid ""
+"DokuWiki media files will be *downloaded* to {temp_dir} - to finish the "
+"import you have to upload them *manually* to {media_repo}"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:389
+msgid ""
+"DokuWiki media files will be *uploaded* to the XMPP server. Hyperlinks to"
+" these media may not been updated though."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:393
+msgid ""
+"DokuWiki media files will *stay* on {location} - some of them may be "
+"protected by DokuWiki ACL and will not be accessible."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:42
+msgid "Blog importer for Dotclear blog engine."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:45
+msgid "import posts from Dotclear blog engine"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:47
+msgid ""
+"This importer handle Dotclear blog engine.\n"
+"\n"
+"To use it, you'll need to export your blog to a flat file.\n"
+"You must go in your admin interface and select Plugins/Maintenance then "
+"Backup.\n"
+"Export only one blog if you have many, i.e. select \"Download database of"
+" current blog\"\n"
+"Depending on your configuration, your may need to use Import/Export "
+"plugin and export as a flat file.\n"
+"\n"
+"location: you must use the absolute path to your backup for the location "
+"parameter\n"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:266
+#, fuzzy
+msgid "plugin Dotclear Import initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_comp_file_sharing.py:69
+msgid "Component hosting and sharing files"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:79
+msgid ""
+"You are over quota, your maximum allowed size is {quota} and you are "
+"already using {used_space}, you can't upload {file_size} more."
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:350
+#, fuzzy
+msgid "File Sharing initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_comp_file_sharing.py:431
+#: sat/plugins/plugin_comp_file_sharing_management.py:422
+msgid "Can't create thumbnail: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:454
+msgid "Reusing already generated hash"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:485
+msgid "Can't get thumbnail for {final_path}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:574
+msgid "{peer_jid} is trying to access an unauthorized file: {name}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:582
+msgid "no matching file found ({file_data})"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:43
+msgid ""
+"Experimental handling of file management for file sharing. This plugins "
+"allows to change permissions of stored files/directories or remove them."
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:72
+#, fuzzy
+msgid "File Sharing Management plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:185
+#, fuzzy
+msgid "file not found"
+msgstr "Aucun profile sélectionné"
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:187
+#: sat/plugins/plugin_comp_file_sharing_management.py:192
+#: sat/plugins/plugin_comp_file_sharing_management.py:474
+msgid "forbidden"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:191
+msgid "Only owner can manage files"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:258
+msgid "Please select permissions for this directory"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:260
+msgid "Please select permissions for this file"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:305
+msgid "Can't use read_allowed values: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:332
+msgid "management session done"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:358
+msgid ""
+"Are you sure to delete directory {name} and all files and directories "
+"under it?"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:362
+#, fuzzy, python-format
+msgid "Are you sure to delete file {name}?"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:387
+#, fuzzy, python-format
+msgid "file deleted"
+msgstr "Aucun profile sélectionné"
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:465
+msgid "thumbnails generated"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:481
+msgid "You are currently using {size_used} on {size_quota}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:484
+msgid "unlimited quota"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:39
+msgid "Debug plugin to have a telnet server"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:53
+msgid ""
+"/!\\ Manhole debug server activated, be sure to not use it in production,"
+" this is dangerous /!\\"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:55
+msgid "You can connect to manhole server using telnet on port {port}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_command_export.py:39
+#, fuzzy
+msgid "Implementation of command export"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_exp_command_export.py:92
+#, fuzzy
+msgid "Plugin command export initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_exp_events.py:50
+msgid "Experimental implementation of XMPP events management"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:60
+#, fuzzy
+msgid "Event plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_exp_events.py:177
+msgid "no src found for image"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:187
+#, fuzzy
+msgid "no {uri_type} element found!"
+msgstr "Aucun profile sélectionné"
+
+#: sat/plugins/plugin_exp_events.py:189
+msgid "incomplete {uri_type} element"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:191
+msgid "bad {uri_type} element"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:231
+#, fuzzy
+msgid "No event element has been found"
+msgstr "Aucune donnée trouvée"
+
+#: sat/plugins/plugin_exp_events.py:233
+msgid "No event with this id has been found"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:290
+msgid "event_id must be set"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:333
+msgid "The given URI is not valid: {uri}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:354
+#: sat/plugins/plugin_exp_list_of_interest.py:100
+#, fuzzy
+msgid "requested node already exists"
+msgstr "Ce nom de profile existe déjà"
+
+#: sat/plugins/plugin_exp_events.py:373
+msgid "missing node"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:426
+msgid "No event found in item {item_id}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:519
+msgid "no data found for {item_id} (service: {service}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:542 sat/plugins/plugin_exp_events.py:623
+msgid "\"XEP-0277\" (blog) plugin is needed for this feature"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:548
+msgid "got event data"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:579
+msgid "affiliation set on blog and comments nodes"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:619
+msgid "\"Invitations\" plugin is needed for this feature"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:632
+#, fuzzy
+msgid "invitation created"
+msgstr "Connexion..."
+
+#: sat/plugins/plugin_exp_invitation.py:44
+#, fuzzy
+msgid "Experimental handling of invitations"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_exp_invitation.py:57
+#, fuzzy
+msgid "Invitation plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_exp_invitation.py:251
+msgid "Can't get item linked with invitation: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:256
+msgid "Invitation was linking to a non existing item"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:262
+msgid "Can't retrieve namespace of invitation: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:281
+msgid "Bad invitation, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:321
+msgid "No handler for namespace \"{namespace}\", invitation ignored"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:39
+msgid "Experimental handling of invitations for file sharing"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:46
+#, fuzzy
+msgid "File Sharing Invitation plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_exp_invitation_file.py:85
+#: sat/plugins/plugin_exp_invitation_file.py:92
+msgid "file sharing"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:87
+msgid "photo album"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:93
+msgid ""
+"{profile} has received an invitation for a files repository "
+"({type_human}) with namespace {sharing_ns!r} at path [{path}]"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_pubsub.py:42
+msgid "Invitations for pubsub based features"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_pubsub.py:49
+#, fuzzy
+msgid "Pubsub Invitation plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_exp_jingle_stream.py:52
+msgid "Jingle Stream plugin"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:55
+#, fuzzy, python-format
+msgid "{peer} wants to send you a stream, do you accept ?"
+msgstr ""
+"Le contact %(jid)s veut vous envoyer le fichier %(filename)s\n"
+"Êtes vous d'accord ?"
+
+#: sat/plugins/plugin_exp_jingle_stream.py:56
+#, fuzzy
+msgid "Stream Request"
+msgstr "Gestion des paramètres"
+
+#: sat/plugins/plugin_exp_jingle_stream.py:123
+msgid "stream can't be used with multiple consumers"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:170
+#, fuzzy
+msgid "No client connected, can't send data"
+msgstr "Connexion du client SOCKS 5 démarrée"
+
+#: sat/plugins/plugin_exp_jingle_stream.py:180
+#, fuzzy
+msgid "Plugin Stream initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_exp_jingle_stream.py:270
+msgid "given port is invalid"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:45
+msgid "Detect and set message language when unknown"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:48
+#: sat/plugins/plugin_misc_watched.py:43 sat/plugins/plugin_xep_0249.py:73
+msgid "Misc"
+msgstr "Divers"
+
+#: sat/plugins/plugin_exp_lang_detect.py:50
+msgid "language detection"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:66
+#, fuzzy
+msgid "Language detection plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_exp_list_of_interest.py:46
+msgid "Experimental handling of interesting XMPP locations"
+msgstr ""
+
+#: sat/plugins/plugin_exp_list_of_interest.py:56
+#, fuzzy
+msgid "List of Interest plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_exp_list_of_interest.py:287
+msgid "Missing interest element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_parrot.py:40
+msgid "Implementation of parrot mode (repeat messages between 2 entities)"
+msgstr ""
+
+#: sat/plugins/plugin_exp_parrot.py:56
+#, fuzzy
+msgid "Plugin Parrot initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_exp_parrot.py:63 sat/plugins/plugin_xep_0045.py:150
+#: sat/plugins/plugin_xep_0048.py:102 sat/plugins/plugin_xep_0092.py:61
+#: sat/plugins/plugin_xep_0199.py:56 sat/plugins/plugin_xep_0249.py:95
+#: sat/plugins/plugin_xep_0384.py:476
+msgid "Text commands not available"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_admin.py:40
+msgid ""
+"\\Implementation of Pubsub Administrator\n"
+"This allows a pubsub administrator to overwrite completly items, "
+"including publisher.\n"
+"Specially useful when importing a node."
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:40
+msgid "Experimental plugin to launch on action on Pubsub notifications"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:56
+#, fuzzy
+msgid "PubSub Hook initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:93
+msgid "node manager already set for {node}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:101
+msgid "node manager installed on {node}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:107
+#, fuzzy
+msgid "trying to remove a {node} without hook"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:112
+msgid "hook removed"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:114
+msgid "node still needed for an other hook"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:119
+msgid "{hook_type} is not handled"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:123
+#: sat/plugins/plugin_exp_pubsub_hook.py:167
+msgid "{hook_type} hook type not implemented yet"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:139
+msgid "{persistent} hook installed on {node} for {profile}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:140
+msgid "persistent"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:140
+msgid "temporary"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:173
+msgid "Can't load Pubsub hook at node {node}, it will be removed: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:185
+msgid "Error while running Pubsub hook for node {node}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:41
+msgid "Generic import plugin, base for specialized importers"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:49
+#, fuzzy
+msgid "plugin Import initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_import.py:67
+msgid "initializing {name} import handler"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:158
+msgid "invalid json option: {option}"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:296
+msgid "uploading subitems"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:327
+#, fuzzy
+msgid "An {handler_name} importer with the name {name} already exist"
+msgstr "Ce nom de profile existe déjà"
+
+#: sat/plugins/plugin_merge_req_mercurial.py:37
+msgid "Merge request handler for Mercurial"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:40
+msgid "handle Mercurial repository"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:71
+msgid "Mercurial merge request handler initialization"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:75
+msgid "Mercurial executable (hg) not found, can't use Mercurial handler"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:116
+msgid "invalid changeset signature"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:136
+msgid "unexpected time data: {data}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:50
+msgid "Libervia account creation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:75
+msgid ""
+"Welcome to Libervia, the web interface of Salut à Toi.\n"
+"\n"
+"Your account on {domain} has been successfully created.\n"
+"This is a demonstration version to show you the current status of the "
+"project.\n"
+"It is still under development, please keep it in mind!\n"
+"\n"
+"Here is your connection information:\n"
+"\n"
+"Login on {domain}: {profile}\n"
+"Jabber ID (JID): {jid}\n"
+"Your password has been chosen by yourself during registration.\n"
+"\n"
+"In the beginning, you have nobody to talk to. To find some contacts, you "
+"may use the users' directory:\n"
+"    - make yourself visible in \"Service / Directory subscription\".\n"
+"    - search for people with \"Contacts\" / Search directory\".\n"
+"\n"
+"Any feedback welcome. Thank you!\n"
+"\n"
+"Salut à Toi association\n"
+"https://www.salut-a-toi.org\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:109
+#, fuzzy
+msgid "Plugin Account initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_account.py:294
+msgid "Failed to send account creation confirmation to {email}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:313
+msgid "New Libervia account created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:339
+msgid "Your Libervia account has been created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:363
+msgid "xmpp_domain needs to be set in sat.conf. Using \"{default}\" meanwhile"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:379
+msgid "Manage your account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:385
+#, fuzzy
+msgid "Change your password"
+msgstr "Sauvegarde du nouveau mot de passe"
+
+#: sat/plugins/plugin_misc_account.py:387
+msgid "Current profile password"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:389
+#, fuzzy
+msgid "New password"
+msgstr "Sauvegarde du nouveau mot de passe"
+
+#: sat/plugins/plugin_misc_account.py:391
+#, fuzzy
+msgid "New password (again)"
+msgstr "Sauvegarde du nouveau mot de passe"
+
+#: sat/plugins/plugin_misc_account.py:431 sat/stdui/ui_profile_manager.py:73
+#, fuzzy
+msgid "The provided profile password doesn't match."
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat/plugins/plugin_misc_account.py:432
+msgid "Attempt failure"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:477
+msgid "The values entered for the new password are not equal."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:495
+#, fuzzy
+msgid "Change your password?"
+msgstr "Sauvegarde du nouveau mot de passe"
+
+#: sat/plugins/plugin_misc_account.py:500
+msgid ""
+"Note for advanced users: this will actually change both your SàT profile "
+"password AND your XMPP account password."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:504
+msgid "Continue with changing the password?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:528
+#: sat/plugins/plugin_misc_register_account.py:133
+#, fuzzy
+msgid "Confirmation"
+msgstr "Connexion..."
+
+#: sat/plugins/plugin_misc_account.py:529
+msgid "Your password has been changed."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:533
+#: sat/plugins/plugin_misc_account.py:606
+#: sat/plugins/plugin_misc_account.py:716 sat_frontends/primitivus/base.py:790
+#: sat_frontends/primitivus/base.py:831
+#: sat_frontends/quick_frontend/quick_profile_manager.py:133
+msgid "Error"
+msgstr "Erreur"
+
+#: sat/plugins/plugin_misc_account.py:535
+#, python-format
+msgid "Your password could not be changed: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:548
+#, fuzzy
+msgid "Delete your account?"
+msgstr "Enregistrement d'un nouveau compte"
+
+#: sat/plugins/plugin_misc_account.py:551
+msgid ""
+"If you confirm this dialog, you will be disconnected and then your XMPP "
+"account AND your SàT profile will both be DELETED."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:555
+msgid "contact list, messages history, blog posts and commentsGROUPBLOG"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:558
+msgid "contact list and messages history"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:561
+#, python-format
+msgid ""
+"All your data stored on %(server)s, including your %(target)s will be "
+"erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:567
+#: sat/plugins/plugin_misc_account.py:642
+#: sat/plugins/plugin_misc_account.py:658
+#: sat/plugins/plugin_misc_account.py:674
+msgid ""
+"There is no other confirmation dialog, this is the very last one! Are you"
+" sure?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:608
+#, python-format
+msgid "Your XMPP account could not be deleted: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:628
+msgid "Delete all your (micro-)blog posts and comments?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:632
+msgid ""
+"If you confirm this dialog, all the (micro-)blog data you submitted will "
+"be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:637
+msgid "These are the public and private posts and comments you sent to any group."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:649
+msgid "Delete all your (micro-)blog posts?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:653
+msgid ""
+"If you confirm this dialog, all the public and private posts you sent to "
+"any group will be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:665
+msgid "Delete all your (micro-)blog comments?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:669
+msgid ""
+"If you confirm this dialog, all the public and private comments you made "
+"on other people's posts will be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:689
+msgid "blog posts and comments"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:694
+msgid "blog posts"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:699
+msgid "comments"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:705
+#, fuzzy
+msgid "Deletion confirmation"
+msgstr "désinscription confirmée pour [%s]"
+
+#: sat/plugins/plugin_misc_account.py:707
+#, python-format
+msgid "Your %(target)s have been deleted."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:709
+msgid ""
+"Known issue of the demo version: you need to refresh the page to make the"
+" deleted posts actually disappear."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:718
+#, python-format
+msgid "Your %(target)s could not be deleted: %(message)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:50
+msgid "Manage Android platform specificities, like pause or notifications"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:92
+msgid "sound on notifications"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:94
+#, fuzzy
+msgid "Normal"
+msgstr "Général"
+
+#: sat/plugins/plugin_misc_android.py:95 sat/plugins/plugin_misc_android.py:103
+msgid "Never"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:99
+msgid "Vibrate on notifications"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:101
+#, fuzzy
+msgid "Always"
+msgstr "Chercher les transports"
+
+#: sat/plugins/plugin_misc_android.py:102
+msgid "In vibrate mode"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:243
+#, fuzzy
+msgid "plugin Android initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_android.py:362
+#, fuzzy
+msgid "new message from {contact}"
+msgstr "Attend qu'un fichier soit envoyé par un contact"
+
+#: sat/plugins/plugin_misc_app_manager.py:64
+msgid ""
+"Applications Manager\n"
+"\n"
+"Manage external applications using packagers, OS "
+"virtualization/containers or other\n"
+"software management tools.\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:80
+#, fuzzy
+msgid "plugin Applications Manager initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_app_manager.py:166
+msgid ""
+"No value found for \"public_url\", using \"example.org\" for now, please "
+"set the proper value in libervia.conf"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:170
+msgid ""
+"invalid value for \"public_url\" ({value}), it musts not start with "
+"schema (\"http\"), ignoring it and using \"example.org\" instead"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:43
+msgid "Attachments handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:53
+#, fuzzy
+msgid "plugin Attach initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_attach.py:109
+msgid "Can't resize attachment of unknown type: {attachment}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:125
+msgid "Attachment {path!r} has been resized at {new_path!r}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:129
+msgid "Can't resize attachment of type {main_type!r}: {attachment}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:143
+msgid "No plugin can handle attachment with {destinee}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:210
+msgid "certificate check disabled for upload, this is dangerous!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_debug.py:35
+msgid "Set of method to make development and debugging easier"
+msgstr ""
+
+#: sat/plugins/plugin_misc_debug.py:41
+#, fuzzy
+msgid "Plugin Debug initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_download.py:43
+msgid "File download management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:50
+#, fuzzy
+msgid "plugin Download initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_download.py:95
+msgid "Can't download file: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:99 sat_frontends/jp/cmd_file.py:498
+#, fuzzy
+msgid "Can't download file"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat/plugins/plugin_misc_download.py:176
+msgid "certificate check disabled for download, this is dangerous!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:187
+msgid "Can't download URI {uri}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:44
+msgid "invitation of people without XMPP account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:59
+msgid "You have been invited by {host_name} to {app_name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:60
+msgid ""
+"Hello {name}!\n"
+"\n"
+"You have received an invitation from {host_name} to participate to "
+"\"{app_name}\".\n"
+"To join, you just have to click on the following URL:\n"
+"{url}\n"
+"\n"
+"Please note that this URL should not be shared with anybody!\n"
+"If you want more details on {app_name}, you can check {app_url}.\n"
+"\n"
+"Welcome!\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:76
+#, fuzzy
+msgid "plugin Invitations initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_email_invitation.py:105
+msgid "You can't use following key(s) in extra, they are reserved: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:198
+msgid "You can't use following key(s) in both args and extra: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:207
+msgid "You need to provide a main email address before using emails_extra"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:213
+msgid "You need to provide url_template if you use default message body"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:216
+#, fuzzy
+msgid "creating an invitation"
+msgstr "Connexion..."
+
+#: sat/plugins/plugin_misc_email_invitation.py:237
+msgid "You need to specify xmpp_domain in sat.conf"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:251
+msgid "Can't create XMPP account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:254
+msgid "requested jid already exists, trying with {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:265
+msgid "account {jid_} created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:317
+msgid "somebody"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:345
+msgid "Not all arguments have been consumed: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:443
+msgid "Skipping reserved key {key}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_extra_pep.py:38
+msgid "Display messages from extra PEP services"
+msgstr ""
+
+#: sat/plugins/plugin_misc_extra_pep.py:69
+#, fuzzy
+msgid "Plugin Extra PEP initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_file.py:45
+msgid ""
+"File Tansfer Management:\n"
+"This plugin manage the various ways of sending a file, and choose the "
+"best one."
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:52
+msgid "Please select a file to send to {peer}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:53
+msgid "File sending"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:54
+msgid ""
+"{peer} wants to send the file \"{name}\" to you:\n"
+"{desc}\n"
+"\n"
+"The file has a size of {size_human}\n"
+"\n"
+"Do you accept ?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:58
+#, fuzzy
+msgid "Confirm file transfer"
+msgstr "Transfert de fichier"
+
+#: sat/plugins/plugin_misc_file.py:59
+msgid "File {} already exists, are you sure you want to overwrite ?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:60
+#, fuzzy
+msgid "File exists"
+msgstr "Aucun profile sélectionné"
+
+#: sat/plugins/plugin_misc_file.py:70
+#, fuzzy
+msgid "plugin File initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_file.py:82
+#, fuzzy
+msgid "Action"
+msgstr "Connexion..."
+
+#: sat/plugins/plugin_misc_file.py:82
+#, fuzzy
+msgid "send file"
+msgstr "Envoi un fichier"
+
+#: sat/plugins/plugin_misc_file.py:85
+#, fuzzy
+msgid "Send a file"
+msgstr "Envoi un fichier"
+
+#: sat/plugins/plugin_misc_file.py:121
+msgid "{name} method will be used to send the file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:132
+msgid "Can't send {filepath} to {peer_jid} with {method_name}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:166 sat/plugins/plugin_xep_0100.py:101
+msgid "Invalid JID"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:36
+#, fuzzy
+msgid "forums management"
+msgstr "Initialisation du gestionnaire de mémoire"
+
+#: sat/plugins/plugin_misc_forums.py:43
+msgid "forums management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:54
+#, fuzzy
+msgid "forums plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_forums.py:97
+msgid "forums arguments must be a list of forums"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:109
+msgid "A forum item must be a dictionary"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:114
+msgid "following forum name is not unique: {name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:116
+msgid "creating missing forum node"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:130
+msgid "Unknown forum attribute: {key}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:136
+msgid "forum need a title or a name"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:138
+msgid "forum need uri or sub-forums"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:154
+msgid "missing <forums> element"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:160
+msgid "Unexpected element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:168
+msgid "Following attributes are unknown: {unknown}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:176
+msgid "invalid forum, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:180
+msgid "unkown forums sub element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:53
+#, fuzzy
+msgid "Implementation of microblogging fine permissions"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_misc_groupblog.py:61
+#, fuzzy
+msgid "Group blog plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_misc_groupblog.py:80
+msgid "Server is not able to manage item-access pubsub, we can't use group blog"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:86
+msgid "Server can manage group blogs"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:49
+msgid "Identity manager"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:58
+#, fuzzy
+msgid "Plugin Identity initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_identity.py:293
+#: sat/plugins/plugin_misc_identity.py:365
+msgid "No callback registered for {metadata_name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:316
+msgid "Error while trying to get {metadata_name} with {callback}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:376
+msgid "Error while trying to set {metadata_name} with {callback}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:691
+msgid "Can't set metadata {metadata_name!r}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:57
+msgid "This plugin help to discover our external IP address."
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:64
+msgid "Allow external get IP"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:67
+msgid "Confirm external site request"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:68
+msgid ""
+"To facilitate data transfer, we need to contact a website.\n"
+"A request will be done on {page}\n"
+"That means that administrators of {domain} can know that you use "
+"\"{app_name}\" and your IP Address.\n"
+"\n"
+"IP address is an identifier to locate you on Internet (similar to a phone"
+" number).\n"
+"\n"
+"Do you agree to do this request ?\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:100
+#, fuzzy
+msgid "plugin IP discovery initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_lists.py:39
+msgid "Pubsub Lists"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:47
+msgid "Pubsub lists management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:52
+msgid "TODO List"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:63 sat/plugins/plugin_misc_lists.py:113
+#: sat/plugins/plugin_misc_lists.py:156
+msgid "status"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:67
+msgid "to do"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:71
+#, fuzzy
+msgid "in progress"
+msgstr "Progression: "
+
+#: sat/plugins/plugin_misc_lists.py:75
+#, fuzzy
+msgid "done"
+msgstr "En ligne"
+
+#: sat/plugins/plugin_misc_lists.py:83 sat/plugins/plugin_misc_lists.py:180
+msgid "priority"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:87 sat/plugins/plugin_misc_lists.py:184
+msgid "major"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:91 sat/plugins/plugin_misc_lists.py:188
+#, fuzzy
+msgid "normal"
+msgstr "Général"
+
+#: sat/plugins/plugin_misc_lists.py:95 sat/plugins/plugin_misc_lists.py:192
+msgid "minor"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:106
+msgid "Grocery List"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:109 sat_frontends/jp/cmd_info.py:69
+#: sat_frontends/jp/cmd_info.py:111
+#, fuzzy
+msgid "name"
+msgstr "Jeu"
+
+#: sat/plugins/plugin_misc_lists.py:110
+msgid "quantity"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:117
+msgid "to buy"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:121
+#, fuzzy
+msgid "bought"
+msgstr "À propos"
+
+#: sat/plugins/plugin_misc_lists.py:130
+msgid "Tickets"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:140 sat_frontends/jp/cmd_info.py:69
+msgid "type"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:144
+msgid "bug"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:148
+#, fuzzy
+msgid "feature request"
+msgstr "Gestion des paramètres"
+
+#: sat/plugins/plugin_misc_lists.py:160
+#, fuzzy
+msgid "queued"
+msgstr "refusé"
+
+#: sat/plugins/plugin_misc_lists.py:164
+msgid "started"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:168
+msgid "review"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:172
+#, fuzzy
+msgid "closed"
+msgstr "fermeture"
+
+#: sat/plugins/plugin_misc_lists.py:208
+#, fuzzy
+msgid "Pubsub lists plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_merge_requests.py:35
+msgid "Merge requests management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:42
+msgid "Merge requests management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:69
+#, fuzzy
+msgid "Merge requests plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_misc_merge_requests.py:121
+#, fuzzy
+msgid "a handler with name {name} already exists!"
+msgstr "Ce nom de profile existe déjà"
+
+#: sat/plugins/plugin_misc_merge_requests.py:134
+msgid ""
+"merge requests of type {type} are already handled by {old_handler}, "
+"ignoring {new_handler}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:241
+msgid "repository must be specified"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:244
+msgid "{field} is set by backend, you must not set it in frontend"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:253
+msgid "{name} handler will be used"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:256
+msgid "repository {path} can't be handled by any installed handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:259
+msgid "no handler for this repository has been found"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:265
+msgid "No handler of this name found"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:269
+msgid "export data is empty, do you have any change to send?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:312
+msgid "No handler can handle data type \"{type}\""
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:348
+msgid "No handler found to import {data_type}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:350
+msgid "Importing patch [{item_id}] using {name} handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:45
+msgid "Automatic NAT port mapping using UPnP"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:62
+#, fuzzy
+msgid "plugin NAT Port initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_nat_port.py:177
+msgid "addportmapping error: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:215
+msgid "error while trying to map ports: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:42
+#, fuzzy
+msgid "Implementation of Quiz game"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_misc_quiz.py:55
+#, fuzzy
+msgid "Plugin Quiz initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_quiz.py:345
+msgid ""
+"Bienvenue dans cette partie rapide de quizz, le premier à atteindre le "
+"score de 9 remporte le jeu\n"
+"\n"
+"Attention, tu es prêt ?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:380 sat/plugins/plugin_misc_tarot.py:664
+#, python-format
+msgid "Player %(player)s is ready to start [status: %(status)s]"
+msgstr "Le joueur %(player)s est prêt à commencer [statut: %(status)s]"
+
+#: sat/plugins/plugin_misc_quiz.py:456 sat/plugins/plugin_misc_radiocol.py:353
+#, fuzzy, python-format
+msgid "Unmanaged game element: %s"
+msgstr "élément de jeu de carte inconnu: %s"
+
+#: sat/plugins/plugin_misc_radiocol.py:57
+#, fuzzy
+msgid "Implementation of radio collective"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_misc_radiocol.py:76
+#, fuzzy
+msgid "Radio collective initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_radiocol.py:180
+msgid ""
+"The uploaded file has been rejected, only Ogg Vorbis and MP3 songs are "
+"accepted."
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:210
+msgid "No more participants in the radiocol: cleaning data"
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:249
+msgid "INTERNAL ERROR: can't find full path of the song to delete"
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:258
+#, python-format
+msgid "INTERNAL ERROR: can't find %s on the file system"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:41
+#, fuzzy
+msgid "Register XMPP account"
+msgstr "Enregistrement d'un nouveau compte"
+
+#: sat/plugins/plugin_misc_register_account.py:49
+#, fuzzy
+msgid "Plugin Register Account initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_register_account.py:76
+msgid "Missing values"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:78
+#, fuzzy
+msgid "No user JID or password given: can't register new account."
+msgstr ""
+"L'utilisateur, le mot de passe ou le serveur n'ont pas été spécifiés, "
+"impossible d'inscrire un nouveau compte."
+
+#: sat/plugins/plugin_misc_register_account.py:87
+msgid "Register new account"
+msgstr "Enregistrement d'un nouveau compte"
+
+#: sat/plugins/plugin_misc_register_account.py:92
+msgid "Do you want to register a new XMPP account {jid}?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:134
+#, fuzzy
+msgid "Registration successful."
+msgstr "Inscription réussie"
+
+#: sat/plugins/plugin_misc_register_account.py:138
+msgid "Failure"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:139
+#, fuzzy, python-format
+msgid "Registration failed: %s"
+msgstr "Échec de l'inscription: %s"
+
+#: sat/plugins/plugin_misc_register_account.py:143
+#, fuzzy
+msgid "Username already exists, please choose an other one."
+msgstr "Ce nom d'utilisateur existe déjà, veuillez en choisir un autre"
+
+#: sat/plugins/plugin_misc_room_game.py:49
+msgid "Base class for MUC games"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:221
+#, python-format
+msgid "%(user)s not allowed to join the game %(game)s in %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:380
+#, python-format
+msgid "%(user)s not allowed to invite for the game %(game)s in %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:433
+#, python-format
+msgid "Still waiting for %(users)s before starting the game %(game)s in %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:472
+#, python-format
+msgid "Preparing room for %s game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:475
+#, fuzzy
+msgid "Unknown profile"
+msgstr "Afficher profile"
+
+#: sat/plugins/plugin_misc_room_game.py:583
+#, fuzzy, python-format
+msgid "%(game)s game already created in room %(room)s"
+msgstr "%(profile)s est déjà dans le salon %(room_jid)s"
+
+#: sat/plugins/plugin_misc_room_game.py:589
+#, python-format
+msgid "%(game)s game in room %(room)s can only be created by %(user)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:610
+#, fuzzy, python-format
+msgid "Creating %(game)s game in room %(room)s"
+msgstr "Construction du jeu de Tarot"
+
+#: sat/plugins/plugin_misc_room_game.py:615
+#: sat/plugins/plugin_misc_room_game.py:646
+#: sat/plugins/plugin_misc_tarot.py:581
+#, python-format
+msgid "profile %s is unknown"
+msgstr "le profil %s est inconnu"
+
+#: sat/plugins/plugin_misc_room_game.py:661
+#, python-format
+msgid "new round for %s game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:44
+msgid "Plugin for static blogs"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:66
+#, fuzzy
+msgid "Page title"
+msgstr "Petite"
+
+#: sat/plugins/plugin_misc_static_blog.py:68
+msgid "Banner URL"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:70
+msgid "Background image URL"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:72
+msgid "Keywords"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:74
+msgid "Description"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:97 sat/plugins/plugin_sec_otr.py:508
+#: sat/plugins/plugin_sec_otr.py:542 sat/plugins/plugin_sec_otr.py:568
+#: sat/plugins/plugin_sec_otr.py:592
+msgid "jid key is not present !"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:102
+msgid "Not available"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:104
+msgid "Retrieving a blog from an external domain is not implemented yet."
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:47
+#, fuzzy
+msgid "Implementation of Tarot card game"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_misc_tarot.py:60
+#, fuzzy
+msgid "Plugin Tarot initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_tarot.py:78
+msgid "Passe"
+msgstr "Passe"
+
+#: sat/plugins/plugin_misc_tarot.py:79
+msgid "Petite"
+msgstr "Petite"
+
+#: sat/plugins/plugin_misc_tarot.py:80
+msgid "Garde"
+msgstr "Garde"
+
+#: sat/plugins/plugin_misc_tarot.py:81
+msgid "Garde Sans"
+msgstr "Garde Sans"
+
+#: sat/plugins/plugin_misc_tarot.py:82
+msgid "Garde Contre"
+msgstr "Garde Contre"
+
+#: sat/plugins/plugin_misc_tarot.py:171
+msgid "contrat selection"
+msgstr "Sélection du contrat"
+
+#: sat/plugins/plugin_misc_tarot.py:189
+msgid "scores"
+msgstr "points"
+
+#: sat/plugins/plugin_misc_tarot.py:273 sat/plugins/plugin_misc_tarot.py:313
+#, python-format
+msgid ""
+"Player %(excuse_owner)s give %(card_waited)s to %(player_waiting)s for "
+"Excuse compensation"
+msgstr ""
+"Le joueur %(excuse_owner)s donne %(card_waited)s à %(player_waiting)s en "
+"compensation pour l'Excuse"
+
+#: sat/plugins/plugin_misc_tarot.py:327
+#, python-format
+msgid ""
+"%(excuse_owner)s keep the Excuse but has not card to give, %(winner)s is "
+"waiting for one"
+msgstr ""
+"%(excuse_owner)s garde l'Excuse mais n'a aucune carte à donner, "
+"%(winner)s en attend une"
+
+#: sat/plugins/plugin_misc_tarot.py:338
+#: sat_frontends/primitivus/game_tarot.py:309
+msgid "Draw game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:341 sat/plugins/plugin_misc_tarot.py:436
+#, python-format
+msgid ""
+"\n"
+"--\n"
+"%(player)s:\n"
+"score for this game ==> %(score_game)i\n"
+"total score ==> %(total_score)i"
+msgstr ""
+"\n"
+"--\n"
+"%(player)s:\n"
+"points pour cette partie ==> %(score_game)i\n"
+"point au total ==> %(total_score)i"
+
+#: sat/plugins/plugin_misc_tarot.py:397
+#, fuzzy
+msgid "INTERNAL ERROR: contrat not managed (mispelled ?)"
+msgstr "ERREUR INTERNE: contrat inconnu (mal orthographié ?)"
+
+#: sat/plugins/plugin_misc_tarot.py:422
+#, fuzzy, python-format
+msgid ""
+"The attacker (%(attaquant)s) makes %(points)i and needs to make "
+"%(point_limit)i (%(nb_bouts)s oulder%(plural)s%(separator)s%(bouts)s): "
+"(s)he %(victory)s"
+msgstr ""
+"L'attaquant (%(attaquant)s) fait %(points)i et joue pour %(point_limit)i "
+"(%(nb_bouts)s bout%(plural)s%(separator)s%(bouts)s): il %(victory)s"
+
+#: sat/plugins/plugin_misc_tarot.py:507
+msgid "Internal error: unmanaged game stage"
+msgstr "ERREUR INTERNE: état de jeu inconnu"
+
+#: sat/plugins/plugin_misc_tarot.py:530 sat/plugins/plugin_misc_tarot.py:562
+msgid "session id doesn't exist, session has probably expired"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:540
+#, python-format
+msgid "contrat [%(contrat)s] choosed by %(profile)s"
+msgstr "contrat [%(contrat)s] choisi par %(profile)s"
+
+#: sat/plugins/plugin_misc_tarot.py:584
+#, fuzzy, python-format
+msgid "Cards played by %(profile)s: [%(cards)s]"
+msgstr "Cartes jouées par %(profile)s: [%(cards)s]"
+
+#: sat/plugins/plugin_misc_tarot.py:709
+msgid "Everybody is passing, round ended"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:723
+#, python-format
+msgid "%(player)s win the bid with %(contrat)s"
+msgstr "%(player)s remporte l'enchère avec %(contrat)s"
+
+#: sat/plugins/plugin_misc_tarot.py:751
+#, fuzzy
+msgid "tarot: chien received"
+msgstr "tarot: chien reçu"
+
+#: sat/plugins/plugin_misc_tarot.py:828
+#, python-format
+msgid "The winner of this trick is %s"
+msgstr "le vainqueur de cette main est %s"
+
+#: sat/plugins/plugin_misc_tarot.py:896
+#, fuzzy, python-format
+msgid "Unmanaged error type: %s"
+msgstr "type d'erreur inconnu: %s"
+
+#: sat/plugins/plugin_misc_tarot.py:898
+#, python-format
+msgid "Unmanaged card game element: %s"
+msgstr "élément de jeu de carte inconnu: %s"
+
+#: sat/plugins/plugin_misc_text_commands.py:40
+msgid "IRC like text commands"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:60
+msgid ""
+"Type '/help' to get a list of the available commands. If you didn't want "
+"to use a command, please start your message with '//' to escape the "
+"slash."
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:66
+#, fuzzy
+msgid "Text commands initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_misc_text_commands.py:162
+#, python-format
+msgid "Skipping not callable [%s] attribute"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:166
+msgid "Skipping cmd_ method"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:173
+msgid "Conflict for command [{old_name}], renaming it to [{new_name}]"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:180
+#, python-format
+msgid "Registered text command [%s]"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:244
+#, fuzzy, python-format
+msgid "Invalid command /%s. "
+msgstr "Mauvais nom de profile"
+
+#: sat/plugins/plugin_misc_text_commands.py:277
+#, fuzzy, python-format
+msgid "Unknown command /%s. "
+msgstr "Type d'action inconnu"
+
+#: sat/plugins/plugin_misc_text_commands.py:286
+msgid "group discussions"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:288
+msgid "one to one discussions"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:290
+msgid "/{command} command only applies in {context}."
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:374
+msgid "Invalid jid, can't whois"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:380
+#, python-format
+msgid "whois for %(jid)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:436
+msgid "Invalid command name [{}]\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:457
+#, python-format
+msgid ""
+"Text commands available:\n"
+"%s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:462
+msgid ""
+"/{name}: {short_help}\n"
+"{syntax}{args_help}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:465
+msgid " syntax: {}\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_syntaxes.py:43 sat/test/constants.py:56
+#, fuzzy
+msgid "Composition"
+msgstr "Connexion..."
+
+#: sat/plugins/plugin_misc_text_syntaxes.py:142
+msgid "Management of various text syntaxes (XHTML-IM, Markdown, etc)"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_syntaxes.py:184
+#, fuzzy
+msgid "Text syntaxes plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_misc_upload.py:41
+msgid "File upload management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:45
+#, fuzzy
+msgid "Please select a file to upload"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat/plugins/plugin_misc_upload.py:46
+msgid "File upload"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:53
+#, fuzzy
+msgid "plugin Upload initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_upload.py:92
+msgid "Can't upload file: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:96 sat_frontends/jp/cmd_file.py:586
+msgid "Can't upload file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:32
+msgid "URI finder"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:39
+msgid ""
+"    Plugin to find URIs in well know location.\n"
+"    This allows to retrieve settings to work with a project (e.g. pubsub "
+"node used for merge-requests).\n"
+"    "
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:52
+#, fuzzy
+msgid "URI finder plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_uri_finder.py:87
+msgid "Ignoring already found uri for key \"{key}\""
+msgstr ""
+
+#: sat/plugins/plugin_misc_watched.py:37
+msgid "Watch for entities presence, and send notification accordingly"
+msgstr ""
+
+#: sat/plugins/plugin_misc_watched.py:45
+#, fuzzy, python-format
+msgid "Watched entity {entity} is connected"
+msgstr "Vous êtes déjà connecté !"
+
+#: sat/plugins/plugin_misc_watched.py:62
+#, fuzzy
+msgid "Watched initialisation"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_misc_welcome.py:34
+msgid "Plugin which manage welcome message and things to to on first connection."
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:42
+msgid "Display welcome message"
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:43
+msgid "Welcome to Libervia/Salut à Toi"
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:46
+msgid ""
+"Welcome to a free (as in freedom) network!\n"
+"\n"
+"If you have any trouble, or you want to help us for the bug hunting, you "
+"can contact us in real time chat by using the “Help / Official chat room”"
+"  menu.\n"
+"\n"
+"To use Libervia, you'll need to add contacts, either people you know, or "
+"people you discover by using the “Contacts / Search directory” menu.\n"
+"\n"
+"We hope that you'll enjoy using this project.\n"
+"\n"
+"The Libervia/Salut à Toi Team\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:75
+#, fuzzy
+msgid "plugin Welcome initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_xmllog.py:36
+msgid "Send raw XML logs to bridge"
+msgstr ""
+
+#: sat/plugins/plugin_misc_xmllog.py:51
+#, fuzzy
+msgid "Activate XML log"
+msgstr "Lancement du flux"
+
+#: sat/plugins/plugin_misc_xmllog.py:55
+#, fuzzy
+msgid "Plugin XML Log initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_misc_xmllog.py:69
+msgid "XML log activated"
+msgstr ""
+
+#: sat/plugins/plugin_misc_xmllog.py:81
+#, fuzzy
+msgid "INTERNAL ERROR: Unmanaged XML type"
+msgstr "ERREUR INTERNE: contrat inconnu (mal orthographié ?)"
+
+#: sat/plugins/plugin_sec_aesgcm.py:48
+msgid ""
+"    Implementation of AES-GCM scheme, a way to encrypt files (not "
+"official XMPP standard).\n"
+"    See https://xmpp.org/extensions/inbox/omemo-media-sharing.html for "
+"details\n"
+"    "
+msgstr ""
+
+#: sat/plugins/plugin_sec_aesgcm.py:63
+#, fuzzy
+msgid "AESGCM plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_sec_otr.py:50
+#, fuzzy
+msgid "Implementation of OTR"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_sec_otr.py:55
+msgid "OTR"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:56
+msgid ""
+"To authenticate your correspondent, you need to give your below "
+"fingerprint *BY AN EXTERNAL CANAL* (i.e. not in this chat), and check "
+"that the one he gives you is the same as below. If there is a mismatch, "
+"there can be a spy between you!"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:61
+msgid ""
+"You private key is used to encrypt messages for your correspondent, "
+"nobody except you must know it, if you are in doubt, you should drop it!"
+"\n"
+"\n"
+"Are you sure you want to drop your private key?"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:67
+msgid "Some of advanced features are disabled !"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:169
+#, python-format
+msgid "/!\\ conversation with %(other_jid)s is now UNENCRYPTED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:182
+#, fuzzy
+msgid "trusted"
+msgstr "refusé"
+
+#: sat/plugins/plugin_sec_otr.py:182
+#, fuzzy
+msgid "untrusted"
+msgstr "refusé"
+
+#: sat/plugins/plugin_sec_otr.py:185
+msgid "{trusted} OTR conversation with {other_jid} REFRESHED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:189
+msgid ""
+"{trusted} encrypted OTR conversation started with {other_jid}\n"
+"{extra_info}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:201
+msgid "OTR conversation with {other_jid} is FINISHED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:209
+msgid "Unknown OTR state"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:249
+msgid "Save is called but privkey is None !"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:308
+#, fuzzy
+msgid "OTR plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_sec_otr.py:418
+msgid "You have no private key yet, start an OTR conversation to have one"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:424
+msgid "No private key"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:436
+msgid ""
+"Your fingerprint is:\n"
+"{fingerprint}\n"
+"\n"
+"Start an OTR conversation to have your correspondent one."
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:442 sat/plugins/plugin_xep_0384.py:687
+msgid "Fingerprint"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:453
+msgid "Your correspondent {correspondent} is now TRUSTED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:459
+msgid "Your correspondent {correspondent} is now UNTRUSTED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:477
+msgid "Authentication ({entity_jid})"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:483
+msgid ""
+"Your own fingerprint is:\n"
+"{fingerprint}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:486
+msgid ""
+"Your correspondent fingerprint should be:\n"
+"{fingerprint}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:492
+msgid "Is your correspondent fingerprint the same as here ?"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:494
+msgid "yes"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:494
+msgid "no"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:520
+msgid ""
+"Can't start an OTR session, there is already an encrypted session with "
+"{name}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:598
+msgid "You don't have a private key yet !"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:611
+msgid "Your private key has been dropped"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:620
+msgid "Confirm private key drop"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:649
+msgid "WARNING: received unencrypted data in a supposedly encrypted context"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:656
+msgid "WARNING: received OTR encrypted data in an unencrypted context"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:662
+msgid "WARNING: received OTR error message: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:668
+#, fuzzy, python-format
+msgid "Error while trying de decrypt OTR message: {msg}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat/plugins/plugin_sec_otr.py:780
+msgid ""
+"Your message was not sent because your correspondent closed the encrypted"
+" conversation on his/her side. Either close your own side, or refresh the"
+" session."
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:785
+msgid "Message discarded because closed encryption channel"
+msgstr ""
+
+#: sat/plugins/plugin_syntax_wiki_dotclear.py:40
+#, fuzzy
+msgid "Implementation of Dotclear wiki syntax"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_syntax_wiki_dotclear.py:664
+#, fuzzy
+msgid "Dotclear wiki syntax plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_tickets_import.py:38
+msgid ""
+"Tickets import management:\n"
+"This plugin manage the different tickets importers which can register to "
+"it, and handle generic importing tasks."
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:57
+#, fuzzy
+msgid "plugin Tickets Import initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_tickets_import.py:111
+msgid "comments_uri key will be generated and must not be used by importer"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:115
+msgid "{key} must be a list"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:174
+msgid "mapping option must be a dictionary"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:179
+msgid "keys and values of mapping must be sources and destinations ticket fields"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:41
+msgid "Tickets importer for Bugzilla"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:44
+msgid "import tickets from Bugzilla xml export file"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:46
+msgid ""
+"This importer handle Bugzilla xml export file.\n"
+"\n"
+"To use it, you'll need to export tickets using XML.\n"
+"Tickets will be uploaded with the same ID as for Bugzilla, any existing "
+"ticket with this ID will be replaced.\n"
+"\n"
+"location: you must use the absolute path to your .xml file\n"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:128
+#, fuzzy
+msgid "Bugilla Import plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:37
+#, fuzzy
+msgid "Implementation of directory subscription"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:47
+#, fuzzy
+msgid "Directory subscription plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:50
+#: sat/plugins/plugin_xep_0050.py:315 sat/plugins/plugin_xep_0100.py:84
+msgid "Service"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:50
+msgid "Directory subscription"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:53
+msgid "User directory subscription"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0020.py:46
+#, fuzzy
+msgid "Implementation of Feature Negotiation"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0020.py:52
+#, fuzzy
+msgid "Plugin XEP_0020 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0020.py:104
+msgid "More than one value choosed for {}, keeping the first one"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:66
+#, fuzzy
+msgid "Implementation of Extended Stanza Addressing"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0033.py:76
+#, fuzzy
+msgid "Extended Stanza Addressing plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0033.py:97
+msgid "XEP-0033 is being used but the server doesn't support it!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:103
+#, fuzzy
+msgid " or "
+msgstr "Formulaire"
+
+#: sat/plugins/plugin_xep_0033.py:105
+#, python-format
+msgid ""
+"Stanzas using XEP-0033 should be addressed to %(expected)s, not "
+"%(current)s!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:111
+msgid "TODO: addressing has been fixed by the backend... fix it in the frontend!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:56
+#, fuzzy
+msgid "Implementation of Multi-User Chat"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0045.py:89
+#, fuzzy
+msgid "Plugin XEP_0045 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0045.py:145
+msgid "MUC"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:145
+#, fuzzy
+msgid "configure"
+msgstr " Configurer l'application"
+
+#: sat/plugins/plugin_xep_0045.py:146
+#, fuzzy
+msgid "Configure Multi-User Chat room"
+msgstr "Implémentation de l'initialisation de flux pour le transfert de fichier "
+
+#: sat/plugins/plugin_xep_0045.py:194
+msgid ""
+"Received non delayed message in a room before its initialisation: "
+"state={state}, msg={msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:216 sat/plugins/plugin_xep_0045.py:224
+#: sat/plugins/plugin_xep_0045.py:880
+msgid "This room has not been joined"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:283
+msgid "Room joining cancelled by user"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:288
+msgid "Rooms in {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:303
+msgid "room locked !"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:306
+#, fuzzy
+msgid "Error while configuring the room: {failure_}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat/plugins/plugin_xep_0045.py:322
+msgid "Room {} is restricted"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:323
+msgid "This room is restricted, please enter the password"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:332
+#, fuzzy, python-format
+msgid "Error while joining the room {room}{suffix}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat/plugins/plugin_xep_0045.py:334
+msgid "Group chat error"
+msgstr "Erreur de salon de discussion"
+
+#: sat/plugins/plugin_xep_0045.py:401
+msgid "room_jid key is not present !"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:406
+msgid "No configuration available for this room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:440 sat/plugins/plugin_xep_0045.py:442
+msgid "Session ID doesn't exist, session has probably expired."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:441
+#, fuzzy
+msgid "Room configuration failed"
+msgstr "confirmation de type Oui/Non demandée"
+
+#: sat/plugins/plugin_xep_0045.py:447
+#, fuzzy
+msgid "Room configuration succeed"
+msgstr "confirmation de type Oui/Non demandée"
+
+#: sat/plugins/plugin_xep_0045.py:448
+msgid "The new settings have been saved."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:509
+msgid "No MUC service found on main server"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:538
+msgid ""
+"Invalid room identifier: {room_id}'. Please give a room short or full "
+"identifier like 'room' or 'room@{muc_service}'."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:558
+#, fuzzy, python-format
+msgid "{profile} is already in room {room_jid}"
+msgstr "%(profile)s est déjà dans le salon %(room_jid)s"
+
+#: sat/plugins/plugin_xep_0045.py:561
+#, fuzzy, python-format
+msgid "[{profile}] is joining room {room} with nick {nick}"
+msgstr "[%(profile)s] rejoint %(room)s avec %(nick)s"
+
+#: sat/plugins/plugin_xep_0045.py:729
+msgid "You must provide a member's nick to kick."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:738
+msgid "You have kicked {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:740 sat/plugins/plugin_xep_0045.py:776
+msgid " for the following reason: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:763
+msgid "You must provide a valid JID to ban, like in '/ban contact@example.net'"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:774
+msgid "You have banned {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:802
+msgid ""
+"You must provide a valid JID to affiliate, like in '/affiliate "
+"contact@example.net member'"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:808
+#, python-format
+msgid "You must provide a valid affiliation: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:815
+msgid "New affiliation for {entity}: {affiliation}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:862
+msgid "No known default MUC service {unparsed}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:867
+#, fuzzy, python-format
+msgid "{} is not a valid JID!"
+msgstr "%s n'est pas un JID valide !"
+
+#: sat/plugins/plugin_xep_0045.py:885
+#, fuzzy, python-format
+msgid "Nickname: %s"
+msgstr "fichier enregistré dans %s"
+
+#: sat/plugins/plugin_xep_0045.py:887
+#, python-format
+msgid "Entity: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:889
+#, python-format
+msgid "Affiliation: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:891
+#, fuzzy, python-format
+msgid "Role: %s"
+msgstr "Profile:"
+
+#: sat/plugins/plugin_xep_0045.py:893
+#, fuzzy, python-format
+msgid "Status: %s"
+msgstr "Sélection du contrat"
+
+#: sat/plugins/plugin_xep_0045.py:895
+#, python-format
+msgid "Show: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:960
+msgid ""
+"room {room} is not in expected state: room is in state {current_state} "
+"while we were expecting {expected_state}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1093
+msgid "No message received while offline in {room_jid}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1097
+msgid "We have received {num_mess} message(s) in {room_jid} while offline."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1141
+msgid "missing nick in presence: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1217
+#, fuzzy, python-format
+msgid "user {nick} has joined room {room_id}"
+msgstr "L'utilisateur %(nick)s a rejoint le salon (%(room_id)s)"
+
+#: sat/plugins/plugin_xep_0045.py:1234
+msgid "=> {} has joined the room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1253
+#, fuzzy, python-format
+msgid "Room ({room}) left ({profile})"
+msgstr "contrat [%(contrat)s] choisi par %(profile)s"
+
+#: sat/plugins/plugin_xep_0045.py:1267
+#, fuzzy, python-format
+msgid "user {nick} left room {room_id}"
+msgstr "L'utilisateur %(nick)s a quitté le salon (%(room_id)s)"
+
+#: sat/plugins/plugin_xep_0045.py:1279
+msgid "<= {} has left the room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1342
+msgid "received history in unexpected state in room {room} (state: {state})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1350
+msgid "storing the unexpected message anyway, to avoid loss"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1437
+#, fuzzy, python-format
+msgid "New subject for room ({room_id}): {subject}"
+msgstr "Nouveau sujet pour le salon (%(room_id)s): %(subject)s"
+
+#: sat/plugins/plugin_xep_0047.py:62
+#, fuzzy
+msgid "Implementation of In-Band Bytestreams"
+msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
+
+#: sat/plugins/plugin_xep_0047.py:71
+#, fuzzy
+msgid "In-Band Bytestreams plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0047.py:162
+msgid "IBB stream opening"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:171
+#, python-format
+msgid "Ignoring unexpected IBB transfer: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:176
+msgid "sended jid inconsistency (man in the middle attack attempt ?)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:206
+msgid "IBB stream closing"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:228
+#, fuzzy
+msgid "Received data for an unknown session id"
+msgstr "Confirmation inconnue reçue"
+
+#: sat/plugins/plugin_xep_0047.py:236
+msgid ""
+"sended jid inconsistency (man in the middle attack attempt ?)\n"
+"initial={initial}\n"
+"given={given}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:246
+msgid "Sequence error"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:261
+msgid "Invalid base64 data"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:45
+#, fuzzy
+msgid "Implementation of bookmarks"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0048.py:58
+#, fuzzy
+msgid "Bookmarks plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0048.py:63 sat_frontends/primitivus/base.py:540
+msgid "Groups"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:63
+msgid "Bookmarks"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:66
+msgid "Use and manage bookmarks"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:147
+msgid "Private XML storage not available"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:260
+#, fuzzy
+msgid "No room jid selected"
+msgstr "Aucun profile sélectionné"
+
+#: sat/plugins/plugin_xep_0048.py:280
+msgid "Bookmarks manager"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:310 sat_frontends/jp/cmd_bookmarks.py:126
+msgid "add a bookmark"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:312
+#, fuzzy
+msgid "Name"
+msgstr "Jeu"
+
+#: sat/plugins/plugin_xep_0048.py:314 sat_frontends/jp/cmd_profile.py:175
+msgid "jid"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:316
+msgid "Nickname"
+msgstr "Surnon"
+
+#: sat/plugins/plugin_xep_0048.py:318
+msgid "Autojoin"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:321 sat_frontends/primitivus/xmlui.py:470
+msgid "Save"
+msgstr "Sauvegarder"
+
+#: sat/plugins/plugin_xep_0048.py:367
+msgid "Bookmarks will be local only"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:368
+#, python-format
+msgid "Type selected for \"auto\" storage: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:500
+msgid "Bad arguments"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:509
+#, python-format
+msgid "All [%s] bookmarks are being removed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:520
+msgid "Bookmark added"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0049.py:37
+#, fuzzy
+msgid "Implementation of private XML storage"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0049.py:45
+#, fuzzy
+msgid "Plugin XEP-0049 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0050.py:51
+#: sat_frontends/quick_frontend/constants.py:29
+msgid "Online"
+msgstr "En ligne"
+
+#: sat/plugins/plugin_xep_0050.py:52
+msgid "Away"
+msgstr "Absent"
+
+#: sat/plugins/plugin_xep_0050.py:53
+#: sat_frontends/quick_frontend/constants.py:30
+msgid "Free for chat"
+msgstr "Libre pour discuter"
+
+#: sat/plugins/plugin_xep_0050.py:54
+#: sat_frontends/quick_frontend/constants.py:32
+msgid "Do not disturb"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:55
+msgid "Left"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:56 sat_frontends/primitivus/base.py:535
+#, fuzzy
+msgid "Disconnect"
+msgstr "Déconnexion..."
+
+#: sat/plugins/plugin_xep_0050.py:67
+#, fuzzy
+msgid "Implementation of Ad-Hoc Commands"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0050.py:126
+#, fuzzy, python-format
+msgid "The groups [{group}] is unknown for profile [{profile}])"
+msgstr "Tentative d'accès à un profile inconnu"
+
+#: sat/plugins/plugin_xep_0050.py:284
+#, fuzzy
+msgid "plugin XEP-0050 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0050.py:315
+#, fuzzy
+msgid "Commands"
+msgstr "Mauvais nom de profile"
+
+#: sat/plugins/plugin_xep_0050.py:318
+msgid "Execute ad-hoc commands"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:329
+msgid "Status"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:364
+msgid "Missing command element"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:379
+#, fuzzy
+msgid "Please select a command"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat/plugins/plugin_xep_0050.py:397
+#, fuzzy, python-format
+msgid "Invalid note type [%s], using info"
+msgstr "Type d'action inconnu"
+
+#: sat/plugins/plugin_xep_0050.py:408
+msgid "WARNING"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:409
+#, fuzzy
+msgid "ERROR"
+msgstr "Erreur"
+
+#: sat/plugins/plugin_xep_0050.py:457
+msgid "No known payload found in ad-hoc command result, aborting"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:464
+#, fuzzy
+msgid "No payload found"
+msgstr "Aucune donnée trouvée"
+
+#: sat/plugins/plugin_xep_0050.py:574
+#, fuzzy
+msgid "Please enter target jid"
+msgstr "Veuillez entrer le JID de votre nouveau contact"
+
+#: sat/plugins/plugin_xep_0050.py:588
+#, fuzzy
+msgid "status selection"
+msgstr "Sélection du contrat"
+
+#: sat/plugins/plugin_xep_0050.py:618
+msgid "Status updated"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:64
+msgid "Implementation of vcard-temp"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0054.py:84
+msgid "Plugin XEP_0054 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0054.py:99
+msgid "No avatar in cache for {profile}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:137
+msgid "Decoding binary"
+msgstr "Décodage des données"
+
+#: sat/plugins/plugin_xep_0054.py:242
+msgid "vCard element not found for {entity_jid}: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:287
+msgid "Can't get vCard for {entity_jid}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:291
+msgid "VCard found"
+msgstr "VCard trouvée"
+
+#: sat/plugins/plugin_xep_0055.py:53
+#, fuzzy
+msgid "Implementation of Jabber Search"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0055.py:70
+#, fuzzy
+msgid "Jabber search plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0055.py:100 sat/stdui/ui_contact_list.py:39
+#: sat/stdui/ui_contact_list.py:45 sat/stdui/ui_contact_list.py:51
+#: sat_frontends/primitivus/base.py:539
+#: sat_frontends/primitivus/contact_list.py:50
+#, fuzzy
+msgid "Contacts"
+msgstr "&Contacts"
+
+#: sat/plugins/plugin_xep_0055.py:100
+msgid "Search directory"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:103
+msgid "Search user directory"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:143
+#, fuzzy, python-format
+msgid "Search users"
+msgstr "Remplacement de l'utilisateur %s"
+
+#: sat/plugins/plugin_xep_0055.py:174
+msgid "Search for"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:181
+msgid "Simple search"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:191 sat/plugins/plugin_xep_0055.py:305
+msgid "Search"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:226
+msgid "Advanced search"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:246
+msgid "Search on"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:248
+msgid "Other service"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:256
+msgid "Refresh fields"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:260
+msgid "Displaying the search form for"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:341
+msgid "Search results"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:346
+msgid "The search gave no result"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:386 sat/plugins/plugin_xep_0055.py:493
+msgid "No query element found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:391 sat/plugins/plugin_xep_0055.py:498
+msgid "No data form found"
+msgstr "Aucune donnée trouvée"
+
+#: sat/plugins/plugin_xep_0055.py:403
+#, fuzzy, python-format
+msgid "Fields request failure: %s"
+msgstr "Échec de l'inscription: %s"
+
+#: sat/plugins/plugin_xep_0055.py:478
+msgid "The search could not be performed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:510
+#, fuzzy, python-format
+msgid "Search request failure: %s"
+msgstr "Échec de la désinscription: %s"
+
+#: sat/plugins/plugin_xep_0059.py:42
+#, fuzzy
+msgid "Implementation of Result Set Management"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0059.py:52
+#, fuzzy
+msgid "Result Set Management plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0059.py:65
+msgid "rsm_max can't be negative"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:56
+#, fuzzy
+msgid "Implementation of PubSub Protocol"
+msgstr "Implémentation du protocole de transports"
+
+#: sat/plugins/plugin_xep_0060.py:95
+#, fuzzy
+msgid "PubSub plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0060.py:323
+msgid "Can't retrieve pubsub_service from conf, we'll use first one that we find"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:487
+msgid "Can't parse items: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:556
+msgid "Invalid item: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:572
+msgid ""
+"Can't use publish-options ({options}) on node {node}, re-publishing "
+"without them: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:905 sat/plugins/plugin_xep_0060.py:948
+msgid "Invalid result: missing <affiliations> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:916 sat/plugins/plugin_xep_0060.py:961
+msgid "Invalid result: bad <affiliation> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1284
+msgid "Invalid result: missing <subscriptions> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1289
+msgid "Invalid result: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1299
+msgid "Invalid result: bad <subscription> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0065.py:90
+msgid "Implementation of SOCKS5 Bytestreams"
+msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
+
+#: sat/plugins/plugin_xep_0065.py:528
+msgid "File transfer completed, closing connection"
+msgstr "Transfert de fichier terminé, fermeture de la connexion"
+
+#: sat/plugins/plugin_xep_0065.py:695
+#, python-format
+msgid "Socks 5 client connection lost (reason: %s)"
+msgstr "Connexion du client SOCKS5 perdue (raison: %s)"
+
+#: sat/plugins/plugin_xep_0065.py:723
+msgid "Plugin XEP_0065 initialization"
+msgstr "Initialisation du plugin XEP_0065"
+
+#: sat/plugins/plugin_xep_0065.py:781
+#, fuzzy, python-format
+msgid "Socks5 Stream server launched on port {}"
+msgstr "Lancement du serveur de flux Socks5 sur le port %d"
+
+#: sat/plugins/plugin_xep_0070.py:56
+#, fuzzy
+msgid "Implementation of HTTP Requests via XMPP"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0070.py:66
+#, fuzzy
+msgid "Plugin XEP_0070 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0070.py:79
+msgid "XEP-0070 Verifying HTTP Requests via XMPP (iq)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:88
+msgid "XEP-0070 Verifying HTTP Requests via XMPP (message)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:98
+#, fuzzy
+msgid "Auth confirmation"
+msgstr "Connexion..."
+
+#: sat/plugins/plugin_xep_0070.py:99
+msgid ""
+"{auth_url} needs to validate your identity, do you agree?\n"
+"Validation code : {auth_id}\n"
+"\n"
+"Please check that this code is the same as on {auth_url}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:117
+msgid "XEP-0070 reply iq"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:122
+msgid "XEP-0070 reply message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:127
+msgid "XEP-0070 reply error"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0071.py:55
+#, fuzzy
+msgid "Implementation of XHTML-IM"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0071.py:94
+#, fuzzy
+msgid "XHTML-IM plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0071.py:223
+msgid "Can't have XHTML and rich content at the same time"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:41
+msgid "Implementation of in-band registration"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0077.py:54
+#, fuzzy
+msgid "Registration asked for {jid}"
+msgstr "Éched de l'insciption (%s)"
+
+#: sat/plugins/plugin_xep_0077.py:79
+msgid "Stream started with {server}, now registering"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:85
+#, fuzzy, python-format
+msgid "Registration answer: {}"
+msgstr "réponse à la demande d'inscription: %s"
+
+#: sat/plugins/plugin_xep_0077.py:89
+#, fuzzy, python-format
+msgid "Registration failure: {}"
+msgstr "Échec de l'inscription: %s"
+
+#: sat/plugins/plugin_xep_0077.py:116
+msgid "Plugin XEP_0077 initialization"
+msgstr "Initialisation du plugin XEP_0077"
+
+#: sat/plugins/plugin_xep_0077.py:176
+#, fuzzy
+msgid "Can't find data form"
+msgstr "Impossible de trouver la VCard de %s"
+
+#: sat/plugins/plugin_xep_0077.py:178
+msgid "This gateway can't be managed by SàT, sorry :("
+msgstr "Ce transport ne peut être gérée par SàT, désolé :("
+
+#: sat/plugins/plugin_xep_0077.py:202 sat/plugins/plugin_xep_0077.py:212
+#, python-format
+msgid "Registration failure: %s"
+msgstr "Échec de l'inscription: %s"
+
+#: sat/plugins/plugin_xep_0077.py:206
+#, python-format
+msgid "registration answer: %s"
+msgstr "réponse à la demande d'inscription: %s"
+
+#: sat/plugins/plugin_xep_0077.py:215
+msgid "Username already exists, please choose an other one"
+msgstr "Ce nom d'utilisateur existe déjà, veuillez en choisir un autre"
+
+#: sat/plugins/plugin_xep_0077.py:229
+#, fuzzy, python-format
+msgid "Asking registration for {}"
+msgstr "Demande d'enregistrement pour [%s]"
+
+#: sat/plugins/plugin_xep_0085.py:55
+#, fuzzy
+msgid "Implementation of Chat State Notifications Protocol"
+msgstr "Implémentation du protocole de transports"
+
+#: sat/plugins/plugin_xep_0085.py:97
+msgid "Enable chat state notifications"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0085.py:101
+#, fuzzy
+msgid "Chat State Notifications plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0092.py:42
+#, fuzzy
+msgid "Implementation of Software Version"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0092.py:48
+#, fuzzy
+msgid "Plugin XEP_0092 initialization"
+msgstr "Initialisation du plugin XEP_0096"
+
+#: sat/plugins/plugin_xep_0092.py:119
+#, fuzzy, python-format
+msgid "Client name: %s"
+msgstr "fichier enregistré dans %s"
+
+#: sat/plugins/plugin_xep_0092.py:121
+#, python-format
+msgid "Client version: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:123
+#, fuzzy, python-format
+msgid "Operating system: %s"
+msgstr "réponse à la demande d'inscription: %s"
+
+#: sat/plugins/plugin_xep_0092.py:128
+msgid "Software version not available"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:130
+msgid "Client software version request timeout"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0095.py:41
+#, fuzzy
+msgid "Implementation of Stream Initiation"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0095.py:54
+#, fuzzy
+msgid "Plugin XEP_0095 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0095.py:84
+#, fuzzy
+msgid "XEP-0095 Stream initiation"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0095.py:127
+msgid "sending stream initiation accept answer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0095.py:168
+#, python-format
+msgid "Stream Session ID: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:48
+msgid "Implementation of SI File Transfer"
+msgstr "Implémentation de l'initialisation de flux pour le transfert de fichier "
+
+#: sat/plugins/plugin_xep_0096.py:55
+#, fuzzy
+msgid "Stream Initiation"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0096.py:58
+msgid "Plugin XEP_0096 initialization"
+msgstr "Initialisation du plugin XEP_0096"
+
+#: sat/plugins/plugin_xep_0096.py:129
+msgid "XEP-0096 file transfer requested"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:377
+#, fuzzy, python-format
+msgid "The contact {} has refused your file"
+msgstr "Le contact %s a refusé votre inscription"
+
+#: sat/plugins/plugin_xep_0096.py:378
+#, fuzzy
+msgid "File refused"
+msgstr "refusé"
+
+#: sat/plugins/plugin_xep_0096.py:381
+msgid "Error during file transfer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:382
+msgid ""
+"Something went wrong during the file transfer session initialisation: "
+"{reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:385
+#, fuzzy
+msgid "File transfer error"
+msgstr "Transfert de fichier"
+
+#: sat/plugins/plugin_xep_0096.py:394
+#, fuzzy, python-format
+msgid "transfer {sid} successfuly finished [{profile}]"
+msgstr "Transfert [%s] refusé"
+
+#: sat/plugins/plugin_xep_0096.py:402
+msgid "transfer {sid} failed [{profile}]: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:37
+msgid "Implementation of Gateways protocol"
+msgstr "Implémentation du protocole de transports"
+
+#: sat/plugins/plugin_xep_0100.py:40
+#, fuzzy
+msgid ""
+"Be careful ! Gateways allow you to use an external IM (legacy IM), so you"
+" can see your contact as XMPP contacts.\n"
+"But when you do this, all your messages go throught the external legacy "
+"IM server, it is a huge privacy issue (i.e.: all your messages throught "
+"the gateway can be monitored, recorded, analysed by the external server, "
+"most of time a private company)."
+msgstr ""
+"Soyez prudent ! Les transports vous permettent d'utiliser une messagerie "
+"externe, de façon à pouvoir afficher vos contacts comme des contacts "
+"jabber.\n"
+"Mais si vous faites cela, tous vos messages passeront par les serveurs de"
+" la messagerie externe, c'est un gros problème pour votre vie privée "
+"(comprenez: tous vos messages à travers le transport pourront être "
+"affichés, enregistrés, analysés par ces serveurs externes, la plupart du "
+"temps une entreprise privée)."
+
+#: sat/plugins/plugin_xep_0100.py:48
+msgid "Internet Relay Chat"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:49
+msgid "XMPP"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:50
+msgid "Tencent QQ"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:51
+msgid "SIP/SIMPLE"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:52
+msgid "ICQ"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:53
+msgid "Yahoo! Messenger"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:54
+msgid "Gadu-Gadu"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:55
+msgid "AOL Instant Messenger"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:56
+msgid "Windows Live Messenger"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:62
+msgid "Gateways plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0100.py:84
+#, fuzzy
+msgid "Gateways"
+msgstr "Chercher les transports"
+
+#: sat/plugins/plugin_xep_0100.py:87
+#, fuzzy
+msgid "Find gateways"
+msgstr "Chercher les transports"
+
+#: sat/plugins/plugin_xep_0100.py:108
+#, fuzzy, python-format
+msgid "Gateways manager (%s)"
+msgstr "Gestionnaire de transport"
+
+#: sat/plugins/plugin_xep_0100.py:121
+#, python-format
+msgid "Failed (%s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:134
+#, fuzzy
+msgid "Use external XMPP server"
+msgstr "Utiliser un autre serveur XMPP:"
+
+#: sat/plugins/plugin_xep_0100.py:136
+msgid "Go !"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:143
+#, fuzzy
+msgid "No gateway index selected"
+msgstr "Aucun profile sélectionné"
+
+#: sat/plugins/plugin_xep_0100.py:158
+#, python-format
+msgid ""
+"INTERNAL ERROR: identity category should always be \"gateway\" in "
+"_getTypeString, got \"%s\""
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:166
+msgid "Unknown IM"
+msgstr "Messagerie inconnue"
+
+#: sat/plugins/plugin_xep_0100.py:170
+msgid "Registration successful, doing the rest"
+msgstr "Inscription réussie, lancement du reste de la procédure"
+
+#: sat/plugins/plugin_xep_0100.py:195
+msgid "Timeout"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:211
+#, fuzzy, python-format
+msgid "Found gateway [%(jid)s]: %(identity_name)s"
+msgstr "Transport trouvé (%(jid)s): %(identity)s"
+
+#: sat/plugins/plugin_xep_0100.py:222
+#, python-format
+msgid "Skipping [%(jid)s] which is not a gateway"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:231
+msgid "No gateway found"
+msgstr "Aucun transport trouvé"
+
+#: sat/plugins/plugin_xep_0100.py:236
+#, python-format
+msgid "item found: %s"
+msgstr "object trouvé: %s"
+
+#: sat/plugins/plugin_xep_0100.py:260
+#, fuzzy, python-format
+msgid "find gateways (target = %(target)s, profile = %(profile)s)"
+msgstr "transports trouvée (cible = %s)"
+
+#: sat/plugins/plugin_xep_0106.py:38
+msgid "(Un)escape JID to use disallowed chars in local parts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:50
+#, fuzzy
+msgid "Implementation of entity capabilities"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0115.py:58
+#, fuzzy
+msgid "Plugin XEP_0115 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0115.py:73
+msgid "Caps optimisation enabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:76
+msgid "Caps optimisation not available"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:154
+#, python-format
+msgid "Received invalid capabilities tag: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:170
+msgid ""
+"Unknown hash method for entity capabilities: [{hash_method}] (entity: "
+"{entity_jid}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:183
+msgid ""
+"Computed hash differ from given hash:\n"
+"given: [{given}]\n"
+"computed: [{computed}]\n"
+"(entity: {entity_jid}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:205
+msgid "Couldn't retrieve disco info for {jid}: {error}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:42
+#, fuzzy
+msgid "Implementation of Personal Eventing Protocol"
+msgstr "Implémentation du protocole de transports"
+
+#: sat/plugins/plugin_xep_0163.py:48
+#, fuzzy
+msgid "PEP plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0163.py:131
+#, fuzzy, python-format
+msgid "Trying to send personal event with an unknown profile key [%s]"
+msgstr "Tentative d'appel d'un profile inconnue"
+
+#: sat/plugins/plugin_xep_0163.py:136
+#, fuzzy
+msgid "Trying to send personal event for an unknown type"
+msgstr "Tentative d'assigner un paramètre à un profile inconnu"
+
+#: sat/plugins/plugin_xep_0163.py:142
+#, fuzzy
+msgid "No item found"
+msgstr "Aucun transport trouvé"
+
+#: sat/plugins/plugin_xep_0163.py:149
+msgid "Can't find mood element in mood event"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:153
+#, fuzzy
+msgid "No mood found"
+msgstr "Aucune donnée trouvée"
+
+#: sat/plugins/plugin_xep_0166.py:50
+msgid "{entity} want to start a jingle session with you, do you accept ?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:60
+#, fuzzy
+msgid "Implementation of Jingle"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0166.py:98
+#, fuzzy
+msgid "plugin Jingle initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0166.py:156
+#, fuzzy, python-format
+msgid "Error while terminating session: {msg}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat/plugins/plugin_xep_0166.py:395
+msgid "You can't do a jingle session with yourself"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:511
+msgid "Confirm Jingle session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:71
+#, fuzzy
+msgid "Implementation of Message Delivery Receipts"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0184.py:96
+msgid "Enable message delivery receipts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:100
+#, fuzzy
+msgid "Plugin XEP_0184 (message delivery receipts) initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0184.py:136
+msgid "[XEP-0184] Request acknowledgment for message id {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:180
+msgid "[XEP-0184] Receive acknowledgment for message id {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:190
+msgid "[XEP-0184] Delete waiting acknowledgment for message id {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:46
+#, fuzzy
+msgid "Implementation of Stream Management"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0198.py:134
+#, fuzzy
+msgid "Plugin Stream Management initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0198.py:144
+msgid "Invalid ack_timeout value, please check your configuration"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:147
+msgid "Ack timeout disabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:149
+msgid "Ack timeout set to {timeout}s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:171
+msgid ""
+"Your server doesn't support stream management ({namespace}), this is used"
+" to improve connection problems detection (like network outages). Please "
+"ask your server administrator to enable this feature."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:302
+msgid ""
+"Connection failed using location given by server (host: {host}, port: "
+"{port}), switching to normal host and port (host: {normal_host}, port: "
+"{normal_port})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:317
+msgid "Incorrect <enabled/> element received, no \"id\" attribute"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:319
+msgid ""
+"You're server doesn't support session resuming with stream management, "
+"please contact your server administrator to enable it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:341
+msgid "Invalid location received: {location}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:359
+msgid "Invalid \"max\" attribute"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:361
+msgid "Using default session max value ({max_s} s)."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:363
+msgid "Stream Management enabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:367
+msgid "Stream Management enabled, with a resumption time of {res_m:.2f} min"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:382
+msgid ""
+"Stream session resumed (disconnected for {d_time} s, {count} stanza(s) "
+"resent)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:395
+msgid "Can't use stream management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:399
+msgid "{msg}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:408
+msgid "stream resumption not possible, restarting full session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:495
+msgid "Server returned invalid ack element, disabling stream management: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:501
+msgid "Server acked more stanzas than we have sent, disabling stream management."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:511
+msgid "Ack was not received in time, aborting connection"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:39
+#, fuzzy
+msgid "Implementation of XMPP Ping"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0199.py:49
+#, fuzzy
+msgid "XMPP Ping plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0199.py:109
+msgid "ping error ({err_msg}). Response time: {time} s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:123
+msgid "Invalid jid: \"{entity_jid}\""
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:134
+msgid "XMPP PING received from {from_jid} [{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0203.py:45
+#, fuzzy
+msgid "Implementation of Delayed Delivery"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0203.py:51
+#, fuzzy
+msgid "Delayed Delivery plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0231.py:48
+msgid "Implementation of bits of binary (used for small images/files)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0231.py:59
+#, fuzzy
+msgid "plugin Bits of Binary initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0234.py:54
+#, fuzzy
+msgid "Implementation of Jingle File Transfer"
+msgstr "Implémentation de l'initialisation de flux pour le transfert de fichier "
+
+#: sat/plugins/plugin_xep_0234.py:67
+#, fuzzy
+msgid "file transfer"
+msgstr "Transfert de fichier"
+
+#: sat/plugins/plugin_xep_0234.py:70
+#, fuzzy
+msgid "plugin Jingle File Transfer initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0234.py:380
+msgid "hash_algo must be set if file_hash is set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:385
+msgid "file_hash must be set if hash_algo is set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:419
+msgid "only the following keys are allowed in extra: {keys}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:454
+msgid "you need to provide at least name or file hash"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:524
+#, fuzzy
+msgid "File continue is not implemented yet"
+msgstr "getGame n'est pas implémenté dans ce frontend"
+
+#: sat/plugins/plugin_xep_0249.py:55
+#, fuzzy
+msgid "Implementation of Direct MUC Invitations"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0249.py:75
+msgid "Auto-join MUC on invitation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:86
+#, fuzzy
+msgid "Plugin XEP_0249 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0249.py:140
+#, python-format
+msgid "Invitation accepted for room %(room)s [%(profile)s]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:155
+msgid "invalid invitation received: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:159
+#, python-format
+msgid "Invitation received for room %(room)s [%(profile)s]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:170
+msgid "Invitation silently discarded because user is already in the room."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:181
+#, python-format
+msgid ""
+"An invitation from %(user)s to join the room %(room)s has been declined "
+"according to your personal settings."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:185 sat/plugins/plugin_xep_0249.py:192
+#, fuzzy
+msgid "MUC invitation"
+msgstr "Connexion..."
+
+#: sat/plugins/plugin_xep_0249.py:188
+#, python-format
+msgid ""
+"You have been invited by %(user)s to join the room %(room)s. Do you "
+"accept?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:215
+msgid "You must provide a valid JID to invite, like in '/invite contact@{host}'"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0260.py:51
+#, fuzzy
+msgid "Implementation of Jingle SOCKS5 Bytestreams"
+msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
+
+#: sat/plugins/plugin_xep_0260.py:64
+msgid "plugin Jingle SOCKS5 Bytestreams"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0261.py:47
+#, fuzzy
+msgid "Implementation of Jingle In-Band Bytestreams"
+msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
+
+#: sat/plugins/plugin_xep_0261.py:55
+#, fuzzy
+msgid "plugin Jingle In-Band Bytestreams"
+msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
+
+#: sat/plugins/plugin_xep_0264.py:67
+msgid "Thumbnails handling"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0264.py:79
+#, fuzzy
+msgid "Plugin XEP_0264 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0277.py:71
+#, fuzzy
+msgid "Implementation of microblogging Protocol"
+msgstr "Implémentation du protocole de transports"
+
+#: sat/plugins/plugin_xep_0277.py:83
+#, fuzzy
+msgid "Microblogging plugin initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0277.py:286
+msgid "Content of type XHTML must declare its namespace!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:557
+msgid "Can't have xhtml and rich content at the same time"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:1041
+#, python-format
+msgid "Microblog node has now access %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:1045
+msgid "Can't set microblog access"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:39
+#, fuzzy, python-format
+msgid "Message carbons"
+msgstr "message reçu de: %s"
+
+#: sat/plugins/plugin_xep_0280.py:50
+#, fuzzy
+msgid "Implementation of Message Carbons"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0280.py:75
+#, fuzzy
+msgid "Plugin XEP_0280 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0280.py:102
+msgid "Not activating message carbons as requested in params"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:107
+msgid "server doesn't handle message carbons"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:109
+msgid "message carbons available, enabling it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:117
+#, fuzzy
+msgid "message carbons activated"
+msgstr ""
+"Barre de progression désactivée\n"
+"--\n"
+
+#: sat/plugins/plugin_xep_0297.py:44
+#, fuzzy
+msgid "Implementation of Stanza Forwarding"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0297.py:52
+#, fuzzy
+msgid "Stanza Forwarding plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0300.py:45
+msgid "Management of cryptographic hashes"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0300.py:66
+#, fuzzy
+msgid "plugin Hashes initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0313.py:51
+#, fuzzy
+msgid "Implementation of Message Archive Management"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0313.py:64
+#, fuzzy
+msgid "Message Archive Management plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0313.py:92
+msgid "It seems that we have no MAM history yet"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:126
+msgid "missing \"to\" attribute in forwarded message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:137
+msgid "missing \"from\" attribute in forwarded message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:140
+msgid ""
+"was expecting a message sent by our jid, but this one if from {from_jid},"
+" ignoring\n"
+"{xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:158
+msgid "We have received no message while offline"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:160
+msgid "We have received {num_mess} message(s) while offline."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:50
+#, fuzzy
+msgid "Implementation of File Information Sharing"
+msgstr "Implémentation de l'initialisation de flux pour le transfert de fichier "
+
+#: sat/plugins/plugin_xep_0329.py:86
+msgid "path change chars found in name [{name}], hack attempt?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:107
+msgid "path can only be set on path nodes"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:141
+msgid "a node can't have several parents"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:210
+msgid ""
+"parent dir (\"..\") found in path, hack attempt? path is {path} "
+"[{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:271
+#, fuzzy
+msgid "File Information Sharing initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0329.py:394
+msgid "invalid path: {path}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:428
+msgid "{peer_jid} requested a file (s)he can't access [{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:461
+#, fuzzy, python-format
+msgid "error while retrieving files: {msg}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat/plugins/plugin_xep_0329.py:513
+msgid "ignoring invalid unicode name ({name}): {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:534
+msgid "unexpected type: {type}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:573
+#, fuzzy, python-format
+msgid "unknown node type: {type}"
+msgstr "Type d'action inconnu"
+
+#: sat/plugins/plugin_xep_0329.py:711
+msgid "unexpected element, ignoring: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1184
+#, fuzzy, python-format
+msgid "This path doesn't exist!"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat/plugins/plugin_xep_0329.py:1186
+msgid "A path need to be specified"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1188
+msgid "access must be a dict"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1200
+#, fuzzy
+msgid "Can't find a proper name"
+msgstr "Impossible de trouver la VCard de %s"
+
+#: sat/plugins/plugin_xep_0329.py:1211
+msgid ""
+"A directory with this name is already shared, renamed to {new_name} "
+"[{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0334.py:43
+#, fuzzy
+msgid "Implementation of Message Processing Hints"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0334.py:45
+msgid ""
+"             Frontends can use HINT_* constants in mess_data['extra'] in "
+"a serialized 'hints' dict.\n"
+"             Internal plugins can use directly addHint([HINT_* "
+"constant]).\n"
+"             Will set mess_data['extra']['history'] to 'skipped' when no "
+"store is requested and message is not saved in history."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0334.py:65
+#, fuzzy
+msgid "Message Processing Hints plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0346.py:54
+msgid "Handle Pubsub data schemas"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:60
+#, fuzzy
+msgid "PubSub Schema initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0346.py:208
+msgid "unspecified schema, we need to request it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:212
+msgid ""
+"no schema specified, and this node has no schema either, we can't "
+"construct the data form"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:233
+msgid "Invalid Schema: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:246
+msgid "nodeIndentifier needs to be set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:310
+msgid "empty node is not allowed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:354
+msgid "default_node must be set if nodeIdentifier is not set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:457
+#, fuzzy
+msgid "field {name} doesn't exist, ignoring it"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat/plugins/plugin_xep_0346.py:551
+msgid "Can't parse date field: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:652
+msgid "Can't get previous item, update ignored: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:661
+msgid "Can't parse previous item, update ignored: data form not found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:719
+msgid "default_node must be set if node is not set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:728
+msgid "if extra[\"update\"] is set, item_id must be set too"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:35
+msgid ""
+"Notify server when frontend is not actively used, to limit traffic and "
+"save bandwidth and battery life"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:45
+#, fuzzy
+msgid "Client State Indication plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0352.py:63
+msgid "Client State Indication is available on this server"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:67
+msgid ""
+"Client State Indication is not available on this server, some bandwidth "
+"optimisations can't be used."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:46
+#, fuzzy
+msgid "Implementation of Jingle Message Initiation"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0353.py:53
+#, fuzzy
+msgid "plugin {name} initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0353.py:122
+msgid "Message initiation with {peer_jid} timed out"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:166
+msgid ""
+"Somebody not in your contact list ({peer_jid}) wants to do a "
+"\"{human_name}\" session with you, this would leak your presence and "
+"possibly you IP (internet localisation), do you accept?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:171
+#, fuzzy
+msgid "Invitation from an unknown contact"
+msgstr "Tentative d'assigner un paramètre à un profile inconnu"
+
+#: sat/plugins/plugin_xep_0353.py:211
+msgid "no pending session found with id {session_id}, did it timed out?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0359.py:40
+#, fuzzy
+msgid "Implementation of Unique and Stable Stanza IDs"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0359.py:49
+#, fuzzy
+msgid "Unique and Stable Stanza IDs plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/plugins/plugin_xep_0363.py:51
+#, fuzzy
+msgid "Implementation of HTTP File Upload"
+msgstr "Implémentation de l'initialisation de flux pour le transfert de fichier "
+
+#: sat/plugins/plugin_xep_0363.py:83
+#, fuzzy
+msgid "plugin HTTP File Upload initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: sat/plugins/plugin_xep_0363.py:200
+msgid "Can't get upload slot: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:265
+msgid "upload failed: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:349
+msgid "Invalid header element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:355
+msgid "Ignoring unauthorised header \"{name}\": {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:400
+msgid "no service can handle HTTP Upload request: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:35
+#, fuzzy
+msgid "Implementation of Explicit Message Encryption"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: sat/plugins/plugin_xep_0380.py:94
+msgid ""
+"Message from {sender} is encrypted with {algorithm} and we can't decrypt "
+"it."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:96
+msgid ""
+"User {sender} sent you an encrypted message (encrypted with {algorithm}),"
+" and we can't decrypt it."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:62
+#, fuzzy
+msgid "Implementation of OMEMO"
+msgstr "Implementation de vcard-temp"
+
+#: sat/plugins/plugin_xep_0384.py:440
+msgid "Security"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:442
+msgid "OMEMO default trust policy"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:443
+msgid "Manual trust (more secure)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:445
+msgid "Blind Trust Before Verification (more user friendly)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:449
+msgid "OMEMO plugin initialization (omemo module v{version})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:453
+msgid ""
+"Your version of omemo module is too old: {v[0]}.{v[1]}.{v[2]} is minimum "
+"required, please update."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:488
+msgid "You need to have OMEMO encryption activated to reset the session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:503
+msgid "OMEMO session has been reset"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:551
+msgid "device {device} from {peer_jid} is not an auto-trusted device anymore"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:612
+msgid "Can't find bundle for device {device_id} of user {bare_jid}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:642
+#, fuzzy
+msgid "OMEMO trust management"
+msgstr "Initialisation du gestionnaire de mémoire"
+
+#: sat/plugins/plugin_xep_0384.py:645
+msgid ""
+"This is OMEMO trusting system. You'll see below the devices of your "
+"contacts, and a checkbox to trust them or not. A trusted device can read "
+"your messages in plain text, so be sure to only validate devices that you"
+" are sure are belonging to your contact. It's better to do this when you "
+"are next to your contact and her/his device, so you can check the "
+"\"fingerprint\" (the number next to the device) yourself. Do *not* "
+"validate a device if the fingerprint is wrong!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:655
+msgid "This device ID"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:657
+msgid "This device fingerprint"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:669
+msgid "Automatically trust new devices?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:683
+#, fuzzy
+msgid "Contact"
+msgstr "&Contacts"
+
+#: sat/plugins/plugin_xep_0384.py:685
+msgid "Device ID"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:691
+msgid "Trust this device?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:696
+msgid "(automatically trusted)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:724
+msgid "We have no identity for this device yet, let's generate one"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:749
+msgid "Saving public bundle for this device ({device_id})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:770
+msgid "OMEMO devices list is stored in more that one items, this is not expected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:776
+msgid "no list element found in OMEMO devices list"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:782
+msgid "device element is missing \"id\" attribute: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:785
+msgid "invalid device id: {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:804
+msgid "there is no node to handle OMEMO devices"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:826
+msgid "Can't set devices: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:850
+msgid "Bundle missing for device {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:855
+msgid "Can't get bundle for device {device_id}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:859
+msgid ""
+"no item found in node {node}, can't get public bundle for device "
+"{device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:864
+msgid "more than one item found in {node}, this is not expected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:878
+msgid "invalid bundle for device {device_id}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:902
+msgid "error while decoding key for device {device_id}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:916
+msgid "updating bundle for {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:949
+msgid "Can't set bundle: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:969
+msgid "Our own device is missing from devices list, fixing it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:988
+msgid ""
+"Not all destination devices are trusted, unknown devices will be blind "
+"trusted due to the OMEMO Blind Trust Before Verification policy. If you "
+"want a more secure workflow, please activate \"manual\" OMEMO policy in "
+"settings' \"Security\" tab.\n"
+"Following fingerprint have been automatically trusted:\n"
+"{devices}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1010
+msgid ""
+"Not all destination devices are trusted, we can't encrypt message in such"
+" a situation. Please indicate if you trust those devices or not in the "
+"trust manager before we can send this message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1053
+msgid "discarding untrusted device {device_id} with key {device_key} for {entity}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1095
+msgid ""
+"Can't retrieve bundle for device(s) {devices} of entity {peer}, the "
+"message will not be readable on this/those device(s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1100
+msgid ""
+"You're destinee {peer} has missing encryption data on some of his/her "
+"device(s) (bundle on device {devices}), the message won't  be readable on"
+" this/those device."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1151
+msgid "Too many iterations in encryption loop"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1180
+msgid "Can't encrypt message for {entities}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1270
+msgid "Invalid OMEMO encrypted stanza, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1276
+msgid "Invalid OMEMO encrypted stanza, missing sender device ID, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1284
+msgid ""
+"This OMEMO encrypted stanza has not been encrypted for our device "
+"(device_id: {device_id}, fingerprint: {fingerprint}): {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1290
+msgid ""
+"An OMEMO message from {sender} has not been encrypted for our device, we "
+"can't decrypt it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1297
+msgid "Invalid recipient ID: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1330
+msgid ""
+"Can't decrypt message: {reason}\n"
+"{xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1332
+msgid "An OMEMO message from {sender} can't be decrypted: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1364
+msgid ""
+"Our message with UID {uid} has not been received in time, it has probably"
+" been lost. The message was: {msg!r}"
+msgstr ""
+
+#: sat/plugins/plugin_app_manager_docker/__init__.py:38
+msgid "Applications Manager for Docker"
+msgstr ""
+
+#: sat/plugins/plugin_app_manager_docker/__init__.py:48
+#, fuzzy
+msgid "Docker App Manager initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: sat/stdui/ui_contact_list.py:39 sat/stdui/ui_contact_list.py:42
+#: sat/stdui/ui_contact_list.py:190 sat/stdui/ui_contact_list.py:276
+#, fuzzy
+msgid "Add contact"
+msgstr "&Ajouter un contact"
+
+#: sat/stdui/ui_contact_list.py:45 sat/stdui/ui_contact_list.py:48
+#: sat/stdui/ui_contact_list.py:209
+#, fuzzy
+msgid "Update contact"
+msgstr "&Ajouter un contact"
+
+#: sat/stdui/ui_contact_list.py:51 sat/stdui/ui_contact_list.py:54
+#, fuzzy
+msgid "Remove contact"
+msgstr "Supp&rimer un contact"
+
+#: sat/stdui/ui_contact_list.py:157
+msgid "Select in which groups your contact is:"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:172
+msgid "Add group"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:174
+msgid "Add"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:191
+#, fuzzy, python-format
+msgid "New contact identifier (JID):"
+msgstr "nouveau contact: %s"
+
+#: sat/stdui/ui_contact_list.py:203
+msgid "Nothing to update"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:204 sat/stdui/ui_contact_list.py:223
+msgid "Your contact list is empty."
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:210
+msgid "Which contact do you want to update?"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:222
+msgid "Nothing to delete"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:228
+#, fuzzy, python-format
+msgid "Who do you want to remove from your contacts?"
+msgstr "Êtes vous sûr de vouloir supprimer %s de votre liste de contacts ?"
+
+#: sat/stdui/ui_contact_list.py:251
+#, fuzzy
+msgid "Delete contact"
+msgstr "&Ajouter un contact"
+
+#: sat/stdui/ui_contact_list.py:253
+#, fuzzy, python-format
+msgid "Are you sure you want to remove %s from your contact list?"
+msgstr "Êtes vous sûr de vouloir supprimer %s de votre liste de contacts ?"
+
+#: sat/stdui/ui_contact_list.py:277
+#, python-format
+msgid "Please enter a valid JID (like \"contact@%s\"):"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:62
+msgid "Profile password for {}"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:72 sat/stdui/ui_profile_manager.py:119
+#, fuzzy
+msgid "Connection error"
+msgstr "Connexion..."
+
+#: sat/stdui/ui_profile_manager.py:76
+#: sat_frontends/quick_frontend/quick_profile_manager.py:171
+#, fuzzy
+msgid "Internal error"
+msgstr "Transfert de fichier"
+
+#: sat/stdui/ui_profile_manager.py:77
+msgid "Internal error: {}"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:121
+#, python-format
+msgid "Can't connect to %s. Please check your connection details."
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:127
+#, python-format
+msgid "XMPP password for %(profile)s%(counter)s"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:135
+#, python-format
+msgid ""
+"Can't connect to %s. Please check your connection details or try with "
+"another password."
+msgstr ""
+
+#: sat/test/constants.py:57
+msgid "Enable unibox"
+msgstr ""
+
+#: sat/test/constants.py:58
+msgid "'Wysiwyg' edition"
+msgstr ""
+
+#: sat/test/test_plugin_misc_room_game.py:43
+msgid "Dummy plugin to test room game"
+msgstr ""
+
+#: sat/tools/config.py:53
+#, fuzzy, python-format
+msgid "Testing file %s"
+msgstr "Échec de l'inscription: %s"
+
+#: sat/tools/config.py:72
+msgid "Config auto-update: {option} set to {value} in the file {config_file}."
+msgstr ""
+
+#: sat/tools/config.py:86
+msgid "Can't read main config: {msg}"
+msgstr ""
+
+#: sat/tools/config.py:91
+msgid "Configuration was read from: {filenames}"
+msgstr ""
+
+#: sat/tools/config.py:95
+#, fuzzy, python-format
+msgid "No configuration file found, using default settings"
+msgstr "Disposition inconnue, utilisation de celle par defaut"
+
+#: sat/tools/image.py:35
+msgid "SVG support not available, please install cairosvg: {e}"
+msgstr ""
+
+#: sat/tools/trigger.py:66
+#, python-format
+msgid "There is already a bound priority [%s]"
+msgstr ""
+
+#: sat/tools/trigger.py:69
+#, python-format
+msgid "There is already a trigger with the same priority [%s]"
+msgstr ""
+
+#: sat/tools/video.py:38
+msgid "ffmpeg executable not found, video thumbnails won't be available"
+msgstr ""
+
+#: sat/tools/video.py:56
+msgid "ffmpeg executable is not available, can't generate video thumbnail"
+msgstr ""
+
+#: sat/tools/xml_tools.py:86
+msgid "Fixed field has neither value nor label, ignoring it"
+msgstr ""
+
+#: sat/tools/xml_tools.py:485
+#, fuzzy
+msgid "INTERNAL ERROR: parameters xml not valid"
+msgstr "ERREUR INTERNE: les paramètres doivent avoir un nom"
+
+#: sat/tools/xml_tools.py:495
+msgid "INTERNAL ERROR: params categories must have a name"
+msgstr "ERREUR INTERNE: les catégories des paramètres doivent avoir un nom"
+
+#: sat/tools/xml_tools.py:505
+msgid "INTERNAL ERROR: params must have a name"
+msgstr "ERREUR INTERNE: les paramètres doivent avoir un nom"
+
+#: sat/tools/xml_tools.py:557
+msgid "The 'options' tag is not allowed in parameter of type 'list'!"
+msgstr ""
+
+#: sat/tools/xml_tools.py:655
+msgid "TabElement must be a child of TabsContainer"
+msgstr ""
+
+#: sat/tools/xml_tools.py:760
+msgid "Can't set row index if auto_index is True"
+msgstr ""
+
+#: sat/tools/xml_tools.py:893
+msgid "either items or columns need do be filled"
+msgstr ""
+
+#: sat/tools/xml_tools.py:907
+msgid "Headers lenght doesn't correspond to columns"
+msgstr ""
+
+#: sat/tools/xml_tools.py:954
+msgid "Incorrect number of items in list"
+msgstr ""
+
+#: sat/tools/xml_tools.py:978
+#, fuzzy
+msgid "A widget with the name \"{name}\" already exists."
+msgstr "Ce nom de profile existe déjà"
+
+#: sat/tools/xml_tools.py:1171
+msgid "Value must be an integer"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1186
+msgid "Value must be 0, 1, false or true"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1249
+msgid ""
+"\"multi\" flag and \"selected\" option are not compatible with "
+"\"noselect\" flag"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1258
+msgid "empty \"options\" list"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1277 sat/tools/xml_tools.py:1311
+msgid "invalid styles"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1335
+msgid "DialogElement must be a direct child of TopElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1350
+msgid "MessageElement must be a direct child of DialogElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1365
+msgid "ButtonsElement must be a direct child of DialogElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1379
+msgid "FileElement must be a direct child of DialogElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1458
+#, fuzzy, python-format
+msgid "Unknown panel type [%s]"
+msgstr "Type d'action inconnu"
+
+#: sat/tools/xml_tools.py:1460
+msgid "form XMLUI need a submit_id"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1462
+msgid "container argument must be a string"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1465
+msgid "dialog_opt can only be used with dialog panels"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1492
+msgid "createWidget can't be used with dialogs"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1590
+msgid "Submit ID must be filled for this kind of dialog"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1618
+#, fuzzy, python-format
+msgid "Unknown container type [%s]"
+msgstr "Type d'action inconnu"
+
+#: sat/tools/xml_tools.py:1648
+#, fuzzy, python-format
+msgid "Invalid type [{type_}]"
+msgstr "Type d'action inconnu"
+
+#: sat/tools/common/async_process.py:86
+msgid ""
+"Can't complete {name} command (error code: {code}):\n"
+"stderr:\n"
+"{stderr}\n"
+"{stdout}\n"
+msgstr ""
+
+#: sat/tools/common/date_utils.py:76
+msgid "You can't use a direction (+ or -) and \"ago\" at the same time"
+msgstr ""
+
+#: sat/tools/common/template.py:149
+msgid "{site} can't be used as site name, it's reserved."
+msgstr ""
+
+#: sat/tools/common/template.py:157
+msgid "{theme} contain forbidden char. Following chars are forbidden: {reserved}"
+msgstr ""
+
+#: sat/tools/common/template.py:212
+msgid "Unregistered site requested: {site_to_check}"
+msgstr ""
+
+#: sat/tools/common/template.py:241
+msgid ""
+"Absolute template used while unsecure is disabled, hack attempt? "
+"Template: {template}"
+msgstr ""
+
+#: sat/tools/common/template.py:314
+msgid "Invalid attribute, please use one of \"defer\", \"async\" or \"\""
+msgstr ""
+
+#: sat/tools/common/template.py:332
+msgid "Can't find {libary} javascript library"
+msgstr ""
+
+#: sat/tools/common/template.py:389
+msgid ""
+"Can't add \"{name}\" site, it contains forbidden characters. Forbidden "
+"characters are {forbidden}."
+msgstr ""
+
+#: sat/tools/common/template.py:395
+msgid "Can't add \"{name}\" site, it should map to an absolute path"
+msgstr ""
+
+#: sat/tools/common/template.py:416
+msgid "Can't load theme settings at {path}: {e}"
+msgstr ""
+
+#: sat/tools/common/template.py:523
+msgid "Can't find template translation at {path}"
+msgstr ""
+
+#: sat/tools/common/template.py:526
+msgid "{site}Invalid locale name: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:529
+msgid "{site}loaded {lang} templates translations"
+msgstr ""
+
+#: sat/tools/common/template.py:560
+msgid "invalid locale value: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:569
+msgid "Can't find locale {locale}"
+msgstr ""
+
+#: sat/tools/common/template.py:574
+msgid "Switched to {lang}"
+msgstr ""
+
+#: sat/tools/common/template.py:774 sat_frontends/jp/cmd_event.py:134
+msgid "Can't parse date: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:801
+#, fuzzy
+msgid "ignoring field \"{name}\": it doesn't exists"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat_frontends/jp/arg_tools.py:88
+msgid "ignoring {name}={value}, not corresponding to any argument (in USE)"
+msgstr ""
+
+#: sat_frontends/jp/arg_tools.py:95
+msgid "arg {name}={value} (in USE)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:64
+#, fuzzy
+msgid ""
+"ProgressBar not available, please download it at "
+"http://pypi.python.org/pypi/progressbar\n"
+"Progress bar deactivated\n"
+"--\n"
+msgstr ""
+"ProgressBar n'est pas disponible, veuillez le télécharger à "
+"http://pypi.python.org/pypi/progressbar"
+
+#: sat_frontends/jp/base.py:155
+msgid ""
+"Invalid value set for \"background\" ({background}), please check your "
+"settings in libervia.conf"
+msgstr ""
+
+#: sat_frontends/jp/base.py:178
+msgid "Available commands"
+msgstr ""
+
+#: sat_frontends/jp/base.py:287
+#, python-format
+msgid "Use PROFILE profile key (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:290
+msgid "Password used to connect profile, if necessary"
+msgstr ""
+
+#: sat_frontends/jp/base.py:297
+msgid "Connect the profile before doing anything else"
+msgstr ""
+
+#: sat_frontends/jp/base.py:307
+msgid "Start a profile session without connecting"
+msgstr ""
+
+#: sat_frontends/jp/base.py:313
+msgid "Show progress bar"
+msgstr "Affiche la barre de progression"
+
+#: sat_frontends/jp/base.py:318
+msgid "Add a verbosity level (can be used multiple times)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:323
+msgid "be quiet (only output machine readable data)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:326
+msgid "draft handling"
+msgstr ""
+
+#: sat_frontends/jp/base.py:328
+msgid "load current draft"
+msgstr ""
+
+#: sat_frontends/jp/base.py:330
+msgid "path to a draft file to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/base.py:346
+msgid "Pubsub URL (xmpp or http)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:348
+#, fuzzy
+msgid "JID of the PubSub service"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/base.py:350
+msgid "PEP service"
+msgstr ""
+
+#: sat_frontends/jp/base.py:352 sat_frontends/jp/base.py:360
+#: sat_frontends/jp/base.py:368
+msgid " (DEFAULT: {default})"
+msgstr ""
+
+#: sat_frontends/jp/base.py:356
+#, fuzzy
+msgid "node to request"
+msgstr "Demande de suppression de contact"
+
+#: sat_frontends/jp/base.py:358
+msgid "standard node"
+msgstr ""
+
+#: sat_frontends/jp/base.py:366
+msgid "last item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:372
+msgid "retrieve last item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:378
+msgid "items to retrieve (DEFAULT: all)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:385
+msgid "maximum number of items to get ({no_limit} to get all items)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:391
+msgid "maximum number of items to get per page (DEFAULT: 10)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:398 sat_frontends/jp/cmd_message.py:217
+msgid "find page after this item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:401 sat_frontends/jp/cmd_message.py:220
+msgid "find page before this item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:404 sat_frontends/jp/cmd_message.py:223
+msgid "index of the page to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/base.py:411
+#, fuzzy
+msgid "MAM filters to use"
+msgstr "Veuillez choisir le fichier à envoyer"
+
+#: sat_frontends/jp/base.py:424
+msgid "how items should be ordered"
+msgstr ""
+
+#: sat_frontends/jp/base.py:454
+msgid "there is already a default output for {type}, ignoring new one"
+msgstr ""
+
+#: sat_frontends/jp/base.py:475
+msgid "The following output options are invalid: {invalid_options}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:499
+msgid "Can't import {module_path} plugin, ignoring it: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:505
+msgid "Missing module for plugin {name}: {missing}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:520
+msgid "Invalid plugin module [{type}] {module}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:552
+msgid "Can't parse HTML page : {msg}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:558
+msgid ""
+"Could not find alternate \"xmpp:\" URI, can't find associated XMPP PubSub"
+" node/item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:576
+msgid "invalid XMPP URL: {url}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:596
+msgid "item specified in URL but not needed in command, ignoring it"
+msgstr ""
+
+#: sat_frontends/jp/base.py:612
+msgid "XMPP URL is not a pubsub one: {url}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:618
+msgid "argument -s/--service is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:620
+msgid "argument -n/--node is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:622
+msgid "argument -i/--item is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:629
+msgid "--item and --item-last can't be used at the same time"
+msgstr ""
+
+#: sat_frontends/jp/base.py:659 sat_frontends/quick_frontend/quick_app.py:370
+msgid "Can't connect to SàT backend, are you sure it's launched ?"
+msgstr "Impossible de se connecter au démon SàT, êtes vous sûr qu'il est lancé ?"
+
+#: sat_frontends/jp/base.py:662 sat_frontends/quick_frontend/quick_app.py:373
+#, fuzzy
+msgid "Can't init bridge"
+msgstr "Construction du jeu de Tarot"
+
+#: sat_frontends/jp/base.py:666
+msgid "Error while initialising bridge: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:714
+msgid "action cancelled by user"
+msgstr ""
+
+#: sat_frontends/jp/base.py:785
+#, python-format
+msgid "%s is not a valid JID !"
+msgstr "%s n'est pas un JID valide !"
+
+#: sat_frontends/jp/base.py:837
+#, fuzzy
+msgid "invalid password"
+msgstr "Sauvegarde du nouveau mot de passe"
+
+#: sat_frontends/jp/base.py:839
+#, fuzzy
+msgid "please enter profile password:"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat_frontends/jp/base.py:859
+#, fuzzy, python-format
+msgid "The profile [{profile}] doesn't exist"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat_frontends/jp/base.py:881
+#, fuzzy, python-format
+msgid ""
+"Session for [{profile}] is not started, please start it before using jp, "
+"or use either --start-session or --connect option"
+msgstr "SAT n'est pas connecté, veuillez le connecter avant d'utiliser jp"
+
+#: sat_frontends/jp/base.py:901
+#, fuzzy, python-format
+msgid ""
+"Profile [{profile}] is not connected, please connect it before using jp, "
+"or use --connect option"
+msgstr "SAT n'est pas connecté, veuillez le connecter avant d'utiliser jp"
+
+#: sat_frontends/jp/base.py:1002
+msgid "select output format (default: {})"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1005
+msgid "output specific option"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1111
+msgid "file size is not known, we can't show a progress bar"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1126 sat_frontends/jp/cmd_list.py:304
+msgid "Progress: "
+msgstr "Progression: "
+
+#: sat_frontends/jp/base.py:1156
+#, fuzzy
+msgid "Operation started"
+msgstr "inscription demandée pour"
+
+#: sat_frontends/jp/base.py:1172
+#, fuzzy, python-format
+msgid "Operation successfully finished"
+msgstr "Transfert [%s] refusé"
+
+#: sat_frontends/jp/base.py:1179
+msgid "Error while doing operation: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1189
+msgid "trying to use output when use_output has not been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:42
+msgid "create a XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:47
+msgid "jid to create"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:50
+msgid "password of the account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:55
+msgid "create a profile to use this account (default: don't create profile)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:63
+msgid "email (usage depends of XMPP server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:69
+msgid "server host (IP address or domain, default: use localhost)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:76
+msgid "server port (default: {port})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:107
+msgid "XMPP account created"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:113
+#, fuzzy
+msgid "creating profile"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat_frontends/jp/cmd_account.py:129
+msgid "Can't create profile {profile} to associate with jid {jid}: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:142
+#, fuzzy
+msgid "profile created"
+msgstr "Aucun profile sélectionné"
+
+#: sat_frontends/jp/cmd_account.py:183
+msgid "change password for XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:188
+#, fuzzy
+msgid "new XMPP password"
+msgstr "Sauvegarde du nouveau mot de passe"
+
+#: sat_frontends/jp/cmd_account.py:207
+msgid "delete a XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:215
+msgid "delete account without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:236
+msgid "Account deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:34
+#, fuzzy
+msgid "remote control a software"
+msgstr "Supp&rimer un contact"
+
+#: sat_frontends/jp/cmd_adhoc.py:38
+msgid "software name"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:44
+msgid "jids allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:51
+msgid "groups allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:57
+msgid "groups that are *NOT* allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:63
+msgid "jids that are *NOT* allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:66
+#, fuzzy
+msgid "loop on the commands"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/jp/cmd_adhoc.py:93
+#, fuzzy, python-format
+msgid "No bus name found"
+msgstr "Fonctionnalité trouvée: %s"
+
+#: sat_frontends/jp/cmd_adhoc.py:96
+#, fuzzy, python-format
+msgid "Bus name found: [%s]"
+msgstr "Fonctionnalité trouvée: %s"
+
+#: sat_frontends/jp/cmd_adhoc.py:100
+msgid "Command found: (path:{path}, iface: {iface}) [{command}]"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:112
+msgid "run an Ad-Hoc command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:120 sat_frontends/jp/cmd_message.py:200
+msgid "jid of the service (default: profile's server"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:128
+msgid "submit form/page"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:137
+msgid "field value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:143
+msgid "node of the command (default: list commands)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:171
+msgid "list Ad-Hoc commands of a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:179
+msgid "jid of the service (default: profile's server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:202
+msgid "Ad-hoc commands"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:33
+msgid "list available applications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:45
+msgid "show applications with this status"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:72
+#, fuzzy
+msgid "start an application"
+msgstr "Sélection du contrat"
+
+#: sat_frontends/jp/cmd_application.py:78
+msgid "name of the application to start"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:98
+msgid "stop a running application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:106
+msgid "name of the application to stop"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:111
+msgid "identifier of the instance to stop"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:142
+msgid "show data exposed by a running application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:150
+msgid "name of the application to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:155
+msgid "identifier of the instance to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:189
+#, fuzzy
+msgid "manage applications"
+msgstr "Tab inconnu"
+
+#: sat_frontends/jp/cmd_avatar.py:38
+msgid "retrieve avatar of an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:43 sat_frontends/jp/cmd_identity.py:42
+msgid "do no use cached values"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:46
+msgid "show avatar"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:48 sat_frontends/jp/cmd_info.py:111
+#, fuzzy
+msgid "entity"
+msgstr "Petite"
+
+#: sat_frontends/jp/cmd_avatar.py:87
+#, fuzzy
+msgid "No avatar found."
+msgstr "Aucune donnée trouvée"
+
+#: sat_frontends/jp/cmd_avatar.py:103
+msgid "set avatar of the profile or an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:108
+msgid "entity whose avatar must be changed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:110
+msgid "path to the image to upload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:116
+#, fuzzy, python-format
+msgid "file {path} doesn't exist!"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat_frontends/jp/cmd_avatar.py:125
+msgid "avatar has been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:134
+msgid "avatar uploading/retrieving"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:129
+msgid "unknown syntax requested ({syntax})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:138
+#, fuzzy
+msgid "title of the item"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_blog.py:143
+msgid "tag (category) of your item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:148
+msgid "language of the item (ISO 639 code)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:158
+msgid ""
+"enable comments (default: comments not enabled except if they already "
+"exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:168
+msgid "disable comments (will remove comments node if it exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:174
+msgid "syntax to use (default: get profile's default syntax)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:211
+msgid "publish a new blog item or update an existing one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:257
+msgid "get blog item(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:267
+msgid "microblog data key(s) to display (default: depend of verbosity)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:462
+msgid "edit an existing or new blog post"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:473
+msgid "launch a blog preview in parallel"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:478
+msgid "add \"publish: False\" to metadata"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:628
+msgid "You need lxml to edit pretty XHTML"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:662
+msgid "rename an blog item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:666 sat_frontends/jp/cmd_pubsub.py:996
+msgid "new item id to use"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:690
+msgid "preview a blog content"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:700
+msgid "use inotify to handle preview"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:706
+#, fuzzy
+msgid "path to the content file"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_blog.py:810
+#, fuzzy, python-format
+msgid "File \"{file}\" doesn't exist!"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat_frontends/jp/cmd_blog.py:898
+msgid "import an external blog"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:905 sat_frontends/jp/cmd_list.py:207
+msgid "importer name, nothing to display importers list"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:907
+msgid "original blog host"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:911
+msgid "do *NOT* upload images (default: do upload images)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:915
+msgid "do not upload images from this host (default: upload all images)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:920
+msgid "ignore invalide TLS certificate for uploads"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:929 sat_frontends/jp/cmd_list.py:216
+msgid "importer specific options (see importer description)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:934 sat_frontends/jp/cmd_list.py:250
+msgid ""
+"importer data location (see importer description), nothing to show "
+"importer description"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:941
+msgid "Blog upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:944
+msgid "Blog uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:965
+msgid ""
+"\n"
+"To redirect old URLs to new ones, put the following lines in your "
+"sat.conf file, in [libervia] section:\n"
+"\n"
+"{conf}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:973
+#, fuzzy, python-format
+msgid "Error while uploading blog: {error_msg}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat_frontends/jp/cmd_blog.py:982 sat_frontends/jp/cmd_list.py:274
+msgid "{name} argument can't be used without location argument"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:1037
+msgid "Error while trying to import a blog: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:1050
+msgid "blog/microblog management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:40
+#, python-format
+msgid "storage location (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:48
+#, python-format
+msgid "bookmarks type (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:54
+msgid "list bookmarks"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:94
+msgid "remove a bookmark"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:99 sat_frontends/jp/cmd_bookmarks.py:131
+msgid "jid (for muc bookmark) or url of to remove"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:105
+msgid "delete bookmark without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:110
+#, fuzzy, python-format
+msgid "Are you sure to delete this bookmark?"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat_frontends/jp/cmd_bookmarks.py:117
+msgid "can't delete bookmark: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:120
+msgid "bookmark deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:133
+msgid "bookmark name"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:134
+msgid "MUC specific options"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:135
+#, fuzzy
+msgid "nickname"
+msgstr "Surnon"
+
+#: sat_frontends/jp/cmd_bookmarks.py:140
+msgid "join room on profile connection"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:145
+msgid "You can't use --autojoin or --nick with --type url"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:165
+msgid "bookmark successfully added"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:174
+msgid "manage bookmarks"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:49
+msgid "call a bridge method"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:54
+msgid "name of the method to execute"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:56
+msgid "argument of the method"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:79
+msgid "Error while executing {method}: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:94
+msgid "send a fake signal from backend"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:99
+msgid "name of the signal to send"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:100
+msgid "argument of the signal"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:112
+#, fuzzy, python-format
+msgid "Can't send fake signal: {e}"
+msgstr "message reçu de: %s"
+
+#: sat_frontends/jp/cmd_debug.py:123
+msgid "bridge s(t)imulation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:135
+msgid "monitor XML stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:144
+msgid "stream direction filter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:195
+msgid "print colours used with your background"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:226
+msgid "debugging tools"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:38
+msgid "show available encryption algorithms"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:45
+msgid "No encryption plugin registered!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:47
+msgid "Following encryption algorithms are available: {algos}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:68
+msgid "get encryption session data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:73
+msgid "jid of the entity to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:99
+msgid "start encrypted session with an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:105 sat_frontends/jp/cmd_message.py:77
+msgid "don't replace encryption algorithm if an other one is already used"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:108
+msgid "algorithm name (DEFAULT: choose automatically)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:111
+msgid "algorithm namespace (DEFAULT: choose automatically)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:114
+#: sat_frontends/jp/cmd_encryption.py:153
+#: sat_frontends/jp/cmd_encryption.py:178
+msgid "jid of the entity to stop encrypted session with"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:148
+msgid "stop encrypted session with an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:173
+msgid "get UI to manage trust"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:182
+msgid "algorithm name (DEFAULT: current algorithm)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:185
+msgid "algorithm namespace (DEFAULT: current algorithm)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:220
+msgid "trust manangement"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:230
+msgid "encryption sessions handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:47
+msgid "get list of registered events"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:78
+msgid "get event data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:108
+#, fuzzy
+msgid "ID of the PubSub Item"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_event.py:110
+msgid "date of the event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:118 sat_frontends/jp/cmd_event.py:257
+#: sat_frontends/jp/cmd_pubsub.py:129
+#, fuzzy
+msgid "configuration field to set"
+msgstr "Connexion..."
+
+#: sat_frontends/jp/cmd_event.py:150
+msgid "create or replace event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:170
+msgid "Event created successfuly on node {node}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:181
+msgid "modify an existing event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:214 sat_frontends/jp/cmd_event.py:288
+msgid "get event attendance"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:219
+#, fuzzy
+msgid "bare jid of the invitee"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_event.py:246
+msgid "set event attendance"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:296
+msgid "show missing people (invited but no R.S.V.P. so far)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:302
+msgid "don't show people which gave R.S.V.P."
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:371
+msgid "Attendees: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:374
+msgid " ("
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:376
+msgid "yes: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:379
+msgid ", maybe: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:383
+msgid "no: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:390
+msgid "confirmed guests: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:395
+msgid "unconfirmed guests: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:401
+msgid "total: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:408
+msgid "missing people (no reply): "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:416
+msgid "you need to use --missing if you use --no-rsvp"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:489
+msgid "invite someone to the event through email"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:568
+#, fuzzy
+msgid "manage invities"
+msgstr "Initialisation du gestionnaire de mémoire"
+
+#: sat_frontends/jp/cmd_event.py:577
+msgid "event management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:50
+#, fuzzy
+msgid "send a file to a contact"
+msgstr "Attend qu'un fichier soit envoyé par un contact"
+
+#: sat_frontends/jp/cmd_file.py:55
+#, fuzzy
+msgid "a list of file"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_file.py:57 sat_frontends/jp/cmd_file.py:191
+#: sat_frontends/jp/cmd_message.py:82 sat_frontends/jp/cmd_pipe.py:42
+msgid "the destination jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:59
+#, fuzzy
+msgid "make a bzip2 tarball"
+msgstr "Fait un fichier compressé bzip2"
+
+#: sat_frontends/jp/cmd_file.py:79 sat_frontends/jp/cmd_file.py:236
+#: sat_frontends/jp/cmd_file.py:330
+msgid "File copy started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:82
+#, fuzzy
+msgid "File sent successfully"
+msgstr "Inscription réussie"
+
+#: sat_frontends/jp/cmd_file.py:86
+#, fuzzy
+msgid "The file has been refused by your contact"
+msgstr "Attend qu'un fichier soit envoyé par un contact"
+
+#: sat_frontends/jp/cmd_file.py:88
+#, fuzzy, python-format
+msgid "Error while sending file: {}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat_frontends/jp/cmd_file.py:97
+msgid "File request sent to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:102
+#, fuzzy
+msgid "Can't send file to {jid}"
+msgstr "Impossible de trouver la VCard de %s"
+
+#: sat_frontends/jp/cmd_file.py:109
+#, fuzzy, python-format
+msgid "file {file_} doesn't exist!"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat_frontends/jp/cmd_file.py:114
+#, fuzzy, python-format
+msgid "{file_} is a dir! Please send files inside or use compression"
+msgstr ""
+"[%s] est un répertoire ! Veuillez envoyer les fichiers qu'il contient ou "
+"utiliser la compression."
+
+#: sat_frontends/jp/cmd_file.py:129
+#, fuzzy
+msgid "bz2 is an experimental option, use with caution"
+msgstr ""
+"bz2 est une option expérimentale à un stade de développement peu avancé, "
+"utilisez-là avec prudence"
+
+#: sat_frontends/jp/cmd_file.py:131
+msgid "Starting compression, please wait..."
+msgstr "Lancement de la compression, veuillez patienter..."
+
+#: sat_frontends/jp/cmd_file.py:138
+#, fuzzy, python-format
+msgid "Adding {}"
+msgstr "Ajout de %s"
+
+#: sat_frontends/jp/cmd_file.py:141
+#, fuzzy
+msgid "Done !"
+msgstr "N° de Tél:"
+
+#: sat_frontends/jp/cmd_file.py:183
+#, fuzzy
+msgid "request a file from a contact"
+msgstr "Attend qu'un fichier soit envoyé par un contact"
+
+#: sat_frontends/jp/cmd_file.py:195
+msgid ""
+"destination path where the file will be saved (default: "
+"[current_dir]/[name|hash])"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:204
+#, fuzzy
+msgid "name of the file"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_file.py:210
+#, fuzzy
+msgid "hash of the file"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_file.py:216
+msgid "hash algorithm use for --hash (default: sha-256)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:232 sat_frontends/jp/cmd_file.py:476
+msgid "overwrite existing file without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:239 sat_frontends/jp/cmd_file.py:333
+#, fuzzy, python-format
+msgid "File received successfully"
+msgstr "tarot: chien reçu"
+
+#: sat_frontends/jp/cmd_file.py:243
+msgid "The file request has been refused"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:245
+#, fuzzy, python-format
+msgid "Error while requesting file: {}"
+msgstr "Échec de la désinscription: %s"
+
+#: sat_frontends/jp/cmd_file.py:249
+msgid "at least one of --name or --hash must be provided"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:258 sat_frontends/jp/cmd_file.py:510
+msgid "File {path} already exists! Do you want to overwrite?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:261
+msgid "file request cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:280
+#, fuzzy, python-format
+msgid "can't request file: {e}"
+msgstr "Échec de la désinscription: %s"
+
+#: sat_frontends/jp/cmd_file.py:293
+#, fuzzy
+msgid "wait for a file to be sent by a contact"
+msgstr "Attend qu'un fichier soit envoyé par un contact"
+
+#: sat_frontends/jp/cmd_file.py:306
+msgid "jids accepted (accept everything if none is specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:312
+#, fuzzy
+msgid "accept multiple files (you'll have to stop manually)"
+msgstr "Accepte plusieurs fichiers (vous devrez arrêter le programme à la main)"
+
+#: sat_frontends/jp/cmd_file.py:318
+#, fuzzy
+msgid "force overwritting of existing files (/!\\ name is choosed by sender)"
+msgstr "Force le remplacement des fichiers existants"
+
+#: sat_frontends/jp/cmd_file.py:326
+msgid "destination path (default: working directory)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:337
+msgid "hash checked: {metadata['hash_algo']}:{metadata['hash']}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:340
+msgid "hash is checked but hash value is missing"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:342
+msgid "hash can't be verified"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:345
+#, fuzzy
+msgid "Error while receiving file: {e}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat_frontends/jp/cmd_file.py:354 sat_frontends/jp/cmd_pipe.py:111
+msgid "Action has no XMLUI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:359 sat_frontends/jp/cmd_pipe.py:115
+msgid "Invalid XMLUI received"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:369 sat_frontends/jp/cmd_pipe.py:126
+msgid "Ignoring action without from_jid data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:374 sat_frontends/jp/cmd_file.py:395
+msgid "ignoring action without progress id"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:379
+msgid "File refused because overwrite is needed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:397
+msgid "Overwriting needed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:401
+#, fuzzy
+msgid "Overwrite accepted"
+msgstr "accepté"
+
+#: sat_frontends/jp/cmd_file.py:403
+msgid "Refused to overwrite"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:417
+msgid "invalid \"from_jid\" value received, ignoring: {value}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:424
+msgid "ignoring action without \"from_jid\" value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:426
+msgid "Confirmation needed for request from an entity not in roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:431
+msgid "Sender confirmed because she or he is explicitly expected"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:439
+msgid "Session refused for {from_jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:446
+msgid "Given path is not a directory !"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:450
+msgid "waiting for incoming file request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:461
+msgid "download a file from URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:470
+msgid "destination file (DEFAULT: filename from URL)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:478
+msgid "URI of the file to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:481
+msgid "File download started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:484
+msgid "File downloaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:487
+#, fuzzy, python-format
+msgid "Error while downloading file: {}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat_frontends/jp/cmd_file.py:513
+msgid "file download cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:534
+msgid "upload a file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:542
+msgid "encrypt file using AES-GCM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:544
+msgid "file to upload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:548
+msgid "jid of upload component (nothing to autodetect)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:553
+msgid "ignore invalide TLS certificate (/!\\ Dangerous /!\\)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:557
+msgid "File upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:560
+msgid "File uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:566
+msgid "URL to retrieve the file:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:571
+msgid "Error while uploading file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:593
+#, fuzzy, python-format
+msgid "file {file_} doesn't exist !"
+msgstr "Le fichier [%s] n'existe pas !"
+
+#: sat_frontends/jp/cmd_file.py:597
+msgid "{file_} is a dir! Can't upload a dir"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:633
+msgid "set affiliations for a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:641 sat_frontends/jp/cmd_file.py:695
+#: sat_frontends/jp/cmd_file.py:747 sat_frontends/jp/cmd_file.py:801
+#: sat_frontends/jp/cmd_file.py:1002
+msgid "namespace of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:647 sat_frontends/jp/cmd_file.py:701
+#: sat_frontends/jp/cmd_file.py:753 sat_frontends/jp/cmd_file.py:807
+#: sat_frontends/jp/cmd_file.py:1007
+msgid "path to the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:657 sat_frontends/jp/cmd_pubsub.py:453
+msgid "entity/affiliation couple(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:661 sat_frontends/jp/cmd_file.py:767
+msgid "jid of file sharing entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:687
+msgid "retrieve affiliations of a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:705 sat_frontends/jp/cmd_file.py:811
+msgid "jid of sharing entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:729
+msgid "affiliations management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:739
+msgid "set configuration for a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:763 sat_frontends/jp/cmd_pubsub.py:282
+msgid "configuration field to set (required)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:793
+msgid "retrieve configuration of a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:838
+#, fuzzy
+msgid "file sharing node configuration"
+msgstr "Demande de confirmation pour un transfer de fichier demandée"
+
+#: sat_frontends/jp/cmd_file.py:850
+msgid "retrieve files shared by an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:859
+msgid "path to the directory containing the files"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:865
+msgid "jid of sharing entity (nothing to check our own jid)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:874
+msgid "unknown file type: {type}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:923
+msgid "share a file or directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:931
+msgid "virtual name to use (default: use directory/file name)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:941
+msgid "jid of contacts allowed to retrieve the files"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:946
+msgid "share publicly the file(s) (/!\\ *everybody* will be able to access them)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:953
+msgid "path to a file or directory to share"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:978
+msgid "{path} shared under the name \"{name}\""
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:988
+msgid "send invitation for a shared repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:996
+#, fuzzy
+msgid "name of the repository"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_file.py:1014
+msgid "type of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1019
+msgid "https URL of a image to use as thumbnail"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1023
+msgid "jid of the file sharing service hosting the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1027
+#, fuzzy
+msgid "jid of the person to invite"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_file.py:1035
+msgid "only http(s) links are allowed with --thumbnail"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1053
+msgid "invitation sent to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1068
+msgid "files sharing management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1077
+msgid "files sending/receiving/management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:45
+msgid "edit forums"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:54 sat_frontends/jp/cmd_forums.py:123
+msgid "forum key (DEFAULT: default forums)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:74
+msgid "forums have been edited"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:115
+msgid "get forums structure"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:168 sat_frontends/jp/cmd_pubsub.py:733
+#, fuzzy
+msgid "no schema found"
+msgstr "Aucun transport trouvé"
+
+#: sat_frontends/jp/cmd_forums.py:180
+msgid "Forums structure edition"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:37
+msgid "get identity data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:45
+msgid "entity to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:68
+msgid "update identity data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:77
+msgid "nicknames of the entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:101
+msgid "identity management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:38
+msgid "service discovery"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:42
+msgid "entity to discover"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:49
+msgid "type of data to discover"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:51
+msgid "node to use"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:57
+#, fuzzy
+msgid "ignore cache"
+msgstr "fichier [%s] déjà en cache"
+
+#: sat_frontends/jp/cmd_info.py:69
+msgid "category"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:111
+msgid "node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:116
+msgid "Features"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:118
+#, fuzzy
+msgid "Identities"
+msgstr "Petite"
+
+#: sat_frontends/jp/cmd_info.py:120
+msgid "Extensions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:122
+msgid "Items"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:151 sat_frontends/jp/cmd_info.py:166
+msgid "error while doing discovery: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:190
+msgid "software version"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:193 sat_frontends/jp/cmd_info.py:258
+#, fuzzy
+msgid "Entity to request"
+msgstr "Demande de suppression de contact"
+
+#: sat_frontends/jp/cmd_info.py:201
+#, fuzzy, python-format
+msgid "error while trying to get version: {e}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat_frontends/jp/cmd_info.py:207
+msgid "Software name: {name}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:209
+msgid "Software version: {version}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:211
+msgid "Operating System: {os}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:225
+#, fuzzy
+msgid "running session"
+msgstr "Lancement de l'application"
+
+#: sat_frontends/jp/cmd_info.py:243
+msgid "Error getting session infos: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:253
+msgid "devices of an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:267
+msgid "Error getting devices infos: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:283
+msgid "Get various pieces of information on entities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:61
+msgid "encoding of the input data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:69
+msgid "standard input"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:77
+msgid "short option"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:85
+msgid "long option"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:93
+msgid "positional argument"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:101
+msgid "ignore value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:107
+msgid "don't actually run commands but echo what would be launched"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:110
+msgid "log stdout to FILE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:113
+msgid "log stderr to FILE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:128 sat_frontends/jp/cmd_input.py:193
+msgid "arguments in input data and in arguments sequence don't match"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:155 sat_frontends/jp/cmd_input.py:207
+msgid "values: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:161
+msgid "**SKIPPING**\n"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:184
+msgid "Invalid argument, an option type is expected, got {type_}:{name}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:199
+msgid "command {idx}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:252 sat_frontends/primitivus/xmlui.py:461
+msgid "OK"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:254
+msgid "FAILED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:274
+msgid "comma-separated values"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:283
+msgid "starting row (previous ones will be ignored)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:291
+msgid "split value in several options"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:299
+msgid "action to do on empty value ({choices})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:314
+msgid "--empty value must be one of {choices}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:349
+msgid "launch command with external input"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:38
+msgid "create and send an invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:127
+msgid "you need to specify an email address to send email invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:161
+#, fuzzy
+msgid "get invitation data"
+msgstr "Connexion..."
+
+#: sat_frontends/jp/cmd_invitation.py:165
+#: sat_frontends/jp/cmd_invitation.py:225
+#: sat_frontends/jp/cmd_invitation.py:289
+#, fuzzy
+msgid "invitation UUID"
+msgstr "Connexion..."
+
+#: sat_frontends/jp/cmd_invitation.py:170
+msgid "start profile session and retrieve jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:185
+msgid "can't get invitation data: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:198
+#, fuzzy
+msgid "can't start session: {e}"
+msgstr "Construction du jeu de Tarot"
+
+#: sat_frontends/jp/cmd_invitation.py:208
+msgid "can't retrieve jid: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:221
+#, fuzzy
+msgid "delete guest account"
+msgstr "Enregistrement d'un nouveau compte"
+
+#: sat_frontends/jp/cmd_invitation.py:233
+msgid "can't delete guest account: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:242
+msgid "modify existing invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:299
+msgid "you can't set {arg_name} in both optional argument and extra"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:314
+msgid "invitations have been modified successfuly"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:328
+#, fuzzy
+msgid "list invitations data"
+msgstr "Connexion..."
+
+#: sat_frontends/jp/cmd_invitation.py:346
+msgid "return only invitations linked to this profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:370
+msgid "invitation of user(s) without XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:43 sat_frontends/jp/cmd_list.py:81
+#: sat_frontends/jp/cmd_list.py:150 sat_frontends/jp/cmd_merge_request.py:39
+#: sat_frontends/jp/cmd_merge_request.py:124
+#: sat_frontends/jp/cmd_merge_request.py:169
+msgid "auto"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:45
+msgid "get lists"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:82
+msgid "set a list item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:94
+msgid "field(s) to set (required)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:101
+msgid "update existing item instead of replacing it (DEFAULT: auto)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:107
+msgid "id, URL of the item to update, or nothing for new item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:151
+msgid "delete a list item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:156 sat_frontends/jp/cmd_pubsub.py:884
+#: sat_frontends/jp/cmd_roster.py:135
+msgid "delete without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:159 sat_frontends/jp/cmd_pubsub.py:887
+#, fuzzy
+msgid "notify deletion"
+msgstr "Sélection du contrat"
+
+#: sat_frontends/jp/cmd_list.py:163
+msgid "id of the item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:169
+msgid "You need to specify a list item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:171
+#, fuzzy, python-format
+msgid "Are you sure to delete list item {item_id} ?"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat_frontends/jp/cmd_list.py:174 sat_frontends/jp/cmd_pubsub.py:897
+msgid "item deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:184 sat_frontends/jp/cmd_pubsub.py:907
+#, fuzzy, python-format
+msgid "can't delete item: {e}"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat_frontends/jp/cmd_list.py:187 sat_frontends/jp/cmd_pubsub.py:910
+msgid "item {item} has been deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:200
+msgid "import tickets from external software/dataset"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:225
+msgid ""
+"specified field in import data will be put in dest field (default: use "
+"same field name, or ignore if it doesn't exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:235
+msgid "PubSub service where the items must be uploaded (default: server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:242
+msgid "PubSub node where the items must be uploaded (default: tickets' defaults)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:257
+msgid "Tickets upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:260
+msgid "Tickets uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:264
+#, fuzzy, python-format
+msgid "Error while uploading tickets: {error_msg}"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat_frontends/jp/cmd_list.py:319
+msgid ""
+"fields_map must be specified either preencoded in --option or using "
+"--map, but not both at the same time"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:337
+msgid "Error while trying to import tickets: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:350
+msgid "pubsub lists handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:40
+msgid "publish or update a merge request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:48
+msgid "id or URL of the request to update, or nothing for a new one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:55
+#: sat_frontends/jp/cmd_merge_request.py:179
+msgid "path of the repository (DEFAULT: current directory)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:61
+msgid "publish merge request without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:68
+msgid "labels to categorize your request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:75
+msgid ""
+"You are going to publish your changes to service [{service}], are you "
+"sure ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:80
+msgid "merge request publication cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:105
+msgid "Merge request published at {published_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:110
+msgid "Merge request published"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:125
+#, fuzzy
+msgid "get a merge request"
+msgstr "Demande de changement de statut"
+
+#: sat_frontends/jp/cmd_merge_request.py:170
+#, fuzzy
+msgid "import a merge request"
+msgstr "Demande de changement de statut"
+
+#: sat_frontends/jp/cmd_merge_request.py:209
+msgid "merge-request management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:34
+#, fuzzy
+msgid "send a message to a contact"
+msgstr "Attend qu'un fichier soit envoyé par un contact"
+
+#: sat_frontends/jp/cmd_message.py:38
+msgid "language of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:44
+#, fuzzy
+msgid ""
+"separate xmpp messages: send one message per line instead of one message "
+"alone."
+msgstr ""
+"Sépare les messages xmpp: envoi un message par ligne plutôt qu'un seul "
+"message global."
+
+#: sat_frontends/jp/cmd_message.py:53
+#, fuzzy
+msgid "add a new line at the beginning of the input (usefull for ascii art ;))"
+msgstr "Ajoute un saut de ligne au début de l'entrée (utile pour l'art ascii ;))"
+
+#: sat_frontends/jp/cmd_message.py:60
+msgid "subject of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:63
+msgid "language of subject"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:70
+msgid "type of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:73
+msgid "encrypt message using given algorithm"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:79
+msgid "XHTML body"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:80
+msgid "rich body"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:195
+msgid "query archives using MAM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:203
+msgid "start fetching archive from this date (default: from the beginning)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:207
+msgid "end fetching archive after this date (default: no limit)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:210
+msgid "retrieve only archives with this jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:213
+msgid "maximum number of items to retrieve, using RSM (default: 20))"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:276
+msgid "messages handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:32
+#, fuzzy
+msgid "get a parameter value"
+msgstr "Impossible de charger les paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:37 sat_frontends/jp/cmd_param.py:94
+#, fuzzy
+msgid "category of the parameter"
+msgstr "Impossible de charger les paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:39 sat_frontends/jp/cmd_param.py:95
+#: sat_frontends/jp/cmd_param.py:96
+#, fuzzy
+msgid "name of the parameter"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_param.py:45
+msgid "name of the attribute to get"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:48 sat_frontends/jp/cmd_param.py:98
+msgid "security limit"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:62
+#, fuzzy
+msgid "can't find requested parameters: {e}"
+msgstr "Impossible de charger les paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:79
+#, fuzzy
+msgid "can't find requested parameter: {e}"
+msgstr "Impossible de charger les paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:90
+msgid "set a parameter value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:111
+#, fuzzy
+msgid "can't set requested parameter: {e}"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/jp/cmd_param.py:125
+#, fuzzy, python-format
+msgid "save parameters template to xml file"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:129
+msgid "output file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:136
+#, fuzzy, python-format
+msgid "can't save parameters to file: {e}"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:140
+#, fuzzy, python-format
+msgid "parameters saved to file {filename}"
+msgstr "Échec de la désinscription: %s"
+
+#: sat_frontends/jp/cmd_param.py:155
+#, fuzzy, python-format
+msgid "load parameters template from xml file"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:159
+#, fuzzy
+msgid "input file"
+msgstr "Envoi un fichier"
+
+#: sat_frontends/jp/cmd_param.py:166
+#, fuzzy, python-format
+msgid "can't load parameters from file: {e}"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat_frontends/jp/cmd_param.py:170
+#, fuzzy, python-format
+msgid "parameters loaded from file {filename}"
+msgstr "Échec de la désinscription: %s"
+
+#: sat_frontends/jp/cmd_param.py:182
+#, fuzzy
+msgid "Save/load parameters template"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: sat_frontends/jp/cmd_ping.py:29
+msgid "ping XMPP entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:32
+msgid "jid to ping"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:34
+msgid "output delay only (in s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:41
+msgid "can't do the ping: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:38
+msgid "send a pipe a stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:97
+#, fuzzy
+msgid "receive a pipe stream"
+msgstr "Lancement du flux"
+
+#: sat_frontends/jp/cmd_pipe.py:104
+msgid "Jids accepted (none means \"accept everything\")"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:159
+msgid "stream piping through XMPP"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:33
+#, fuzzy
+msgid "The name of the profile"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_profile.py:51
+msgid "You need to use either --connect or --start-session"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:78
+#, fuzzy
+msgid "the name of the profile"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_profile.py:81
+msgid "the password of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:83 sat_frontends/jp/cmd_profile.py:238
+#, fuzzy
+msgid "the jid of the profile"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_profile.py:86
+msgid "the password of the XMPP account (use profile password if not specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:93 sat_frontends/jp/cmd_profile.py:247
+msgid "connect this profile automatically when backend starts"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:97
+msgid "set to component import name (entry point) if this is a component"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:154
+msgid "delete profile without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:174
+#, fuzzy
+msgid "get information about a profile"
+msgstr "Demande de contacts pour un profile inexistant"
+
+#: sat_frontends/jp/cmd_profile.py:180
+msgid "show the XMPP password IN CLEAR TEXT"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:184
+#, fuzzy
+msgid "XMPP password"
+msgstr "Mot de passe:"
+
+#: sat_frontends/jp/cmd_profile.py:185
+msgid "autoconnect (backend)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:209
+msgid "get clients profiles only"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:229
+msgid "modify an existing profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:234
+#, fuzzy
+msgid "change the password of the profile"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_profile.py:237
+msgid "disable profile password (dangerous!)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:240
+msgid "change the password of the XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:243
+#, fuzzy
+msgid "set as default profile"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat_frontends/jp/cmd_profile.py:280
+#, fuzzy
+msgid "profile commands"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/jp/cmd_pubsub.py:59
+#, fuzzy
+msgid "retrieve node configuration"
+msgstr "Connexion..."
+
+#: sat_frontends/jp/cmd_pubsub.py:68
+msgid "data key to filter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:116
+#, fuzzy
+msgid "create a node"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat_frontends/jp/cmd_pubsub.py:135 sat_frontends/jp/cmd_pubsub.py:288
+msgid "don't prepend \"pubsub#\" prefix to field names"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:158
+msgid "can't create node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:162
+#, fuzzy
+msgid "node created successfully: "
+msgstr "Inscription réussie"
+
+#: sat_frontends/jp/cmd_pubsub.py:176
+msgid "purge a node (i.e. remove all items from it)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:184
+#, fuzzy
+msgid "purge node without confirmation"
+msgstr "désinscription confirmée pour [%s]"
+
+#: sat_frontends/jp/cmd_pubsub.py:190
+msgid ""
+"Are you sure to purge PEP node [{node}]? This will delete ALL items from "
+"it!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:195
+msgid ""
+"Are you sure to delete node [{node}] on service [{service}]? This will "
+"delete ALL items from it!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:199
+msgid "node purge cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:208
+msgid "can't purge node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:211
+msgid "node [{node}] purged successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:223
+#, fuzzy
+msgid "delete a node"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_pubsub.py:231
+msgid "delete node without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:237
+#, fuzzy, python-format
+msgid "Are you sure to delete PEP node [{node}] ?"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat_frontends/jp/cmd_pubsub.py:241
+#, fuzzy, python-format
+msgid "Are you sure to delete node [{node}] on service [{service}]?"
+msgstr ""
+"Êtes vous sûr de vouloir inscrire le nouveau compte [%(user)s] au serveur"
+" %(server)s ?"
+
+#: sat_frontends/jp/cmd_pubsub.py:244
+msgid "node deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:256
+msgid "node [{node}] deleted successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:270
+#, fuzzy
+msgid "set node configuration"
+msgstr "Connexion..."
+
+#: sat_frontends/jp/cmd_pubsub.py:309
+#, fuzzy
+msgid "node configuration successful"
+msgstr "Inscription réussie"
+
+#: sat_frontends/jp/cmd_pubsub.py:320
+msgid "import raw XML to a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:327 sat_frontends/jp/cmd_pubsub.py:1608
+msgid "do a pubsub admin request, needed to change publisher"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:332
+msgid ""
+"path to the XML file with data to import. The file must contain whole XML"
+" of each item to import."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:359
+msgid "You are not using list of pubsub items, we can't import this file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:370
+msgid "Items are imported without using admin mode, publisher can't be changed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:391
+msgid "items published with id(s) {items_ids}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:396 sat_frontends/jp/cmd_pubsub.py:1641
+msgid "items published"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:409
+msgid "retrieve node affiliations (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:439
+msgid "set affiliations (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:469
+msgid "affiliations have been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:481
+msgid "set or retrieve node affiliations"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:494
+msgid "retrieve node subscriptions (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:532
+#, fuzzy, python-format
+msgid "subscription must be one of {}"
+msgstr "inscription approuvée pour [%s]"
+
+#: sat_frontends/jp/cmd_pubsub.py:548
+msgid "set/modify subscriptions (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:563
+msgid "entity/subscription couple(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:578
+#, fuzzy, python-format
+msgid "subscriptions have been set"
+msgstr "inscription approuvée pour [%s]"
+
+#: sat_frontends/jp/cmd_pubsub.py:590
+msgid "get or modify node subscriptions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:603
+msgid "set/replace a schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:607
+msgid "schema to set (must be XML)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:621 sat_frontends/jp/cmd_pubsub.py:656
+msgid "schema has been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:637
+msgid "edit a schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:709
+msgid "get schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:742
+msgid "data schema manipulation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:761
+msgid "node handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:774
+msgid "publish a new item or update an existing one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:783
+msgid "id, URL of the item to update, keyword, or nothing for new item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:805
+#, fuzzy, python-format
+msgid "can't send item: {e}"
+msgstr "message reçu de: %s"
+
+#: sat_frontends/jp/cmd_pubsub.py:827
+msgid "get pubsub item(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:835
+#, fuzzy
+msgid "subscription id"
+msgstr "demande d'inscription pour [%s]"
+
+#: sat_frontends/jp/cmd_pubsub.py:879
+#, fuzzy
+msgid "delete an item"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_pubsub.py:892
+msgid "You need to specify an item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:894
+#, fuzzy, python-format
+msgid "Are you sure to delete item {item_id} ?"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat_frontends/jp/cmd_pubsub.py:924
+msgid "edit an existing or new pubsub item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:968
+msgid "Item has not payload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:992
+msgid "rename a pubsub item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1024
+msgid "subscribe to a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1039
+msgid "can't subscribe to node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1042
+#, fuzzy
+msgid "subscription done"
+msgstr "demande d'inscription pour [%s]"
+
+#: sat_frontends/jp/cmd_pubsub.py:1044
+msgid "subscription id: {sub_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1059
+msgid "unsubscribe from a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1073
+msgid "can't unsubscribe from node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1076
+#, fuzzy, python-format
+msgid "subscription removed"
+msgstr "inscription approuvée pour [%s]"
+
+#: sat_frontends/jp/cmd_pubsub.py:1088
+msgid "retrieve all subscriptions on a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1102
+msgid "can't retrieve subscriptions: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1117
+msgid "retrieve all affiliations on a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1160
+msgid "search items corresponding to filters"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1185
+msgid "maximum depth of recursion (will search linked nodes if > 0, DEFAULT: 0)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1197
+msgid "maximum number of items to get per node ({} to get all items, DEFAULT: 30)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1207
+msgid "namespace to use for xpath"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1216
+msgid "filters"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1217
+msgid "only items corresponding to following filters will be kept"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1226
+msgid "full text filter, item must contain this string (XML included)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1235
+msgid "like --text but using a regular expression"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1244
+msgid "filter items which has elements matching this xpath"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1253
+msgid ""
+"Python expression which much return a bool (True to keep item, False to "
+"reject it). \"item\" is raw text item, \"item_xml\" is lxml's "
+"etree.Element"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1266
+msgid "filters flags"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1267
+msgid "filters modifiers (change behaviour of following filters)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1278
+msgid "(don't) ignore case in following filters (DEFAULT: case sensitive)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1289
+msgid "(don't) invert effect of following filters (DEFAULT: don't invert)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1300
+msgid "(don't) use DOTALL option for regex (DEFAULT: don't use)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1311
+msgid "keep only the matching part of the item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1320
+msgid "action to do on found items (DEFAULT: print)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1383
+msgid ""
+"item doesn't looks like XML, you have probably used --only-matching "
+"somewhere before and we have no more XML"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1420
+msgid "--only-matching used with fixed --text string, are you sure?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1441
+msgid "can't use xpath: {reason}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1476
+#, fuzzy, python-format
+msgid "unknown filter type {type}"
+msgstr "Type d'action inconnu"
+
+#: sat_frontends/jp/cmd_pubsub.py:1534
+msgid "executed command failed with exit code {ret}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1566
+msgid "Command can only be used with {actions} actions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1572
+msgid "you need to specify a command to execute"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1575
+msgid "empty node is not handled yet"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1596
+msgid "modify items of a node using an external command/script"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1603
+msgid "apply transformation (DEFAULT: do a dry run)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1614
+msgid "if command return a non zero exit code, ignore the item and continue"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1622
+msgid "get all items by looping over all pages using RSM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1626
+msgid ""
+"path to the command to use. Will be called repetitivly with an item as "
+"input. Output (full item XML) will be used as new one. Return \"DELETE\" "
+"string to delete the item, and \"SKIP\" to ignore it"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1636
+msgid "items published with ids {item_ids}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1659
+msgid "Can't retrieve all items, RSM metadata not available"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1664
+msgid "Can't retrieve all items, bad RSM metadata: {msg}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1670
+msgid "All items transformed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1674
+msgid "Retrieving next page ({page_idx}/{page_total})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1712
+msgid "Duplicate found on item {item_id}, we have probably handled all items."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1749
+msgid "Deleting item {item_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1766
+msgid "Skipping item {item_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1860 sat_frontends/jp/cmd_uri.py:53
+msgid "build URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1868
+msgid "profile (used when no server is specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1908
+msgid "create a Pubsub hook"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1917
+msgid "hook type"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1923
+msgid "make hook persistent across restarts"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1927
+msgid "argument of the hook (depend of the type)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1936
+msgid "{path} is not a file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1965
+msgid "delete a Pubsub hook"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1974
+msgid "hook type to remove, empty to remove all (DEFAULT: remove all)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1981
+msgid "argument of the hook to remove, empty to remove all (DEFAULT: remove all)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2001
+msgid "{nb_deleted} hook(s) have been deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2013
+#, fuzzy
+msgid "list hooks of a profile"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_pubsub.py:2029
+#, fuzzy
+msgid "No hook found."
+msgstr "Aucune donnée trouvée"
+
+#: sat_frontends/jp/cmd_pubsub.py:2043
+msgid "trigger action on Pubsub notifications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2067
+msgid "PubSub nodes/items management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:36
+msgid "retrieve the roster entities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:89
+msgid "set metadata for a roster entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:93
+msgid "name to use for this entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:96
+msgid "groups for this entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:99
+msgid "replace all metadata instead of adding them"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:101 sat_frontends/jp/cmd_roster.py:138
+#, fuzzy
+msgid "jid of the roster entity"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/jp/cmd_roster.py:131
+#, fuzzy, python-format
+msgid "remove an entity from roster"
+msgstr "supppression du contact %s"
+
+#: sat_frontends/jp/cmd_roster.py:142
+#, fuzzy, python-format
+msgid "Are you sure to delete {entity} fril your roster?"
+msgstr "Êtes vous sûr de vouloir supprimer %s de votre liste de contacts ?"
+
+#: sat_frontends/jp/cmd_roster.py:145
+msgid "entity deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:158
+msgid "Show statistics about a roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:226
+msgid "purge the roster from its contacts with no subscription"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:231
+#, fuzzy, python-format
+msgid "also purge contacts with no 'from' subscription"
+msgstr "Le contact %s a refusé votre inscription"
+
+#: sat_frontends/jp/cmd_roster.py:234
+#, fuzzy, python-format
+msgid "also purge contacts with no 'to' subscription"
+msgstr "Le contact %s a refusé votre inscription"
+
+#: sat_frontends/jp/cmd_roster.py:306
+msgid "do a full resynchronisation of roster with server"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:318
+msgid "Roster resynchronized"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:327
+msgid "Manage an entity's roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:33
+msgid ""
+"Welcome to {app_name} shell, the Salut à Toi shell !\n"
+"\n"
+"This enrironment helps you using several {app_name} commands with similar"
+" parameters.\n"
+"\n"
+"To quit, just enter \"quit\" or press C-d.\n"
+"Enter \"help\" or \"?\" to know what to do\n"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:48
+msgid "launch jp in shell (REPL) mode"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:63
+msgid "bad command path"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:104
+msgid "COMMAND {external}=> {args}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:105
+msgid "(external) "
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:149
+#, fuzzy
+msgid "Shell commands:"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/jp/cmd_shell.py:152
+#, fuzzy
+msgid "Action commands:"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/jp/cmd_shell.py:172
+msgid "verbose mode is {status}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:173
+msgid "ENABLED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:173
+msgid "DISABLED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:214
+msgid "arg profile={profile} (logged profile)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:236
+msgid "no argument in USE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:238
+msgid "arguments in USE:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:274
+msgid "argument {name} not found"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:280
+msgid "argument {name} removed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:288
+msgid "good bye!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:37
+msgid "parse URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:42
+msgid "XMPP URI to parse"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:57
+msgid "URI type"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:58
+msgid "URI path"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:66
+msgid "URI fields"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:80
+msgid "XMPP URI parsing/generation"
+msgstr ""
+
+#: sat_frontends/jp/common.py:437
+msgid "no item found at all, we create a new one"
+msgstr ""
+
+#: sat_frontends/jp/common.py:440
+msgid "item \"{item}\" not found, we create a new item withthis id"
+msgstr ""
+
+#: sat_frontends/jp/common.py:458
+msgid "item \"{item}\" found, we edit it"
+msgstr ""
+
+#: sat_frontends/jp/common.py:785
+msgid "No {key} URI specified for this project, please specify service and node"
+msgstr ""
+
+#: sat_frontends/jp/common.py:821
+msgid "Invalid URI found: {uri}"
+msgstr ""
+
+#: sat_frontends/jp/loops.py:28
+msgid "User interruption: good bye"
+msgstr "Interrompu par l'utilisateur: au revoir"
+
+#: sat_frontends/jp/output_template.py:53
+msgid "Can't find requested template: {template_path}"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:74
+msgid ""
+"no default template set for this command, you need to specify a template "
+"using --oo template=[path/to/template.html]"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:89
+msgid "Can't parse template, please check its syntax"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:109
+msgid ""
+"Browser opening requested.\n"
+"Temporary files are put in the following directory, you'll have to delete"
+" it yourself once finished viewing: {}"
+msgstr ""
+
+#: sat_frontends/jp/output_xml.py:56
+msgid ""
+"Pygments is not available, syntax highlighting is not possible. Please "
+"install if from http://pygments.org or with pip install pygments"
+msgstr ""
+
+#: sat_frontends/jp/xml_tools.py:50
+msgid "Can't parse the payload XML in input: {msg}"
+msgstr ""
+
+#: sat_frontends/jp/xml_tools.py:62
+msgid "<item> can only have one child element (the payload)"
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:224
+msgid "(enter: {value})"
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:318
+msgid "your choice (0-{limit_max}): "
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:348
+msgid "your choice (0,1): "
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:90
+#, fuzzy, python-format
+msgid "Error while sending message ({})"
+msgstr "Erreur en tentant de rejoindre le salon"
+
+#: sat_frontends/primitivus/base.py:135
+msgid "Please specify the globbing pattern to search for"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:377
+#, fuzzy
+msgid "Configuration Error"
+msgstr "Connexion..."
+
+#: sat_frontends/primitivus/base.py:377
+msgid ""
+"Something went wrong while reading the configuration, please check "
+":messages"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:504
+msgid "Pleeeeasse, I can't even breathe !"
+msgstr "Pitiééééééééé, je ne peux même pas respirer !"
+
+#: sat_frontends/primitivus/base.py:534
+#: sat_frontends/primitivus/profile_manager.py:64
+#, fuzzy
+msgid "Connect"
+msgstr "Connexion..."
+
+#: sat_frontends/primitivus/base.py:536
+#, fuzzy
+msgid "Parameters"
+msgstr "&Paramètres"
+
+#: sat_frontends/primitivus/base.py:537 sat_frontends/primitivus/base.py:851
+msgid "About"
+msgstr "À propos"
+
+#: sat_frontends/primitivus/base.py:538
+#, fuzzy
+msgid "Exit"
+msgstr "Quitter"
+
+#: sat_frontends/primitivus/base.py:542
+msgid "Join room"
+msgstr "Rejoindre un salon"
+
+#: sat_frontends/primitivus/base.py:547
+#, fuzzy
+msgid "Main menu"
+msgstr "Construction des menus"
+
+#: sat_frontends/primitivus/base.py:658
+msgid "{app}: a new event has just happened{entity}"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:736
+#, fuzzy
+msgid "Chat menu"
+msgstr "Construction des menus"
+
+#: sat_frontends/primitivus/base.py:790
+#, fuzzy
+msgid "Unmanaged action"
+msgstr "Tab inconnu"
+
+#: sat_frontends/primitivus/base.py:801
+#, fuzzy
+msgid "unkown"
+msgstr "Messagerie inconnue"
+
+#: sat_frontends/primitivus/base.py:831
+#, fuzzy, python-format
+msgid "Can't get parameters (%s)"
+msgstr "Impossible de charger les paramètres !"
+
+#: sat_frontends/primitivus/base.py:846
+msgid "Entering a MUC room"
+msgstr "Entrée dans le salon MUC"
+
+#: sat_frontends/primitivus/base.py:846
+#, fuzzy
+msgid "Please enter MUC's JID"
+msgstr "Veuillez entrer le JID de votre nouveau contact"
+
+#: sat_frontends/primitivus/chat.py:40
+msgid "{} occupants"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:381
+msgid "Game"
+msgstr "Jeu"
+
+#: sat_frontends/primitivus/chat.py:502
+msgid "You have been mentioned by {nick} in {room}"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:513
+msgid "{entity} is talking to you"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:612
+msgid "Results for searching the globbing pattern: {}"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:618
+msgid "Type ':history <lines>' to reset the chat history"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:652
+#, python-format
+msgid "Primitivus: %s is talking to you"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:656
+#, fuzzy, python-format
+msgid "Primitivus: %(user)s mentioned you in room '%(room)s'"
+msgstr "L'utilisateur %(nick)s a rejoint le salon (%(room_id)s)"
+
+#: sat_frontends/primitivus/chat.py:666
+#, fuzzy
+msgid "Can't start game"
+msgstr "Construction du jeu de Tarot"
+
+#: sat_frontends/primitivus/chat.py:667
+msgid "You need to be exactly 4 peoples in the room to start a Tarot game"
+msgstr ""
+"Vous devez être exactement 4 personnes dans le salon pour commencer un "
+"jeu de Tarot"
+
+#: sat_frontends/primitivus/chat.py:698
+msgid "Change title"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:699
+#, fuzzy
+msgid "Enter the new title"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat_frontends/primitivus/game_tarot.py:290
+msgid "Please choose your contrat"
+msgstr "Veuillez choisir votre contrat"
+
+#: sat_frontends/primitivus/game_tarot.py:311
+msgid "You win \\o/"
+msgstr "Victoire \\o/"
+
+#: sat_frontends/primitivus/game_tarot.py:311
+msgid "You loose :("
+msgstr "Vous perdez :("
+
+#: sat_frontends/primitivus/game_tarot.py:331
+msgid "Cards played are invalid !"
+msgstr "Les cartes jouées sont invalides !"
+
+#: sat_frontends/primitivus/game_tarot.py:369
+msgid "Do you put these cards in chien ?"
+msgstr "Voulez-vous placer ces cartes au chien ?"
+
+#: sat_frontends/primitivus/profile_manager.py:36
+#, fuzzy
+msgid "Login:"
+msgstr "Identifiant"
+
+#: sat_frontends/primitivus/profile_manager.py:37
+msgid "Password:"
+msgstr "Mot de passe:"
+
+#: sat_frontends/primitivus/profile_manager.py:48
+msgid "New"
+msgstr "Nouveau"
+
+#: sat_frontends/primitivus/profile_manager.py:49
+msgid "Delete"
+msgstr "Suppression"
+
+#: sat_frontends/primitivus/profile_manager.py:81
+#, fuzzy
+msgid "Profile Manager"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/primitivus/profile_manager.py:142
+msgid "Can't create profile"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:150
+#, fuzzy
+msgid "New profile"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/primitivus/profile_manager.py:151
+#, fuzzy
+msgid "Please enter a new profile name"
+msgstr "Veuillez entrer le nom du nouveau profile"
+
+#: sat_frontends/primitivus/profile_manager.py:160
+#, fuzzy, python-format
+msgid "Are you sure you want to delete the profile {} ?"
+msgstr "Êtes vous sûr de vouloir supprimer le profile [%s] ?"
+
+#: sat_frontends/primitivus/progress.py:37
+msgid "Clear progress list"
+msgstr "Effacer la liste"
+
+#: sat_frontends/primitivus/status.py:57
+msgid "Set your presence"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:67
+msgid "Set your status"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:68
+msgid "New status"
+msgstr ""
+
+#: sat_frontends/primitivus/xmlui.py:78
+#, fuzzy
+msgid "Unknown div_char"
+msgstr "Type d'action inconnu"
+
+#: sat_frontends/primitivus/xmlui.py:456
+msgid "Submit"
+msgstr "Envoyer"
+
+#: sat_frontends/primitivus/xmlui.py:458 sat_frontends/primitivus/xmlui.py:473
+msgid "Cancel"
+msgstr "Annuler"
+
+#: sat_frontends/quick_frontend/constants.py:31
+msgid "Away from keyboard"
+msgstr ""
+
+#: sat_frontends/quick_frontend/constants.py:33
+msgid "Extended away"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:85
+msgid "Error while trying to get autodisconnect param, ignoring: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:200
+#, fuzzy
+msgid "Can't get profile parameter: {msg}"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/quick_frontend/quick_app.py:324
+msgid "Can't get namespaces map: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:330
+msgid "Can't retrieve encryption plugins: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:376
+msgid "Error while initialising bridge: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:662
+#, fuzzy, python-format
+msgid "Can't connect profile [%s]"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/quick_frontend/quick_app.py:723
+#, fuzzy
+msgid "Connected"
+msgstr "Connexion..."
+
+#: sat_frontends/quick_frontend/quick_app.py:739
+#, fuzzy
+msgid "Disconnected"
+msgstr "Déconnexion..."
+
+#: sat_frontends/quick_frontend/quick_app.py:1154
+#, fuzzy, python-format
+msgid "The contact {contact} has accepted your subscription"
+msgstr "Le contact %s a accepté votre inscription"
+
+#: sat_frontends/quick_frontend/quick_app.py:1157
+#: sat_frontends/quick_frontend/quick_app.py:1176
+#, fuzzy
+msgid "Subscription confirmation"
+msgstr "désinscription confirmée pour [%s]"
+
+#: sat_frontends/quick_frontend/quick_app.py:1162
+#, fuzzy, python-format
+msgid "The contact {contact} has refused your subscription"
+msgstr "Le contact %s a refusé votre inscription"
+
+#: sat_frontends/quick_frontend/quick_app.py:1165
+#, fuzzy
+msgid "Subscription refusal"
+msgstr "demande d'inscription pour [%s]"
+
+#: sat_frontends/quick_frontend/quick_app.py:1172
+#, fuzzy, python-format
+msgid ""
+"The contact {contact} wants to subscribe to your presence.\n"
+"Do you accept ?"
+msgstr ""
+"Le contact %s veut s'inscrire à vos informations de présence\n"
+"Acceptez vous ?"
+
+#: sat_frontends/quick_frontend/quick_app.py:1229
+#, python-format
+msgid "param update: [%(namespace)s] %(name)s = %(value)s"
+msgstr "Le paramètre [%(namespace)s] %(name)s vaut désormais %(value)s"
+
+#: sat_frontends/quick_frontend/quick_app.py:1233
+#, python-format
+msgid "Changing JID to %s"
+msgstr "Changement du JID pour %s"
+
+#: sat_frontends/quick_frontend/quick_chat.py:624
+#, fuzzy
+msgid "now we print the history"
+msgstr "Maintenant on affiche l'historique"
+
+#: sat_frontends/quick_frontend/quick_chat.py:626
+#, fuzzy
+msgid " ({} messages)"
+msgstr "Messages"
+
+#: sat_frontends/quick_frontend/quick_chat.py:683
+#, fuzzy
+msgid "Can't get history: {}"
+msgstr "Impossible de charger l'historique !"
+
+#: sat_frontends/quick_frontend/quick_chat.py:705
+msgid "Can't get encryption state: {reason}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:775
+msgid "message encryption started with {target} using {encryption}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:780
+msgid "message encryption stopped with {target} (was using {encryption})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:833
+msgid "<= {nick} has left the room ({count})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:837
+msgid "<=> {nick} re-entered the room ({count})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_list.py:611
+#, fuzzy
+msgid "Trying to delete an unknow entity [{}]"
+msgstr "Tentative d'accès à un profile inconnu"
+
+#: sat_frontends/quick_frontend/quick_contact_list.py:664
+msgid "received presence from entity without resource: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:73
+#, fuzzy
+msgid "Trying to get attribute for an unknown contact"
+msgstr "Tentative d'assigner un paramètre à un profile inconnu"
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:89
+msgid "INTERNAL ERROR: Key log.error"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:101
+#, fuzzy, python-format
+msgid "Trying to update an unknown contact: %s"
+msgstr "Tentative d'accès à un profile inconnu"
+
+#: sat_frontends/quick_frontend/quick_games.py:84
+msgid ""
+"A {game} activity between {players} has been started, but you couldn't "
+"take part because your client doesn't support it."
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_games.py:87
+msgid "{game} Game"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:116
+#, fuzzy, python-format
+msgid "Trying to plug an unknown profile key ({})"
+msgstr "Tentative d'appel d'un profile inconnue"
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:118
+#, fuzzy
+msgid "Profile plugging in error"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:133
+#, fuzzy
+msgid "Can't get profile parameter"
+msgstr "Mauvais nom de profile"
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:144
+#, fuzzy
+msgid "A profile with this name already exists"
+msgstr "Ce nom de profile existe déjà"
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:146
+msgid "Profile creation cancelled by backend"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:148
+#, fuzzy
+msgid "You profile name is not valid"
+msgstr "Ce profile n'est pas utilisé"
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:152
+#, fuzzy
+msgid "Can't create profile ({})"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:172
+msgid "You can't connect manually and automatically at the same time"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:180
+msgid "No profile selected"
+msgstr "Aucun profile sélectionné"
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:181
+#, fuzzy
+msgid "You need to create and select at least one profile before connecting"
+msgstr ""
+"Vous devez sélectionner un profile ou en créer un nouveau avant de vous "
+"connecter."
+
+#: sat_frontends/quick_frontend/quick_utils.py:40
+#, fuzzy
+msgid ""
+"\n"
+"    %prog [options]\n"
+"\n"
+"    %prog --help for options list\n"
+"    "
+msgstr ""
+"\n"
+"        %prog [options] [FICHIER1 FICHIER2 ...] JID\n"
+"        %prog -w [options] [JID1 JID2 ...]\n"
+"\n"
+"        %prog --help pour la liste des options\n"
+"        "
+
+#: sat_frontends/quick_frontend/quick_utils.py:49
+msgid "Select the profile to use"
+msgstr "Veuillez sélectionner le profile à utiliser"
+
+#: sat_frontends/tools/xmlui.py:233
+msgid "Nothing to submit"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:449
+msgid "XMLUI can have only one main container"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:514
+#, fuzzy, python-format
+msgid "Unknown container [%s], using default one"
+msgstr "Disposition inconnue, utilisation de celle par defaut"
+
+#: sat_frontends/tools/xmlui.py:527
+msgid "Internal Error, container has not _xmluiAppend method"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:674
+#, fuzzy, python-format
+msgid "FIXME FIXME FIXME: widget type [%s] is not implemented"
+msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
+
+#: sat_frontends/tools/xmlui.py:678
+#, fuzzy, python-format
+msgid "FIXME FIXME FIXME: type [%s] is not implemented"
+msgstr "CORRIGEZ-MOI: actionResult n'est pas implémenté"
+
+#: sat_frontends/tools/xmlui.py:696
+#, python-format
+msgid "No change listener on [%s]"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:722
+#, fuzzy, python-format
+msgid "Unknown tag [%s]"
+msgstr "Type d'action inconnu"
+
+#: sat_frontends/tools/xmlui.py:780
+#, fuzzy
+msgid "No callback_id found"
+msgstr "Aucun transport trouvé"
+
+#: sat_frontends/tools/xmlui.py:813
+#, python-format
+msgid "FIXME: XMLUI internal action [%s] is not implemented"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:909 sat_frontends/tools/xmlui.py:921
+#: sat_frontends/tools/xmlui.py:971 sat_frontends/tools/xmlui.py:983
+msgid "The form data is not sent back, the type is not managed properly"
+msgstr ""
+"Les données du formulaire ne sont pas envoyées, il y a une erreur dans la"
+" gestion du type"
+
+#: sat_frontends/tools/xmlui.py:915 sat_frontends/tools/xmlui.py:977
+msgid "Cancelling form"
+msgstr "Annulation du formulaire"
+
+#: sat_frontends/tools/xmlui.py:1096
+msgid "XMLUI class already registered for {type_}, ignoring"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:1135
+msgid "You must register classes with registerClass before creating a XMLUI"
+msgstr ""
+
--- a/i18n/sat.pot	Thu Jun 03 15:21:43 2021 +0200
+++ b/i18n/sat.pot	Thu Jun 17 13:05:58 2021 +0200
@@ -1,2201 +1,1003 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Translations template for Libervia.
+# Copyright (C) 2021 ORGANIZATION
+# This file is distributed under the same license as the Libervia project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-03-06 21:21+0100\n"
+"Project-Id-Version: Libervia VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2021-06-15 10:11+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-
-#: frontends/src/bridge/dbus_bridge.py:78
-#: src/bridge/bridge_constructor/constructors/dbus/dbus_core_template.py:227
-#: src/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:78
-#: src/bridge/bridge_constructor/generated/dbus_bridge.py:78
-#: src/bridge/dbus_bridge.py:578
+"Generated-By: Babel 2.9.0\n"
+
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_core_template.py:273
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:85
+#: sat/bridge/bridge_constructor/generated/dbus_bridge.py:85
+#: sat/bridge/dbus_bridge.py:747 sat_frontends/bridge/dbus_bridge.py:85
 msgid ""
 "D-Bus is not launched, please see README to see instructions on how to "
 "launch it"
 msgstr ""
 
-#: frontends/src/bridge/dbus_bridge.py:91
-#: src/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:91
-#: src/bridge/bridge_constructor/generated/dbus_bridge.py:91
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:99
+#: sat/bridge/bridge_constructor/generated/dbus_bridge.py:99
+#: sat_frontends/bridge/dbus_bridge.py:99
 msgid "Unknown interface"
 msgstr ""
 
-#: frontends/src/jp/base.py:115
-msgid ""
-"ProgressBar not available, please download it at http://pypi.python.org/pypi/"
-"progressbar"
-msgstr ""
-
-#: frontends/src/jp/base.py:116
-msgid ""
-"Progress bar deactivated\n"
-"--\n"
-msgstr ""
-
-#: frontends/src/jp/base.py:173
-msgid "Available commands"
-msgstr ""
-
-#: frontends/src/jp/base.py:188 frontends/src/quick_frontend/quick_app.py:299
-msgid "Can't connect to SàT backend, are you sure it's launched ?"
-msgstr ""
-
-#: frontends/src/jp/base.py:190 frontends/src/quick_frontend/quick_app.py:302
-msgid "Can't init bridge"
-msgstr ""
-
-#: frontends/src/jp/base.py:192 frontends/src/quick_frontend/quick_app.py:305
-msgid "Error while initialising bridge: {}"
-msgstr ""
-
-#: frontends/src/jp/base.py:291
-#, python-format
-msgid "Use PROFILE profile key (default: %(default)s)"
-msgstr ""
-
-#: frontends/src/jp/base.py:292
-msgid "Password used to connect profile, if necessary"
-msgstr ""
-
-#: frontends/src/jp/base.py:296
-msgid "Connect the profile before doing anything else"
-msgstr ""
-
-#: frontends/src/jp/base.py:301
-msgid "Start a profile session without connecting"
-msgstr ""
-
-#: frontends/src/jp/base.py:305
-msgid "Show progress bar"
-msgstr ""
-
-#: frontends/src/jp/base.py:308
-msgid "Add a verbosity level (can be used multiple times)"
-msgstr ""
-
-#: frontends/src/jp/base.py:336
-msgid "Can't import {} plugin, ignoring it"
-msgstr ""
-
-#: frontends/src/jp/base.py:340
-#, python-brace-format
-msgid "Missing module for plugin {name}: {missing}"
-msgstr ""
-
-#: frontends/src/jp/base.py:354
-#, python-brace-format
-msgid "Invalid plugin module [{type}] {module}"
-msgstr ""
-
-#: frontends/src/jp/base.py:368
-msgid "User interruption: good bye"
-msgstr ""
-
-#: frontends/src/jp/base.py:437
-#, python-format
-msgid "%s is not a valid JID !"
-msgstr ""
-
-#: frontends/src/jp/base.py:461
-#, python-brace-format
-msgid "Can't connect profile: {reason}"
-msgstr ""
-
-#: frontends/src/jp/base.py:465
-#, python-brace-format
-msgid "Can't start {profile}'s session: {reason}"
-msgstr ""
-
-#: frontends/src/jp/base.py:471
-#, python-brace-format
-msgid "The profile [{profile}] doesn't exist"
-msgstr ""
-
-#: frontends/src/jp/base.py:485
-#, python-brace-format
-msgid ""
-"Session for [{profile}] is not started, please start it before using jp, or "
-"use either --start-session or --connect option"
-msgstr ""
-
-#: frontends/src/jp/base.py:501
-#, python-brace-format
-msgid ""
-"Profile [{profile}] is not connected, please connect it before using jp, or "
-"use --connect option"
-msgstr ""
-
-#: frontends/src/jp/base.py:582
-msgid "select output format (default: {})"
-msgstr ""
-
-#: frontends/src/jp/base.py:583
-msgid "output specific option"
-msgstr ""
-
-#: frontends/src/jp/base.py:667
-msgid "file size is not known, we can't show a progress bar"
-msgstr ""
-
-#: frontends/src/jp/base.py:672
-msgid "Progress: "
-msgstr ""
-
-#: frontends/src/jp/base.py:696
-msgid "Operation started"
-msgstr ""
-
-#: frontends/src/jp/base.py:712
-msgid "Operation successfully finished"
-msgstr ""
-
-#: frontends/src/jp/base.py:719
-msgid "Error while doing operation: {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:30
-msgid "Remote control a software"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:33
-msgid "Software name"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:34
-msgid "Jids allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:35
-msgid "Groups allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:36
-msgid "Groups that are *NOT* allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:37
-msgid "Jids that are *NOT* allowed to use the command"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:38
-msgid "Loop on the commands"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:52
-msgid "No bus name found"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:54
-#, python-format
-msgid "Bus name found: [%s]"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:57
-#, python-format
-msgid "Command found: (path:%(path)s, iface: %(iface)s) [%(command)s]"
-msgstr ""
-
-#: frontends/src/jp/cmd_adhoc.py:66
-msgid "Ad-hoc commands"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:36
-msgid "set avatar of the profile"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:40
-msgid "path to the image to upload"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:46 frontends/src/jp/cmd_file.py:82
-#: frontends/src/jp/cmd_file.py:264
-msgid "file [{}] doesn't exist !"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:52
-msgid "avatar has been set"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:56
-#, python-brace-format
-msgid "error while uploading avatar: {msg}"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:63
-msgid "retrieve avatar of an entity"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:67
-msgid "entity"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:68
-msgid "show avatar"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:90
-msgid "No avatar found."
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:100
-#, python-brace-format
-msgid "error while getting avatar: {msg}"
-msgstr ""
-
-#: frontends/src/jp/cmd_avatar.py:111
-msgid "avatar uploading/retrieving"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:197
-msgid "get blog item(s)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:201
-msgid "PubSub node to request"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:203
-msgid "item(s) id(s) to get (default: request all items)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:204
-msgid "maximum number of items to get ({} to get all items)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:207
-msgid "microblog data key(s) to display (default: depend of verbosity)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:209
-msgid "JID of the PubSub service (default: request profile own blog)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:369
-msgid "edit an existing or new blog post"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:373
-msgid "URL of the item to edit, or keyword"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:374
-msgid "launch a blog preview in parallel"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:375
-msgid "title of the item"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:376
-msgid "tag (category) of your item"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:377
-msgid "disable comments"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:633
-msgid "preview a blog content"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:637
-msgid "use inotify to handle preview"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:638
-msgid "path to the content file"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:775
-msgid "import an external blog"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:779
-msgid "importer name, nothing to display importers list"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:780
-msgid "original blog host"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:781
-msgid "do *NOT* upload images (default: do upload images)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:782
-msgid "do not upload images from this host (default: upload all images)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:783
-msgid "ignore invalide TLS certificate for uploads"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:785
-msgid "importer specific options (see importer description)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:787
-msgid "PubSub service where the items must be uploaded (default: server)"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:789
-msgid ""
-"importer data location (see importer description), nothing to show importer "
-"description"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:792
-msgid "Blog upload started"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:795
-msgid "Blog uploaded successfully"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:805
-#, python-brace-format
-msgid ""
-"\n"
-"To redirect old URLs to new ones, put the following lines in your sat.conf "
-"file, in [libervia] section:\n"
-"\n"
-"{conf}"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:808
-msgid "Error while uploading blog: {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:811
-#, python-brace-format
-msgid "Error while trying to upload a blog: {reason}"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:818
-#, python-brace-format
-msgid "{name} argument can't be used without location argument"
-msgstr ""
-
-#: frontends/src/jp/cmd_blog.py:854
-msgid "blog/microblog management"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:32
-#, python-format
-msgid "storage location (default: %(default)s)"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:33
-#, python-format
-msgid "bookmarks type (default: %(default)s)"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:42
-msgid "list bookmarks"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:70
-msgid "remove a bookmark"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:75 frontends/src/jp/cmd_bookmarks.py:89
-msgid "jid (for muc bookmark) or url of to remove"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:84 src/plugins/plugin_xep_0048.py:252
-msgid "add a bookmark"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:90
-msgid "bookmark name"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:91
-msgid "MUC specific options"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:92
-msgid "nickname"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:93
-msgid "join room on profile connection"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:98
-msgid "You can't use --autojoin or --nick with --type url"
-msgstr ""
-
-#: frontends/src/jp/cmd_bookmarks.py:114
-msgid "manage bookmarks"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:49
-msgid "call a bridge method"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:54
-msgid "name of the method to execute"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:55
-msgid "argument of the method"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:63
-msgid "Error while executing {}: {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:76
-msgid "bad arguments"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:82
-msgid "send a fake signal from backend"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:86
-msgid "name of the signal to send"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:87
-msgid "argument of the signal"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:101
-msgid "bridge s(t)imulation"
-msgstr ""
-
-#: frontends/src/jp/cmd_debug.py:108
-msgid "debugging tools"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:38
-msgid "Send a file to a contact"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:42
-msgid "a list of file"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:43 frontends/src/jp/cmd_message.py:44
-#: frontends/src/jp/cmd_pipe.py:42
-msgid "the destination jid"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:44
-msgid "make a bzip2 tarball"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:51 frontends/src/jp/cmd_file.py:121
-msgid "File copy started"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:54
-msgid "File sent successfully"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:57
-msgid "Error while sending file: {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:66
-#, python-brace-format
-msgid "File request sent to {jid}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:71
-#, python-brace-format
-msgid "Can't send file to {jid}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:75
-#, python-brace-format
-msgid "Error while trying to send a file: {reason}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:85
-msgid "[{}] is a dir ! Please send files inside or use compression"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:93
-msgid "bz2 is an experimental option, use with caution"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:95
-msgid "Starting compression, please wait..."
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:100
-msgid "Adding {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:103
-msgid "Done !"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:115
-msgid "Wait for a file to be sent by a contact"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:124
-msgid "File received successfully"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:127
-#, python-brace-format
-msgid "hash checked: {algo}:{checksum}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:132
-msgid "hash is checked but hash value is missing"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:134
-msgid "hash can't be verified"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:137
-msgid "Error while receiving file: {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:146 frontends/src/jp/cmd_pipe.py:73
-msgid "Action has no XMLUI"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:151 frontends/src/jp/cmd_pipe.py:78
-msgid "Invalid XMLUI received"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:161 frontends/src/jp/cmd_pipe.py:88
-msgid "Ignoring action without from_jid data"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:166 frontends/src/jp/cmd_file.py:185
-msgid "ignoring action without progress id"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:171
-msgid "File refused because overwrite is needed"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:187
-msgid "Overwriting needed"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:191
-msgid "Overwrite accepted"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:193
-msgid "Refused to overwrite"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:200
-msgid "JIDs accepted (accept everything if none is specified)"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:201
-msgid "accept multiple files (you'll have to stop manually)"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:202
-msgid "force overwritting of existing files (/!\\ name is choosed by sended)"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:203
-msgid "destination path (default: working directory)"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:209
-msgid "Given path is not a directory !"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:213
-msgid "waiting for incoming file request"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:219
-msgid "Upload a file"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:223
-msgid "file to upload"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:224
-msgid "jid of upload component (nothing to autodetect)"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:225
-msgid "ignore invalide TLS certificate"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:228
-msgid "File upload started"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:231
-msgid "File uploaded successfully"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:237
-msgid "URL to retrieve the file:"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:242
-msgid "Error while uploading file: {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:254
-msgid "Can't upload file"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:258
-#, python-brace-format
-msgid "Error while trying to upload a file: {reason}"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:267
-msgid "[{}] is a dir! Can't upload a dir"
-msgstr ""
-
-#: frontends/src/jp/cmd_file.py:283
-msgid "File sending/receiving"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:30
-msgid "service discovery"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:34
-msgid "entity to discover"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:35
-msgid "node to use"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:43
-#, python-format
-msgid "Error while doing discovery [%s]"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:90
-#, python-brace-format
-msgid ""
-"Features:\n"
-"\n"
-"{features}"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:92
-#, python-brace-format
-msgid ""
-"Identities:\n"
-"\n"
-"{identities}"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:94
-#, python-brace-format
-msgid ""
-"Extensions:\n"
-"\n"
-"{extensions}"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:96
-#, python-brace-format
-msgid ""
-"Items:\n"
-"\n"
-"{items}"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:109
-msgid "running session"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:113
-msgid "Entity to request"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:121
-#, python-format
-msgid "Error while trying to get version [%s]"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:128 src/plugins/plugin_xep_0092.py:107
-#, python-format
-msgid "Client name: %s"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:130 src/plugins/plugin_xep_0092.py:109
-#, python-format
-msgid "Client version: %s"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:132
-#, python-format
-msgid "Operating System: %s"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:141
-msgid "client version"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:155
-msgid "Error getting session infos: {}"
-msgstr ""
-
-#: frontends/src/jp/cmd_info.py:163
-msgid "Get various pieces of information on entities"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:32
-msgid "send a message to a contact"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:35
-msgid "language of the message"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:36
-msgid ""
-"separate xmpp messages: send one message per line instead of one message "
-"alone."
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:37
-msgid "add a new line at the beginning of the input (usefull for ascii art ;))"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:38
-msgid "subject of the message"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:39
-msgid "language of subject"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:40
-msgid "type of the message"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:42
-msgid "XHTML body"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:43
-msgid "rich body"
-msgstr ""
-
-#: frontends/src/jp/cmd_message.py:91
-msgid "messages handling"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:29
-msgid "Get a parameter value"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:32 frontends/src/jp/cmd_param.py:64
-msgid "Category of the parameter"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:33 frontends/src/jp/cmd_param.py:65
-#: frontends/src/jp/cmd_param.py:66
-msgid "Name of the parameter"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:34
-msgid "Name of the attribute to get"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:35 frontends/src/jp/cmd_param.py:67
-msgid "Security limit"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:61
-msgid "Set a parameter value"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:78
-msgid "Save parameters template to xml file"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:81
-msgid "Output file"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:86
-#, python-format
-msgid "Parameters saved to file %s"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:88
-#, python-format
-msgid "Can't save parameters to file %s"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:94
-msgid "Load parameters template from xml file"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:97
-msgid "Input file"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:102
-#, python-format
-msgid "Parameters loaded from file %s"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:104
-#, python-format
-msgid "Can't load parameters from file %s"
-msgstr ""
-
-#: frontends/src/jp/cmd_param.py:111
-msgid "Save/load parameters template"
-msgstr ""
-
-#: frontends/src/jp/cmd_pipe.py:38
-msgid "send a pipe a stream"
-msgstr ""
-
-#: frontends/src/jp/cmd_pipe.py:60
-msgid "receive a pipe stream"
-msgstr ""
-
-#: frontends/src/jp/cmd_pipe.py:64
-msgid "Jids accepted (none means \"accept everything\")"
-msgstr ""
-
-#: frontends/src/jp/cmd_pipe.py:111
-msgid "stream piping through XMPP"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:30
-msgid "The name of the profile"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:62
-msgid "delete profile without confirmation"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:72
-msgid "Profile deletion cancelled"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:80
-msgid "get information about a profile"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:82 src/plugins/plugin_xep_0048.py:256
-msgid "jid"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:87
-msgid "show the XMPP password IN CLEAR TEXT"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:103
-msgid "XMPP password"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:113
-msgid "the password of the profile"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:139
-msgid "set to component import name (entry point) if this is a component"
-msgstr ""
-
-#: frontends/src/jp/cmd_profile.py:171
-msgid "set as default profile"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:35
-msgid "Purge the roster from its contacts with no subscription"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:39
-msgid "Also purge contacts with no 'from' subscription"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:40
-msgid "Also purge contacts with no 'to' subscription"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:46 frontends/src/jp/cmd_roster.py:110
-#: frontends/src/jp/cmd_roster.py:181
-#, python-format
-msgid "Error while retrieving the contacts [%s]"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:100
-msgid "Show statistics about a roster"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:169
-msgid "Retrieve the roster contacts"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:173
-msgid "Show the contacts' subscriptions"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:174
-msgid "Show the contacts' groups"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:175
-msgid "Show the contacts' names"
-msgstr ""
-
-#: frontends/src/jp/cmd_roster.py:214
-msgid "Manage an entity's roster"
-msgstr ""
-
-#: frontends/src/jp/output_template.py:100
-msgid ""
-"Browser opening requested.\n"
-"Temporary files are put in the following directory, you'll have to delete it "
-"yourself once finished viewing: {}"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:37
-msgid "{} occupants"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:346
-msgid "Game"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:429
-#, python-brace-format
-msgid "<= {nick} has left the room ({count})"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:431
-#, python-brace-format
-msgid "<=> {nick} re-entered the room ({count})"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:466
-#, python-brace-format
-msgid "You have been mentioned by {nick} in {room}"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:473
-#, python-brace-format
-msgid "{entity} is talking to you"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:560
-msgid "Results for searching the globbing pattern: {}"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:561
-msgid "Type ':history <lines>' to reset the chat history"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:591
-#, python-format
-msgid "Primitivus: %s is talking to you"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:593
-#, python-format
-msgid "Primitivus: %(user)s mentioned you in room '%(room)s'"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:599
-msgid "Can't start game"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:599
-msgid "You need to be exactly 4 peoples in the room to start a Tarot game"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:623
-msgid "Change title"
-msgstr ""
-
-#: frontends/src/primitivus/chat.py:624
-msgid "Enter the new title"
-msgstr ""
-
-#: frontends/src/primitivus/contact_list.py:47
-#: frontends/src/primitivus/primitivus:533 src/plugins/plugin_xep_0055.py:80
-#: src/stdui/ui_contact_list.py:36 src/stdui/ui_contact_list.py:37
-#: src/stdui/ui_contact_list.py:38
-msgid "Contacts"
-msgstr ""
-
-#: frontends/src/primitivus/game_tarot.py:267
-msgid "Please choose your contrat"
-msgstr ""
-
-#: frontends/src/primitivus/game_tarot.py:283
-#: src/plugins/plugin_misc_tarot.py:244
-msgid "Draw game"
-msgstr ""
-
-#: frontends/src/primitivus/game_tarot.py:285
-msgid "You win \\o/"
-msgstr ""
-
-#: frontends/src/primitivus/game_tarot.py:285
-msgid "You loose :("
-msgstr ""
-
-#: frontends/src/primitivus/game_tarot.py:297
-msgid "Cards played are invalid !"
-msgstr ""
-
-#: frontends/src/primitivus/game_tarot.py:330
-msgid "Do you put these cards in chien ?"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:91
-msgid "Error while sending message ({})"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:136
-msgid "Please specify the globbing pattern to search for"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:371
-msgid "Configuration Error"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:371
-msgid ""
-"Something went wrong while reading the configuration, please check :messages"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:498
-msgid "Pleeeeasse, I can't even breathe !"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:527 src/memory/params.py:81
-msgid "General"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:528
-#: frontends/src/primitivus/profile_manager.py:53
-msgid "Connect"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:529 src/plugins/plugin_xep_0050.py:59
-msgid "Disconnect"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:530
-msgid "Parameters"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:531
-#: frontends/src/primitivus/primitivus:821
-msgid "About"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:532
-msgid "Exit"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:534 src/plugins/plugin_xep_0048.py:61
-msgid "Groups"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:536
-msgid "Join room"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:541
-msgid "Main menu"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:636
-#, python-brace-format
-msgid "{app}: a new event has just happened{entity}"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:706
-msgid "Chat menu"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:760
-#: frontends/src/primitivus/primitivus:801
-#: frontends/src/quick_frontend/quick_profile_manager.py:130
-#: src/plugins/plugin_misc_account.py:495
-#: src/plugins/plugin_misc_account.py:538
-#: src/plugins/plugin_misc_account.py:595
-msgid "Error"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:760
-msgid "Unmanaged action"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:771
-msgid "unkown"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:801
-#, python-format
-msgid "Can't get parameters (%s)"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:816
-msgid "Entering a MUC room"
-msgstr ""
-
-#: frontends/src/primitivus/primitivus:816
-msgid "Please enter MUC's JID"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:36
-msgid "Login:"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:37
-msgid "Password:"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:45
-msgid "New"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:46
-msgid "Delete"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:58
-msgid "Profile Manager"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:108
-msgid "Can't create profile"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:115
-msgid "New profile"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:115
-msgid "Please enter a new profile name"
-msgstr ""
-
-#: frontends/src/primitivus/profile_manager.py:120
-msgid "Are you sure you want to delete the profile {} ?"
-msgstr ""
-
-#: frontends/src/primitivus/progress.py:37
-msgid "Clear progress list"
-msgstr ""
-
-#: frontends/src/primitivus/status.py:46
-msgid "Set your presence"
-msgstr ""
-
-#: frontends/src/primitivus/status.py:52
-msgid "Set your status"
-msgstr ""
-
-#: frontends/src/primitivus/status.py:52
-msgid "New status"
-msgstr ""
-
-#: frontends/src/primitivus/xmlui.py:81
-msgid "Unknown div_char"
-msgstr ""
-
-#: frontends/src/primitivus/xmlui.py:405
-msgid "Submit"
-msgstr ""
-
-#: frontends/src/primitivus/xmlui.py:407 frontends/src/primitivus/xmlui.py:418
-msgid "Cancel"
-msgstr ""
-
-#: frontends/src/primitivus/xmlui.py:409
-msgid "OK"
-msgstr ""
-
-#: frontends/src/primitivus/xmlui.py:417 src/plugins/plugin_xep_0048.py:263
-msgid "Save"
-msgstr ""
-
-#: frontends/src/quick_frontend/constants.py:27
-#: src/plugins/plugin_xep_0050.py:54
-msgid "Online"
-msgstr ""
-
-#: frontends/src/quick_frontend/constants.py:28
-#: src/plugins/plugin_xep_0050.py:56
-msgid "Free for chat"
-msgstr ""
-
-#: frontends/src/quick_frontend/constants.py:29
-msgid "Away from keyboard"
-msgstr ""
-
-#: frontends/src/quick_frontend/constants.py:30
-#: src/plugins/plugin_xep_0050.py:57
-msgid "Do not disturb"
-msgstr ""
-
-#: frontends/src/quick_frontend/constants.py:31
-msgid "Extended away"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:81
-msgid "Error while trying to get autodisconnect param, ignoring: {}"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:174
-#, python-brace-format
-msgid "Can't get profile parameter: {msg}"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:453
-#, python-format
-msgid "Can't connect profile [%s]"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:510
-msgid "Connected"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:517
-msgid "Disconnected"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:574
-#, python-format
-msgid ""
-"presence update for %(entity)s (show=%(show)s, priority=%(priority)s, "
-"statuses=%(statuses)s) [profile:%(profile)s]"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:783
-#, python-format
-msgid "The contact %s has accepted your subscription"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:783
-#: frontends/src/quick_frontend/quick_app.py:790
-msgid "Subscription confirmation"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:786
-#, python-format
-msgid "The contact %s has refused your subscription"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:786
-msgid "Subscription refusal"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:790
-#, python-format
-msgid ""
-"The contact %s wants to subscribe to your presence.\n"
-"Do you accept ?"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:813
-#, python-format
-msgid "param update: [%(namespace)s] %(name)s = %(value)s"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_app.py:815
-#, python-format
-msgid "Changing JID to %s"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_chat.py:434
-msgid "now we print the history"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_chat.py:436
-msgid " ({} messages)"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_chat.py:478
-msgid "Can't get history: {}"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_contact_list.py:495
-msgid "Trying to delete an unknow entity [{}]"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_contact_list.py:536
-msgid "received presence from entity without resource: {}"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_contact_management.py:71
-msgid "Trying to get attribute for an unknown contact"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_contact_management.py:87
-msgid "INTERNAL ERROR: Key log.error"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_contact_management.py:99
-#, python-format
-msgid "Trying to update an unknown contact: %s"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_games.py:74
-#, python-brace-format
-msgid ""
-"A {game} activity between {players} has been started, but you couldn't take "
-"part because your client doesn't support it."
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_games.py:75
-#, python-brace-format
-msgid "{game} Game"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:116
-msgid "Trying to plug an unknown profile key ({})"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:118
-msgid "Profile plugging in error"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:130
-msgid "Can't get profile parameter"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:141
-msgid "A profile with this name already exists"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:143
-msgid "Profile creation cancelled by backend"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:145
-msgid "You profile name is not valid"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:147
-msgid "Can't create profile ({})"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:163
-#: src/stdui/ui_profile_manager.py:65
-msgid "Internal error"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:163
-msgid "You can't connect manually and automatically at the same time"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:168
-msgid "No profile selected"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_profile_manager.py:168
-msgid "You need to create and select at least one profile before connecting"
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_utils.py:38
-msgid ""
-"\n"
-"    %prog [options]\n"
-"\n"
-"    %prog --help for options list\n"
-"    "
-msgstr ""
-
-#: frontends/src/quick_frontend/quick_utils.py:45
-msgid "Select the profile to use"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:193
-msgid "Nothing to submit"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:337
-msgid "XMLUI can have only one main container"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:385
-#, python-format
-msgid "Unknown container [%s], using default one"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:394
-msgid "Internal Error, container has not _xmluiAppend method"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:472
-#, python-format
-msgid "FIXME FIXME FIXME: widget type [%s] is not implemented"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:473
-#, python-format
-msgid "FIXME FIXME FIXME: type [%s] is not implemented"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:481
-#, python-format
-msgid "No change listener on [%s]"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:498
-#, python-format
-msgid "Unknown tag [%s]"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:548
-msgid "No callback_id found"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:580
-#, python-format
-msgid "FIXME: XMLUI internal action [%s] is not implemented"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:667 frontends/src/tools/xmlui.py:677
-msgid "The form data is not sent back, the type is not managed properly"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:672
-msgid "Cancelling form"
-msgstr ""
-
-#: frontends/src/tools/xmlui.py:778
-msgid "You must register classes with registerClass before creating a XMLUI"
-msgstr ""
-
-#: src/core/sat_main.py:149
+#: sat/core/sat_main.py:212
 msgid "Memory initialised"
 msgstr ""
 
-#: src/core/sat_main.py:154
+#: sat/core/sat_main.py:219
+msgid "Could not initialize backend: {reason}"
+msgstr ""
+
+#: sat/core/sat_main.py:227
 msgid "Backend is ready"
 msgstr ""
 
-#: src/core/sat_main.py:189
-#, python-brace-format
+#: sat/core/sat_main.py:238
+msgid "Following profiles will be connected automatically: {profiles}"
+msgstr ""
+
+#: sat/core/sat_main.py:251
+msgid "Can't autoconnect profile {profile}: {reason}"
+msgstr ""
+
+#: sat/core/sat_main.py:321
 msgid ""
 "Can't import plugin [{path}]:\n"
 "{error}"
 msgstr ""
 
-#: src/core/sat_main.py:202
-#, python-brace-format
+#: sat/core/sat_main.py:340
 msgid "{type} type must be used with {mode} mode, ignoring plugin"
 msgstr ""
 
-#: src/core/sat_main.py:208
-#, python-brace-format
-msgid ""
-"Name conflict for import name [{import_name}], can't import plugin [{name}]"
-msgstr ""
-
-#: src/core/sat_main.py:234
+#: sat/core/sat_main.py:349
+msgid ""
+"Name conflict for import name [{import_name}], can't import plugin "
+"[{name}]"
+msgstr ""
+
+#: sat/core/sat_main.py:385
 msgid "Recommended plugin not found: {}"
 msgstr ""
 
-#: src/core/sat_main.py:248
-#, python-brace-format
+#: sat/core/sat_main.py:406
 msgid "Can't import plugin {name}: {error}"
 msgstr ""
 
-#: src/core/sat_main.py:311
+#: sat/core/sat_main.py:478
 msgid "already connected !"
 msgstr ""
 
-#: src/core/sat_main.py:331
+#: sat/core/sat_main.py:495
 msgid "not connected !"
 msgstr ""
 
-#: src/core/sat_main.py:406
+#: sat/core/sat_main.py:591
 msgid "Trying to remove reference to a client not referenced"
 msgstr ""
 
-#: src/core/sat_main.py:418
+#: sat/core/sat_main.py:604
 msgid "running app"
 msgstr ""
 
-#: src/core/sat_main.py:422
+#: sat/core/sat_main.py:608
 msgid "stopping app"
 msgstr ""
 
-#: src/core/sat_main.py:482
-msgid "Unexpected error: {}"
-msgstr ""
-
-#: src/core/sat_main.py:498
+#: sat/core/sat_main.py:646
+msgid "profile_key must not be empty"
+msgstr ""
+
+#: sat/core/sat_main.py:666
+msgid "Unexpected error: {failure_}"
+msgstr ""
+
+#: sat/core/sat_main.py:921
 msgid "asking connection status for a non-existant profile"
 msgstr ""
 
-#: src/core/sat_main.py:538
+#: sat/core/sat_main.py:1020
 #, python-format
 msgid "subsciption request [%(subs_type)s] for %(jid)s"
 msgstr ""
 
-#: src/core/sat_main.py:654
+#: sat/core/sat_main.py:1162
+msgid "Can't find features for service {service_jid}, ignoring"
+msgstr ""
+
+#: sat/core/sat_main.py:1221
+msgid "Can't retrieve {full_jid} infos, ignoring"
+msgstr ""
+
+#: sat/core/sat_main.py:1292
 msgid "Trying to remove an unknow progress callback"
 msgstr ""
 
-#: src/core/sat_main.py:738
+#: sat/core/sat_main.py:1382
 msgid "id already registered"
 msgstr ""
 
-#: src/core/sat_main.py:776
+#: sat/core/sat_main.py:1424
 msgid "trying to launch action with a non-existant profile"
 msgstr ""
 
-#: src/core/sat_main.py:858
+#: sat/core/sat_main.py:1520
 msgid "A menu with the same path and type already exists"
 msgstr ""
 
-#: src/core/xmpp.py:120
+#: sat/core/sat_main.py:1619
+msgid "help_string"
+msgstr ""
+
+#: sat/core/xmpp.py:196
 msgid "Can't parse port value, using default value"
 msgstr ""
 
-#: src/core/xmpp.py:141
+#: sat/core/xmpp.py:223
+msgid "We'll use the stable resource {resource}"
+msgstr ""
+
+#: sat/core/xmpp.py:255
 msgid "setting plugins parents"
 msgstr ""
 
-#: src/core/xmpp.py:160
+#: sat/core/xmpp.py:275
 msgid "Plugins initialisation error"
 msgstr ""
 
-#: src/core/xmpp.py:177
+#: sat/core/xmpp.py:297
 msgid "Error while disconnecting: {}"
 msgstr ""
 
-#: src/core/xmpp.py:191
-#, python-format
-msgid "********** [%s] CONNECTED **********"
-msgstr ""
-
-#: src/core/xmpp.py:200
+#: sat/core/xmpp.py:301
+msgid "{profile} identified"
+msgstr ""
+
+#: sat/core/xmpp.py:309
 msgid "XML stream is initialized"
 msgstr ""
 
-#: src/core/xmpp.py:216
-#, python-format
-msgid "ERROR: XMPP connection failed for profile '%(profile)s': %(reason)s"
-msgstr ""
-
-#: src/core/xmpp.py:230
-msgid "No keep_alife"
-msgstr ""
-
-#: src/core/xmpp.py:235
-#, python-format
-msgid "********** [%s] DISCONNECTED **********"
-msgstr ""
-
-#: src/core/xmpp.py:257
+#: sat/core/xmpp.py:317
+msgid "********** [{profile}] CONNECTED **********"
+msgstr ""
+
+#: sat/core/xmpp.py:343
+#, python-format
+msgid "ERROR: XMPP connection failed for profile '%(profile)s': %(reason)sprofile"
+msgstr ""
+
+#: sat/core/xmpp.py:398
+msgid "stopping connection because of network disabled"
+msgstr ""
+
+#: sat/core/xmpp.py:421
+msgid "network is available, trying to connect"
+msgstr ""
+
+#: sat/core/xmpp.py:445
+msgid "********** [{profile}] DISCONNECTED **********"
+msgstr ""
+
+#: sat/core/xmpp.py:464
+msgid ""
+"Your server certificate is not valid (its identity can't be checked).\n"
+"\n"
+"This should never happen and may indicate that somebody is trying to spy "
+"on you.\n"
+"Please contact your server administrator."
+msgstr ""
+
+#: sat/core/xmpp.py:515
 msgid "Disconnecting..."
 msgstr ""
 
-#: src/core/xmpp.py:401
-#, python-brace-format
+#: sat/core/xmpp.py:688
 msgid "Sending message (type {type}, to {to})"
 msgstr ""
 
-#: src/core/xmpp.py:407
-msgid ""
-"Triggers, storage and echo have been inhibited by the 'send_only' parameter"
-msgstr ""
-
-#: src/core/xmpp.py:447
+#: sat/core/xmpp.py:696
+msgid ""
+"Triggers, storage and echo have been inhibited by the 'send_only' "
+"parameter"
+msgstr ""
+
+#: sat/core/xmpp.py:762
 msgid "No message found"
 msgstr ""
 
-#: src/core/xmpp.py:581
-#, python-brace-format
+#: sat/core/xmpp.py:814
+msgid "invalid data used for host: {data}"
+msgstr ""
+
+#: sat/core/xmpp.py:839
+msgid ""
+"Certificate validation is deactivated, this is unsecure and somebody may "
+"be spying on you. If you have no good reason to disable certificate "
+"validation, please activate \"Check certificate\" in your settings in "
+"\"Connection\" tab."
+msgstr ""
+
+#: sat/core/xmpp.py:843
+msgid "Security notice"
+msgstr ""
+
+#: sat/core/xmpp.py:978
 msgid "The requested entry point ({entry_point}) is not available"
 msgstr ""
 
-#: src/core/xmpp.py:615
-#, python-brace-format
-msgid ""
-"Plugin {current_name} if needed for {entry_name}, but it doesn't handle "
+#: sat/core/xmpp.py:1016
+msgid ""
+"Plugin {current_name} is needed for {entry_name}, but it doesn't handle "
 "component mode"
 msgstr ""
 
-#: src/core/xmpp.py:619
+#: sat/core/xmpp.py:1024
 msgid "invalid plugin mode"
 msgstr ""
 
-#: src/core/xmpp.py:717
-#, python-brace-format
+#: sat/core/xmpp.py:1128
+msgid "parseMessage used with a non <message/> stanza, ignoring: {xml}"
+msgstr ""
+
+#: sat/core/xmpp.py:1140
+msgid "received <message> with a wrong namespace: {xml}"
+msgstr ""
+
+#: sat/core/xmpp.py:1226
 msgid "got message from: {from_}"
 msgstr ""
 
-#: src/core/xmpp.py:793
+#: sat/core/xmpp.py:1341
 msgid "There's no subscription between you and [{}]!"
 msgstr ""
 
-#: src/core/xmpp.py:795
+#: sat/core/xmpp.py:1346
 msgid "You are not subscribed to [{}]!"
 msgstr ""
 
-#: src/core/xmpp.py:797
+#: sat/core/xmpp.py:1348
 msgid "[{}] is not subscribed to you!"
 msgstr ""
 
-#: src/core/xmpp.py:954
-#, python-format
-msgid ""
-"presence update for [%(entity)s] (available, show=%(show)s statuses="
-"%(statuses)s priority=%(priority)d)"
-msgstr ""
-
-#: src/core/xmpp.py:975
+#: sat/core/xmpp.py:1384
+msgid "our server support roster versioning, we use it"
+msgstr ""
+
+#: sat/core/xmpp.py:1390
+msgid "no roster in cache, we start fresh"
+msgstr ""
+
+#: sat/core/xmpp.py:1394
+msgid "We have roster v{version} in cache"
+msgstr ""
+
+#: sat/core/xmpp.py:1405
+msgid "our server doesn't support roster versioning"
+msgstr ""
+
+#: sat/core/xmpp.py:1462
+msgid "adding {entity} to roster"
+msgstr ""
+
+#: sat/core/xmpp.py:1486
+msgid "removing {entity} from roster"
+msgstr ""
+
+#: sat/core/xmpp.py:1640
 #, python-format
 msgid "presence update for [%(entity)s] (unavailable, statuses=%(statuses)s)"
 msgstr ""
 
-#: src/core/xmpp.py:1038
+#: sat/core/xmpp.py:1724
 msgid "sending automatic \"from\" subscription request"
 msgstr ""
 
-#: src/core/xmpp.py:1046
+#: sat/core/xmpp.py:1732
 #, python-format
 msgid "subscription approved for [%s]"
 msgstr ""
 
-#: src/core/xmpp.py:1050
+#: sat/core/xmpp.py:1736
 #, python-format
 msgid "unsubscription confirmed for [%s]"
 msgstr ""
 
-#: src/core/xmpp.py:1055
+#: sat/core/xmpp.py:1741
 #, python-format
 msgid "subscription request from [%s]"
 msgstr ""
 
-#: src/core/xmpp.py:1060
+#: sat/core/xmpp.py:1747
 msgid "sending automatic subscription acceptance"
 msgstr ""
 
-#: src/core/xmpp.py:1068
+#: sat/core/xmpp.py:1759
 #, python-format
 msgid "unsubscription asked for [%s]"
 msgstr ""
 
-#: src/core/xmpp.py:1072
+#: sat/core/xmpp.py:1763
 msgid "automatic contact deletion"
 msgstr ""
 
-#: src/core/xmpp.py:1104
-#, python-format
-msgid "Registration asked for %(user)s@%(host)s"
-msgstr ""
-
-#: src/core/xmpp.py:1107
-#, python-format
-msgid "Connection made with %s"
-msgstr ""
-
-#: src/core/xmpp.py:1125
-#, python-format
-msgid "Registration answer: %s"
-msgstr ""
-
-#: src/core/xmpp.py:1129 src/plugins/plugin_xep_0077.py:87
-#: src/plugins/plugin_xep_0077.py:97
-#, python-format
-msgid "Registration failure: %s"
-msgstr ""
-
-#: src/memory/disco.py:219
+#: sat/memory/cache.py:69
+msgid "Can't read metadata file at {path}"
+msgstr ""
+
+#: sat/memory/cache.py:80
+msgid "Invalid cache metadata at {path}"
+msgstr ""
+
+#: sat/memory/cache.py:87
+msgid "cache {cache_file!r} references an inexisting file: {filepath!r}"
+msgstr ""
+
+#: sat/memory/cache.py:102
+msgid "following file is missing while purging cache: {path}"
+msgstr ""
+
+#: sat/memory/cache.py:200
+msgid "missing filename for cache {uid!r}"
+msgstr ""
+
+#: sat/memory/cache.py:207
+msgid "missing file referenced in cache {uid!r}: {filename}"
+msgstr ""
+
+#: sat/memory/disco.py:95
+msgid ""
+"no feature/identity found in disco element (hash: {cap_hash}), ignoring: "
+"{xml}"
+msgstr ""
+
+#: sat/memory/disco.py:274
 #, python-format
 msgid "Error while requesting [%(jid)s]: %(error)s"
 msgstr ""
 
-#: src/memory/disco.py:307
-#, python-format
-msgid "Capability hash generated: [%s]"
-msgstr ""
-
-#: src/memory/disco.py:348
+#: sat/memory/disco.py:338
+msgid "received an item without jid"
+msgstr ""
+
+#: sat/memory/disco.py:410
+msgid "Capability hash generated: [{cap_hash}]"
+msgstr ""
+
+#: sat/memory/disco.py:459
 msgid "invalid item (no jid)"
 msgstr ""
 
-#: src/memory/memory.py:219
-msgid ""
-"A database has been found in the default local_dir for previous versions (< "
-"0.5)"
-msgstr ""
-
-#: src/memory/memory.py:227
+#: sat/memory/encryption.py:71
+msgid "Could not restart {namespace!r} encryption with {entity}: {err}"
+msgstr ""
+
+#: sat/memory/encryption.py:74
+msgid "encryption sessions restored"
+msgstr ""
+
+#: sat/memory/encryption.py:116
+msgid "Encryption plugin registered: {name}"
+msgstr ""
+
+#: sat/memory/encryption.py:127
+msgid "Can't find requested encryption plugin: {namespace}"
+msgstr ""
+
+#: sat/memory/encryption.py:148
+msgid "Can't find a plugin with the name \"{name}\"."
+msgstr ""
+
+#: sat/memory/encryption.py:213
+msgid "No encryption plugin is registered, an encryption session can't be started"
+msgstr ""
+
+#: sat/memory/encryption.py:226
+msgid "Session with {bare_jid} is already encrypted with {name}. Nothing to do."
+msgstr ""
+
+#: sat/memory/encryption.py:237
+msgid ""
+"Session with {bare_jid} is already encrypted with {name}. Please stop "
+"encryption session before changing algorithm."
+msgstr ""
+
+#: sat/memory/encryption.py:249
+msgid "No resource found for {destinee}, can't encrypt with {name}"
+msgstr ""
+
+#: sat/memory/encryption.py:251
+msgid "No resource specified to encrypt with {name}, using {destinee}."
+msgstr ""
+
+#: sat/memory/encryption.py:257
+msgid "{name} encryption must be used with bare jids."
+msgstr ""
+
+#: sat/memory/encryption.py:261
+msgid "Encryption session has been set for {entity_jid} with {encryption_name}"
+msgstr ""
+
+#: sat/memory/encryption.py:268
+msgid ""
+"Encryption session started: your messages with {destinee} are now end to "
+"end encrypted using {name} algorithm."
+msgstr ""
+
+#: sat/memory/encryption.py:273
+msgid "Message are encrypted only for {nb_devices} device(s): {devices_list}."
+msgstr ""
+
+#: sat/memory/encryption.py:291
+msgid "There is no encryption session with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:295
+msgid ""
+"The encryption session is not run with the expected plugin: encrypted "
+"with {current_name} and was expecting {expected_name}"
+msgstr ""
+
+#: sat/memory/encryption.py:304
+msgid ""
+"There is a session for the whole entity (i.e. all devices of the entity),"
+" not a directed one. Please use bare jid if you want to stop the whole "
+"encryption with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:312
+msgid "There is no directed session with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:327
+msgid "encryption session stopped with entity {entity}"
+msgstr ""
+
+#: sat/memory/encryption.py:335
+msgid ""
+"Encryption session finished: your messages with {destinee} are NOT end to"
+" end encrypted anymore.\n"
+"Your server administrators or {destinee} server administrators will be "
+"able to read them."
+msgstr ""
+
+#: sat/memory/encryption.py:389 sat/memory/encryption.py:397
+#: sat/memory/encryption.py:404
+msgid "Encryption"
+msgstr ""
+
+#: sat/memory/encryption.py:389
+msgid "unencrypted (plain text)"
+msgstr ""
+
+#: sat/memory/encryption.py:392
+msgid "End encrypted session"
+msgstr ""
+
+#: sat/memory/encryption.py:400
+msgid "Start {name} session"
+msgstr ""
+
+#: sat/memory/encryption.py:404
+msgid "⛨ {name} trust"
+msgstr ""
+
+#: sat/memory/encryption.py:407
+msgid "Manage {name} trust"
+msgstr ""
+
+#: sat/memory/encryption.py:470
+msgid "Starting e2e session with {peer_jid} as we receive encrypted messages"
+msgstr ""
+
+#: sat/memory/memory.py:230
 msgid "Memory manager init"
 msgstr ""
 
-#: src/memory/memory.py:244
+#: sat/memory/memory.py:249
 msgid "Loading default params template"
 msgstr ""
 
-#: src/memory/memory.py:276
+#: sat/memory/memory.py:281
 #, python-format
 msgid "Parameters loaded from file: %s"
 msgstr ""
 
-#: src/memory/memory.py:279
+#: sat/memory/memory.py:284
 #, python-format
 msgid "Can't load parameters from file: %s"
 msgstr ""
 
-#: src/memory/memory.py:294
+#: sat/memory/memory.py:299
 #, python-format
 msgid "Parameters saved to file: %s"
 msgstr ""
 
-#: src/memory/memory.py:297
+#: sat/memory/memory.py:302
 #, python-format
 msgid "Can't save parameters to file: %s"
 msgstr ""
 
-#: src/memory/memory.py:426
+#: sat/memory/memory.py:404
+msgid "Authentication failure of profile {profile}"
+msgstr ""
+
+#: sat/memory/memory.py:431
 #, python-format
 msgid "[%s] Profile session purge"
 msgstr ""
 
-#: src/memory/memory.py:431
+#: sat/memory/memory.py:437
 #, python-format
 msgid "Trying to purge roster status cache for a profile not in memory: [%s]"
 msgstr ""
 
-#: src/memory/memory.py:441
+#: sat/memory/memory.py:451
 msgid "requesting no profiles at all"
 msgstr ""
 
-#: src/memory/memory.py:496
-#, python-brace-format
+#: sat/memory/memory.py:508
 msgid "Can't find component {component} entry point"
 msgstr ""
 
-#: src/memory/memory.py:740
-msgid "Trying to get entity data for a non-existant profile"
-msgstr ""
-
-#: src/memory/memory.py:929
+#: sat/memory/memory.py:996
 msgid "Need a bare jid to delete all resources"
 msgstr ""
 
-#: src/memory/memory.py:954
+#: sat/memory/memory.py:1028
 #, python-format
 msgid "Trying to encrypt a value for %s while the personal key is undefined!"
 msgstr ""
 
-#: src/memory/memory.py:969
+#: sat/memory/memory.py:1048
 #, python-format
 msgid "Trying to decrypt a value for %s while the personal key is undefined!"
 msgstr ""
 
-#: src/memory/memory.py:992
+#: sat/memory/memory.py:1069
 #, python-format
 msgid "Personal data (%(ns)s, %(key)s) has been successfuly encrypted"
 msgstr ""
 
-#: src/memory/memory.py:1019
+#: sat/memory/memory.py:1097
 msgid "Asking waiting subscriptions for a non-existant profile"
 msgstr ""
 
-#: src/memory/params.py:82
+#: sat/memory/memory.py:1218
+msgid "invalid permission"
+msgstr ""
+
+#: sat/memory/memory.py:1249
+msgid "unknown access type: {type}"
+msgstr ""
+
+#: sat/memory/memory.py:1284
+msgid "You can't use path and parent at the same time"
+msgstr ""
+
+#: sat/memory/memory.py:1288
+msgid "\"..\" or \".\" can't be used in path"
+msgstr ""
+
+#: sat/memory/memory.py:1307
+msgid "Several directories found, this should not happen"
+msgstr ""
+
+#: sat/memory/memory.py:1766
+msgid "Can't delete directory, it is not empty"
+msgstr ""
+
+#: sat/memory/memory.py:1778
+msgid "deleting file {name} with hash {file_hash}"
+msgstr ""
+
+#: sat/memory/memory.py:1787
+msgid "no reference left to {file_path}, deleting"
+msgstr ""
+
+#: sat/memory/params.py:85 sat_frontends/primitivus/base.py:533
+msgid "General"
+msgstr ""
+
+#: sat/memory/params.py:86
 msgid "Connection"
 msgstr ""
 
-#: src/memory/params.py:84
+#: sat/memory/params.py:88
 msgid "Chat history limit"
 msgstr ""
 
-#: src/memory/params.py:86
+#: sat/memory/params.py:90
 msgid "Show offline contacts"
 msgstr ""
 
-#: src/memory/params.py:88
+#: sat/memory/params.py:92
 msgid "Show empty groups"
 msgstr ""
 
-#: src/memory/params.py:91 src/plugins/plugin_misc_register_account.py:74
-msgid "Register new account"
-msgstr ""
-
-#: src/memory/params.py:92
+#: sat/memory/params.py:95
+msgid "Connect on backend startup"
+msgstr ""
+
+#: sat/memory/params.py:96
 msgid "Connect on frontend startup"
 msgstr ""
 
-#: src/memory/params.py:93
+#: sat/memory/params.py:97
 msgid "Disconnect on frontend closure"
 msgstr ""
 
-#: src/memory/params.py:154
+#: sat/memory/params.py:98
+msgid "Check certificate (don't uncheck if unsure)"
+msgstr ""
+
+#: sat/memory/params.py:163
 #, python-format
 msgid "Trying to purge cache of a profile not in memory: [%s]"
 msgstr ""
 
-#: src/memory/params.py:178
+#: sat/memory/params.py:188
 msgid "The profile name already exists"
 msgstr ""
 
-#: src/memory/params.py:193
+#: sat/memory/params.py:203
 msgid "Trying to delete an unknown profile"
 msgstr ""
 
-#: src/memory/params.py:199
+#: sat/memory/params.py:209
 msgid "Trying to delete a connected profile"
 msgstr ""
 
-#: src/memory/params.py:217
+#: sat/memory/params.py:228
 msgid "No default profile, returning first one"
 msgstr ""
 
-#: src/memory/params.py:221
+#: sat/memory/params.py:234
 msgid "No profile exist yet"
 msgstr ""
 
-#: src/memory/params.py:229
+#: sat/memory/params.py:244
 #, python-format
 msgid "Trying to access an unknown profile (%s)"
 msgstr ""
 
-#: src/memory/params.py:314
+#: sat/memory/params.py:338
 msgid "Trying to register frontends parameters with no specified app: aborted"
 msgstr ""
 
-#: src/memory/params.py:319
-#, python-format
-msgid "Trying to register twice frontends parameters for %(app)s: aborted"
-msgstr ""
-
-#: src/memory/params.py:330
+#: sat/memory/params.py:347
+#, python-format
+msgid "Trying to register twice frontends parameters for %(app)s: abortedapp"
+msgstr ""
+
+#: sat/memory/params.py:363
 #, python-format
 msgid "Can't determine default value for [%(category)s/%(name)s]: %(reason)s"
 msgstr ""
 
-#: src/memory/params.py:346 src/memory/params.py:478 src/memory/params.py:523
+#: sat/memory/params.py:385 sat/memory/params.py:563 sat/memory/params.py:624
 #, python-format
 msgid "Requested param [%(name)s] in category [%(category)s] doesn't exist !"
 msgstr ""
 
-#: src/memory/params.py:381
+#: sat/memory/params.py:440
 #, python-format
 msgid ""
 "Unset parameter (%(cat)s, %(param)s) of type list will use the default "
 "option '%(value)s'"
 msgstr ""
 
-#: src/memory/params.py:385
+#: sat/memory/params.py:448
 #, python-format
 msgid "Parameter (%(cat)s, %(param)s) of type list has no default option!"
 msgstr ""
 
-#: src/memory/params.py:387
-#, python-format
-msgid ""
-"Parameter (%(cat)s, %(param)s) of type list has more than one default option!"
-msgstr ""
-
-#: src/memory/params.py:444
-msgid "The stored password could not be decrypted!"
-msgstr ""
-
-#: src/memory/params.py:494
+#: sat/memory/params.py:455
+#, python-format
+msgid ""
+"Parameter (%(cat)s, %(param)s) of type list has more than one default "
+"option!"
+msgstr ""
+
+#: sat/memory/params.py:585
 msgid "Requesting a param for an non-existant profile"
 msgstr ""
 
-#: src/memory/params.py:498
+#: sat/memory/params.py:589
 msgid "Requesting synchronous param for not connected profile"
 msgstr ""
 
-#: src/memory/params.py:527
+#: sat/memory/params.py:633
 #, python-format
 msgid ""
 "Trying to get parameter '%(param)s' in category '%(cat)s' without "
-"authorization!!!"
-msgstr ""
-
-#: src/memory/params.py:539
+"authorization!!!param"
+msgstr ""
+
+#: sat/memory/params.py:649
 msgid "Requesting a param for a non-existant profile"
 msgstr ""
 
-#: src/memory/params.py:564 src/memory/params.py:742 src/memory/params.py:759
-msgid "Asking params for inexistant profile"
-msgstr ""
-
-#: src/memory/params.py:817
+#: sat/memory/params.py:962
 msgid "Trying to set parameter for an unknown profile"
 msgstr ""
 
-#: src/memory/params.py:822
+#: sat/memory/params.py:968
 #, python-format
 msgid "Requesting an unknown parameter (%(category)s/%(name)s)"
 msgstr ""
 
-#: src/memory/params.py:827
-#, python-format
-msgid ""
-"Trying to set parameter '%(param)s' in category '%(cat)s' without "
-"authorization!!!"
-msgstr ""
-
-#: src/memory/params.py:839
-#, python-format
-msgid ""
-"Trying to set parameter '%(param)s' in category '%(cat)s' with an non-"
-"integer value"
-msgstr ""
-
-#: src/memory/params.py:851
+#: sat/memory/params.py:974
+msgid ""
+"{profile!r} is trying to set parameter {name!r} in category {category!r} "
+"without authorization!!!"
+msgstr ""
+
+#: sat/memory/params.py:992
+msgid ""
+"Trying to set parameter {name} in category {category} withan non-integer "
+"value"
+msgstr ""
+
+#: sat/memory/params.py:1011
 #, python-format
 msgid "Setting parameter (%(category)s, %(name)s) = %(value)s"
 msgstr ""
 
-#: src/memory/params.py:873
+#: sat/memory/params.py:1043
 msgid "Trying to encrypt a password while the personal key is undefined!"
 msgstr ""
 
-#: src/memory/persistent.py:39
+#: sat/memory/persistent.py:45
 msgid "PersistentDict can't be used before memory initialisation"
 msgstr ""
 
-#: src/memory/sqlite.py:127
+#: sat/memory/persistent.py:175
+msgid "Calling load on LazyPersistentBinaryDict while it's not needed"
+msgstr ""
+
+#: sat/memory/sqlite.py:163
+msgid ""
+"too many db tries, we abandon! Error message: {msg}\n"
+"query was {query}"
+msgstr ""
+
+#: sat/memory/sqlite.py:166
+msgid "exception while running query, retrying ({try_}): {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:188
+msgid ""
+"too many interaction tries, we abandon! Error message: {msg}\n"
+"interaction method was: {interaction}\n"
+"interaction arguments were: {args}"
+msgstr ""
+
+#: sat/memory/sqlite.py:191
+msgid "exception while running interaction, retrying ({try_}): {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:210
 msgid "Connecting database"
 msgstr ""
 
-#: src/memory/sqlite.py:139
-msgid "Can't activate foreign keys"
-msgstr ""
-
-#: src/memory/sqlite.py:142
+#: sat/memory/sqlite.py:223
 msgid "The database is new, creating the tables"
 msgstr ""
 
-#: src/memory/sqlite.py:251
+#: sat/memory/sqlite.py:337
 #, python-format
 msgid "Can't delete profile [%s]"
 msgstr ""
 
-#: src/memory/sqlite.py:269
+#: sat/memory/sqlite.py:354
 #, python-format
 msgid "Profile [%s] deleted"
 msgstr ""
 
-#: src/memory/sqlite.py:285
+#: sat/memory/sqlite.py:370
 msgid "loading general parameters from database"
 msgstr ""
 
-#: src/memory/sqlite.py:300
+#: sat/memory/sqlite.py:385
 msgid "loading individual parameters from database"
 msgstr ""
 
-#: src/memory/sqlite.py:324
-#, python-format
-msgid "Can't set general parameter (%(category)s/%(name)s) in database"
-msgstr ""
-
-#: src/memory/sqlite.py:337
-#, python-format
-msgid ""
-"Can't set individual parameter (%(category)s/%(name)s) for [%(profile)s] in "
-"database"
-msgstr ""
-
-#: src/memory/sqlite.py:350
-#, python-brace-format
-msgid ""
-"Can't save following {key} in history (uid: {uid}, lang:{lang}): {value}"
-msgstr ""
-
-#: src/memory/sqlite.py:360
-#, python-brace-format
-msgid ""
-"Can't save following thread in history (uid: {uid}): thread:{thread}), "
+#: sat/memory/sqlite.py:426
+#, python-format
+msgid "Can't set general parameter (%(category)s/%(name)s) in databasecategory"
+msgstr ""
+
+#: sat/memory/sqlite.py:439
+#, python-format
+msgid ""
+"Can't set individual parameter (%(category)s/%(name)s) for [%(profile)s] "
+"in databasecategory"
+msgstr ""
+
+#: sat/memory/sqlite.py:459
+msgid "Can't save following {key} in history (uid: {uid}, lang:{lang}): {value}"
+msgstr ""
+
+#: sat/memory/sqlite.py:473
+msgid ""
+"Can't save following thread in history (uid: {uid}): thread: {thread}), "
 "parent:{parent}"
 msgstr ""
 
-#: src/memory/sqlite.py:379
-#, python-brace-format
+#: sat/memory/sqlite.py:498
 msgid ""
 "Can't save following message in history: from [{from_jid}] to [{to_jid}] "
 "(uid: {uid})"
 msgstr ""
 
-#: src/memory/sqlite.py:535
-#, python-format
-msgid "loading general private values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:537 src/memory/sqlite.py:555
-#, python-format
-msgid "No data present in database for namespace %s"
-msgstr ""
-
-#: src/memory/sqlite.py:552
-#, python-format
-msgid "loading individual private values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:566
-#, python-format
-msgid ""
-"Can't set general private value (%(key)s) [namespace:%(namespace)s] in "
-"database"
-msgstr ""
-
-#: src/memory/sqlite.py:580
-#, python-format
-msgid ""
-"Can't set individual private value (%(key)s) [namespace: %(namespace)s] for "
-"[%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:592
-#, python-format
-msgid ""
-"Can't delete general private value (%(key)s) [namespace:%(namespace)s] in "
-"database"
-msgstr ""
-
-#: src/memory/sqlite.py:605
-#, python-format
-msgid ""
-"Can't delete individual private value (%(key)s) [namespace: %(namespace)s] "
-"for [%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:621
-#, python-format
-msgid "loading general private binary values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:623 src/memory/sqlite.py:641
-#, python-format
-msgid "No binary data present in database for namespace %s"
-msgstr ""
-
-#: src/memory/sqlite.py:638
-#, python-format
-msgid "loading individual private binary values [namespace: %s] from database"
-msgstr ""
-
-#: src/memory/sqlite.py:652
-#, python-format
-msgid ""
-"Can't set general private binary value (%(key)s) [namespace:%(namespace)s] "
-"in database"
-msgstr ""
-
-#: src/memory/sqlite.py:666
-#, python-format
-msgid ""
-"Can't set individual binary private value (%(key)s) [namespace: "
-"%(namespace)s] for [%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:678
-#, python-format
-msgid ""
-"Can't delete general private binary value (%(key)s) [namespace:"
-"%(namespace)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:691
-#, python-format
-msgid ""
-"Can't delete individual private binary value (%(key)s) [namespace: "
-"%(namespace)s] for [%(profile)s] in database"
-msgstr ""
-
-#: src/memory/sqlite.py:761
-msgid ""
-"Your local schema is up-to-date, but database versions mismatch, fixing it..."
-msgstr ""
-
-#: src/memory/sqlite.py:771
-msgid ""
-"There is a schema mismatch, but as we are on a dev version, database will be "
-"updated"
-msgstr ""
-
-#: src/memory/sqlite.py:775
-msgid ""
-"schema version is up-to-date, but local schema differ from expected current "
-"schema"
-msgstr ""
-
-#: src/memory/sqlite.py:778
-#, python-format
-msgid ""
-"Here are the commands that should fix the situation, use at your own risk "
-"(do a backup before modifying database), you can go to SàT's MUC room at "
-"sat@chat.jabberfr.org for help\n"
+#: sat/memory/sqlite.py:701
+msgid ""
+"Can't {operation} data in database for namespace "
+"{namespace}{and_key}{for_profile}: {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:752
+msgid ""
+"getting {type}{binary} private values from database for namespace "
+"{namespace}{keys}"
+msgstr ""
+
+#: sat/memory/sqlite.py:986
+msgid "Can't save file metadata for [{profile}]: {reason}"
+msgstr ""
+
+#: sat/memory/sqlite.py:1025
+msgid "table not updated, probably due to race condition, trying again ({tries})"
+msgstr ""
+
+#: sat/memory/sqlite.py:1027
+msgid "Can't update file table"
+msgstr ""
+
+#: sat/memory/sqlite.py:1132
+msgid ""
+"Your local schema is up-to-date, but database versions mismatch, fixing "
+"it..."
+msgstr ""
+
+#: sat/memory/sqlite.py:1142
+msgid ""
+"There is a schema mismatch, but as we are on a dev version, database will"
+" be updated"
+msgstr ""
+
+#: sat/memory/sqlite.py:1146
+msgid ""
+"schema version is up-to-date, but local schema differ from expected "
+"current schema"
+msgstr ""
+
+#: sat/memory/sqlite.py:1149
+#, python-format
+msgid ""
+"Here are the commands that should fix the situation, use at your own risk"
+" (do a backup before modifying database), you can go to SàT's MUC room at"
+" sat@chat.jabberfr.org for help\n"
 "### SQL###\n"
 "%s\n"
 "### END SQL ###\n"
 msgstr ""
 
-#: src/memory/sqlite.py:783
-msgid ""
-"Database content needs a specific processing, local database will be updated"
-msgstr ""
-
-#: src/memory/sqlite.py:785
+#: sat/memory/sqlite.py:1153
+msgid ""
+"You database version is higher than the one used in this SàT version, are"
+" you using several version at the same time? We can't run SàT with this "
+"database."
+msgstr ""
+
+#: sat/memory/sqlite.py:1161
+msgid ""
+"Database content needs a specific processing, local database will be "
+"updated"
+msgstr ""
+
+#: sat/memory/sqlite.py:1163
 msgid "Database schema has changed, local database will be updated"
 msgstr ""
 
-#: src/plugins/plugin_adhoc_dbus.py:53
+#: sat/plugins/plugin_adhoc_dbus.py:91
 msgid "Add D-Bus management to Ad-Hoc commands"
 msgstr ""
 
-#: src/plugins/plugin_adhoc_dbus.py:60
+#: sat/plugins/plugin_adhoc_dbus.py:98
 msgid "plugin Ad-Hoc D-Bus initialization"
 msgstr ""
 
-#: src/plugins/plugin_adhoc_dbus.py:169
+#: sat/plugins/plugin_adhoc_dbus.py:127
+msgid "Media Players"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:255
 msgid "Command selection"
 msgstr ""
 
-#: src/plugins/plugin_adhoc_dbus.py:206 src/plugins/plugin_xep_0050.py:439
+#: sat/plugins/plugin_adhoc_dbus.py:298
 msgid "Updated"
 msgstr ""
 
-#: src/plugins/plugin_adhoc_dbus.py:210
+#: sat/plugins/plugin_adhoc_dbus.py:302
 msgid "Command sent"
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dokuwiki.py:52
+#: sat/plugins/plugin_adhoc_dbus.py:367
+msgid "Can't retrieve remote controllers on {device_jid}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:405
+msgid "No media player found."
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:409 sat/plugins/plugin_adhoc_dbus.py:451
+msgid "Media Player Selection"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:414
+msgid "Ignoring MPRIS bus without suffix"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:428
+msgid "missing media_player value"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:431
+msgid ""
+"Media player ad-hoc command trying to use non MPRIS bus. Hack attempt? "
+"Refused bus: {bus_name}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:434
+msgid "Invalid player name."
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:440
+msgid "Can't get D-Bus proxy: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:441
+msgid "Media player is not available anymore"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:460
+msgid "Can't retrieve attribute {name}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import.py:45
+msgid ""
+"Blog import management:\n"
+"This plugin manage the different blog importers which can register to it,"
+" and handle generic importing tasks."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import.py:64
+msgid "plugin Blog Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:58
 msgid "Blog importer for Dokuwiki blog engine."
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dokuwiki.py:55
+#: sat/plugins/plugin_blog_import_dokuwiki.py:61
 msgid "import posts from Dokuwiki blog engine"
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dokuwiki.py:57
+#: sat/plugins/plugin_blog_import_dokuwiki.py:63
 msgid ""
 "This importer handle Dokuwiki blog engine.\n"
 "\n"
@@ -2236,168 +1038,512 @@
 "pointing to http://media.diekulturvermittlung.at.\n"
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dokuwiki.py:341
+#: sat/plugins/plugin_blog_import_dokuwiki.py:351
 msgid "plugin Dokuwiki Import initialization"
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dokuwiki.py:371
-#, python-brace-format
+#: sat/plugins/plugin_blog_import_dokuwiki.py:383
 msgid ""
 "DokuWiki media files will be *downloaded* to {temp_dir} - to finish the "
 "import you have to upload them *manually* to {media_repo}"
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dokuwiki.py:375
-msgid ""
-"DokuWiki media files will be *uploaded* to the XMPP server. Hyperlinks to "
-"these media may not been updated though."
-msgstr ""
-
-#: src/plugins/plugin_blog_import_dokuwiki.py:377
-#, python-brace-format
+#: sat/plugins/plugin_blog_import_dokuwiki.py:389
+msgid ""
+"DokuWiki media files will be *uploaded* to the XMPP server. Hyperlinks to"
+" these media may not been updated though."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:393
 msgid ""
 "DokuWiki media files will *stay* on {location} - some of them may be "
 "protected by DokuWiki ACL and will not be accessible."
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dotclear.py:41
+#: sat/plugins/plugin_blog_import_dotclear.py:42
 msgid "Blog importer for Dotclear blog engine."
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dotclear.py:44
+#: sat/plugins/plugin_blog_import_dotclear.py:45
 msgid "import posts from Dotclear blog engine"
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dotclear.py:46
+#: sat/plugins/plugin_blog_import_dotclear.py:47
 msgid ""
 "This importer handle Dotclear blog engine.\n"
 "\n"
 "To use it, you'll need to export your blog to a flat file.\n"
 "You must go in your admin interface and select Plugins/Maintenance then "
 "Backup.\n"
-"Export only one blog if you have many, i.e. select \"Download database of "
-"current blog\"\n"
-"Depending on your configuration, your may need to use Import/Export plugin "
-"and export as a flat file.\n"
+"Export only one blog if you have many, i.e. select \"Download database of"
+" current blog\"\n"
+"Depending on your configuration, your may need to use Import/Export "
+"plugin and export as a flat file.\n"
 "\n"
 "location: you must use the absolute path to your backup for the location "
 "parameter\n"
 msgstr ""
 
-#: src/plugins/plugin_blog_import_dotclear.py:242
+#: sat/plugins/plugin_blog_import_dotclear.py:266
 msgid "plugin Dotclear Import initialization"
 msgstr ""
 
-#: src/plugins/plugin_blog_import.py:44
-msgid ""
-"Blog import management:\n"
-"This plugin manage the different blog importers which can register to it, "
-"and handler generic importing tasks."
-msgstr ""
-
-#: src/plugins/plugin_blog_import.py:62
-msgid "plugin Blog Import initialization"
-msgstr ""
-
-#: src/plugins/plugin_comp_ep_test.py:36 src/plugins/plugin_exp_parrot.py:38
-msgid "Implementation of parrot mode (repeat messages between 2 entities)"
-msgstr ""
-
-#: src/plugins/plugin_comp_ep_test.py:44
-msgid "Plugin Test initialization"
-msgstr ""
-
-#: src/plugins/plugin_exp_command_export.py:38
+#: sat/plugins/plugin_comp_file_sharing.py:69
+msgid "Component hosting and sharing files"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:79
+msgid ""
+"You are over quota, your maximum allowed size is {quota} and you are "
+"already using {used_space}, you can't upload {file_size} more."
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:350
+msgid "File Sharing initialization"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:431
+#: sat/plugins/plugin_comp_file_sharing_management.py:422
+msgid "Can't create thumbnail: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:454
+msgid "Reusing already generated hash"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:485
+msgid "Can't get thumbnail for {final_path}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:574
+msgid "{peer_jid} is trying to access an unauthorized file: {name}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:582
+msgid "no matching file found ({file_data})"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:43
+msgid ""
+"Experimental handling of file management for file sharing. This plugins "
+"allows to change permissions of stored files/directories or remove them."
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:72
+msgid "File Sharing Management plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:185
+msgid "file not found"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:187
+#: sat/plugins/plugin_comp_file_sharing_management.py:192
+#: sat/plugins/plugin_comp_file_sharing_management.py:474
+msgid "forbidden"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:191
+msgid "Only owner can manage files"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:258
+msgid "Please select permissions for this directory"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:260
+msgid "Please select permissions for this file"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:305
+msgid "Can't use read_allowed values: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:332
+msgid "management session done"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:358
+msgid ""
+"Are you sure to delete directory {name} and all files and directories "
+"under it?"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:362
+msgid "Are you sure to delete file {name}?"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:387
+msgid "file deleted"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:465
+msgid "thumbnails generated"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:481
+msgid "You are currently using {size_used} on {size_quota}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:484
+msgid "unlimited quota"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:39
+msgid "Debug plugin to have a telnet server"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:53
+msgid ""
+"/!\\ Manhole debug server activated, be sure to not use it in production,"
+" this is dangerous /!\\"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:55
+msgid "You can connect to manhole server using telnet on port {port}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_command_export.py:39
 msgid "Implementation of command export"
 msgstr ""
 
-#: src/plugins/plugin_exp_command_export.py:89
+#: sat/plugins/plugin_exp_command_export.py:92
 msgid "Plugin command export initialization"
 msgstr ""
 
-#: src/plugins/plugin_exp_lang_detect.py:42
+#: sat/plugins/plugin_exp_events.py:50
+msgid "Experimental implementation of XMPP events management"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:60
+msgid "Event plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:177
+msgid "no src found for image"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:187
+msgid "no {uri_type} element found!"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:189
+msgid "incomplete {uri_type} element"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:191
+msgid "bad {uri_type} element"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:231
+msgid "No event element has been found"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:233
+msgid "No event with this id has been found"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:290
+msgid "event_id must be set"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:333
+msgid "The given URI is not valid: {uri}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:354
+#: sat/plugins/plugin_exp_list_of_interest.py:100
+msgid "requested node already exists"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:373
+msgid "missing node"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:426
+msgid "No event found in item {item_id}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:519
+msgid "no data found for {item_id} (service: {service}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:542 sat/plugins/plugin_exp_events.py:623
+msgid "\"XEP-0277\" (blog) plugin is needed for this feature"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:548
+msgid "got event data"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:579
+msgid "affiliation set on blog and comments nodes"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:619
+msgid "\"Invitations\" plugin is needed for this feature"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:632
+msgid "invitation created"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:44
+msgid "Experimental handling of invitations"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:57
+msgid "Invitation plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:251
+msgid "Can't get item linked with invitation: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:256
+msgid "Invitation was linking to a non existing item"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:262
+msgid "Can't retrieve namespace of invitation: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:281
+msgid "Bad invitation, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:321
+msgid "No handler for namespace \"{namespace}\", invitation ignored"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:39
+msgid "Experimental handling of invitations for file sharing"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:46
+msgid "File Sharing Invitation plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:85
+#: sat/plugins/plugin_exp_invitation_file.py:92
+msgid "file sharing"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:87
+msgid "photo album"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:93
+msgid ""
+"{profile} has received an invitation for a files repository "
+"({type_human}) with namespace {sharing_ns!r} at path [{path}]"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_pubsub.py:42
+msgid "Invitations for pubsub based features"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_pubsub.py:49
+msgid "Pubsub Invitation plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:52
+msgid "Jingle Stream plugin"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:55
+msgid "{peer} wants to send you a stream, do you accept ?"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:56
+msgid "Stream Request"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:123
+msgid "stream can't be used with multiple consumers"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:170
+msgid "No client connected, can't send data"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:180
+msgid "Plugin Stream initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:270
+msgid "given port is invalid"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:45
 msgid "Detect and set message language when unknown"
 msgstr ""
 
-#: src/plugins/plugin_exp_lang_detect.py:45
-#: src/plugins/plugin_misc_watched.py:40 src/plugins/plugin_xep_0249.py:73
+#: sat/plugins/plugin_exp_lang_detect.py:48
+#: sat/plugins/plugin_misc_watched.py:43 sat/plugins/plugin_xep_0249.py:73
 msgid "Misc"
 msgstr ""
 
-#: src/plugins/plugin_exp_lang_detect.py:47
+#: sat/plugins/plugin_exp_lang_detect.py:50
 msgid "language detection"
 msgstr ""
 
-#: src/plugins/plugin_exp_lang_detect.py:65
+#: sat/plugins/plugin_exp_lang_detect.py:66
 msgid "Language detection plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_exp_parrot.py:51
+#: sat/plugins/plugin_exp_list_of_interest.py:46
+msgid "Experimental handling of interesting XMPP locations"
+msgstr ""
+
+#: sat/plugins/plugin_exp_list_of_interest.py:56
+msgid "List of Interest plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_list_of_interest.py:287
+msgid "Missing interest element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_parrot.py:40
+msgid "Implementation of parrot mode (repeat messages between 2 entities)"
+msgstr ""
+
+#: sat/plugins/plugin_exp_parrot.py:56
 msgid "Plugin Parrot initialization"
 msgstr ""
 
-#: src/plugins/plugin_exp_parrot.py:58 src/plugins/plugin_xep_0045.py:99
-#: src/plugins/plugin_xep_0048.py:73 src/plugins/plugin_xep_0092.py:54
-#: src/plugins/plugin_xep_0249.py:89
+#: sat/plugins/plugin_exp_parrot.py:63 sat/plugins/plugin_xep_0045.py:150
+#: sat/plugins/plugin_xep_0048.py:102 sat/plugins/plugin_xep_0092.py:61
+#: sat/plugins/plugin_xep_0199.py:56 sat/plugins/plugin_xep_0249.py:95
+#: sat/plugins/plugin_xep_0384.py:476
 msgid "Text commands not available"
 msgstr ""
 
-#: src/plugins/plugin_exp_pipe.py:40
-msgid "Jingle Pipe Transfer experimental plugin"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:43
-#, python-brace-format
-msgid "{peer} wants to send you a pipe stream, do you accept ?"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:44
-msgid "Pipe stream"
-msgstr ""
-
-#: src/plugins/plugin_exp_pipe.py:50
-msgid "Plugin Pipe initialization"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:48
-msgid "SàT account creation"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:105
-msgid "Prosody command succeed"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:108
-#, python-format
-msgid "Can't complete Prosody command (error code: %(code)d): %(message)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:135
-msgid "Plugin Account initialization"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:145
-#, python-format
-msgid "Can't find %s"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:148
-#, python-format
-msgid "Prosody path found: %s"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:314
-msgid "New Libervia account created"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:326
-#, python-brace-format
+#: sat/plugins/plugin_exp_pubsub_admin.py:40
+msgid ""
+"\\Implementation of Pubsub Administrator\n"
+"This allows a pubsub administrator to overwrite completly items, "
+"including publisher.\n"
+"Specially useful when importing a node."
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:40
+msgid "Experimental plugin to launch on action on Pubsub notifications"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:56
+msgid "PubSub Hook initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:93
+msgid "node manager already set for {node}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:101
+msgid "node manager installed on {node}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:107
+msgid "trying to remove a {node} without hook"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:112
+msgid "hook removed"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:114
+msgid "node still needed for an other hook"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:119
+msgid "{hook_type} is not handled"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:123
+#: sat/plugins/plugin_exp_pubsub_hook.py:167
+msgid "{hook_type} hook type not implemented yet"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:139
+msgid "{persistent} hook installed on {node} for {profile}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:140
+msgid "persistent"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:140
+msgid "temporary"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:173
+msgid "Can't load Pubsub hook at node {node}, it will be removed: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:185
+msgid "Error while running Pubsub hook for node {node}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:41
+msgid "Generic import plugin, base for specialized importers"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:49
+msgid "plugin Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:67
+msgid "initializing {name} import handler"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:158
+msgid "invalid json option: {option}"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:296
+msgid "uploading subitems"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:327
+msgid "An {handler_name} importer with the name {name} already exist"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:37
+msgid "Merge request handler for Mercurial"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:40
+msgid "handle Mercurial repository"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:71
+msgid "Mercurial merge request handler initialization"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:75
+msgid "Mercurial executable (hg) not found, can't use Mercurial handler"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:116
+msgid "invalid changeset signature"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:136
+msgid "unexpected time data: {data}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:50
+msgid "Libervia account creation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:75
 msgid ""
 "Welcome to Libervia, the web interface of Salut à Toi.\n"
 "\n"
-"Your account on {domain} has been successfully created. This is a "
-"demonstration version to show you the current status of the project. It is "
-"still under development, please keep it in mind!\n"
+"Your account on {domain} has been successfully created.\n"
+"This is a demonstration version to show you the current status of the "
+"project.\n"
+"It is still under development, please keep it in mind!\n"
 "\n"
 "Here is your connection information:\n"
 "\n"
@@ -2405,232 +1551,430 @@
 "Jabber ID (JID): {jid}\n"
 "Your password has been chosen by yourself during registration.\n"
 "\n"
-"In the beginning, you have nobody to talk to. To find some contacts, you may "
-"use the users' directory:\n"
+"In the beginning, you have nobody to talk to. To find some contacts, you "
+"may use the users' directory:\n"
 "    - make yourself visible in \"Service / Directory subscription\".\n"
 "    - search for people with \"Contacts\" / Search directory\".\n"
 "\n"
 "Any feedback welcome. Thank you!\n"
 "\n"
 "Salut à Toi association\n"
-"http://www.salut-a-toi.org\n"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:346
-msgid "Libervia account created"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:372
+"https://www.salut-a-toi.org\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:109
+msgid "Plugin Account initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:294
+msgid "Failed to send account creation confirmation to {email}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:313
+msgid "New Libervia account created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:339
+msgid "Your Libervia account has been created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:363
+msgid "xmpp_domain needs to be set in sat.conf. Using \"{default}\" meanwhile"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:379
 msgid "Manage your account"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:375
+#: sat/plugins/plugin_misc_account.py:385
 msgid "Change your password"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:376
+#: sat/plugins/plugin_misc_account.py:387
 msgid "Current profile password"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:378
+#: sat/plugins/plugin_misc_account.py:389
 msgid "New password"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:380
+#: sat/plugins/plugin_misc_account.py:391
 msgid "New password (again)"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:418 src/stdui/ui_profile_manager.py:62
+#: sat/plugins/plugin_misc_account.py:431 sat/stdui/ui_profile_manager.py:73
 msgid "The provided profile password doesn't match."
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:419
+#: sat/plugins/plugin_misc_account.py:432
 msgid "Attempt failure"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:462
+#: sat/plugins/plugin_misc_account.py:477
 msgid "The values entered for the new password are not equal."
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:474
+#: sat/plugins/plugin_misc_account.py:495
 msgid "Change your password?"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:475
+#: sat/plugins/plugin_misc_account.py:500
 msgid ""
 "Note for advanced users: this will actually change both your SàT profile "
 "password AND your XMPP account password."
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:476
+#: sat/plugins/plugin_misc_account.py:504
 msgid "Continue with changing the password?"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:490
-#: src/plugins/plugin_misc_register_account.py:108
+#: sat/plugins/plugin_misc_account.py:528
+#: sat/plugins/plugin_misc_register_account.py:133
 msgid "Confirmation"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:491
+#: sat/plugins/plugin_misc_account.py:529
 msgid "Your password has been changed."
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:496
+#: sat/plugins/plugin_misc_account.py:533
+#: sat/plugins/plugin_misc_account.py:606
+#: sat/plugins/plugin_misc_account.py:716 sat_frontends/primitivus/base.py:790
+#: sat_frontends/primitivus/base.py:831
+#: sat_frontends/quick_frontend/quick_profile_manager.py:133
+msgid "Error"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:535
 #, python-format
 msgid "Your password could not be changed: %s"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:507
+#: sat/plugins/plugin_misc_account.py:548
 msgid "Delete your account?"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:508
+#: sat/plugins/plugin_misc_account.py:551
 msgid ""
 "If you confirm this dialog, you will be disconnected and then your XMPP "
 "account AND your SàT profile will both be DELETED."
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:509
+#: sat/plugins/plugin_misc_account.py:555
+msgid "contact list, messages history, blog posts and commentsGROUPBLOG"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:558
 msgid "contact list and messages history"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:509
-msgid "contact list, messages history, blog posts and comments"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:510
-#, python-format
-msgid ""
-"All your data stored on %(server)s, including your %(target)s will be erased."
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:511
-#: src/plugins/plugin_misc_account.py:558
-#: src/plugins/plugin_misc_account.py:562
-#: src/plugins/plugin_misc_account.py:566
-msgid ""
-"There is no other confirmation dialog, this is the very last one! Are you "
-"sure?"
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:539
+#: sat/plugins/plugin_misc_account.py:561
+#, python-format
+msgid ""
+"All your data stored on %(server)s, including your %(target)s will be "
+"erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:567
+#: sat/plugins/plugin_misc_account.py:642
+#: sat/plugins/plugin_misc_account.py:658
+#: sat/plugins/plugin_misc_account.py:674
+msgid ""
+"There is no other confirmation dialog, this is the very last one! Are you"
+" sure?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:608
 #, python-format
 msgid "Your XMPP account could not be deleted: %s"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:555
+#: sat/plugins/plugin_misc_account.py:628
 msgid "Delete all your (micro-)blog posts and comments?"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:556
-msgid ""
-"If you confirm this dialog, all the (micro-)blog data you submitted will be "
-"erased."
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:557
-msgid ""
-"These are the public and private posts and comments you sent to any group."
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:560
+#: sat/plugins/plugin_misc_account.py:632
+msgid ""
+"If you confirm this dialog, all the (micro-)blog data you submitted will "
+"be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:637
+msgid "These are the public and private posts and comments you sent to any group."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:649
 msgid "Delete all your (micro-)blog posts?"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:561
-msgid ""
-"If you confirm this dialog, all the public and private posts you sent to any "
-"group will be erased."
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:564
+#: sat/plugins/plugin_misc_account.py:653
+msgid ""
+"If you confirm this dialog, all the public and private posts you sent to "
+"any group will be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:665
 msgid "Delete all your (micro-)blog comments?"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:565
-msgid ""
-"If you confirm this dialog, all the public and private comments you made on "
-"other people's posts will be erased."
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:578
+#: sat/plugins/plugin_misc_account.py:669
+msgid ""
+"If you confirm this dialog, all the public and private comments you made "
+"on other people's posts will be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:689
 msgid "blog posts and comments"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:581
+#: sat/plugins/plugin_misc_account.py:694
 msgid "blog posts"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:584
+#: sat/plugins/plugin_misc_account.py:699
 msgid "comments"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:588
+#: sat/plugins/plugin_misc_account.py:705
 msgid "Deletion confirmation"
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:590
+#: sat/plugins/plugin_misc_account.py:707
 #, python-format
 msgid "Your %(target)s have been deleted."
 msgstr ""
 
-#: src/plugins/plugin_misc_account.py:591
-msgid ""
-"Known issue of the demo version: you need to refresh the page to make the "
-"deleted posts actually disappear."
-msgstr ""
-
-#: src/plugins/plugin_misc_account.py:596
+#: sat/plugins/plugin_misc_account.py:709
+msgid ""
+"Known issue of the demo version: you need to refresh the page to make the"
+" deleted posts actually disappear."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:718
 #, python-format
 msgid "Your %(target)s could not be deleted: %(message)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_android.py:35
+#: sat/plugins/plugin_misc_android.py:50
 msgid "Manage Android platform specificities, like pause or notifications"
 msgstr ""
 
-#: src/plugins/plugin_misc_android.py:45
+#: sat/plugins/plugin_misc_android.py:92
+msgid "sound on notifications"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:94
+msgid "Normal"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:95 sat/plugins/plugin_misc_android.py:103
+msgid "Never"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:99
 msgid "Vibrate on notifications"
 msgstr ""
 
-#: src/plugins/plugin_misc_android.py:65
+#: sat/plugins/plugin_misc_android.py:101
+msgid "Always"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:102
+msgid "In vibrate mode"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:243
 msgid "plugin Android initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_debug.py:34
+#: sat/plugins/plugin_misc_android.py:362
+msgid "new message from {contact}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:64
+msgid ""
+"Applications Manager\n"
+"\n"
+"Manage external applications using packagers, OS "
+"virtualization/containers or other\n"
+"software management tools.\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:80
+msgid "plugin Applications Manager initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:166
+msgid ""
+"No value found for \"public_url\", using \"example.org\" for now, please "
+"set the proper value in libervia.conf"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:170
+msgid ""
+"invalid value for \"public_url\" ({value}), it musts not start with "
+"schema (\"http\"), ignoring it and using \"example.org\" instead"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:43
+msgid "Attachments handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:53
+msgid "plugin Attach initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:109
+msgid "Can't resize attachment of unknown type: {attachment}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:125
+msgid "Attachment {path!r} has been resized at {new_path!r}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:129
+msgid "Can't resize attachment of type {main_type!r}: {attachment}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:143
+msgid "No plugin can handle attachment with {destinee}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:210
+msgid "certificate check disabled for upload, this is dangerous!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_debug.py:35
 msgid "Set of method to make development and debugging easier"
 msgstr ""
 
-#: src/plugins/plugin_misc_debug.py:41
+#: sat/plugins/plugin_misc_debug.py:41
 msgid "Plugin Debug initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_extra_pep.py:37
+#: sat/plugins/plugin_misc_download.py:43
+msgid "File download management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:50
+msgid "plugin Download initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:95
+msgid "Can't download file: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:99 sat_frontends/jp/cmd_file.py:498
+msgid "Can't download file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:176
+msgid "certificate check disabled for download, this is dangerous!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:187
+msgid "Can't download URI {uri}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:44
+msgid "invitation of people without XMPP account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:59
+msgid "You have been invited by {host_name} to {app_name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:60
+msgid ""
+"Hello {name}!\n"
+"\n"
+"You have received an invitation from {host_name} to participate to "
+"\"{app_name}\".\n"
+"To join, you just have to click on the following URL:\n"
+"{url}\n"
+"\n"
+"Please note that this URL should not be shared with anybody!\n"
+"If you want more details on {app_name}, you can check {app_url}.\n"
+"\n"
+"Welcome!\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:76
+msgid "plugin Invitations initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:105
+msgid "You can't use following key(s) in extra, they are reserved: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:198
+msgid "You can't use following key(s) in both args and extra: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:207
+msgid "You need to provide a main email address before using emails_extra"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:213
+msgid "You need to provide url_template if you use default message body"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:216
+msgid "creating an invitation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:237
+msgid "You need to specify xmpp_domain in sat.conf"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:251
+msgid "Can't create XMPP account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:254
+msgid "requested jid already exists, trying with {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:265
+msgid "account {jid_} created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:317
+msgid "somebody"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:345
+msgid "Not all arguments have been consumed: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:443
+msgid "Skipping reserved key {key}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_extra_pep.py:38
 msgid "Display messages from extra PEP services"
 msgstr ""
 
-#: src/plugins/plugin_misc_extra_pep.py:68
+#: sat/plugins/plugin_misc_extra_pep.py:69
 msgid "Plugin Extra PEP initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:39
+#: sat/plugins/plugin_misc_file.py:45
 msgid ""
 "File Tansfer Management:\n"
-"This plugin manage the various ways of sending a file, and choose the best "
-"one."
-msgstr ""
-
-#: src/plugins/plugin_misc_file.py:44
-#, python-brace-format
+"This plugin manage the various ways of sending a file, and choose the "
+"best one."
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:52
 msgid "Please select a file to send to {peer}"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:45
+#: sat/plugins/plugin_misc_file.py:53
 msgid "File sending"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:46
-#, python-brace-format
+#: sat/plugins/plugin_misc_file.py:54
 msgid ""
 "{peer} wants to send the file \"{name}\" to you:\n"
 "{desc}\n"
@@ -2640,421 +1984,599 @@
 "Do you accept ?"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:47
+#: sat/plugins/plugin_misc_file.py:58
 msgid "Confirm file transfer"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:48
+#: sat/plugins/plugin_misc_file.py:59
 msgid "File {} already exists, are you sure you want to overwrite ?"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:49
+#: sat/plugins/plugin_misc_file.py:60
 msgid "File exists"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:194
+#: sat/plugins/plugin_misc_file.py:70
 msgid "plugin File initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:198
+#: sat/plugins/plugin_misc_file.py:82
 msgid "Action"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:198
+#: sat/plugins/plugin_misc_file.py:82
 msgid "send file"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:198
+#: sat/plugins/plugin_misc_file.py:85
 msgid "Send a file"
 msgstr ""
 
-#: src/plugins/plugin_misc_file.py:244 src/plugins/plugin_xep_0100.py:77
+#: sat/plugins/plugin_misc_file.py:121
+msgid "{name} method will be used to send the file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:132
+msgid "Can't send {filepath} to {peer_jid} with {method_name}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:166 sat/plugins/plugin_xep_0100.py:101
 msgid "Invalid JID"
 msgstr ""
 
-#: src/plugins/plugin_misc_groupblog.py:51
+#: sat/plugins/plugin_misc_forums.py:36
+msgid "forums management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:43
+msgid "forums management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:54
+msgid "forums plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:97
+msgid "forums arguments must be a list of forums"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:109
+msgid "A forum item must be a dictionary"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:114
+msgid "following forum name is not unique: {name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:116
+msgid "creating missing forum node"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:130
+msgid "Unknown forum attribute: {key}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:136
+msgid "forum need a title or a name"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:138
+msgid "forum need uri or sub-forums"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:154
+msgid "missing <forums> element"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:160
+msgid "Unexpected element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:168
+msgid "Following attributes are unknown: {unknown}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:176
+msgid "invalid forum, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:180
+msgid "unkown forums sub element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:53
 msgid "Implementation of microblogging fine permissions"
 msgstr ""
 
-#: src/plugins/plugin_misc_groupblog.py:59
+#: sat/plugins/plugin_misc_groupblog.py:61
 msgid "Group blog plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_groupblog.py:77
-msgid ""
-"Server is not able to manage item-access pubsub, we can't use group blog"
-msgstr ""
-
-#: src/plugins/plugin_misc_groupblog.py:80
+#: sat/plugins/plugin_misc_groupblog.py:80
+msgid "Server is not able to manage item-access pubsub, we can't use group blog"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:86
 msgid "Server can manage group blogs"
 msgstr ""
 
-#: src/plugins/plugin_misc_imap.py:44
-msgid ""
-"Create an Imap server that you can use to read your \"normal\" type messages"
-msgstr ""
-
-#: src/plugins/plugin_misc_imap.py:62
-msgid "Plugin Imap Server initialization"
-msgstr ""
-
-#: src/plugins/plugin_misc_imap.py:69
-#, python-format
-msgid "Launching IMAP server on port %d"
-msgstr ""
-
-#: src/plugins/plugin_misc_imap.py:437
-msgid "IMAP server connection started"
-msgstr ""
-
-#: src/plugins/plugin_misc_imap.py:440
-#, python-format
-msgid "IMAP server connection lost (reason: %s)"
-msgstr ""
-
-#: src/plugins/plugin_misc_ip.py:52
+#: sat/plugins/plugin_misc_identity.py:49
+msgid "Identity manager"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:58
+msgid "Plugin Identity initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:293
+#: sat/plugins/plugin_misc_identity.py:365
+msgid "No callback registered for {metadata_name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:316
+msgid "Error while trying to get {metadata_name} with {callback}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:376
+msgid "Error while trying to set {metadata_name} with {callback}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:691
+msgid "Can't set metadata {metadata_name!r}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:57
 msgid "This plugin help to discover our external IP address."
 msgstr ""
 
-#: src/plugins/plugin_misc_ip.py:57
+#: sat/plugins/plugin_misc_ip.py:64
 msgid "Allow external get IP"
 msgstr ""
 
-#: src/plugins/plugin_misc_ip.py:60
+#: sat/plugins/plugin_misc_ip.py:67
 msgid "Confirm external site request"
 msgstr ""
 
-#: src/plugins/plugin_misc_ip.py:61
-#, python-brace-format
+#: sat/plugins/plugin_misc_ip.py:68
 msgid ""
 "To facilitate data transfer, we need to contact a website.\n"
 "A request will be done on {page}\n"
 "That means that administrators of {domain} can know that you use "
 "\"{app_name}\" and your IP Address.\n"
 "\n"
-"IP address is an identifier to locate you on Internet (similar to a phone "
-"number).\n"
+"IP address is an identifier to locate you on Internet (similar to a phone"
+" number).\n"
 "\n"
 "Do you agree to do this request ?\n"
 msgstr ""
 
-#: src/plugins/plugin_misc_ip.py:90
+#: sat/plugins/plugin_misc_ip.py:100
 msgid "plugin IP discovery initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_maildir.py:42
-msgid "Intercept \"normal\" type messages, and put them in a Maildir type box"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:46
-msgid "Mail Server"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:47
-msgid "Block \"normal\" messages propagation"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:71
-msgid "Plugin Maildir initialization"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:141
-msgid "Trying to remove an mailboxUser not referenced"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:142
-#: src/plugins/plugin_misc_maildir.py:161
-#: src/plugins/plugin_misc_maildir.py:300
-#: src/plugins/plugin_misc_maildir.py:304
-#: src/plugins/plugin_misc_maildir.py:308
-msgid "INTERNAL ERROR: "
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:160
-msgid "Boxname doesn't exist in internal data"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:299
-msgid "Trying to remove an observer for an inexistant mailbox"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:303
-msgid "Trying to remove an inexistant observer, no observer for this signal"
-msgstr ""
-
-#: src/plugins/plugin_misc_maildir.py:307
-msgid "Trying to remove an inexistant observer"
-msgstr ""
-
-#: src/plugins/plugin_misc_nat-port.py:42
+#: sat/plugins/plugin_misc_lists.py:39
+msgid "Pubsub Lists"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:47
+msgid "Pubsub lists management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:52
+msgid "TODO List"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:63 sat/plugins/plugin_misc_lists.py:113
+#: sat/plugins/plugin_misc_lists.py:156
+msgid "status"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:67
+msgid "to do"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:71
+msgid "in progress"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:75
+msgid "done"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:83 sat/plugins/plugin_misc_lists.py:180
+msgid "priority"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:87 sat/plugins/plugin_misc_lists.py:184
+msgid "major"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:91 sat/plugins/plugin_misc_lists.py:188
+msgid "normal"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:95 sat/plugins/plugin_misc_lists.py:192
+msgid "minor"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:106
+msgid "Grocery List"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:109 sat_frontends/jp/cmd_info.py:69
+#: sat_frontends/jp/cmd_info.py:111
+msgid "name"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:110
+msgid "quantity"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:117
+msgid "to buy"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:121
+msgid "bought"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:130
+msgid "Tickets"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:140 sat_frontends/jp/cmd_info.py:69
+msgid "type"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:144
+msgid "bug"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:148
+msgid "feature request"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:160
+msgid "queued"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:164
+msgid "started"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:168
+msgid "review"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:172
+msgid "closed"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:208
+msgid "Pubsub lists plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:35
+msgid "Merge requests management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:42
+msgid "Merge requests management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:69
+msgid "Merge requests plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:121
+msgid "a handler with name {name} already exists!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:134
+msgid ""
+"merge requests of type {type} are already handled by {old_handler}, "
+"ignoring {new_handler}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:241
+msgid "repository must be specified"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:244
+msgid "{field} is set by backend, you must not set it in frontend"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:253
+msgid "{name} handler will be used"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:256
+msgid "repository {path} can't be handled by any installed handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:259
+msgid "no handler for this repository has been found"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:265
+msgid "No handler of this name found"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:269
+msgid "export data is empty, do you have any change to send?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:312
+msgid "No handler can handle data type \"{type}\""
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:348
+msgid "No handler found to import {data_type}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:350
+msgid "Importing patch [{item_id}] using {name} handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:45
 msgid "Automatic NAT port mapping using UPnP"
 msgstr ""
 
-#: src/plugins/plugin_misc_nat-port.py:57
+#: sat/plugins/plugin_misc_nat_port.py:62
 msgid "plugin NAT Port initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_quiz.py:41
+#: sat/plugins/plugin_misc_nat_port.py:177
+msgid "addportmapping error: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:215
+msgid "error while trying to map ports: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:42
 msgid "Implementation of Quiz game"
 msgstr ""
 
-#: src/plugins/plugin_misc_quiz.py:53
+#: sat/plugins/plugin_misc_quiz.py:55
 msgid "Plugin Quiz initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_quiz.py:253
-msgid ""
-"Bienvenue dans cette partie rapide de quizz, le premier à atteindre le score "
-"de 9 remporte le jeu\n"
+#: sat/plugins/plugin_misc_quiz.py:345
+msgid ""
+"Bienvenue dans cette partie rapide de quizz, le premier à atteindre le "
+"score de 9 remporte le jeu\n"
 "\n"
 "Attention, tu es prêt ?"
 msgstr ""
 
-#: src/plugins/plugin_misc_quiz.py:282 src/plugins/plugin_misc_tarot.py:507
+#: sat/plugins/plugin_misc_quiz.py:380 sat/plugins/plugin_misc_tarot.py:664
 #, python-format
 msgid "Player %(player)s is ready to start [status: %(status)s]"
 msgstr ""
 
-#: src/plugins/plugin_misc_quiz.py:330 src/plugins/plugin_misc_radiocol.py:252
+#: sat/plugins/plugin_misc_quiz.py:456 sat/plugins/plugin_misc_radiocol.py:353
 #, python-format
 msgid "Unmanaged game element: %s"
 msgstr ""
 
-#: src/plugins/plugin_misc_radiocol.py:53
+#: sat/plugins/plugin_misc_radiocol.py:57
 msgid "Implementation of radio collective"
 msgstr ""
 
-#: src/plugins/plugin_misc_radiocol.py:71
+#: sat/plugins/plugin_misc_radiocol.py:76
 msgid "Radio collective initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_radiocol.py:127
+#: sat/plugins/plugin_misc_radiocol.py:180
 msgid ""
 "The uploaded file has been rejected, only Ogg Vorbis and MP3 songs are "
 "accepted."
 msgstr ""
 
-#: src/plugins/plugin_misc_radiocol.py:146
+#: sat/plugins/plugin_misc_radiocol.py:210
 msgid "No more participants in the radiocol: cleaning data"
 msgstr ""
 
-#: src/plugins/plugin_misc_radiocol.py:182
+#: sat/plugins/plugin_misc_radiocol.py:249
 msgid "INTERNAL ERROR: can't find full path of the song to delete"
 msgstr ""
 
-#: src/plugins/plugin_misc_radiocol.py:189
+#: sat/plugins/plugin_misc_radiocol.py:258
 #, python-format
 msgid "INTERNAL ERROR: can't find %s on the file system"
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:42
+#: sat/plugins/plugin_misc_register_account.py:41
 msgid "Register XMPP account"
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:49
+#: sat/plugins/plugin_misc_register_account.py:49
 msgid "Plugin Register Account initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:67
+#: sat/plugins/plugin_misc_register_account.py:76
 msgid "Missing values"
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:68
+#: sat/plugins/plugin_misc_register_account.py:78
 msgid "No user JID or password given: can't register new account."
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:75
-#, python-format
-msgid ""
-"Do you want to register a new XMPP account [%(user)s] on server %(server)s ?"
-msgstr ""
-
-#: src/plugins/plugin_misc_register_account.py:109
+#: sat/plugins/plugin_misc_register_account.py:87
+msgid "Register new account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:92
+msgid "Do you want to register a new XMPP account {jid}?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:134
 msgid "Registration successful."
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:113
+#: sat/plugins/plugin_misc_register_account.py:138
 msgid "Failure"
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:114
+#: sat/plugins/plugin_misc_register_account.py:139
 #, python-format
 msgid "Registration failed: %s"
 msgstr ""
 
-#: src/plugins/plugin_misc_register_account.py:117
+#: sat/plugins/plugin_misc_register_account.py:143
 msgid "Username already exists, please choose an other one."
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:47
+#: sat/plugins/plugin_misc_room_game.py:49
 msgid "Base class for MUC games"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:212
+#: sat/plugins/plugin_misc_room_game.py:221
 #, python-format
 msgid "%(user)s not allowed to join the game %(game)s in %(room)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:348
+#: sat/plugins/plugin_misc_room_game.py:380
 #, python-format
 msgid "%(user)s not allowed to invite for the game %(game)s in %(room)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:394
-#, python-format
-msgid ""
-"Still waiting for %(users)s before starting the game %(game)s in %(room)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_room_game.py:423
+#: sat/plugins/plugin_misc_room_game.py:433
+#, python-format
+msgid "Still waiting for %(users)s before starting the game %(game)s in %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:472
 #, python-format
 msgid "Preparing room for %s game"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:426
+#: sat/plugins/plugin_misc_room_game.py:475
 msgid "Unknown profile"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:521
+#: sat/plugins/plugin_misc_room_game.py:583
 #, python-format
 msgid "%(game)s game already created in room %(room)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:524
+#: sat/plugins/plugin_misc_room_game.py:589
 #, python-format
 msgid "%(game)s game in room %(room)s can only be created by %(user)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:542
+#: sat/plugins/plugin_misc_room_game.py:610
 #, python-format
 msgid "Creating %(game)s game in room %(room)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:545
-#: src/plugins/plugin_misc_room_game.py:574
-#: src/plugins/plugin_misc_tarot.py:438
+#: sat/plugins/plugin_misc_room_game.py:615
+#: sat/plugins/plugin_misc_room_game.py:646
+#: sat/plugins/plugin_misc_tarot.py:581
 #, python-format
 msgid "profile %s is unknown"
 msgstr ""
 
-#: src/plugins/plugin_misc_room_game.py:589
+#: sat/plugins/plugin_misc_room_game.py:661
 #, python-format
 msgid "new round for %s game"
 msgstr ""
 
-#: src/plugins/plugin_misc_smtp.py:45
-msgid ""
-"Create a SMTP server that you can use to send your \"normal\" type messages"
-msgstr ""
-
-#: src/plugins/plugin_misc_smtp.py:62
-msgid "Plugin SMTP Server initialization"
-msgstr ""
-
-#: src/plugins/plugin_misc_smtp.py:69
-#, python-format
-msgid "Launching SMTP server on port %d"
-msgstr ""
-
-#: src/plugins/plugin_misc_smtp.py:95
-#, python-format
-msgid "Can't send message: %s"
-msgstr ""
-
-#: src/plugins/plugin_misc_smtp.py:200
-msgid "SMTP server connection started"
-msgstr ""
-
-#: src/plugins/plugin_misc_smtp.py:204
-#, python-format
-msgid "SMTP server connection lost (reason: %s)"
-msgstr ""
-
-#: src/plugins/plugin_misc_static_blog.py:41
+#: sat/plugins/plugin_misc_static_blog.py:44
 msgid "Plugin for static blogs"
 msgstr ""
 
-#: src/plugins/plugin_misc_static_blog.py:62
+#: sat/plugins/plugin_misc_static_blog.py:66
 msgid "Page title"
 msgstr ""
 
-#: src/plugins/plugin_misc_static_blog.py:64
+#: sat/plugins/plugin_misc_static_blog.py:68
 msgid "Banner URL"
 msgstr ""
 
-#: src/plugins/plugin_misc_static_blog.py:66
+#: sat/plugins/plugin_misc_static_blog.py:70
+msgid "Background image URL"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:72
 msgid "Keywords"
 msgstr ""
 
-#: src/plugins/plugin_misc_static_blog.py:68
+#: sat/plugins/plugin_misc_static_blog.py:74
 msgid "Description"
 msgstr ""
 
-#: src/plugins/plugin_misc_static_blog.py:91 src/plugins/plugin_sec_otr.py:290
-#: src/plugins/plugin_sec_otr.py:316 src/plugins/plugin_sec_otr.py:339
-#: src/plugins/plugin_sec_otr.py:418
+#: sat/plugins/plugin_misc_static_blog.py:97 sat/plugins/plugin_sec_otr.py:508
+#: sat/plugins/plugin_sec_otr.py:542 sat/plugins/plugin_sec_otr.py:568
+#: sat/plugins/plugin_sec_otr.py:592
 msgid "jid key is not present !"
 msgstr ""
 
-#: src/plugins/plugin_misc_static_blog.py:96
+#: sat/plugins/plugin_misc_static_blog.py:102
 msgid "Not available"
 msgstr ""
 
-#: src/plugins/plugin_misc_static_blog.py:97
+#: sat/plugins/plugin_misc_static_blog.py:104
 msgid "Retrieving a blog from an external domain is not implemented yet."
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:46
+#: sat/plugins/plugin_misc_tarot.py:47
 msgid "Implementation of Tarot card game"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:58
+#: sat/plugins/plugin_misc_tarot.py:60
 msgid "Plugin Tarot initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:64
+#: sat/plugins/plugin_misc_tarot.py:78
 msgid "Passe"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:64
+#: sat/plugins/plugin_misc_tarot.py:79
 msgid "Petite"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:64
+#: sat/plugins/plugin_misc_tarot.py:80
 msgid "Garde"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:64
+#: sat/plugins/plugin_misc_tarot.py:81
 msgid "Garde Sans"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:64
+#: sat/plugins/plugin_misc_tarot.py:82
 msgid "Garde Contre"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:107
+#: sat/plugins/plugin_misc_tarot.py:171
 msgid "contrat selection"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:120
+#: sat/plugins/plugin_misc_tarot.py:189
 msgid "scores"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:201 src/plugins/plugin_misc_tarot.py:232
+#: sat/plugins/plugin_misc_tarot.py:273 sat/plugins/plugin_misc_tarot.py:313
 #, python-format
 msgid ""
 "Player %(excuse_owner)s give %(card_waited)s to %(player_waiting)s for "
 "Excuse compensation"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:237
+#: sat/plugins/plugin_misc_tarot.py:327
 #, python-format
 msgid ""
 "%(excuse_owner)s keep the Excuse but has not card to give, %(winner)s is "
 "waiting for one"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:247 src/plugins/plugin_misc_tarot.py:319
+#: sat/plugins/plugin_misc_tarot.py:338
+#: sat_frontends/primitivus/game_tarot.py:309
+msgid "Draw game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:341 sat/plugins/plugin_misc_tarot.py:436
 #, python-format
 msgid ""
 "\n"
@@ -3064,207 +2586,236 @@
 "total score ==> %(total_score)i"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:297
+#: sat/plugins/plugin_misc_tarot.py:397
 msgid "INTERNAL ERROR: contrat not managed (mispelled ?)"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:316
+#: sat/plugins/plugin_misc_tarot.py:422
 #, python-format
 msgid ""
 "The attacker (%(attaquant)s) makes %(points)i and needs to make "
-"%(point_limit)i (%(nb_bouts)s oulder%(plural)s%(separator)s%(bouts)s): (s)he "
-"%(victory)s"
-msgstr ""
-
-#: src/plugins/plugin_misc_tarot.py:377
+"%(point_limit)i (%(nb_bouts)s oulder%(plural)s%(separator)s%(bouts)s): "
+"(s)he %(victory)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:507
 msgid "Internal error: unmanaged game stage"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:396 src/plugins/plugin_misc_tarot.py:419
+#: sat/plugins/plugin_misc_tarot.py:530 sat/plugins/plugin_misc_tarot.py:562
 msgid "session id doesn't exist, session has probably expired"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:405
+#: sat/plugins/plugin_misc_tarot.py:540
 #, python-format
 msgid "contrat [%(contrat)s] choosed by %(profile)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:440
+#: sat/plugins/plugin_misc_tarot.py:584
 #, python-format
 msgid "Cards played by %(profile)s: [%(cards)s]"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:542
+#: sat/plugins/plugin_misc_tarot.py:709
 msgid "Everybody is passing, round ended"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:549
+#: sat/plugins/plugin_misc_tarot.py:723
 #, python-format
 msgid "%(player)s win the bid with %(contrat)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:570
+#: sat/plugins/plugin_misc_tarot.py:751
 msgid "tarot: chien received"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:621
+#: sat/plugins/plugin_misc_tarot.py:828
 #, python-format
 msgid "The winner of this trick is %s"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:667
+#: sat/plugins/plugin_misc_tarot.py:896
 #, python-format
 msgid "Unmanaged error type: %s"
 msgstr ""
 
-#: src/plugins/plugin_misc_tarot.py:669
+#: sat/plugins/plugin_misc_tarot.py:898
 #, python-format
 msgid "Unmanaged card game element: %s"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:38
+#: sat/plugins/plugin_misc_text_commands.py:40
 msgid "IRC like text commands"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:57
-msgid ""
-"Type '/help' to get a list of the available commands. If you didn't want to "
-"use a command, please start your message with '//' to escape the slash."
-msgstr ""
-
-#: src/plugins/plugin_misc_text_commands.py:60
+#: sat/plugins/plugin_misc_text_commands.py:60
+msgid ""
+"Type '/help' to get a list of the available commands. If you didn't want "
+"to use a command, please start your message with '//' to escape the "
+"slash."
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:66
 msgid "Text commands initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:143
+#: sat/plugins/plugin_misc_text_commands.py:162
 #, python-format
 msgid "Skipping not callable [%s] attribute"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:147
+#: sat/plugins/plugin_misc_text_commands.py:166
 msgid "Skipping cmd_ method"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:153
-#, python-brace-format
+#: sat/plugins/plugin_misc_text_commands.py:173
 msgid "Conflict for command [{old_name}], renaming it to [{new_name}]"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:157
+#: sat/plugins/plugin_misc_text_commands.py:180
 #, python-format
 msgid "Registered text command [%s]"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:236
+#: sat/plugins/plugin_misc_text_commands.py:244
+#, python-format
+msgid "Invalid command /%s. "
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:277
 #, python-format
 msgid "Unknown command /%s. "
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:242
+#: sat/plugins/plugin_misc_text_commands.py:286
 msgid "group discussions"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:242
+#: sat/plugins/plugin_misc_text_commands.py:288
 msgid "one to one discussions"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:243
-#, python-brace-format
+#: sat/plugins/plugin_misc_text_commands.py:290
 msgid "/{command} command only applies in {context}."
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:322
+#: sat/plugins/plugin_misc_text_commands.py:374
 msgid "Invalid jid, can't whois"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:328
+#: sat/plugins/plugin_misc_text_commands.py:380
 #, python-format
 msgid "whois for %(jid)s"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:379
+#: sat/plugins/plugin_misc_text_commands.py:436
 msgid "Invalid command name [{}]\n"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:397
+#: sat/plugins/plugin_misc_text_commands.py:457
 #, python-format
 msgid ""
 "Text commands available:\n"
 "%s"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:402
-#, python-brace-format
+#: sat/plugins/plugin_misc_text_commands.py:462
 msgid ""
 "/{name}: {short_help}\n"
 "{syntax}{args_help}"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_commands.py:405
-msgid " "
-msgstr ""
-
-#: src/plugins/plugin_misc_text_syntaxes.py:37 src/test/constants.py:44
+#: sat/plugins/plugin_misc_text_commands.py:465
+msgid " syntax: {}\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_syntaxes.py:43 sat/test/constants.py:56
 msgid "Composition"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_syntaxes.py:63
+#: sat/plugins/plugin_misc_text_syntaxes.py:142
 msgid "Management of various text syntaxes (XHTML-IM, Markdown, etc)"
 msgstr ""
 
-#: src/plugins/plugin_misc_text_syntaxes.py:102
+#: sat/plugins/plugin_misc_text_syntaxes.py:184
 msgid "Text syntaxes plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_upload.py:38
+#: sat/plugins/plugin_misc_upload.py:41
 msgid "File upload management"
 msgstr ""
 
-#: src/plugins/plugin_misc_upload.py:42
+#: sat/plugins/plugin_misc_upload.py:45
 msgid "Please select a file to upload"
 msgstr ""
 
-#: src/plugins/plugin_misc_upload.py:43
+#: sat/plugins/plugin_misc_upload.py:46
 msgid "File upload"
 msgstr ""
 
-#: src/plugins/plugin_misc_upload.py:51
+#: sat/plugins/plugin_misc_upload.py:53
 msgid "plugin Upload initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_watched.py:36
+#: sat/plugins/plugin_misc_upload.py:92
+msgid "Can't upload file: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:96 sat_frontends/jp/cmd_file.py:586
+msgid "Can't upload file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:32
+msgid "URI finder"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:39
+msgid ""
+"    Plugin to find URIs in well know location.\n"
+"    This allows to retrieve settings to work with a project (e.g. pubsub "
+"node used for merge-requests).\n"
+"    "
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:52
+msgid "URI finder plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:87
+msgid "Ignoring already found uri for key \"{key}\""
+msgstr ""
+
+#: sat/plugins/plugin_misc_watched.py:37
 msgid "Watch for entities presence, and send notification accordingly"
 msgstr ""
 
-#: src/plugins/plugin_misc_watched.py:42
-#, python-brace-format
+#: sat/plugins/plugin_misc_watched.py:45
 msgid "Watched entity {entity} is connected"
 msgstr ""
 
-#: src/plugins/plugin_misc_watched.py:61
+#: sat/plugins/plugin_misc_watched.py:62
 msgid "Watched initialisation"
 msgstr ""
 
-#: src/plugins/plugin_misc_welcome.py:33
-msgid ""
-"Plugin which manage welcome message and things to to on first connection."
-msgstr ""
-
-#: src/plugins/plugin_misc_welcome.py:39
+#: sat/plugins/plugin_misc_welcome.py:34
+msgid "Plugin which manage welcome message and things to to on first connection."
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:42
 msgid "Display welcome message"
 msgstr ""
 
-#: src/plugins/plugin_misc_welcome.py:40
+#: sat/plugins/plugin_misc_welcome.py:43
 msgid "Welcome to Libervia/Salut à Toi"
 msgstr ""
 
-#: src/plugins/plugin_misc_welcome.py:43
+#: sat/plugins/plugin_misc_welcome.py:46
 msgid ""
 "Welcome to a free (as in freedom) network!\n"
 "\n"
-"If you have any trouble, or you want to help us for the bug hunting, you can "
-"contact us in real time chat by using the “Help / Official chat room”  "
-"menu.\n"
+"If you have any trouble, or you want to help us for the bug hunting, you "
+"can contact us in real time chat by using the “Help / Official chat room”"
+"  menu.\n"
 "\n"
 "To use Libervia, you'll need to add contacts, either people you know, or "
 "people you discover by using the “Contacts / Search directory” menu.\n"
@@ -3274,138 +2825,120 @@
 "The Libervia/Salut à Toi Team\n"
 msgstr ""
 
-#: src/plugins/plugin_misc_welcome.py:69
+#: sat/plugins/plugin_misc_welcome.py:75
 msgid "plugin Welcome initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_xmllog.py:35
+#: sat/plugins/plugin_misc_xmllog.py:36
 msgid "Send raw XML logs to bridge"
 msgstr ""
 
-#: src/plugins/plugin_misc_xmllog.py:48
-msgid "INTERNAL ERROR: Unmanaged XML type"
-msgstr ""
-
-#: src/plugins/plugin_misc_xmllog.py:69
+#: sat/plugins/plugin_misc_xmllog.py:51
 msgid "Activate XML log"
 msgstr ""
 
-#: src/plugins/plugin_misc_xmllog.py:72
+#: sat/plugins/plugin_misc_xmllog.py:55
 msgid "Plugin XML Log initialization"
 msgstr ""
 
-#: src/plugins/plugin_misc_xmllog.py:83
+#: sat/plugins/plugin_misc_xmllog.py:69
 msgid "XML log activated"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:47
+#: sat/plugins/plugin_misc_xmllog.py:81
+msgid "INTERNAL ERROR: Unmanaged XML type"
+msgstr ""
+
+#: sat/plugins/plugin_sec_aesgcm.py:48
+msgid ""
+"    Implementation of AES-GCM scheme, a way to encrypt files (not "
+"official XMPP standard).\n"
+"    See https://xmpp.org/extensions/inbox/omemo-media-sharing.html for "
+"details\n"
+"    "
+msgstr ""
+
+#: sat/plugins/plugin_sec_aesgcm.py:63
+msgid "AESGCM plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:50
 msgid "Implementation of OTR"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:52
+#: sat/plugins/plugin_sec_otr.py:55
 msgid "OTR"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:53
-msgid ""
-"To authenticate your correspondent, you need to give your below fingerprint "
-"*BY AN EXTERNAL CANAL* (i.e. not in this chat), and check that the one he "
-"gives you is the same as below. If there is a mismatch, there can be a spy "
-"between you!"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:54
-msgid ""
-"You private key is used to encrypt messages for your correspondent, nobody "
-"except you must know it, if you are in doubt, you should drop it!\n"
+#: sat/plugins/plugin_sec_otr.py:56
+msgid ""
+"To authenticate your correspondent, you need to give your below "
+"fingerprint *BY AN EXTERNAL CANAL* (i.e. not in this chat), and check "
+"that the one he gives you is the same as below. If there is a mismatch, "
+"there can be a spy between you!"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:61
+msgid ""
+"You private key is used to encrypt messages for your correspondent, "
+"nobody except you must know it, if you are in doubt, you should drop it!"
+"\n"
 "\n"
 "Are you sure you want to drop your private key?"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:56
+#: sat/plugins/plugin_sec_otr.py:67
 msgid "Some of advanced features are disabled !"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:120
+#: sat/plugins/plugin_sec_otr.py:169
 #, python-format
 msgid "/!\\ conversation with %(other_jid)s is now UNENCRYPTED"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:127
+#: sat/plugins/plugin_sec_otr.py:182
 msgid "trusted"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:127
+#: sat/plugins/plugin_sec_otr.py:182
 msgid "untrusted"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:130
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:185
 msgid "{trusted} OTR conversation with {other_jid} REFRESHED"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:134
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:189
 msgid ""
 "{trusted} encrypted OTR conversation started with {other_jid}\n"
 "{extra_info}"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:140
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:201
 msgid "OTR conversation with {other_jid} is FINISHED"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:143
+#: sat/plugins/plugin_sec_otr.py:209
 msgid "Unknown OTR state"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:178
+#: sat/plugins/plugin_sec_otr.py:249
 msgid "Save is called but privkey is None !"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:230
+#: sat/plugins/plugin_sec_otr.py:308
 msgid "OTR plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:241
-msgid "Start/Refresh"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:241
-msgid "Start or refresh an OTR session"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:242
-msgid "End session"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:242
-msgid "Finish an OTR session"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:243
-msgid "Authenticate"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:243
-msgid "Authenticate user/see your fingerprint"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:244
-msgid "Drop private key"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:355
+#: sat/plugins/plugin_sec_otr.py:418
 msgid "You have no private key yet, start an OTR conversation to have one"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:358
+#: sat/plugins/plugin_sec_otr.py:424
 msgid "No private key"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:368
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:436
 msgid ""
 "Your fingerprint is:\n"
 "{fingerprint}\n"
@@ -3413,1530 +2946,5739 @@
 "Start an OTR conversation to have your correspondent one."
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:371
+#: sat/plugins/plugin_sec_otr.py:442 sat/plugins/plugin_xep_0384.py:687
 msgid "Fingerprint"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:380
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:453
 msgid "Your correspondent {correspondent} is now TRUSTED"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:384
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:459
 msgid "Your correspondent {correspondent} is now UNTRUSTED"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:395
-#, python-format
-msgid "Authentication (%s)"
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:398
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:477
+msgid "Authentication ({entity_jid})"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:483
 msgid ""
 "Your own fingerprint is:\n"
 "{fingerprint}"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:399
-#, python-brace-format
+#: sat/plugins/plugin_sec_otr.py:486
 msgid ""
 "Your correspondent fingerprint should be:\n"
 "{fingerprint}"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:402
+#: sat/plugins/plugin_sec_otr.py:492
 msgid "Is your correspondent fingerprint the same as here ?"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:403
+#: sat/plugins/plugin_sec_otr.py:494
 msgid "yes"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:403
+#: sat/plugins/plugin_sec_otr.py:494
 msgid "no"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:423
+#: sat/plugins/plugin_sec_otr.py:520
+msgid ""
+"Can't start an OTR session, there is already an encrypted session with "
+"{name}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:598
 msgid "You don't have a private key yet !"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:432
+#: sat/plugins/plugin_sec_otr.py:611
 msgid "Your private key has been dropped"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:437
+#: sat/plugins/plugin_sec_otr.py:620
 msgid "Confirm private key drop"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:454
+#: sat/plugins/plugin_sec_otr.py:649
 msgid "WARNING: received unencrypted data in a supposedly encrypted context"
 msgstr ""
 
-#: src/plugins/plugin_sec_otr.py:531
-msgid ""
-"Your message was not sent because your correspondent closed the encrypted "
-"conversation on his/her side. Either close your own side, or refresh the "
-"session."
-msgstr ""
-
-#: src/plugins/plugin_sec_otr.py:533
+#: sat/plugins/plugin_sec_otr.py:656
+msgid "WARNING: received OTR encrypted data in an unencrypted context"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:662
+msgid "WARNING: received OTR error message: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:668
+msgid "Error while trying de decrypt OTR message: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:780
+msgid ""
+"Your message was not sent because your correspondent closed the encrypted"
+" conversation on his/her side. Either close your own side, or refresh the"
+" session."
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:785
 msgid "Message discarded because closed encryption channel"
 msgstr ""
 
-#: src/plugins/plugin_syntax_wiki_dotclear.py:39
+#: sat/plugins/plugin_syntax_wiki_dotclear.py:40
 msgid "Implementation of Dotclear wiki syntax"
 msgstr ""
 
-#: src/plugins/plugin_syntax_wiki_dotclear.py:635
+#: sat/plugins/plugin_syntax_wiki_dotclear.py:664
 msgid "Dotclear wiki syntax plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_tmp_directory_subscription.py:36
+#: sat/plugins/plugin_tickets_import.py:38
+msgid ""
+"Tickets import management:\n"
+"This plugin manage the different tickets importers which can register to "
+"it, and handle generic importing tasks."
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:57
+msgid "plugin Tickets Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:111
+msgid "comments_uri key will be generated and must not be used by importer"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:115
+msgid "{key} must be a list"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:174
+msgid "mapping option must be a dictionary"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:179
+msgid "keys and values of mapping must be sources and destinations ticket fields"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:41
+msgid "Tickets importer for Bugzilla"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:44
+msgid "import tickets from Bugzilla xml export file"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:46
+msgid ""
+"This importer handle Bugzilla xml export file.\n"
+"\n"
+"To use it, you'll need to export tickets using XML.\n"
+"Tickets will be uploaded with the same ID as for Bugzilla, any existing "
+"ticket with this ID will be replaced.\n"
+"\n"
+"location: you must use the absolute path to your .xml file\n"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:128
+msgid "Bugilla Import plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:37
 msgid "Implementation of directory subscription"
 msgstr ""
 
-#: src/plugins/plugin_tmp_directory_subscription.py:47
+#: sat/plugins/plugin_tmp_directory_subscription.py:47
 msgid "Directory subscription plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_tmp_directory_subscription.py:49
-#: src/plugins/plugin_xep_0050.py:222 src/plugins/plugin_xep_0100.py:66
+#: sat/plugins/plugin_tmp_directory_subscription.py:50
+#: sat/plugins/plugin_xep_0050.py:315 sat/plugins/plugin_xep_0100.py:84
 msgid "Service"
 msgstr ""
 
-#: src/plugins/plugin_tmp_directory_subscription.py:49
+#: sat/plugins/plugin_tmp_directory_subscription.py:50
 msgid "Directory subscription"
 msgstr ""
 
-#: src/plugins/plugin_tmp_directory_subscription.py:49
+#: sat/plugins/plugin_tmp_directory_subscription.py:53
 msgid "User directory subscription"
 msgstr ""
 
-#: src/plugins/plugin_xep_0020.py:45
+#: sat/plugins/plugin_xep_0020.py:46
 msgid "Implementation of Feature Negotiation"
 msgstr ""
 
-#: src/plugins/plugin_xep_0020.py:52
+#: sat/plugins/plugin_xep_0020.py:52
 msgid "Plugin XEP_0020 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0020.py:103
+#: sat/plugins/plugin_xep_0020.py:104
 msgid "More than one value choosed for {}, keeping the first one"
 msgstr ""
 
-#: src/plugins/plugin_xep_0033.py:64
+#: sat/plugins/plugin_xep_0033.py:66
 msgid "Implementation of Extended Stanza Addressing"
 msgstr ""
 
-#: src/plugins/plugin_xep_0033.py:73
+#: sat/plugins/plugin_xep_0033.py:76
 msgid "Extended Stanza Addressing plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0033.py:89
+#: sat/plugins/plugin_xep_0033.py:97
 msgid "XEP-0033 is being used but the server doesn't support it!"
 msgstr ""
 
-#: src/plugins/plugin_xep_0033.py:92
+#: sat/plugins/plugin_xep_0033.py:103
 msgid " or "
 msgstr ""
 
-#: src/plugins/plugin_xep_0033.py:93
-#, python-format
-msgid ""
-"Stanzas using XEP-0033 should be addressed to %(expected)s, not %(current)s!"
-msgstr ""
-
-#: src/plugins/plugin_xep_0033.py:94
-msgid ""
-"TODO: addressing has been fixed by the backend... fix it in the frontend!"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:52
+#: sat/plugins/plugin_xep_0033.py:105
+#, python-format
+msgid ""
+"Stanzas using XEP-0033 should be addressed to %(expected)s, not "
+"%(current)s!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:111
+msgid "TODO: addressing has been fixed by the backend... fix it in the frontend!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:56
 msgid "Implementation of Multi-User Chat"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:78
+#: sat/plugins/plugin_xep_0045.py:89
 msgid "Plugin XEP_0045 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:95
+#: sat/plugins/plugin_xep_0045.py:145
 msgid "MUC"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:95
+#: sat/plugins/plugin_xep_0045.py:145
 msgid "configure"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:95
+#: sat/plugins/plugin_xep_0045.py:146
 msgid "Configure Multi-User Chat room"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:135 src/plugins/plugin_xep_0045.py:728
+#: sat/plugins/plugin_xep_0045.py:194
+msgid ""
+"Received non delayed message in a room before its initialisation: "
+"state={state}, msg={msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:216 sat/plugins/plugin_xep_0045.py:224
+#: sat/plugins/plugin_xep_0045.py:880
 msgid "This room has not been joined"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:168
+#: sat/plugins/plugin_xep_0045.py:283
 msgid "Room joining cancelled by user"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:173
+#: sat/plugins/plugin_xep_0045.py:288
 msgid "Rooms in {}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:188
+#: sat/plugins/plugin_xep_0045.py:303
 msgid "room locked !"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:190
-msgid "Error while configuring the room"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:206
+#: sat/plugins/plugin_xep_0045.py:306
+msgid "Error while configuring the room: {failure_}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:322
 msgid "Room {} is restricted"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:207
+#: sat/plugins/plugin_xep_0045.py:323
 msgid "This room is restricted, please enter the password"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:215
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:332
 msgid "Error while joining the room {room}{suffix}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:218
+#: sat/plugins/plugin_xep_0045.py:334
 msgid "Group chat error"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:307
+#: sat/plugins/plugin_xep_0045.py:401
 msgid "room_jid key is not present !"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:340 src/plugins/plugin_xep_0045.py:342
+#: sat/plugins/plugin_xep_0045.py:406
+msgid "No configuration available for this room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:440 sat/plugins/plugin_xep_0045.py:442
 msgid "Session ID doesn't exist, session has probably expired."
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:341
+#: sat/plugins/plugin_xep_0045.py:441
 msgid "Room configuration failed"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:347
+#: sat/plugins/plugin_xep_0045.py:447
 msgid "Room configuration succeed"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:348
+#: sat/plugins/plugin_xep_0045.py:448
 msgid "The new settings have been saved."
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:395
+#: sat/plugins/plugin_xep_0045.py:509
 msgid "No MUC service found on main server"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:424
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:538
 msgid ""
 "Invalid room identifier: {room_id}'. Please give a room short or full "
 "identifier like 'room' or 'room@{muc_service}'."
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:449
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:558
 msgid "{profile} is already in room {room_jid}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:451
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:561
 msgid "[{profile}] is joining room {room} with nick {nick}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:590
+#: sat/plugins/plugin_xep_0045.py:729
 msgid "You must provide a member's nick to kick."
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:597
+#: sat/plugins/plugin_xep_0045.py:738
 msgid "You have kicked {}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:599 src/plugins/plugin_xep_0045.py:628
-msgid " for the following reason: {}"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:619
+#: sat/plugins/plugin_xep_0045.py:740 sat/plugins/plugin_xep_0045.py:776
+msgid " for the following reason: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:763
 msgid "You must provide a valid JID to ban, like in '/ban contact@example.net'"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:626
+#: sat/plugins/plugin_xep_0045.py:774
 msgid "You have banned {}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:652
+#: sat/plugins/plugin_xep_0045.py:802
 msgid ""
 "You must provide a valid JID to affiliate, like in '/affiliate "
 "contact@example.net member'"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:658
+#: sat/plugins/plugin_xep_0045.py:808
 #, python-format
 msgid "You must provide a valid affiliation: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:665
-#, python-format
-msgid "New affiliation for %(entity)s: %(affiliation)s"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:711
-msgid "No known default MUC service"
-msgstr ""
-
-#: src/plugins/plugin_xep_0045.py:715
+#: sat/plugins/plugin_xep_0045.py:815
+msgid "New affiliation for {entity}: {affiliation}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:862
+msgid "No known default MUC service {unparsed}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:867
 msgid "{} is not a valid JID!"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:733
+#: sat/plugins/plugin_xep_0045.py:885
 #, python-format
 msgid "Nickname: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:735
+#: sat/plugins/plugin_xep_0045.py:887
 #, python-format
 msgid "Entity: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:737
+#: sat/plugins/plugin_xep_0045.py:889
 #, python-format
 msgid "Affiliation: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:739
+#: sat/plugins/plugin_xep_0045.py:891
 #, python-format
 msgid "Role: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:741
+#: sat/plugins/plugin_xep_0045.py:893
 #, python-format
 msgid "Status: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:743
+#: sat/plugins/plugin_xep_0045.py:895
 #, python-format
 msgid "Show: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:868
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:960
+msgid ""
+"room {room} is not in expected state: room is in state {current_state} "
+"while we were expecting {expected_state}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1093
+msgid "No message received while offline in {room_jid}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1097
+msgid "We have received {num_mess} message(s) in {room_jid} while offline."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1141
+msgid "missing nick in presence: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1217
 msgid "user {nick} has joined room {room_id}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:883
+#: sat/plugins/plugin_xep_0045.py:1234
 msgid "=> {} has joined the room"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:899
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:1253
 msgid "Room ({room}) left ({profile})"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:910
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:1267
 msgid "user {nick} left room {room_id}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:922
+#: sat/plugins/plugin_xep_0045.py:1279
 msgid "<= {} has left the room"
 msgstr ""
 
-#: src/plugins/plugin_xep_0045.py:1034
-#, python-brace-format
+#: sat/plugins/plugin_xep_0045.py:1342
+msgid "received history in unexpected state in room {room} (state: {state})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1350
+msgid "storing the unexpected message anyway, to avoid loss"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1437
 msgid "New subject for room ({room_id}): {subject}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:60
+#: sat/plugins/plugin_xep_0047.py:62
 msgid "Implementation of In-Band Bytestreams"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:69
+#: sat/plugins/plugin_xep_0047.py:71
 msgid "In-Band Bytestreams plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:158
+#: sat/plugins/plugin_xep_0047.py:162
 msgid "IBB stream opening"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:168
+#: sat/plugins/plugin_xep_0047.py:171
 #, python-format
 msgid "Ignoring unexpected IBB transfer: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:172
+#: sat/plugins/plugin_xep_0047.py:176
 msgid "sended jid inconsistency (man in the middle attack attempt ?)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:201
+#: sat/plugins/plugin_xep_0047.py:206
 msgid "IBB stream closing"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:225
+#: sat/plugins/plugin_xep_0047.py:228
 msgid "Received data for an unknown session id"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:232
-#, python-brace-format
+#: sat/plugins/plugin_xep_0047.py:236
 msgid ""
 "sended jid inconsistency (man in the middle attack attempt ?)\n"
 "initial={initial}\n"
 "given={given}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:239
+#: sat/plugins/plugin_xep_0047.py:246
 msgid "Sequence error"
 msgstr ""
 
-#: src/plugins/plugin_xep_0047.py:254
+#: sat/plugins/plugin_xep_0047.py:261
 msgid "Invalid base64 data"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:44
+#: sat/plugins/plugin_xep_0048.py:45
 msgid "Implementation of bookmarks"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:57
+#: sat/plugins/plugin_xep_0048.py:58
 msgid "Bookmarks plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:61
+#: sat/plugins/plugin_xep_0048.py:63 sat_frontends/primitivus/base.py:540
+msgid "Groups"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:63
 msgid "Bookmarks"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:61
+#: sat/plugins/plugin_xep_0048.py:66
 msgid "Use and manage bookmarks"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:109
+#: sat/plugins/plugin_xep_0048.py:147
 msgid "Private XML storage not available"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:218
+#: sat/plugins/plugin_xep_0048.py:260
 msgid "No room jid selected"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:236
+#: sat/plugins/plugin_xep_0048.py:280
 msgid "Bookmarks manager"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:254
+#: sat/plugins/plugin_xep_0048.py:310 sat_frontends/jp/cmd_bookmarks.py:126
+msgid "add a bookmark"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:312
 msgid "Name"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:258
+#: sat/plugins/plugin_xep_0048.py:314 sat_frontends/jp/cmd_profile.py:175
+msgid "jid"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:316
 msgid "Nickname"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:260
+#: sat/plugins/plugin_xep_0048.py:318
 msgid "Autojoin"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:307
+#: sat/plugins/plugin_xep_0048.py:321 sat_frontends/primitivus/xmlui.py:470
+msgid "Save"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:367
 msgid "Bookmarks will be local only"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:308
+#: sat/plugins/plugin_xep_0048.py:368
 #, python-format
 msgid "Type selected for \"auto\" storage: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:431
+#: sat/plugins/plugin_xep_0048.py:500
 msgid "Bad arguments"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:438
+#: sat/plugins/plugin_xep_0048.py:509
 #, python-format
 msgid "All [%s] bookmarks are being removed"
 msgstr ""
 
-#: src/plugins/plugin_xep_0048.py:446
+#: sat/plugins/plugin_xep_0048.py:520
 msgid "Bookmark added"
 msgstr ""
 
-#: src/plugins/plugin_xep_0049.py:37
+#: sat/plugins/plugin_xep_0049.py:37
 msgid "Implementation of private XML storage"
 msgstr ""
 
-#: src/plugins/plugin_xep_0049.py:45
+#: sat/plugins/plugin_xep_0049.py:45
 msgid "Plugin XEP-0049 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:55
+#: sat/plugins/plugin_xep_0050.py:51
+#: sat_frontends/quick_frontend/constants.py:29
+msgid "Online"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:52
 msgid "Away"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:58
+#: sat/plugins/plugin_xep_0050.py:53
+#: sat_frontends/quick_frontend/constants.py:30
+msgid "Free for chat"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:54
+#: sat_frontends/quick_frontend/constants.py:32
+msgid "Do not disturb"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:55
 msgid "Left"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:68
+#: sat/plugins/plugin_xep_0050.py:56 sat_frontends/primitivus/base.py:535
+msgid "Disconnect"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:67
 msgid "Implementation of Ad-Hoc Commands"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:110
-#, python-format
-msgid "The groups [%(group)s] is unknown for profile [%(profile)s])"
-msgstr ""
-
-#: src/plugins/plugin_xep_0050.py:214
+#: sat/plugins/plugin_xep_0050.py:126
+msgid "The groups [{group}] is unknown for profile [{profile}])"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:284
 msgid "plugin XEP-0050 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:222
+#: sat/plugins/plugin_xep_0050.py:315
 msgid "Commands"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:222
+#: sat/plugins/plugin_xep_0050.py:318
 msgid "Execute ad-hoc commands"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:228
+#: sat/plugins/plugin_xep_0050.py:329
 msgid "Status"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:241
+#: sat/plugins/plugin_xep_0050.py:364
+msgid "Missing command element"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:379
 msgid "Please select a command"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:259
+#: sat/plugins/plugin_xep_0050.py:397
 #, python-format
 msgid "Invalid note type [%s], using info"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:269
+#: sat/plugins/plugin_xep_0050.py:408
 msgid "WARNING"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:270
+#: sat/plugins/plugin_xep_0050.py:409
 msgid "ERROR"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:302
+#: sat/plugins/plugin_xep_0050.py:457
 msgid "No known payload found in ad-hoc command result, aborting"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:306
+#: sat/plugins/plugin_xep_0050.py:464
 msgid "No payload found"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:401
+#: sat/plugins/plugin_xep_0050.py:574
 msgid "Please enter target jid"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:415
+#: sat/plugins/plugin_xep_0050.py:588
 msgid "status selection"
 msgstr ""
 
-#: src/plugins/plugin_xep_0050.py:443
+#: sat/plugins/plugin_xep_0050.py:618
 msgid "Status updated"
 msgstr ""
 
-#: src/plugins/plugin_xep_0054.py:73
+#: sat/plugins/plugin_xep_0054.py:64
 msgid "Implementation of vcard-temp"
 msgstr ""
 
-#: src/plugins/plugin_xep_0054.py:83
+#: sat/plugins/plugin_xep_0054.py:84
 msgid "Plugin XEP_0054 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0054.py:234
+#: sat/plugins/plugin_xep_0054.py:99
+msgid "No avatar in cache for {profile}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:137
 msgid "Decoding binary"
 msgstr ""
 
-#: src/plugins/plugin_xep_0054.py:294
+#: sat/plugins/plugin_xep_0054.py:242
+msgid "vCard element not found for {entity_jid}: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:287
+msgid "Can't get vCard for {entity_jid}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:291
 msgid "VCard found"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:51
+#: sat/plugins/plugin_xep_0055.py:53
 msgid "Implementation of Jabber Search"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:66
+#: sat/plugins/plugin_xep_0055.py:70
 msgid "Jabber search plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:80
+#: sat/plugins/plugin_xep_0055.py:100 sat/stdui/ui_contact_list.py:39
+#: sat/stdui/ui_contact_list.py:45 sat/stdui/ui_contact_list.py:51
+#: sat_frontends/primitivus/base.py:539
+#: sat_frontends/primitivus/contact_list.py:50
+msgid "Contacts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:100
 msgid "Search directory"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:80
+#: sat/plugins/plugin_xep_0055.py:103
 msgid "Search user directory"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:118
+#: sat/plugins/plugin_xep_0055.py:143
 msgid "Search users"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:139
+#: sat/plugins/plugin_xep_0055.py:174
 msgid "Search for"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:141
+#: sat/plugins/plugin_xep_0055.py:181
 msgid "Simple search"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:149 src/plugins/plugin_xep_0055.py:249
+#: sat/plugins/plugin_xep_0055.py:191 sat/plugins/plugin_xep_0055.py:305
 msgid "Search"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:178
+#: sat/plugins/plugin_xep_0055.py:226
 msgid "Advanced search"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:196
+#: sat/plugins/plugin_xep_0055.py:246
 msgid "Search on"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:198
+#: sat/plugins/plugin_xep_0055.py:248
 msgid "Other service"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:205
+#: sat/plugins/plugin_xep_0055.py:256
 msgid "Refresh fields"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:208
+#: sat/plugins/plugin_xep_0055.py:260
 msgid "Displaying the search form for"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:281
+#: sat/plugins/plugin_xep_0055.py:341
 msgid "Search results"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:286
+#: sat/plugins/plugin_xep_0055.py:346
 msgid "The search gave no result"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:328 src/plugins/plugin_xep_0055.py:429
+#: sat/plugins/plugin_xep_0055.py:386 sat/plugins/plugin_xep_0055.py:493
 msgid "No query element found"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:333 src/plugins/plugin_xep_0055.py:434
+#: sat/plugins/plugin_xep_0055.py:391 sat/plugins/plugin_xep_0055.py:498
 msgid "No data form found"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:343
+#: sat/plugins/plugin_xep_0055.py:403
 #, python-format
 msgid "Fields request failure: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:415
+#: sat/plugins/plugin_xep_0055.py:478
 msgid "The search could not be performed"
 msgstr ""
 
-#: src/plugins/plugin_xep_0055.py:444
+#: sat/plugins/plugin_xep_0055.py:510
 #, python-format
 msgid "Search request failure: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0059.py:41
+#: sat/plugins/plugin_xep_0059.py:42
 msgid "Implementation of Result Set Management"
 msgstr ""
 
-#: src/plugins/plugin_xep_0059.py:49
+#: sat/plugins/plugin_xep_0059.py:52
 msgid "Result Set Management plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0060.py:53
+#: sat/plugins/plugin_xep_0059.py:65
+msgid "rsm_max can't be negative"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:56
 msgid "Implementation of PubSub Protocol"
 msgstr ""
 
-#: src/plugins/plugin_xep_0060.py:83
+#: sat/plugins/plugin_xep_0060.py:95
 msgid "PubSub plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0065.py:95
+#: sat/plugins/plugin_xep_0060.py:323
+msgid "Can't retrieve pubsub_service from conf, we'll use first one that we find"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:487
+msgid "Can't parse items: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:556
+msgid "Invalid item: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:572
+msgid ""
+"Can't use publish-options ({options}) on node {node}, re-publishing "
+"without them: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:905 sat/plugins/plugin_xep_0060.py:948
+msgid "Invalid result: missing <affiliations> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:916 sat/plugins/plugin_xep_0060.py:961
+msgid "Invalid result: bad <affiliation> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1284
+msgid "Invalid result: missing <subscriptions> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1289
+msgid "Invalid result: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1299
+msgid "Invalid result: bad <subscription> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0065.py:90
 msgid "Implementation of SOCKS5 Bytestreams"
 msgstr ""
 
-#: src/plugins/plugin_xep_0065.py:515
+#: sat/plugins/plugin_xep_0065.py:528
 msgid "File transfer completed, closing connection"
 msgstr ""
 
-#: src/plugins/plugin_xep_0065.py:667
+#: sat/plugins/plugin_xep_0065.py:695
 #, python-format
 msgid "Socks 5 client connection lost (reason: %s)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0065.py:695
+#: sat/plugins/plugin_xep_0065.py:723
 msgid "Plugin XEP_0065 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0065.py:750
+#: sat/plugins/plugin_xep_0065.py:781
 msgid "Socks5 Stream server launched on port {}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:54
+#: sat/plugins/plugin_xep_0070.py:56
 msgid "Implementation of HTTP Requests via XMPP"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:64
+#: sat/plugins/plugin_xep_0070.py:66
 msgid "Plugin XEP_0070 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:77
+#: sat/plugins/plugin_xep_0070.py:79
 msgid "XEP-0070 Verifying HTTP Requests via XMPP (iq)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:86
+#: sat/plugins/plugin_xep_0070.py:88
 msgid "XEP-0070 Verifying HTTP Requests via XMPP (message)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:97
+#: sat/plugins/plugin_xep_0070.py:98
 msgid "Auth confirmation"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:98
-msgid "{} needs to validate your identity, do you agree ?"
-msgstr ""
-
-#: src/plugins/plugin_xep_0070.py:99
-msgid "Validation code : {}"
-msgstr ""
-
-#: src/plugins/plugin_xep_0070.py:100
-msgid "Please check that this code is the same as on {}"
-msgstr ""
-
-#: src/plugins/plugin_xep_0070.py:102
-msgid "Submit to authorize, cancel otherwise."
-msgstr ""
-
-#: src/plugins/plugin_xep_0070.py:131
+#: sat/plugins/plugin_xep_0070.py:99
+msgid ""
+"{auth_url} needs to validate your identity, do you agree?\n"
+"Validation code : {auth_id}\n"
+"\n"
+"Please check that this code is the same as on {auth_url}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:117
 msgid "XEP-0070 reply iq"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:136
+#: sat/plugins/plugin_xep_0070.py:122
 msgid "XEP-0070 reply message"
 msgstr ""
 
-#: src/plugins/plugin_xep_0070.py:141
+#: sat/plugins/plugin_xep_0070.py:127
 msgid "XEP-0070 reply error"
 msgstr ""
 
-#: src/plugins/plugin_xep_0071.py:51
+#: sat/plugins/plugin_xep_0071.py:55
 msgid "Implementation of XHTML-IM"
 msgstr ""
 
-#: src/plugins/plugin_xep_0071.py:79
+#: sat/plugins/plugin_xep_0071.py:94
 msgid "XHTML-IM plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0071.py:196
+#: sat/plugins/plugin_xep_0071.py:223
 msgid "Can't have XHTML and rich content at the same time"
 msgstr ""
 
-#: src/plugins/plugin_xep_0077.py:40
+#: sat/plugins/plugin_xep_0077.py:41
 msgid "Implementation of in-band registration"
 msgstr ""
 
-#: src/plugins/plugin_xep_0077.py:47
+#: sat/plugins/plugin_xep_0077.py:54
+msgid "Registration asked for {jid}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:79
+msgid "Stream started with {server}, now registering"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:85
+msgid "Registration answer: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:89
+msgid "Registration failure: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:116
 msgid "Plugin XEP_0077 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0077.py:65
+#: sat/plugins/plugin_xep_0077.py:176
 msgid "Can't find data form"
 msgstr ""
 
-#: src/plugins/plugin_xep_0077.py:66
+#: sat/plugins/plugin_xep_0077.py:178
 msgid "This gateway can't be managed by SàT, sorry :("
 msgstr ""
 
-#: src/plugins/plugin_xep_0077.py:91
+#: sat/plugins/plugin_xep_0077.py:202 sat/plugins/plugin_xep_0077.py:212
+#, python-format
+msgid "Registration failure: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:206
 #, python-format
 msgid "registration answer: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0077.py:99
+#: sat/plugins/plugin_xep_0077.py:215
 msgid "Username already exists, please choose an other one"
 msgstr ""
 
-#: src/plugins/plugin_xep_0077.py:108
-#, python-format
-msgid "Asking registration for [%s]"
-msgstr ""
-
-#: src/plugins/plugin_xep_0085.py:53
+#: sat/plugins/plugin_xep_0077.py:229
+msgid "Asking registration for {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0085.py:55
 msgid "Implementation of Chat State Notifications Protocol"
 msgstr ""
 
-#: src/plugins/plugin_xep_0085.py:93
+#: sat/plugins/plugin_xep_0085.py:97
 msgid "Enable chat state notifications"
 msgstr ""
 
-#: src/plugins/plugin_xep_0085.py:97
+#: sat/plugins/plugin_xep_0085.py:101
 msgid "Chat State Notifications plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0092.py:41
+#: sat/plugins/plugin_xep_0092.py:42
 msgid "Implementation of Software Version"
 msgstr ""
 
-#: src/plugins/plugin_xep_0092.py:48
+#: sat/plugins/plugin_xep_0092.py:48
 msgid "Plugin XEP_0092 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0092.py:111
+#: sat/plugins/plugin_xep_0092.py:119
+#, python-format
+msgid "Client name: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:121
+#, python-format
+msgid "Client version: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:123
 #, python-format
 msgid "Operating system: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0092.py:115
+#: sat/plugins/plugin_xep_0092.py:128
 msgid "Software version not available"
 msgstr ""
 
-#: src/plugins/plugin_xep_0092.py:117
+#: sat/plugins/plugin_xep_0092.py:130
 msgid "Client software version request timeout"
 msgstr ""
 
-#: src/plugins/plugin_xep_0095.py:40
+#: sat/plugins/plugin_xep_0095.py:41
 msgid "Implementation of Stream Initiation"
 msgstr ""
 
-#: src/plugins/plugin_xep_0095.py:54
+#: sat/plugins/plugin_xep_0095.py:54
 msgid "Plugin XEP_0095 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0095.py:80
+#: sat/plugins/plugin_xep_0095.py:84
 msgid "XEP-0095 Stream initiation"
 msgstr ""
 
-#: src/plugins/plugin_xep_0095.py:122
+#: sat/plugins/plugin_xep_0095.py:127
 msgid "sending stream initiation accept answer"
 msgstr ""
 
-#: src/plugins/plugin_xep_0095.py:159
+#: sat/plugins/plugin_xep_0095.py:168
 #, python-format
 msgid "Stream Session ID: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:45
+#: sat/plugins/plugin_xep_0096.py:48
 msgid "Implementation of SI File Transfer"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:53
+#: sat/plugins/plugin_xep_0096.py:55
+msgid "Stream Initiation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:58
 msgid "Plugin XEP_0096 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:119
+#: sat/plugins/plugin_xep_0096.py:129
 msgid "XEP-0096 file transfer requested"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:337
+#: sat/plugins/plugin_xep_0096.py:377
 msgid "The contact {} has refused your file"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:338
+#: sat/plugins/plugin_xep_0096.py:378
 msgid "File refused"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:341
+#: sat/plugins/plugin_xep_0096.py:381
 msgid "Error during file transfer"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:342
-#, python-brace-format
+#: sat/plugins/plugin_xep_0096.py:382
 msgid ""
 "Something went wrong during the file transfer session initialisation: "
 "{reason}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:343
+#: sat/plugins/plugin_xep_0096.py:385
 msgid "File transfer error"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:351
-#, python-brace-format
+#: sat/plugins/plugin_xep_0096.py:394
 msgid "transfer {sid} successfuly finished [{profile}]"
 msgstr ""
 
-#: src/plugins/plugin_xep_0096.py:357
-#, python-brace-format
+#: sat/plugins/plugin_xep_0096.py:402
 msgid "transfer {sid} failed [{profile}]: {reason}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:36
+#: sat/plugins/plugin_xep_0100.py:37
 msgid "Implementation of Gateways protocol"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:39
-msgid ""
-"Be careful ! Gateways allow you to use an external IM (legacy IM), so you "
-"can see your contact as XMPP contacts.\n"
-"But when you do this, all your messages go throught the external legacy IM "
-"server, it is a huge privacy issue (i.e.: all your messages throught the "
-"gateway can be monitored, recorded, analysed by the external server, most of "
-"time a private company)."
-msgstr ""
-
-#: src/plugins/plugin_xep_0100.py:44
+#: sat/plugins/plugin_xep_0100.py:40
+msgid ""
+"Be careful ! Gateways allow you to use an external IM (legacy IM), so you"
+" can see your contact as XMPP contacts.\n"
+"But when you do this, all your messages go throught the external legacy "
+"IM server, it is a huge privacy issue (i.e.: all your messages throught "
+"the gateway can be monitored, recorded, analysed by the external server, "
+"most of time a private company)."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:48
 msgid "Internet Relay Chat"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:45
+#: sat/plugins/plugin_xep_0100.py:49
 msgid "XMPP"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:46
+#: sat/plugins/plugin_xep_0100.py:50
 msgid "Tencent QQ"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:47
+#: sat/plugins/plugin_xep_0100.py:51
 msgid "SIP/SIMPLE"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:48
+#: sat/plugins/plugin_xep_0100.py:52
 msgid "ICQ"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:49
+#: sat/plugins/plugin_xep_0100.py:53
 msgid "Yahoo! Messenger"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:50
+#: sat/plugins/plugin_xep_0100.py:54
 msgid "Gadu-Gadu"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:51
+#: sat/plugins/plugin_xep_0100.py:55
 msgid "AOL Instant Messenger"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:52
+#: sat/plugins/plugin_xep_0100.py:56
 msgid "Windows Live Messenger"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:59
+#: sat/plugins/plugin_xep_0100.py:62
 msgid "Gateways plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:66
+#: sat/plugins/plugin_xep_0100.py:84
 msgid "Gateways"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:66
+#: sat/plugins/plugin_xep_0100.py:87
 msgid "Find gateways"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:84
+#: sat/plugins/plugin_xep_0100.py:108
 #, python-format
 msgid "Gateways manager (%s)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:92
+#: sat/plugins/plugin_xep_0100.py:121
 #, python-format
 msgid "Failed (%s)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:105
+#: sat/plugins/plugin_xep_0100.py:134
 msgid "Use external XMPP server"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:107
+#: sat/plugins/plugin_xep_0100.py:136
 msgid "Go !"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:114
+#: sat/plugins/plugin_xep_0100.py:143
 msgid "No gateway index selected"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:128
+#: sat/plugins/plugin_xep_0100.py:158
 #, python-format
 msgid ""
 "INTERNAL ERROR: identity category should always be \"gateway\" in "
 "_getTypeString, got \"%s\""
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:132
+#: sat/plugins/plugin_xep_0100.py:166
 msgid "Unknown IM"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:136
+#: sat/plugins/plugin_xep_0100.py:170
 msgid "Registration successful, doing the rest"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:159
+#: sat/plugins/plugin_xep_0100.py:195
 msgid "Timeout"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:170
+#: sat/plugins/plugin_xep_0100.py:211
 #, python-format
 msgid "Found gateway [%(jid)s]: %(identity_name)s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:173
+#: sat/plugins/plugin_xep_0100.py:222
 #, python-format
 msgid "Skipping [%(jid)s] which is not a gateway"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:180
+#: sat/plugins/plugin_xep_0100.py:231
 msgid "No gateway found"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:185
+#: sat/plugins/plugin_xep_0100.py:236
 #, python-format
 msgid "item found: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0100.py:206
+#: sat/plugins/plugin_xep_0100.py:260
 #, python-format
 msgid "find gateways (target = %(target)s, profile = %(profile)s)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0115.py:48
+#: sat/plugins/plugin_xep_0106.py:38
+msgid "(Un)escape JID to use disallowed chars in local parts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:50
 msgid "Implementation of entity capabilities"
 msgstr ""
 
-#: src/plugins/plugin_xep_0115.py:56
+#: sat/plugins/plugin_xep_0115.py:58
 msgid "Plugin XEP_0115 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0115.py:73
+#: sat/plugins/plugin_xep_0115.py:73
 msgid "Caps optimisation enabled"
 msgstr ""
 
-#: src/plugins/plugin_xep_0115.py:76
+#: sat/plugins/plugin_xep_0115.py:76
 msgid "Caps optimisation not available"
 msgstr ""
 
-#: src/plugins/plugin_xep_0115.py:143
+#: sat/plugins/plugin_xep_0115.py:154
 #, python-format
 msgid "Received invalid capabilities tag: %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0115.py:153
-#, python-format
-msgid ""
-"Unknown hash method for entity capabilities: [%(hash_method)s] (entity: "
-"%(jid)s, node: %(node)s)"
-msgstr ""
-
-#: src/plugins/plugin_xep_0115.py:158
-#, python-format
+#: sat/plugins/plugin_xep_0115.py:170
+msgid ""
+"Unknown hash method for entity capabilities: [{hash_method}] (entity: "
+"{entity_jid}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:183
 msgid ""
 "Computed hash differ from given hash:\n"
-"given: [%(given_hash)s]\n"
-"computed: [%(computed_hash)s]\n"
-"(entity: %(jid)s, node: %(node)s)"
-msgstr ""
-
-#: src/plugins/plugin_xep_0115.py:164
-#, python-brace-format
+"given: [{given}]\n"
+"computed: [{computed}]\n"
+"(entity: {entity_jid}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:205
 msgid "Couldn't retrieve disco info for {jid}: {error}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0163.py:40
+#: sat/plugins/plugin_xep_0163.py:42
 msgid "Implementation of Personal Eventing Protocol"
 msgstr ""
 
-#: src/plugins/plugin_xep_0163.py:47
+#: sat/plugins/plugin_xep_0163.py:48
 msgid "PEP plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0163.py:114
+#: sat/plugins/plugin_xep_0163.py:131
 #, python-format
 msgid "Trying to send personal event with an unknown profile key [%s]"
 msgstr ""
 
-#: src/plugins/plugin_xep_0163.py:117
+#: sat/plugins/plugin_xep_0163.py:136
 msgid "Trying to send personal event for an unknown type"
 msgstr ""
 
-#: src/plugins/plugin_xep_0163.py:123
+#: sat/plugins/plugin_xep_0163.py:142
 msgid "No item found"
 msgstr ""
 
-#: src/plugins/plugin_xep_0163.py:128
+#: sat/plugins/plugin_xep_0163.py:149
 msgid "Can't find mood element in mood event"
 msgstr ""
 
-#: src/plugins/plugin_xep_0163.py:132
+#: sat/plugins/plugin_xep_0163.py:153
 msgid "No mood found"
 msgstr ""
 
-#: src/plugins/plugin_xep_0166.py:48
-#, python-brace-format
+#: sat/plugins/plugin_xep_0166.py:50
 msgid "{entity} want to start a jingle session with you, do you accept ?"
 msgstr ""
 
-#: src/plugins/plugin_xep_0166.py:57
+#: sat/plugins/plugin_xep_0166.py:60
 msgid "Implementation of Jingle"
 msgstr ""
 
-#: src/plugins/plugin_xep_0166.py:91
+#: sat/plugins/plugin_xep_0166.py:98
 msgid "plugin Jingle initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0166.py:429
+#: sat/plugins/plugin_xep_0166.py:156
+msgid "Error while terminating session: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:395
+msgid "You can't do a jingle session with yourself"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:511
 msgid "Confirm Jingle session"
 msgstr ""
 
-#: src/plugins/plugin_xep_0184.py:61
+#: sat/plugins/plugin_xep_0184.py:71
 msgid "Implementation of Message Delivery Receipts"
 msgstr ""
 
-#: src/plugins/plugin_xep_0184.py:85
+#: sat/plugins/plugin_xep_0184.py:96
 msgid "Enable message delivery receipts"
 msgstr ""
 
-#: src/plugins/plugin_xep_0184.py:89
+#: sat/plugins/plugin_xep_0184.py:100
 msgid "Plugin XEP_0184 (message delivery receipts) initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0184.py:114
+#: sat/plugins/plugin_xep_0184.py:136
 msgid "[XEP-0184] Request acknowledgment for message id {}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0184.py:147
+#: sat/plugins/plugin_xep_0184.py:180
 msgid "[XEP-0184] Receive acknowledgment for message id {}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0184.py:154
+#: sat/plugins/plugin_xep_0184.py:190
 msgid "[XEP-0184] Delete waiting acknowledgment for message id {}"
 msgstr ""
 
-#: src/plugins/plugin_xep_0203.py:43
+#: sat/plugins/plugin_xep_0198.py:46
+msgid "Implementation of Stream Management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:134
+msgid "Plugin Stream Management initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:144
+msgid "Invalid ack_timeout value, please check your configuration"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:147
+msgid "Ack timeout disabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:149
+msgid "Ack timeout set to {timeout}s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:171
+msgid ""
+"Your server doesn't support stream management ({namespace}), this is used"
+" to improve connection problems detection (like network outages). Please "
+"ask your server administrator to enable this feature."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:302
+msgid ""
+"Connection failed using location given by server (host: {host}, port: "
+"{port}), switching to normal host and port (host: {normal_host}, port: "
+"{normal_port})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:317
+msgid "Incorrect <enabled/> element received, no \"id\" attribute"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:319
+msgid ""
+"You're server doesn't support session resuming with stream management, "
+"please contact your server administrator to enable it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:341
+msgid "Invalid location received: {location}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:359
+msgid "Invalid \"max\" attribute"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:361
+msgid "Using default session max value ({max_s} s)."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:363
+msgid "Stream Management enabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:367
+msgid "Stream Management enabled, with a resumption time of {res_m:.2f} min"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:382
+msgid ""
+"Stream session resumed (disconnected for {d_time} s, {count} stanza(s) "
+"resent)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:395
+msgid "Can't use stream management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:399
+msgid "{msg}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:408
+msgid "stream resumption not possible, restarting full session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:495
+msgid "Server returned invalid ack element, disabling stream management: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:501
+msgid "Server acked more stanzas than we have sent, disabling stream management."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:511
+msgid "Ack was not received in time, aborting connection"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:39
+msgid "Implementation of XMPP Ping"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:49
+msgid "XMPP Ping plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:109
+msgid "ping error ({err_msg}). Response time: {time} s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:123
+msgid "Invalid jid: \"{entity_jid}\""
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:134
+msgid "XMPP PING received from {from_jid} [{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0203.py:45
 msgid "Implementation of Delayed Delivery"
 msgstr ""
 
-#: src/plugins/plugin_xep_0203.py:50
+#: sat/plugins/plugin_xep_0203.py:51
 msgid "Delayed Delivery plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0231.py:39
+#: sat/plugins/plugin_xep_0231.py:48
 msgid "Implementation of bits of binary (used for small images/files)"
 msgstr ""
 
-#: src/plugins/plugin_xep_0231.py:48
+#: sat/plugins/plugin_xep_0231.py:59
 msgid "plugin Bits of Binary initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0234.py:48
+#: sat/plugins/plugin_xep_0234.py:54
 msgid "Implementation of Jingle File Transfer"
 msgstr ""
 
-#: src/plugins/plugin_xep_0234.py:57
+#: sat/plugins/plugin_xep_0234.py:67
+msgid "file transfer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:70
 msgid "plugin Jingle File Transfer initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:55
+#: sat/plugins/plugin_xep_0234.py:380
+msgid "hash_algo must be set if file_hash is set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:385
+msgid "file_hash must be set if hash_algo is set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:419
+msgid "only the following keys are allowed in extra: {keys}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:454
+msgid "you need to provide at least name or file hash"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:524
+msgid "File continue is not implemented yet"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:55
 msgid "Implementation of Direct MUC Invitations"
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:75
+#: sat/plugins/plugin_xep_0249.py:75
 msgid "Auto-join MUC on invitation"
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:82
+#: sat/plugins/plugin_xep_0249.py:86
 msgid "Plugin XEP_0249 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:131
+#: sat/plugins/plugin_xep_0249.py:140
 #, python-format
 msgid "Invitation accepted for room %(room)s [%(profile)s]"
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:144
+#: sat/plugins/plugin_xep_0249.py:155
+msgid "invalid invitation received: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:159
 #, python-format
 msgid "Invitation received for room %(room)s [%(profile)s]"
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:146
-msgid "Error while parsing invitation"
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:155
+#: sat/plugins/plugin_xep_0249.py:170
 msgid "Invitation silently discarded because user is already in the room."
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:163
+#: sat/plugins/plugin_xep_0249.py:181
 #, python-format
 msgid ""
 "An invitation from %(user)s to join the room %(room)s has been declined "
 "according to your personal settings."
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:164 src/plugins/plugin_xep_0249.py:168
+#: sat/plugins/plugin_xep_0249.py:185 sat/plugins/plugin_xep_0249.py:192
 msgid "MUC invitation"
 msgstr ""
 
-#: src/plugins/plugin_xep_0249.py:167
-#, python-format
-msgid ""
-"You have been invited by %(user)s to join the room %(room)s. Do you accept?"
-msgstr ""
-
-#: src/plugins/plugin_xep_0249.py:187
-#, python-brace-format
-msgid ""
-"You must provide a valid JID to invite, like in '/invite contact@{host}'"
-msgstr ""
-
-#: src/plugins/plugin_xep_0260.py:49
+#: sat/plugins/plugin_xep_0249.py:188
+#, python-format
+msgid ""
+"You have been invited by %(user)s to join the room %(room)s. Do you "
+"accept?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:215
+msgid "You must provide a valid JID to invite, like in '/invite contact@{host}'"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0260.py:51
 msgid "Implementation of Jingle SOCKS5 Bytestreams"
 msgstr ""
 
-#: src/plugins/plugin_xep_0260.py:63
+#: sat/plugins/plugin_xep_0260.py:64
 msgid "plugin Jingle SOCKS5 Bytestreams"
 msgstr ""
 
-#: src/plugins/plugin_xep_0261.py:45
+#: sat/plugins/plugin_xep_0261.py:47
 msgid "Implementation of Jingle In-Band Bytestreams"
 msgstr ""
 
-#: src/plugins/plugin_xep_0261.py:53
+#: sat/plugins/plugin_xep_0261.py:55
 msgid "plugin Jingle In-Band Bytestreams"
 msgstr ""
 
-#: src/plugins/plugin_xep_0277.py:57
+#: sat/plugins/plugin_xep_0264.py:67
+msgid "Thumbnails handling"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0264.py:79
+msgid "Plugin XEP_0264 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:71
 msgid "Implementation of microblogging Protocol"
 msgstr ""
 
-#: src/plugins/plugin_xep_0277.py:69
+#: sat/plugins/plugin_xep_0277.py:83
 msgid "Microblogging plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0277.py:171
+#: sat/plugins/plugin_xep_0277.py:286
 msgid "Content of type XHTML must declare its namespace!"
 msgstr ""
 
-#: src/plugins/plugin_xep_0277.py:360
+#: sat/plugins/plugin_xep_0277.py:557
 msgid "Can't have xhtml and rich content at the same time"
 msgstr ""
 
-#: src/plugins/plugin_xep_0277.py:636
-msgid "Can't find profile's jid"
-msgstr ""
-
-#: src/plugins/plugin_xep_0277.py:642
+#: sat/plugins/plugin_xep_0277.py:1041
 #, python-format
 msgid "Microblog node has now access %s"
 msgstr ""
 
-#: src/plugins/plugin_xep_0277.py:646
+#: sat/plugins/plugin_xep_0277.py:1045
 msgid "Can't set microblog access"
 msgstr ""
 
-#: src/plugins/plugin_xep_0280.py:38
+#: sat/plugins/plugin_xep_0280.py:39
 msgid "Message carbons"
 msgstr ""
 
-#: src/plugins/plugin_xep_0280.py:49
+#: sat/plugins/plugin_xep_0280.py:50
 msgid "Implementation of Message Carbons"
 msgstr ""
 
-#: src/plugins/plugin_xep_0280.py:74
+#: sat/plugins/plugin_xep_0280.py:75
 msgid "Plugin XEP_0280 initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0280.py:99
+#: sat/plugins/plugin_xep_0280.py:102
 msgid "Not activating message carbons as requested in params"
 msgstr ""
 
-#: src/plugins/plugin_xep_0280.py:104
+#: sat/plugins/plugin_xep_0280.py:107
 msgid "server doesn't handle message carbons"
 msgstr ""
 
-#: src/plugins/plugin_xep_0280.py:106
+#: sat/plugins/plugin_xep_0280.py:109
 msgid "message carbons available, enabling it"
 msgstr ""
 
-#: src/plugins/plugin_xep_0280.py:114
+#: sat/plugins/plugin_xep_0280.py:117
 msgid "message carbons activated"
 msgstr ""
 
-#: src/plugins/plugin_xep_0297.py:44
+#: sat/plugins/plugin_xep_0297.py:44
 msgid "Implementation of Stanza Forwarding"
 msgstr ""
 
-#: src/plugins/plugin_xep_0297.py:52
+#: sat/plugins/plugin_xep_0297.py:52
 msgid "Stanza Forwarding plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0300.py:42
+#: sat/plugins/plugin_xep_0300.py:45
 msgid "Management of cryptographic hashes"
 msgstr ""
 
-#: src/plugins/plugin_xep_0300.py:60
+#: sat/plugins/plugin_xep_0300.py:66
 msgid "plugin Hashes initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0313.py:48
+#: sat/plugins/plugin_xep_0313.py:51
 msgid "Implementation of Message Archive Management"
 msgstr ""
 
-#: src/plugins/plugin_xep_0313.py:55
+#: sat/plugins/plugin_xep_0313.py:64
 msgid "Message Archive Management plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0334.py:44
+#: sat/plugins/plugin_xep_0313.py:92
+msgid "It seems that we have no MAM history yet"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:126
+msgid "missing \"to\" attribute in forwarded message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:137
+msgid "missing \"from\" attribute in forwarded message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:140
+msgid ""
+"was expecting a message sent by our jid, but this one if from {from_jid},"
+" ignoring\n"
+"{xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:158
+msgid "We have received no message while offline"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:160
+msgid "We have received {num_mess} message(s) while offline."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:50
+msgid "Implementation of File Information Sharing"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:86
+msgid "path change chars found in name [{name}], hack attempt?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:107
+msgid "path can only be set on path nodes"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:141
+msgid "a node can't have several parents"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:210
+msgid ""
+"parent dir (\"..\") found in path, hack attempt? path is {path} "
+"[{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:271
+msgid "File Information Sharing initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:394
+msgid "invalid path: {path}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:428
+msgid "{peer_jid} requested a file (s)he can't access [{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:461
+msgid "error while retrieving files: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:513
+msgid "ignoring invalid unicode name ({name}): {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:534
+msgid "unexpected type: {type}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:573
+msgid "unknown node type: {type}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:711
+msgid "unexpected element, ignoring: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1184
+msgid "This path doesn't exist!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1186
+msgid "A path need to be specified"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1188
+msgid "access must be a dict"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1200
+msgid "Can't find a proper name"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1211
+msgid ""
+"A directory with this name is already shared, renamed to {new_name} "
+"[{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0334.py:43
 msgid "Implementation of Message Processing Hints"
 msgstr ""
 
-#: src/plugins/plugin_xep_0334.py:45
-msgid ""
-"             Frontends can use HINT_* constants in mess_data['extra'] in a "
-"serialized 'hints' dict.\n"
-"             Internal plugins can use directly addHint([HINT_* constant]).\n"
+#: sat/plugins/plugin_xep_0334.py:45
+msgid ""
+"             Frontends can use HINT_* constants in mess_data['extra'] in "
+"a serialized 'hints' dict.\n"
+"             Internal plugins can use directly addHint([HINT_* "
+"constant]).\n"
 "             Will set mess_data['extra']['history'] to 'skipped' when no "
 "store is requested and message is not saved in history."
 msgstr ""
 
-#: src/plugins/plugin_xep_0334.py:63
+#: sat/plugins/plugin_xep_0334.py:65
 msgid "Message Processing Hints plugin initialization"
 msgstr ""
 
-#: src/plugins/plugin_xep_0363.py:52
+#: sat/plugins/plugin_xep_0346.py:54
+msgid "Handle Pubsub data schemas"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:60
+msgid "PubSub Schema initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:208
+msgid "unspecified schema, we need to request it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:212
+msgid ""
+"no schema specified, and this node has no schema either, we can't "
+"construct the data form"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:233
+msgid "Invalid Schema: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:246
+msgid "nodeIndentifier needs to be set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:310
+msgid "empty node is not allowed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:354
+msgid "default_node must be set if nodeIdentifier is not set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:457
+msgid "field {name} doesn't exist, ignoring it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:551
+msgid "Can't parse date field: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:652
+msgid "Can't get previous item, update ignored: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:661
+msgid "Can't parse previous item, update ignored: data form not found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:719
+msgid "default_node must be set if node is not set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:728
+msgid "if extra[\"update\"] is set, item_id must be set too"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:35
+msgid ""
+"Notify server when frontend is not actively used, to limit traffic and "
+"save bandwidth and battery life"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:45
+msgid "Client State Indication plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:63
+msgid "Client State Indication is available on this server"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:67
+msgid ""
+"Client State Indication is not available on this server, some bandwidth "
+"optimisations can't be used."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:46
+msgid "Implementation of Jingle Message Initiation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:53
+msgid "plugin {name} initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:122
+msgid "Message initiation with {peer_jid} timed out"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:166
+msgid ""
+"Somebody not in your contact list ({peer_jid}) wants to do a "
+"\"{human_name}\" session with you, this would leak your presence and "
+"possibly you IP (internet localisation), do you accept?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:171
+msgid "Invitation from an unknown contact"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:211
+msgid "no pending session found with id {session_id}, did it timed out?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0359.py:40
+msgid "Implementation of Unique and Stable Stanza IDs"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0359.py:49
+msgid "Unique and Stable Stanza IDs plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:51
 msgid "Implementation of HTTP File Upload"
 msgstr ""
 
-#: src/plugins/plugin_xep_0363.py:91
+#: sat/plugins/plugin_xep_0363.py:83
 msgid "plugin HTTP File Upload initialization"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:36 src/stdui/ui_contact_list.py:165
-#: src/stdui/ui_contact_list.py:239
+#: sat/plugins/plugin_xep_0363.py:200
+msgid "Can't get upload slot: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:265
+msgid "upload failed: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:349
+msgid "Invalid header element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:355
+msgid "Ignoring unauthorised header \"{name}\": {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:400
+msgid "no service can handle HTTP Upload request: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:35
+msgid "Implementation of Explicit Message Encryption"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:94
+msgid ""
+"Message from {sender} is encrypted with {algorithm} and we can't decrypt "
+"it."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:96
+msgid ""
+"User {sender} sent you an encrypted message (encrypted with {algorithm}),"
+" and we can't decrypt it."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:62
+msgid "Implementation of OMEMO"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:440
+msgid "Security"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:442
+msgid "OMEMO default trust policy"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:443
+msgid "Manual trust (more secure)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:445
+msgid "Blind Trust Before Verification (more user friendly)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:449
+msgid "OMEMO plugin initialization (omemo module v{version})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:453
+msgid ""
+"Your version of omemo module is too old: {v[0]}.{v[1]}.{v[2]} is minimum "
+"required, please update."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:488
+msgid "You need to have OMEMO encryption activated to reset the session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:503
+msgid "OMEMO session has been reset"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:551
+msgid "device {device} from {peer_jid} is not an auto-trusted device anymore"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:612
+msgid "Can't find bundle for device {device_id} of user {bare_jid}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:642
+msgid "OMEMO trust management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:645
+msgid ""
+"This is OMEMO trusting system. You'll see below the devices of your "
+"contacts, and a checkbox to trust them or not. A trusted device can read "
+"your messages in plain text, so be sure to only validate devices that you"
+" are sure are belonging to your contact. It's better to do this when you "
+"are next to your contact and her/his device, so you can check the "
+"\"fingerprint\" (the number next to the device) yourself. Do *not* "
+"validate a device if the fingerprint is wrong!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:655
+msgid "This device ID"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:657
+msgid "This device fingerprint"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:669
+msgid "Automatically trust new devices?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:683
+msgid "Contact"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:685
+msgid "Device ID"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:691
+msgid "Trust this device?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:696
+msgid "(automatically trusted)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:724
+msgid "We have no identity for this device yet, let's generate one"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:749
+msgid "Saving public bundle for this device ({device_id})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:770
+msgid "OMEMO devices list is stored in more that one items, this is not expected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:776
+msgid "no list element found in OMEMO devices list"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:782
+msgid "device element is missing \"id\" attribute: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:785
+msgid "invalid device id: {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:804
+msgid "there is no node to handle OMEMO devices"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:826
+msgid "Can't set devices: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:850
+msgid "Bundle missing for device {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:855
+msgid "Can't get bundle for device {device_id}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:859
+msgid ""
+"no item found in node {node}, can't get public bundle for device "
+"{device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:864
+msgid "more than one item found in {node}, this is not expected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:878
+msgid "invalid bundle for device {device_id}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:902
+msgid "error while decoding key for device {device_id}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:916
+msgid "updating bundle for {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:949
+msgid "Can't set bundle: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:969
+msgid "Our own device is missing from devices list, fixing it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:988
+msgid ""
+"Not all destination devices are trusted, unknown devices will be blind "
+"trusted due to the OMEMO Blind Trust Before Verification policy. If you "
+"want a more secure workflow, please activate \"manual\" OMEMO policy in "
+"settings' \"Security\" tab.\n"
+"Following fingerprint have been automatically trusted:\n"
+"{devices}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1010
+msgid ""
+"Not all destination devices are trusted, we can't encrypt message in such"
+" a situation. Please indicate if you trust those devices or not in the "
+"trust manager before we can send this message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1053
+msgid "discarding untrusted device {device_id} with key {device_key} for {entity}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1095
+msgid ""
+"Can't retrieve bundle for device(s) {devices} of entity {peer}, the "
+"message will not be readable on this/those device(s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1100
+msgid ""
+"You're destinee {peer} has missing encryption data on some of his/her "
+"device(s) (bundle on device {devices}), the message won't  be readable on"
+" this/those device."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1151
+msgid "Too many iterations in encryption loop"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1180
+msgid "Can't encrypt message for {entities}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1270
+msgid "Invalid OMEMO encrypted stanza, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1276
+msgid "Invalid OMEMO encrypted stanza, missing sender device ID, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1284
+msgid ""
+"This OMEMO encrypted stanza has not been encrypted for our device "
+"(device_id: {device_id}, fingerprint: {fingerprint}): {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1290
+msgid ""
+"An OMEMO message from {sender} has not been encrypted for our device, we "
+"can't decrypt it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1297
+msgid "Invalid recipient ID: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1330
+msgid ""
+"Can't decrypt message: {reason}\n"
+"{xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1332
+msgid "An OMEMO message from {sender} can't be decrypted: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1364
+msgid ""
+"Our message with UID {uid} has not been received in time, it has probably"
+" been lost. The message was: {msg!r}"
+msgstr ""
+
+#: sat/plugins/plugin_app_manager_docker/__init__.py:38
+msgid "Applications Manager for Docker"
+msgstr ""
+
+#: sat/plugins/plugin_app_manager_docker/__init__.py:48
+msgid "Docker App Manager initialization"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:39 sat/stdui/ui_contact_list.py:42
+#: sat/stdui/ui_contact_list.py:190 sat/stdui/ui_contact_list.py:276
 msgid "Add contact"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:37 src/stdui/ui_contact_list.py:183
+#: sat/stdui/ui_contact_list.py:45 sat/stdui/ui_contact_list.py:48
+#: sat/stdui/ui_contact_list.py:209
 msgid "Update contact"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:38
+#: sat/stdui/ui_contact_list.py:51 sat/stdui/ui_contact_list.py:54
 msgid "Remove contact"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:135
+#: sat/stdui/ui_contact_list.py:157
 msgid "Select in which groups your contact is:"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:148
+#: sat/stdui/ui_contact_list.py:172
 msgid "Add group"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:150
+#: sat/stdui/ui_contact_list.py:174
 msgid "Add"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:166
+#: sat/stdui/ui_contact_list.py:191
 msgid "New contact identifier (JID):"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:178
+#: sat/stdui/ui_contact_list.py:203
 msgid "Nothing to update"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:179 src/stdui/ui_contact_list.py:197
+#: sat/stdui/ui_contact_list.py:204 sat/stdui/ui_contact_list.py:223
 msgid "Your contact list is empty."
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:184
+#: sat/stdui/ui_contact_list.py:210
 msgid "Which contact do you want to update?"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:196
+#: sat/stdui/ui_contact_list.py:222
 msgid "Nothing to delete"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:200
+#: sat/stdui/ui_contact_list.py:228
 msgid "Who do you want to remove from your contacts?"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:219
+#: sat/stdui/ui_contact_list.py:251
 msgid "Delete contact"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:220
+#: sat/stdui/ui_contact_list.py:253
 #, python-format
 msgid "Are you sure you want to remove %s from your contact list?"
 msgstr ""
 
-#: src/stdui/ui_contact_list.py:240
+#: sat/stdui/ui_contact_list.py:277
 #, python-format
 msgid "Please enter a valid JID (like \"contact@%s\"):"
 msgstr ""
 
-#: src/stdui/ui_profile_manager.py:52
+#: sat/stdui/ui_profile_manager.py:62
 msgid "Profile password for {}"
 msgstr ""
 
-#: src/stdui/ui_profile_manager.py:61 src/stdui/ui_profile_manager.py:98
+#: sat/stdui/ui_profile_manager.py:72 sat/stdui/ui_profile_manager.py:119
 msgid "Connection error"
 msgstr ""
 
-#: src/stdui/ui_profile_manager.py:66
+#: sat/stdui/ui_profile_manager.py:76
+#: sat_frontends/quick_frontend/quick_profile_manager.py:171
+msgid "Internal error"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:77
 msgid "Internal error: {}"
 msgstr ""
 
-#: src/stdui/ui_profile_manager.py:99
+#: sat/stdui/ui_profile_manager.py:121
 #, python-format
 msgid "Can't connect to %s. Please check your connection details."
 msgstr ""
 
-#: src/stdui/ui_profile_manager.py:103
+#: sat/stdui/ui_profile_manager.py:127
 #, python-format
 msgid "XMPP password for %(profile)s%(counter)s"
 msgstr ""
 
-#: src/stdui/ui_profile_manager.py:105
+#: sat/stdui/ui_profile_manager.py:135
 #, python-format
 msgid ""
 "Can't connect to %s. Please check your connection details or try with "
 "another password."
 msgstr ""
 
-#: src/test/constants.py:45
+#: sat/test/constants.py:57
 msgid "Enable unibox"
 msgstr ""
 
-#: src/test/constants.py:46
+#: sat/test/constants.py:58
 msgid "'Wysiwyg' edition"
 msgstr ""
 
-#: src/test/test_plugin_misc_room_game.py:43
+#: sat/test/test_plugin_misc_room_game.py:43
 msgid "Dummy plugin to test room game"
 msgstr ""
 
-#: src/tools/config.py:51
+#: sat/tools/config.py:53
 #, python-format
 msgid "Testing file %s"
 msgstr ""
 
-#: src/tools/config.py:68
-#, python-format
-msgid ""
-"Config auto-update: %(option)s set to %(value)s in the file %(config_file)s"
-msgstr ""
-
-#: src/tools/config.py:77
-msgid "Can't read main config !"
-msgstr ""
-
-#: src/tools/trigger.py:63
+#: sat/tools/config.py:72
+msgid "Config auto-update: {option} set to {value} in the file {config_file}."
+msgstr ""
+
+#: sat/tools/config.py:86
+msgid "Can't read main config: {msg}"
+msgstr ""
+
+#: sat/tools/config.py:91
+msgid "Configuration was read from: {filenames}"
+msgstr ""
+
+#: sat/tools/config.py:95
+msgid "No configuration file found, using default settings"
+msgstr ""
+
+#: sat/tools/image.py:35
+msgid "SVG support not available, please install cairosvg: {e}"
+msgstr ""
+
+#: sat/tools/trigger.py:66
 #, python-format
 msgid "There is already a bound priority [%s]"
 msgstr ""
 
-#: src/tools/trigger.py:65
+#: sat/tools/trigger.py:69
 #, python-format
 msgid "There is already a trigger with the same priority [%s]"
 msgstr ""
 
-#: src/tools/xml_tools.py:60
+#: sat/tools/video.py:38
+msgid "ffmpeg executable not found, video thumbnails won't be available"
+msgstr ""
+
+#: sat/tools/video.py:56
+msgid "ffmpeg executable is not available, can't generate video thumbnail"
+msgstr ""
+
+#: sat/tools/xml_tools.py:86
 msgid "Fixed field has neither value nor label, ignoring it"
 msgstr ""
 
-#: src/tools/xml_tools.py:296
+#: sat/tools/xml_tools.py:485
 msgid "INTERNAL ERROR: parameters xml not valid"
 msgstr ""
 
-#: src/tools/xml_tools.py:305
+#: sat/tools/xml_tools.py:495
 msgid "INTERNAL ERROR: params categories must have a name"
 msgstr ""
 
-#: src/tools/xml_tools.py:314
+#: sat/tools/xml_tools.py:505
 msgid "INTERNAL ERROR: params must have a name"
 msgstr ""
 
-#: src/tools/xml_tools.py:357
+#: sat/tools/xml_tools.py:557
 msgid "The 'options' tag is not allowed in parameter of type 'list'!"
 msgstr ""
 
-#: src/tools/xml_tools.py:433
+#: sat/tools/xml_tools.py:655
 msgid "TabElement must be a child of TabsContainer"
 msgstr ""
 
-#: src/tools/xml_tools.py:532
+#: sat/tools/xml_tools.py:760
 msgid "Can't set row index if auto_index is True"
 msgstr ""
 
-#: src/tools/xml_tools.py:645
+#: sat/tools/xml_tools.py:893
 msgid "either items or columns need do be filled"
 msgstr ""
 
-#: src/tools/xml_tools.py:658
+#: sat/tools/xml_tools.py:907
 msgid "Headers lenght doesn't correspond to columns"
 msgstr ""
 
-#: src/tools/xml_tools.py:704
+#: sat/tools/xml_tools.py:954
 msgid "Incorrect number of items in list"
 msgstr ""
 
-#: src/tools/xml_tools.py:862
+#: sat/tools/xml_tools.py:978
+msgid "A widget with the name \"{name}\" already exists."
+msgstr ""
+
+#: sat/tools/xml_tools.py:1171
 msgid "Value must be an integer"
 msgstr ""
 
-#: src/tools/xml_tools.py:877
+#: sat/tools/xml_tools.py:1186
 msgid "Value must be 0, 1, false or true"
 msgstr ""
 
-#: src/tools/xml_tools.py:927
+#: sat/tools/xml_tools.py:1249
+msgid ""
+"\"multi\" flag and \"selected\" option are not compatible with "
+"\"noselect\" flag"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1258
 msgid "empty \"options\" list"
 msgstr ""
 
-#: src/tools/xml_tools.py:929 src/tools/xml_tools.py:963
+#: sat/tools/xml_tools.py:1277 sat/tools/xml_tools.py:1311
 msgid "invalid styles"
 msgstr ""
 
-#: src/tools/xml_tools.py:985
+#: sat/tools/xml_tools.py:1335
 msgid "DialogElement must be a direct child of TopElement"
 msgstr ""
 
-#: src/tools/xml_tools.py:997
+#: sat/tools/xml_tools.py:1350
 msgid "MessageElement must be a direct child of DialogElement"
 msgstr ""
 
-#: src/tools/xml_tools.py:1009
+#: sat/tools/xml_tools.py:1365
 msgid "ButtonsElement must be a direct child of DialogElement"
 msgstr ""
 
-#: src/tools/xml_tools.py:1020
+#: sat/tools/xml_tools.py:1379
 msgid "FileElement must be a direct child of DialogElement"
 msgstr ""
 
-#: src/tools/xml_tools.py:1076
+#: sat/tools/xml_tools.py:1458
 #, python-format
 msgid "Unknown panel type [%s]"
 msgstr ""
 
-#: src/tools/xml_tools.py:1078
+#: sat/tools/xml_tools.py:1460
 msgid "form XMLUI need a submit_id"
 msgstr ""
 
-#: src/tools/xml_tools.py:1080
+#: sat/tools/xml_tools.py:1462
 msgid "container argument must be a string"
 msgstr ""
 
-#: src/tools/xml_tools.py:1082
+#: sat/tools/xml_tools.py:1465
 msgid "dialog_opt can only be used with dialog panels"
 msgstr ""
 
-#: src/tools/xml_tools.py:1124
-msgid "addXXX can't be used with dialogs"
-msgstr ""
-
-#: src/tools/xml_tools.py:1182
+#: sat/tools/xml_tools.py:1492
+msgid "createWidget can't be used with dialogs"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1590
 msgid "Submit ID must be filled for this kind of dialog"
 msgstr ""
 
-#: src/tools/xml_tools.py:1209
+#: sat/tools/xml_tools.py:1618
 #, python-format
 msgid "Unknown container type [%s]"
 msgstr ""
 
-#: src/tools/xml_tools.py:1229
-#, python-format
-msgid "Invalid type [%s]"
-msgstr ""
-
-#: src/twisted/plugins/sat_plugin.py:58
-#, python-format
-msgid "%s XMPP client backend"
-msgstr ""
+#: sat/tools/xml_tools.py:1648
+msgid "Invalid type [{type_}]"
+msgstr ""
+
+#: sat/tools/common/async_process.py:86
+msgid ""
+"Can't complete {name} command (error code: {code}):\n"
+"stderr:\n"
+"{stderr}\n"
+"{stdout}\n"
+msgstr ""
+
+#: sat/tools/common/date_utils.py:76
+msgid "You can't use a direction (+ or -) and \"ago\" at the same time"
+msgstr ""
+
+#: sat/tools/common/template.py:149
+msgid "{site} can't be used as site name, it's reserved."
+msgstr ""
+
+#: sat/tools/common/template.py:157
+msgid "{theme} contain forbidden char. Following chars are forbidden: {reserved}"
+msgstr ""
+
+#: sat/tools/common/template.py:212
+msgid "Unregistered site requested: {site_to_check}"
+msgstr ""
+
+#: sat/tools/common/template.py:241
+msgid ""
+"Absolute template used while unsecure is disabled, hack attempt? "
+"Template: {template}"
+msgstr ""
+
+#: sat/tools/common/template.py:314
+msgid "Invalid attribute, please use one of \"defer\", \"async\" or \"\""
+msgstr ""
+
+#: sat/tools/common/template.py:332
+msgid "Can't find {libary} javascript library"
+msgstr ""
+
+#: sat/tools/common/template.py:389
+msgid ""
+"Can't add \"{name}\" site, it contains forbidden characters. Forbidden "
+"characters are {forbidden}."
+msgstr ""
+
+#: sat/tools/common/template.py:395
+msgid "Can't add \"{name}\" site, it should map to an absolute path"
+msgstr ""
+
+#: sat/tools/common/template.py:416
+msgid "Can't load theme settings at {path}: {e}"
+msgstr ""
+
+#: sat/tools/common/template.py:523
+msgid "Can't find template translation at {path}"
+msgstr ""
+
+#: sat/tools/common/template.py:526
+msgid "{site}Invalid locale name: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:529
+msgid "{site}loaded {lang} templates translations"
+msgstr ""
+
+#: sat/tools/common/template.py:560
+msgid "invalid locale value: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:569
+msgid "Can't find locale {locale}"
+msgstr ""
+
+#: sat/tools/common/template.py:574
+msgid "Switched to {lang}"
+msgstr ""
+
+#: sat/tools/common/template.py:774 sat_frontends/jp/cmd_event.py:134
+msgid "Can't parse date: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:801
+msgid "ignoring field \"{name}\": it doesn't exists"
+msgstr ""
+
+#: sat_frontends/jp/arg_tools.py:88
+msgid "ignoring {name}={value}, not corresponding to any argument (in USE)"
+msgstr ""
+
+#: sat_frontends/jp/arg_tools.py:95
+msgid "arg {name}={value} (in USE)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:64
+msgid ""
+"ProgressBar not available, please download it at "
+"http://pypi.python.org/pypi/progressbar\n"
+"Progress bar deactivated\n"
+"--\n"
+msgstr ""
+
+#: sat_frontends/jp/base.py:155
+msgid ""
+"Invalid value set for \"background\" ({background}), please check your "
+"settings in libervia.conf"
+msgstr ""
+
+#: sat_frontends/jp/base.py:178
+msgid "Available commands"
+msgstr ""
+
+#: sat_frontends/jp/base.py:287
+#, python-format
+msgid "Use PROFILE profile key (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:290
+msgid "Password used to connect profile, if necessary"
+msgstr ""
+
+#: sat_frontends/jp/base.py:297
+msgid "Connect the profile before doing anything else"
+msgstr ""
+
+#: sat_frontends/jp/base.py:307
+msgid "Start a profile session without connecting"
+msgstr ""
+
+#: sat_frontends/jp/base.py:313
+msgid "Show progress bar"
+msgstr ""
+
+#: sat_frontends/jp/base.py:318
+msgid "Add a verbosity level (can be used multiple times)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:323
+msgid "be quiet (only output machine readable data)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:326
+msgid "draft handling"
+msgstr ""
+
+#: sat_frontends/jp/base.py:328
+msgid "load current draft"
+msgstr ""
+
+#: sat_frontends/jp/base.py:330
+msgid "path to a draft file to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/base.py:346
+msgid "Pubsub URL (xmpp or http)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:348
+msgid "JID of the PubSub service"
+msgstr ""
+
+#: sat_frontends/jp/base.py:350
+msgid "PEP service"
+msgstr ""
+
+#: sat_frontends/jp/base.py:352 sat_frontends/jp/base.py:360
+#: sat_frontends/jp/base.py:368
+msgid " (DEFAULT: {default})"
+msgstr ""
+
+#: sat_frontends/jp/base.py:356
+msgid "node to request"
+msgstr ""
+
+#: sat_frontends/jp/base.py:358
+msgid "standard node"
+msgstr ""
+
+#: sat_frontends/jp/base.py:366
+msgid "last item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:372
+msgid "retrieve last item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:378
+msgid "items to retrieve (DEFAULT: all)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:385
+msgid "maximum number of items to get ({no_limit} to get all items)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:391
+msgid "maximum number of items to get per page (DEFAULT: 10)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:398 sat_frontends/jp/cmd_message.py:217
+msgid "find page after this item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:401 sat_frontends/jp/cmd_message.py:220
+msgid "find page before this item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:404 sat_frontends/jp/cmd_message.py:223
+msgid "index of the page to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/base.py:411
+msgid "MAM filters to use"
+msgstr ""
+
+#: sat_frontends/jp/base.py:424
+msgid "how items should be ordered"
+msgstr ""
+
+#: sat_frontends/jp/base.py:454
+msgid "there is already a default output for {type}, ignoring new one"
+msgstr ""
+
+#: sat_frontends/jp/base.py:475
+msgid "The following output options are invalid: {invalid_options}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:499
+msgid "Can't import {module_path} plugin, ignoring it: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:505
+msgid "Missing module for plugin {name}: {missing}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:520
+msgid "Invalid plugin module [{type}] {module}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:552
+msgid "Can't parse HTML page : {msg}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:558
+msgid ""
+"Could not find alternate \"xmpp:\" URI, can't find associated XMPP PubSub"
+" node/item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:576
+msgid "invalid XMPP URL: {url}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:596
+msgid "item specified in URL but not needed in command, ignoring it"
+msgstr ""
+
+#: sat_frontends/jp/base.py:612
+msgid "XMPP URL is not a pubsub one: {url}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:618
+msgid "argument -s/--service is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:620
+msgid "argument -n/--node is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:622
+msgid "argument -i/--item is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:629
+msgid "--item and --item-last can't be used at the same time"
+msgstr ""
+
+#: sat_frontends/jp/base.py:659 sat_frontends/quick_frontend/quick_app.py:370
+msgid "Can't connect to SàT backend, are you sure it's launched ?"
+msgstr ""
+
+#: sat_frontends/jp/base.py:662 sat_frontends/quick_frontend/quick_app.py:373
+msgid "Can't init bridge"
+msgstr ""
+
+#: sat_frontends/jp/base.py:666
+msgid "Error while initialising bridge: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:714
+msgid "action cancelled by user"
+msgstr ""
+
+#: sat_frontends/jp/base.py:785
+#, python-format
+msgid "%s is not a valid JID !"
+msgstr ""
+
+#: sat_frontends/jp/base.py:837
+msgid "invalid password"
+msgstr ""
+
+#: sat_frontends/jp/base.py:839
+msgid "please enter profile password:"
+msgstr ""
+
+#: sat_frontends/jp/base.py:859
+msgid "The profile [{profile}] doesn't exist"
+msgstr ""
+
+#: sat_frontends/jp/base.py:881
+msgid ""
+"Session for [{profile}] is not started, please start it before using jp, "
+"or use either --start-session or --connect option"
+msgstr ""
+
+#: sat_frontends/jp/base.py:901
+msgid ""
+"Profile [{profile}] is not connected, please connect it before using jp, "
+"or use --connect option"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1002
+msgid "select output format (default: {})"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1005
+msgid "output specific option"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1111
+msgid "file size is not known, we can't show a progress bar"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1126 sat_frontends/jp/cmd_list.py:304
+msgid "Progress: "
+msgstr ""
+
+#: sat_frontends/jp/base.py:1156
+msgid "Operation started"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1172
+msgid "Operation successfully finished"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1179
+msgid "Error while doing operation: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1189
+msgid "trying to use output when use_output has not been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:42
+msgid "create a XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:47
+msgid "jid to create"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:50
+msgid "password of the account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:55
+msgid "create a profile to use this account (default: don't create profile)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:63
+msgid "email (usage depends of XMPP server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:69
+msgid "server host (IP address or domain, default: use localhost)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:76
+msgid "server port (default: {port})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:107
+msgid "XMPP account created"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:113
+msgid "creating profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:129
+msgid "Can't create profile {profile} to associate with jid {jid}: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:142
+msgid "profile created"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:183
+msgid "change password for XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:188
+msgid "new XMPP password"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:207
+msgid "delete a XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:215
+msgid "delete account without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:236
+msgid "Account deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:34
+msgid "remote control a software"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:38
+msgid "software name"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:44
+msgid "jids allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:51
+msgid "groups allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:57
+msgid "groups that are *NOT* allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:63
+msgid "jids that are *NOT* allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:66
+msgid "loop on the commands"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:93
+msgid "No bus name found"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:96
+#, python-format
+msgid "Bus name found: [%s]"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:100
+msgid "Command found: (path:{path}, iface: {iface}) [{command}]"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:112
+msgid "run an Ad-Hoc command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:120 sat_frontends/jp/cmd_message.py:200
+msgid "jid of the service (default: profile's server"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:128
+msgid "submit form/page"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:137
+msgid "field value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:143
+msgid "node of the command (default: list commands)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:171
+msgid "list Ad-Hoc commands of a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:179
+msgid "jid of the service (default: profile's server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:202
+msgid "Ad-hoc commands"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:33
+msgid "list available applications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:45
+msgid "show applications with this status"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:72
+msgid "start an application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:78
+msgid "name of the application to start"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:98
+msgid "stop a running application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:106
+msgid "name of the application to stop"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:111
+msgid "identifier of the instance to stop"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:142
+msgid "show data exposed by a running application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:150
+msgid "name of the application to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:155
+msgid "identifier of the instance to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:189
+msgid "manage applications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:38
+msgid "retrieve avatar of an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:43 sat_frontends/jp/cmd_identity.py:42
+msgid "do no use cached values"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:46
+msgid "show avatar"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:48 sat_frontends/jp/cmd_info.py:111
+msgid "entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:87
+msgid "No avatar found."
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:103
+msgid "set avatar of the profile or an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:108
+msgid "entity whose avatar must be changed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:110
+msgid "path to the image to upload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:116
+msgid "file {path} doesn't exist!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:125
+msgid "avatar has been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:134
+msgid "avatar uploading/retrieving"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:129
+msgid "unknown syntax requested ({syntax})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:138
+msgid "title of the item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:143
+msgid "tag (category) of your item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:148
+msgid "language of the item (ISO 639 code)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:158
+msgid ""
+"enable comments (default: comments not enabled except if they already "
+"exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:168
+msgid "disable comments (will remove comments node if it exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:174
+msgid "syntax to use (default: get profile's default syntax)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:211
+msgid "publish a new blog item or update an existing one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:257
+msgid "get blog item(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:267
+msgid "microblog data key(s) to display (default: depend of verbosity)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:462
+msgid "edit an existing or new blog post"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:473
+msgid "launch a blog preview in parallel"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:478
+msgid "add \"publish: False\" to metadata"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:628
+msgid "You need lxml to edit pretty XHTML"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:662
+msgid "rename an blog item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:666 sat_frontends/jp/cmd_pubsub.py:996
+msgid "new item id to use"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:690
+msgid "preview a blog content"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:700
+msgid "use inotify to handle preview"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:706
+msgid "path to the content file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:810
+msgid "File \"{file}\" doesn't exist!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:898
+msgid "import an external blog"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:905 sat_frontends/jp/cmd_list.py:207
+msgid "importer name, nothing to display importers list"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:907
+msgid "original blog host"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:911
+msgid "do *NOT* upload images (default: do upload images)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:915
+msgid "do not upload images from this host (default: upload all images)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:920
+msgid "ignore invalide TLS certificate for uploads"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:929 sat_frontends/jp/cmd_list.py:216
+msgid "importer specific options (see importer description)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:934 sat_frontends/jp/cmd_list.py:250
+msgid ""
+"importer data location (see importer description), nothing to show "
+"importer description"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:941
+msgid "Blog upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:944
+msgid "Blog uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:965
+msgid ""
+"\n"
+"To redirect old URLs to new ones, put the following lines in your "
+"sat.conf file, in [libervia] section:\n"
+"\n"
+"{conf}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:973
+msgid "Error while uploading blog: {error_msg}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:982 sat_frontends/jp/cmd_list.py:274
+msgid "{name} argument can't be used without location argument"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:1037
+msgid "Error while trying to import a blog: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:1050
+msgid "blog/microblog management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:40
+#, python-format
+msgid "storage location (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:48
+#, python-format
+msgid "bookmarks type (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:54
+msgid "list bookmarks"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:94
+msgid "remove a bookmark"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:99 sat_frontends/jp/cmd_bookmarks.py:131
+msgid "jid (for muc bookmark) or url of to remove"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:105
+msgid "delete bookmark without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:110
+msgid "Are you sure to delete this bookmark?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:117
+msgid "can't delete bookmark: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:120
+msgid "bookmark deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:133
+msgid "bookmark name"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:134
+msgid "MUC specific options"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:135
+msgid "nickname"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:140
+msgid "join room on profile connection"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:145
+msgid "You can't use --autojoin or --nick with --type url"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:165
+msgid "bookmark successfully added"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:174
+msgid "manage bookmarks"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:49
+msgid "call a bridge method"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:54
+msgid "name of the method to execute"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:56
+msgid "argument of the method"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:79
+msgid "Error while executing {method}: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:94
+msgid "send a fake signal from backend"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:99
+msgid "name of the signal to send"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:100
+msgid "argument of the signal"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:112
+msgid "Can't send fake signal: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:123
+msgid "bridge s(t)imulation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:135
+msgid "monitor XML stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:144
+msgid "stream direction filter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:195
+msgid "print colours used with your background"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:226
+msgid "debugging tools"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:38
+msgid "show available encryption algorithms"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:45
+msgid "No encryption plugin registered!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:47
+msgid "Following encryption algorithms are available: {algos}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:68
+msgid "get encryption session data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:73
+msgid "jid of the entity to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:99
+msgid "start encrypted session with an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:105 sat_frontends/jp/cmd_message.py:77
+msgid "don't replace encryption algorithm if an other one is already used"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:108
+msgid "algorithm name (DEFAULT: choose automatically)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:111
+msgid "algorithm namespace (DEFAULT: choose automatically)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:114
+#: sat_frontends/jp/cmd_encryption.py:153
+#: sat_frontends/jp/cmd_encryption.py:178
+msgid "jid of the entity to stop encrypted session with"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:148
+msgid "stop encrypted session with an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:173
+msgid "get UI to manage trust"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:182
+msgid "algorithm name (DEFAULT: current algorithm)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:185
+msgid "algorithm namespace (DEFAULT: current algorithm)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:220
+msgid "trust manangement"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:230
+msgid "encryption sessions handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:47
+msgid "get list of registered events"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:78
+msgid "get event data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:108
+msgid "ID of the PubSub Item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:110
+msgid "date of the event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:118 sat_frontends/jp/cmd_event.py:257
+#: sat_frontends/jp/cmd_pubsub.py:129
+msgid "configuration field to set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:150
+msgid "create or replace event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:170
+msgid "Event created successfuly on node {node}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:181
+msgid "modify an existing event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:214 sat_frontends/jp/cmd_event.py:288
+msgid "get event attendance"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:219
+msgid "bare jid of the invitee"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:246
+msgid "set event attendance"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:296
+msgid "show missing people (invited but no R.S.V.P. so far)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:302
+msgid "don't show people which gave R.S.V.P."
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:371
+msgid "Attendees: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:374
+msgid " ("
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:376
+msgid "yes: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:379
+msgid ", maybe: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:383
+msgid "no: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:390
+msgid "confirmed guests: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:395
+msgid "unconfirmed guests: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:401
+msgid "total: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:408
+msgid "missing people (no reply): "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:416
+msgid "you need to use --missing if you use --no-rsvp"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:489
+msgid "invite someone to the event through email"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:568
+msgid "manage invities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:577
+msgid "event management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:50
+msgid "send a file to a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:55
+msgid "a list of file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:57 sat_frontends/jp/cmd_file.py:191
+#: sat_frontends/jp/cmd_message.py:82 sat_frontends/jp/cmd_pipe.py:42
+msgid "the destination jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:59
+msgid "make a bzip2 tarball"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:79 sat_frontends/jp/cmd_file.py:236
+#: sat_frontends/jp/cmd_file.py:330
+msgid "File copy started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:82
+msgid "File sent successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:86
+msgid "The file has been refused by your contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:88
+msgid "Error while sending file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:97
+msgid "File request sent to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:102
+msgid "Can't send file to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:109
+msgid "file {file_} doesn't exist!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:114
+msgid "{file_} is a dir! Please send files inside or use compression"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:129
+msgid "bz2 is an experimental option, use with caution"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:131
+msgid "Starting compression, please wait..."
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:138
+msgid "Adding {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:141
+msgid "Done !"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:183
+msgid "request a file from a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:195
+msgid ""
+"destination path where the file will be saved (default: "
+"[current_dir]/[name|hash])"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:204
+msgid "name of the file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:210
+msgid "hash of the file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:216
+msgid "hash algorithm use for --hash (default: sha-256)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:232 sat_frontends/jp/cmd_file.py:476
+msgid "overwrite existing file without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:239 sat_frontends/jp/cmd_file.py:333
+msgid "File received successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:243
+msgid "The file request has been refused"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:245
+msgid "Error while requesting file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:249
+msgid "at least one of --name or --hash must be provided"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:258 sat_frontends/jp/cmd_file.py:510
+msgid "File {path} already exists! Do you want to overwrite?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:261
+msgid "file request cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:280
+msgid "can't request file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:293
+msgid "wait for a file to be sent by a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:306
+msgid "jids accepted (accept everything if none is specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:312
+msgid "accept multiple files (you'll have to stop manually)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:318
+msgid "force overwritting of existing files (/!\\ name is choosed by sender)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:326
+msgid "destination path (default: working directory)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:337
+msgid "hash checked: {metadata['hash_algo']}:{metadata['hash']}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:340
+msgid "hash is checked but hash value is missing"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:342
+msgid "hash can't be verified"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:345
+msgid "Error while receiving file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:354 sat_frontends/jp/cmd_pipe.py:111
+msgid "Action has no XMLUI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:359 sat_frontends/jp/cmd_pipe.py:115
+msgid "Invalid XMLUI received"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:369 sat_frontends/jp/cmd_pipe.py:126
+msgid "Ignoring action without from_jid data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:374 sat_frontends/jp/cmd_file.py:395
+msgid "ignoring action without progress id"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:379
+msgid "File refused because overwrite is needed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:397
+msgid "Overwriting needed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:401
+msgid "Overwrite accepted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:403
+msgid "Refused to overwrite"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:417
+msgid "invalid \"from_jid\" value received, ignoring: {value}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:424
+msgid "ignoring action without \"from_jid\" value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:426
+msgid "Confirmation needed for request from an entity not in roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:431
+msgid "Sender confirmed because she or he is explicitly expected"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:439
+msgid "Session refused for {from_jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:446
+msgid "Given path is not a directory !"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:450
+msgid "waiting for incoming file request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:461
+msgid "download a file from URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:470
+msgid "destination file (DEFAULT: filename from URL)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:478
+msgid "URI of the file to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:481
+msgid "File download started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:484
+msgid "File downloaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:487
+msgid "Error while downloading file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:513
+msgid "file download cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:534
+msgid "upload a file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:542
+msgid "encrypt file using AES-GCM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:544
+msgid "file to upload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:548
+msgid "jid of upload component (nothing to autodetect)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:553
+msgid "ignore invalide TLS certificate (/!\\ Dangerous /!\\)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:557
+msgid "File upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:560
+msgid "File uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:566
+msgid "URL to retrieve the file:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:571
+msgid "Error while uploading file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:593
+msgid "file {file_} doesn't exist !"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:597
+msgid "{file_} is a dir! Can't upload a dir"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:633
+msgid "set affiliations for a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:641 sat_frontends/jp/cmd_file.py:695
+#: sat_frontends/jp/cmd_file.py:747 sat_frontends/jp/cmd_file.py:801
+#: sat_frontends/jp/cmd_file.py:1002
+msgid "namespace of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:647 sat_frontends/jp/cmd_file.py:701
+#: sat_frontends/jp/cmd_file.py:753 sat_frontends/jp/cmd_file.py:807
+#: sat_frontends/jp/cmd_file.py:1007
+msgid "path to the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:657 sat_frontends/jp/cmd_pubsub.py:453
+msgid "entity/affiliation couple(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:661 sat_frontends/jp/cmd_file.py:767
+msgid "jid of file sharing entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:687
+msgid "retrieve affiliations of a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:705 sat_frontends/jp/cmd_file.py:811
+msgid "jid of sharing entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:729
+msgid "affiliations management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:739
+msgid "set configuration for a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:763 sat_frontends/jp/cmd_pubsub.py:282
+msgid "configuration field to set (required)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:793
+msgid "retrieve configuration of a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:838
+msgid "file sharing node configuration"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:850
+msgid "retrieve files shared by an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:859
+msgid "path to the directory containing the files"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:865
+msgid "jid of sharing entity (nothing to check our own jid)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:874
+msgid "unknown file type: {type}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:923
+msgid "share a file or directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:931
+msgid "virtual name to use (default: use directory/file name)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:941
+msgid "jid of contacts allowed to retrieve the files"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:946
+msgid "share publicly the file(s) (/!\\ *everybody* will be able to access them)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:953
+msgid "path to a file or directory to share"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:978
+msgid "{path} shared under the name \"{name}\""
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:988
+msgid "send invitation for a shared repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:996
+msgid "name of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1014
+msgid "type of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1019
+msgid "https URL of a image to use as thumbnail"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1023
+msgid "jid of the file sharing service hosting the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1027
+msgid "jid of the person to invite"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1035
+msgid "only http(s) links are allowed with --thumbnail"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1053
+msgid "invitation sent to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1068
+msgid "files sharing management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1077
+msgid "files sending/receiving/management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:45
+msgid "edit forums"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:54 sat_frontends/jp/cmd_forums.py:123
+msgid "forum key (DEFAULT: default forums)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:74
+msgid "forums have been edited"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:115
+msgid "get forums structure"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:168 sat_frontends/jp/cmd_pubsub.py:733
+msgid "no schema found"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:180
+msgid "Forums structure edition"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:37
+msgid "get identity data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:45
+msgid "entity to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:68
+msgid "update identity data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:77
+msgid "nicknames of the entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:101
+msgid "identity management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:38
+msgid "service discovery"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:42
+msgid "entity to discover"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:49
+msgid "type of data to discover"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:51
+msgid "node to use"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:57
+msgid "ignore cache"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:69
+msgid "category"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:111
+msgid "node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:116
+msgid "Features"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:118
+msgid "Identities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:120
+msgid "Extensions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:122
+msgid "Items"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:151 sat_frontends/jp/cmd_info.py:166
+msgid "error while doing discovery: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:190
+msgid "software version"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:193 sat_frontends/jp/cmd_info.py:258
+msgid "Entity to request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:201
+msgid "error while trying to get version: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:207
+msgid "Software name: {name}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:209
+msgid "Software version: {version}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:211
+msgid "Operating System: {os}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:225
+msgid "running session"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:243
+msgid "Error getting session infos: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:253
+msgid "devices of an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:267
+msgid "Error getting devices infos: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:283
+msgid "Get various pieces of information on entities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:61
+msgid "encoding of the input data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:69
+msgid "standard input"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:77
+msgid "short option"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:85
+msgid "long option"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:93
+msgid "positional argument"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:101
+msgid "ignore value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:107
+msgid "don't actually run commands but echo what would be launched"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:110
+msgid "log stdout to FILE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:113
+msgid "log stderr to FILE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:128 sat_frontends/jp/cmd_input.py:193
+msgid "arguments in input data and in arguments sequence don't match"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:155 sat_frontends/jp/cmd_input.py:207
+msgid "values: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:161
+msgid "**SKIPPING**\n"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:184
+msgid "Invalid argument, an option type is expected, got {type_}:{name}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:199
+msgid "command {idx}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:252 sat_frontends/primitivus/xmlui.py:461
+msgid "OK"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:254
+msgid "FAILED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:274
+msgid "comma-separated values"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:283
+msgid "starting row (previous ones will be ignored)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:291
+msgid "split value in several options"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:299
+msgid "action to do on empty value ({choices})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:314
+msgid "--empty value must be one of {choices}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:349
+msgid "launch command with external input"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:38
+msgid "create and send an invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:127
+msgid "you need to specify an email address to send email invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:161
+msgid "get invitation data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:165
+#: sat_frontends/jp/cmd_invitation.py:225
+#: sat_frontends/jp/cmd_invitation.py:289
+msgid "invitation UUID"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:170
+msgid "start profile session and retrieve jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:185
+msgid "can't get invitation data: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:198
+msgid "can't start session: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:208
+msgid "can't retrieve jid: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:221
+msgid "delete guest account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:233
+msgid "can't delete guest account: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:242
+msgid "modify existing invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:299
+msgid "you can't set {arg_name} in both optional argument and extra"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:314
+msgid "invitations have been modified successfuly"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:328
+msgid "list invitations data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:346
+msgid "return only invitations linked to this profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:370
+msgid "invitation of user(s) without XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:43 sat_frontends/jp/cmd_list.py:81
+#: sat_frontends/jp/cmd_list.py:150 sat_frontends/jp/cmd_merge_request.py:39
+#: sat_frontends/jp/cmd_merge_request.py:124
+#: sat_frontends/jp/cmd_merge_request.py:169
+msgid "auto"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:45
+msgid "get lists"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:82
+msgid "set a list item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:94
+msgid "field(s) to set (required)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:101
+msgid "update existing item instead of replacing it (DEFAULT: auto)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:107
+msgid "id, URL of the item to update, or nothing for new item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:151
+msgid "delete a list item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:156 sat_frontends/jp/cmd_pubsub.py:884
+#: sat_frontends/jp/cmd_roster.py:135
+msgid "delete without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:159 sat_frontends/jp/cmd_pubsub.py:887
+msgid "notify deletion"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:163
+msgid "id of the item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:169
+msgid "You need to specify a list item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:171
+msgid "Are you sure to delete list item {item_id} ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:174 sat_frontends/jp/cmd_pubsub.py:897
+msgid "item deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:184 sat_frontends/jp/cmd_pubsub.py:907
+msgid "can't delete item: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:187 sat_frontends/jp/cmd_pubsub.py:910
+msgid "item {item} has been deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:200
+msgid "import tickets from external software/dataset"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:225
+msgid ""
+"specified field in import data will be put in dest field (default: use "
+"same field name, or ignore if it doesn't exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:235
+msgid "PubSub service where the items must be uploaded (default: server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:242
+msgid "PubSub node where the items must be uploaded (default: tickets' defaults)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:257
+msgid "Tickets upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:260
+msgid "Tickets uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:264
+msgid "Error while uploading tickets: {error_msg}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:319
+msgid ""
+"fields_map must be specified either preencoded in --option or using "
+"--map, but not both at the same time"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:337
+msgid "Error while trying to import tickets: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:350
+msgid "pubsub lists handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:40
+msgid "publish or update a merge request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:48
+msgid "id or URL of the request to update, or nothing for a new one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:55
+#: sat_frontends/jp/cmd_merge_request.py:179
+msgid "path of the repository (DEFAULT: current directory)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:61
+msgid "publish merge request without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:68
+msgid "labels to categorize your request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:75
+msgid ""
+"You are going to publish your changes to service [{service}], are you "
+"sure ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:80
+msgid "merge request publication cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:105
+msgid "Merge request published at {published_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:110
+msgid "Merge request published"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:125
+msgid "get a merge request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:170
+msgid "import a merge request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:209
+msgid "merge-request management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:34
+msgid "send a message to a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:38
+msgid "language of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:44
+msgid ""
+"separate xmpp messages: send one message per line instead of one message "
+"alone."
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:53
+msgid "add a new line at the beginning of the input (usefull for ascii art ;))"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:60
+msgid "subject of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:63
+msgid "language of subject"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:70
+msgid "type of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:73
+msgid "encrypt message using given algorithm"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:79
+msgid "XHTML body"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:80
+msgid "rich body"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:195
+msgid "query archives using MAM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:203
+msgid "start fetching archive from this date (default: from the beginning)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:207
+msgid "end fetching archive after this date (default: no limit)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:210
+msgid "retrieve only archives with this jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:213
+msgid "maximum number of items to retrieve, using RSM (default: 20))"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:276
+msgid "messages handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:32
+msgid "get a parameter value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:37 sat_frontends/jp/cmd_param.py:94
+msgid "category of the parameter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:39 sat_frontends/jp/cmd_param.py:95
+#: sat_frontends/jp/cmd_param.py:96
+msgid "name of the parameter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:45
+msgid "name of the attribute to get"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:48 sat_frontends/jp/cmd_param.py:98
+msgid "security limit"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:62
+msgid "can't find requested parameters: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:79
+msgid "can't find requested parameter: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:90
+msgid "set a parameter value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:111
+msgid "can't set requested parameter: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:125
+msgid "save parameters template to xml file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:129
+msgid "output file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:136
+msgid "can't save parameters to file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:140
+msgid "parameters saved to file {filename}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:155
+msgid "load parameters template from xml file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:159
+msgid "input file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:166
+msgid "can't load parameters from file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:170
+msgid "parameters loaded from file {filename}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:182
+msgid "Save/load parameters template"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:29
+msgid "ping XMPP entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:32
+msgid "jid to ping"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:34
+msgid "output delay only (in s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:41
+msgid "can't do the ping: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:38
+msgid "send a pipe a stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:97
+msgid "receive a pipe stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:104
+msgid "Jids accepted (none means \"accept everything\")"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:159
+msgid "stream piping through XMPP"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:33
+msgid "The name of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:51
+msgid "You need to use either --connect or --start-session"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:78
+msgid "the name of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:81
+msgid "the password of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:83 sat_frontends/jp/cmd_profile.py:238
+msgid "the jid of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:86
+msgid "the password of the XMPP account (use profile password if not specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:93 sat_frontends/jp/cmd_profile.py:247
+msgid "connect this profile automatically when backend starts"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:97
+msgid "set to component import name (entry point) if this is a component"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:154
+msgid "delete profile without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:174
+msgid "get information about a profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:180
+msgid "show the XMPP password IN CLEAR TEXT"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:184
+msgid "XMPP password"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:185
+msgid "autoconnect (backend)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:209
+msgid "get clients profiles only"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:229
+msgid "modify an existing profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:234
+msgid "change the password of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:237
+msgid "disable profile password (dangerous!)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:240
+msgid "change the password of the XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:243
+msgid "set as default profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:280
+msgid "profile commands"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:59
+msgid "retrieve node configuration"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:68
+msgid "data key to filter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:116
+msgid "create a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:135 sat_frontends/jp/cmd_pubsub.py:288
+msgid "don't prepend \"pubsub#\" prefix to field names"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:158
+msgid "can't create node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:162
+msgid "node created successfully: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:176
+msgid "purge a node (i.e. remove all items from it)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:184
+msgid "purge node without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:190
+msgid ""
+"Are you sure to purge PEP node [{node}]? This will delete ALL items from "
+"it!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:195
+msgid ""
+"Are you sure to delete node [{node}] on service [{service}]? This will "
+"delete ALL items from it!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:199
+msgid "node purge cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:208
+msgid "can't purge node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:211
+msgid "node [{node}] purged successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:223
+msgid "delete a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:231
+msgid "delete node without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:237
+msgid "Are you sure to delete PEP node [{node}] ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:241
+msgid "Are you sure to delete node [{node}] on service [{service}]?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:244
+msgid "node deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:256
+msgid "node [{node}] deleted successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:270
+msgid "set node configuration"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:309
+msgid "node configuration successful"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:320
+msgid "import raw XML to a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:327 sat_frontends/jp/cmd_pubsub.py:1608
+msgid "do a pubsub admin request, needed to change publisher"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:332
+msgid ""
+"path to the XML file with data to import. The file must contain whole XML"
+" of each item to import."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:359
+msgid "You are not using list of pubsub items, we can't import this file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:370
+msgid "Items are imported without using admin mode, publisher can't be changed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:391
+msgid "items published with id(s) {items_ids}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:396 sat_frontends/jp/cmd_pubsub.py:1641
+msgid "items published"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:409
+msgid "retrieve node affiliations (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:439
+msgid "set affiliations (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:469
+msgid "affiliations have been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:481
+msgid "set or retrieve node affiliations"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:494
+msgid "retrieve node subscriptions (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:532
+msgid "subscription must be one of {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:548
+msgid "set/modify subscriptions (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:563
+msgid "entity/subscription couple(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:578
+msgid "subscriptions have been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:590
+msgid "get or modify node subscriptions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:603
+msgid "set/replace a schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:607
+msgid "schema to set (must be XML)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:621 sat_frontends/jp/cmd_pubsub.py:656
+msgid "schema has been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:637
+msgid "edit a schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:709
+msgid "get schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:742
+msgid "data schema manipulation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:761
+msgid "node handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:774
+msgid "publish a new item or update an existing one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:783
+msgid "id, URL of the item to update, keyword, or nothing for new item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:805
+msgid "can't send item: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:827
+msgid "get pubsub item(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:835
+msgid "subscription id"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:879
+msgid "delete an item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:892
+msgid "You need to specify an item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:894
+msgid "Are you sure to delete item {item_id} ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:924
+msgid "edit an existing or new pubsub item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:968
+msgid "Item has not payload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:992
+msgid "rename a pubsub item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1024
+msgid "subscribe to a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1039
+msgid "can't subscribe to node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1042
+msgid "subscription done"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1044
+msgid "subscription id: {sub_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1059
+msgid "unsubscribe from a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1073
+msgid "can't unsubscribe from node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1076
+msgid "subscription removed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1088
+msgid "retrieve all subscriptions on a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1102
+msgid "can't retrieve subscriptions: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1117
+msgid "retrieve all affiliations on a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1160
+msgid "search items corresponding to filters"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1185
+msgid "maximum depth of recursion (will search linked nodes if > 0, DEFAULT: 0)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1197
+msgid "maximum number of items to get per node ({} to get all items, DEFAULT: 30)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1207
+msgid "namespace to use for xpath"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1216
+msgid "filters"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1217
+msgid "only items corresponding to following filters will be kept"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1226
+msgid "full text filter, item must contain this string (XML included)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1235
+msgid "like --text but using a regular expression"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1244
+msgid "filter items which has elements matching this xpath"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1253
+msgid ""
+"Python expression which much return a bool (True to keep item, False to "
+"reject it). \"item\" is raw text item, \"item_xml\" is lxml's "
+"etree.Element"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1266
+msgid "filters flags"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1267
+msgid "filters modifiers (change behaviour of following filters)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1278
+msgid "(don't) ignore case in following filters (DEFAULT: case sensitive)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1289
+msgid "(don't) invert effect of following filters (DEFAULT: don't invert)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1300
+msgid "(don't) use DOTALL option for regex (DEFAULT: don't use)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1311
+msgid "keep only the matching part of the item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1320
+msgid "action to do on found items (DEFAULT: print)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1383
+msgid ""
+"item doesn't looks like XML, you have probably used --only-matching "
+"somewhere before and we have no more XML"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1420
+msgid "--only-matching used with fixed --text string, are you sure?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1441
+msgid "can't use xpath: {reason}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1476
+msgid "unknown filter type {type}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1534
+msgid "executed command failed with exit code {ret}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1566
+msgid "Command can only be used with {actions} actions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1572
+msgid "you need to specify a command to execute"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1575
+msgid "empty node is not handled yet"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1596
+msgid "modify items of a node using an external command/script"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1603
+msgid "apply transformation (DEFAULT: do a dry run)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1614
+msgid "if command return a non zero exit code, ignore the item and continue"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1622
+msgid "get all items by looping over all pages using RSM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1626
+msgid ""
+"path to the command to use. Will be called repetitivly with an item as "
+"input. Output (full item XML) will be used as new one. Return \"DELETE\" "
+"string to delete the item, and \"SKIP\" to ignore it"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1636
+msgid "items published with ids {item_ids}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1659
+msgid "Can't retrieve all items, RSM metadata not available"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1664
+msgid "Can't retrieve all items, bad RSM metadata: {msg}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1670
+msgid "All items transformed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1674
+msgid "Retrieving next page ({page_idx}/{page_total})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1712
+msgid "Duplicate found on item {item_id}, we have probably handled all items."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1749
+msgid "Deleting item {item_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1766
+msgid "Skipping item {item_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1860 sat_frontends/jp/cmd_uri.py:53
+msgid "build URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1868
+msgid "profile (used when no server is specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1908
+msgid "create a Pubsub hook"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1917
+msgid "hook type"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1923
+msgid "make hook persistent across restarts"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1927
+msgid "argument of the hook (depend of the type)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1936
+msgid "{path} is not a file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1965
+msgid "delete a Pubsub hook"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1974
+msgid "hook type to remove, empty to remove all (DEFAULT: remove all)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1981
+msgid "argument of the hook to remove, empty to remove all (DEFAULT: remove all)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2001
+msgid "{nb_deleted} hook(s) have been deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2013
+msgid "list hooks of a profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2029
+msgid "No hook found."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2043
+msgid "trigger action on Pubsub notifications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2067
+msgid "PubSub nodes/items management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:36
+msgid "retrieve the roster entities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:89
+msgid "set metadata for a roster entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:93
+msgid "name to use for this entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:96
+msgid "groups for this entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:99
+msgid "replace all metadata instead of adding them"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:101 sat_frontends/jp/cmd_roster.py:138
+msgid "jid of the roster entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:131
+msgid "remove an entity from roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:142
+msgid "Are you sure to delete {entity} fril your roster?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:145
+msgid "entity deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:158
+msgid "Show statistics about a roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:226
+msgid "purge the roster from its contacts with no subscription"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:231
+msgid "also purge contacts with no 'from' subscription"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:234
+msgid "also purge contacts with no 'to' subscription"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:306
+msgid "do a full resynchronisation of roster with server"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:318
+msgid "Roster resynchronized"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:327
+msgid "Manage an entity's roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:33
+msgid ""
+"Welcome to {app_name} shell, the Salut à Toi shell !\n"
+"\n"
+"This enrironment helps you using several {app_name} commands with similar"
+" parameters.\n"
+"\n"
+"To quit, just enter \"quit\" or press C-d.\n"
+"Enter \"help\" or \"?\" to know what to do\n"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:48
+msgid "launch jp in shell (REPL) mode"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:63
+msgid "bad command path"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:104
+msgid "COMMAND {external}=> {args}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:105
+msgid "(external) "
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:149
+msgid "Shell commands:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:152
+msgid "Action commands:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:172
+msgid "verbose mode is {status}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:173
+msgid "ENABLED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:173
+msgid "DISABLED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:214
+msgid "arg profile={profile} (logged profile)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:236
+msgid "no argument in USE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:238
+msgid "arguments in USE:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:274
+msgid "argument {name} not found"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:280
+msgid "argument {name} removed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:288
+msgid "good bye!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:37
+msgid "parse URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:42
+msgid "XMPP URI to parse"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:57
+msgid "URI type"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:58
+msgid "URI path"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:66
+msgid "URI fields"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:80
+msgid "XMPP URI parsing/generation"
+msgstr ""
+
+#: sat_frontends/jp/common.py:437
+msgid "no item found at all, we create a new one"
+msgstr ""
+
+#: sat_frontends/jp/common.py:440
+msgid "item \"{item}\" not found, we create a new item withthis id"
+msgstr ""
+
+#: sat_frontends/jp/common.py:458
+msgid "item \"{item}\" found, we edit it"
+msgstr ""
+
+#: sat_frontends/jp/common.py:785
+msgid "No {key} URI specified for this project, please specify service and node"
+msgstr ""
+
+#: sat_frontends/jp/common.py:821
+msgid "Invalid URI found: {uri}"
+msgstr ""
+
+#: sat_frontends/jp/loops.py:28
+msgid "User interruption: good bye"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:53
+msgid "Can't find requested template: {template_path}"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:74
+msgid ""
+"no default template set for this command, you need to specify a template "
+"using --oo template=[path/to/template.html]"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:89
+msgid "Can't parse template, please check its syntax"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:109
+msgid ""
+"Browser opening requested.\n"
+"Temporary files are put in the following directory, you'll have to delete"
+" it yourself once finished viewing: {}"
+msgstr ""
+
+#: sat_frontends/jp/output_xml.py:56
+msgid ""
+"Pygments is not available, syntax highlighting is not possible. Please "
+"install if from http://pygments.org or with pip install pygments"
+msgstr ""
+
+#: sat_frontends/jp/xml_tools.py:50
+msgid "Can't parse the payload XML in input: {msg}"
+msgstr ""
+
+#: sat_frontends/jp/xml_tools.py:62
+msgid "<item> can only have one child element (the payload)"
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:224
+msgid "(enter: {value})"
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:318
+msgid "your choice (0-{limit_max}): "
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:348
+msgid "your choice (0,1): "
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:90
+msgid "Error while sending message ({})"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:135
+msgid "Please specify the globbing pattern to search for"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:377
+msgid "Configuration Error"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:377
+msgid ""
+"Something went wrong while reading the configuration, please check "
+":messages"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:504
+msgid "Pleeeeasse, I can't even breathe !"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:534
+#: sat_frontends/primitivus/profile_manager.py:64
+msgid "Connect"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:536
+msgid "Parameters"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:537 sat_frontends/primitivus/base.py:851
+msgid "About"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:538
+msgid "Exit"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:542
+msgid "Join room"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:547
+msgid "Main menu"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:658
+msgid "{app}: a new event has just happened{entity}"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:736
+msgid "Chat menu"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:790
+msgid "Unmanaged action"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:801
+msgid "unkown"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:831
+#, python-format
+msgid "Can't get parameters (%s)"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:846
+msgid "Entering a MUC room"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:846
+msgid "Please enter MUC's JID"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:40
+msgid "{} occupants"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:381
+msgid "Game"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:502
+msgid "You have been mentioned by {nick} in {room}"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:513
+msgid "{entity} is talking to you"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:612
+msgid "Results for searching the globbing pattern: {}"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:618
+msgid "Type ':history <lines>' to reset the chat history"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:652
+#, python-format
+msgid "Primitivus: %s is talking to you"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:656
+#, python-format
+msgid "Primitivus: %(user)s mentioned you in room '%(room)s'"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:666
+msgid "Can't start game"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:667
+msgid "You need to be exactly 4 peoples in the room to start a Tarot game"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:698
+msgid "Change title"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:699
+msgid "Enter the new title"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:290
+msgid "Please choose your contrat"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:311
+msgid "You win \\o/"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:311
+msgid "You loose :("
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:331
+msgid "Cards played are invalid !"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:369
+msgid "Do you put these cards in chien ?"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:36
+msgid "Login:"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:37
+msgid "Password:"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:48
+msgid "New"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:49
+msgid "Delete"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:81
+msgid "Profile Manager"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:142
+msgid "Can't create profile"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:150
+msgid "New profile"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:151
+msgid "Please enter a new profile name"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:160
+msgid "Are you sure you want to delete the profile {} ?"
+msgstr ""
+
+#: sat_frontends/primitivus/progress.py:37
+msgid "Clear progress list"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:57
+msgid "Set your presence"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:67
+msgid "Set your status"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:68
+msgid "New status"
+msgstr ""
+
+#: sat_frontends/primitivus/xmlui.py:78
+msgid "Unknown div_char"
+msgstr ""
+
+#: sat_frontends/primitivus/xmlui.py:456
+msgid "Submit"
+msgstr ""
+
+#: sat_frontends/primitivus/xmlui.py:458 sat_frontends/primitivus/xmlui.py:473
+msgid "Cancel"
+msgstr ""
+
+#: sat_frontends/quick_frontend/constants.py:31
+msgid "Away from keyboard"
+msgstr ""
+
+#: sat_frontends/quick_frontend/constants.py:33
+msgid "Extended away"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:85
+msgid "Error while trying to get autodisconnect param, ignoring: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:200
+msgid "Can't get profile parameter: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:324
+msgid "Can't get namespaces map: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:330
+msgid "Can't retrieve encryption plugins: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:376
+msgid "Error while initialising bridge: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:662
+#, python-format
+msgid "Can't connect profile [%s]"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:723
+msgid "Connected"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:739
+msgid "Disconnected"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1154
+msgid "The contact {contact} has accepted your subscription"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1157
+#: sat_frontends/quick_frontend/quick_app.py:1176
+msgid "Subscription confirmation"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1162
+msgid "The contact {contact} has refused your subscription"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1165
+msgid "Subscription refusal"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1172
+msgid ""
+"The contact {contact} wants to subscribe to your presence.\n"
+"Do you accept ?"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1229
+#, python-format
+msgid "param update: [%(namespace)s] %(name)s = %(value)s"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1233
+#, python-format
+msgid "Changing JID to %s"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:624
+msgid "now we print the history"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:626
+msgid " ({} messages)"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:683
+msgid "Can't get history: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:705
+msgid "Can't get encryption state: {reason}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:775
+msgid "message encryption started with {target} using {encryption}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:780
+msgid "message encryption stopped with {target} (was using {encryption})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:833
+msgid "<= {nick} has left the room ({count})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:837
+msgid "<=> {nick} re-entered the room ({count})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_list.py:611
+msgid "Trying to delete an unknow entity [{}]"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_list.py:664
+msgid "received presence from entity without resource: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:73
+msgid "Trying to get attribute for an unknown contact"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:89
+msgid "INTERNAL ERROR: Key log.error"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:101
+#, python-format
+msgid "Trying to update an unknown contact: %s"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_games.py:84
+msgid ""
+"A {game} activity between {players} has been started, but you couldn't "
+"take part because your client doesn't support it."
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_games.py:87
+msgid "{game} Game"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:116
+msgid "Trying to plug an unknown profile key ({})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:118
+msgid "Profile plugging in error"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:133
+msgid "Can't get profile parameter"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:144
+msgid "A profile with this name already exists"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:146
+msgid "Profile creation cancelled by backend"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:148
+msgid "You profile name is not valid"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:152
+msgid "Can't create profile ({})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:172
+msgid "You can't connect manually and automatically at the same time"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:180
+msgid "No profile selected"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:181
+msgid "You need to create and select at least one profile before connecting"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_utils.py:40
+msgid ""
+"\n"
+"    %prog [options]\n"
+"\n"
+"    %prog --help for options list\n"
+"    "
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_utils.py:49
+msgid "Select the profile to use"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:233
+msgid "Nothing to submit"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:449
+msgid "XMLUI can have only one main container"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:514
+#, python-format
+msgid "Unknown container [%s], using default one"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:527
+msgid "Internal Error, container has not _xmluiAppend method"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:674
+#, python-format
+msgid "FIXME FIXME FIXME: widget type [%s] is not implemented"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:678
+#, python-format
+msgid "FIXME FIXME FIXME: type [%s] is not implemented"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:696
+#, python-format
+msgid "No change listener on [%s]"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:722
+#, python-format
+msgid "Unknown tag [%s]"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:780
+msgid "No callback_id found"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:813
+#, python-format
+msgid "FIXME: XMLUI internal action [%s] is not implemented"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:909 sat_frontends/tools/xmlui.py:921
+#: sat_frontends/tools/xmlui.py:971 sat_frontends/tools/xmlui.py:983
+msgid "The form data is not sent back, the type is not managed properly"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:915 sat_frontends/tools/xmlui.py:977
+msgid "Cancelling form"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:1096
+msgid "XMLUI class already registered for {type_}, ignoring"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:1135
+msgid "You must register classes with registerClass before creating a XMLUI"
+msgstr ""
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/sk.po	Thu Jun 17 13:05:58 2021 +0200
@@ -0,0 +1,8683 @@
+# Translations template for Libervia.
+# Copyright (C) 2021 ORGANIZATION
+# This file is distributed under the same license as the Libervia project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Libervia VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2021-06-15 10:11+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.9.0\n"
+
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_core_template.py:273
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:85
+#: sat/bridge/bridge_constructor/generated/dbus_bridge.py:85
+#: sat/bridge/dbus_bridge.py:747 sat_frontends/bridge/dbus_bridge.py:85
+msgid ""
+"D-Bus is not launched, please see README to see instructions on how to "
+"launch it"
+msgstr ""
+
+#: sat/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py:99
+#: sat/bridge/bridge_constructor/generated/dbus_bridge.py:99
+#: sat_frontends/bridge/dbus_bridge.py:99
+msgid "Unknown interface"
+msgstr ""
+
+#: sat/core/sat_main.py:212
+msgid "Memory initialised"
+msgstr ""
+
+#: sat/core/sat_main.py:219
+msgid "Could not initialize backend: {reason}"
+msgstr ""
+
+#: sat/core/sat_main.py:227
+msgid "Backend is ready"
+msgstr ""
+
+#: sat/core/sat_main.py:238
+msgid "Following profiles will be connected automatically: {profiles}"
+msgstr ""
+
+#: sat/core/sat_main.py:251
+msgid "Can't autoconnect profile {profile}: {reason}"
+msgstr ""
+
+#: sat/core/sat_main.py:321
+msgid ""
+"Can't import plugin [{path}]:\n"
+"{error}"
+msgstr ""
+
+#: sat/core/sat_main.py:340
+msgid "{type} type must be used with {mode} mode, ignoring plugin"
+msgstr ""
+
+#: sat/core/sat_main.py:349
+msgid ""
+"Name conflict for import name [{import_name}], can't import plugin "
+"[{name}]"
+msgstr ""
+
+#: sat/core/sat_main.py:385
+msgid "Recommended plugin not found: {}"
+msgstr ""
+
+#: sat/core/sat_main.py:406
+msgid "Can't import plugin {name}: {error}"
+msgstr ""
+
+#: sat/core/sat_main.py:478
+msgid "already connected !"
+msgstr ""
+
+#: sat/core/sat_main.py:495
+msgid "not connected !"
+msgstr ""
+
+#: sat/core/sat_main.py:591
+msgid "Trying to remove reference to a client not referenced"
+msgstr ""
+
+#: sat/core/sat_main.py:604
+msgid "running app"
+msgstr ""
+
+#: sat/core/sat_main.py:608
+msgid "stopping app"
+msgstr ""
+
+#: sat/core/sat_main.py:646
+msgid "profile_key must not be empty"
+msgstr ""
+
+#: sat/core/sat_main.py:666
+msgid "Unexpected error: {failure_}"
+msgstr ""
+
+#: sat/core/sat_main.py:921
+msgid "asking connection status for a non-existant profile"
+msgstr ""
+
+#: sat/core/sat_main.py:1020
+#, python-format
+msgid "subsciption request [%(subs_type)s] for %(jid)s"
+msgstr ""
+
+#: sat/core/sat_main.py:1162
+msgid "Can't find features for service {service_jid}, ignoring"
+msgstr ""
+
+#: sat/core/sat_main.py:1221
+msgid "Can't retrieve {full_jid} infos, ignoring"
+msgstr ""
+
+#: sat/core/sat_main.py:1292
+msgid "Trying to remove an unknow progress callback"
+msgstr ""
+
+#: sat/core/sat_main.py:1382
+msgid "id already registered"
+msgstr ""
+
+#: sat/core/sat_main.py:1424
+msgid "trying to launch action with a non-existant profile"
+msgstr ""
+
+#: sat/core/sat_main.py:1520
+msgid "A menu with the same path and type already exists"
+msgstr ""
+
+#: sat/core/sat_main.py:1619
+msgid "help_string"
+msgstr ""
+
+#: sat/core/xmpp.py:196
+msgid "Can't parse port value, using default value"
+msgstr ""
+
+#: sat/core/xmpp.py:223
+msgid "We'll use the stable resource {resource}"
+msgstr ""
+
+#: sat/core/xmpp.py:255
+msgid "setting plugins parents"
+msgstr ""
+
+#: sat/core/xmpp.py:275
+msgid "Plugins initialisation error"
+msgstr ""
+
+#: sat/core/xmpp.py:297
+msgid "Error while disconnecting: {}"
+msgstr ""
+
+#: sat/core/xmpp.py:301
+msgid "{profile} identified"
+msgstr ""
+
+#: sat/core/xmpp.py:309
+msgid "XML stream is initialized"
+msgstr ""
+
+#: sat/core/xmpp.py:317
+msgid "********** [{profile}] CONNECTED **********"
+msgstr ""
+
+#: sat/core/xmpp.py:343
+#, python-format
+msgid "ERROR: XMPP connection failed for profile '%(profile)s': %(reason)sprofile"
+msgstr ""
+
+#: sat/core/xmpp.py:398
+msgid "stopping connection because of network disabled"
+msgstr ""
+
+#: sat/core/xmpp.py:421
+msgid "network is available, trying to connect"
+msgstr ""
+
+#: sat/core/xmpp.py:445
+msgid "********** [{profile}] DISCONNECTED **********"
+msgstr ""
+
+#: sat/core/xmpp.py:464
+msgid ""
+"Your server certificate is not valid (its identity can't be checked).\n"
+"\n"
+"This should never happen and may indicate that somebody is trying to spy "
+"on you.\n"
+"Please contact your server administrator."
+msgstr ""
+
+#: sat/core/xmpp.py:515
+msgid "Disconnecting..."
+msgstr ""
+
+#: sat/core/xmpp.py:688
+msgid "Sending message (type {type}, to {to})"
+msgstr ""
+
+#: sat/core/xmpp.py:696
+msgid ""
+"Triggers, storage and echo have been inhibited by the 'send_only' "
+"parameter"
+msgstr ""
+
+#: sat/core/xmpp.py:762
+msgid "No message found"
+msgstr ""
+
+#: sat/core/xmpp.py:814
+msgid "invalid data used for host: {data}"
+msgstr ""
+
+#: sat/core/xmpp.py:839
+msgid ""
+"Certificate validation is deactivated, this is unsecure and somebody may "
+"be spying on you. If you have no good reason to disable certificate "
+"validation, please activate \"Check certificate\" in your settings in "
+"\"Connection\" tab."
+msgstr ""
+
+#: sat/core/xmpp.py:843
+msgid "Security notice"
+msgstr ""
+
+#: sat/core/xmpp.py:978
+msgid "The requested entry point ({entry_point}) is not available"
+msgstr ""
+
+#: sat/core/xmpp.py:1016
+msgid ""
+"Plugin {current_name} is needed for {entry_name}, but it doesn't handle "
+"component mode"
+msgstr ""
+
+#: sat/core/xmpp.py:1024
+msgid "invalid plugin mode"
+msgstr ""
+
+#: sat/core/xmpp.py:1128
+msgid "parseMessage used with a non <message/> stanza, ignoring: {xml}"
+msgstr ""
+
+#: sat/core/xmpp.py:1140
+msgid "received <message> with a wrong namespace: {xml}"
+msgstr ""
+
+#: sat/core/xmpp.py:1226
+msgid "got message from: {from_}"
+msgstr ""
+
+#: sat/core/xmpp.py:1341
+msgid "There's no subscription between you and [{}]!"
+msgstr ""
+
+#: sat/core/xmpp.py:1346
+msgid "You are not subscribed to [{}]!"
+msgstr ""
+
+#: sat/core/xmpp.py:1348
+msgid "[{}] is not subscribed to you!"
+msgstr ""
+
+#: sat/core/xmpp.py:1384
+msgid "our server support roster versioning, we use it"
+msgstr ""
+
+#: sat/core/xmpp.py:1390
+msgid "no roster in cache, we start fresh"
+msgstr ""
+
+#: sat/core/xmpp.py:1394
+msgid "We have roster v{version} in cache"
+msgstr ""
+
+#: sat/core/xmpp.py:1405
+msgid "our server doesn't support roster versioning"
+msgstr ""
+
+#: sat/core/xmpp.py:1462
+msgid "adding {entity} to roster"
+msgstr ""
+
+#: sat/core/xmpp.py:1486
+msgid "removing {entity} from roster"
+msgstr ""
+
+#: sat/core/xmpp.py:1640
+#, python-format
+msgid "presence update for [%(entity)s] (unavailable, statuses=%(statuses)s)"
+msgstr ""
+
+#: sat/core/xmpp.py:1724
+msgid "sending automatic \"from\" subscription request"
+msgstr ""
+
+#: sat/core/xmpp.py:1732
+#, python-format
+msgid "subscription approved for [%s]"
+msgstr ""
+
+#: sat/core/xmpp.py:1736
+#, python-format
+msgid "unsubscription confirmed for [%s]"
+msgstr ""
+
+#: sat/core/xmpp.py:1741
+#, python-format
+msgid "subscription request from [%s]"
+msgstr ""
+
+#: sat/core/xmpp.py:1747
+msgid "sending automatic subscription acceptance"
+msgstr ""
+
+#: sat/core/xmpp.py:1759
+#, python-format
+msgid "unsubscription asked for [%s]"
+msgstr ""
+
+#: sat/core/xmpp.py:1763
+msgid "automatic contact deletion"
+msgstr ""
+
+#: sat/memory/cache.py:69
+msgid "Can't read metadata file at {path}"
+msgstr ""
+
+#: sat/memory/cache.py:80
+msgid "Invalid cache metadata at {path}"
+msgstr ""
+
+#: sat/memory/cache.py:87
+msgid "cache {cache_file!r} references an inexisting file: {filepath!r}"
+msgstr ""
+
+#: sat/memory/cache.py:102
+msgid "following file is missing while purging cache: {path}"
+msgstr ""
+
+#: sat/memory/cache.py:200
+msgid "missing filename for cache {uid!r}"
+msgstr ""
+
+#: sat/memory/cache.py:207
+msgid "missing file referenced in cache {uid!r}: {filename}"
+msgstr ""
+
+#: sat/memory/disco.py:95
+msgid ""
+"no feature/identity found in disco element (hash: {cap_hash}), ignoring: "
+"{xml}"
+msgstr ""
+
+#: sat/memory/disco.py:274
+#, python-format
+msgid "Error while requesting [%(jid)s]: %(error)s"
+msgstr ""
+
+#: sat/memory/disco.py:338
+msgid "received an item without jid"
+msgstr ""
+
+#: sat/memory/disco.py:410
+msgid "Capability hash generated: [{cap_hash}]"
+msgstr ""
+
+#: sat/memory/disco.py:459
+msgid "invalid item (no jid)"
+msgstr ""
+
+#: sat/memory/encryption.py:71
+msgid "Could not restart {namespace!r} encryption with {entity}: {err}"
+msgstr ""
+
+#: sat/memory/encryption.py:74
+msgid "encryption sessions restored"
+msgstr ""
+
+#: sat/memory/encryption.py:116
+msgid "Encryption plugin registered: {name}"
+msgstr ""
+
+#: sat/memory/encryption.py:127
+msgid "Can't find requested encryption plugin: {namespace}"
+msgstr ""
+
+#: sat/memory/encryption.py:148
+msgid "Can't find a plugin with the name \"{name}\"."
+msgstr ""
+
+#: sat/memory/encryption.py:213
+msgid "No encryption plugin is registered, an encryption session can't be started"
+msgstr ""
+
+#: sat/memory/encryption.py:226
+msgid "Session with {bare_jid} is already encrypted with {name}. Nothing to do."
+msgstr ""
+
+#: sat/memory/encryption.py:237
+msgid ""
+"Session with {bare_jid} is already encrypted with {name}. Please stop "
+"encryption session before changing algorithm."
+msgstr ""
+
+#: sat/memory/encryption.py:249
+msgid "No resource found for {destinee}, can't encrypt with {name}"
+msgstr ""
+
+#: sat/memory/encryption.py:251
+msgid "No resource specified to encrypt with {name}, using {destinee}."
+msgstr ""
+
+#: sat/memory/encryption.py:257
+msgid "{name} encryption must be used with bare jids."
+msgstr ""
+
+#: sat/memory/encryption.py:261
+msgid "Encryption session has been set for {entity_jid} with {encryption_name}"
+msgstr ""
+
+#: sat/memory/encryption.py:268
+msgid ""
+"Encryption session started: your messages with {destinee} are now end to "
+"end encrypted using {name} algorithm."
+msgstr ""
+
+#: sat/memory/encryption.py:273
+msgid "Message are encrypted only for {nb_devices} device(s): {devices_list}."
+msgstr ""
+
+#: sat/memory/encryption.py:291
+msgid "There is no encryption session with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:295
+msgid ""
+"The encryption session is not run with the expected plugin: encrypted "
+"with {current_name} and was expecting {expected_name}"
+msgstr ""
+
+#: sat/memory/encryption.py:304
+msgid ""
+"There is a session for the whole entity (i.e. all devices of the entity),"
+" not a directed one. Please use bare jid if you want to stop the whole "
+"encryption with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:312
+msgid "There is no directed session with this entity."
+msgstr ""
+
+#: sat/memory/encryption.py:327
+msgid "encryption session stopped with entity {entity}"
+msgstr ""
+
+#: sat/memory/encryption.py:335
+msgid ""
+"Encryption session finished: your messages with {destinee} are NOT end to"
+" end encrypted anymore.\n"
+"Your server administrators or {destinee} server administrators will be "
+"able to read them."
+msgstr ""
+
+#: sat/memory/encryption.py:389 sat/memory/encryption.py:397
+#: sat/memory/encryption.py:404
+msgid "Encryption"
+msgstr ""
+
+#: sat/memory/encryption.py:389
+msgid "unencrypted (plain text)"
+msgstr ""
+
+#: sat/memory/encryption.py:392
+msgid "End encrypted session"
+msgstr ""
+
+#: sat/memory/encryption.py:400
+msgid "Start {name} session"
+msgstr ""
+
+#: sat/memory/encryption.py:404
+msgid "⛨ {name} trust"
+msgstr ""
+
+#: sat/memory/encryption.py:407
+msgid "Manage {name} trust"
+msgstr ""
+
+#: sat/memory/encryption.py:470
+msgid "Starting e2e session with {peer_jid} as we receive encrypted messages"
+msgstr ""
+
+#: sat/memory/memory.py:230
+msgid "Memory manager init"
+msgstr ""
+
+#: sat/memory/memory.py:249
+msgid "Loading default params template"
+msgstr ""
+
+#: sat/memory/memory.py:281
+#, python-format
+msgid "Parameters loaded from file: %s"
+msgstr ""
+
+#: sat/memory/memory.py:284
+#, python-format
+msgid "Can't load parameters from file: %s"
+msgstr ""
+
+#: sat/memory/memory.py:299
+#, python-format
+msgid "Parameters saved to file: %s"
+msgstr ""
+
+#: sat/memory/memory.py:302
+#, python-format
+msgid "Can't save parameters to file: %s"
+msgstr ""
+
+#: sat/memory/memory.py:404
+msgid "Authentication failure of profile {profile}"
+msgstr ""
+
+#: sat/memory/memory.py:431
+#, python-format
+msgid "[%s] Profile session purge"
+msgstr ""
+
+#: sat/memory/memory.py:437
+#, python-format
+msgid "Trying to purge roster status cache for a profile not in memory: [%s]"
+msgstr ""
+
+#: sat/memory/memory.py:451
+msgid "requesting no profiles at all"
+msgstr ""
+
+#: sat/memory/memory.py:508
+msgid "Can't find component {component} entry point"
+msgstr ""
+
+#: sat/memory/memory.py:996
+msgid "Need a bare jid to delete all resources"
+msgstr ""
+
+#: sat/memory/memory.py:1028
+#, python-format
+msgid "Trying to encrypt a value for %s while the personal key is undefined!"
+msgstr ""
+
+#: sat/memory/memory.py:1048
+#, python-format
+msgid "Trying to decrypt a value for %s while the personal key is undefined!"
+msgstr ""
+
+#: sat/memory/memory.py:1069
+#, python-format
+msgid "Personal data (%(ns)s, %(key)s) has been successfuly encrypted"
+msgstr ""
+
+#: sat/memory/memory.py:1097
+msgid "Asking waiting subscriptions for a non-existant profile"
+msgstr ""
+
+#: sat/memory/memory.py:1218
+msgid "invalid permission"
+msgstr ""
+
+#: sat/memory/memory.py:1249
+msgid "unknown access type: {type}"
+msgstr ""
+
+#: sat/memory/memory.py:1284
+msgid "You can't use path and parent at the same time"
+msgstr ""
+
+#: sat/memory/memory.py:1288
+msgid "\"..\" or \".\" can't be used in path"
+msgstr ""
+
+#: sat/memory/memory.py:1307
+msgid "Several directories found, this should not happen"
+msgstr ""
+
+#: sat/memory/memory.py:1766
+msgid "Can't delete directory, it is not empty"
+msgstr ""
+
+#: sat/memory/memory.py:1778
+msgid "deleting file {name} with hash {file_hash}"
+msgstr ""
+
+#: sat/memory/memory.py:1787
+msgid "no reference left to {file_path}, deleting"
+msgstr ""
+
+#: sat/memory/params.py:85 sat_frontends/primitivus/base.py:533
+msgid "General"
+msgstr ""
+
+#: sat/memory/params.py:86
+msgid "Connection"
+msgstr ""
+
+#: sat/memory/params.py:88
+msgid "Chat history limit"
+msgstr ""
+
+#: sat/memory/params.py:90
+msgid "Show offline contacts"
+msgstr ""
+
+#: sat/memory/params.py:92
+msgid "Show empty groups"
+msgstr ""
+
+#: sat/memory/params.py:95
+msgid "Connect on backend startup"
+msgstr ""
+
+#: sat/memory/params.py:96
+msgid "Connect on frontend startup"
+msgstr ""
+
+#: sat/memory/params.py:97
+msgid "Disconnect on frontend closure"
+msgstr ""
+
+#: sat/memory/params.py:98
+msgid "Check certificate (don't uncheck if unsure)"
+msgstr ""
+
+#: sat/memory/params.py:163
+#, python-format
+msgid "Trying to purge cache of a profile not in memory: [%s]"
+msgstr ""
+
+#: sat/memory/params.py:188
+msgid "The profile name already exists"
+msgstr ""
+
+#: sat/memory/params.py:203
+msgid "Trying to delete an unknown profile"
+msgstr ""
+
+#: sat/memory/params.py:209
+msgid "Trying to delete a connected profile"
+msgstr ""
+
+#: sat/memory/params.py:228
+msgid "No default profile, returning first one"
+msgstr ""
+
+#: sat/memory/params.py:234
+msgid "No profile exist yet"
+msgstr ""
+
+#: sat/memory/params.py:244
+#, python-format
+msgid "Trying to access an unknown profile (%s)"
+msgstr ""
+
+#: sat/memory/params.py:338
+msgid "Trying to register frontends parameters with no specified app: aborted"
+msgstr ""
+
+#: sat/memory/params.py:347
+#, python-format
+msgid "Trying to register twice frontends parameters for %(app)s: abortedapp"
+msgstr ""
+
+#: sat/memory/params.py:363
+#, python-format
+msgid "Can't determine default value for [%(category)s/%(name)s]: %(reason)s"
+msgstr ""
+
+#: sat/memory/params.py:385 sat/memory/params.py:563 sat/memory/params.py:624
+#, python-format
+msgid "Requested param [%(name)s] in category [%(category)s] doesn't exist !"
+msgstr ""
+
+#: sat/memory/params.py:440
+#, python-format
+msgid ""
+"Unset parameter (%(cat)s, %(param)s) of type list will use the default "
+"option '%(value)s'"
+msgstr ""
+
+#: sat/memory/params.py:448
+#, python-format
+msgid "Parameter (%(cat)s, %(param)s) of type list has no default option!"
+msgstr ""
+
+#: sat/memory/params.py:455
+#, python-format
+msgid ""
+"Parameter (%(cat)s, %(param)s) of type list has more than one default "
+"option!"
+msgstr ""
+
+#: sat/memory/params.py:585
+msgid "Requesting a param for an non-existant profile"
+msgstr ""
+
+#: sat/memory/params.py:589
+msgid "Requesting synchronous param for not connected profile"
+msgstr ""
+
+#: sat/memory/params.py:633
+#, python-format
+msgid ""
+"Trying to get parameter '%(param)s' in category '%(cat)s' without "
+"authorization!!!param"
+msgstr ""
+
+#: sat/memory/params.py:649
+msgid "Requesting a param for a non-existant profile"
+msgstr ""
+
+#: sat/memory/params.py:962
+msgid "Trying to set parameter for an unknown profile"
+msgstr ""
+
+#: sat/memory/params.py:968
+#, python-format
+msgid "Requesting an unknown parameter (%(category)s/%(name)s)"
+msgstr ""
+
+#: sat/memory/params.py:974
+msgid ""
+"{profile!r} is trying to set parameter {name!r} in category {category!r} "
+"without authorization!!!"
+msgstr ""
+
+#: sat/memory/params.py:992
+msgid ""
+"Trying to set parameter {name} in category {category} withan non-integer "
+"value"
+msgstr ""
+
+#: sat/memory/params.py:1011
+#, python-format
+msgid "Setting parameter (%(category)s, %(name)s) = %(value)s"
+msgstr ""
+
+#: sat/memory/params.py:1043
+msgid "Trying to encrypt a password while the personal key is undefined!"
+msgstr ""
+
+#: sat/memory/persistent.py:45
+msgid "PersistentDict can't be used before memory initialisation"
+msgstr ""
+
+#: sat/memory/persistent.py:175
+msgid "Calling load on LazyPersistentBinaryDict while it's not needed"
+msgstr ""
+
+#: sat/memory/sqlite.py:163
+msgid ""
+"too many db tries, we abandon! Error message: {msg}\n"
+"query was {query}"
+msgstr ""
+
+#: sat/memory/sqlite.py:166
+msgid "exception while running query, retrying ({try_}): {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:188
+msgid ""
+"too many interaction tries, we abandon! Error message: {msg}\n"
+"interaction method was: {interaction}\n"
+"interaction arguments were: {args}"
+msgstr ""
+
+#: sat/memory/sqlite.py:191
+msgid "exception while running interaction, retrying ({try_}): {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:210
+msgid "Connecting database"
+msgstr ""
+
+#: sat/memory/sqlite.py:223
+msgid "The database is new, creating the tables"
+msgstr ""
+
+#: sat/memory/sqlite.py:337
+#, python-format
+msgid "Can't delete profile [%s]"
+msgstr ""
+
+#: sat/memory/sqlite.py:354
+#, python-format
+msgid "Profile [%s] deleted"
+msgstr ""
+
+#: sat/memory/sqlite.py:370
+msgid "loading general parameters from database"
+msgstr ""
+
+#: sat/memory/sqlite.py:385
+msgid "loading individual parameters from database"
+msgstr ""
+
+#: sat/memory/sqlite.py:426
+#, python-format
+msgid "Can't set general parameter (%(category)s/%(name)s) in databasecategory"
+msgstr ""
+
+#: sat/memory/sqlite.py:439
+#, python-format
+msgid ""
+"Can't set individual parameter (%(category)s/%(name)s) for [%(profile)s] "
+"in databasecategory"
+msgstr ""
+
+#: sat/memory/sqlite.py:459
+msgid "Can't save following {key} in history (uid: {uid}, lang:{lang}): {value}"
+msgstr ""
+
+#: sat/memory/sqlite.py:473
+msgid ""
+"Can't save following thread in history (uid: {uid}): thread: {thread}), "
+"parent:{parent}"
+msgstr ""
+
+#: sat/memory/sqlite.py:498
+msgid ""
+"Can't save following message in history: from [{from_jid}] to [{to_jid}] "
+"(uid: {uid})"
+msgstr ""
+
+#: sat/memory/sqlite.py:701
+msgid ""
+"Can't {operation} data in database for namespace "
+"{namespace}{and_key}{for_profile}: {msg}"
+msgstr ""
+
+#: sat/memory/sqlite.py:752
+msgid ""
+"getting {type}{binary} private values from database for namespace "
+"{namespace}{keys}"
+msgstr ""
+
+#: sat/memory/sqlite.py:986
+msgid "Can't save file metadata for [{profile}]: {reason}"
+msgstr ""
+
+#: sat/memory/sqlite.py:1025
+msgid "table not updated, probably due to race condition, trying again ({tries})"
+msgstr ""
+
+#: sat/memory/sqlite.py:1027
+msgid "Can't update file table"
+msgstr ""
+
+#: sat/memory/sqlite.py:1132
+msgid ""
+"Your local schema is up-to-date, but database versions mismatch, fixing "
+"it..."
+msgstr ""
+
+#: sat/memory/sqlite.py:1142
+msgid ""
+"There is a schema mismatch, but as we are on a dev version, database will"
+" be updated"
+msgstr ""
+
+#: sat/memory/sqlite.py:1146
+msgid ""
+"schema version is up-to-date, but local schema differ from expected "
+"current schema"
+msgstr ""
+
+#: sat/memory/sqlite.py:1149
+#, python-format
+msgid ""
+"Here are the commands that should fix the situation, use at your own risk"
+" (do a backup before modifying database), you can go to SàT's MUC room at"
+" sat@chat.jabberfr.org for help\n"
+"### SQL###\n"
+"%s\n"
+"### END SQL ###\n"
+msgstr ""
+
+#: sat/memory/sqlite.py:1153
+msgid ""
+"You database version is higher than the one used in this SàT version, are"
+" you using several version at the same time? We can't run SàT with this "
+"database."
+msgstr ""
+
+#: sat/memory/sqlite.py:1161
+msgid ""
+"Database content needs a specific processing, local database will be "
+"updated"
+msgstr ""
+
+#: sat/memory/sqlite.py:1163
+msgid "Database schema has changed, local database will be updated"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:91
+msgid "Add D-Bus management to Ad-Hoc commands"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:98
+msgid "plugin Ad-Hoc D-Bus initialization"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:127
+msgid "Media Players"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:255
+msgid "Command selection"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:298
+msgid "Updated"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:302
+msgid "Command sent"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:367
+msgid "Can't retrieve remote controllers on {device_jid}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:405
+msgid "No media player found."
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:409 sat/plugins/plugin_adhoc_dbus.py:451
+msgid "Media Player Selection"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:414
+msgid "Ignoring MPRIS bus without suffix"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:428
+msgid "missing media_player value"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:431
+msgid ""
+"Media player ad-hoc command trying to use non MPRIS bus. Hack attempt? "
+"Refused bus: {bus_name}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:434
+msgid "Invalid player name."
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:440
+msgid "Can't get D-Bus proxy: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:441
+msgid "Media player is not available anymore"
+msgstr ""
+
+#: sat/plugins/plugin_adhoc_dbus.py:460
+msgid "Can't retrieve attribute {name}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import.py:45
+msgid ""
+"Blog import management:\n"
+"This plugin manage the different blog importers which can register to it,"
+" and handle generic importing tasks."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import.py:64
+msgid "plugin Blog Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:58
+msgid "Blog importer for Dokuwiki blog engine."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:61
+msgid "import posts from Dokuwiki blog engine"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:63
+msgid ""
+"This importer handle Dokuwiki blog engine.\n"
+"\n"
+"To use it, you need an admin access to a running Dokuwiki website\n"
+"(local or on the Internet). The importer retrieves the data using\n"
+"the XMLRPC Dokuwiki API.\n"
+"\n"
+"You can specify a namespace (that could be a namespace directory\n"
+"or a single post) or leave it empty to use the root namespace \"/\"\n"
+"and import all the posts.\n"
+"\n"
+"You can specify a new media repository to modify the internal\n"
+"media links and make them point to the URL of your choice, but\n"
+"note that the upload is not done automatically: a temporary\n"
+"directory will be created on your local drive and you will\n"
+"need to upload it yourself to your repository via SSH or FTP.\n"
+"\n"
+"Following options are recognized:\n"
+"\n"
+"location: DokuWiki site URL\n"
+"user: DokuWiki admin user\n"
+"passwd: DokuWiki admin password\n"
+"namespace: DokuWiki namespace to import (default: root namespace \"/\")\n"
+"media_repo: URL to the new remote media repository (default: none)\n"
+"limit: maximal number of posts to import (default: 100)\n"
+"\n"
+"Example of usage (with jp frontend):\n"
+"\n"
+"jp import dokuwiki -p dave --pwd xxxxxx --connect\n"
+"    http://127.0.1.1 -o user souliane -o passwd qwertz\n"
+"    -o namespace public:2015:10\n"
+"    -o media_repo http://media.diekulturvermittlung.at\n"
+"\n"
+"This retrieves the 100 last blog posts from http://127.0.1.1 that\n"
+"are inside the namespace \"public:2015:10\" using the Dokuwiki user\n"
+"\"souliane\", and it imports them to sat profile dave's microblog node.\n"
+"Internal Dokuwiki media that were hosted on http://127.0.1.1 are now\n"
+"pointing to http://media.diekulturvermittlung.at.\n"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:351
+msgid "plugin Dokuwiki Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:383
+msgid ""
+"DokuWiki media files will be *downloaded* to {temp_dir} - to finish the "
+"import you have to upload them *manually* to {media_repo}"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:389
+msgid ""
+"DokuWiki media files will be *uploaded* to the XMPP server. Hyperlinks to"
+" these media may not been updated though."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dokuwiki.py:393
+msgid ""
+"DokuWiki media files will *stay* on {location} - some of them may be "
+"protected by DokuWiki ACL and will not be accessible."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:42
+msgid "Blog importer for Dotclear blog engine."
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:45
+msgid "import posts from Dotclear blog engine"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:47
+msgid ""
+"This importer handle Dotclear blog engine.\n"
+"\n"
+"To use it, you'll need to export your blog to a flat file.\n"
+"You must go in your admin interface and select Plugins/Maintenance then "
+"Backup.\n"
+"Export only one blog if you have many, i.e. select \"Download database of"
+" current blog\"\n"
+"Depending on your configuration, your may need to use Import/Export "
+"plugin and export as a flat file.\n"
+"\n"
+"location: you must use the absolute path to your backup for the location "
+"parameter\n"
+msgstr ""
+
+#: sat/plugins/plugin_blog_import_dotclear.py:266
+msgid "plugin Dotclear Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:69
+msgid "Component hosting and sharing files"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:79
+msgid ""
+"You are over quota, your maximum allowed size is {quota} and you are "
+"already using {used_space}, you can't upload {file_size} more."
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:350
+msgid "File Sharing initialization"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:431
+#: sat/plugins/plugin_comp_file_sharing_management.py:422
+msgid "Can't create thumbnail: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:454
+msgid "Reusing already generated hash"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:485
+msgid "Can't get thumbnail for {final_path}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:574
+msgid "{peer_jid} is trying to access an unauthorized file: {name}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing.py:582
+msgid "no matching file found ({file_data})"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:43
+msgid ""
+"Experimental handling of file management for file sharing. This plugins "
+"allows to change permissions of stored files/directories or remove them."
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:72
+msgid "File Sharing Management plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:185
+msgid "file not found"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:187
+#: sat/plugins/plugin_comp_file_sharing_management.py:192
+#: sat/plugins/plugin_comp_file_sharing_management.py:474
+msgid "forbidden"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:191
+msgid "Only owner can manage files"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:258
+msgid "Please select permissions for this directory"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:260
+msgid "Please select permissions for this file"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:305
+msgid "Can't use read_allowed values: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:332
+msgid "management session done"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:358
+msgid ""
+"Are you sure to delete directory {name} and all files and directories "
+"under it?"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:362
+msgid "Are you sure to delete file {name}?"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:387
+msgid "file deleted"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:465
+msgid "thumbnails generated"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:481
+msgid "You are currently using {size_used} on {size_quota}"
+msgstr ""
+
+#: sat/plugins/plugin_comp_file_sharing_management.py:484
+msgid "unlimited quota"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:39
+msgid "Debug plugin to have a telnet server"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:53
+msgid ""
+"/!\\ Manhole debug server activated, be sure to not use it in production,"
+" this is dangerous /!\\"
+msgstr ""
+
+#: sat/plugins/plugin_dbg_manhole.py:55
+msgid "You can connect to manhole server using telnet on port {port}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_command_export.py:39
+msgid "Implementation of command export"
+msgstr ""
+
+#: sat/plugins/plugin_exp_command_export.py:92
+msgid "Plugin command export initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:50
+msgid "Experimental implementation of XMPP events management"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:60
+msgid "Event plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:177
+msgid "no src found for image"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:187
+msgid "no {uri_type} element found!"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:189
+msgid "incomplete {uri_type} element"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:191
+msgid "bad {uri_type} element"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:231
+msgid "No event element has been found"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:233
+msgid "No event with this id has been found"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:290
+msgid "event_id must be set"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:333
+msgid "The given URI is not valid: {uri}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:354
+#: sat/plugins/plugin_exp_list_of_interest.py:100
+msgid "requested node already exists"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:373
+msgid "missing node"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:426
+msgid "No event found in item {item_id}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:519
+msgid "no data found for {item_id} (service: {service}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:542 sat/plugins/plugin_exp_events.py:623
+msgid "\"XEP-0277\" (blog) plugin is needed for this feature"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:548
+msgid "got event data"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:579
+msgid "affiliation set on blog and comments nodes"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:619
+msgid "\"Invitations\" plugin is needed for this feature"
+msgstr ""
+
+#: sat/plugins/plugin_exp_events.py:632
+msgid "invitation created"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:44
+msgid "Experimental handling of invitations"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:57
+msgid "Invitation plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:251
+msgid "Can't get item linked with invitation: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:256
+msgid "Invitation was linking to a non existing item"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:262
+msgid "Can't retrieve namespace of invitation: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:281
+msgid "Bad invitation, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation.py:321
+msgid "No handler for namespace \"{namespace}\", invitation ignored"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:39
+msgid "Experimental handling of invitations for file sharing"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:46
+msgid "File Sharing Invitation plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:85
+#: sat/plugins/plugin_exp_invitation_file.py:92
+msgid "file sharing"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:87
+msgid "photo album"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_file.py:93
+msgid ""
+"{profile} has received an invitation for a files repository "
+"({type_human}) with namespace {sharing_ns!r} at path [{path}]"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_pubsub.py:42
+msgid "Invitations for pubsub based features"
+msgstr ""
+
+#: sat/plugins/plugin_exp_invitation_pubsub.py:49
+msgid "Pubsub Invitation plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:52
+msgid "Jingle Stream plugin"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:55
+msgid "{peer} wants to send you a stream, do you accept ?"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:56
+msgid "Stream Request"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:123
+msgid "stream can't be used with multiple consumers"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:170
+msgid "No client connected, can't send data"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:180
+msgid "Plugin Stream initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_jingle_stream.py:270
+msgid "given port is invalid"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:45
+msgid "Detect and set message language when unknown"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:48
+#: sat/plugins/plugin_misc_watched.py:43 sat/plugins/plugin_xep_0249.py:73
+msgid "Misc"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:50
+msgid "language detection"
+msgstr ""
+
+#: sat/plugins/plugin_exp_lang_detect.py:66
+msgid "Language detection plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_list_of_interest.py:46
+msgid "Experimental handling of interesting XMPP locations"
+msgstr ""
+
+#: sat/plugins/plugin_exp_list_of_interest.py:56
+msgid "List of Interest plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_list_of_interest.py:287
+msgid "Missing interest element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_parrot.py:40
+msgid "Implementation of parrot mode (repeat messages between 2 entities)"
+msgstr ""
+
+#: sat/plugins/plugin_exp_parrot.py:56
+msgid "Plugin Parrot initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_parrot.py:63 sat/plugins/plugin_xep_0045.py:150
+#: sat/plugins/plugin_xep_0048.py:102 sat/plugins/plugin_xep_0092.py:61
+#: sat/plugins/plugin_xep_0199.py:56 sat/plugins/plugin_xep_0249.py:95
+#: sat/plugins/plugin_xep_0384.py:476
+msgid "Text commands not available"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_admin.py:40
+msgid ""
+"\\Implementation of Pubsub Administrator\n"
+"This allows a pubsub administrator to overwrite completly items, "
+"including publisher.\n"
+"Specially useful when importing a node."
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:40
+msgid "Experimental plugin to launch on action on Pubsub notifications"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:56
+msgid "PubSub Hook initialization"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:93
+msgid "node manager already set for {node}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:101
+msgid "node manager installed on {node}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:107
+msgid "trying to remove a {node} without hook"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:112
+msgid "hook removed"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:114
+msgid "node still needed for an other hook"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:119
+msgid "{hook_type} is not handled"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:123
+#: sat/plugins/plugin_exp_pubsub_hook.py:167
+msgid "{hook_type} hook type not implemented yet"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:139
+msgid "{persistent} hook installed on {node} for {profile}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:140
+msgid "persistent"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:140
+msgid "temporary"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:173
+msgid "Can't load Pubsub hook at node {node}, it will be removed: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_exp_pubsub_hook.py:185
+msgid "Error while running Pubsub hook for node {node}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:41
+msgid "Generic import plugin, base for specialized importers"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:49
+msgid "plugin Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:67
+msgid "initializing {name} import handler"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:158
+msgid "invalid json option: {option}"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:296
+msgid "uploading subitems"
+msgstr ""
+
+#: sat/plugins/plugin_import.py:327
+msgid "An {handler_name} importer with the name {name} already exist"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:37
+msgid "Merge request handler for Mercurial"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:40
+msgid "handle Mercurial repository"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:71
+msgid "Mercurial merge request handler initialization"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:75
+msgid "Mercurial executable (hg) not found, can't use Mercurial handler"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:116
+msgid "invalid changeset signature"
+msgstr ""
+
+#: sat/plugins/plugin_merge_req_mercurial.py:136
+msgid "unexpected time data: {data}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:50
+msgid "Libervia account creation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:75
+msgid ""
+"Welcome to Libervia, the web interface of Salut à Toi.\n"
+"\n"
+"Your account on {domain} has been successfully created.\n"
+"This is a demonstration version to show you the current status of the "
+"project.\n"
+"It is still under development, please keep it in mind!\n"
+"\n"
+"Here is your connection information:\n"
+"\n"
+"Login on {domain}: {profile}\n"
+"Jabber ID (JID): {jid}\n"
+"Your password has been chosen by yourself during registration.\n"
+"\n"
+"In the beginning, you have nobody to talk to. To find some contacts, you "
+"may use the users' directory:\n"
+"    - make yourself visible in \"Service / Directory subscription\".\n"
+"    - search for people with \"Contacts\" / Search directory\".\n"
+"\n"
+"Any feedback welcome. Thank you!\n"
+"\n"
+"Salut à Toi association\n"
+"https://www.salut-a-toi.org\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:109
+msgid "Plugin Account initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:294
+msgid "Failed to send account creation confirmation to {email}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:313
+msgid "New Libervia account created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:339
+msgid "Your Libervia account has been created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:363
+msgid "xmpp_domain needs to be set in sat.conf. Using \"{default}\" meanwhile"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:379
+msgid "Manage your account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:385
+msgid "Change your password"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:387
+msgid "Current profile password"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:389
+msgid "New password"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:391
+msgid "New password (again)"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:431 sat/stdui/ui_profile_manager.py:73
+msgid "The provided profile password doesn't match."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:432
+msgid "Attempt failure"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:477
+msgid "The values entered for the new password are not equal."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:495
+msgid "Change your password?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:500
+msgid ""
+"Note for advanced users: this will actually change both your SàT profile "
+"password AND your XMPP account password."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:504
+msgid "Continue with changing the password?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:528
+#: sat/plugins/plugin_misc_register_account.py:133
+msgid "Confirmation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:529
+msgid "Your password has been changed."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:533
+#: sat/plugins/plugin_misc_account.py:606
+#: sat/plugins/plugin_misc_account.py:716 sat_frontends/primitivus/base.py:790
+#: sat_frontends/primitivus/base.py:831
+#: sat_frontends/quick_frontend/quick_profile_manager.py:133
+msgid "Error"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:535
+#, python-format
+msgid "Your password could not be changed: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:548
+msgid "Delete your account?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:551
+msgid ""
+"If you confirm this dialog, you will be disconnected and then your XMPP "
+"account AND your SàT profile will both be DELETED."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:555
+msgid "contact list, messages history, blog posts and commentsGROUPBLOG"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:558
+msgid "contact list and messages history"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:561
+#, python-format
+msgid ""
+"All your data stored on %(server)s, including your %(target)s will be "
+"erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:567
+#: sat/plugins/plugin_misc_account.py:642
+#: sat/plugins/plugin_misc_account.py:658
+#: sat/plugins/plugin_misc_account.py:674
+msgid ""
+"There is no other confirmation dialog, this is the very last one! Are you"
+" sure?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:608
+#, python-format
+msgid "Your XMPP account could not be deleted: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:628
+msgid "Delete all your (micro-)blog posts and comments?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:632
+msgid ""
+"If you confirm this dialog, all the (micro-)blog data you submitted will "
+"be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:637
+msgid "These are the public and private posts and comments you sent to any group."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:649
+msgid "Delete all your (micro-)blog posts?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:653
+msgid ""
+"If you confirm this dialog, all the public and private posts you sent to "
+"any group will be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:665
+msgid "Delete all your (micro-)blog comments?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:669
+msgid ""
+"If you confirm this dialog, all the public and private comments you made "
+"on other people's posts will be erased."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:689
+msgid "blog posts and comments"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:694
+msgid "blog posts"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:699
+msgid "comments"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:705
+msgid "Deletion confirmation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:707
+#, python-format
+msgid "Your %(target)s have been deleted."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:709
+msgid ""
+"Known issue of the demo version: you need to refresh the page to make the"
+" deleted posts actually disappear."
+msgstr ""
+
+#: sat/plugins/plugin_misc_account.py:718
+#, python-format
+msgid "Your %(target)s could not be deleted: %(message)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:50
+msgid "Manage Android platform specificities, like pause or notifications"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:92
+msgid "sound on notifications"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:94
+msgid "Normal"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:95 sat/plugins/plugin_misc_android.py:103
+msgid "Never"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:99
+msgid "Vibrate on notifications"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:101
+msgid "Always"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:102
+msgid "In vibrate mode"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:243
+msgid "plugin Android initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_android.py:362
+msgid "new message from {contact}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:64
+msgid ""
+"Applications Manager\n"
+"\n"
+"Manage external applications using packagers, OS "
+"virtualization/containers or other\n"
+"software management tools.\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:80
+msgid "plugin Applications Manager initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:166
+msgid ""
+"No value found for \"public_url\", using \"example.org\" for now, please "
+"set the proper value in libervia.conf"
+msgstr ""
+
+#: sat/plugins/plugin_misc_app_manager.py:170
+msgid ""
+"invalid value for \"public_url\" ({value}), it musts not start with "
+"schema (\"http\"), ignoring it and using \"example.org\" instead"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:43
+msgid "Attachments handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:53
+msgid "plugin Attach initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:109
+msgid "Can't resize attachment of unknown type: {attachment}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:125
+msgid "Attachment {path!r} has been resized at {new_path!r}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:129
+msgid "Can't resize attachment of type {main_type!r}: {attachment}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:143
+msgid "No plugin can handle attachment with {destinee}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_attach.py:210
+msgid "certificate check disabled for upload, this is dangerous!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_debug.py:35
+msgid "Set of method to make development and debugging easier"
+msgstr ""
+
+#: sat/plugins/plugin_misc_debug.py:41
+msgid "Plugin Debug initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:43
+msgid "File download management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:50
+msgid "plugin Download initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:95
+msgid "Can't download file: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:99 sat_frontends/jp/cmd_file.py:498
+msgid "Can't download file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:176
+msgid "certificate check disabled for download, this is dangerous!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_download.py:187
+msgid "Can't download URI {uri}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:44
+msgid "invitation of people without XMPP account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:59
+msgid "You have been invited by {host_name} to {app_name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:60
+msgid ""
+"Hello {name}!\n"
+"\n"
+"You have received an invitation from {host_name} to participate to "
+"\"{app_name}\".\n"
+"To join, you just have to click on the following URL:\n"
+"{url}\n"
+"\n"
+"Please note that this URL should not be shared with anybody!\n"
+"If you want more details on {app_name}, you can check {app_url}.\n"
+"\n"
+"Welcome!\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:76
+msgid "plugin Invitations initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:105
+msgid "You can't use following key(s) in extra, they are reserved: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:198
+msgid "You can't use following key(s) in both args and extra: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:207
+msgid "You need to provide a main email address before using emails_extra"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:213
+msgid "You need to provide url_template if you use default message body"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:216
+msgid "creating an invitation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:237
+msgid "You need to specify xmpp_domain in sat.conf"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:251
+msgid "Can't create XMPP account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:254
+msgid "requested jid already exists, trying with {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:265
+msgid "account {jid_} created"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:317
+msgid "somebody"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:345
+msgid "Not all arguments have been consumed: {}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_email_invitation.py:443
+msgid "Skipping reserved key {key}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_extra_pep.py:38
+msgid "Display messages from extra PEP services"
+msgstr ""
+
+#: sat/plugins/plugin_misc_extra_pep.py:69
+msgid "Plugin Extra PEP initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:45
+msgid ""
+"File Tansfer Management:\n"
+"This plugin manage the various ways of sending a file, and choose the "
+"best one."
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:52
+msgid "Please select a file to send to {peer}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:53
+msgid "File sending"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:54
+msgid ""
+"{peer} wants to send the file \"{name}\" to you:\n"
+"{desc}\n"
+"\n"
+"The file has a size of {size_human}\n"
+"\n"
+"Do you accept ?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:58
+msgid "Confirm file transfer"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:59
+msgid "File {} already exists, are you sure you want to overwrite ?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:60
+msgid "File exists"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:70
+msgid "plugin File initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:82
+msgid "Action"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:82
+msgid "send file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:85
+msgid "Send a file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:121
+msgid "{name} method will be used to send the file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:132
+msgid "Can't send {filepath} to {peer_jid} with {method_name}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_file.py:166 sat/plugins/plugin_xep_0100.py:101
+msgid "Invalid JID"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:36
+msgid "forums management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:43
+msgid "forums management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:54
+msgid "forums plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:97
+msgid "forums arguments must be a list of forums"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:109
+msgid "A forum item must be a dictionary"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:114
+msgid "following forum name is not unique: {name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:116
+msgid "creating missing forum node"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:130
+msgid "Unknown forum attribute: {key}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:136
+msgid "forum need a title or a name"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:138
+msgid "forum need uri or sub-forums"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:154
+msgid "missing <forums> element"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:160
+msgid "Unexpected element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:168
+msgid "Following attributes are unknown: {unknown}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:176
+msgid "invalid forum, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_forums.py:180
+msgid "unkown forums sub element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:53
+msgid "Implementation of microblogging fine permissions"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:61
+msgid "Group blog plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:80
+msgid "Server is not able to manage item-access pubsub, we can't use group blog"
+msgstr ""
+
+#: sat/plugins/plugin_misc_groupblog.py:86
+msgid "Server can manage group blogs"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:49
+msgid "Identity manager"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:58
+msgid "Plugin Identity initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:293
+#: sat/plugins/plugin_misc_identity.py:365
+msgid "No callback registered for {metadata_name}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:316
+msgid "Error while trying to get {metadata_name} with {callback}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:376
+msgid "Error while trying to set {metadata_name} with {callback}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_identity.py:691
+msgid "Can't set metadata {metadata_name!r}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:57
+msgid "This plugin help to discover our external IP address."
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:64
+msgid "Allow external get IP"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:67
+msgid "Confirm external site request"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:68
+msgid ""
+"To facilitate data transfer, we need to contact a website.\n"
+"A request will be done on {page}\n"
+"That means that administrators of {domain} can know that you use "
+"\"{app_name}\" and your IP Address.\n"
+"\n"
+"IP address is an identifier to locate you on Internet (similar to a phone"
+" number).\n"
+"\n"
+"Do you agree to do this request ?\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_ip.py:100
+msgid "plugin IP discovery initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:39
+msgid "Pubsub Lists"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:47
+msgid "Pubsub lists management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:52
+msgid "TODO List"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:63 sat/plugins/plugin_misc_lists.py:113
+#: sat/plugins/plugin_misc_lists.py:156
+msgid "status"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:67
+msgid "to do"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:71
+msgid "in progress"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:75
+msgid "done"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:83 sat/plugins/plugin_misc_lists.py:180
+msgid "priority"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:87 sat/plugins/plugin_misc_lists.py:184
+msgid "major"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:91 sat/plugins/plugin_misc_lists.py:188
+msgid "normal"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:95 sat/plugins/plugin_misc_lists.py:192
+msgid "minor"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:106
+msgid "Grocery List"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:109 sat_frontends/jp/cmd_info.py:69
+#: sat_frontends/jp/cmd_info.py:111
+msgid "name"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:110
+msgid "quantity"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:117
+msgid "to buy"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:121
+msgid "bought"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:130
+msgid "Tickets"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:140 sat_frontends/jp/cmd_info.py:69
+msgid "type"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:144
+msgid "bug"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:148
+msgid "feature request"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:160
+msgid "queued"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:164
+msgid "started"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:168
+msgid "review"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:172
+msgid "closed"
+msgstr ""
+
+#: sat/plugins/plugin_misc_lists.py:208
+msgid "Pubsub lists plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:35
+msgid "Merge requests management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:42
+msgid "Merge requests management plugin"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:69
+msgid "Merge requests plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:121
+msgid "a handler with name {name} already exists!"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:134
+msgid ""
+"merge requests of type {type} are already handled by {old_handler}, "
+"ignoring {new_handler}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:241
+msgid "repository must be specified"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:244
+msgid "{field} is set by backend, you must not set it in frontend"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:253
+msgid "{name} handler will be used"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:256
+msgid "repository {path} can't be handled by any installed handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:259
+msgid "no handler for this repository has been found"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:265
+msgid "No handler of this name found"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:269
+msgid "export data is empty, do you have any change to send?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:312
+msgid "No handler can handle data type \"{type}\""
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:348
+msgid "No handler found to import {data_type}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_merge_requests.py:350
+msgid "Importing patch [{item_id}] using {name} handler"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:45
+msgid "Automatic NAT port mapping using UPnP"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:62
+msgid "plugin NAT Port initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:177
+msgid "addportmapping error: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_nat_port.py:215
+msgid "error while trying to map ports: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:42
+msgid "Implementation of Quiz game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:55
+msgid "Plugin Quiz initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:345
+msgid ""
+"Bienvenue dans cette partie rapide de quizz, le premier à atteindre le "
+"score de 9 remporte le jeu\n"
+"\n"
+"Attention, tu es prêt ?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:380 sat/plugins/plugin_misc_tarot.py:664
+#, python-format
+msgid "Player %(player)s is ready to start [status: %(status)s]"
+msgstr ""
+
+#: sat/plugins/plugin_misc_quiz.py:456 sat/plugins/plugin_misc_radiocol.py:353
+#, python-format
+msgid "Unmanaged game element: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:57
+msgid "Implementation of radio collective"
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:76
+msgid "Radio collective initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:180
+msgid ""
+"The uploaded file has been rejected, only Ogg Vorbis and MP3 songs are "
+"accepted."
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:210
+msgid "No more participants in the radiocol: cleaning data"
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:249
+msgid "INTERNAL ERROR: can't find full path of the song to delete"
+msgstr ""
+
+#: sat/plugins/plugin_misc_radiocol.py:258
+#, python-format
+msgid "INTERNAL ERROR: can't find %s on the file system"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:41
+msgid "Register XMPP account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:49
+msgid "Plugin Register Account initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:76
+msgid "Missing values"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:78
+msgid "No user JID or password given: can't register new account."
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:87
+msgid "Register new account"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:92
+msgid "Do you want to register a new XMPP account {jid}?"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:134
+msgid "Registration successful."
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:138
+msgid "Failure"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:139
+#, python-format
+msgid "Registration failed: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_register_account.py:143
+msgid "Username already exists, please choose an other one."
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:49
+msgid "Base class for MUC games"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:221
+#, python-format
+msgid "%(user)s not allowed to join the game %(game)s in %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:380
+#, python-format
+msgid "%(user)s not allowed to invite for the game %(game)s in %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:433
+#, python-format
+msgid "Still waiting for %(users)s before starting the game %(game)s in %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:472
+#, python-format
+msgid "Preparing room for %s game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:475
+msgid "Unknown profile"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:583
+#, python-format
+msgid "%(game)s game already created in room %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:589
+#, python-format
+msgid "%(game)s game in room %(room)s can only be created by %(user)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:610
+#, python-format
+msgid "Creating %(game)s game in room %(room)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:615
+#: sat/plugins/plugin_misc_room_game.py:646
+#: sat/plugins/plugin_misc_tarot.py:581
+#, python-format
+msgid "profile %s is unknown"
+msgstr ""
+
+#: sat/plugins/plugin_misc_room_game.py:661
+#, python-format
+msgid "new round for %s game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:44
+msgid "Plugin for static blogs"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:66
+msgid "Page title"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:68
+msgid "Banner URL"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:70
+msgid "Background image URL"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:72
+msgid "Keywords"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:74
+msgid "Description"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:97 sat/plugins/plugin_sec_otr.py:508
+#: sat/plugins/plugin_sec_otr.py:542 sat/plugins/plugin_sec_otr.py:568
+#: sat/plugins/plugin_sec_otr.py:592
+msgid "jid key is not present !"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:102
+msgid "Not available"
+msgstr ""
+
+#: sat/plugins/plugin_misc_static_blog.py:104
+msgid "Retrieving a blog from an external domain is not implemented yet."
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:47
+msgid "Implementation of Tarot card game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:60
+msgid "Plugin Tarot initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:78
+msgid "Passe"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:79
+msgid "Petite"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:80
+msgid "Garde"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:81
+msgid "Garde Sans"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:82
+msgid "Garde Contre"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:171
+msgid "contrat selection"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:189
+msgid "scores"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:273 sat/plugins/plugin_misc_tarot.py:313
+#, python-format
+msgid ""
+"Player %(excuse_owner)s give %(card_waited)s to %(player_waiting)s for "
+"Excuse compensation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:327
+#, python-format
+msgid ""
+"%(excuse_owner)s keep the Excuse but has not card to give, %(winner)s is "
+"waiting for one"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:338
+#: sat_frontends/primitivus/game_tarot.py:309
+msgid "Draw game"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:341 sat/plugins/plugin_misc_tarot.py:436
+#, python-format
+msgid ""
+"\n"
+"--\n"
+"%(player)s:\n"
+"score for this game ==> %(score_game)i\n"
+"total score ==> %(total_score)i"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:397
+msgid "INTERNAL ERROR: contrat not managed (mispelled ?)"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:422
+#, python-format
+msgid ""
+"The attacker (%(attaquant)s) makes %(points)i and needs to make "
+"%(point_limit)i (%(nb_bouts)s oulder%(plural)s%(separator)s%(bouts)s): "
+"(s)he %(victory)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:507
+msgid "Internal error: unmanaged game stage"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:530 sat/plugins/plugin_misc_tarot.py:562
+msgid "session id doesn't exist, session has probably expired"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:540
+#, python-format
+msgid "contrat [%(contrat)s] choosed by %(profile)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:584
+#, python-format
+msgid "Cards played by %(profile)s: [%(cards)s]"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:709
+msgid "Everybody is passing, round ended"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:723
+#, python-format
+msgid "%(player)s win the bid with %(contrat)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:751
+msgid "tarot: chien received"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:828
+#, python-format
+msgid "The winner of this trick is %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:896
+#, python-format
+msgid "Unmanaged error type: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_tarot.py:898
+#, python-format
+msgid "Unmanaged card game element: %s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:40
+msgid "IRC like text commands"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:60
+msgid ""
+"Type '/help' to get a list of the available commands. If you didn't want "
+"to use a command, please start your message with '//' to escape the "
+"slash."
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:66
+msgid "Text commands initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:162
+#, python-format
+msgid "Skipping not callable [%s] attribute"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:166
+msgid "Skipping cmd_ method"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:173
+msgid "Conflict for command [{old_name}], renaming it to [{new_name}]"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:180
+#, python-format
+msgid "Registered text command [%s]"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:244
+#, python-format
+msgid "Invalid command /%s. "
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:277
+#, python-format
+msgid "Unknown command /%s. "
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:286
+msgid "group discussions"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:288
+msgid "one to one discussions"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:290
+msgid "/{command} command only applies in {context}."
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:374
+msgid "Invalid jid, can't whois"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:380
+#, python-format
+msgid "whois for %(jid)s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:436
+msgid "Invalid command name [{}]\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:457
+#, python-format
+msgid ""
+"Text commands available:\n"
+"%s"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:462
+msgid ""
+"/{name}: {short_help}\n"
+"{syntax}{args_help}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_commands.py:465
+msgid " syntax: {}\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_syntaxes.py:43 sat/test/constants.py:56
+msgid "Composition"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_syntaxes.py:142
+msgid "Management of various text syntaxes (XHTML-IM, Markdown, etc)"
+msgstr ""
+
+#: sat/plugins/plugin_misc_text_syntaxes.py:184
+msgid "Text syntaxes plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:41
+msgid "File upload management"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:45
+msgid "Please select a file to upload"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:46
+msgid "File upload"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:53
+msgid "plugin Upload initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:92
+msgid "Can't upload file: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_misc_upload.py:96 sat_frontends/jp/cmd_file.py:586
+msgid "Can't upload file"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:32
+msgid "URI finder"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:39
+msgid ""
+"    Plugin to find URIs in well know location.\n"
+"    This allows to retrieve settings to work with a project (e.g. pubsub "
+"node used for merge-requests).\n"
+"    "
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:52
+msgid "URI finder plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_uri_finder.py:87
+msgid "Ignoring already found uri for key \"{key}\""
+msgstr ""
+
+#: sat/plugins/plugin_misc_watched.py:37
+msgid "Watch for entities presence, and send notification accordingly"
+msgstr ""
+
+#: sat/plugins/plugin_misc_watched.py:45
+msgid "Watched entity {entity} is connected"
+msgstr ""
+
+#: sat/plugins/plugin_misc_watched.py:62
+msgid "Watched initialisation"
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:34
+msgid "Plugin which manage welcome message and things to to on first connection."
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:42
+msgid "Display welcome message"
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:43
+msgid "Welcome to Libervia/Salut à Toi"
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:46
+msgid ""
+"Welcome to a free (as in freedom) network!\n"
+"\n"
+"If you have any trouble, or you want to help us for the bug hunting, you "
+"can contact us in real time chat by using the “Help / Official chat room”"
+"  menu.\n"
+"\n"
+"To use Libervia, you'll need to add contacts, either people you know, or "
+"people you discover by using the “Contacts / Search directory” menu.\n"
+"\n"
+"We hope that you'll enjoy using this project.\n"
+"\n"
+"The Libervia/Salut à Toi Team\n"
+msgstr ""
+
+#: sat/plugins/plugin_misc_welcome.py:75
+msgid "plugin Welcome initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_xmllog.py:36
+msgid "Send raw XML logs to bridge"
+msgstr ""
+
+#: sat/plugins/plugin_misc_xmllog.py:51
+msgid "Activate XML log"
+msgstr ""
+
+#: sat/plugins/plugin_misc_xmllog.py:55
+msgid "Plugin XML Log initialization"
+msgstr ""
+
+#: sat/plugins/plugin_misc_xmllog.py:69
+msgid "XML log activated"
+msgstr ""
+
+#: sat/plugins/plugin_misc_xmllog.py:81
+msgid "INTERNAL ERROR: Unmanaged XML type"
+msgstr ""
+
+#: sat/plugins/plugin_sec_aesgcm.py:48
+msgid ""
+"    Implementation of AES-GCM scheme, a way to encrypt files (not "
+"official XMPP standard).\n"
+"    See https://xmpp.org/extensions/inbox/omemo-media-sharing.html for "
+"details\n"
+"    "
+msgstr ""
+
+#: sat/plugins/plugin_sec_aesgcm.py:63
+msgid "AESGCM plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:50
+msgid "Implementation of OTR"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:55
+msgid "OTR"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:56
+msgid ""
+"To authenticate your correspondent, you need to give your below "
+"fingerprint *BY AN EXTERNAL CANAL* (i.e. not in this chat), and check "
+"that the one he gives you is the same as below. If there is a mismatch, "
+"there can be a spy between you!"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:61
+msgid ""
+"You private key is used to encrypt messages for your correspondent, "
+"nobody except you must know it, if you are in doubt, you should drop it!"
+"\n"
+"\n"
+"Are you sure you want to drop your private key?"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:67
+msgid "Some of advanced features are disabled !"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:169
+#, python-format
+msgid "/!\\ conversation with %(other_jid)s is now UNENCRYPTED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:182
+msgid "trusted"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:182
+msgid "untrusted"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:185
+msgid "{trusted} OTR conversation with {other_jid} REFRESHED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:189
+msgid ""
+"{trusted} encrypted OTR conversation started with {other_jid}\n"
+"{extra_info}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:201
+msgid "OTR conversation with {other_jid} is FINISHED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:209
+msgid "Unknown OTR state"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:249
+msgid "Save is called but privkey is None !"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:308
+msgid "OTR plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:418
+msgid "You have no private key yet, start an OTR conversation to have one"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:424
+msgid "No private key"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:436
+msgid ""
+"Your fingerprint is:\n"
+"{fingerprint}\n"
+"\n"
+"Start an OTR conversation to have your correspondent one."
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:442 sat/plugins/plugin_xep_0384.py:687
+msgid "Fingerprint"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:453
+msgid "Your correspondent {correspondent} is now TRUSTED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:459
+msgid "Your correspondent {correspondent} is now UNTRUSTED"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:477
+msgid "Authentication ({entity_jid})"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:483
+msgid ""
+"Your own fingerprint is:\n"
+"{fingerprint}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:486
+msgid ""
+"Your correspondent fingerprint should be:\n"
+"{fingerprint}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:492
+msgid "Is your correspondent fingerprint the same as here ?"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:494
+msgid "yes"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:494
+msgid "no"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:520
+msgid ""
+"Can't start an OTR session, there is already an encrypted session with "
+"{name}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:598
+msgid "You don't have a private key yet !"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:611
+msgid "Your private key has been dropped"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:620
+msgid "Confirm private key drop"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:649
+msgid "WARNING: received unencrypted data in a supposedly encrypted context"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:656
+msgid "WARNING: received OTR encrypted data in an unencrypted context"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:662
+msgid "WARNING: received OTR error message: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:668
+msgid "Error while trying de decrypt OTR message: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:780
+msgid ""
+"Your message was not sent because your correspondent closed the encrypted"
+" conversation on his/her side. Either close your own side, or refresh the"
+" session."
+msgstr ""
+
+#: sat/plugins/plugin_sec_otr.py:785
+msgid "Message discarded because closed encryption channel"
+msgstr ""
+
+#: sat/plugins/plugin_syntax_wiki_dotclear.py:40
+msgid "Implementation of Dotclear wiki syntax"
+msgstr ""
+
+#: sat/plugins/plugin_syntax_wiki_dotclear.py:664
+msgid "Dotclear wiki syntax plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:38
+msgid ""
+"Tickets import management:\n"
+"This plugin manage the different tickets importers which can register to "
+"it, and handle generic importing tasks."
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:57
+msgid "plugin Tickets Import initialization"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:111
+msgid "comments_uri key will be generated and must not be used by importer"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:115
+msgid "{key} must be a list"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:174
+msgid "mapping option must be a dictionary"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import.py:179
+msgid "keys and values of mapping must be sources and destinations ticket fields"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:41
+msgid "Tickets importer for Bugzilla"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:44
+msgid "import tickets from Bugzilla xml export file"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:46
+msgid ""
+"This importer handle Bugzilla xml export file.\n"
+"\n"
+"To use it, you'll need to export tickets using XML.\n"
+"Tickets will be uploaded with the same ID as for Bugzilla, any existing "
+"ticket with this ID will be replaced.\n"
+"\n"
+"location: you must use the absolute path to your .xml file\n"
+msgstr ""
+
+#: sat/plugins/plugin_tickets_import_bugzilla.py:128
+msgid "Bugilla Import plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:37
+msgid "Implementation of directory subscription"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:47
+msgid "Directory subscription plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:50
+#: sat/plugins/plugin_xep_0050.py:315 sat/plugins/plugin_xep_0100.py:84
+msgid "Service"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:50
+msgid "Directory subscription"
+msgstr ""
+
+#: sat/plugins/plugin_tmp_directory_subscription.py:53
+msgid "User directory subscription"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0020.py:46
+msgid "Implementation of Feature Negotiation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0020.py:52
+msgid "Plugin XEP_0020 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0020.py:104
+msgid "More than one value choosed for {}, keeping the first one"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:66
+msgid "Implementation of Extended Stanza Addressing"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:76
+msgid "Extended Stanza Addressing plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:97
+msgid "XEP-0033 is being used but the server doesn't support it!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:103
+msgid " or "
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:105
+#, python-format
+msgid ""
+"Stanzas using XEP-0033 should be addressed to %(expected)s, not "
+"%(current)s!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0033.py:111
+msgid "TODO: addressing has been fixed by the backend... fix it in the frontend!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:56
+msgid "Implementation of Multi-User Chat"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:89
+msgid "Plugin XEP_0045 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:145
+msgid "MUC"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:145
+msgid "configure"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:146
+msgid "Configure Multi-User Chat room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:194
+msgid ""
+"Received non delayed message in a room before its initialisation: "
+"state={state}, msg={msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:216 sat/plugins/plugin_xep_0045.py:224
+#: sat/plugins/plugin_xep_0045.py:880
+msgid "This room has not been joined"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:283
+msgid "Room joining cancelled by user"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:288
+msgid "Rooms in {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:303
+msgid "room locked !"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:306
+msgid "Error while configuring the room: {failure_}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:322
+msgid "Room {} is restricted"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:323
+msgid "This room is restricted, please enter the password"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:332
+msgid "Error while joining the room {room}{suffix}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:334
+msgid "Group chat error"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:401
+msgid "room_jid key is not present !"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:406
+msgid "No configuration available for this room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:440 sat/plugins/plugin_xep_0045.py:442
+msgid "Session ID doesn't exist, session has probably expired."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:441
+msgid "Room configuration failed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:447
+msgid "Room configuration succeed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:448
+msgid "The new settings have been saved."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:509
+msgid "No MUC service found on main server"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:538
+msgid ""
+"Invalid room identifier: {room_id}'. Please give a room short or full "
+"identifier like 'room' or 'room@{muc_service}'."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:558
+msgid "{profile} is already in room {room_jid}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:561
+msgid "[{profile}] is joining room {room} with nick {nick}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:729
+msgid "You must provide a member's nick to kick."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:738
+msgid "You have kicked {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:740 sat/plugins/plugin_xep_0045.py:776
+msgid " for the following reason: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:763
+msgid "You must provide a valid JID to ban, like in '/ban contact@example.net'"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:774
+msgid "You have banned {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:802
+msgid ""
+"You must provide a valid JID to affiliate, like in '/affiliate "
+"contact@example.net member'"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:808
+#, python-format
+msgid "You must provide a valid affiliation: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:815
+msgid "New affiliation for {entity}: {affiliation}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:862
+msgid "No known default MUC service {unparsed}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:867
+msgid "{} is not a valid JID!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:885
+#, python-format
+msgid "Nickname: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:887
+#, python-format
+msgid "Entity: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:889
+#, python-format
+msgid "Affiliation: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:891
+#, python-format
+msgid "Role: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:893
+#, python-format
+msgid "Status: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:895
+#, python-format
+msgid "Show: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:960
+msgid ""
+"room {room} is not in expected state: room is in state {current_state} "
+"while we were expecting {expected_state}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1093
+msgid "No message received while offline in {room_jid}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1097
+msgid "We have received {num_mess} message(s) in {room_jid} while offline."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1141
+msgid "missing nick in presence: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1217
+msgid "user {nick} has joined room {room_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1234
+msgid "=> {} has joined the room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1253
+msgid "Room ({room}) left ({profile})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1267
+msgid "user {nick} left room {room_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1279
+msgid "<= {} has left the room"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1342
+msgid "received history in unexpected state in room {room} (state: {state})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1350
+msgid "storing the unexpected message anyway, to avoid loss"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0045.py:1437
+msgid "New subject for room ({room_id}): {subject}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:62
+msgid "Implementation of In-Band Bytestreams"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:71
+msgid "In-Band Bytestreams plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:162
+msgid "IBB stream opening"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:171
+#, python-format
+msgid "Ignoring unexpected IBB transfer: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:176
+msgid "sended jid inconsistency (man in the middle attack attempt ?)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:206
+msgid "IBB stream closing"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:228
+msgid "Received data for an unknown session id"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:236
+msgid ""
+"sended jid inconsistency (man in the middle attack attempt ?)\n"
+"initial={initial}\n"
+"given={given}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:246
+msgid "Sequence error"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0047.py:261
+msgid "Invalid base64 data"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:45
+msgid "Implementation of bookmarks"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:58
+msgid "Bookmarks plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:63 sat_frontends/primitivus/base.py:540
+msgid "Groups"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:63
+msgid "Bookmarks"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:66
+msgid "Use and manage bookmarks"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:147
+msgid "Private XML storage not available"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:260
+msgid "No room jid selected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:280
+msgid "Bookmarks manager"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:310 sat_frontends/jp/cmd_bookmarks.py:126
+msgid "add a bookmark"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:312
+msgid "Name"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:314 sat_frontends/jp/cmd_profile.py:175
+msgid "jid"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:316
+msgid "Nickname"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:318
+msgid "Autojoin"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:321 sat_frontends/primitivus/xmlui.py:470
+msgid "Save"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:367
+msgid "Bookmarks will be local only"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:368
+#, python-format
+msgid "Type selected for \"auto\" storage: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:500
+msgid "Bad arguments"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:509
+#, python-format
+msgid "All [%s] bookmarks are being removed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0048.py:520
+msgid "Bookmark added"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0049.py:37
+msgid "Implementation of private XML storage"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0049.py:45
+msgid "Plugin XEP-0049 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:51
+#: sat_frontends/quick_frontend/constants.py:29
+msgid "Online"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:52
+msgid "Away"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:53
+#: sat_frontends/quick_frontend/constants.py:30
+msgid "Free for chat"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:54
+#: sat_frontends/quick_frontend/constants.py:32
+msgid "Do not disturb"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:55
+msgid "Left"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:56 sat_frontends/primitivus/base.py:535
+msgid "Disconnect"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:67
+msgid "Implementation of Ad-Hoc Commands"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:126
+msgid "The groups [{group}] is unknown for profile [{profile}])"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:284
+msgid "plugin XEP-0050 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:315
+msgid "Commands"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:318
+msgid "Execute ad-hoc commands"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:329
+msgid "Status"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:364
+msgid "Missing command element"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:379
+msgid "Please select a command"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:397
+#, python-format
+msgid "Invalid note type [%s], using info"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:408
+msgid "WARNING"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:409
+msgid "ERROR"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:457
+msgid "No known payload found in ad-hoc command result, aborting"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:464
+msgid "No payload found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:574
+msgid "Please enter target jid"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:588
+msgid "status selection"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0050.py:618
+msgid "Status updated"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:64
+msgid "Implementation of vcard-temp"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:84
+msgid "Plugin XEP_0054 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:99
+msgid "No avatar in cache for {profile}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:137
+msgid "Decoding binary"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:242
+msgid "vCard element not found for {entity_jid}: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:287
+msgid "Can't get vCard for {entity_jid}: {e}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0054.py:291
+msgid "VCard found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:53
+msgid "Implementation of Jabber Search"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:70
+msgid "Jabber search plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:100 sat/stdui/ui_contact_list.py:39
+#: sat/stdui/ui_contact_list.py:45 sat/stdui/ui_contact_list.py:51
+#: sat_frontends/primitivus/base.py:539
+#: sat_frontends/primitivus/contact_list.py:50
+msgid "Contacts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:100
+msgid "Search directory"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:103
+msgid "Search user directory"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:143
+msgid "Search users"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:174
+msgid "Search for"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:181
+msgid "Simple search"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:191 sat/plugins/plugin_xep_0055.py:305
+msgid "Search"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:226
+msgid "Advanced search"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:246
+msgid "Search on"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:248
+msgid "Other service"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:256
+msgid "Refresh fields"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:260
+msgid "Displaying the search form for"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:341
+msgid "Search results"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:346
+msgid "The search gave no result"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:386 sat/plugins/plugin_xep_0055.py:493
+msgid "No query element found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:391 sat/plugins/plugin_xep_0055.py:498
+msgid "No data form found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:403
+#, python-format
+msgid "Fields request failure: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:478
+msgid "The search could not be performed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0055.py:510
+#, python-format
+msgid "Search request failure: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0059.py:42
+msgid "Implementation of Result Set Management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0059.py:52
+msgid "Result Set Management plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0059.py:65
+msgid "rsm_max can't be negative"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:56
+msgid "Implementation of PubSub Protocol"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:95
+msgid "PubSub plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:323
+msgid "Can't retrieve pubsub_service from conf, we'll use first one that we find"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:487
+msgid "Can't parse items: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:556
+msgid "Invalid item: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:572
+msgid ""
+"Can't use publish-options ({options}) on node {node}, re-publishing "
+"without them: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:905 sat/plugins/plugin_xep_0060.py:948
+msgid "Invalid result: missing <affiliations> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:916 sat/plugins/plugin_xep_0060.py:961
+msgid "Invalid result: bad <affiliation> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1284
+msgid "Invalid result: missing <subscriptions> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1289
+msgid "Invalid result: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0060.py:1299
+msgid "Invalid result: bad <subscription> element: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0065.py:90
+msgid "Implementation of SOCKS5 Bytestreams"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0065.py:528
+msgid "File transfer completed, closing connection"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0065.py:695
+#, python-format
+msgid "Socks 5 client connection lost (reason: %s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0065.py:723
+msgid "Plugin XEP_0065 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0065.py:781
+msgid "Socks5 Stream server launched on port {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:56
+msgid "Implementation of HTTP Requests via XMPP"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:66
+msgid "Plugin XEP_0070 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:79
+msgid "XEP-0070 Verifying HTTP Requests via XMPP (iq)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:88
+msgid "XEP-0070 Verifying HTTP Requests via XMPP (message)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:98
+msgid "Auth confirmation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:99
+msgid ""
+"{auth_url} needs to validate your identity, do you agree?\n"
+"Validation code : {auth_id}\n"
+"\n"
+"Please check that this code is the same as on {auth_url}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:117
+msgid "XEP-0070 reply iq"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:122
+msgid "XEP-0070 reply message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0070.py:127
+msgid "XEP-0070 reply error"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0071.py:55
+msgid "Implementation of XHTML-IM"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0071.py:94
+msgid "XHTML-IM plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0071.py:223
+msgid "Can't have XHTML and rich content at the same time"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:41
+msgid "Implementation of in-band registration"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:54
+msgid "Registration asked for {jid}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:79
+msgid "Stream started with {server}, now registering"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:85
+msgid "Registration answer: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:89
+msgid "Registration failure: {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:116
+msgid "Plugin XEP_0077 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:176
+msgid "Can't find data form"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:178
+msgid "This gateway can't be managed by SàT, sorry :("
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:202 sat/plugins/plugin_xep_0077.py:212
+#, python-format
+msgid "Registration failure: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:206
+#, python-format
+msgid "registration answer: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:215
+msgid "Username already exists, please choose an other one"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0077.py:229
+msgid "Asking registration for {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0085.py:55
+msgid "Implementation of Chat State Notifications Protocol"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0085.py:97
+msgid "Enable chat state notifications"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0085.py:101
+msgid "Chat State Notifications plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:42
+msgid "Implementation of Software Version"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:48
+msgid "Plugin XEP_0092 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:119
+#, python-format
+msgid "Client name: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:121
+#, python-format
+msgid "Client version: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:123
+#, python-format
+msgid "Operating system: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:128
+msgid "Software version not available"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0092.py:130
+msgid "Client software version request timeout"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0095.py:41
+msgid "Implementation of Stream Initiation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0095.py:54
+msgid "Plugin XEP_0095 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0095.py:84
+msgid "XEP-0095 Stream initiation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0095.py:127
+msgid "sending stream initiation accept answer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0095.py:168
+#, python-format
+msgid "Stream Session ID: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:48
+msgid "Implementation of SI File Transfer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:55
+msgid "Stream Initiation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:58
+msgid "Plugin XEP_0096 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:129
+msgid "XEP-0096 file transfer requested"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:377
+msgid "The contact {} has refused your file"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:378
+msgid "File refused"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:381
+msgid "Error during file transfer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:382
+msgid ""
+"Something went wrong during the file transfer session initialisation: "
+"{reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:385
+msgid "File transfer error"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:394
+msgid "transfer {sid} successfuly finished [{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0096.py:402
+msgid "transfer {sid} failed [{profile}]: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:37
+msgid "Implementation of Gateways protocol"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:40
+msgid ""
+"Be careful ! Gateways allow you to use an external IM (legacy IM), so you"
+" can see your contact as XMPP contacts.\n"
+"But when you do this, all your messages go throught the external legacy "
+"IM server, it is a huge privacy issue (i.e.: all your messages throught "
+"the gateway can be monitored, recorded, analysed by the external server, "
+"most of time a private company)."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:48
+msgid "Internet Relay Chat"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:49
+msgid "XMPP"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:50
+msgid "Tencent QQ"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:51
+msgid "SIP/SIMPLE"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:52
+msgid "ICQ"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:53
+msgid "Yahoo! Messenger"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:54
+msgid "Gadu-Gadu"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:55
+msgid "AOL Instant Messenger"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:56
+msgid "Windows Live Messenger"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:62
+msgid "Gateways plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:84
+msgid "Gateways"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:87
+msgid "Find gateways"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:108
+#, python-format
+msgid "Gateways manager (%s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:121
+#, python-format
+msgid "Failed (%s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:134
+msgid "Use external XMPP server"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:136
+msgid "Go !"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:143
+msgid "No gateway index selected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:158
+#, python-format
+msgid ""
+"INTERNAL ERROR: identity category should always be \"gateway\" in "
+"_getTypeString, got \"%s\""
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:166
+msgid "Unknown IM"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:170
+msgid "Registration successful, doing the rest"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:195
+msgid "Timeout"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:211
+#, python-format
+msgid "Found gateway [%(jid)s]: %(identity_name)s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:222
+#, python-format
+msgid "Skipping [%(jid)s] which is not a gateway"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:231
+msgid "No gateway found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:236
+#, python-format
+msgid "item found: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0100.py:260
+#, python-format
+msgid "find gateways (target = %(target)s, profile = %(profile)s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0106.py:38
+msgid "(Un)escape JID to use disallowed chars in local parts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:50
+msgid "Implementation of entity capabilities"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:58
+msgid "Plugin XEP_0115 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:73
+msgid "Caps optimisation enabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:76
+msgid "Caps optimisation not available"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:154
+#, python-format
+msgid "Received invalid capabilities tag: %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:170
+msgid ""
+"Unknown hash method for entity capabilities: [{hash_method}] (entity: "
+"{entity_jid}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:183
+msgid ""
+"Computed hash differ from given hash:\n"
+"given: [{given}]\n"
+"computed: [{computed}]\n"
+"(entity: {entity_jid}, node: {node})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0115.py:205
+msgid "Couldn't retrieve disco info for {jid}: {error}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:42
+msgid "Implementation of Personal Eventing Protocol"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:48
+msgid "PEP plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:131
+#, python-format
+msgid "Trying to send personal event with an unknown profile key [%s]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:136
+msgid "Trying to send personal event for an unknown type"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:142
+msgid "No item found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:149
+msgid "Can't find mood element in mood event"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0163.py:153
+msgid "No mood found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:50
+msgid "{entity} want to start a jingle session with you, do you accept ?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:60
+msgid "Implementation of Jingle"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:98
+msgid "plugin Jingle initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:156
+msgid "Error while terminating session: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:395
+msgid "You can't do a jingle session with yourself"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0166.py:511
+msgid "Confirm Jingle session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:71
+msgid "Implementation of Message Delivery Receipts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:96
+msgid "Enable message delivery receipts"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:100
+msgid "Plugin XEP_0184 (message delivery receipts) initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:136
+msgid "[XEP-0184] Request acknowledgment for message id {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:180
+msgid "[XEP-0184] Receive acknowledgment for message id {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0184.py:190
+msgid "[XEP-0184] Delete waiting acknowledgment for message id {}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:46
+msgid "Implementation of Stream Management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:134
+msgid "Plugin Stream Management initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:144
+msgid "Invalid ack_timeout value, please check your configuration"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:147
+msgid "Ack timeout disabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:149
+msgid "Ack timeout set to {timeout}s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:171
+msgid ""
+"Your server doesn't support stream management ({namespace}), this is used"
+" to improve connection problems detection (like network outages). Please "
+"ask your server administrator to enable this feature."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:302
+msgid ""
+"Connection failed using location given by server (host: {host}, port: "
+"{port}), switching to normal host and port (host: {normal_host}, port: "
+"{normal_port})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:317
+msgid "Incorrect <enabled/> element received, no \"id\" attribute"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:319
+msgid ""
+"You're server doesn't support session resuming with stream management, "
+"please contact your server administrator to enable it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:341
+msgid "Invalid location received: {location}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:359
+msgid "Invalid \"max\" attribute"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:361
+msgid "Using default session max value ({max_s} s)."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:363
+msgid "Stream Management enabled"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:367
+msgid "Stream Management enabled, with a resumption time of {res_m:.2f} min"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:382
+msgid ""
+"Stream session resumed (disconnected for {d_time} s, {count} stanza(s) "
+"resent)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:395
+msgid "Can't use stream management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:399
+msgid "{msg}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:408
+msgid "stream resumption not possible, restarting full session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:495
+msgid "Server returned invalid ack element, disabling stream management: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:501
+msgid "Server acked more stanzas than we have sent, disabling stream management."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0198.py:511
+msgid "Ack was not received in time, aborting connection"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:39
+msgid "Implementation of XMPP Ping"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:49
+msgid "XMPP Ping plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:109
+msgid "ping error ({err_msg}). Response time: {time} s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:123
+msgid "Invalid jid: \"{entity_jid}\""
+msgstr ""
+
+#: sat/plugins/plugin_xep_0199.py:134
+msgid "XMPP PING received from {from_jid} [{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0203.py:45
+msgid "Implementation of Delayed Delivery"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0203.py:51
+msgid "Delayed Delivery plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0231.py:48
+msgid "Implementation of bits of binary (used for small images/files)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0231.py:59
+msgid "plugin Bits of Binary initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:54
+msgid "Implementation of Jingle File Transfer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:67
+msgid "file transfer"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:70
+msgid "plugin Jingle File Transfer initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:380
+msgid "hash_algo must be set if file_hash is set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:385
+msgid "file_hash must be set if hash_algo is set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:419
+msgid "only the following keys are allowed in extra: {keys}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:454
+msgid "you need to provide at least name or file hash"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0234.py:524
+msgid "File continue is not implemented yet"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:55
+msgid "Implementation of Direct MUC Invitations"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:75
+msgid "Auto-join MUC on invitation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:86
+msgid "Plugin XEP_0249 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:140
+#, python-format
+msgid "Invitation accepted for room %(room)s [%(profile)s]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:155
+msgid "invalid invitation received: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:159
+#, python-format
+msgid "Invitation received for room %(room)s [%(profile)s]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:170
+msgid "Invitation silently discarded because user is already in the room."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:181
+#, python-format
+msgid ""
+"An invitation from %(user)s to join the room %(room)s has been declined "
+"according to your personal settings."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:185 sat/plugins/plugin_xep_0249.py:192
+msgid "MUC invitation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:188
+#, python-format
+msgid ""
+"You have been invited by %(user)s to join the room %(room)s. Do you "
+"accept?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0249.py:215
+msgid "You must provide a valid JID to invite, like in '/invite contact@{host}'"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0260.py:51
+msgid "Implementation of Jingle SOCKS5 Bytestreams"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0260.py:64
+msgid "plugin Jingle SOCKS5 Bytestreams"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0261.py:47
+msgid "Implementation of Jingle In-Band Bytestreams"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0261.py:55
+msgid "plugin Jingle In-Band Bytestreams"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0264.py:67
+msgid "Thumbnails handling"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0264.py:79
+msgid "Plugin XEP_0264 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:71
+msgid "Implementation of microblogging Protocol"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:83
+msgid "Microblogging plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:286
+msgid "Content of type XHTML must declare its namespace!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:557
+msgid "Can't have xhtml and rich content at the same time"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:1041
+#, python-format
+msgid "Microblog node has now access %s"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0277.py:1045
+msgid "Can't set microblog access"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:39
+msgid "Message carbons"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:50
+msgid "Implementation of Message Carbons"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:75
+msgid "Plugin XEP_0280 initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:102
+msgid "Not activating message carbons as requested in params"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:107
+msgid "server doesn't handle message carbons"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:109
+msgid "message carbons available, enabling it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0280.py:117
+msgid "message carbons activated"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0297.py:44
+msgid "Implementation of Stanza Forwarding"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0297.py:52
+msgid "Stanza Forwarding plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0300.py:45
+msgid "Management of cryptographic hashes"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0300.py:66
+msgid "plugin Hashes initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:51
+msgid "Implementation of Message Archive Management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:64
+msgid "Message Archive Management plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:92
+msgid "It seems that we have no MAM history yet"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:126
+msgid "missing \"to\" attribute in forwarded message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:137
+msgid "missing \"from\" attribute in forwarded message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:140
+msgid ""
+"was expecting a message sent by our jid, but this one if from {from_jid},"
+" ignoring\n"
+"{xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:158
+msgid "We have received no message while offline"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0313.py:160
+msgid "We have received {num_mess} message(s) while offline."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:50
+msgid "Implementation of File Information Sharing"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:86
+msgid "path change chars found in name [{name}], hack attempt?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:107
+msgid "path can only be set on path nodes"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:141
+msgid "a node can't have several parents"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:210
+msgid ""
+"parent dir (\"..\") found in path, hack attempt? path is {path} "
+"[{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:271
+msgid "File Information Sharing initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:394
+msgid "invalid path: {path}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:428
+msgid "{peer_jid} requested a file (s)he can't access [{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:461
+msgid "error while retrieving files: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:513
+msgid "ignoring invalid unicode name ({name}): {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:534
+msgid "unexpected type: {type}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:573
+msgid "unknown node type: {type}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:711
+msgid "unexpected element, ignoring: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1184
+msgid "This path doesn't exist!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1186
+msgid "A path need to be specified"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1188
+msgid "access must be a dict"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1200
+msgid "Can't find a proper name"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0329.py:1211
+msgid ""
+"A directory with this name is already shared, renamed to {new_name} "
+"[{profile}]"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0334.py:43
+msgid "Implementation of Message Processing Hints"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0334.py:45
+msgid ""
+"             Frontends can use HINT_* constants in mess_data['extra'] in "
+"a serialized 'hints' dict.\n"
+"             Internal plugins can use directly addHint([HINT_* "
+"constant]).\n"
+"             Will set mess_data['extra']['history'] to 'skipped' when no "
+"store is requested and message is not saved in history."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0334.py:65
+msgid "Message Processing Hints plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:54
+msgid "Handle Pubsub data schemas"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:60
+msgid "PubSub Schema initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:208
+msgid "unspecified schema, we need to request it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:212
+msgid ""
+"no schema specified, and this node has no schema either, we can't "
+"construct the data form"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:233
+msgid "Invalid Schema: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:246
+msgid "nodeIndentifier needs to be set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:310
+msgid "empty node is not allowed"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:354
+msgid "default_node must be set if nodeIdentifier is not set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:457
+msgid "field {name} doesn't exist, ignoring it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:551
+msgid "Can't parse date field: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:652
+msgid "Can't get previous item, update ignored: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:661
+msgid "Can't parse previous item, update ignored: data form not found"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:719
+msgid "default_node must be set if node is not set"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0346.py:728
+msgid "if extra[\"update\"] is set, item_id must be set too"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:35
+msgid ""
+"Notify server when frontend is not actively used, to limit traffic and "
+"save bandwidth and battery life"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:45
+msgid "Client State Indication plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:63
+msgid "Client State Indication is available on this server"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0352.py:67
+msgid ""
+"Client State Indication is not available on this server, some bandwidth "
+"optimisations can't be used."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:46
+msgid "Implementation of Jingle Message Initiation"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:53
+msgid "plugin {name} initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:122
+msgid "Message initiation with {peer_jid} timed out"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:166
+msgid ""
+"Somebody not in your contact list ({peer_jid}) wants to do a "
+"\"{human_name}\" session with you, this would leak your presence and "
+"possibly you IP (internet localisation), do you accept?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:171
+msgid "Invitation from an unknown contact"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0353.py:211
+msgid "no pending session found with id {session_id}, did it timed out?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0359.py:40
+msgid "Implementation of Unique and Stable Stanza IDs"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0359.py:49
+msgid "Unique and Stable Stanza IDs plugin initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:51
+msgid "Implementation of HTTP File Upload"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:83
+msgid "plugin HTTP File Upload initialization"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:200
+msgid "Can't get upload slot: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:265
+msgid "upload failed: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:349
+msgid "Invalid header element: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:355
+msgid "Ignoring unauthorised header \"{name}\": {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0363.py:400
+msgid "no service can handle HTTP Upload request: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:35
+msgid "Implementation of Explicit Message Encryption"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:94
+msgid ""
+"Message from {sender} is encrypted with {algorithm} and we can't decrypt "
+"it."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0380.py:96
+msgid ""
+"User {sender} sent you an encrypted message (encrypted with {algorithm}),"
+" and we can't decrypt it."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:62
+msgid "Implementation of OMEMO"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:440
+msgid "Security"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:442
+msgid "OMEMO default trust policy"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:443
+msgid "Manual trust (more secure)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:445
+msgid "Blind Trust Before Verification (more user friendly)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:449
+msgid "OMEMO plugin initialization (omemo module v{version})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:453
+msgid ""
+"Your version of omemo module is too old: {v[0]}.{v[1]}.{v[2]} is minimum "
+"required, please update."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:488
+msgid "You need to have OMEMO encryption activated to reset the session"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:503
+msgid "OMEMO session has been reset"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:551
+msgid "device {device} from {peer_jid} is not an auto-trusted device anymore"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:612
+msgid "Can't find bundle for device {device_id} of user {bare_jid}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:642
+msgid "OMEMO trust management"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:645
+msgid ""
+"This is OMEMO trusting system. You'll see below the devices of your "
+"contacts, and a checkbox to trust them or not. A trusted device can read "
+"your messages in plain text, so be sure to only validate devices that you"
+" are sure are belonging to your contact. It's better to do this when you "
+"are next to your contact and her/his device, so you can check the "
+"\"fingerprint\" (the number next to the device) yourself. Do *not* "
+"validate a device if the fingerprint is wrong!"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:655
+msgid "This device ID"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:657
+msgid "This device fingerprint"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:669
+msgid "Automatically trust new devices?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:683
+msgid "Contact"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:685
+msgid "Device ID"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:691
+msgid "Trust this device?"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:696
+msgid "(automatically trusted)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:724
+msgid "We have no identity for this device yet, let's generate one"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:749
+msgid "Saving public bundle for this device ({device_id})"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:770
+msgid "OMEMO devices list is stored in more that one items, this is not expected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:776
+msgid "no list element found in OMEMO devices list"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:782
+msgid "device element is missing \"id\" attribute: {elt}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:785
+msgid "invalid device id: {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:804
+msgid "there is no node to handle OMEMO devices"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:826
+msgid "Can't set devices: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:850
+msgid "Bundle missing for device {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:855
+msgid "Can't get bundle for device {device_id}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:859
+msgid ""
+"no item found in node {node}, can't get public bundle for device "
+"{device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:864
+msgid "more than one item found in {node}, this is not expected"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:878
+msgid "invalid bundle for device {device_id}, ignoring"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:902
+msgid "error while decoding key for device {device_id}: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:916
+msgid "updating bundle for {device_id}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:949
+msgid "Can't set bundle: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:969
+msgid "Our own device is missing from devices list, fixing it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:988
+msgid ""
+"Not all destination devices are trusted, unknown devices will be blind "
+"trusted due to the OMEMO Blind Trust Before Verification policy. If you "
+"want a more secure workflow, please activate \"manual\" OMEMO policy in "
+"settings' \"Security\" tab.\n"
+"Following fingerprint have been automatically trusted:\n"
+"{devices}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1010
+msgid ""
+"Not all destination devices are trusted, we can't encrypt message in such"
+" a situation. Please indicate if you trust those devices or not in the "
+"trust manager before we can send this message"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1053
+msgid "discarding untrusted device {device_id} with key {device_key} for {entity}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1095
+msgid ""
+"Can't retrieve bundle for device(s) {devices} of entity {peer}, the "
+"message will not be readable on this/those device(s)"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1100
+msgid ""
+"You're destinee {peer} has missing encryption data on some of his/her "
+"device(s) (bundle on device {devices}), the message won't  be readable on"
+" this/those device."
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1151
+msgid "Too many iterations in encryption loop"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1180
+msgid "Can't encrypt message for {entities}: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1270
+msgid "Invalid OMEMO encrypted stanza, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1276
+msgid "Invalid OMEMO encrypted stanza, missing sender device ID, ignoring: {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1284
+msgid ""
+"This OMEMO encrypted stanza has not been encrypted for our device "
+"(device_id: {device_id}, fingerprint: {fingerprint}): {xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1290
+msgid ""
+"An OMEMO message from {sender} has not been encrypted for our device, we "
+"can't decrypt it"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1297
+msgid "Invalid recipient ID: {msg}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1330
+msgid ""
+"Can't decrypt message: {reason}\n"
+"{xml}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1332
+msgid "An OMEMO message from {sender} can't be decrypted: {reason}"
+msgstr ""
+
+#: sat/plugins/plugin_xep_0384.py:1364
+msgid ""
+"Our message with UID {uid} has not been received in time, it has probably"
+" been lost. The message was: {msg!r}"
+msgstr ""
+
+#: sat/plugins/plugin_app_manager_docker/__init__.py:38
+msgid "Applications Manager for Docker"
+msgstr ""
+
+#: sat/plugins/plugin_app_manager_docker/__init__.py:48
+msgid "Docker App Manager initialization"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:39 sat/stdui/ui_contact_list.py:42
+#: sat/stdui/ui_contact_list.py:190 sat/stdui/ui_contact_list.py:276
+msgid "Add contact"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:45 sat/stdui/ui_contact_list.py:48
+#: sat/stdui/ui_contact_list.py:209
+msgid "Update contact"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:51 sat/stdui/ui_contact_list.py:54
+msgid "Remove contact"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:157
+msgid "Select in which groups your contact is:"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:172
+msgid "Add group"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:174
+msgid "Add"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:191
+msgid "New contact identifier (JID):"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:203
+msgid "Nothing to update"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:204 sat/stdui/ui_contact_list.py:223
+msgid "Your contact list is empty."
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:210
+msgid "Which contact do you want to update?"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:222
+msgid "Nothing to delete"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:228
+msgid "Who do you want to remove from your contacts?"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:251
+msgid "Delete contact"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:253
+#, python-format
+msgid "Are you sure you want to remove %s from your contact list?"
+msgstr ""
+
+#: sat/stdui/ui_contact_list.py:277
+#, python-format
+msgid "Please enter a valid JID (like \"contact@%s\"):"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:62
+msgid "Profile password for {}"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:72 sat/stdui/ui_profile_manager.py:119
+msgid "Connection error"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:76
+#: sat_frontends/quick_frontend/quick_profile_manager.py:171
+msgid "Internal error"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:77
+msgid "Internal error: {}"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:121
+#, python-format
+msgid "Can't connect to %s. Please check your connection details."
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:127
+#, python-format
+msgid "XMPP password for %(profile)s%(counter)s"
+msgstr ""
+
+#: sat/stdui/ui_profile_manager.py:135
+#, python-format
+msgid ""
+"Can't connect to %s. Please check your connection details or try with "
+"another password."
+msgstr ""
+
+#: sat/test/constants.py:57
+msgid "Enable unibox"
+msgstr ""
+
+#: sat/test/constants.py:58
+msgid "'Wysiwyg' edition"
+msgstr ""
+
+#: sat/test/test_plugin_misc_room_game.py:43
+msgid "Dummy plugin to test room game"
+msgstr ""
+
+#: sat/tools/config.py:53
+#, python-format
+msgid "Testing file %s"
+msgstr ""
+
+#: sat/tools/config.py:72
+msgid "Config auto-update: {option} set to {value} in the file {config_file}."
+msgstr ""
+
+#: sat/tools/config.py:86
+msgid "Can't read main config: {msg}"
+msgstr ""
+
+#: sat/tools/config.py:91
+msgid "Configuration was read from: {filenames}"
+msgstr ""
+
+#: sat/tools/config.py:95
+msgid "No configuration file found, using default settings"
+msgstr ""
+
+#: sat/tools/image.py:35
+msgid "SVG support not available, please install cairosvg: {e}"
+msgstr ""
+
+#: sat/tools/trigger.py:66
+#, python-format
+msgid "There is already a bound priority [%s]"
+msgstr ""
+
+#: sat/tools/trigger.py:69
+#, python-format
+msgid "There is already a trigger with the same priority [%s]"
+msgstr ""
+
+#: sat/tools/video.py:38
+msgid "ffmpeg executable not found, video thumbnails won't be available"
+msgstr ""
+
+#: sat/tools/video.py:56
+msgid "ffmpeg executable is not available, can't generate video thumbnail"
+msgstr ""
+
+#: sat/tools/xml_tools.py:86
+msgid "Fixed field has neither value nor label, ignoring it"
+msgstr ""
+
+#: sat/tools/xml_tools.py:485
+msgid "INTERNAL ERROR: parameters xml not valid"
+msgstr ""
+
+#: sat/tools/xml_tools.py:495
+msgid "INTERNAL ERROR: params categories must have a name"
+msgstr ""
+
+#: sat/tools/xml_tools.py:505
+msgid "INTERNAL ERROR: params must have a name"
+msgstr ""
+
+#: sat/tools/xml_tools.py:557
+msgid "The 'options' tag is not allowed in parameter of type 'list'!"
+msgstr ""
+
+#: sat/tools/xml_tools.py:655
+msgid "TabElement must be a child of TabsContainer"
+msgstr ""
+
+#: sat/tools/xml_tools.py:760
+msgid "Can't set row index if auto_index is True"
+msgstr ""
+
+#: sat/tools/xml_tools.py:893
+msgid "either items or columns need do be filled"
+msgstr ""
+
+#: sat/tools/xml_tools.py:907
+msgid "Headers lenght doesn't correspond to columns"
+msgstr ""
+
+#: sat/tools/xml_tools.py:954
+msgid "Incorrect number of items in list"
+msgstr ""
+
+#: sat/tools/xml_tools.py:978
+msgid "A widget with the name \"{name}\" already exists."
+msgstr ""
+
+#: sat/tools/xml_tools.py:1171
+msgid "Value must be an integer"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1186
+msgid "Value must be 0, 1, false or true"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1249
+msgid ""
+"\"multi\" flag and \"selected\" option are not compatible with "
+"\"noselect\" flag"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1258
+msgid "empty \"options\" list"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1277 sat/tools/xml_tools.py:1311
+msgid "invalid styles"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1335
+msgid "DialogElement must be a direct child of TopElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1350
+msgid "MessageElement must be a direct child of DialogElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1365
+msgid "ButtonsElement must be a direct child of DialogElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1379
+msgid "FileElement must be a direct child of DialogElement"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1458
+#, python-format
+msgid "Unknown panel type [%s]"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1460
+msgid "form XMLUI need a submit_id"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1462
+msgid "container argument must be a string"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1465
+msgid "dialog_opt can only be used with dialog panels"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1492
+msgid "createWidget can't be used with dialogs"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1590
+msgid "Submit ID must be filled for this kind of dialog"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1618
+#, python-format
+msgid "Unknown container type [%s]"
+msgstr ""
+
+#: sat/tools/xml_tools.py:1648
+msgid "Invalid type [{type_}]"
+msgstr ""
+
+#: sat/tools/common/async_process.py:86
+msgid ""
+"Can't complete {name} command (error code: {code}):\n"
+"stderr:\n"
+"{stderr}\n"
+"{stdout}\n"
+msgstr ""
+
+#: sat/tools/common/date_utils.py:76
+msgid "You can't use a direction (+ or -) and \"ago\" at the same time"
+msgstr ""
+
+#: sat/tools/common/template.py:149
+msgid "{site} can't be used as site name, it's reserved."
+msgstr ""
+
+#: sat/tools/common/template.py:157
+msgid "{theme} contain forbidden char. Following chars are forbidden: {reserved}"
+msgstr ""
+
+#: sat/tools/common/template.py:212
+msgid "Unregistered site requested: {site_to_check}"
+msgstr ""
+
+#: sat/tools/common/template.py:241
+msgid ""
+"Absolute template used while unsecure is disabled, hack attempt? "
+"Template: {template}"
+msgstr ""
+
+#: sat/tools/common/template.py:314
+msgid "Invalid attribute, please use one of \"defer\", \"async\" or \"\""
+msgstr ""
+
+#: sat/tools/common/template.py:332
+msgid "Can't find {libary} javascript library"
+msgstr ""
+
+#: sat/tools/common/template.py:389
+msgid ""
+"Can't add \"{name}\" site, it contains forbidden characters. Forbidden "
+"characters are {forbidden}."
+msgstr ""
+
+#: sat/tools/common/template.py:395
+msgid "Can't add \"{name}\" site, it should map to an absolute path"
+msgstr ""
+
+#: sat/tools/common/template.py:416
+msgid "Can't load theme settings at {path}: {e}"
+msgstr ""
+
+#: sat/tools/common/template.py:523
+msgid "Can't find template translation at {path}"
+msgstr ""
+
+#: sat/tools/common/template.py:526
+msgid "{site}Invalid locale name: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:529
+msgid "{site}loaded {lang} templates translations"
+msgstr ""
+
+#: sat/tools/common/template.py:560
+msgid "invalid locale value: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:569
+msgid "Can't find locale {locale}"
+msgstr ""
+
+#: sat/tools/common/template.py:574
+msgid "Switched to {lang}"
+msgstr ""
+
+#: sat/tools/common/template.py:774 sat_frontends/jp/cmd_event.py:134
+msgid "Can't parse date: {msg}"
+msgstr ""
+
+#: sat/tools/common/template.py:801
+msgid "ignoring field \"{name}\": it doesn't exists"
+msgstr ""
+
+#: sat_frontends/jp/arg_tools.py:88
+msgid "ignoring {name}={value}, not corresponding to any argument (in USE)"
+msgstr ""
+
+#: sat_frontends/jp/arg_tools.py:95
+msgid "arg {name}={value} (in USE)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:64
+msgid ""
+"ProgressBar not available, please download it at "
+"http://pypi.python.org/pypi/progressbar\n"
+"Progress bar deactivated\n"
+"--\n"
+msgstr ""
+
+#: sat_frontends/jp/base.py:155
+msgid ""
+"Invalid value set for \"background\" ({background}), please check your "
+"settings in libervia.conf"
+msgstr ""
+
+#: sat_frontends/jp/base.py:178
+msgid "Available commands"
+msgstr ""
+
+#: sat_frontends/jp/base.py:287
+#, python-format
+msgid "Use PROFILE profile key (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:290
+msgid "Password used to connect profile, if necessary"
+msgstr ""
+
+#: sat_frontends/jp/base.py:297
+msgid "Connect the profile before doing anything else"
+msgstr ""
+
+#: sat_frontends/jp/base.py:307
+msgid "Start a profile session without connecting"
+msgstr ""
+
+#: sat_frontends/jp/base.py:313
+msgid "Show progress bar"
+msgstr ""
+
+#: sat_frontends/jp/base.py:318
+msgid "Add a verbosity level (can be used multiple times)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:323
+msgid "be quiet (only output machine readable data)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:326
+msgid "draft handling"
+msgstr ""
+
+#: sat_frontends/jp/base.py:328
+msgid "load current draft"
+msgstr ""
+
+#: sat_frontends/jp/base.py:330
+msgid "path to a draft file to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/base.py:346
+msgid "Pubsub URL (xmpp or http)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:348
+msgid "JID of the PubSub service"
+msgstr ""
+
+#: sat_frontends/jp/base.py:350
+msgid "PEP service"
+msgstr ""
+
+#: sat_frontends/jp/base.py:352 sat_frontends/jp/base.py:360
+#: sat_frontends/jp/base.py:368
+msgid " (DEFAULT: {default})"
+msgstr ""
+
+#: sat_frontends/jp/base.py:356
+msgid "node to request"
+msgstr ""
+
+#: sat_frontends/jp/base.py:358
+msgid "standard node"
+msgstr ""
+
+#: sat_frontends/jp/base.py:366
+msgid "last item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:372
+msgid "retrieve last item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:378
+msgid "items to retrieve (DEFAULT: all)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:385
+msgid "maximum number of items to get ({no_limit} to get all items)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:391
+msgid "maximum number of items to get per page (DEFAULT: 10)"
+msgstr ""
+
+#: sat_frontends/jp/base.py:398 sat_frontends/jp/cmd_message.py:217
+msgid "find page after this item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:401 sat_frontends/jp/cmd_message.py:220
+msgid "find page before this item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:404 sat_frontends/jp/cmd_message.py:223
+msgid "index of the page to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/base.py:411
+msgid "MAM filters to use"
+msgstr ""
+
+#: sat_frontends/jp/base.py:424
+msgid "how items should be ordered"
+msgstr ""
+
+#: sat_frontends/jp/base.py:454
+msgid "there is already a default output for {type}, ignoring new one"
+msgstr ""
+
+#: sat_frontends/jp/base.py:475
+msgid "The following output options are invalid: {invalid_options}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:499
+msgid "Can't import {module_path} plugin, ignoring it: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:505
+msgid "Missing module for plugin {name}: {missing}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:520
+msgid "Invalid plugin module [{type}] {module}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:552
+msgid "Can't parse HTML page : {msg}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:558
+msgid ""
+"Could not find alternate \"xmpp:\" URI, can't find associated XMPP PubSub"
+" node/item"
+msgstr ""
+
+#: sat_frontends/jp/base.py:576
+msgid "invalid XMPP URL: {url}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:596
+msgid "item specified in URL but not needed in command, ignoring it"
+msgstr ""
+
+#: sat_frontends/jp/base.py:612
+msgid "XMPP URL is not a pubsub one: {url}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:618
+msgid "argument -s/--service is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:620
+msgid "argument -n/--node is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:622
+msgid "argument -i/--item is required"
+msgstr ""
+
+#: sat_frontends/jp/base.py:629
+msgid "--item and --item-last can't be used at the same time"
+msgstr ""
+
+#: sat_frontends/jp/base.py:659 sat_frontends/quick_frontend/quick_app.py:370
+msgid "Can't connect to SàT backend, are you sure it's launched ?"
+msgstr ""
+
+#: sat_frontends/jp/base.py:662 sat_frontends/quick_frontend/quick_app.py:373
+msgid "Can't init bridge"
+msgstr ""
+
+#: sat_frontends/jp/base.py:666
+msgid "Error while initialising bridge: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:714
+msgid "action cancelled by user"
+msgstr ""
+
+#: sat_frontends/jp/base.py:785
+#, python-format
+msgid "%s is not a valid JID !"
+msgstr ""
+
+#: sat_frontends/jp/base.py:837
+msgid "invalid password"
+msgstr ""
+
+#: sat_frontends/jp/base.py:839
+msgid "please enter profile password:"
+msgstr ""
+
+#: sat_frontends/jp/base.py:859
+msgid "The profile [{profile}] doesn't exist"
+msgstr ""
+
+#: sat_frontends/jp/base.py:881
+msgid ""
+"Session for [{profile}] is not started, please start it before using jp, "
+"or use either --start-session or --connect option"
+msgstr ""
+
+#: sat_frontends/jp/base.py:901
+msgid ""
+"Profile [{profile}] is not connected, please connect it before using jp, "
+"or use --connect option"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1002
+msgid "select output format (default: {})"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1005
+msgid "output specific option"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1111
+msgid "file size is not known, we can't show a progress bar"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1126 sat_frontends/jp/cmd_list.py:304
+msgid "Progress: "
+msgstr ""
+
+#: sat_frontends/jp/base.py:1156
+msgid "Operation started"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1172
+msgid "Operation successfully finished"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1179
+msgid "Error while doing operation: {e}"
+msgstr ""
+
+#: sat_frontends/jp/base.py:1189
+msgid "trying to use output when use_output has not been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:42
+msgid "create a XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:47
+msgid "jid to create"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:50
+msgid "password of the account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:55
+msgid "create a profile to use this account (default: don't create profile)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:63
+msgid "email (usage depends of XMPP server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:69
+msgid "server host (IP address or domain, default: use localhost)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:76
+msgid "server port (default: {port})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:107
+msgid "XMPP account created"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:113
+msgid "creating profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:129
+msgid "Can't create profile {profile} to associate with jid {jid}: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:142
+msgid "profile created"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:183
+msgid "change password for XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:188
+msgid "new XMPP password"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:207
+msgid "delete a XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:215
+msgid "delete account without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_account.py:236
+msgid "Account deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:34
+msgid "remote control a software"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:38
+msgid "software name"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:44
+msgid "jids allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:51
+msgid "groups allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:57
+msgid "groups that are *NOT* allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:63
+msgid "jids that are *NOT* allowed to use the command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:66
+msgid "loop on the commands"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:93
+msgid "No bus name found"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:96
+#, python-format
+msgid "Bus name found: [%s]"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:100
+msgid "Command found: (path:{path}, iface: {iface}) [{command}]"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:112
+msgid "run an Ad-Hoc command"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:120 sat_frontends/jp/cmd_message.py:200
+msgid "jid of the service (default: profile's server"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:128
+msgid "submit form/page"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:137
+msgid "field value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:143
+msgid "node of the command (default: list commands)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:171
+msgid "list Ad-Hoc commands of a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:179
+msgid "jid of the service (default: profile's server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_adhoc.py:202
+msgid "Ad-hoc commands"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:33
+msgid "list available applications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:45
+msgid "show applications with this status"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:72
+msgid "start an application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:78
+msgid "name of the application to start"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:98
+msgid "stop a running application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:106
+msgid "name of the application to stop"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:111
+msgid "identifier of the instance to stop"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:142
+msgid "show data exposed by a running application"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:150
+msgid "name of the application to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:155
+msgid "identifier of the instance to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_application.py:189
+msgid "manage applications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:38
+msgid "retrieve avatar of an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:43 sat_frontends/jp/cmd_identity.py:42
+msgid "do no use cached values"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:46
+msgid "show avatar"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:48 sat_frontends/jp/cmd_info.py:111
+msgid "entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:87
+msgid "No avatar found."
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:103
+msgid "set avatar of the profile or an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:108
+msgid "entity whose avatar must be changed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:110
+msgid "path to the image to upload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:116
+msgid "file {path} doesn't exist!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:125
+msgid "avatar has been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_avatar.py:134
+msgid "avatar uploading/retrieving"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:129
+msgid "unknown syntax requested ({syntax})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:138
+msgid "title of the item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:143
+msgid "tag (category) of your item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:148
+msgid "language of the item (ISO 639 code)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:158
+msgid ""
+"enable comments (default: comments not enabled except if they already "
+"exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:168
+msgid "disable comments (will remove comments node if it exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:174
+msgid "syntax to use (default: get profile's default syntax)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:211
+msgid "publish a new blog item or update an existing one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:257
+msgid "get blog item(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:267
+msgid "microblog data key(s) to display (default: depend of verbosity)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:462
+msgid "edit an existing or new blog post"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:473
+msgid "launch a blog preview in parallel"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:478
+msgid "add \"publish: False\" to metadata"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:628
+msgid "You need lxml to edit pretty XHTML"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:662
+msgid "rename an blog item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:666 sat_frontends/jp/cmd_pubsub.py:996
+msgid "new item id to use"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:690
+msgid "preview a blog content"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:700
+msgid "use inotify to handle preview"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:706
+msgid "path to the content file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:810
+msgid "File \"{file}\" doesn't exist!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:898
+msgid "import an external blog"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:905 sat_frontends/jp/cmd_list.py:207
+msgid "importer name, nothing to display importers list"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:907
+msgid "original blog host"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:911
+msgid "do *NOT* upload images (default: do upload images)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:915
+msgid "do not upload images from this host (default: upload all images)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:920
+msgid "ignore invalide TLS certificate for uploads"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:929 sat_frontends/jp/cmd_list.py:216
+msgid "importer specific options (see importer description)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:934 sat_frontends/jp/cmd_list.py:250
+msgid ""
+"importer data location (see importer description), nothing to show "
+"importer description"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:941
+msgid "Blog upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:944
+msgid "Blog uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:965
+msgid ""
+"\n"
+"To redirect old URLs to new ones, put the following lines in your "
+"sat.conf file, in [libervia] section:\n"
+"\n"
+"{conf}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:973
+msgid "Error while uploading blog: {error_msg}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:982 sat_frontends/jp/cmd_list.py:274
+msgid "{name} argument can't be used without location argument"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:1037
+msgid "Error while trying to import a blog: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_blog.py:1050
+msgid "blog/microblog management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:40
+#, python-format
+msgid "storage location (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:48
+#, python-format
+msgid "bookmarks type (default: %(default)s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:54
+msgid "list bookmarks"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:94
+msgid "remove a bookmark"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:99 sat_frontends/jp/cmd_bookmarks.py:131
+msgid "jid (for muc bookmark) or url of to remove"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:105
+msgid "delete bookmark without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:110
+msgid "Are you sure to delete this bookmark?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:117
+msgid "can't delete bookmark: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:120
+msgid "bookmark deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:133
+msgid "bookmark name"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:134
+msgid "MUC specific options"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:135
+msgid "nickname"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:140
+msgid "join room on profile connection"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:145
+msgid "You can't use --autojoin or --nick with --type url"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:165
+msgid "bookmark successfully added"
+msgstr ""
+
+#: sat_frontends/jp/cmd_bookmarks.py:174
+msgid "manage bookmarks"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:49
+msgid "call a bridge method"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:54
+msgid "name of the method to execute"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:56
+msgid "argument of the method"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:79
+msgid "Error while executing {method}: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:94
+msgid "send a fake signal from backend"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:99
+msgid "name of the signal to send"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:100
+msgid "argument of the signal"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:112
+msgid "Can't send fake signal: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:123
+msgid "bridge s(t)imulation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:135
+msgid "monitor XML stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:144
+msgid "stream direction filter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:195
+msgid "print colours used with your background"
+msgstr ""
+
+#: sat_frontends/jp/cmd_debug.py:226
+msgid "debugging tools"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:38
+msgid "show available encryption algorithms"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:45
+msgid "No encryption plugin registered!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:47
+msgid "Following encryption algorithms are available: {algos}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:68
+msgid "get encryption session data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:73
+msgid "jid of the entity to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:99
+msgid "start encrypted session with an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:105 sat_frontends/jp/cmd_message.py:77
+msgid "don't replace encryption algorithm if an other one is already used"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:108
+msgid "algorithm name (DEFAULT: choose automatically)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:111
+msgid "algorithm namespace (DEFAULT: choose automatically)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:114
+#: sat_frontends/jp/cmd_encryption.py:153
+#: sat_frontends/jp/cmd_encryption.py:178
+msgid "jid of the entity to stop encrypted session with"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:148
+msgid "stop encrypted session with an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:173
+msgid "get UI to manage trust"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:182
+msgid "algorithm name (DEFAULT: current algorithm)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:185
+msgid "algorithm namespace (DEFAULT: current algorithm)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:220
+msgid "trust manangement"
+msgstr ""
+
+#: sat_frontends/jp/cmd_encryption.py:230
+msgid "encryption sessions handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:47
+msgid "get list of registered events"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:78
+msgid "get event data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:108
+msgid "ID of the PubSub Item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:110
+msgid "date of the event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:118 sat_frontends/jp/cmd_event.py:257
+#: sat_frontends/jp/cmd_pubsub.py:129
+msgid "configuration field to set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:150
+msgid "create or replace event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:170
+msgid "Event created successfuly on node {node}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:181
+msgid "modify an existing event"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:214 sat_frontends/jp/cmd_event.py:288
+msgid "get event attendance"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:219
+msgid "bare jid of the invitee"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:246
+msgid "set event attendance"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:296
+msgid "show missing people (invited but no R.S.V.P. so far)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:302
+msgid "don't show people which gave R.S.V.P."
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:371
+msgid "Attendees: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:374
+msgid " ("
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:376
+msgid "yes: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:379
+msgid ", maybe: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:383
+msgid "no: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:390
+msgid "confirmed guests: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:395
+msgid "unconfirmed guests: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:401
+msgid "total: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:408
+msgid "missing people (no reply): "
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:416
+msgid "you need to use --missing if you use --no-rsvp"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:489
+msgid "invite someone to the event through email"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:568
+msgid "manage invities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_event.py:577
+msgid "event management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:50
+msgid "send a file to a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:55
+msgid "a list of file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:57 sat_frontends/jp/cmd_file.py:191
+#: sat_frontends/jp/cmd_message.py:82 sat_frontends/jp/cmd_pipe.py:42
+msgid "the destination jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:59
+msgid "make a bzip2 tarball"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:79 sat_frontends/jp/cmd_file.py:236
+#: sat_frontends/jp/cmd_file.py:330
+msgid "File copy started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:82
+msgid "File sent successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:86
+msgid "The file has been refused by your contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:88
+msgid "Error while sending file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:97
+msgid "File request sent to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:102
+msgid "Can't send file to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:109
+msgid "file {file_} doesn't exist!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:114
+msgid "{file_} is a dir! Please send files inside or use compression"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:129
+msgid "bz2 is an experimental option, use with caution"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:131
+msgid "Starting compression, please wait..."
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:138
+msgid "Adding {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:141
+msgid "Done !"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:183
+msgid "request a file from a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:195
+msgid ""
+"destination path where the file will be saved (default: "
+"[current_dir]/[name|hash])"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:204
+msgid "name of the file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:210
+msgid "hash of the file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:216
+msgid "hash algorithm use for --hash (default: sha-256)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:232 sat_frontends/jp/cmd_file.py:476
+msgid "overwrite existing file without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:239 sat_frontends/jp/cmd_file.py:333
+msgid "File received successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:243
+msgid "The file request has been refused"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:245
+msgid "Error while requesting file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:249
+msgid "at least one of --name or --hash must be provided"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:258 sat_frontends/jp/cmd_file.py:510
+msgid "File {path} already exists! Do you want to overwrite?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:261
+msgid "file request cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:280
+msgid "can't request file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:293
+msgid "wait for a file to be sent by a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:306
+msgid "jids accepted (accept everything if none is specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:312
+msgid "accept multiple files (you'll have to stop manually)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:318
+msgid "force overwritting of existing files (/!\\ name is choosed by sender)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:326
+msgid "destination path (default: working directory)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:337
+msgid "hash checked: {metadata['hash_algo']}:{metadata['hash']}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:340
+msgid "hash is checked but hash value is missing"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:342
+msgid "hash can't be verified"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:345
+msgid "Error while receiving file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:354 sat_frontends/jp/cmd_pipe.py:111
+msgid "Action has no XMLUI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:359 sat_frontends/jp/cmd_pipe.py:115
+msgid "Invalid XMLUI received"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:369 sat_frontends/jp/cmd_pipe.py:126
+msgid "Ignoring action without from_jid data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:374 sat_frontends/jp/cmd_file.py:395
+msgid "ignoring action without progress id"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:379
+msgid "File refused because overwrite is needed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:397
+msgid "Overwriting needed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:401
+msgid "Overwrite accepted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:403
+msgid "Refused to overwrite"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:417
+msgid "invalid \"from_jid\" value received, ignoring: {value}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:424
+msgid "ignoring action without \"from_jid\" value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:426
+msgid "Confirmation needed for request from an entity not in roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:431
+msgid "Sender confirmed because she or he is explicitly expected"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:439
+msgid "Session refused for {from_jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:446
+msgid "Given path is not a directory !"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:450
+msgid "waiting for incoming file request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:461
+msgid "download a file from URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:470
+msgid "destination file (DEFAULT: filename from URL)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:478
+msgid "URI of the file to retrieve"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:481
+msgid "File download started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:484
+msgid "File downloaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:487
+msgid "Error while downloading file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:513
+msgid "file download cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:534
+msgid "upload a file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:542
+msgid "encrypt file using AES-GCM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:544
+msgid "file to upload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:548
+msgid "jid of upload component (nothing to autodetect)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:553
+msgid "ignore invalide TLS certificate (/!\\ Dangerous /!\\)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:557
+msgid "File upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:560
+msgid "File uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:566
+msgid "URL to retrieve the file:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:571
+msgid "Error while uploading file: {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:593
+msgid "file {file_} doesn't exist !"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:597
+msgid "{file_} is a dir! Can't upload a dir"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:633
+msgid "set affiliations for a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:641 sat_frontends/jp/cmd_file.py:695
+#: sat_frontends/jp/cmd_file.py:747 sat_frontends/jp/cmd_file.py:801
+#: sat_frontends/jp/cmd_file.py:1002
+msgid "namespace of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:647 sat_frontends/jp/cmd_file.py:701
+#: sat_frontends/jp/cmd_file.py:753 sat_frontends/jp/cmd_file.py:807
+#: sat_frontends/jp/cmd_file.py:1007
+msgid "path to the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:657 sat_frontends/jp/cmd_pubsub.py:453
+msgid "entity/affiliation couple(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:661 sat_frontends/jp/cmd_file.py:767
+msgid "jid of file sharing entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:687
+msgid "retrieve affiliations of a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:705 sat_frontends/jp/cmd_file.py:811
+msgid "jid of sharing entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:729
+msgid "affiliations management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:739
+msgid "set configuration for a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:763 sat_frontends/jp/cmd_pubsub.py:282
+msgid "configuration field to set (required)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:793
+msgid "retrieve configuration of a shared file/directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:838
+msgid "file sharing node configuration"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:850
+msgid "retrieve files shared by an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:859
+msgid "path to the directory containing the files"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:865
+msgid "jid of sharing entity (nothing to check our own jid)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:874
+msgid "unknown file type: {type}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:923
+msgid "share a file or directory"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:931
+msgid "virtual name to use (default: use directory/file name)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:941
+msgid "jid of contacts allowed to retrieve the files"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:946
+msgid "share publicly the file(s) (/!\\ *everybody* will be able to access them)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:953
+msgid "path to a file or directory to share"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:978
+msgid "{path} shared under the name \"{name}\""
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:988
+msgid "send invitation for a shared repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:996
+msgid "name of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1014
+msgid "type of the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1019
+msgid "https URL of a image to use as thumbnail"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1023
+msgid "jid of the file sharing service hosting the repository"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1027
+msgid "jid of the person to invite"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1035
+msgid "only http(s) links are allowed with --thumbnail"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1053
+msgid "invitation sent to {jid}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1068
+msgid "files sharing management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_file.py:1077
+msgid "files sending/receiving/management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:45
+msgid "edit forums"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:54 sat_frontends/jp/cmd_forums.py:123
+msgid "forum key (DEFAULT: default forums)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:74
+msgid "forums have been edited"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:115
+msgid "get forums structure"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:168 sat_frontends/jp/cmd_pubsub.py:733
+msgid "no schema found"
+msgstr ""
+
+#: sat_frontends/jp/cmd_forums.py:180
+msgid "Forums structure edition"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:37
+msgid "get identity data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:45
+msgid "entity to check"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:68
+msgid "update identity data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:77
+msgid "nicknames of the entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_identity.py:101
+msgid "identity management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:38
+msgid "service discovery"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:42
+msgid "entity to discover"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:49
+msgid "type of data to discover"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:51
+msgid "node to use"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:57
+msgid "ignore cache"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:69
+msgid "category"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:111
+msgid "node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:116
+msgid "Features"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:118
+msgid "Identities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:120
+msgid "Extensions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:122
+msgid "Items"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:151 sat_frontends/jp/cmd_info.py:166
+msgid "error while doing discovery: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:190
+msgid "software version"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:193 sat_frontends/jp/cmd_info.py:258
+msgid "Entity to request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:201
+msgid "error while trying to get version: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:207
+msgid "Software name: {name}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:209
+msgid "Software version: {version}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:211
+msgid "Operating System: {os}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:225
+msgid "running session"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:243
+msgid "Error getting session infos: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:253
+msgid "devices of an entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:267
+msgid "Error getting devices infos: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_info.py:283
+msgid "Get various pieces of information on entities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:61
+msgid "encoding of the input data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:69
+msgid "standard input"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:77
+msgid "short option"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:85
+msgid "long option"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:93
+msgid "positional argument"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:101
+msgid "ignore value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:107
+msgid "don't actually run commands but echo what would be launched"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:110
+msgid "log stdout to FILE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:113
+msgid "log stderr to FILE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:128 sat_frontends/jp/cmd_input.py:193
+msgid "arguments in input data and in arguments sequence don't match"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:155 sat_frontends/jp/cmd_input.py:207
+msgid "values: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:161
+msgid "**SKIPPING**\n"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:184
+msgid "Invalid argument, an option type is expected, got {type_}:{name}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:199
+msgid "command {idx}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:252 sat_frontends/primitivus/xmlui.py:461
+msgid "OK"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:254
+msgid "FAILED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:274
+msgid "comma-separated values"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:283
+msgid "starting row (previous ones will be ignored)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:291
+msgid "split value in several options"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:299
+msgid "action to do on empty value ({choices})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:314
+msgid "--empty value must be one of {choices}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_input.py:349
+msgid "launch command with external input"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:38
+msgid "create and send an invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:127
+msgid "you need to specify an email address to send email invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:161
+msgid "get invitation data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:165
+#: sat_frontends/jp/cmd_invitation.py:225
+#: sat_frontends/jp/cmd_invitation.py:289
+msgid "invitation UUID"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:170
+msgid "start profile session and retrieve jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:185
+msgid "can't get invitation data: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:198
+msgid "can't start session: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:208
+msgid "can't retrieve jid: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:221
+msgid "delete guest account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:233
+msgid "can't delete guest account: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:242
+msgid "modify existing invitation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:299
+msgid "you can't set {arg_name} in both optional argument and extra"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:314
+msgid "invitations have been modified successfuly"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:328
+msgid "list invitations data"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:346
+msgid "return only invitations linked to this profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_invitation.py:370
+msgid "invitation of user(s) without XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:43 sat_frontends/jp/cmd_list.py:81
+#: sat_frontends/jp/cmd_list.py:150 sat_frontends/jp/cmd_merge_request.py:39
+#: sat_frontends/jp/cmd_merge_request.py:124
+#: sat_frontends/jp/cmd_merge_request.py:169
+msgid "auto"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:45
+msgid "get lists"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:82
+msgid "set a list item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:94
+msgid "field(s) to set (required)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:101
+msgid "update existing item instead of replacing it (DEFAULT: auto)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:107
+msgid "id, URL of the item to update, or nothing for new item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:151
+msgid "delete a list item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:156 sat_frontends/jp/cmd_pubsub.py:884
+#: sat_frontends/jp/cmd_roster.py:135
+msgid "delete without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:159 sat_frontends/jp/cmd_pubsub.py:887
+msgid "notify deletion"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:163
+msgid "id of the item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:169
+msgid "You need to specify a list item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:171
+msgid "Are you sure to delete list item {item_id} ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:174 sat_frontends/jp/cmd_pubsub.py:897
+msgid "item deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:184 sat_frontends/jp/cmd_pubsub.py:907
+msgid "can't delete item: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:187 sat_frontends/jp/cmd_pubsub.py:910
+msgid "item {item} has been deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:200
+msgid "import tickets from external software/dataset"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:225
+msgid ""
+"specified field in import data will be put in dest field (default: use "
+"same field name, or ignore if it doesn't exist)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:235
+msgid "PubSub service where the items must be uploaded (default: server)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:242
+msgid "PubSub node where the items must be uploaded (default: tickets' defaults)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:257
+msgid "Tickets upload started"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:260
+msgid "Tickets uploaded successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:264
+msgid "Error while uploading tickets: {error_msg}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:319
+msgid ""
+"fields_map must be specified either preencoded in --option or using "
+"--map, but not both at the same time"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:337
+msgid "Error while trying to import tickets: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_list.py:350
+msgid "pubsub lists handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:40
+msgid "publish or update a merge request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:48
+msgid "id or URL of the request to update, or nothing for a new one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:55
+#: sat_frontends/jp/cmd_merge_request.py:179
+msgid "path of the repository (DEFAULT: current directory)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:61
+msgid "publish merge request without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:68
+msgid "labels to categorize your request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:75
+msgid ""
+"You are going to publish your changes to service [{service}], are you "
+"sure ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:80
+msgid "merge request publication cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:105
+msgid "Merge request published at {published_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:110
+msgid "Merge request published"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:125
+msgid "get a merge request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:170
+msgid "import a merge request"
+msgstr ""
+
+#: sat_frontends/jp/cmd_merge_request.py:209
+msgid "merge-request management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:34
+msgid "send a message to a contact"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:38
+msgid "language of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:44
+msgid ""
+"separate xmpp messages: send one message per line instead of one message "
+"alone."
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:53
+msgid "add a new line at the beginning of the input (usefull for ascii art ;))"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:60
+msgid "subject of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:63
+msgid "language of subject"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:70
+msgid "type of the message"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:73
+msgid "encrypt message using given algorithm"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:79
+msgid "XHTML body"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:80
+msgid "rich body"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:195
+msgid "query archives using MAM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:203
+msgid "start fetching archive from this date (default: from the beginning)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:207
+msgid "end fetching archive after this date (default: no limit)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:210
+msgid "retrieve only archives with this jid"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:213
+msgid "maximum number of items to retrieve, using RSM (default: 20))"
+msgstr ""
+
+#: sat_frontends/jp/cmd_message.py:276
+msgid "messages handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:32
+msgid "get a parameter value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:37 sat_frontends/jp/cmd_param.py:94
+msgid "category of the parameter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:39 sat_frontends/jp/cmd_param.py:95
+#: sat_frontends/jp/cmd_param.py:96
+msgid "name of the parameter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:45
+msgid "name of the attribute to get"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:48 sat_frontends/jp/cmd_param.py:98
+msgid "security limit"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:62
+msgid "can't find requested parameters: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:79
+msgid "can't find requested parameter: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:90
+msgid "set a parameter value"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:111
+msgid "can't set requested parameter: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:125
+msgid "save parameters template to xml file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:129
+msgid "output file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:136
+msgid "can't save parameters to file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:140
+msgid "parameters saved to file {filename}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:155
+msgid "load parameters template from xml file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:159
+msgid "input file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:166
+msgid "can't load parameters from file: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:170
+msgid "parameters loaded from file {filename}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_param.py:182
+msgid "Save/load parameters template"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:29
+msgid "ping XMPP entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:32
+msgid "jid to ping"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:34
+msgid "output delay only (in s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_ping.py:41
+msgid "can't do the ping: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:38
+msgid "send a pipe a stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:97
+msgid "receive a pipe stream"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:104
+msgid "Jids accepted (none means \"accept everything\")"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pipe.py:159
+msgid "stream piping through XMPP"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:33
+msgid "The name of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:51
+msgid "You need to use either --connect or --start-session"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:78
+msgid "the name of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:81
+msgid "the password of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:83 sat_frontends/jp/cmd_profile.py:238
+msgid "the jid of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:86
+msgid "the password of the XMPP account (use profile password if not specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:93 sat_frontends/jp/cmd_profile.py:247
+msgid "connect this profile automatically when backend starts"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:97
+msgid "set to component import name (entry point) if this is a component"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:154
+msgid "delete profile without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:174
+msgid "get information about a profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:180
+msgid "show the XMPP password IN CLEAR TEXT"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:184
+msgid "XMPP password"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:185
+msgid "autoconnect (backend)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:209
+msgid "get clients profiles only"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:229
+msgid "modify an existing profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:234
+msgid "change the password of the profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:237
+msgid "disable profile password (dangerous!)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:240
+msgid "change the password of the XMPP account"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:243
+msgid "set as default profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_profile.py:280
+msgid "profile commands"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:59
+msgid "retrieve node configuration"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:68
+msgid "data key to filter"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:116
+msgid "create a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:135 sat_frontends/jp/cmd_pubsub.py:288
+msgid "don't prepend \"pubsub#\" prefix to field names"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:158
+msgid "can't create node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:162
+msgid "node created successfully: "
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:176
+msgid "purge a node (i.e. remove all items from it)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:184
+msgid "purge node without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:190
+msgid ""
+"Are you sure to purge PEP node [{node}]? This will delete ALL items from "
+"it!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:195
+msgid ""
+"Are you sure to delete node [{node}] on service [{service}]? This will "
+"delete ALL items from it!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:199
+msgid "node purge cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:208
+msgid "can't purge node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:211
+msgid "node [{node}] purged successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:223
+msgid "delete a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:231
+msgid "delete node without confirmation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:237
+msgid "Are you sure to delete PEP node [{node}] ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:241
+msgid "Are you sure to delete node [{node}] on service [{service}]?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:244
+msgid "node deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:256
+msgid "node [{node}] deleted successfully"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:270
+msgid "set node configuration"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:309
+msgid "node configuration successful"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:320
+msgid "import raw XML to a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:327 sat_frontends/jp/cmd_pubsub.py:1608
+msgid "do a pubsub admin request, needed to change publisher"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:332
+msgid ""
+"path to the XML file with data to import. The file must contain whole XML"
+" of each item to import."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:359
+msgid "You are not using list of pubsub items, we can't import this file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:370
+msgid "Items are imported without using admin mode, publisher can't be changed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:391
+msgid "items published with id(s) {items_ids}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:396 sat_frontends/jp/cmd_pubsub.py:1641
+msgid "items published"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:409
+msgid "retrieve node affiliations (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:439
+msgid "set affiliations (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:469
+msgid "affiliations have been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:481
+msgid "set or retrieve node affiliations"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:494
+msgid "retrieve node subscriptions (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:532
+msgid "subscription must be one of {}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:548
+msgid "set/modify subscriptions (for node owner)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:563
+msgid "entity/subscription couple(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:578
+msgid "subscriptions have been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:590
+msgid "get or modify node subscriptions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:603
+msgid "set/replace a schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:607
+msgid "schema to set (must be XML)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:621 sat_frontends/jp/cmd_pubsub.py:656
+msgid "schema has been set"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:637
+msgid "edit a schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:709
+msgid "get schema"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:742
+msgid "data schema manipulation"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:761
+msgid "node handling"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:774
+msgid "publish a new item or update an existing one"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:783
+msgid "id, URL of the item to update, keyword, or nothing for new item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:805
+msgid "can't send item: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:827
+msgid "get pubsub item(s)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:835
+msgid "subscription id"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:879
+msgid "delete an item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:892
+msgid "You need to specify an item to delete"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:894
+msgid "Are you sure to delete item {item_id} ?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:924
+msgid "edit an existing or new pubsub item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:968
+msgid "Item has not payload"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:992
+msgid "rename a pubsub item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1024
+msgid "subscribe to a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1039
+msgid "can't subscribe to node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1042
+msgid "subscription done"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1044
+msgid "subscription id: {sub_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1059
+msgid "unsubscribe from a node"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1073
+msgid "can't unsubscribe from node: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1076
+msgid "subscription removed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1088
+msgid "retrieve all subscriptions on a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1102
+msgid "can't retrieve subscriptions: {e}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1117
+msgid "retrieve all affiliations on a service"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1160
+msgid "search items corresponding to filters"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1185
+msgid "maximum depth of recursion (will search linked nodes if > 0, DEFAULT: 0)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1197
+msgid "maximum number of items to get per node ({} to get all items, DEFAULT: 30)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1207
+msgid "namespace to use for xpath"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1216
+msgid "filters"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1217
+msgid "only items corresponding to following filters will be kept"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1226
+msgid "full text filter, item must contain this string (XML included)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1235
+msgid "like --text but using a regular expression"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1244
+msgid "filter items which has elements matching this xpath"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1253
+msgid ""
+"Python expression which much return a bool (True to keep item, False to "
+"reject it). \"item\" is raw text item, \"item_xml\" is lxml's "
+"etree.Element"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1266
+msgid "filters flags"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1267
+msgid "filters modifiers (change behaviour of following filters)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1278
+msgid "(don't) ignore case in following filters (DEFAULT: case sensitive)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1289
+msgid "(don't) invert effect of following filters (DEFAULT: don't invert)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1300
+msgid "(don't) use DOTALL option for regex (DEFAULT: don't use)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1311
+msgid "keep only the matching part of the item"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1320
+msgid "action to do on found items (DEFAULT: print)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1383
+msgid ""
+"item doesn't looks like XML, you have probably used --only-matching "
+"somewhere before and we have no more XML"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1420
+msgid "--only-matching used with fixed --text string, are you sure?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1441
+msgid "can't use xpath: {reason}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1476
+msgid "unknown filter type {type}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1534
+msgid "executed command failed with exit code {ret}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1566
+msgid "Command can only be used with {actions} actions"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1572
+msgid "you need to specify a command to execute"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1575
+msgid "empty node is not handled yet"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1596
+msgid "modify items of a node using an external command/script"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1603
+msgid "apply transformation (DEFAULT: do a dry run)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1614
+msgid "if command return a non zero exit code, ignore the item and continue"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1622
+msgid "get all items by looping over all pages using RSM"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1626
+msgid ""
+"path to the command to use. Will be called repetitivly with an item as "
+"input. Output (full item XML) will be used as new one. Return \"DELETE\" "
+"string to delete the item, and \"SKIP\" to ignore it"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1636
+msgid "items published with ids {item_ids}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1659
+msgid "Can't retrieve all items, RSM metadata not available"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1664
+msgid "Can't retrieve all items, bad RSM metadata: {msg}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1670
+msgid "All items transformed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1674
+msgid "Retrieving next page ({page_idx}/{page_total})"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1712
+msgid "Duplicate found on item {item_id}, we have probably handled all items."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1749
+msgid "Deleting item {item_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1766
+msgid "Skipping item {item_id}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1860 sat_frontends/jp/cmd_uri.py:53
+msgid "build URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1868
+msgid "profile (used when no server is specified)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1908
+msgid "create a Pubsub hook"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1917
+msgid "hook type"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1923
+msgid "make hook persistent across restarts"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1927
+msgid "argument of the hook (depend of the type)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1936
+msgid "{path} is not a file"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1965
+msgid "delete a Pubsub hook"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1974
+msgid "hook type to remove, empty to remove all (DEFAULT: remove all)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:1981
+msgid "argument of the hook to remove, empty to remove all (DEFAULT: remove all)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2001
+msgid "{nb_deleted} hook(s) have been deleted"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2013
+msgid "list hooks of a profile"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2029
+msgid "No hook found."
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2043
+msgid "trigger action on Pubsub notifications"
+msgstr ""
+
+#: sat_frontends/jp/cmd_pubsub.py:2067
+msgid "PubSub nodes/items management"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:36
+msgid "retrieve the roster entities"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:89
+msgid "set metadata for a roster entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:93
+msgid "name to use for this entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:96
+msgid "groups for this entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:99
+msgid "replace all metadata instead of adding them"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:101 sat_frontends/jp/cmd_roster.py:138
+msgid "jid of the roster entity"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:131
+msgid "remove an entity from roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:142
+msgid "Are you sure to delete {entity} fril your roster?"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:145
+msgid "entity deletion cancelled"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:158
+msgid "Show statistics about a roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:226
+msgid "purge the roster from its contacts with no subscription"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:231
+msgid "also purge contacts with no 'from' subscription"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:234
+msgid "also purge contacts with no 'to' subscription"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:306
+msgid "do a full resynchronisation of roster with server"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:318
+msgid "Roster resynchronized"
+msgstr ""
+
+#: sat_frontends/jp/cmd_roster.py:327
+msgid "Manage an entity's roster"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:33
+msgid ""
+"Welcome to {app_name} shell, the Salut à Toi shell !\n"
+"\n"
+"This enrironment helps you using several {app_name} commands with similar"
+" parameters.\n"
+"\n"
+"To quit, just enter \"quit\" or press C-d.\n"
+"Enter \"help\" or \"?\" to know what to do\n"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:48
+msgid "launch jp in shell (REPL) mode"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:63
+msgid "bad command path"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:104
+msgid "COMMAND {external}=> {args}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:105
+msgid "(external) "
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:149
+msgid "Shell commands:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:152
+msgid "Action commands:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:172
+msgid "verbose mode is {status}"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:173
+msgid "ENABLED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:173
+msgid "DISABLED"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:214
+msgid "arg profile={profile} (logged profile)"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:236
+msgid "no argument in USE"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:238
+msgid "arguments in USE:"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:274
+msgid "argument {name} not found"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:280
+msgid "argument {name} removed"
+msgstr ""
+
+#: sat_frontends/jp/cmd_shell.py:288
+msgid "good bye!"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:37
+msgid "parse URI"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:42
+msgid "XMPP URI to parse"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:57
+msgid "URI type"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:58
+msgid "URI path"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:66
+msgid "URI fields"
+msgstr ""
+
+#: sat_frontends/jp/cmd_uri.py:80
+msgid "XMPP URI parsing/generation"
+msgstr ""
+
+#: sat_frontends/jp/common.py:437
+msgid "no item found at all, we create a new one"
+msgstr ""
+
+#: sat_frontends/jp/common.py:440
+msgid "item \"{item}\" not found, we create a new item withthis id"
+msgstr ""
+
+#: sat_frontends/jp/common.py:458
+msgid "item \"{item}\" found, we edit it"
+msgstr ""
+
+#: sat_frontends/jp/common.py:785
+msgid "No {key} URI specified for this project, please specify service and node"
+msgstr ""
+
+#: sat_frontends/jp/common.py:821
+msgid "Invalid URI found: {uri}"
+msgstr ""
+
+#: sat_frontends/jp/loops.py:28
+msgid "User interruption: good bye"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:53
+msgid "Can't find requested template: {template_path}"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:74
+msgid ""
+"no default template set for this command, you need to specify a template "
+"using --oo template=[path/to/template.html]"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:89
+msgid "Can't parse template, please check its syntax"
+msgstr ""
+
+#: sat_frontends/jp/output_template.py:109
+msgid ""
+"Browser opening requested.\n"
+"Temporary files are put in the following directory, you'll have to delete"
+" it yourself once finished viewing: {}"
+msgstr ""
+
+#: sat_frontends/jp/output_xml.py:56
+msgid ""
+"Pygments is not available, syntax highlighting is not possible. Please "
+"install if from http://pygments.org or with pip install pygments"
+msgstr ""
+
+#: sat_frontends/jp/xml_tools.py:50
+msgid "Can't parse the payload XML in input: {msg}"
+msgstr ""
+
+#: sat_frontends/jp/xml_tools.py:62
+msgid "<item> can only have one child element (the payload)"
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:224
+msgid "(enter: {value})"
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:318
+msgid "your choice (0-{limit_max}): "
+msgstr ""
+
+#: sat_frontends/jp/xmlui_manager.py:348
+msgid "your choice (0,1): "
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:90
+msgid "Error while sending message ({})"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:135
+msgid "Please specify the globbing pattern to search for"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:377
+msgid "Configuration Error"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:377
+msgid ""
+"Something went wrong while reading the configuration, please check "
+":messages"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:504
+msgid "Pleeeeasse, I can't even breathe !"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:534
+#: sat_frontends/primitivus/profile_manager.py:64
+msgid "Connect"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:536
+msgid "Parameters"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:537 sat_frontends/primitivus/base.py:851
+msgid "About"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:538
+msgid "Exit"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:542
+msgid "Join room"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:547
+msgid "Main menu"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:658
+msgid "{app}: a new event has just happened{entity}"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:736
+msgid "Chat menu"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:790
+msgid "Unmanaged action"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:801
+msgid "unkown"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:831
+#, python-format
+msgid "Can't get parameters (%s)"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:846
+msgid "Entering a MUC room"
+msgstr ""
+
+#: sat_frontends/primitivus/base.py:846
+msgid "Please enter MUC's JID"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:40
+msgid "{} occupants"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:381
+msgid "Game"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:502
+msgid "You have been mentioned by {nick} in {room}"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:513
+msgid "{entity} is talking to you"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:612
+msgid "Results for searching the globbing pattern: {}"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:618
+msgid "Type ':history <lines>' to reset the chat history"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:652
+#, python-format
+msgid "Primitivus: %s is talking to you"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:656
+#, python-format
+msgid "Primitivus: %(user)s mentioned you in room '%(room)s'"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:666
+msgid "Can't start game"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:667
+msgid "You need to be exactly 4 peoples in the room to start a Tarot game"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:698
+msgid "Change title"
+msgstr ""
+
+#: sat_frontends/primitivus/chat.py:699
+msgid "Enter the new title"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:290
+msgid "Please choose your contrat"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:311
+msgid "You win \\o/"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:311
+msgid "You loose :("
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:331
+msgid "Cards played are invalid !"
+msgstr ""
+
+#: sat_frontends/primitivus/game_tarot.py:369
+msgid "Do you put these cards in chien ?"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:36
+msgid "Login:"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:37
+msgid "Password:"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:48
+msgid "New"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:49
+msgid "Delete"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:81
+msgid "Profile Manager"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:142
+msgid "Can't create profile"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:150
+msgid "New profile"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:151
+msgid "Please enter a new profile name"
+msgstr ""
+
+#: sat_frontends/primitivus/profile_manager.py:160
+msgid "Are you sure you want to delete the profile {} ?"
+msgstr ""
+
+#: sat_frontends/primitivus/progress.py:37
+msgid "Clear progress list"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:57
+msgid "Set your presence"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:67
+msgid "Set your status"
+msgstr ""
+
+#: sat_frontends/primitivus/status.py:68
+msgid "New status"
+msgstr ""
+
+#: sat_frontends/primitivus/xmlui.py:78
+msgid "Unknown div_char"
+msgstr ""
+
+#: sat_frontends/primitivus/xmlui.py:456
+msgid "Submit"
+msgstr ""
+
+#: sat_frontends/primitivus/xmlui.py:458 sat_frontends/primitivus/xmlui.py:473
+msgid "Cancel"
+msgstr ""
+
+#: sat_frontends/quick_frontend/constants.py:31
+msgid "Away from keyboard"
+msgstr ""
+
+#: sat_frontends/quick_frontend/constants.py:33
+msgid "Extended away"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:85
+msgid "Error while trying to get autodisconnect param, ignoring: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:200
+msgid "Can't get profile parameter: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:324
+msgid "Can't get namespaces map: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:330
+msgid "Can't retrieve encryption plugins: {msg}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:376
+msgid "Error while initialising bridge: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:662
+#, python-format
+msgid "Can't connect profile [%s]"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:723
+msgid "Connected"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:739
+msgid "Disconnected"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1154
+msgid "The contact {contact} has accepted your subscription"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1157
+#: sat_frontends/quick_frontend/quick_app.py:1176
+msgid "Subscription confirmation"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1162
+msgid "The contact {contact} has refused your subscription"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1165
+msgid "Subscription refusal"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1172
+msgid ""
+"The contact {contact} wants to subscribe to your presence.\n"
+"Do you accept ?"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1229
+#, python-format
+msgid "param update: [%(namespace)s] %(name)s = %(value)s"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_app.py:1233
+#, python-format
+msgid "Changing JID to %s"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:624
+msgid "now we print the history"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:626
+msgid " ({} messages)"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:683
+msgid "Can't get history: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:705
+msgid "Can't get encryption state: {reason}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:775
+msgid "message encryption started with {target} using {encryption}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:780
+msgid "message encryption stopped with {target} (was using {encryption})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:833
+msgid "<= {nick} has left the room ({count})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_chat.py:837
+msgid "<=> {nick} re-entered the room ({count})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_list.py:611
+msgid "Trying to delete an unknow entity [{}]"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_list.py:664
+msgid "received presence from entity without resource: {}"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:73
+msgid "Trying to get attribute for an unknown contact"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:89
+msgid "INTERNAL ERROR: Key log.error"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_contact_management.py:101
+#, python-format
+msgid "Trying to update an unknown contact: %s"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_games.py:84
+msgid ""
+"A {game} activity between {players} has been started, but you couldn't "
+"take part because your client doesn't support it."
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_games.py:87
+msgid "{game} Game"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:116
+msgid "Trying to plug an unknown profile key ({})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:118
+msgid "Profile plugging in error"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:133
+msgid "Can't get profile parameter"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:144
+msgid "A profile with this name already exists"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:146
+msgid "Profile creation cancelled by backend"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:148
+msgid "You profile name is not valid"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:152
+msgid "Can't create profile ({})"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:172
+msgid "You can't connect manually and automatically at the same time"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:180
+msgid "No profile selected"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_profile_manager.py:181
+msgid "You need to create and select at least one profile before connecting"
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_utils.py:40
+msgid ""
+"\n"
+"    %prog [options]\n"
+"\n"
+"    %prog --help for options list\n"
+"    "
+msgstr ""
+
+#: sat_frontends/quick_frontend/quick_utils.py:49
+msgid "Select the profile to use"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:233
+msgid "Nothing to submit"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:449
+msgid "XMLUI can have only one main container"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:514
+#, python-format
+msgid "Unknown container [%s], using default one"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:527
+msgid "Internal Error, container has not _xmluiAppend method"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:674
+#, python-format
+msgid "FIXME FIXME FIXME: widget type [%s] is not implemented"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:678
+#, python-format
+msgid "FIXME FIXME FIXME: type [%s] is not implemented"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:696
+#, python-format
+msgid "No change listener on [%s]"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:722
+#, python-format
+msgid "Unknown tag [%s]"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:780
+msgid "No callback_id found"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:813
+#, python-format
+msgid "FIXME: XMLUI internal action [%s] is not implemented"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:909 sat_frontends/tools/xmlui.py:921
+#: sat_frontends/tools/xmlui.py:971 sat_frontends/tools/xmlui.py:983
+msgid "The form data is not sent back, the type is not managed properly"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:915 sat_frontends/tools/xmlui.py:977
+msgid "Cancelling form"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:1096
+msgid "XMLUI class already registered for {type_}, ignoring"
+msgstr ""
+
+#: sat_frontends/tools/xmlui.py:1135
+msgid "You must register classes with registerClass before creating a XMLUI"
+msgstr ""
--- a/requirements.txt	Thu Jun 03 15:21:43 2021 +0200
+++ b/requirements.txt	Thu Jun 17 13:05:58 2021 +0200
@@ -1,13 +1,13 @@
-attrs==20.3.0
+attrs==21.2.0
 Automat==20.2.0
-Babel==2.9.0
+Babel==2.9.1
 cairocffi==1.2.0
 CairoSVG==2.5.2
-certifi==2020.12.5
+certifi==2021.5.30
 cffi==1.14.5
 chardet==4.0.0
 constantly==15.1.0
-cryptography==3.4.6
+cryptography==3.4.7
 cssselect2==0.4.1
 dbus-python==1.2.16
 defusedxml==0.7.1
@@ -16,27 +16,27 @@
 hyperlink==21.0.0
 idna==2.10
 incremental==21.3.0
-Jinja2==2.11.3
+Jinja2==3.0.1
 langid==1.1.6
-lxml==4.6.2
+lxml==4.6.3
 Markdown==3.3.4
-MarkupSafe==1.1.1
+MarkupSafe==2.0.1
 miniupnpc==2.0.2
 mutagen==1.45.1
-netifaces==0.10.9
-numpy==1.20.1
+netifaces==0.11.0
+numpy==1.20.3
 OMEMO==0.12.0
 omemo-backend-signal==0.2.6
-Pillow==8.1.2
+Pillow==8.2.0
 progressbar2==3.53.1
-protobuf==3.15.6
+protobuf==3.17.3
 pyasn1==0.4.8
 pyasn1-modules==0.2.8
-pycairo==1.20.0
+pycairo==1.20.1
 pycparser==2.20
 pycrypto==2.6.1
-Pygments==2.8.1
-PyGObject==3.40.0
+Pygments==2.9.0
+PyGObject==3.40.1
 PyNaCl==1.4.0
 pyOpenSSL==20.0.1
 python-dateutil==2.8.1
@@ -46,19 +46,20 @@
 pyxdg==0.27
 PyYAML==5.4.1
 requests==2.25.1
-service-identity==18.1.0
+service-identity==21.1.0
+setuptools-scm==6.0.1
 shortuuid==1.0.1
-six==1.15.0
+six==1.16.0
 tinycss2==1.1.0
-treq==21.1.0
+treq==21.5.0
 Twisted==21.2.0
-urllib3==1.26.4
+urllib3==1.26.5
 urwid==2.1.2
 webencodings==0.5.1
 wokkel==18.0.0
 X3DH==0.5.9
 XEdDSA==0.4.7
-zope.interface==5.2.0
+zope.interface==5.4.0
 
 sat-tmp @ hg+https://repos.goffi.org/sat_tmp
 urwid-satext @ hg+https://repos.goffi.org/urwid-satext
--- a/sat/core/xmpp.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/core/xmpp.py	Thu Jun 17 13:05:58 2021 +0200
@@ -247,7 +247,7 @@
             entity.fallBack = SatFallbackHandler(host)
             entity.fallBack.setHandlerParent(entity)
 
-            entity.versionHandler = SatVersionHandler(C.APP_NAME_FULL, host.full_version)
+            entity.versionHandler = SatVersionHandler(C.APP_NAME, host.full_version)
             entity.versionHandler.setHandlerParent(entity)
 
             entity.identityHandler = SatIdentityHandler()
@@ -691,6 +691,7 @@
 
         pre_xml_treatments.addCallback(lambda __: self.generateMessageXML(data, post_xml_treatments))
         pre_xml_treatments.addCallback(lambda __: post_xml_treatments)
+        pre_xml_treatments.addErrback(self._cancelErrorTrap)
         post_xml_treatments.addCallback(lambda __: self.sendMessageData(data))
         if send_only:
             log.debug(_("Triggers, storage and echo have been inhibited by the "
--- a/sat/memory/cache.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/memory/cache.py	Thu Jun 17 13:05:58 2021 +0200
@@ -140,7 +140,7 @@
         try:
             with cache_url.open("rb") as f:
                 cache_data = pickle.load(f)
-        except IOError as e:
+        except (IOError, EOFError) as e:
             log.warning(f"can't read cache at {cache_url}: {e}")
             return None
         except pickle.UnpicklingError:
--- a/sat/memory/params.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/memory/params.py	Thu Jun 17 13:05:58 2021 +0200
@@ -972,8 +972,12 @@
 
         if not self.checkSecurityLimit(node[1], security_limit):
             msg = _(
-                f"{profile!r} is trying to set parameter {name!r} in category "
-                f"{category!r} without authorization!!!")
+                "{profile!r} is trying to set parameter {name!r} in category "
+                "{category!r} without authorization!!!").format(
+                    profile=repr(profile),
+                    name=repr(name),
+                    category=repr(category)
+                )
             log.warning(msg)
             raise exceptions.PermissionError(msg)
 
@@ -986,8 +990,11 @@
                     int(value)
                 except ValueError:
                     log.warning(_(
-                        f"Trying to set parameter {name!r} in category {category!r} with"
-                        f"an non-integer value"
+                        "Trying to set parameter {name} in category {category} with"
+                        "an non-integer value"
+                    ).format(
+                        name=repr(name),
+                        category=repr(category)
                     ))
                     return defer.succeed(None)
                 if node[1].hasAttribute("constraint"):
--- a/sat/plugins/plugin_app_manager_docker/sat_app_weblate.yaml	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_app_manager_docker/sat_app_weblate.yaml	Thu Jun 17 13:05:58 2021 +0200
@@ -1,6 +1,10 @@
 type: docker-compose
 prepare:
   git: https://github.com/WeblateOrg/docker-compose.git
+files:
+  settings-override.py:
+    content: |
+      USE_X_FORWARDED_HOST = True
 override:
   version: "3"
   services:
@@ -18,6 +22,9 @@
         WEBLATE_SITE_DOMAIN: !sat_conf ["", "public_url"]
         WEBLATE_ADMIN_PASSWORD: !sat_generate_pwd
         WEBLATE_ADMIN_EMAIL: !sat_conf ["", "email_admins_list", "", "first"]
+        WEBLATE_ENABLE_HTTPS: !sat_conf ["", "weblate_enable_https", "1"]
+      volumes:
+        - ./settings-override.py:/app/data/settings-override.py:ro
 expose:
   url_prefix: [override, services, weblate, environment, WEBLATE_URL_PREFIX]
   front_url: !sat_param [front_url, /translate]
--- a/sat/plugins/plugin_import.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_import.py	Thu Jun 17 13:05:58 2021 +0200
@@ -64,7 +64,7 @@
         @param name(unicode): import handler name
         """
         assert name == name.lower().strip()
-        log.info(_(f"initializing {name} import handler"))
+        log.info(_("initializing {name} import handler").format(name=name))
         import_handler.name = name
         import_handler.register = partial(self.register, import_handler)
         import_handler.unregister = partial(self.unregister, import_handler)
@@ -155,7 +155,7 @@
                 pass
             except ValueError:
                 raise exceptions.DataError(
-                    _(f"invalid json option: {option}")
+                    _("invalid json option: {option}").format(option=option)
                 )
         pubsub_service = jid.JID(pubsub_service) if pubsub_service else None
         return self.doImport(
--- a/sat/plugins/plugin_misc_app_manager.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_misc_app_manager.py	Thu Jun 17 13:05:58 2021 +0200
@@ -160,17 +160,19 @@
             )
 
         value = self.host.memory.getConfig(section, name, default)
-        if name == "public_url" and (not value or not value.startswith('http')):
+        # FIXME: "public_url" is used only here and doesn't take multi-sites into account
+        if name == "public_url" and (not value or value.startswith('http')):
             if not value:
                 log.warning(_(
-                    'No value found for "public_url", using "https://example.org" for '
-                    'now, please set the proper value in sat.conf'))
+                    'No value found for "public_url", using "example.org" for '
+                    'now, please set the proper value in libervia.conf'))
             else:
                 log.warning(_(
-                    'invalid value for "public_url" ({value}), it must start with '
-                    '"http", ignoring it and using "https://example.org" instead')
+                    'invalid value for "public_url" ({value}), it musts not start with '
+                    'schema ("http"), ignoring it and using "example.org" '
+                    'instead')
                         .format(value=value))
-            value = "https://example.org"
+            value = "example.org"
 
         if filter_ is None:
             pass
@@ -546,6 +548,24 @@
         if prepare:
             raise exceptions.InternalError('"prepare" should be empty')
 
+    async def _doCreateFiles(
+        self,
+        app_data: dict,
+    ) -> None:
+        dest_path = app_data['_instance_dir_path']
+        files = app_data.get('files')
+        if not files:
+            return
+        if not isinstance(files, dict):
+            raise ValueError('"files" must be a dictionary')
+        for filename, data in files.items():
+            path = dest_path / filename
+            if path.is_file():
+                log.info(f"{path} already exists, skipping")
+            with path.open("w") as f:
+                f.write(data.get("content", ""))
+            log.debug(f"{path} created")
+
     async def startCommon(self, app_data: dict) -> None:
         """Method running common action when starting a manager
 
@@ -553,3 +573,4 @@
         """
         log.info(f"starting {app_data['name']!r}")
         await self._doPrepare(app_data)
+        await self._doCreateFiles(app_data)
--- a/sat/plugins/plugin_misc_forums.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_misc_forums.py	Thu Jun 17 13:05:58 2021 +0200
@@ -21,7 +21,7 @@
 from sat.core.constants import Const as C
 from sat.core import exceptions
 from sat.core.log import getLogger
-from sat.tools.common import uri
+from sat.tools.common import uri, data_format
 from twisted.words.protocols.jabber import jid
 from twisted.words.xish import domish
 from twisted.internet import defer
@@ -73,7 +73,7 @@
                               method=self._set,
                               async_=True)
         host.bridge.addMethod("forumTopicsGet", ".plugin",
-                              in_sign='ssa{ss}s', out_sign='(aa{ss}a{ss})',
+                              in_sign='ssa{ss}s', out_sign='(aa{ss}s)',
                               method=self._getTopics,
                               async_=True)
         host.bridge.addMethod("forumTopicCreate", ".plugin",
@@ -249,7 +249,9 @@
         client = self.host.getClient(profile_key)
         extra = self._p.parseExtra(extra)
         d = self.getTopics(client, jid.JID(service), node, rsm_request=extra.rsm_request, extra=extra.extra)
-        d.addCallback(lambda topics_metadata: (topics_metadata[0], {k: str(v) for k,v in topics_metadata[1].items()}))
+        d.addCallback(
+            lambda topics_data: (topics_data[0], data_format.serialise(topics_data[1]))
+        )
         return d
 
     @defer.inlineCallbacks
--- a/sat/plugins/plugin_misc_nat-port.py	Thu Jun 03 15:21:43 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,222 +0,0 @@
-#!/usr/bin/env python3
-
-
-# SAT plugin for NAT port mapping
-# Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Affero General Public License for more details.
-
-# You should have received a copy of the GNU Affero General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-from sat.core.i18n import _
-from sat.core.constants import Const as C
-from sat.core.log import getLogger
-
-log = getLogger(__name__)
-from sat.core import exceptions
-from twisted.internet import threads
-from twisted.internet import defer
-from twisted.python import failure
-import threading
-
-try:
-    import miniupnpc
-except ImportError:
-    raise exceptions.MissingModule(
-        "Missing module MiniUPnPc, please download/install it (and its Python binding) at http://miniupnp.free.fr/ (or use pip install miniupnpc)"
-    )
-
-
-PLUGIN_INFO = {
-    C.PI_NAME: "NAT port mapping",
-    C.PI_IMPORT_NAME: "NAT-PORT",
-    C.PI_TYPE: C.PLUG_TYPE_MISC,
-    C.PI_MAIN: "NatPort",
-    C.PI_HANDLER: "no",
-    C.PI_DESCRIPTION: _("""Automatic NAT port mapping using UPnP"""),
-}
-
-STARTING_PORT = 6000  # starting point to automatically find a port
-DEFAULT_DESC = (
-    "SaT port mapping"
-)  # we don't use "à" here as some bugged NAT don't manage charset correctly
-
-
-class MappingError(Exception):
-    pass
-
-
-class NatPort(object):
-    # TODO: refresh data if a new connection is detected (see plugin_misc_ip)
-
-    def __init__(self, host):
-        log.info(_("plugin NAT Port initialization"))
-        self.host = host
-        self._external_ip = None
-        self._initialised = defer.Deferred()
-        self._upnp = miniupnpc.UPnP()  # will be None if no device is available
-        self._upnp.discoverdelay = 200
-        self._mutex = threading.Lock()  # used to protect access to self._upnp
-        self._starting_port_cache = None  # used to cache the first available port
-        self._to_unmap = []  # list of tuples (ext_port, protocol) of ports to unmap on unload
-        discover_d = threads.deferToThread(self._discover)
-        discover_d.chainDeferred(self._initialised)
-        self._initialised.addErrback(self._init_failed)
-
-    def unload(self):
-        if self._to_unmap:
-            log.info("Cleaning mapped ports")
-            return threads.deferToThread(self._unmapPortsBlocking)
-
-    def _init_failed(self, failure_):
-        e = failure_.trap(exceptions.NotFound, exceptions.FeatureNotFound)
-        if e == exceptions.FeatureNotFound:
-            log.info("UPnP-IGD seems to be not activated on the device")
-        else:
-            log.info("UPnP-IGD not available")
-        self._upnp = None
-
-    def _discover(self):
-        devices = self._upnp.discover()
-        if devices:
-            log.info("{nb} UPnP-IGD device(s) found".format(nb=devices))
-        else:
-            log.info("Can't find UPnP-IGD device on the local network")
-            raise failure.Failure(exceptions.NotFound())
-        self._upnp.selectigd()
-        try:
-            self._external_ip = self._upnp.externalipaddress()
-        except Exception:
-            raise failure.Failure(exceptions.FeatureNotFound())
-
-    def getIP(self, local=False):
-        """Return IP address found with UPnP-IGD
-
-        @param local(bool): True to get external IP address, False to get local network one
-        @return (None, str): found IP address, or None of something got wrong
-        """
-
-        def getIP(__):
-            if self._upnp is None:
-                return None
-            # lanaddr can be the empty string if not found,
-            # we need to return None in this case
-            return (self._upnp.lanaddr or None) if local else self._external_ip
-
-        return self._initialised.addCallback(getIP)
-
-    def _unmapPortsBlocking(self):
-        """Unmap ports mapped in this session"""
-        self._mutex.acquire()
-        try:
-            for port, protocol in self._to_unmap:
-                log.info("Unmapping port {}".format(port))
-                unmapping = self._upnp.deleteportmapping(
-                    # the last parameter is remoteHost, we don't use it
-                    port,
-                    protocol,
-                    "",
-                )
-
-                if not unmapping:
-                    log.error(
-                        "Can't unmap port {port} ({protocol})".format(
-                            port=port, protocol=protocol
-                        )
-                    )
-            del self._to_unmap[:]
-        finally:
-            self._mutex.release()
-
-    def _mapPortBlocking(self, int_port, ext_port, protocol, desc):
-        """Internal blocking method to map port
-
-        @param int_port(int): internal port to use
-        @param ext_port(int): external port to use, or None to find one automatically
-        @param protocol(str): 'TCP' or 'UDP'
-        @param desc(str): description of the mapping
-        @param return(int, None): external port used in case of success, otherwise None
-        """
-        # we use mutex to avoid race condition if 2 threads
-        # try to acquire a port at the same time
-        self._mutex.acquire()
-        try:
-            if ext_port is None:
-                # find a free port
-                starting_port = self._starting_port_cache
-                ext_port = STARTING_PORT if starting_port is None else starting_port
-                ret = self._upnp.getspecificportmapping(ext_port, protocol)
-                while ret != None and ext_port < 65536:
-                    ext_port += 1
-                    ret = self._upnp.getspecificportmapping(ext_port, protocol)
-                if starting_port is None:
-                    # XXX: we cache the first successfuly found external port
-                    #      to avoid testing again the first series the next time
-                    self._starting_port_cache = ext_port
-
-            try:
-                mapping = self._upnp.addportmapping(
-                    # the last parameter is remoteHost, we don't use it
-                    ext_port,
-                    protocol,
-                    self._upnp.lanaddr,
-                    int_port,
-                    desc,
-                    "",
-                )
-            except Exception as e:
-                log.error(_("addportmapping error: {msg}").format(msg=e))
-                raise failure.Failure(MappingError())
-
-            if not mapping:
-                raise failure.Failure(MappingError())
-            else:
-                self._to_unmap.append((ext_port, protocol))
-        finally:
-            self._mutex.release()
-
-        return ext_port
-
-    def mapPort(self, int_port, ext_port=None, protocol="TCP", desc=DEFAULT_DESC):
-        """Add a port mapping
-
-        @param int_port(int): internal port to use
-        @param ext_port(int,None): external port to use, or None to find one automatically
-        @param protocol(str): 'TCP' or 'UDP'
-        @param desc(unicode): description of the mapping
-            Some UPnP IGD devices have broken encoding. It's probably a good idea to avoid non-ascii chars here
-        @return (D(int, None)): external port used in case of success, otherwise None
-        """
-        if self._upnp is None:
-            return defer.succeed(None)
-
-        def mappingCb(ext_port):
-            log.info(
-                "{protocol} mapping from {int_port} to {ext_port} successful".format(
-                    protocol=protocol, int_port=int_port, ext_port=ext_port
-                )
-            )
-            return ext_port
-
-        def mappingEb(failure_):
-            failure_.trap(MappingError)
-            log.warning("Can't map internal {int_port}".format(int_port=int_port))
-
-        def mappingUnknownEb(failure_):
-            log.error(_("error while trying to map ports: {msg}").format(msg=failure_))
-
-        d = threads.deferToThread(
-            self._mapPortBlocking, int_port, ext_port, protocol, desc
-        )
-        d.addCallbacks(mappingCb, mappingEb)
-        d.addErrback(mappingUnknownEb)
-        return d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sat/plugins/plugin_misc_nat_port.py	Thu Jun 17 13:05:58 2021 +0200
@@ -0,0 +1,222 @@
+#!/usr/bin/env python3
+
+
+# SAT plugin for NAT port mapping
+# Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from sat.core.i18n import _
+from sat.core.constants import Const as C
+from sat.core.log import getLogger
+
+log = getLogger(__name__)
+from sat.core import exceptions
+from twisted.internet import threads
+from twisted.internet import defer
+from twisted.python import failure
+import threading
+
+try:
+    import miniupnpc
+except ImportError:
+    raise exceptions.MissingModule(
+        "Missing module MiniUPnPc, please download/install it (and its Python binding) at http://miniupnp.free.fr/ (or use pip install miniupnpc)"
+    )
+
+
+PLUGIN_INFO = {
+    C.PI_NAME: "NAT port mapping",
+    C.PI_IMPORT_NAME: "NAT-PORT",
+    C.PI_TYPE: C.PLUG_TYPE_MISC,
+    C.PI_MAIN: "NatPort",
+    C.PI_HANDLER: "no",
+    C.PI_DESCRIPTION: _("""Automatic NAT port mapping using UPnP"""),
+}
+
+STARTING_PORT = 6000  # starting point to automatically find a port
+DEFAULT_DESC = (
+    "SaT port mapping"
+)  # we don't use "à" here as some bugged NAT don't manage charset correctly
+
+
+class MappingError(Exception):
+    pass
+
+
+class NatPort(object):
+    # TODO: refresh data if a new connection is detected (see plugin_misc_ip)
+
+    def __init__(self, host):
+        log.info(_("plugin NAT Port initialization"))
+        self.host = host
+        self._external_ip = None
+        self._initialised = defer.Deferred()
+        self._upnp = miniupnpc.UPnP()  # will be None if no device is available
+        self._upnp.discoverdelay = 200
+        self._mutex = threading.Lock()  # used to protect access to self._upnp
+        self._starting_port_cache = None  # used to cache the first available port
+        self._to_unmap = []  # list of tuples (ext_port, protocol) of ports to unmap on unload
+        discover_d = threads.deferToThread(self._discover)
+        discover_d.chainDeferred(self._initialised)
+        self._initialised.addErrback(self._init_failed)
+
+    def unload(self):
+        if self._to_unmap:
+            log.info("Cleaning mapped ports")
+            return threads.deferToThread(self._unmapPortsBlocking)
+
+    def _init_failed(self, failure_):
+        e = failure_.trap(exceptions.NotFound, exceptions.FeatureNotFound)
+        if e == exceptions.FeatureNotFound:
+            log.info("UPnP-IGD seems to be not activated on the device")
+        else:
+            log.info("UPnP-IGD not available")
+        self._upnp = None
+
+    def _discover(self):
+        devices = self._upnp.discover()
+        if devices:
+            log.info("{nb} UPnP-IGD device(s) found".format(nb=devices))
+        else:
+            log.info("Can't find UPnP-IGD device on the local network")
+            raise failure.Failure(exceptions.NotFound())
+        self._upnp.selectigd()
+        try:
+            self._external_ip = self._upnp.externalipaddress()
+        except Exception:
+            raise failure.Failure(exceptions.FeatureNotFound())
+
+    def getIP(self, local=False):
+        """Return IP address found with UPnP-IGD
+
+        @param local(bool): True to get external IP address, False to get local network one
+        @return (None, str): found IP address, or None of something got wrong
+        """
+
+        def getIP(__):
+            if self._upnp is None:
+                return None
+            # lanaddr can be the empty string if not found,
+            # we need to return None in this case
+            return (self._upnp.lanaddr or None) if local else self._external_ip
+
+        return self._initialised.addCallback(getIP)
+
+    def _unmapPortsBlocking(self):
+        """Unmap ports mapped in this session"""
+        self._mutex.acquire()
+        try:
+            for port, protocol in self._to_unmap:
+                log.info("Unmapping port {}".format(port))
+                unmapping = self._upnp.deleteportmapping(
+                    # the last parameter is remoteHost, we don't use it
+                    port,
+                    protocol,
+                    "",
+                )
+
+                if not unmapping:
+                    log.error(
+                        "Can't unmap port {port} ({protocol})".format(
+                            port=port, protocol=protocol
+                        )
+                    )
+            del self._to_unmap[:]
+        finally:
+            self._mutex.release()
+
+    def _mapPortBlocking(self, int_port, ext_port, protocol, desc):
+        """Internal blocking method to map port
+
+        @param int_port(int): internal port to use
+        @param ext_port(int): external port to use, or None to find one automatically
+        @param protocol(str): 'TCP' or 'UDP'
+        @param desc(str): description of the mapping
+        @param return(int, None): external port used in case of success, otherwise None
+        """
+        # we use mutex to avoid race condition if 2 threads
+        # try to acquire a port at the same time
+        self._mutex.acquire()
+        try:
+            if ext_port is None:
+                # find a free port
+                starting_port = self._starting_port_cache
+                ext_port = STARTING_PORT if starting_port is None else starting_port
+                ret = self._upnp.getspecificportmapping(ext_port, protocol)
+                while ret != None and ext_port < 65536:
+                    ext_port += 1
+                    ret = self._upnp.getspecificportmapping(ext_port, protocol)
+                if starting_port is None:
+                    # XXX: we cache the first successfuly found external port
+                    #      to avoid testing again the first series the next time
+                    self._starting_port_cache = ext_port
+
+            try:
+                mapping = self._upnp.addportmapping(
+                    # the last parameter is remoteHost, we don't use it
+                    ext_port,
+                    protocol,
+                    self._upnp.lanaddr,
+                    int_port,
+                    desc,
+                    "",
+                )
+            except Exception as e:
+                log.error(_("addportmapping error: {msg}").format(msg=e))
+                raise failure.Failure(MappingError())
+
+            if not mapping:
+                raise failure.Failure(MappingError())
+            else:
+                self._to_unmap.append((ext_port, protocol))
+        finally:
+            self._mutex.release()
+
+        return ext_port
+
+    def mapPort(self, int_port, ext_port=None, protocol="TCP", desc=DEFAULT_DESC):
+        """Add a port mapping
+
+        @param int_port(int): internal port to use
+        @param ext_port(int,None): external port to use, or None to find one automatically
+        @param protocol(str): 'TCP' or 'UDP'
+        @param desc(unicode): description of the mapping
+            Some UPnP IGD devices have broken encoding. It's probably a good idea to avoid non-ascii chars here
+        @return (D(int, None)): external port used in case of success, otherwise None
+        """
+        if self._upnp is None:
+            return defer.succeed(None)
+
+        def mappingCb(ext_port):
+            log.info(
+                "{protocol} mapping from {int_port} to {ext_port} successful".format(
+                    protocol=protocol, int_port=int_port, ext_port=ext_port
+                )
+            )
+            return ext_port
+
+        def mappingEb(failure_):
+            failure_.trap(MappingError)
+            log.warning("Can't map internal {int_port}".format(int_port=int_port))
+
+        def mappingUnknownEb(failure_):
+            log.error(_("error while trying to map ports: {msg}").format(msg=failure_))
+
+        d = threads.deferToThread(
+            self._mapPortBlocking, int_port, ext_port, protocol, desc
+        )
+        d.addCallbacks(mappingCb, mappingEb)
+        d.addErrback(mappingUnknownEb)
+        return d
--- a/sat/plugins/plugin_misc_text_commands.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_misc_text_commands.py	Thu Jun 17 13:05:58 2021 +0200
@@ -327,7 +327,7 @@
             if arg[-1] != "@":
                 return jid.JID(arg)
             return jid.JID(arg + service_jid)
-        return jid.JID("%s@%s" % (arg, service_jid))
+        return jid.JID(f"{arg}@{service_jid}")
 
     def feedBack(self, client, message, mess_data, info_type=FEEDBACK_INFO_TYPE):
         """Give a message back to the user"""
--- a/sat/plugins/plugin_xep_0045.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_xep_0045.py	Thu Jun 17 13:05:58 2021 +0200
@@ -674,10 +674,19 @@
         @command (all): JID
             - JID: room to join (on the same service if full jid is not specified)
         """
-        if mess_data["unparsed"].strip():
-            room_jid = self.text_cmds.getRoomJID(mess_data["unparsed"].strip(), mess_data["to"].host)
-            nick = (self.getRoomNick(client, room_jid) or
-                    client.jid.user)
+        room_raw = mess_data["unparsed"].strip()
+        if room_raw:
+            if self.isJoinedRoom(client, mess_data["to"]):
+                # we use the same service as the one from the room where the command has
+                # been entered if full jid is not entered
+                muc_service = mess_data["to"].host
+                nick = self.getRoomNick(client, mess_data["to"]) or client.jid.user
+            else:
+                # the command has been entered in a one2one conversation, so we use
+                # our server MUC service as default service
+                muc_service = client.muc_service or ""
+                nick = client.jid.user
+            room_jid = self.text_cmds.getRoomJID(room_raw, muc_service)
             self.join(client, room_jid, nick, {})
 
         return False
@@ -688,8 +697,9 @@
         @command (group): [ROOM_JID]
             - ROOM_JID: jid of the room to live (current room if not specified)
         """
-        if mess_data["unparsed"].strip():
-            room = self.text_cmds.getRoomJID(mess_data["unparsed"].strip(), mess_data["to"].host)
+        room_raw = mess_data["unparsed"].strip()
+        if room_raw:
+            room = self.text_cmds.getRoomJID(room_raw, mess_data["to"].host)
         else:
             room = mess_data["to"]
 
@@ -720,12 +730,16 @@
             self.text_cmds.feedBack(client, feedback, mess_data)
             return False
 
-        d = self.kick(client, nick, mess_data["to"], {} if len(options) == 1 else {'reason': options[1]})
+        reason = ' '.join(options[1:]) if len(options) > 1 else None
+
+        d = self.kick(client, nick, mess_data["to"], {"reason": reason})
 
         def cb(__):
             feedback_msg = _('You have kicked {}').format(nick)
-            if len(options) > 1:
-                feedback_msg += _(' for the following reason: {}').format(options[1])
+            if reason is not None:
+                feedback_msg += _(' for the following reason: {reason}').format(
+                    reason=reason
+                )
             self.text_cmds.feedBack(client, feedback_msg, mess_data)
             return True
         d.addCallback(cb)
@@ -744,17 +758,24 @@
             entity_jid = jid.JID(jid_s).userhostJID()
             assert(entity_jid.user)
             assert(entity_jid.host)
-        except (RuntimeError, jid.InvalidFormat, AttributeError, IndexError, AssertionError):
-            feedback = _("You must provide a valid JID to ban, like in '/ban contact@example.net'")
+        except (RuntimeError, jid.InvalidFormat, AttributeError, IndexError,
+                AssertionError):
+            feedback = _(
+                "You must provide a valid JID to ban, like in '/ban contact@example.net'"
+            )
             self.text_cmds.feedBack(client, feedback, mess_data)
             return False
 
-        d = self.ban(client, entity_jid, mess_data["to"], {} if len(options) == 1 else {'reason': options[1]})
+        reason = ' '.join(options[1:]) if len(options) > 1 else None
+
+        d = self.ban(client, entity_jid, mess_data["to"], {"reason": reason})
 
         def cb(__):
             feedback_msg = _('You have banned {}').format(entity_jid)
-            if len(options) > 1:
-                feedback_msg += _(' for the following reason: {}').format(options[1])
+            if reason is not None:
+                feedback_msg += _(' for the following reason: {reason}').format(
+                    reason=reason
+                )
             self.text_cmds.feedBack(client, feedback_msg, mess_data)
             return True
         d.addCallback(cb)
@@ -791,7 +812,8 @@
         d = self.affiliate(client, entity_jid, mess_data["to"], {'affiliation': affiliation})
 
         def cb(__):
-            feedback_msg = _('New affiliation for %(entity)s: %(affiliation)s').format(entity=entity_jid, affiliation=affiliation)
+            feedback_msg = _('New affiliation for {entity}: {affiliation}').format(
+                entity=entity_jid, affiliation=affiliation)
             self.text_cmds.feedBack(client, feedback_msg, mess_data)
             return True
         d.addCallback(cb)
--- a/sat/plugins/plugin_xep_0054.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_xep_0054.py	Thu Jun 17 13:05:58 2021 +0200
@@ -282,7 +282,7 @@
         try:
             vcard_elt = await self.getVCardElement(client, entity_jid)
         except exceptions.DataError:
-            self._i.update(client, IMPORT_NAME, "avatar", IMPORT_NAME, None, entity_jid)
+            self._i.update(client, IMPORT_NAME, "avatar", None, entity_jid)
         except Exception as e:
             log.warning(_(
                 "Can't get vCard for {entity_jid}: {e}"
@@ -439,7 +439,7 @@
         """Check that hash in cache (i.e. computed hash) is the same as given one"""
         # XXX: if they differ, the avatar will be requested on each connection
         # TODO: try to avoid re-requesting avatar in this case
-        computed_hash = client._xep_0054_avatar_hashes[entity.full]
+        computed_hash = client._xep_0054_avatar_hashes[entity.full()]
         if computed_hash != given_hash:
             log.warning(
                 "computed hash differs from given hash for {entity}:\n"
--- a/sat/plugins/plugin_xep_0277.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_xep_0277.py	Thu Jun 17 13:05:58 2021 +0200
@@ -448,7 +448,7 @@
                     "No name element found in author element of item {}".format(id_)
                 )
             else:
-                microblog_data["author"] = str(name_elt)
+                author = microblog_data["author"] = str(name_elt).strip()
             # uri
             try:
                 uri_elt = next(author_elt.elements(NS_ATOM, "uri"))
@@ -467,6 +467,13 @@
                     microblog_data["author_jid"] = (
                         item_elt.getAttribute("publisher") or ""
                     )
+                if not author and microblog_data["author_jid"]:
+                    # FIXME: temporary workaround for missing author name, would be
+                    #   better to use directly JID's identity (to be done from frontends?)
+                    try:
+                        microblog_data["author"] = jid.JID(microblog_data["author_jid"]).user
+                    except Exception as e:
+                        log.warning(f"No author name found, and can't parse author jid: {e}")
 
                 if not publisher:
                     log.debug("No publisher attribute, we can't verify author jid")
@@ -1005,7 +1012,7 @@
         node = parsed_queries.get("node", [""])[0]
 
         if not node:
-            raise failure.Failure(exceptions.DataError("Invalid comments link"))
+            raise exceptions.DataError("Invalid comments link")
 
         return (service, node)
 
--- a/sat/plugins/plugin_xep_0313.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_xep_0313.py	Thu Jun 17 13:05:58 2021 +0200
@@ -80,6 +80,7 @@
         stanza_id_data = await self.host.memory.storage.getPrivates(
             mam.NS_MAM, [KEY_LAST_STANZA_ID], profile=client.profile)
         stanza_id = stanza_id_data.get(KEY_LAST_STANZA_ID)
+        rsm_req = None
         if stanza_id is None:
             log.info("can't retrieve last stanza ID, checking history")
             last_mess = await self.host.memory.historyGet(
@@ -89,10 +90,11 @@
             if not last_mess:
                 log.info(_("It seems that we have no MAM history yet"))
                 stanza_id = None
-                # FIXME: we should restrict starting of the archive, as it can be huge
+                rsm_req = rsm.RSMRequest(max_=50, before="")
             else:
                 stanza_id = last_mess[0][-1]['stanza_id']
-        rsm_req = rsm.RSMRequest(max_=100, after=stanza_id)
+        if rsm_req is None:
+            rsm_req = rsm.RSMRequest(max_=100, after=stanza_id)
         mam_req = mam.MAMRequest(rsm_=rsm_req)
         complete = False
         count = 0
@@ -103,6 +105,8 @@
             complete = mam_response["complete"]
             # we update MAM request for next iteration
             mam_req.rsm.after = rsm_response.last
+            # before may be set if we had no previous history
+            mam_req.rsm.before = None
             if not elt_list:
                 break
             else:
--- a/sat/plugins/plugin_xep_0329.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/plugins/plugin_xep_0329.py	Thu Jun 17 13:05:58 2021 +0200
@@ -709,7 +709,8 @@
                 )
             else:
                 log.warning(
-                    _(f"unexpected element, ignoring: {elt.toXml()}")
+                    _("unexpected element, ignoring: {elt}")
+                    .format(elt=elt.toXml())
                 )
                 continue
             files.append(file_data)
--- a/sat/tools/common/async_process.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/tools/common/async_process.py	Thu Jun 17 13:05:58 2021 +0200
@@ -76,7 +76,7 @@
     def processEnded(self, reason):
         data = b''.join(self.data)
         if (reason.value.exitCode == 0):
-            log.debug(_(f'{self.command_name!r} command succeed'))
+            log.debug(f'{self.command_name!r} command succeed')
             # we don't use "replace" on purpose, we want an exception if decoding
             # is not working properly
             self._deferred.callback(data)
--- a/sat/tools/common/template_xmlui.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat/tools/common/template_xmlui.py	Thu Jun 17 13:05:58 2021 +0200
@@ -90,6 +90,14 @@
             yield value
 
     @property
+    def value(self):
+        if self.multi or self.no_select or len(self.selected) != 1:
+            raise ValueError(
+                "Can't get value for list with multiple selections or nothing selected"
+            )
+        return self.selected[0]
+
+    @property
     def labels(self):
         """return only labels from self.items"""
         for value, label in self.items:
@@ -111,6 +119,10 @@
     def no_select(self):
         return "noselect" in self.style
 
+    @property
+    def multi(self):
+        return "multi" in self.style
+
 
 class EmptyWidget(xmlui.EmptyWidget, Widget):
     def __init__(self, _xmlui_parent):
--- a/sat_frontends/jp/base.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/base.py	Thu Jun 17 13:05:58 2021 +0200
@@ -68,7 +68,6 @@
     progressbar=None
 
 #consts
-PROG_NAME = "jp"
 DESCRIPTION = """This software is a command line tool for XMPP.
 Get the latest version at """ + C.APP_URL
 
@@ -115,12 +114,12 @@
         self.bridge = bridge_module.AIOBridge()
         self._onQuitCallbacks = []
 
-    def get_config(self, name, section='cli', default=None):
+    def get_config(self, name, section=C.CONFIG_SECTION, default=None):
         """Retrieve a setting value from sat.conf"""
         return config.getConfig(self.sat_conf, section, name, default=default)
 
     def guess_background(self):
-        if not sys.stdout.isatty():
+        if not sys.stdin.isatty() or not sys.stdout.isatty():
             return 'dark'
         stdin_fd = sys.stdin.fileno()
         old_settings = termios.tcgetattr(stdin_fd)
@@ -154,8 +153,10 @@
             background = self.guess_background()
         if background not in ('dark', 'light'):
             raise exceptions.ConfigError(_(
-                f'Invalid value set for "background" ({background!r}), please check '
-                f'your settings in sat.conf'))
+                'Invalid value set for "background" ({background}), please check '
+                'your settings in libervia.conf').format(
+                    background=repr(background)
+                ))
         if background == 'light':
             C.A_HEADER = A.FG_MAGENTA
             C.A_SUBHEADER = A.BOLD + A.FG_RED
@@ -435,7 +436,7 @@
             '--version',
             action='version',
             version=("{name} {version} {copyleft}".format(
-                name = PROG_NAME,
+                name = C.APP_NAME,
                 version = self.version,
                 copyleft = COPYLEFT))
         )
@@ -450,7 +451,8 @@
         if default:
             if type_ in self.default_output:
                 self.disp(
-                    _(f'there is already a default output for {type_}, ignoring new one')
+                    _('there is already a default output for {type}, ignoring new one')
+                    .format(type=type_)
                 )
             else:
                 self.default_output[type_] = name
@@ -494,7 +496,8 @@
                     self.import_plugin_module(module, type_)
                 except ImportError as e:
                     self.disp(
-                        _(f"Can't import {module_path} plugin, ignoring it: {e}"),
+                        _("Can't import {module_path} plugin, ignoring it: {e}")
+                        .format(module_path=module_path, e=e),
                         error=True)
                 except exceptions.CancelError:
                     continue
@@ -513,7 +516,10 @@
         try:
             class_names =  getattr(module, '__{}__'.format(type_))
         except AttributeError:
-            log.disp(_(f"Invalid plugin module [{type_}] {module}"), error=True)
+            log.disp(
+                _("Invalid plugin module [{type}] {module}")
+                .format(type=type_, module=module),
+                error=True)
             raise ImportError
         else:
             for class_name in class_names:
@@ -602,7 +608,9 @@
                                 if not item_last:
                                     self.args.item = uri_item
                 else:
-                    self.parser.error(_(f'XMPP URL is not a pubsub one: {url}'))
+                    self.parser.error(
+                        _('XMPP URL is not a pubsub one: {url}').format(url=url)
+                    )
         flags = self.args._cmd._pubsub_flags
         # we check required arguments here instead of using add_arguments' required option
         # because the required argument can be set in URL
@@ -648,13 +656,15 @@
             await self.bridge.bridgeConnect()
         except Exception as e:
             if isinstance(e, exceptions.BridgeExceptionNoService):
-                print((_("Can't connect to SàT backend, are you sure it's launched ?")))
+                print(_("Can't connect to SàT backend, are you sure it's launched ?"))
                 self.quit(C.EXIT_BACKEND_NOT_FOUND, raise_exc=False)
             elif isinstance(e, exceptions.BridgeInitError):
-                print((_("Can't init bridge")))
+                print(_("Can't init bridge"))
                 self.quit(C.EXIT_BRIDGE_ERROR, raise_exc=False)
             else:
-                print((_(f"Error while initialising bridge: {e}")))
+                print(
+                    _("Error while initialising bridge: {e}").format(e=e)
+                )
                 self.quit(C.EXIT_BRIDGE_ERROR, raise_exc=False)
             return
         self.version = await self.bridge.getVersion()
@@ -845,7 +855,10 @@
         self.profile = await self.bridge.profileNameGet(self.args.profile)
 
         if not self.profile:
-            log.error(_(f"The profile [{self.args.profile}] doesn't exist"))
+            log.error(
+                _("The profile [{profile}] doesn't exist")
+                .format(profile=self.args.profile)
+            )
             self.quit(C.EXIT_ERROR)
 
         try:
@@ -862,9 +875,11 @@
             elif not await self.bridge.profileIsSessionStarted(self.profile):
                 if not self.args.connect:
                     self.disp(_(
-                        f"Session for [{self.profile}] is not started, please start it "
-                        f"before using jp, or use either --start-session or --connect "
-                        f"option"), error=True)
+                        "Session for [{profile}] is not started, please start it "
+                        "before using jp, or use either --start-session or --connect "
+                        "option"
+                        .format(profile=self.profile)
+                    ), error=True)
                     self.quit(1)
             elif not getattr(self.args, "connect", False):
                 return
@@ -883,8 +898,10 @@
         else:
             if not await self.bridge.isConnected(self.profile):
                 log.error(
-                    _(f"Profile [{self.profile}] is not connected, please connect it "
-                      f"before using jp, or use --connect option"))
+                    _("Profile [{profile}] is not connected, please connect it "
+                      "before using jp, or use --connect option")
+                    .format(profile=self.profile)
+                )
                 self.quit(1)
 
     async def get_full_jid(self, param_jid):
@@ -1159,7 +1176,7 @@
 
         @param error_msg(unicode): error message as sent by bridge.progressError
         """
-        self.disp(_(f"Error while doing operation: {e}"), error=True)
+        self.disp(_("Error while doing operation: {e}").format(e=e), error=True)
 
     def disp(self, msg, verbosity=0, error=False, end='\n'):
         return self.host.disp(msg, verbosity, error, end)
--- a/sat_frontends/jp/cmd_account.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_account.py	Thu Jun 17 13:05:58 2021 +0200
@@ -73,7 +73,9 @@
             "--port",
             type=int,
             default=0,
-            help=_(f"server port (default: {C.XMPP_C2S_PORT})"),
+            help=_("server port (default: {port})").format(
+                port=C.XMPP_C2S_PORT
+            ),
         )
 
     async def start(self):
@@ -124,8 +126,12 @@
                 self.host.quit(C.EXIT_CONFLICT)
             else:
                 self.disp(
-                    _(f"Can't create profile {self.args.profile} to associate with jid "
-                      f"{self.args.jid}: {e}"),
+                    _("Can't create profile {profile} to associate with jid "
+                      "{jid}: {e}").format(
+                          profile=self.args.profile,
+                          jid=self.args.jid,
+                          e=e
+                      ),
                     error=True,
                 )
                 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
--- a/sat_frontends/jp/cmd_adhoc.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_adhoc.py	Thu Jun 17 13:05:58 2021 +0200
@@ -97,7 +97,8 @@
                 for method in methods:
                     path, iface, command = method
                     self.disp(
-                        _(f"Command found: (path:{path}, iface: {iface}) [{command}]"),
+                        _("Command found: (path:{path}, iface: {iface}) [{command}]")
+                        .format(path=path, iface=iface, command=command),
                         1,
                     )
                 self.host.quit()
--- a/sat_frontends/jp/cmd_application.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_application.py	Thu Jun 17 13:05:58 2021 +0200
@@ -147,12 +147,12 @@
         id_group.add_argument(
             "name",
             nargs="?",
-            help=_("name of the application to stop"),
+            help=_("name of the application to check"),
         )
         id_group.add_argument(
             "-i",
             "--id",
-            help=_("identifier of the instance to stop"),
+            help=_("identifier of the instance to check"),
         )
 
     async def start(self):
--- a/sat_frontends/jp/cmd_avatar.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_avatar.py	Thu Jun 17 13:05:58 2021 +0200
@@ -113,7 +113,7 @@
     async def start(self):
         path = self.args.image_path
         if not os.path.exists(path):
-            self.disp(_(f"file {path!r} doesn't exist!"), error=True)
+            self.disp(_("file {path} doesn't exist!").format(path=repr(path)), error=True)
             self.host.quit(C.EXIT_BAD_ARG)
         path = os.path.abspath(path)
         try:
--- a/sat_frontends/jp/cmd_blog.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_blog.py	Thu Jun 17 13:05:58 2021 +0200
@@ -100,7 +100,7 @@
             if k and ext == v:
                 return k
 
-    # if not found, we use current syntax
+                # if not found, we use current syntax
     return await host.bridge.getParamA("Syntax", "Composition", "value", host.profile)
 
 
@@ -125,15 +125,17 @@
                 self.current_syntax = self.args.syntax = syntax
             except Exception as e:
                 if e.classname == "NotFound":
-                    self.parser.error(_(f"unknown syntax requested ({self.args.syntax})"))
+                    self.parser.error(
+                        _("unknown syntax requested ({syntax})").format(
+                            syntax=self.args.syntax
+                        )
+                    )
                 else:
                     raise e
         return self.args.syntax
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "-T", "--title", help=_("title of the item")
-        )
+        self.parser.add_argument("-T", "--title", help=_("title of the item"))
         self.parser.add_argument(
             "-t",
             "--tag",
@@ -148,13 +150,22 @@
 
         comments_group = self.parser.add_mutually_exclusive_group()
         comments_group.add_argument(
-            "-C", "--comments", action="store_const", const=True, dest="comments",
-            help=_("enable comments (default: comments not enabled except if they "
-                   "already exist)")
+            "-C",
+            "--comments",
+            action="store_const",
+            const=True,
+            dest="comments",
+            help=_(
+                "enable comments (default: comments not enabled except if they "
+                "already exist)"
+            ),
         )
         comments_group.add_argument(
-            "--no-comments", action="store_const", const=False, dest="comments",
-            help=_("disable comments (will remove comments node if it exist)")
+            "--no-comments",
+            action="store_const",
+            const=False,
+            dest="comments",
+            help=_("disable comments (will remove comments node if it exist)"),
         )
 
         self.parser.add_argument(
@@ -182,7 +193,7 @@
         if self.args.comments is not None:
             mb_data["allow_comments"] = self.args.comments
         if self.args.tag:
-            mb_data['tags'] = self.args.tag
+            mb_data["tags"] = self.args.tag
         if self.args.title is not None:
             mb_data["title"] = self.args.title
         if self.args.language is not None:
@@ -222,9 +233,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(
-                f"can't send item: {e}", error=True
-            )
+            self.disp(f"can't send item: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             self.disp("Item published")
@@ -261,12 +270,12 @@
 
     def template_data_mapping(self, data):
         items, blog_items = data
-        blog_items['items'] = items
+        blog_items["items"] = items
         return {"blog_items": blog_items}
 
     def format_comments(self, item, keys):
         lines = []
-        for data in item.get('comments', []):
+        for data in item.get("comments", []):
             lines.append(data["uri"])
             for k in ("node", "service"):
                 if OUTPUT_OPT_NO_HEADER in self.args.output_opts:
@@ -277,7 +286,7 @@
         return "\n".join(lines)
 
     def format_tags(self, item, keys):
-        tags = item.pop('tags', [])
+        tags = item.pop("tags", [])
         return ", ".join(tags)
 
     def format_updated(self, item, keys):
@@ -359,7 +368,7 @@
                 if isinstance(value, bool):
                     value = str(value).lower()
                 self.disp(header + value)
-            # we want a separation line after each item but the last one
+                # we want a separation line after each item but the last one
             if idx < len(items) - 1:
                 print("")
 
@@ -393,7 +402,7 @@
             else:
                 author = published = updated = None
             if verbosity > 1:
-                tags = item.pop('tags', [])
+                tags = item.pop("tags", [])
             else:
                 tags = None
             content = item.get("content")
@@ -428,14 +437,14 @@
                     self.args.max,
                     self.args.items,
                     self.getPubsubExtra(),
-                    self.profile
+                    self.profile,
                 )
             )
         except Exception as e:
             self.disp(f"can't get blog items: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            items = mb_data.pop('items')
+            items = mb_data.pop("items")
             await self.output((items, mb_data))
             self.host.quit(C.EXIT_OK)
 
@@ -483,7 +492,8 @@
         # we first construct metadata from edited item ones and CLI argumments
         # or re-use the existing one if it exists
         meta_file_path = content_file_path.with_name(
-            content_file_path.stem + common.METADATA_SUFF)
+            content_file_path.stem + common.METADATA_SUFF
+        )
         if meta_file_path.exists():
             self.disp("Metadata file already exists, we re-use it")
             try:
@@ -499,20 +509,20 @@
         else:
             mb_data = {} if mb_data is None else mb_data.copy()
 
-        # in all cases, we want to remove unwanted keys
+            # in all cases, we want to remove unwanted keys
         for key in KEY_TO_REMOVE_METADATA:
             try:
                 del mb_data[key]
             except KeyError:
                 pass
-        # and override metadata with command-line arguments
+                # and override metadata with command-line arguments
         self.setMbDataFromArgs(mb_data)
 
         if self.args.no_publish:
             mb_data["publish"] = False
 
-        # then we create the file and write metadata there, as JSON dict
-        # XXX: if we port jp one day on Windows, O_BINARY may need to be added here
+            # then we create the file and write metadata there, as JSON dict
+            # XXX: if we port jp one day on Windows, O_BINARY may need to be added here
         with os.fdopen(
             os.open(meta_file_path, os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0o600), "w+b"
         ) as f:
@@ -556,7 +566,7 @@
                 )
             )
 
-        # we launch editor
+            # we launch editor
         coroutines.append(
             self.runEditor(
                 "blog_editor_args",
@@ -590,11 +600,9 @@
         items = [item] if item else []
 
         mb_data = data_format.deserialise(
-            await self.host.bridge.mbGet(
-                service, node, 1, items, {}, self.profile
-            )
+            await self.host.bridge.mbGet(service, node, 1, items, {}, self.profile)
         )
-        item = mb_data['items'][0]
+        item = mb_data["items"][0]
 
         try:
             content = item["content_xhtml"]
@@ -612,8 +620,8 @@
 
         if content and self.current_syntax == SYNTAX_XHTML:
             content = content.strip()
-            if not content.startswith('<div>'):
-                content = '<div>' + content + '</div>'
+            if not content.startswith("<div>"):
+                content = "<div>" + content + "</div>"
             try:
                 from lxml import etree
             except ImportError:
@@ -630,15 +638,20 @@
         SYNTAX_EXT.update(config.getConfig(self.sat_conf, "jp", CONF_SYNTAX_EXT, {}))
         self.current_syntax = await self.get_current_syntax()
 
-        (self.pubsub_service, self.pubsub_node, self.pubsub_item, content_file_path,
-         content_file_obj, mb_data,) = await self.getItemPath()
+        (
+            self.pubsub_service,
+            self.pubsub_node,
+            self.pubsub_item,
+            content_file_path,
+            content_file_obj,
+            mb_data,
+        ) = await self.getItemPath()
 
         await self.edit(content_file_path, content_file_obj, mb_data=mb_data)
         self.host.quit()
 
 
 class Rename(base.CommandBase):
-
     def __init__(self, host):
         base.CommandBase.__init__(
             self,
@@ -650,10 +663,7 @@
         )
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "new_id",
-            help=_("new item id to use")
-        )
+        self.parser.add_argument("new_id", help=_("new item id to use"))
 
     async def start(self):
         try:
@@ -665,14 +675,13 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(
-                f"can't rename item: {e}", error=True
-            )
+            self.disp(f"can't rename item: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             self.disp("Item renamed")
             self.host.quit(C.EXIT_OK)
 
+
 class Preview(base.CommandBase, common.BaseEdit):
     # TODO: need to be rewritten with template output
 
@@ -735,9 +744,9 @@
         xhtml = (
             f'<html xmlns="http://www.w3.org/1999/xhtml">'
             f'<head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'
-            f'</head>'
-            f'<body>{content}</body>'
-            f'</html>'
+            f"</head>"
+            f"<body>{content}</body>"
+            f"</html>"
         )
 
         with open(self.preview_file_path, "wb") as f:
@@ -791,18 +800,19 @@
         else:
             update_cb = self.updatePreviewExt
 
-        # which file do we need to edit?
+            # which file do we need to edit?
         if self.args.file == "current":
             self.content_file_path = self.getCurrentFile(self.profile)
         else:
             try:
                 self.content_file_path = Path(self.args.file).resolve(strict=True)
             except FileNotFoundError:
-                self.disp(_(f'File "{self.args.file}" doesn\'t exist!'))
+                self.disp(_('File "{file}" doesn\'t exist!').format(file=self.args.file))
                 self.host.quit(C.EXIT_NOT_FOUND)
 
         self.syntax = await guessSyntaxFromPath(
-            self.host, sat_conf, self.content_file_path)
+            self.host, sat_conf, self.content_file_path
+        )
 
         # at this point the syntax is converted, we can display the preview
         preview_file = tempfile.NamedTemporaryFile(suffix=".xhtml", delete=False)
@@ -825,10 +835,10 @@
             watcher_kwargs = {
                 # Watcher don't accept Path so we convert to string
                 "path": str(self.content_file_path),
-                "alias": 'content_file',
+                "alias": "content_file",
                 "flags": aionotify.Flags.CLOSE_WRITE
-                         | aionotify.Flags.DELETE_SELF
-                         | aionotify.Flags.MOVE_SELF,
+                | aionotify.Flags.DELETE_SELF
+                | aionotify.Flags.MOVE_SELF,
             }
             watcher.watch(**watcher_kwargs)
 
@@ -839,14 +849,15 @@
                 while True:
                     event = await watcher.get_event()
                     self.disp("Content updated", 1)
-                    if event.flags & (aionotify.Flags.DELETE_SELF
-                                      | aionotify.Flags.MOVE_SELF):
+                    if event.flags & (
+                        aionotify.Flags.DELETE_SELF | aionotify.Flags.MOVE_SELF
+                    ):
                         self.disp(
                             "DELETE/MOVE event catched, changing the watch",
                             2,
                         )
                         try:
-                            watcher.unwatch('content_file')
+                            watcher.unwatch("content_file")
                         except IOError as e:
                             self.disp(
                                 f"Can't remove the watch: {e}",
@@ -869,7 +880,7 @@
             finally:
                 os.unlink(self.preview_file_path)
                 try:
-                    watcher.unwatch('content_file')
+                    watcher.unwatch("content_file")
                 except IOError as e:
                     self.disp(
                         f"Can't remove the watch: {e}",
@@ -893,9 +904,7 @@
             nargs="?",
             help=_("importer name, nothing to display importers list"),
         )
-        self.parser.add_argument(
-            "--host", help=_("original blog host")
-        )
+        self.parser.add_argument("--host", help=_("original blog host"))
         self.parser.add_argument(
             "--no-images-upload",
             action="store_true",
@@ -954,13 +963,16 @@
             )
             self.disp(
                 _(
-                    f"\nTo redirect old URLs to new ones, put the following lines in your"
-                    f" sat.conf file, in [libervia] section:\n\n{conf}"
-                )
+                    "\nTo redirect old URLs to new ones, put the following lines in your"
+                    " sat.conf file, in [libervia] section:\n\n{conf}"
+                ).format(conf=conf)
             )
 
     async def onProgressError(self, error_msg):
-        self.disp(_(f"Error while uploading blog: {error_msg}"), error=True)
+        self.disp(
+            _("Error while uploading blog: {error_msg}").format(error_msg=error_msg),
+            error=True,
+        )
 
     async def start(self):
         if self.args.location is None:
@@ -968,8 +980,8 @@
                 if getattr(self.args, name):
                     self.parser.error(
                         _(
-                            f"{name} argument can't be used without location argument"
-                        )
+                            "{name} argument can't be used without location argument"
+                        ).format(name=name)
                     )
             if self.args.importer is None:
                 self.disp(
@@ -1022,13 +1034,14 @@
                 )
             except Exception as e:
                 self.disp(
-                    _(f"Error while trying to import a blog: {e}"),
+                    _("Error while trying to import a blog: {e}").format(e=e),
                     error=True,
                 )
                 self.host.quit(1)
 
             await self.set_progress_id(progress_id)
 
+
 class Blog(base.CommandBase):
     subcommands = (Set, Get, Edit, Rename, Preview, Import)
 
--- a/sat_frontends/jp/cmd_bookmarks.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_bookmarks.py	Thu Jun 17 13:05:58 2021 +0200
@@ -23,25 +23,41 @@
 
 __commands__ = ["Bookmarks"]
 
-STORAGE_LOCATIONS = ('local', 'private', 'pubsub')
-TYPES = ('muc', 'url')
+STORAGE_LOCATIONS = ("local", "private", "pubsub")
+TYPES = ("muc", "url")
+
 
 class BookmarksCommon(base.CommandBase):
     """Class used to group common options of bookmarks subcommands"""
 
-    def add_parser_options(self, location_default='all'):
-        self.parser.add_argument('-l', '--location', type=str, choices=(location_default,) + STORAGE_LOCATIONS, default=location_default, help=_("storage location (default: %(default)s)"))
-        self.parser.add_argument('-t', '--type', type=str, choices=TYPES, default=TYPES[0], help=_("bookmarks type (default: %(default)s)"))
+    def add_parser_options(self, location_default="all"):
+        self.parser.add_argument(
+            "-l",
+            "--location",
+            type=str,
+            choices=(location_default,) + STORAGE_LOCATIONS,
+            default=location_default,
+            help=_("storage location (default: %(default)s)"),
+        )
+        self.parser.add_argument(
+            "-t",
+            "--type",
+            type=str,
+            choices=TYPES,
+            default=TYPES[0],
+            help=_("bookmarks type (default: %(default)s)"),
+        )
+
 
 class BookmarksList(BookmarksCommon):
-
     def __init__(self, host):
-        super(BookmarksList, self).__init__(host, 'list', help=_('list bookmarks'))
+        super(BookmarksList, self).__init__(host, "list", help=_("list bookmarks"))
 
     async def start(self):
         try:
             data = await self.host.bridge.bookmarksList(
-                self.args.type, self.args.location, self.host.profile)
+                self.args.type, self.args.location, self.host.profile
+            )
         except Exception as e:
             self.disp(f"can't get bookmarks list: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
@@ -54,32 +70,40 @@
             loc_mess.append(f"{location}:")
             book_mess = []
             for book_link, book_data in list(data[location].items()):
-                name = book_data.get('name')
-                autojoin = book_data.get('autojoin', 'false') == 'true'
-                nick = book_data.get('nick')
-                book_mess.append("\t%s[%s%s]%s" % ((name+' ') if name else '',
-                                                 book_link,
-                                                 ' (%s)' % nick if nick else '',
-                                                 ' (*)' if autojoin else ''))
-            loc_mess.append('\n'.join(book_mess))
-            mess.append('\n'.join(loc_mess))
+                name = book_data.get("name")
+                autojoin = book_data.get("autojoin", "false") == "true"
+                nick = book_data.get("nick")
+                book_mess.append(
+                    "\t%s[%s%s]%s"
+                    % (
+                        (name + " ") if name else "",
+                        book_link,
+                        " (%s)" % nick if nick else "",
+                        " (*)" if autojoin else "",
+                    )
+                )
+            loc_mess.append("\n".join(book_mess))
+            mess.append("\n".join(loc_mess))
 
-        print('\n\n'.join(mess))
+        print("\n\n".join(mess))
         self.host.quit()
 
 
 class BookmarksRemove(BookmarksCommon):
-
     def __init__(self, host):
-        super(BookmarksRemove, self).__init__(host, 'remove', help=_('remove a bookmark'))
+        super(BookmarksRemove, self).__init__(host, "remove", help=_("remove a bookmark"))
 
     def add_parser_options(self):
         super(BookmarksRemove, self).add_parser_options()
         self.parser.add_argument(
-            'bookmark', help=_('jid (for muc bookmark) or url of to remove'))
+            "bookmark", help=_("jid (for muc bookmark) or url of to remove")
+        )
         self.parser.add_argument(
-            "-f", "--force", action="store_true",
-            help=_("delete bookmark without confirmation"),)
+            "-f",
+            "--force",
+            action="store_true",
+            help=_("delete bookmark without confirmation"),
+        )
 
     async def start(self):
         if not self.args.force:
@@ -87,50 +111,58 @@
 
         try:
             await self.host.bridge.bookmarksRemove(
-                self.args.type, self.args.bookmark, self.args.location, self.host.profile)
+                self.args.type, self.args.bookmark, self.args.location, self.host.profile
+            )
         except Exception as e:
-            self.disp(_(f"can't delete bookmark: {e}"), error=True)
+            self.disp(_("can't delete bookmark: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_('bookmark deleted'))
+            self.disp(_("bookmark deleted"))
             self.host.quit()
 
 
 class BookmarksAdd(BookmarksCommon):
-
     def __init__(self, host):
-        super(BookmarksAdd, self).__init__(host, 'add', help=_('add a bookmark'))
+        super(BookmarksAdd, self).__init__(host, "add", help=_("add a bookmark"))
 
     def add_parser_options(self):
-        super(BookmarksAdd, self).add_parser_options(location_default='auto')
+        super(BookmarksAdd, self).add_parser_options(location_default="auto")
         self.parser.add_argument(
-            'bookmark', help=_('jid (for muc bookmark) or url of to remove'))
-        self.parser.add_argument('-n', '--name', help=_("bookmark name"))
-        muc_group = self.parser.add_argument_group(_('MUC specific options'))
-        muc_group.add_argument('-N', '--nick', help=_('nickname'))
+            "bookmark", help=_("jid (for muc bookmark) or url of to remove")
+        )
+        self.parser.add_argument("-n", "--name", help=_("bookmark name"))
+        muc_group = self.parser.add_argument_group(_("MUC specific options"))
+        muc_group.add_argument("-N", "--nick", help=_("nickname"))
         muc_group.add_argument(
-            '-a', '--autojoin', action='store_true',
-            help=_('join room on profile connection'))
+            "-a",
+            "--autojoin",
+            action="store_true",
+            help=_("join room on profile connection"),
+        )
 
     async def start(self):
-        if self.args.type == 'url' and (self.args.autojoin or self.args.nick is not None):
+        if self.args.type == "url" and (self.args.autojoin or self.args.nick is not None):
             self.parser.error(_("You can't use --autojoin or --nick with --type url"))
         data = {}
         if self.args.autojoin:
-            data['autojoin'] = 'true'
+            data["autojoin"] = "true"
         if self.args.nick is not None:
-            data['nick'] = self.args.nick
+            data["nick"] = self.args.nick
         if self.args.name is not None:
-            data['name'] = self.args.name
+            data["name"] = self.args.name
         try:
             await self.host.bridge.bookmarksAdd(
-                self.args.type, self.args.bookmark, data, self.args.location,
-                self.host.profile)
+                self.args.type,
+                self.args.bookmark,
+                data,
+                self.args.location,
+                self.host.profile,
+            )
         except Exception as e:
             self.disp(f"can't add bookmark: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_('bookmark successfully added'))
+            self.disp(_("bookmark successfully added"))
             self.host.quit()
 
 
@@ -138,4 +170,6 @@
     subcommands = (BookmarksList, BookmarksRemove, BookmarksAdd)
 
     def __init__(self, host):
-        super(Bookmarks, self).__init__(host, 'bookmarks', use_profile=False, help=_('manage bookmarks'))
+        super(Bookmarks, self).__init__(
+            host, "bookmarks", use_profile=False, help=_("manage bookmarks")
+        )
--- a/sat_frontends/jp/cmd_debug.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_debug.py	Thu Jun 17 13:05:58 2021 +0200
@@ -53,20 +53,19 @@
         self.parser.add_argument(
             "method", type=str, help=_("name of the method to execute")
         )
-        self.parser.add_argument(
-            "arg", nargs="*", help=_("argument of the method")
-        )
+        self.parser.add_argument("arg", nargs="*", help=_("argument of the method"))
 
     async def start(self):
         method = getattr(self.host.bridge, self.args.method)
         import inspect
+
         argspec = inspect.getargspec(method)
 
         kwargs = {}
-        if 'profile_key' in argspec.args:
-            kwargs['profile_key'] = self.profile
-        elif 'profile' in argspec.args:
-            kwargs['profile'] = self.profile
+        if "profile_key" in argspec.args:
+            kwargs["profile_key"] = self.profile
+        elif "profile" in argspec.args:
+            kwargs["profile"] = self.profile
 
         args = self.evalArgs()
 
@@ -76,7 +75,12 @@
                 **kwargs,
             )
         except Exception as e:
-            self.disp(_(f"Error while executing {self.args.method}: {e}"), error=True)
+            self.disp(
+                _("Error while executing {method}: {e}").format(
+                    method=self.args.method, e=e
+                ),
+                error=True,
+            )
             self.host.quit(C.EXIT_ERROR)
         else:
             if ret is not None:
@@ -92,12 +96,8 @@
         BridgeCommon.__init__(self)
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "signal", type=str, help=_("name of the signal to send")
-        )
-        self.parser.add_argument(
-            "arg", nargs="*", help=_("argument of the signal")
-        )
+        self.parser.add_argument("signal", type=str, help=_("name of the signal to send"))
+        self.parser.add_argument("arg", nargs="*", help=_("argument of the signal"))
 
     async def start(self):
         args = self.evalArgs()
@@ -105,9 +105,11 @@
         # XXX: we use self.args.profile and not self.profile
         #      because we want the raw profile_key (so plugin handle C.PROF_KEY_NONE)
         try:
-            await self.host.bridge.debugFakeSignal(self.args.signal, json_args, self.args.profile)
+            await self.host.bridge.debugFakeSignal(
+                self.args.signal, json_args, self.args.profile
+            )
         except Exception as e:
-            self.disp(_(f"Can't send fake signal: {e}"), error=True)
+            self.disp(_("Can't send fake signal: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_ERROR)
         else:
             self.host.quit()
@@ -198,18 +200,17 @@
 
     async def start(self):
         for attr in dir(C):
-            if not attr.startswith('A_'):
+            if not attr.startswith("A_"):
                 continue
             color = getattr(C, attr)
-            if attr == 'A_LEVEL_COLORS':
+            if attr == "A_LEVEL_COLORS":
                 # This constant contains multiple colors
-                self.disp('LEVEL COLORS: ', end=' ')
+                self.disp("LEVEL COLORS: ", end=" ")
                 for idx, c in enumerate(color):
-                    last = idx == len(color)-1
-                    end = '\n' if last else ' '
+                    last = idx == len(color) - 1
+                    end = "\n" if last else " "
                     self.disp(
-                        c + f'LEVEL_{idx}' + A.RESET + (', ' if not last else ''),
-                        end=end
+                        c + f"LEVEL_{idx}" + A.RESET + (", " if not last else ""), end=end
                     )
             else:
                 text = attr[2:]
--- a/sat_frontends/jp/cmd_event.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_event.py	Thu Jun 17 13:05:58 2021 +0200
@@ -107,9 +107,7 @@
             default="",
             help=_("ID of the PubSub Item"),
         )
-        self.parser.add_argument(
-            "-d", "--date", type=str, help=_("date of the event")
-        )
+        self.parser.add_argument("-d", "--date", type=str, help=_("date of the event"))
         self.parser.add_argument(
             "-f",
             "--field",
@@ -169,7 +167,7 @@
             self.disp(f"can't create event: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"Event created successfuly on node {node}"))
+            self.disp(_("Event created successfuly on node {node}").format(node=node))
             self.host.quit()
 
 
@@ -350,9 +348,7 @@
         table = common.Table.fromListDict(
             self.host,
             data,
-            ("nick",)
-            + (("jid",) if self.host.verbosity else ())
-            + ("attend", "guests"),
+            ("nick",) + (("jid",) if self.host.verbosity else ()) + ("attend", "guests"),
             headers=None,
             filters={
                 "nick": A.color(C.A_HEADER, "{}" if show_table else "{} "),
@@ -402,9 +398,7 @@
                 )
             )
             self.disp(
-                A.color(
-                    C.A_SUBHEADER, _("total: "), A.RESET, str(guests + guests_maybe)
-                )
+                A.color(C.A_SUBHEADER, _("total: "), A.RESET, str(guests + guests_maybe))
             )
         if attendees_missing:
             self.disp("")
@@ -453,7 +447,7 @@
             self.disp(f"can't get event data: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
-        # we fill nicknames and keep only requested people
+            # we fill nicknames and keep only requested people
 
         if self.args.no_rsvp:
             for jid_ in event_data:
@@ -462,21 +456,23 @@
                 try:
                     del prefilled[jid_]
                 except KeyError:
-                    self.disp(A.color(
-                        C.A_WARNING,
-                        f"We got a RSVP from somebody who was not in invitees "
-                        f"list: {jid_}"
+                    self.disp(
+                        A.color(
+                            C.A_WARNING,
+                            f"We got a RSVP from somebody who was not in invitees "
+                            f"list: {jid_}",
                         ),
-                        error=True)
+                        error=True,
+                    )
         else:
             # we replace empty dicts for existing people with R.S.V.P. data
             prefilled.update(event_data)
 
-        # we get nicknames for everybody, make it easier for organisers
+            # we get nicknames for everybody, make it easier for organisers
         for jid_, data in prefilled.items():
             id_data = await self.host.bridge.identityGet(jid_, [], True, self.profile)
             id_data = data_format.deserialise(id_data)
-            data["nick"] = id_data['nicknames'][0]
+            data["nick"] = id_data["nicknames"][0]
 
         await self.output(prefilled)
         self.host.quit()
--- a/sat_frontends/jp/cmd_file.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_file.py	Thu Jun 17 13:05:58 2021 +0200
@@ -54,9 +54,7 @@
         self.parser.add_argument(
             "files", type=str, nargs="+", metavar="file", help=_("a list of file")
         )
-        self.parser.add_argument(
-            "jid", help=_("the destination jid")
-        )
+        self.parser.add_argument("jid", help=_("the destination jid"))
         self.parser.add_argument(
             "-b", "--bz2", action="store_true", help=_("make a bzip2 tarball")
         )
@@ -101,19 +99,21 @@
             await self.set_progress_id(data["progress"])
         except KeyError:
             # TODO: if 'xmlui' key is present, manage xmlui message display
-            self.disp(
-                _("Can't send file to {jid}".format(jid=self.args.jid)), error=True
-            )
+            self.disp(_("Can't send file to {jid}".format(jid=self.args.jid)), error=True)
             self.host.quit(2)
 
     async def start(self):
         for file_ in self.args.files:
             if not os.path.exists(file_):
-                self.disp(_(f"file {file_!r} doesn't exist!"), error=True)
+                self.disp(
+                    _("file {file_} doesn't exist!").format(file_=repr(file_)), error=True
+                )
                 self.host.quit(C.EXIT_BAD_ARG)
             if not self.args.bz2 and os.path.isdir(file_):
                 self.disp(
-                    _(f"{file_!r} is a dir! Please send files inside or use compression")
+                    _(
+                        "{file_} is a dir! Please send files inside or use compression"
+                    ).format(file_=repr(file_))
                 )
                 self.host.quit(C.EXIT_BAD_ARG)
 
@@ -188,9 +188,7 @@
         return self.args.name or self.args.hash or "output"
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "jid", help=_("the destination jid")
-        )
+        self.parser.add_argument("jid", help=_("the destination jid"))
         self.parser.add_argument(
             "-D",
             "--dest",
@@ -258,7 +256,8 @@
 
         if os.path.exists(path) and not self.args.force:
             message = _("File {path} already exists! Do you want to overwrite?").format(
-                path = path)
+                path=path
+            )
             await self.host.confirmOrQuit(message, _("file request cancelled"))
 
         self.full_dest_jid = await self.host.get_full_jid(self.args.jid)
@@ -278,7 +277,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(msg=_(f"can't request file: {e}"), error=True)
+            self.disp(msg=_("can't request file: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             await self.set_progress_id(progress_id)
@@ -334,15 +333,16 @@
         self.disp(_("File received successfully"), 2)
         if metadata.get("hash_verified", False):
             try:
-                self.disp(_(
-                    f"hash checked: {metadata['hash_algo']}:{metadata['hash']}"), 1)
+                self.disp(
+                    _("hash checked: {metadata['hash_algo']}:{metadata['hash']}"), 1
+                )
             except KeyError:
                 self.disp(_("hash is checked but hash value is missing", 1), error=True)
         else:
             self.disp(_("hash can't be verified"), 1)
 
     async def onProgressError(self, e):
-        self.disp(_(f"Error while receiving file: {e}"), error=True)
+        self.disp(_("Error while receiving file: {e}").format(e=e), error=True)
 
     def getXmluiId(self, action_data):
         # FIXME: we temporarily use ElementTree, but a real XMLUI managing module
@@ -413,8 +413,12 @@
         try:
             from_jid = jid.JID(action_data["meta_from_jid"])
         except ValueError:
-            self.disp(_('invalid "from_jid" value received, ignoring: {value}').format(
-                value=from_jid), error=True)
+            self.disp(
+                _('invalid "from_jid" value received, ignoring: {value}').format(
+                    value=from_jid
+                ),
+                error=True,
+            )
             return
         except KeyError:
             self.disp(_('ignoring action without "from_jid" value'), error=True)
@@ -448,18 +452,23 @@
 
 
 class Get(base.CommandBase):
-
     def __init__(self, host):
         super(Get, self).__init__(
-            host, "get", use_progress=True, use_verbose=True,
-            help=_("download a file from URI")
+            host,
+            "get",
+            use_progress=True,
+            use_verbose=True,
+            help=_("download a file from URI"),
         )
 
     def add_parser_options(self):
         self.parser.add_argument(
-            '-o', '--dest-file', type=str, default='',
-            help=_("destination file (DEFAULT: filename from URL)")
-            )
+            "-o",
+            "--dest-file",
+            type=str,
+            default="",
+            help=_("destination file (DEFAULT: filename from URL)"),
+        )
         self.parser.add_argument(
             "-f",
             "--force",
@@ -482,8 +491,8 @@
         try:
             await self.set_progress_id(data["progress"])
         except KeyError:
-            if 'xmlui' in data:
-                ui = xmlui_manager.create(self.host, data['xmlui'])
+            if "xmlui" in data:
+                ui = xmlui_manager.create(self.host, data["xmlui"])
                 await ui.show()
             else:
                 self.disp(_("Can't download file"), error=True)
@@ -499,7 +508,8 @@
         dest_file = Path(dest_file).expanduser().resolve()
         if dest_file.exists() and not self.args.force:
             message = _("File {path} already exists! Do you want to overwrite?").format(
-                path = dest_file)
+                path=dest_file
+            )
             await self.host.confirmOrQuit(message, _("file download cancelled"))
 
         options = {}
@@ -569,8 +579,8 @@
         try:
             await self.set_progress_id(data["progress"])
         except KeyError:
-            if 'xmlui' in data:
-                ui = xmlui_manager.create(self.host, data['xmlui'])
+            if "xmlui" in data:
+                ui = xmlui_manager.create(self.host, data["xmlui"])
                 await ui.show()
             else:
                 self.disp(_("Can't upload file"), error=True)
@@ -579,10 +589,12 @@
     async def start(self):
         file_ = self.args.file
         if not os.path.exists(file_):
-            self.disp(_(f"file {file_!r} doesn't exist !"), error=True)
+            self.disp(
+                _("file {file_} doesn't exist !").format(file_=repr(file_)), error=True
+            )
             self.host.quit(C.EXIT_BAD_ARG)
         if os.path.isdir(file_):
-            self.disp(_(f"{file_!r} is a dir! Can't upload a dir"))
+            self.disp(_("{file_} is a dir! Can't upload a dir").format(file_=repr(file_)))
             self.host.quit(C.EXIT_BAD_ARG)
 
         if self.args.jid is None:
@@ -613,7 +625,6 @@
 
 
 class ShareAffiliationsSet(base.CommandBase):
-
     def __init__(self, host):
         super(ShareAffiliationsSet, self).__init__(
             host,
@@ -720,7 +731,6 @@
 
 
 class ShareConfigurationSet(base.CommandBase):
-
     def __init__(self, host):
         super(ShareConfigurationSet, self).__init__(
             host,
@@ -822,8 +832,10 @@
 
     def __init__(self, host):
         super(ShareConfiguration, self).__init__(
-            host, "configuration", use_profile=False,
-            help=_("file sharing node configuration")
+            host,
+            "configuration",
+            use_profile=False,
+            help=_("file sharing node configuration"),
         )
 
 
@@ -962,7 +974,11 @@
             self.disp(f"can't share path: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f'{self.path} shared under the name "{name}"'))
+            self.disp(
+                _('{path} shared under the name "{name}"').format(
+                    path=self.path, name=name
+                )
+            )
             self.host.quit()
 
 
@@ -1015,10 +1031,10 @@
         self.path = os.path.normpath(self.args.path) if self.args.path else ""
         extra = {}
         if self.args.thumbnail is not None:
-            if not self.args.thumbnail.startswith('http'):
+            if not self.args.thumbnail.startswith("http"):
                 self.parser.error(_("only http(s) links are allowed with --thumbnail"))
             else:
-                extra['thumb_url'] = self.args.thumbnail
+                extra["thumb_url"] = self.args.thumbnail
         try:
             await self.host.bridge.FISInvite(
                 self.args.jid,
@@ -1034,15 +1050,18 @@
             self.disp(f"can't send invitation: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(
-                _(f'invitation sent to {self.args.jid}')
-            )
+            self.disp(_("invitation sent to {jid}").format(jid=self.args.jid))
             self.host.quit()
 
 
 class Share(base.CommandBase):
     subcommands = (
-        ShareList, SharePath, ShareInvite, ShareAffiliations, ShareConfiguration)
+        ShareList,
+        SharePath,
+        ShareInvite,
+        ShareAffiliations,
+        ShareConfiguration,
+    )
 
     def __init__(self, host):
         super(Share, self).__init__(
--- a/sat_frontends/jp/cmd_info.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_info.py	Thu Jun 17 13:05:58 2021 +0200
@@ -28,35 +28,47 @@
 
 
 class Disco(base.CommandBase):
-
     def __init__(self, host):
-        extra_outputs = {'default': self.default_output}
+        extra_outputs = {"default": self.default_output}
         super(Disco, self).__init__(
-            host, 'disco', use_output='complex', extra_outputs=extra_outputs,
-            help=_('service discovery'))
+            host,
+            "disco",
+            use_output="complex",
+            extra_outputs=extra_outputs,
+            help=_("service discovery"),
+        )
 
     def add_parser_options(self):
         self.parser.add_argument("jid", help=_("entity to discover"))
         self.parser.add_argument(
-            "-t", "--type", type=str, choices=('infos', 'items', 'both'), default='both',
-            help=_("type of data to discover"))
-        self.parser.add_argument("-n", "--node", default='', help=_("node to use"))
+            "-t",
+            "--type",
+            type=str,
+            choices=("infos", "items", "both"),
+            default="both",
+            help=_("type of data to discover"),
+        )
+        self.parser.add_argument("-n", "--node", default="", help=_("node to use"))
         self.parser.add_argument(
-            "-C", "--no-cache", dest='use_cache', action="store_false",
-            help=_("ignore cache"))
+            "-C",
+            "--no-cache",
+            dest="use_cache",
+            action="store_false",
+            help=_("ignore cache"),
+        )
 
     def default_output(self, data):
-        features = data.get('features', [])
-        identities = data.get('identities', [])
-        extensions = data.get('extensions', {})
-        items = data.get('items', [])
+        features = data.get("features", [])
+        identities = data.get("identities", [])
+        extensions = data.get("extensions", {})
+        items = data.get("items", [])
 
-        identities_table = common.Table(self.host,
-                                        identities,
-                                        headers=(_('category'),
-                                                 _('type'),
-                                                 _('name')),
-                                        use_buffer=True)
+        identities_table = common.Table(
+            self.host,
+            identities,
+            headers=(_("category"), _("type"), _("name")),
+            use_buffer=True,
+        )
 
         extensions_tpl = []
         extensions_types = list(extensions.keys())
@@ -69,30 +81,35 @@
                 data_keys = list(data.keys())
                 data_keys.sort()
                 for key in data_keys:
-                    field_lines.append(A.color('\t', C.A_SUBHEADER, key, A.RESET, ': ',
-                                               data[key]))
+                    field_lines.append(
+                        A.color("\t", C.A_SUBHEADER, key, A.RESET, ": ", data[key])
+                    )
                 if len(values) == 1:
-                    field_lines.append(A.color('\t', C.A_SUBHEADER, "value", A.RESET,
-                                               ': ', values[0] or (A.BOLD + "UNSET")))
+                    field_lines.append(
+                        A.color(
+                            "\t",
+                            C.A_SUBHEADER,
+                            "value",
+                            A.RESET,
+                            ": ",
+                            values[0] or (A.BOLD + "UNSET"),
+                        )
+                    )
                 elif len(values) > 1:
-                    field_lines.append(A.color('\t', C.A_SUBHEADER, "values", A.RESET,
-                                               ': '))
+                    field_lines.append(
+                        A.color("\t", C.A_SUBHEADER, "values", A.RESET, ": ")
+                    )
 
                     for value in values:
-                        field_lines.append(A.color('\t  - ', A.BOLD, value))
-                fields.append('\n'.join(field_lines))
-            extensions_tpl.append('{type_}\n{fields}'.format(
-                type_=type_,
-                fields='\n\n'.join(fields)))
+                        field_lines.append(A.color("\t  - ", A.BOLD, value))
+                fields.append("\n".join(field_lines))
+            extensions_tpl.append(
+                "{type_}\n{fields}".format(type_=type_, fields="\n\n".join(fields))
+            )
 
         items_table = common.Table(
-            self.host,
-            items,
-            headers=(
-                _('entity'),
-                _('node'),
-                _('name')),
-            use_buffer=True)
+            self.host, items, headers=(_("entity"), _("node"), _("name")), use_buffer=True
+        )
 
         template = []
         if features:
@@ -104,16 +121,18 @@
         if items:
             template.append(A.color(C.A_HEADER, _("Items")) + "\n\n{items}")
 
-        print("\n\n".join(template).format(
-            features = '\n'.join(features),
-            identities = identities_table.display().string,
-            extensions = '\n'.join(extensions_tpl),
-            items = items_table.display().string,
-            ))
+        print(
+            "\n\n".join(template).format(
+                features="\n".join(features),
+                identities=identities_table.display().string,
+                extensions="\n".join(extensions_tpl),
+                items=items_table.display().string,
+            )
+        )
 
     async def start(self):
-        infos_requested = self.args.type in ('infos', 'both')
-        items_requested = self.args.type in ('items', 'both')
+        infos_requested = self.args.type in ("infos", "both")
+        items_requested = self.args.type in ("items", "both")
         jids = await self.host.check_jids([self.args.jid])
         jid = jids[0]
 
@@ -126,13 +145,13 @@
                     jid,
                     node=self.args.node,
                     use_cache=self.args.use_cache,
-                    profile_key=self.host.profile
+                    profile_key=self.host.profile,
                 )
             except Exception as e:
-                self.disp(_(f"error while doing discovery: {e}"), error=True)
+                self.disp(_("error while doing discovery: {e}").format(e=e), error=True)
                 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
-        # items
+                # items
         if not items_requested:
             items = None
         else:
@@ -141,35 +160,34 @@
                     jid,
                     node=self.args.node,
                     use_cache=self.args.use_cache,
-                    profile_key=self.host.profile
+                    profile_key=self.host.profile,
                 )
             except Exception as e:
-                self.disp(_(f"error while doing discovery: {e}"), error=True)
+                self.disp(_("error while doing discovery: {e}").format(e=e), error=True)
                 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
-        # output
+                # output
         data = {}
 
         if infos_requested:
             features, identities, extensions = infos
             features.sort()
             identities.sort(key=lambda identity: identity[2])
-            data.update({
-                'features': features,
-                'identities': identities,
-                'extensions': extensions})
+            data.update(
+                {"features": features, "identities": identities, "extensions": extensions}
+            )
 
         if items_requested:
             items.sort(key=lambda item: item[2])
-            data['items'] = items
+            data["items"] = items
 
         await self.output(data)
         self.host.quit()
 
+
 class Version(base.CommandBase):
-
     def __init__(self, host):
-        super(Version, self).__init__(host, 'version', help=_('software version'))
+        super(Version, self).__init__(host, "version", help=_("software version"))
 
     def add_parser_options(self):
         self.parser.add_argument("jid", type=str, help=_("Entity to request"))
@@ -180,45 +198,49 @@
         try:
             data = await self.host.bridge.getSoftwareVersion(jid, self.host.profile)
         except Exception as e:
-            self.disp(_(f"error while trying to get version: {e}"), error=True)
+            self.disp(_("error while trying to get version: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             infos = []
             name, version, os = data
             if name:
-                infos.append(_(f"Software name: {name}"))
+                infos.append(_("Software name: {name}").format(name=name))
             if version:
-                infos.append(_(f"Software version: {version}"))
+                infos.append(_("Software version: {version}").format(version=version))
             if os:
-                infos.append(_(f"Operating System: {os}"))
+                infos.append(_("Operating System: {os}").format(os=os))
 
             print("\n".join(infos))
             self.host.quit()
 
 
 class Session(base.CommandBase):
-
     def __init__(self, host):
-        extra_outputs = {'default': self.default_output}
+        extra_outputs = {"default": self.default_output}
         super(Session, self).__init__(
-            host, 'session', use_output='dict', extra_outputs=extra_outputs,
-            help=_('running session'))
+            host,
+            "session",
+            use_output="dict",
+            extra_outputs=extra_outputs,
+            help=_("running session"),
+        )
 
     def add_parser_options(self):
         pass
 
     async def default_output(self, data):
-        started = data['started']
-        data['started'] = '{short} (UTC, {relative})'.format(
+        started = data["started"]
+        data["started"] = "{short} (UTC, {relative})".format(
             short=date_utils.date_fmt(started),
-            relative=date_utils.date_fmt(started, 'relative'))
-        await self.host.output(C.OUTPUT_DICT, 'simple', {}, data)
+            relative=date_utils.date_fmt(started, "relative"),
+        )
+        await self.host.output(C.OUTPUT_DICT, "simple", {}, data)
 
     async def start(self):
         try:
             data = await self.host.bridge.sessionInfosGet(self.host.profile)
         except Exception as e:
-            self.disp(_(f'Error getting session infos: {e}'), error=True)
+            self.disp(_("Error getting session infos: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             await self.output(data)
@@ -226,22 +248,23 @@
 
 
 class Devices(base.CommandBase):
-
     def __init__(self, host):
         super(Devices, self).__init__(
-            host, 'devices', use_output=C.OUTPUT_LIST_DICT,
-            help=_('devices of an entity'))
+            host, "devices", use_output=C.OUTPUT_LIST_DICT, help=_("devices of an entity")
+        )
 
     def add_parser_options(self):
         self.parser.add_argument(
-            "jid", type=str, nargs='?', default='', help=_("Entity to request"))
+            "jid", type=str, nargs="?", default="", help=_("Entity to request")
+        )
 
     async def start(self):
         try:
             data = await self.host.bridge.devicesInfosGet(
-                self.args.jid, self.host.profile)
+                self.args.jid, self.host.profile
+            )
         except Exception as e:
-            self.disp(_(f'Error getting devices infos: {e}'), error=True)
+            self.disp(_("Error getting devices infos: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             data = data_format.deserialise(data, type_check=list)
@@ -254,5 +277,8 @@
 
     def __init__(self, host):
         super(Info, self).__init__(
-            host, 'info', use_profile=False,
-            help=_('Get various pieces of information on entities'))
+            host,
+            "info",
+            use_profile=False,
+            help=_("Get various pieces of information on entities"),
+        )
--- a/sat_frontends/jp/cmd_invitation.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_invitation.py	Thu Jun 17 13:05:58 2021 +0200
@@ -162,9 +162,7 @@
         )
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "id", help=_("invitation UUID")
-        )
+        self.parser.add_argument("id", help=_("invitation UUID"))
         self.parser.add_argument(
             "-j",
             "--with-jid",
@@ -184,7 +182,7 @@
                 self.args.id,
             )
         except Exception as e:
-            self.disp(msg=_(f"can't get invitation data: {e}"), error=True)
+            self.disp(msg=_("can't get invitation data: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
         if not self.args.with_jid:
@@ -197,7 +195,7 @@
                     profile,
                 )
             except Exception as e:
-                self.disp(msg=_(f"can't start session: {e}"), error=True)
+                self.disp(msg=_("can't start session: {e}").format(e=e), error=True)
                 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
             try:
@@ -207,7 +205,7 @@
                     profile_key=profile,
                 )
             except Exception as e:
-                self.disp(msg=_(f"can't retrieve jid: {e}"), error=True)
+                self.disp(msg=_("can't retrieve jid: {e}").format(e=e), error=True)
                 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
             await self.output_data(invitation_data, jid_)
@@ -224,9 +222,7 @@
         )
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "id", help=_("invitation UUID")
-        )
+        self.parser.add_argument("id", help=_("invitation UUID"))
 
     async def start(self):
         try:
@@ -234,7 +230,7 @@
                 self.args.id,
             )
         except Exception as e:
-            self.disp(msg=_(f"can't delete guest account: {e}"), error=True)
+            self.disp(msg=_("can't delete guest account: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
         self.host.quit()
@@ -290,9 +286,7 @@
             default="",
             help="profile doing the invitation (default: don't associate profile",
         )
-        self.parser.add_argument(
-            "id", help=_("invitation UUID")
-        )
+        self.parser.add_argument("id", help=_("invitation UUID"))
 
     async def start(self):
         extra = dict(self.args.extra)
@@ -302,7 +296,9 @@
                 continue
             if arg_name in extra:
                 self.parser.error(
-                    _(f"you can't set {arg_name} in both optional argument and extra")
+                    _(
+                        "you can't set {arg_name} in both optional argument and extra"
+                    ).format(arg_name=arg_name)
                 )
             extra[arg_name] = value
         try:
@@ -312,9 +308,7 @@
                 self.args.replace,
             )
         except Exception as e:
-            self.disp(
-                f"can't modify invitation: {e}", error=True
-            )
+            self.disp(f"can't modify invitation: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             self.disp(_("invitations have been modified successfuly"))
--- a/sat_frontends/jp/cmd_list.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_list.py	Thu Jun 17 13:05:58 2021 +0200
@@ -61,7 +61,7 @@
                     self.getPubsubExtra(),
                     self.profile,
                 ),
-                type_check=list
+                type_check=list,
             )
         except Exception as e:
             self.disp(f"can't get lists: {e}", error=True)
@@ -72,7 +72,6 @@
 
 
 class Set(base.CommandBase):
-
     def __init__(self, host):
         base.CommandBase.__init__(
             self,
@@ -128,10 +127,10 @@
                 self.args.service,
                 self.args.node,
                 values,
-                '',
+                "",
                 self.args.item,
                 data_format.serialise(extra),
-                self.profile
+                self.profile,
             )
         except Exception as e:
             self.disp(f"can't set list item: {e}", error=True)
@@ -142,7 +141,6 @@
 
 
 class Delete(base.CommandBase):
-
     def __init__(self, host):
         base.CommandBase.__init__(
             self,
@@ -183,10 +181,10 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(_(f"can't delete item: {e}"), error=True)
+            self.disp(_("can't delete item: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"item {self.args.item} has been deleted"))
+            self.disp(_("item {item} has been deleted").format(item=self.args.item))
             self.host.quit(C.EXIT_OK)
 
 
@@ -262,7 +260,10 @@
         self.disp(_("Tickets uploaded successfully"), 2)
 
     async def onProgressError(self, error_msg):
-        self.disp(_(f"Error while uploading tickets: {error_msg}"), error=True)
+        self.disp(
+            _("Error while uploading tickets: {error_msg}").format(error_msg=error_msg),
+            error=True,
+        )
 
     async def start(self):
         if self.args.location is None:
@@ -270,7 +271,10 @@
             for name in ("option", "service", "node"):
                 if getattr(self.args, name):
                     self.parser.error(
-                        _(f"{name} argument can't be used without location argument"))
+                        _(
+                            "{name} argument can't be used without location argument"
+                        ).format(name=name)
+                    )
             if self.args.importer is None:
                 self.disp(
                     "\n".join(
@@ -297,8 +301,14 @@
             if self.args.progress:
                 # we use a custom progress bar template as we want a counter
                 self.pbar_template = [
-                    _("Progress: "), ["Percentage"], " ", ["Bar"], " ",
-                    ["Counter"], " ", ["ETA"]
+                    _("Progress: "),
+                    ["Percentage"],
+                    " ",
+                    ["Bar"],
+                    " ",
+                    ["Counter"],
+                    " ",
+                    ["ETA"],
                 ]
 
             options = {key: value for key, value in self.args.option}
@@ -306,8 +316,10 @@
             if fields_map:
                 if FIELDS_MAP in options:
                     self.parser.error(
-                        _("fields_map must be specified either preencoded in --option or "
-                          "using --map, but not both at the same time")
+                        _(
+                            "fields_map must be specified either preencoded in --option or "
+                            "using --map, but not both at the same time"
+                        )
                     )
                 options[FIELDS_MAP] = json.dumps(fields_map)
 
@@ -322,7 +334,7 @@
                 )
             except Exception as e:
                 self.disp(
-                    _(f"Error while trying to import tickets: {e}"),
+                    _("Error while trying to import tickets: {e}").format(e=e),
                     error=True,
                 )
                 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
--- a/sat_frontends/jp/cmd_merge_request.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_merge_request.py	Thu Jun 17 13:05:58 2021 +0200
@@ -30,7 +30,6 @@
 
 
 class Set(base.CommandBase):
-
     def __init__(self, host):
         base.CommandBase.__init__(
             self,
@@ -74,11 +73,12 @@
         await common.fill_well_known_uri(self, self.repository, "merge requests")
         if not self.args.force:
             message = _(
-                f"You are going to publish your changes to service "
-                f"[{self.args.service}], are you sure ?"
+                "You are going to publish your changes to service "
+                "[{service}], are you sure ?"
+            ).format(service=self.args.service)
+            await self.host.confirmOrQuit(
+                message, _("merge request publication cancelled")
             )
-            await self.host.confirmOrQuit(
-                message, _("merge request publication cancelled"))
 
         extra = {"update": True} if self.args.item else {}
         values = {}
@@ -101,7 +101,11 @@
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
 
         if published_id:
-            self.disp(_(f"Merge request published at {published_id}"))
+            self.disp(
+                _("Merge request published at {published_id}").format(
+                    published_id=published_id
+                )
+            )
         else:
             self.disp(_("Merge request published"))
 
@@ -125,8 +129,7 @@
         pass
 
     async def start(self):
-        await common.fill_well_known_uri(
-            self, os.getcwd(), "merge requests", meta_map={})
+        await common.fill_well_known_uri(self, os.getcwd(), "merge requests", meta_map={})
         extra = {}
         try:
             requests_data = data_format.deserialise(
@@ -148,7 +151,7 @@
             whitelist = None
         else:
             whitelist = {"id", "title", "body"}
-        for request_xmlui in requests_data['items']:
+        for request_xmlui in requests_data["items"]:
             xmlui = xmlui_manager.create(self.host, request_xmlui, whitelist=whitelist)
             await xmlui.show(values_only=True)
             self.disp("")
@@ -179,7 +182,8 @@
     async def start(self):
         self.repository = os.path.expanduser(os.path.abspath(self.args.repository))
         await common.fill_well_known_uri(
-            self, self.repository, "merge requests", meta_map={})
+            self, self.repository, "merge requests", meta_map={}
+        )
         extra = {}
         try:
             await self.host.bridge.mergeRequestsImport(
--- a/sat_frontends/jp/cmd_param.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_param.py	Thu Jun 17 13:05:58 2021 +0200
@@ -22,23 +22,31 @@
 from . import base
 from sat.core.i18n import _
 from .constants import Const as C
+
 __commands__ = ["Param"]
 
 
 class Get(base.CommandBase):
     def __init__(self, host):
         super(Get, self).__init__(
-            host, 'get', need_connect=False, help=_('get a parameter value'))
+            host, "get", need_connect=False, help=_("get a parameter value")
+        )
 
     def add_parser_options(self):
         self.parser.add_argument(
-            "category", nargs='?', help=_("category of the parameter"))
-        self.parser.add_argument("name", nargs='?', help=_("name of the parameter"))
+            "category", nargs="?", help=_("category of the parameter")
+        )
+        self.parser.add_argument("name", nargs="?", help=_("name of the parameter"))
         self.parser.add_argument(
-            "-a", "--attribute", type=str, default="value",
-            help=_("name of the attribute to get"))
+            "-a",
+            "--attribute",
+            type=str,
+            default="value",
+            help=_("name of the attribute to get"),
+        )
         self.parser.add_argument(
-            "--security-limit", type=int, default=-1, help=_("security limit"))
+            "--security-limit", type=int, default=-1, help=_("security limit")
+        )
 
     async def start(self):
         if self.args.category is None:
@@ -47,9 +55,12 @@
         elif self.args.name is None:
             try:
                 values_dict = await self.host.bridge.asyncGetParamsValuesFromCategory(
-                    self.args.category, self.args.security_limit, "", "", self.profile)
+                    self.args.category, self.args.security_limit, "", "", self.profile
+                )
             except Exception as e:
-                self.disp(_(f"can't find requested parameters: {e}"), error=True)
+                self.disp(
+                    _("can't find requested parameters: {e}").format(e=e), error=True
+                )
                 self.host.quit(C.EXIT_NOT_FOUND)
             else:
                 for name, value in values_dict.items():
@@ -57,10 +68,16 @@
         else:
             try:
                 value = await self.host.bridge.asyncGetParamA(
-                    self.args.name, self.args.category, self.args.attribute,
-                    self.args.security_limit, self.profile)
+                    self.args.name,
+                    self.args.category,
+                    self.args.attribute,
+                    self.args.security_limit,
+                    self.profile,
+                )
             except Exception as e:
-                self.disp(_(f"can't find requested parameter: {e}"), error=True)
+                self.disp(
+                    _("can't find requested parameter: {e}").format(e=e), error=True
+                )
                 self.host.quit(C.EXIT_NOT_FOUND)
             else:
                 print(value)
@@ -69,21 +86,29 @@
 
 class Set(base.CommandBase):
     def __init__(self, host):
-        super(Set, self).__init__(host, 'set', need_connect=False, help=_('set a parameter value'))
+        super(Set, self).__init__(
+            host, "set", need_connect=False, help=_("set a parameter value")
+        )
 
     def add_parser_options(self):
         self.parser.add_argument("category", help=_("category of the parameter"))
         self.parser.add_argument("name", help=_("name of the parameter"))
         self.parser.add_argument("value", help=_("name of the parameter"))
-        self.parser.add_argument("--security-limit", type=int, default=-1, help=_("security limit"))
+        self.parser.add_argument(
+            "--security-limit", type=int, default=-1, help=_("security limit")
+        )
 
     async def start(self):
         try:
             await self.host.bridge.setParam(
-                self.args.name, self.args.value, self.args.category,
-                self.args.security_limit, self.profile)
+                self.args.name,
+                self.args.value,
+                self.args.category,
+                self.args.security_limit,
+                self.profile,
+            )
         except Exception as e:
-            self.disp(_(f"can't set requested parameter: {e}"), error=True)
+            self.disp(_("can't set requested parameter: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             self.host.quit()
@@ -94,8 +119,11 @@
 
     def __init__(self, host):
         super(SaveTemplate, self).__init__(
-            host, 'save', use_profile=False,
-            help=_('save parameters template to xml file'))
+            host,
+            "save",
+            use_profile=False,
+            help=_("save parameters template to xml file"),
+        )
 
     def add_parser_options(self):
         self.parser.add_argument("filename", type=str, help=_("output file"))
@@ -105,10 +133,14 @@
         try:
             await self.host.bridge.saveParamsTemplate(self.args.filename)
         except Exception as e:
-            self.disp(_(f"can't save parameters to file: {e}"), error=True)
+            self.disp(_("can't save parameters to file: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"parameters saved to file {self.args.filename}"))
+            self.disp(
+                _("parameters saved to file {filename}").format(
+                    filename=self.args.filename
+                )
+            )
             self.host.quit()
 
 
@@ -117,8 +149,11 @@
 
     def __init__(self, host):
         super(LoadTemplate, self).__init__(
-            host, 'load', use_profile=False,
-            help=_('load parameters template from xml file'))
+            host,
+            "load",
+            use_profile=False,
+            help=_("load parameters template from xml file"),
+        )
 
     def add_parser_options(self):
         self.parser.add_argument("filename", type=str, help=_("input file"))
@@ -128,10 +163,14 @@
         try:
             self.host.bridge.loadParamsTemplate(self.args.filename)
         except Exception as e:
-            self.disp(_(f"can't load parameters from file: {e}"), error=True)
+            self.disp(_("can't load parameters from file: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"parameters loaded from file {self.args.filename}"))
+            self.disp(
+                _("parameters loaded from file {filename}").format(
+                    filename=self.args.filename
+                )
+            )
             self.host.quit()
 
 
@@ -139,4 +178,6 @@
     subcommands = (Get, Set, SaveTemplate, LoadTemplate)
 
     def __init__(self, host):
-        super(Param, self).__init__(host, 'param', use_profile=False, help=_('Save/load parameters template'))
+        super(Param, self).__init__(
+            host, "param", use_profile=False, help=_("Save/load parameters template")
+        )
--- a/sat_frontends/jp/cmd_ping.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_ping.py	Thu Jun 17 13:05:58 2021 +0200
@@ -25,14 +25,11 @@
 
 
 class Ping(base.CommandBase):
-
     def __init__(self, host):
-        super(Ping, self).__init__(host, 'ping', help=_('ping XMPP entity'))
+        super(Ping, self).__init__(host, "ping", help=_("ping XMPP entity"))
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "jid", help=_("jid to ping")
-        )
+        self.parser.add_argument("jid", help=_("jid to ping"))
         self.parser.add_argument(
             "-d", "--delay-only", action="store_true", help=_("output delay only (in s)")
         )
@@ -41,9 +38,9 @@
         try:
             pong_time = await self.host.bridge.ping(self.args.jid, self.profile)
         except Exception as e:
-            self.disp(msg=_(f"can't do the ping: {e}"), error=True)
+            self.disp(msg=_("can't do the ping: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            msg = pong_time if self.args.delay_only else  f"PONG ({pong_time} s)"
+            msg = pong_time if self.args.delay_only else f"PONG ({pong_time} s)"
             self.disp(msg)
             self.host.quit()
--- a/sat_frontends/jp/cmd_pubsub.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/cmd_pubsub.py	Thu Jun 17 13:05:58 2021 +0200
@@ -82,10 +82,10 @@
                 self.profile,
             )
         except BridgeException as e:
-            if e.condition == 'item-not-found':
+            if e.condition == "item-not-found":
                 self.disp(
                     f"The node {self.args.node} doesn't exist on {self.args.service}",
-                    error=True
+                    error=True,
                 )
                 self.host.quit(C.EXIT_NOT_FOUND)
             else:
@@ -155,7 +155,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(msg=_(f"can't create node: {e}"), error=True)
+            self.disp(msg=_("can't create node: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             if self.host.verbosity:
@@ -167,7 +167,6 @@
 
 
 class NodePurge(base.CommandBase):
-
     def __init__(self, host):
         super(NodePurge, self).__init__(
             host,
@@ -189,12 +188,14 @@
         if not self.args.force:
             if not self.args.service:
                 message = _(
-                    f"Are you sure to purge PEP node [{self.args.node}]? This will "
-                    f"delete ALL items from it!")
+                    "Are you sure to purge PEP node [{node}]? This will "
+                    "delete ALL items from it!"
+                ).format(node=self.args.node)
             else:
                 message = _(
-                    f"Are you sure to delete node [{self.args.node}] on service "
-                    f"[{self.args.service}]? This will delete ALL items from it!")
+                    "Are you sure to delete node [{node}] on service "
+                    "[{service}]? This will delete ALL items from it!"
+                ).format(node=self.args.node, service=self.args.service)
             await self.host.confirmOrQuit(message, _("node purge cancelled"))
 
         try:
@@ -204,10 +205,10 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(msg=_(f"can't purge node: {e}"), error=True)
+            self.disp(msg=_("can't purge node: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"node [{self.args.node}] purged successfully"))
+            self.disp(_("node [{node}] purged successfully").format(node=self.args.node))
             self.host.quit()
 
 
@@ -233,10 +234,13 @@
     async def start(self):
         if not self.args.force:
             if not self.args.service:
-                message = _(f"Are you sure to delete PEP node [{self.args.node}] ?")
+                message = _("Are you sure to delete PEP node [{node}] ?").format(
+                    node=self.args.node
+                )
             else:
-                message = _(f"Are you sure to delete node [{self.args.node}] on "
-                            f"service [{self.args.service}]?")
+                message = _(
+                    "Are you sure to delete node [{node}] on " "service [{service}]?"
+                ).format(node=self.args.node, service=self.args.service)
             await self.host.confirmOrQuit(message, _("node deletion cancelled"))
 
         try:
@@ -249,7 +253,7 @@
             self.disp(f"can't delete node: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"node [{self.args.node}] deleted successfully"))
+            self.disp(_("node [{node}] deleted successfully").format(node=self.args.node))
             self.host.quit()
 
 
@@ -307,7 +311,6 @@
 
 
 class NodeImport(base.CommandBase):
-
     def __init__(self, host):
         super(NodeImport, self).__init__(
             host,
@@ -326,16 +329,20 @@
         self.parser.add_argument(
             "import_file",
             type=argparse.FileType(),
-            help=_("path to the XML file with data to import. The file must contain "
-                   "whole XML of each item to import."),
+            help=_(
+                "path to the XML file with data to import. The file must contain "
+                "whole XML of each item to import."
+            ),
         )
 
     async def start(self):
         try:
-            element, etree = xml_tools.etreeParse(self, self.args.import_file,
-                                                  reraise=True)
+            element, etree = xml_tools.etreeParse(
+                self, self.args.import_file, reraise=True
+            )
         except Exception as e:
             from lxml.etree import XMLSyntaxError
+
             if isinstance(e, XMLSyntaxError) and e.code == 5:
                 # we have extra content, this probaby means that item are not wrapped
                 # so we wrap them here and try again
@@ -343,14 +350,15 @@
                 xml_buf = "<import>" + self.args.import_file.read() + "</import>"
                 element, etree = xml_tools.etreeParse(self, xml_buf)
 
-        # we reverse element as we expect to have most recently published element first
-        # TODO: make this more explicit and add an option
+                # we reverse element as we expect to have most recently published element first
+                # TODO: make this more explicit and add an option
         element[:] = reversed(element)
 
-        if not all([i.tag == '{http://jabber.org/protocol/pubsub}item' for i in element]):
+        if not all([i.tag == "{http://jabber.org/protocol/pubsub}item" for i in element]):
             self.disp(
                 _("You are not using list of pubsub items, we can't import this file"),
-                error=True)
+                error=True,
+            )
             self.host.quit(C.EXIT_DATA_ERROR)
             return
 
@@ -358,8 +366,12 @@
         if self.args.admin:
             method = self.host.bridge.psAdminItemsSend
         else:
-            self.disp(_("Items are imported without using admin mode, publisher can't "
-                        "be changed"))
+            self.disp(
+                _(
+                    "Items are imported without using admin mode, publisher can't "
+                    "be changed"
+                )
+            )
             method = self.host.bridge.psItemsSend
 
         try:
@@ -375,10 +387,13 @@
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             if items_ids:
-                self.disp(_('items published with id(s) {items_ids}').format(
-                    items_ids=', '.join(items_ids)))
+                self.disp(
+                    _("items published with id(s) {items_ids}").format(
+                        items_ids=", ".join(items_ids)
+                    )
+                )
             else:
-                self.disp(_('items published'))
+                self.disp(_("items published"))
             self.host.quit()
 
 
@@ -645,8 +660,9 @@
         try:
             from lxml import etree
         except ImportError:
-            self.disp('lxml module must be installed to use edit, please install it '
-                      'with "pip install lxml"',
+            self.disp(
+                "lxml module must be installed to use edit, please install it "
+                'with "pip install lxml"',
                 error=True,
             )
             self.host.quit(1)
@@ -659,7 +675,9 @@
                 etree.tostring(schema_elt, encoding="utf-8", pretty_print=True)
             )
             content_file_obj.seek(0)
-        await self.runEditor("pubsub_schema_editor_args", content_file_path, content_file_obj)
+        await self.runEditor(
+            "pubsub_schema_editor_args", content_file_path, content_file_obj
+        )
 
     async def start(self):
         try:
@@ -669,7 +687,7 @@
                 self.profile,
             )
         except BridgeException as e:
-            if e.condition == 'item-not-found' or e.classname=="NotFound":
+            if e.condition == "item-not-found" or e.classname == "NotFound":
                 schema = ""
             else:
                 self.disp(f"can't edit schema: {e}", error=True)
@@ -702,7 +720,7 @@
                 self.profile,
             )
         except BridgeException as e:
-            if e.condition == 'item-not-found' or e.classname=="NotFound":
+            if e.condition == "item-not-found" or e.classname == "NotFound":
                 schema = None
             else:
                 self.disp(f"can't get schema: {e}", error=True)
@@ -772,7 +790,7 @@
         extra = {}
         publish_options = NodeCreate.get_config_options(self.args)
         if publish_options:
-            extra['publish_options'] = publish_options
+            extra["publish_options"] = publish_options
 
         try:
             published_id = await self.host.bridge.psItemSend(
@@ -784,12 +802,12 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(_(f"can't send item: {e}"), error=True)
+            self.disp(_("can't send item: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             if published_id:
                 if self.args.quiet:
-                    self.disp(published_id, end='')
+                    self.disp(published_id, end="")
                 else:
                     self.disp(f"Item published at {published_id}")
             else:
@@ -833,10 +851,10 @@
                 )
             )
         except BridgeException as e:
-            if e.condition == 'item-not-found' or e.classname=="NotFound":
+            if e.condition == "item-not-found" or e.classname == "NotFound":
                 self.disp(
                     f"The node {self.args.node} doesn't exist on {self.args.service}",
-                    error=True
+                    error=True,
                 )
                 self.host.quit(C.EXIT_NOT_FOUND)
             else:
@@ -846,7 +864,7 @@
             self.disp(f"Internal error: {e}", error=True)
             self.host.quit(C.EXIT_INTERNAL_ERROR)
         else:
-            await self.output(ps_result['items'])
+            await self.output(ps_result["items"])
             self.host.quit(C.EXIT_OK)
 
 
@@ -886,10 +904,10 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(_(f"can't delete item: {e}"), error=True)
+            self.disp(_("can't delete item: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"item {self.args.item} has been deleted"))
+            self.disp(_("item {item} has been deleted").format(item=self.args.item))
             self.host.quit(C.EXIT_OK)
 
 
@@ -928,8 +946,9 @@
         try:
             from lxml import etree
         except ImportError:
-            self.disp('lxml module must be installed to use edit, please install it '
-                      'with "pip install lxml"',
+            self.disp(
+                "lxml module must be installed to use edit, please install it "
+                'with "pip install lxml"',
                 error=True,
             )
             self.host.quit(1)
@@ -939,7 +958,7 @@
                 service, node, 1, items, "", {}, self.profile
             )
         )
-        item_raw = ps_result['items'][0]
+        item_raw = ps_result["items"][0]
         parser = etree.XMLParser(remove_blank_text=True, recover=True)
         item_elt = etree.fromstring(item_raw, parser)
         item_id = item_elt.get("id")
@@ -951,17 +970,18 @@
         return etree.tostring(payload, encoding="unicode", pretty_print=True), item_id
 
     async def start(self):
-        (self.pubsub_service,
-         self.pubsub_node,
-         self.pubsub_item,
-         content_file_path,
-         content_file_obj) = await self.getItemPath()
+        (
+            self.pubsub_service,
+            self.pubsub_node,
+            self.pubsub_item,
+            content_file_path,
+            content_file_obj,
+        ) = await self.getItemPath()
         await self.runEditor("pubsub_editor_args", content_file_path, content_file_obj)
         self.host.quit()
 
 
 class Rename(base.CommandBase):
-
     def __init__(self, host):
         base.CommandBase.__init__(
             self,
@@ -973,10 +993,7 @@
         )
 
     def add_parser_options(self):
-        self.parser.add_argument(
-            "new_id",
-            help=_("new item id to use")
-        )
+        self.parser.add_argument("new_id", help=_("new item id to use"))
 
     async def start(self):
         try:
@@ -988,9 +1005,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(
-                f"can't rename item: {e}", error=True
-            )
+            self.disp(f"can't rename item: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             self.disp("Item renamed")
@@ -1021,7 +1036,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(_(f"can't subscribe to node: {e}"), error=True)
+            self.disp(_("can't subscribe to node: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             self.disp(_("subscription done"), 1)
@@ -1055,7 +1070,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(_(f"can't unsubscribe from node: {e}"), error=True)
+            self.disp(_("can't unsubscribe from node: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             self.disp(_("subscription removed"), 1)
@@ -1084,7 +1099,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(_(f"can't retrieve subscriptions: {e}"), error=True)
+            self.disp(_("can't retrieve subscriptions: {e}").format(e=e), error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             await self.output(subscriptions)
@@ -1113,9 +1128,7 @@
                 self.profile,
             )
         except Exception as e:
-            self.disp(
-                f"can't get node affiliations: {e}", error=True
-            )
+            self.disp(f"can't get node affiliations: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             await self.output(affiliations)
@@ -1169,16 +1182,20 @@
             "--max-depth",
             type=int,
             default=0,
-            help=_("maximum depth of recursion (will search linked nodes if > 0, "
-                   "DEFAULT: 0)"),
+            help=_(
+                "maximum depth of recursion (will search linked nodes if > 0, "
+                "DEFAULT: 0)"
+            ),
         )
         self.parser.add_argument(
             "-M",
             "--node-max",
             type=int,
             default=30,
-            help=_("maximum number of items to get per node ({} to get all items, "
-                   "DEFAULT: 30)".format( C.NO_LIMIT)),
+            help=_(
+                "maximum number of items to get per node ({} to get all items, "
+                "DEFAULT: 30)".format(C.NO_LIMIT)
+            ),
         )
         self.parser.add_argument(
             "-N",
@@ -1233,9 +1250,10 @@
             dest="filters",
             type=filter_python,
             metavar="PYTHON_CODE",
-            help=_('Python expression which much return a bool (True to keep item, '
-                   'False to reject it). "item" is raw text item, "item_xml" is '
-                   'lxml\'s etree.Element'
+            help=_(
+                "Python expression which much return a bool (True to keep item, "
+                'False to reject it). "item" is raw text item, "item_xml" is '
+                "lxml's etree.Element"
             ),
         )
 
@@ -1362,8 +1380,10 @@
             return self.etree.fromstring(item)
         except self.etree.XMLSyntaxError:
             self.disp(
-                _("item doesn't looks like XML, you have probably used --only-matching "
-                  "somewhere before and we have no more XML"),
+                _(
+                    "item doesn't looks like XML, you have probably used --only-matching "
+                    "somewhere before and we have no more XML"
+                ),
                 error=True,
             )
             self.host.quit(C.EXIT_BAD_ARG)
@@ -1397,9 +1417,7 @@
                     # doesn't really make sens to keep a fixed string
                     # so we raise an error
                     self.host.disp(
-                        _(
-                            "--only-matching used with fixed --text string, are you sure?"
-                        ),
+                        _("--only-matching used with fixed --text string, are you sure?"),
                         error=True,
                     )
                     self.host.quit(C.EXIT_BAD_ARG)
@@ -1420,9 +1438,7 @@
                 try:
                     elts = item_xml.xpath(value, namespaces=self.args.namespace)
                 except self.etree.XPathEvalError as e:
-                    self.disp(
-                        _("can't use xpath: {reason}").format(reason=e), error=True
-                    )
+                    self.disp(_("can't use xpath: {reason}").format(reason=e), error=True)
                     self.host.quit(C.EXIT_BAD_ARG)
                 keep = bool(elts)
                 if keep and only_matching:
@@ -1436,18 +1452,14 @@
             elif type_ == "python":
                 if item_xml is None:
                     item_xml = self.parseXml(item)
-                cmd_ns = {
-                    "etree": self.etree,
-                    "item": item,
-                    "item_xml": item_xml
-                    }
+                cmd_ns = {"etree": self.etree, "item": item, "item_xml": item_xml}
                 try:
                     keep = eval(value, cmd_ns)
                 except SyntaxError as e:
                     self.disp(str(e), error=True)
                     self.host.quit(C.EXIT_BAD_ARG)
 
-            ## flags
+                    ## flags
 
             elif type_ == "ignore-case":
                 ignore_case = value
@@ -1512,15 +1524,14 @@
                 p = await asyncio.create_subprocess_exec(*cmd_args)
                 ret = await p.wait()
             else:
-                p = await asyncio.create_subprocess_exec(*cmd_args,
-                                                         stdin=subprocess.PIPE)
+                p = await asyncio.create_subprocess_exec(*cmd_args, stdin=subprocess.PIPE)
                 await p.communicate(item.encode(sys.getfilesystemencoding()))
                 ret = p.returncode
             if ret != 0:
                 self.disp(
                     A.color(
                         C.A_FAILURE,
-                        _(f"executed command failed with exit code {ret}"),
+                        _("executed command failed with exit code {ret}").format(ret=ret),
                     )
                 )
 
@@ -1533,7 +1544,7 @@
         @param depth(int): current depth level
             0 for first node, 1 for first children, and so on
         """
-        for item in ps_result['items']:
+        for item in ps_result["items"]:
             if depth < self.args.max_depth:
                 await self.getSubNodes(item, depth)
             keep, item = self.filter(item)
@@ -1541,7 +1552,7 @@
                 continue
             await self.doItemAction(item, ps_result)
 
-        #  we check if we got all getItems results
+            #  we check if we got all getItems results
         self.to_get -= 1
         if self.to_get == 0:
             # yes, we can quit
@@ -1562,8 +1573,8 @@
         if not self.args.node:
             # TODO: handle get service affiliations when node is not set
             self.parser.error(_("empty node is not handled yet"))
-        # to_get is increased on each get and decreased on each answer
-        # when it reach 0 again, the command is finished
+            # to_get is increased on each get and decreased on each answer
+            # when it reach 0 again, the command is finished
         self.to_get = 0
         self._etree = None
         if self.args.filters is None:
@@ -1601,27 +1612,33 @@
             "--ignore-errors",
             action="store_true",
             help=_(
-                "if command return a non zero exit code, ignore the item and continue"),
+                "if command return a non zero exit code, ignore the item and continue"
+            ),
         )
         self.parser.add_argument(
             "-A",
             "--all",
             action="store_true",
-            help=_("get all items by looping over all pages using RSM")
+            help=_("get all items by looping over all pages using RSM"),
         )
         self.parser.add_argument(
             "command_path",
-            help=_("path to the command to use. Will be called repetitivly with an "
-                   "item as input. Output (full item XML) will be used as new one. "
-                   'Return "DELETE" string to delete the item, and "SKIP" to ignore it'),
+            help=_(
+                "path to the command to use. Will be called repetitivly with an "
+                "item as input. Output (full item XML) will be used as new one. "
+                'Return "DELETE" string to delete the item, and "SKIP" to ignore it'
+            ),
         )
 
     async def psItemsSendCb(self, item_ids, metadata):
         if item_ids:
-            self.disp(_('items published with ids {item_ids}').format(
-                item_ids=', '.join(item_ids)))
+            self.disp(
+                _("items published with ids {item_ids}").format(
+                    item_ids=", ".join(item_ids)
+                )
+            )
         else:
-            self.disp(_('items published'))
+            self.disp(_("items published"))
         if self.args.all:
             return await self.handleNextPage(metadata)
         else:
@@ -1634,30 +1651,34 @@
         @param metadata(dict): metadata as returned by psItemsGet
         """
         try:
-            last = metadata['rsm']['last']
-            index = int(metadata['rsm']['index'])
-            count = int(metadata['rsm']['count'])
+            last = metadata["rsm"]["last"]
+            index = int(metadata["rsm"]["index"])
+            count = int(metadata["rsm"]["count"])
         except KeyError:
-            self.disp(_("Can't retrieve all items, RSM metadata not available"),
-                      error=True)
+            self.disp(
+                _("Can't retrieve all items, RSM metadata not available"), error=True
+            )
             self.host.quit(C.EXIT_MISSING_FEATURE)
         except ValueError as e:
-            self.disp(_("Can't retrieve all items, bad RSM metadata: {msg}")
-                      .format(msg=e), error=True)
+            self.disp(
+                _("Can't retrieve all items, bad RSM metadata: {msg}").format(msg=e),
+                error=True,
+            )
             self.host.quit(C.EXIT_ERROR)
 
         if index + self.args.rsm_max >= count:
-            self.disp(_('All items transformed'))
+            self.disp(_("All items transformed"))
             self.host.quit(0)
 
-        self.disp(_('Retrieving next page ({page_idx}/{page_total})').format(
-            page_idx = int(index/self.args.rsm_max) + 1,
-            page_total = int(count/self.args.rsm_max),
+        self.disp(
+            _("Retrieving next page ({page_idx}/{page_total})").format(
+                page_idx=int(index / self.args.rsm_max) + 1,
+                page_total=int(count / self.args.rsm_max),
             )
         )
 
         extra = self.getPubsubExtra()
-        extra['rsm_after'] = last
+        extra["rsm_after"] = last
         try:
             ps_result = await data_format.deserialise(
                 self.host.bridge.psItemsGet(
@@ -1671,36 +1692,36 @@
                 )
             )
         except Exception as e:
-            self.disp(
-                f"can't retrieve items: {e}", error=True
-            )
+            self.disp(f"can't retrieve items: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
             await self.psItemsGetCb(ps_result)
 
     async def psItemsGetCb(self, ps_result):
-        encoding = 'utf-8'
+        encoding = "utf-8"
         new_items = []
 
-        for item in ps_result['items']:
+        for item in ps_result["items"]:
             if self.check_duplicates:
                 # this is used when we are not ordering by creation
                 # to avoid infinite loop
                 item_elt, __ = xml_tools.etreeParse(self, item)
-                item_id = item_elt.get('id')
+                item_id = item_elt.get("id")
                 if item_id in self.items_ids:
-                    self.disp(_(
-                        "Duplicate found on item {item_id}, we have probably handled "
-                        "all items.").format(item_id=item_id))
+                    self.disp(
+                        _(
+                            "Duplicate found on item {item_id}, we have probably handled "
+                            "all items."
+                        ).format(item_id=item_id)
+                    )
                     self.host.quit()
                 self.items_ids.append(item_id)
 
-            # we launch the command to filter the item
+                # we launch the command to filter the item
             try:
                 p = await asyncio.create_subprocess_exec(
-                    self.args.command_path,
-                    stdin=subprocess.PIPE,
-                    stdout=subprocess.PIPE)
+                    self.args.command_path, stdin=subprocess.PIPE, stdout=subprocess.PIPE
+                )
             except OSError as e:
                 exit_code = C.EXIT_CMD_NOT_FOUND if e.errno == 2 else C.EXIT_ERROR
                 self.disp(f"Can't execute the command: {e}", error=True)
@@ -1709,20 +1730,23 @@
             cmd_std_out, cmd_std_err = await p.communicate(item.encode(encoding))
             ret = p.returncode
             if ret != 0:
-                self.disp(f"The command returned a non zero status while parsing the "
-                          f"following item:\n\n{item}", error=True)
+                self.disp(
+                    f"The command returned a non zero status while parsing the "
+                    f"following item:\n\n{item}",
+                    error=True,
+                )
                 if self.args.ignore_errors:
                     continue
                 else:
                     self.host.quit(C.EXIT_CMD_ERROR)
             if cmd_std_err is not None:
-                cmd_std_err = cmd_std_err.decode(encoding, errors='ignore')
+                cmd_std_err = cmd_std_err.decode(encoding, errors="ignore")
                 self.disp(cmd_std_err, error=True)
             cmd_std_out = cmd_std_out.decode(encoding).strip()
             if cmd_std_out == "DELETE":
                 item_elt, __ = xml_tools.etreeParse(self, item)
-                item_id = item_elt.get('id')
-                self.disp(_(f"Deleting item {item_id}"))
+                item_id = item_elt.get("id")
+                self.disp(_("Deleting item {item_id}").format(item_id=item_id))
                 if self.args.apply:
                     try:
                         await self.host.bridge.psItemRetract(
@@ -1733,28 +1757,31 @@
                             self.profile,
                         )
                     except Exception as e:
-                        self.disp(
-                            f"can't delete item {item_id}: {e}", error=True
-                        )
+                        self.disp(f"can't delete item {item_id}: {e}", error=True)
                         self.host.quit(C.EXIT_BRIDGE_ERRBACK)
                 continue
             elif cmd_std_out == "SKIP":
                 item_elt, __ = xml_tools.etreeParse(self, item)
-                item_id = item_elt.get('id')
+                item_id = item_elt.get("id")
                 self.disp(_("Skipping item {item_id}").format(item_id=item_id))
                 continue
             element, etree = xml_tools.etreeParse(self, cmd_std_out)
 
             # at this point command has been run and we have a etree.Element object
             if element.tag not in ("item", "{http://jabber.org/protocol/pubsub}item"):
-                self.disp("your script must return a whole item, this is not:\n{xml}"
-                    .format(xml=etree.tostring(element, encoding="unicode")), error=True)
+                self.disp(
+                    "your script must return a whole item, this is not:\n{xml}".format(
+                        xml=etree.tostring(element, encoding="unicode")
+                    ),
+                    error=True,
+                )
                 self.host.quit(C.EXIT_DATA_ERROR)
 
             if not self.args.apply:
                 # we have a dry run, we just display filtered items
-                serialised = etree.tostring(element, encoding='unicode',
-                                            pretty_print=True)
+                serialised = etree.tostring(
+                    element, encoding="unicode", pretty_print=True
+                )
                 self.disp(serialised)
             else:
                 new_items.append(etree.tostring(element, encoding="unicode"))
@@ -1788,13 +1815,17 @@
         if self.args.all and self.args.order_by != C.ORDER_BY_CREATION:
             self.check_duplicates = True
             self.items_ids = []
-            self.disp(A.color(
-                A.FG_RED, A.BOLD,
-                '/!\\ "--all" should be used with "--order-by creation" /!\\\n',
-                A.RESET,
-                "We'll update items, so order may change during transformation,\n"
-                "we'll try to mitigate that by stopping on first duplicate,\n"
-                "but this method is not safe, and some items may be missed.\n---\n"))
+            self.disp(
+                A.color(
+                    A.FG_RED,
+                    A.BOLD,
+                    '/!\\ "--all" should be used with "--order-by creation" /!\\\n',
+                    A.RESET,
+                    "We'll update items, so order may change during transformation,\n"
+                    "we'll try to mitigate that by stopping on first duplicate,\n"
+                    "but this method is not safe, and some items may be missed.\n---\n",
+                )
+            )
         else:
             self.check_duplicates = False
 
@@ -1855,9 +1886,7 @@
         if not self.args.service:
             try:
                 jid_ = await self.host.bridge.asyncGetParamA(
-                    "JabberID",
-                    "Connection",
-                    profile_key=self.args.profile
+                    "JabberID", "Connection", profile_key=self.args.profile
                 )
             except Exception as e:
                 self.disp(f"can't retrieve jid: {e}", error=True)
@@ -1968,7 +1997,9 @@
             self.disp(f"can't delete hook: {e}", error=True)
             self.host.quit(C.EXIT_BRIDGE_ERRBACK)
         else:
-            self.disp(_(f"{nb_deleted} hook(s) have been deleted"))
+            self.disp(
+                _("{nb_deleted} hook(s) have been deleted").format(nb_deleted=nb_deleted)
+            )
             self.host.quit()
 
 
--- a/sat_frontends/jp/common.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/common.py	Thu Jun 17 13:05:58 2021 +0200
@@ -143,12 +143,11 @@
             raise OSError("path must link to a regular file")
         if path.parent != getTmpDir(self.sat_conf, self.cat_dir):
             self.disp(
-                f"File {path} is not in SàT temporary hierarchy, we do not remove "
-                f"it",
+                f"File {path} is not in SàT temporary hierarchy, we do not remove " f"it",
                 2,
             )
             return
-        # we have 2 files per draft with use_metadata, so we double max
+            # we have 2 files per draft with use_metadata, so we double max
         unlink_max = SECURE_UNLINK_MAX * 2 if self.use_metadata else SECURE_UNLINK_MAX
         backup_dir = getTmpDir(self.sat_conf, self.cat_dir, SECURE_UNLINK_DIR)
         if not os.path.exists(backup_dir):
@@ -157,9 +156,7 @@
         backup_path = os.path.join(backup_dir, filename)
         # we move file to backup dir
         self.host.disp(
-            "Backuping file {src} to {dst}".format(
-                src=path, dst=backup_path
-            ),
+            "Backuping file {src} to {dst}".format(src=path, dst=backup_path),
             1,
         )
         os.rename(path, backup_path)
@@ -171,8 +168,14 @@
                 self.host.disp("Purging backup file {}".format(path), 2)
                 os.unlink(path)
 
-    async def runEditor(self, editor_args_opt, content_file_path, content_file_obj,
-                        meta_file_path=None, meta_ori=None):
+    async def runEditor(
+        self,
+        editor_args_opt,
+        content_file_path,
+        content_file_obj,
+        meta_file_path=None,
+        meta_ori=None,
+    ):
         """Run editor to edit content and metadata
 
         @param editor_args_opt(unicode): option in [jp] section in configuration for
@@ -188,7 +191,7 @@
             assert meta_file_path is None
             assert meta_ori is None
 
-        # we calculate hashes to check for modifications
+            # we calculate hashes to check for modifications
         import hashlib
 
         content_file_obj.seek(0)
@@ -217,9 +220,10 @@
         if not args:
             args = [content_file_path]
 
-        # actual editing
+            # actual editing
         editor_process = await asyncio.create_subprocess_exec(
-            editor, *[str(a) for a in args])
+            editor, *[str(a) for a in args]
+        )
         editor_exit = await editor_process.wait()
 
         # edition will now be checked, and data will be sent if it was a success
@@ -243,7 +247,7 @@
                 )
                 self.host.quit(C.EXIT_NOT_FOUND)
 
-            # metadata
+                # metadata
             if self.use_metadata:
                 try:
                     with meta_file_path.open("rb") as f:
@@ -268,8 +272,8 @@
             if self.use_metadata and not metadata.get("publish", True):
                 self.disp(
                     f'Publication blocked by "publish" key in metadata, cancelling '
-                    f'edition.\n\ntemporary file path:\t{content_file_path}\nmetadata '
-                    f'file path:\t{meta_file_path}',
+                    f"edition.\n\ntemporary file path:\t{content_file_path}\nmetadata "
+                    f"file path:\t{meta_file_path}",
                     error=True,
                 )
                 self.host.quit()
@@ -289,7 +293,7 @@
                     os.unlink(meta_file_path)
                 self.host.quit()
 
-            # time to re-check the hash
+                # time to re-check the hash
             elif tmp_ori_hash == hashlib.sha1(content).digest() and (
                 not self.use_metadata or meta_ori == metadata
             ):
@@ -354,9 +358,7 @@
             )
             return os.fdopen(fd, "w+b"), Path(path)
         except OSError as e:
-            self.disp(
-                f"Can't create temporary file: {e}", error=True
-            )
+            self.disp(f"Can't create temporary file: {e}", error=True)
             self.host.quit(1)
 
     def getCurrentFile(self, profile):
@@ -371,7 +373,7 @@
         tmp_dir = getTmpDir(self.sat_conf, self.cat_dir, profile)
         available = [
             p
-            for p in tmp_dir.glob(f'{self.cat_dir}_*')
+            for p in tmp_dir.glob(f"{self.cat_dir}_*")
             if not p.match(f"*{METADATA_SUFF}")
         ]
         if not available:
@@ -436,9 +438,9 @@
                     else:
                         self.disp(
                             _(
-                                f'item "{item}" not found, we create a new item with'
-                                f'this id'
-                            ),
+                                'item "{item}" not found, we create a new item with'
+                                "this id"
+                            ).format(item=item),
                             2,
                         )
                     content_file_obj.seek(0)
@@ -453,9 +455,7 @@
                     content_file_obj.write("\n*****\n")
                 content_file_obj.write(content.encode("utf-8"))
                 content_file_obj.seek(0)
-                self.disp(
-                    _(f'item "{item}" found, we edit it'), 2
-                )
+                self.disp(_('item "{item}" found, we edit it').format(item=item), 2)
         else:
             self.disp("Editing a new item", 2)
             if self.use_metadata:
@@ -498,7 +498,7 @@
         size = None
         if headers:
             # we use a namedtuple to make the value easily accessible from filters
-            headers_safe = [re.sub(r'[^a-zA-Z_]', '_', h) for h in headers]
+            headers_safe = [re.sub(r"[^a-zA-Z_]", "_", h) for h in headers]
             row_cls = namedtuple("RowData", headers_safe)
         else:
             row_cls = tuple
@@ -516,8 +516,8 @@
                             col_value = filter_(value, row_cls(*row_data_list))
                         except TypeError:
                             col_value = filter_(value)
-                    # we count size without ANSI code as they will change length of the
-                    # string when it's mostly style/color changes.
+                            # we count size without ANSI code as they will change length of the
+                            # string when it's mostly style/color changes.
                     col_size = len(regex.ansiRemove(col_value))
                 else:
                     col_value = str(value)
@@ -562,7 +562,8 @@
 
     @classmethod
     def fromListDict(
-        cls, host, data, keys=None, headers=None, filters=None, defaults=None):
+        cls, host, data, keys=None, headers=None, filters=None, defaults=None
+    ):
         """Create a table from a list of dictionaries
 
         each dictionary is a row of the table, keys being columns names.
@@ -694,13 +695,13 @@
             bottom_sep = col_sep_size * bottom
         if not show_borders:
             left = right = head_line_left = head_line_right = ""
-        # top border
+            # top border
         if show_borders:
             self._disp(
                 top_left + top_sep.join([top * size for size in sizes]) + top_right
             )
 
-        # headers
+            # headers
         if show_header and self.headers is not None:
             self._disp(
                 left
@@ -714,7 +715,7 @@
                 + head_line_right
             )
 
-        # content
+            # content
         if columns_alignment == "left":
             alignment = lambda idx, s: ansi_ljust(s, sizes[idx])
         elif columns_alignment == "center":
@@ -740,7 +741,7 @@
                 + bottom_sep.join([bottom * size for size in sizes])
                 + bottom_right
             )
-        #  we return self so string can be used after display (table.display().string)
+            #  we return self so string can be used after display (table.display().string)
         return self
 
     def display_blank(self, **kwargs):
@@ -781,8 +782,10 @@
         uri_data = uris_data[key]
     except KeyError:
         host.disp(
-            _(f"No {key} URI specified for this project, please specify service and "
-              f"node"),
+            _(
+                "No {key} URI specified for this project, please specify service and "
+                "node"
+            ).format(key=key),
             error=True,
         )
         host.quit(C.EXIT_NOT_FOUND)
@@ -790,7 +793,7 @@
     uri = uri_data["uri"]
 
     # set extra metadata if they are specified
-    for data_key in ['labels']:
+    for data_key in ["labels"]:
         new_values_json = uri_data.get(data_key)
         if uri_data is not None:
             if meta_map is None:
@@ -803,7 +806,7 @@
             try:
                 values = getattr(args, data_key)
             except AttributeError:
-                raise exceptions.InternalError(f'there is no {data_key!r} arguments')
+                raise exceptions.InternalError(f"there is no {data_key!r} arguments")
             else:
                 if values is None:
                     values = []
@@ -815,5 +818,5 @@
         args.service = parsed_uri["path"]
         args.node = parsed_uri["node"]
     except KeyError:
-        host.disp(_(f"Invalid URI found: {uri}"), error=True)
+        host.disp(_("Invalid URI found: {uri}").format(uri=uri), error=True)
         host.quit(C.EXIT_DATA_ERROR)
--- a/sat_frontends/jp/constants.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/constants.py	Thu Jun 17 13:05:58 2021 +0200
@@ -23,7 +23,11 @@
 
 class Const(constants.Const):
 
-    APP_NAME = "jp"
+    APP_NAME = "Libervia CLI"
+    APP_COMPONENT = "CLI"
+    APP_NAME_ALT = "jp"
+    APP_NAME_FILE = "libervia_cli"
+    CONFIG_SECTION = APP_COMPONENT.lower()
     PLUGIN_CMD = "commands"
     PLUGIN_OUTPUT = "outputs"
     OUTPUT_TEXT = "text"  # blob of unicode text
--- a/sat_frontends/jp/xmlui_manager.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/sat_frontends/jp/xmlui_manager.py	Thu Jun 17 13:05:58 2021 +0200
@@ -174,12 +174,11 @@
 
 
 class EmptyWidget(xmlui_base.EmptyWidget, Widget):
-
     def __init__(self, xmlui_parent):
         Widget.__init__(self, xmlui_parent)
 
     async def show(self):
-        self.host.disp('')
+        self.host.disp("")
 
 
 class TextWidget(xmlui_base.TextWidget, ValueWidget):
@@ -199,7 +198,7 @@
         except AttributeError:
             return None
 
-    async def show(self, end='\n', ansi=""):
+    async def show(self, end="\n", ansi=""):
         """show label
 
         @param end(str): same as for [JP.disp]
@@ -211,6 +210,7 @@
 class JidWidget(xmlui_base.JidWidget, TextWidget):
     type = "jid"
 
+
 class StringWidget(xmlui_base.StringWidget, InputWidget):
     type = "string"
 
@@ -221,7 +221,7 @@
             elems = []
             self.verboseName(elems)
             if self.value:
-                elems.append(_(f"(enter: {self.value})"))
+                elems.append(_("(enter: {value})").format(value=self.value))
             elems.extend([C.A_HEADER, "> "])
             value = await self.host.ainput(A.color(*elems))
             if value:
@@ -244,21 +244,24 @@
             self.disp(self.value)
         else:
             if self.value:
-                self.disp(A.color(C.A_HEADER, "↓ current value ↓\n", A.FG_CYAN, self.value,
-                                  ""))
+                self.disp(
+                    A.color(C.A_HEADER, "↓ current value ↓\n", A.FG_CYAN, self.value, "")
+                )
 
             values = []
             while True:
                 try:
                     if not values:
-                        line = await self.host.ainput(A.color(C.A_HEADER, "[Ctrl-D to finish]> "))
+                        line = await self.host.ainput(
+                            A.color(C.A_HEADER, "[Ctrl-D to finish]> ")
+                        )
                     else:
                         line = await self.host.ainput()
                     values.append(line)
                 except EOFError:
-                   break
+                    break
 
-            self.value = '\n'.join(values).rstrip()
+            self.value = "\n".join(values).rstrip()
 
 
 class XHTMLBoxWidget(xmlui_base.XHTMLBoxWidget, StringWidget):
@@ -269,7 +272,8 @@
         #        this only for now to make it simpler, it must be refactored
         #        to use async when jp will be fully async (expected for 0.8)
         self.value = await self.host.bridge.syntaxConvert(
-            self.value, C.SYNTAX_XHTML, "markdown", False, self.host.profile)
+            self.value, C.SYNTAX_XHTML, "markdown", False, self.host.profile
+        )
         await super(XHTMLBoxWidget, self).show()
 
 
@@ -285,7 +289,7 @@
         if not self.options:
             return
 
-        # list display
+            # list display
         self.verboseName()
 
         for idx, (value, label) in enumerate(self.options):
@@ -304,12 +308,15 @@
             self.value = self.options[0][0]
             return
 
-        #  we ask use to choose an option
+            #  we ask use to choose an option
         choice = None
         limit_max = len(self.options) - 1
         while choice is None or choice < 0 or choice > limit_max:
             choice = await self.host.ainput(
-                A.color(C.A_HEADER, _(f"your choice (0-{limit_max}): "))
+                A.color(
+                    C.A_HEADER,
+                    _("your choice (0-{limit_max}): ").format(limit_max=limit_max),
+                )
             )
             try:
                 choice = int(choice)
@@ -328,12 +335,14 @@
         if self.read_only or self.root.read_only:
             self.disp(disp_true if self.value else disp_false)
         else:
-            self.disp(A.color(C.A_HEADER, "0: ",
-                              disp_false, A.RESET,
-                              " *" if not self.value else ""))
-            self.disp(A.color(C.A_HEADER, "1: ",
-                              disp_true, A.RESET,
-                              " *" if self.value else ""))
+            self.disp(
+                A.color(
+                    C.A_HEADER, "0: ", disp_false, A.RESET, " *" if not self.value else ""
+                )
+            )
+            self.disp(
+                A.color(C.A_HEADER, "1: ", disp_true, A.RESET, " *" if self.value else "")
+            )
             choice = None
             while choice not in ("0", "1"):
                 elems = [C.A_HEADER, _("your choice (0,1): ")]
@@ -345,8 +354,7 @@
     def _xmluiGetValue(self):
         return C.boolConst(self.value)
 
-
-## Containers ##
+        ## Containers ##
 
 
 class Container(Base):
@@ -383,7 +391,7 @@
 
     async def show(self):
         for child in self.children:
-            end = '\n'
+            end = "\n"
             # we check linked widget type
             # to see if we want the label on the same line or not
             if child.type == "label":
@@ -396,15 +404,14 @@
                         "string",
                         "jid_input",
                     ):
-                        end = ' '
+                        end = " "
                     elif wid_type == "bool" and for_widget.read_only:
-                        end = ' '
+                        end = " "
                 await child.show(end=end, ansi=A.FG_CYAN)
             else:
                 await child.show()
 
-
-## Dialogs ##
+                ## Dialogs ##
 
 
 class Dialog(object):
@@ -422,8 +429,8 @@
         """
         raise NotImplementedError(self.__class__)
 
+
 class MessageDialog(xmlui_base.MessageDialog, Dialog):
-
     def __init__(self, xmlui_parent, title, message, level):
         Dialog.__init__(self, xmlui_parent)
         xmlui_base.MessageDialog.__init__(self, xmlui_parent)
@@ -437,7 +444,6 @@
 
 
 class NoteDialog(xmlui_base.NoteDialog, Dialog):
-
     def __init__(self, xmlui_parent, title, message, level):
         Dialog.__init__(self, xmlui_parent)
         xmlui_base.NoteDialog.__init__(self, xmlui_parent)
@@ -456,12 +462,15 @@
 
 
 class ConfirmDialog(xmlui_base.ConfirmDialog, Dialog):
-
     def __init__(self, xmlui_parent, title, message, level, buttons_set):
         Dialog.__init__(self, xmlui_parent)
         xmlui_base.ConfirmDialog.__init__(self, xmlui_parent)
         self.title, self.message, self.level, self.buttons_set = (
-            title, message, level, buttons_set)
+            title,
+            message,
+            level,
+            buttons_set,
+        )
 
     async def show(self):
         # TODO: handle buttons_set and level
@@ -469,16 +478,15 @@
         if self.title:
             self.disp(A.color(C.A_HEADER, self.title))
         input_ = None
-        while input_ not in ('y', 'n'):
+        while input_ not in ("y", "n"):
             input_ = await self.host.ainput(f"{self.message} (y/n)? ")
             input_ = input_.lower()
-        if input_ == 'y':
+        if input_ == "y":
             self._xmluiValidated()
         else:
             self._xmluiCancelled()
 
-
-## Factory ##
+            ## Factory ##
 
 
 class WidgetFactory(object):
@@ -496,8 +504,17 @@
     workflow = None
     _submit_cb = None
 
-    def __init__(self, host, parsed_dom, title=None, flags=None, callback=None,
-                 ignore=None, whitelist=None, profile=None):
+    def __init__(
+        self,
+        host,
+        parsed_dom,
+        title=None,
+        flags=None,
+        callback=None,
+        ignore=None,
+        whitelist=None,
+        profile=None,
+    ):
         xmlui_base.XMLUIPanel.__init__(
             self,
             host,
@@ -588,7 +605,7 @@
             await xmlui.show()
             if xmlui.submit_id:
                 await xmlui.onFormSubmitted()
-        # TODO: handle data other than XMLUI
+                # TODO: handle data other than XMLUI
         if not XMLUIPanel._actions:
             if self._submit_cb is None:
                 self.host.quit()
@@ -622,6 +639,7 @@
         pass
 
 
-create = partial(xmlui_base.create, class_map={
-    xmlui_base.CLASS_PANEL: XMLUIPanel,
-    xmlui_base.CLASS_DIALOG: XMLUIDialog})
+create = partial(
+    xmlui_base.create,
+    class_map={xmlui_base.CLASS_PANEL: XMLUIPanel, xmlui_base.CLASS_DIALOG: XMLUIDialog},
+)
--- a/setup.py	Thu Jun 03 15:21:43 2021 +0200
+++ b/setup.py	Thu Jun 17 13:05:58 2021 +0200
@@ -66,6 +66,8 @@
 with open(os.path.join(NAME, 'VERSION')) as f:
     VERSION = f.read().strip()
 is_dev_version = VERSION.endswith('D')
+if is_dev_version:
+    install_requires.append("setuptools_scm")
 
 
 def sat_dev_version():