changeset 69:86f1f7f6d332

i18n first draft - gettext support added in SàT - first draft of french translation - added README with a HOWTO for translators
author Goffi <goffi@goffi.org>
date Wed, 03 Mar 2010 17:12:23 +1100
parents 9b842086d915
children 8f2ed279784b
files README4TRANSLATORS fr.po i18n/fr/LC_MESSAGES/sat.mo plugins/plugin_xep_0054.py plugins/plugin_xep_0065.py plugins/plugin_xep_0077.py plugins/plugin_xep_0096.py plugins/plugin_xep_0100.py sat.po sat.tac tools/memory.py
diffstat 11 files changed, 1463 insertions(+), 153 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README4TRANSLATORS	Wed Mar 03 17:12:23 2010 +1100
@@ -0,0 +1,25 @@
+First of all, thank you for helping translating SàT :)
+
+To translate a file, you can use a dedicated tool as the excellent gtranslator:
+- use the template .po file (e.g. sat.po) and name it to your translated language (e.g. fr.po for french); you can preferably generate a new template directly from the source with the following command (eventually adapted):
+> xgettext -L python -d sat sat.tac tools/*py plugins/*py
+
+- use the choosed tool (a simple text editor can be sufficient) to edit the file: e.g. gtranslator fr.po
+
+- once you translation is finished (or partly finished: the english sentences are used if there is no translation), you can test them by generating a binary and moving it to the right place with the following commands:
+> msgfmt -o sat.mo fr
+> mv sat.mo i18n/fr/LC_MESSAGES/sat.mo
+
+/!\ Note that you don't need to precise the file extention mith the msgfmt command, here fr mean "use fr.po file"
+
+- if you have already a translation, and want to update it (new translations to do, some sentences have changed), you can use the following commands:
+> msgmerge fr.po sat.po > fr2.po
+and if everything is allright
+> mv fr2.po fr.po
+
+Don't forget that you can use the version-control system (mercurial, the "hg" command) to keep history of you translations.
+
+You can check the fr.po file to see how it's done and to know what to put while you set up you translation tool.
+
+Trank you again for you help, don't forget to give me your name and contact mail so I can credit you, and don't hesitate to contact me if you need help (goffi@goffi.org).
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fr.po	Wed Mar 03 17:12:23 2010 +1100
@@ -0,0 +1,647 @@
+# SàT french translation.
+# Copyright (C) 2009, 2010 Jérôme Poisson
+# This file is distributed under the same license as the SàT package.
+# Jérôme Poisson <goffi@goffi.org>, 2009, 2010.
+# Goffi <goffi@goffi.org>, 2010.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.0.2D\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-03 16:51+1100\n"
+"PO-Revision-Date: 2010-03-03 16:52+1100\n"
+"Last-Translator: Goffi <goffi@goffi.org>\n"
+"Language-Team: French <goffi@goffi.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sat.tac:88
+#, python-format
+msgid "********** [%s] CONNECTED **********"
+msgstr "********** [%s] CONNECTÉ **********"
+
+#: sat.tac:94
+msgid "XML stream is initialized"
+msgstr "Le flux XML est initialisé"
+
+#: sat.tac:114
+#, python-format
+msgid "********** [%s] DISCONNECTED **********"
+msgstr "********** [%s] DÉCONNECTÉ **********"
+
+#: sat.tac:118
+msgid "No keep_alife"
+msgstr "Pas de \"keep_alife\""
+
+#: sat.tac:129
+#, python-format
+msgid "got message from: %s"
+msgstr "message reçu de: %s"
+
+#: sat.tac:171
+#, python-format
+msgid "new contact in roster list: %s"
+msgstr "nouveau contact: %s"
+
+#: sat.tac:178
+#, python-format
+msgid "removing %s from roster list"
+msgstr "supppression du contact %s"
+
+#: sat.tac:188
+#, python-format
+msgid "presence update for [%s]"
+msgstr "mise à jour de l'information de présence pour [%s]"
+
+#: sat.tac:218
+#, python-format
+msgid "subscription approved for [%s]"
+msgstr "inscription approuvée pour [%s]"
+
+#: sat.tac:223
+#, python-format
+msgid "unsubscription confirmed for [%s]"
+msgstr "désinscription confirmée pour [%s]"
+
+#: sat.tac:228
+#, python-format
+msgid "subscription request for [%s]"
+msgstr "demande d'inscription pour [%s]"
+
+#: sat.tac:233
+#, python-format
+msgid "unsubscription asked for [%s]"
+msgstr "demande de désinscription pour [%s]"
+
+#: sat.tac:259
+msgid "Registration asked for"
+msgstr "inscription demandée pour"
+
+#: sat.tac:277 plugins/plugin_xep_0077.py:84 plugins/plugin_xep_0077.py:98
+#, python-format
+msgid "registration answer: %s"
+msgstr "réponse à la demande d'inscription: %s"
+
+#: sat.tac:279 plugins/plugin_xep_0077.py:100
+msgid "Registration successfull"
+msgstr "Inscription réussie"
+
+#: sat.tac:284 plugins/plugin_xep_0077.py:76 plugins/plugin_xep_0077.py:107
+#, python-format
+msgid "Registration failure: %s"
+msgstr "Échec de l'inscription: %s"
+
+#: sat.tac:289 plugins/plugin_xep_0077.py:113
+msgid "Username already exists, please choose an other one"
+msgstr "Ce nom d'utilisateur existe déjà, veuillez en choisir un autre"
+
+#: sat.tac:292
+#, python-format
+msgid "Registration failed (%s)"
+msgstr "Éched de l'insciption (%s)"
+
+#: sat.tac:305
+msgid "Trying to access an undefined constant"
+msgstr "Vous essayer d'utiliser une constante indéfinie"
+
+#: sat.tac:312
+msgid "Trying to redefine a constant"
+msgstr "Vous essayez de ré-attribuer une constante"
+
+#: sat.tac:373
+#, python-format
+msgid "importing plugin: %s"
+msgstr "Importation du plugin: %s"
+
+#: sat.tac:387
+msgid "Trying to connect a non-exsitant profile"
+msgstr "Vous essayer de connecter un profile qui n'existe pas"
+
+#: sat.tac:391
+msgid "already connected !"
+msgstr "Vous êtes déjà connecté !"
+
+#: sat.tac:415
+msgid "setting plugins parents"
+msgstr "Configuration des parents des extensions"
+
+#: sat.tac:426
+msgid "not connected !"
+msgstr "Vous  n'êtes pas connecté !"
+
+#: sat.tac:429
+msgid "Disconnecting..."
+msgstr "Déconnexion..."
+
+#: sat.tac:441
+msgid "running app"
+msgstr "Lancement de l'application"
+
+#: sat.tac:445
+msgid "stopping app"
+msgstr "Arrêt de l'application"
+
+#: sat.tac:483
+msgid "No user or server given"
+msgstr "L'utilisateur ou le serveur n'ont pas été spécifié"
+
+#: sat.tac:485
+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."
+
+#: sat.tac:492
+#, 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 ?"
+
+#: sat.tac:500
+#, python-format
+msgid "register Confirmation CB ! (%s)"
+msgstr "Callback de confirmation d'inscription !"
+
+#: sat.tac:532
+#, python-format
+msgid "FIXME FIXME FIXME: Unmanaged action (%s) in submitForm"
+msgstr ""
+"CORRIGEZ-MOI CORRIGEZ-MOI CORRIGEZ-MOI: Action non gérée (%s) dans "
+"\"submitForm\""
+
+#: sat.tac:542
+#, 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"
+
+#: sat.tac:552
+msgid "asking connection status for a non-existant profile"
+msgstr "demande de l'état de connexion pour un profile qui n'existe pas"
+
+#: sat.tac:569
+msgid "Incomplete data"
+msgstr "Données incomplétes"
+
+#: sat.tac:575
+msgid "Unknown action type"
+msgstr "Type d'action inconnu"
+
+#: sat.tac:587
+#, python-format
+msgid "Sending jabber message to %s..."
+msgstr "Envoi du message jabber à %s"
+
+#: sat.tac:610
+#, python-format
+msgid "subsciption request [%(type)s] for %(jid)s"
+msgstr "demande d'inscription [%(type)s] pour %(jid)s"
+
+#: sat.tac:617
+msgid "sending automatic \"to\" subscription request"
+msgstr "envoi automatique de la demande d'inscription \"to\""
+
+#: sat.tac:648
+#, python-format
+msgid "Feature found: %s"
+msgstr "Fonctionnalité trouvée: %s"
+
+#: sat.tac:651
+#, python-format
+msgid "Identity found: [%(category)s/%(type)s] %(identity)s"
+msgstr "Identité trouvée: [%(category)s/%(type)s] %(identity)s"
+
+#: sat.tac:671
+msgid "type for actionResultExt must be DICT_DICT, fixing it"
+msgstr "Le type pour actionResultExt doit être DICT_DICT, correction"
+
+#: sat.tac:685
+msgid "Attempt to register two callbacks for the same confirmation"
+msgstr "Tentative de déclaration de 2 callbacks pour la même configuration"
+
+#: sat.tac:693
+#, python-format
+msgid "Received confirmation answer for id [%(id)s]: %(success)s"
+msgstr "Réponse pour confirmation reçu (id [%(id)s]): %(success)s"
+
+#: sat.tac:693
+msgid "refused"
+msgstr "refusé"
+
+#: sat.tac:695
+msgid "Received an unknown confirmation"
+msgstr "Confirmation inconnue reçue"
+
+#: sat.tac:708
+msgid "Trying to remove an unknow progress callback"
+msgstr "Tentative d'effacement d'une callback de progression inconnue."
+
+#: sat.tac:732
+msgid "Trying to remove an unknow general callback"
+msgstr "Tentative d'effacement d'une callback générale inconnue."
+
+#: sat.tac:741
+msgid "Trying to call unknown function"
+msgstr "Tentative d'appel d'une fonction inconnue"
+
+#: tools/memory.py:77
+msgid "general params data loaded"
+msgstr "Paramètres généraux chargés"
+
+#: tools/memory.py:79
+msgid "Can't load general params data !"
+msgstr "Impossible de charger les paramètres généraux !"
+
+#: tools/memory.py:85
+msgid "individual params data loaded"
+msgstr "Paramètres individuels chargés"
+
+#: tools/memory.py:87
+msgid "Can't load individual params data !"
+msgstr "Impossible de charger les paramètres individuels !"
+
+#: tools/memory.py:124
+msgid "The profile name already exists"
+msgstr "Ce nom de profile existe déjà"
+
+#: tools/memory.py:133
+msgid "Trying to delete an unknown profile"
+msgstr "Tentative d'appel d'un profile inconnue"
+
+#: tools/memory.py:149
+msgid "No default profile, returning first one"
+msgstr "Pas de profile par défaut, envoi du premier"
+
+#: tools/memory.py:154
+msgid "Trying to access an unknown profile"
+msgstr "Tentative d'accès à un profile inconnu"
+
+#: tools/memory.py:194
+#, 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"
+
+#: tools/memory.py:207 tools/memory.py:225
+#, 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 !"
+
+#: tools/memory.py:236
+msgid "Requesting a param for an non-existant profile"
+msgstr "Demande d'un paramètre pour un profile inconnu"
+
+#: tools/memory.py:290 tools/memory.py:303
+msgid "Asking params for inexistant profile"
+msgstr "Demande de paramètres pour un profile inconnu"
+
+#: tools/memory.py:349
+#, python-format
+msgid "Requesting an unknown parameter (%(category)s/%(name)s)"
+msgstr "Demande d'un paramètre inconnu: (%(category)s/%(name)s)"
+
+#: tools/memory.py:361
+msgid "Trying to set parameter for an unknown profile"
+msgstr "Tentative d'assigner un paramètre à un profile inconnu"
+
+#: tools/memory.py:375
+msgid "Memory manager init"
+msgstr "Initialisation du gestionnaire de mémoire"
+
+#: tools/memory.py:402
+msgid "params template loaded"
+msgstr "Modèle des paramètres chargé"
+
+#: tools/memory.py:404
+msgid "Can't load params template !"
+msgstr "Impossible de charger le modèle des paramètres !"
+
+#: tools/memory.py:407
+msgid "No params template, using default template"
+msgstr "Pas de modèle de paramètres, utilisation du modèle par défaut"
+
+#: tools/memory.py:412
+msgid "params loaded"
+msgstr "paramètres chargés"
+
+#: tools/memory.py:414
+msgid "Can't load params !"
+msgstr "Impossible de charger les paramètres !"
+
+#: tools/memory.py:421
+msgid "history loaded"
+msgstr "Historique chargée"
+
+#: tools/memory.py:423
+msgid "Can't load history !"
+msgstr "Impossible de charger l'historique !"
+
+#: tools/memory.py:430
+msgid "private values loaded"
+msgstr "Données privées chargées"
+
+#: tools/memory.py:432
+msgid "Can't load private values !"
+msgstr "Impossible de charger les données privées !"
+
+#: tools/memory.py:448
+msgid "params saved"
+msgstr "Paramètres sauvés"
+
+#: tools/memory.py:451
+msgid "history saved"
+msgstr "Historique sauvée"
+
+#: tools/memory.py:454
+msgid "private values saved"
+msgstr "Données privées sauvées"
+
+#: tools/memory.py:497
+msgid "source JID not found !"
+msgstr "JID source introuvable !"
+
+#: tools/memory.py:501
+msgid "dest JID not found !"
+msgstr "JID destination introuvable !"
+
+#: tools/memory.py:528
+msgid "Trying to add a contact to a non-existant profile"
+msgstr "Tentative d'ajout d'un contact à un profile inexistant"
+
+#: tools/memory.py:540
+msgid "Trying to delete a contact for a non-existant profile"
+msgstr "Tentative de suppression d'un contact pour un profile inexistant"
+
+#: tools/memory.py:548
+msgid "Asking a contact for a non-existant profile"
+msgstr "Demande d'un contact pour un profile inexistant"
+
+#: tools/memory.py:562 tools/memory.py:611
+msgid "Asking contacts for a non-existant profile"
+msgstr "Demande de contacts pour un profile inexistant"
+
+#: tools/memory.py:573
+msgid "Trying to add presence status to a non-existant profile"
+msgstr "Tentative d'ajout d'informations de présence à un profile inexistant"
+
+#: tools/memory.py:601
+msgid "Asking waiting subscriptions for a non-existant profile"
+msgstr "Demande des inscriptions en attente pour un profile inexistant"
+
+#: plugins/plugin_xep_0054.py:62
+msgid "Implementation of vcard-temp"
+msgstr "Implementation de vcard-temp"
+
+#: plugins/plugin_xep_0054.py:68
+msgid "Plugin XEP_0054 initialization"
+msgstr "Initialisation du plugin XEP_0054"
+
+#: plugins/plugin_xep_0054.py:111
+#, python-format
+msgid "Photo of type [%s] found"
+msgstr "Photo du type [%s] trouvée"
+
+#: plugins/plugin_xep_0054.py:113
+msgid "Decoding binary"
+msgstr "Décodage des données"
+
+#: plugins/plugin_xep_0054.py:120
+#, python-format
+msgid "file saved to %s"
+msgstr "fichier enregistré dans %s"
+
+#: plugins/plugin_xep_0054.py:122
+#, python-format
+msgid "file [%s] already in cache"
+msgstr "fichier [%s] déjà en cache"
+
+#: plugins/plugin_xep_0054.py:128
+msgid "parsing vcard"
+msgstr "Analyse de la vcard"
+
+#: plugins/plugin_xep_0054.py:154
+#, 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"
+
+#: plugins/plugin_xep_0054.py:160
+msgid "VCard found"
+msgstr "VCard trouvée"
+
+#: plugins/plugin_xep_0054.py:166
+msgid "FIXME: vCard not found as first child element"
+msgstr "CORRIGEZ-MOI: la vCard n'est pas le premier élément enfant"
+
+#: plugins/plugin_xep_0054.py:171
+#, python-format
+msgid "Can't find VCard of %s"
+msgstr "Impossible de trouver la VCard de %s"
+
+#: plugins/plugin_xep_0054.py:180
+msgid "Asking vcard for an non-existant or not connected profile"
+msgstr "Demande de vcard pour un profile inexistant ou non connecté"
+
+#: plugins/plugin_xep_0054.py:183
+#, python-format
+msgid "Asking for %s's VCard"
+msgstr "Demande de la VCard de %s"
+
+#: plugins/plugin_xep_0054.py:198
+#, python-format
+msgid "Asking for an uncached avatar [%s]"
+msgstr "Demande d'un avatar qui n'est pas en cache [%s]"
+
+#: plugins/plugin_xep_0054.py:245
+msgid "New avatar found, requesting vcard"
+msgstr "Nouvel avatar trouvé, demande de vcard"
+
+#: plugins/plugin_xep_0065.py:89
+msgid "Implementation of SOCKS5 Bytestreams"
+msgstr "Implémentation du « SOCKS5 Bytestreams » (flux d'octets SOCKS5)"
+
+#: plugins/plugin_xep_0065.py:135
+msgid "Protocol init"
+msgstr "Initialisation du protocole"
+
+#: plugins/plugin_xep_0065.py:217
+#, python-format
+msgid "Adding connection: %(address)s, %(connection)s"
+msgstr "Ajout d'une connexion: %(address)s, %(connection)s"
+
+#: plugins/plugin_xep_0065.py:313
+#, python-format
+msgid "Saving file in %s."
+msgstr "Sauvegarde du fichier dans %s."
+
+#: plugins/plugin_xep_0065.py:364
+msgid "File transfer completed, closing connection"
+msgstr "Transfert de fichier terminé, fermeture de la connexion"
+
+#: plugins/plugin_xep_0065.py:438
+msgid "Socks 5 server connection started"
+msgstr "Connexion du serveur SOCKS 5 démarrée"
+
+#: plugins/plugin_xep_0065.py:441
+#, python-format
+msgid "Socks 5 server connection lost (reason: %s)"
+msgstr "Connexion du serveur SOCKS5 perdue (raison: %s)"
+
+#: plugins/plugin_xep_0065.py:448
+msgid "Socks 5 client connection started"
+msgstr "Connexion du client SOCKS 5 démarrée"
+
+#: plugins/plugin_xep_0065.py:451
+#, python-format
+msgid "Socks 5 client connection lost (reason: %s)"
+msgstr "Connexion du client SOCKS5 perdue (raison: %s)"
+
+#: plugins/plugin_xep_0065.py:468
+msgid "Plugin XEP_0065 initialization"
+msgstr "Initialisation du plugin XEP_0065"
+
+#: plugins/plugin_xep_0065.py:470
+msgid "registering"
+msgstr "enregistrement"
+
+#: plugins/plugin_xep_0065.py:480
+#, python-format
+msgid "Launching Socks5 Stream server on port %d"
+msgstr "Lancement du serveur de flux Socks5 sur le port %d"
+
+#: plugins/plugin_xep_0065.py:496
+msgid "Launching socks5 initiator"
+msgstr "Lancement de socks5 en mode initiateur"
+
+#: plugins/plugin_xep_0065.py:511
+#, python-format
+msgid "Stream proposed: host=[%(host)s] port=[%(post)s]"
+msgstr "Flux proposé: serveur=[%(host)s] port=[%(post)s]"
+
+#: plugins/plugin_xep_0065.py:527
+msgid "activating stream"
+msgstr "Lancement du flux"
+
+#: plugins/plugin_xep_0077.py:41
+msgid "Implementation of in-band registration"
+msgstr "Implémentation de l'enregistrement en ligne"
+
+#: plugins/plugin_xep_0077.py:47
+msgid "Plugin XEP_0077 initialization"
+msgstr "Initialisation du plugin XEP_0077"
+
+#: plugins/plugin_xep_0077.py:62
+msgid "No data form found"
+msgstr "Aucune donnée trouvée"
+
+#: 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é :("
+
+#: plugins/plugin_xep_0077.py:86
+msgid "Your are now unregistred"
+msgstr "Vous êtes maintenant désinscrit"
+
+#: plugins/plugin_xep_0077.py:90
+#, python-format
+msgid "Unregistration failure: %s"
+msgstr "Échec de la désinscription: %s"
+
+#: plugins/plugin_xep_0077.py:94
+#, python-format
+msgid "Unregistration failed: %s"
+msgstr "Échec de la désinscription: %s"
+
+#: plugins/plugin_xep_0077.py:116
+msgid "Registration failed"
+msgstr "Échec de l'inscription"
+
+#: plugins/plugin_xep_0077.py:134 plugins/plugin_xep_0096.py:154
+msgid "Asking for an non-existant or not connected profile"
+msgstr "Demande d'un profile inexistant ou non connecté"
+
+#: plugins/plugin_xep_0077.py:137
+#, python-format
+msgid "Asking registration for [%s]"
+msgstr "Demande d'enregistrement pour [%s]"
+
+#: plugins/plugin_xep_0096.py:52
+msgid "Implementation of SI File Transfert"
+msgstr ""
+"Implémentation de l'initialisation de flux pour le transfert de fichier "
+
+#: plugins/plugin_xep_0096.py:58
+msgid "Plugin XEP_0096 initialization"
+msgstr "Initialisation du plugin XEP_0096"
+
+#: plugins/plugin_xep_0096.py:67
+msgid "XEP-0096 management"
+msgstr "Gestion de XEP-0096"
+
+#: plugins/plugin_xep_0096.py:75
+#, python-format
+msgid "File proposed: name=[%(name)s] size=%(size)s"
+msgstr "Fichier proposé: nom=[%(name)s] taille=%(size)s"
+
+#: plugins/plugin_xep_0096.py:91
+#, python-format
+msgid "Transfert [%s] refused"
+msgstr "Transfert [%s] refusé"
+
+#: plugins/plugin_xep_0096.py:96
+#, python-format
+msgid "Transfert [%s] accepted"
+msgstr "Transfert [%s] accepté"
+
+#: plugins/plugin_xep_0096.py:99
+msgid "Approved unknow id !"
+msgstr "id inconnue approuvée !"
+
+#: plugins/plugin_xep_0096.py:111
+msgid "Feature negociation"
+msgstr "Négociation de fonctionnalités"
+
+#: plugins/plugin_xep_0100.py:37
+msgid "Implementation of Gateways protocol"
+msgstr "Implémentation du protocole de transports"
+
+#: plugins/plugin_xep_0100.py:43
+msgid "Gateways plugin initialization"
+msgstr "Initialisation de l'extension pour les transports"
+
+#: plugins/plugin_xep_0100.py:53
+#, python-format
+msgid "All items checked for id [%s]"
+msgstr "Tous les points ont été vérifiés pour l'id [%s]"
+
+#: plugins/plugin_xep_0100.py:64
+#, python-format
+msgid "Found gateway (%(jid)s): %(identity)s"
+msgstr "Transport trouvé (%(jid)s): %(identity)s"
+
+#: plugins/plugin_xep_0100.py:75
+#, python-format
+msgid "Error when discovering [%(jid)s]: %(condition)s"
+msgstr "Erreur en analysant [%(jid)s]: %(condition)s"
+
+#: plugins/plugin_xep_0100.py:84
+msgid "No gateway found"
+msgstr "Aucun transport trouvé"
+
+#: plugins/plugin_xep_0100.py:90
+#, python-format
+msgid "item found: %s"
+msgstr "object trouvé: %s"
+
+#: plugins/plugin_xep_0100.py:96
+msgid "Registration successful, doing the rest"
+msgstr "Inscription réussie, lancement du reste de la procédure"
+
+#: plugins/plugin_xep_0100.py:113
+#, python-format
+msgid "find gateways (target = %s)"
+msgstr "transports trouvée (cible = %s)"
Binary file i18n/fr/LC_MESSAGES/sat.mo has changed
--- a/plugins/plugin_xep_0054.py	Thu Feb 25 17:09:18 2010 +1100
+++ b/plugins/plugin_xep_0054.py	Wed Mar 03 17:12:23 2010 +1100
@@ -59,13 +59,13 @@
 "dependencies": [],
 "main": "XEP_0054",
 "handler": "yes",
-"description": """Implementation of vcard-temp"""
+"description": _("""Implementation of vcard-temp""")
 }
 
 class XEP_0054():
 
     def __init__(self, host):
-        info("Plugin XEP_0054 initialization")
+        info(_("Plugin XEP_0054 initialization"))
         self.host = host
         self.avatar_path = os.path.expanduser(self.host.get_const('local_dir') + AVATAR_PATH)
         self.vcard_cache = host.memory.getPrivate("vcard_cache") or {}  #used to store nicknames and avatar, key = jid
@@ -108,24 +108,24 @@
         """Parse a <PHOTO> elem and save the picture"""
         for elem in photo_xml.elements():
             if elem.name == 'TYPE':
-                info('Photo of type [%s] found' % str(elem))
+                info(_('Photo of type [%s] found') % str(elem))
             if elem.name == 'BINVAL':
-                debug('Decoding binary')
+                debug(_('Decoding binary'))
                 decoded = b64decode(str(elem))
                 hash = sha1(decoded).hexdigest()
                 filename = self.avatar_path+'/'+hash
                 if not os.path.exists(filename):
                     with open(filename,'wb') as file:
                         file.write(decoded)
-                    debug("file saved to %s" % hash)
+                    debug(_("file saved to %s") % hash)
                 else:
-                    debug("file [%s] already in cache" % hash)
+                    debug(_("file [%s] already in cache") % hash)
                 return hash
 
     @defer.deferredGenerator
     def vCard2Dict(self, vcard, target):
         """Convert a VCard to a dict, and save binaries"""
-        debug ("parsing vcard")
+        debug (_("parsing vcard"))
         dictionary = {}
         d = defer.Deferred()
         
@@ -151,24 +151,24 @@
                 else:
                     self.update_cache(target, 'avatar', dictionary['avatar'])
             else:
-                info ('FIXME: [%s] VCard tag is not managed yet' % elem.name)
+                info (_('FIXME: [%s] VCard tag is not managed yet') % elem.name)
 
         yield dictionary
 
     def vcard_ok(self, answer):
         """Called after the first get IQ"""
-        debug ("VCard found")
+        debug (_("VCard found"))
 
         if answer.firstChildElement().name == "vCard":
             d = self.vCard2Dict(answer.firstChildElement(), jid.JID(answer["from"]))
             d.addCallback(lambda data: self.host.bridge.actionResult("RESULT", answer['id'], data))
         else:
-            error ("FIXME: vCard not found as first child element")
+            error (_("FIXME: vCard not found as first child element"))
             self.host.bridge.actionResult("SUPPRESS", answer['id'], {}) #FIXME: maybe an error message would be best
 
     def vcard_err(self, failure):
         """Called when something is wrong with registration"""
-        error ("Can't find VCard of %s" % failure.value.stanza['from'])
+        error (_("Can't find VCard of %s") % failure.value.stanza['from'])
         self.host.bridge.actionResult("SUPPRESS", failure.value.stanza['id'], {}) #FIXME: maybe an error message would be best
   
     def getCard(self, target, profile_key='@DEFAULT@'):
@@ -177,10 +177,10 @@
         @result: id to retrieve the profile"""
         current_jid, xmlstream = self.host.getJidNStream(profile_key)
         if not xmlstream:
-            error ('Asking profile for an non-existant or not connected profile')
+            error (_('Asking vcard for an non-existant or not connected profile'))
             return ""
         to_jid = jid.JID(target)
-        debug("Asking for %s's VCard" % to_jid.userhost())
+        debug(_("Asking for %s's VCard") % to_jid.userhost())
         reg_request=IQ(xmlstream,'get')
         reg_request["from"]=current_jid.full()
         reg_request["to"] = to_jid.userhost()
@@ -195,7 +195,7 @@
         """
         filename = self.avatar_path+'/'+hash
         if not os.path.exists(filename):
-            error ("Asking for an uncached avatar [%s]" %  hash)
+            error (_("Asking for an uncached avatar [%s]") %  hash)
             return ""
         return filename
 
@@ -242,5 +242,5 @@
                 hash = str(elem)
                 old_avatar = self.plugin_parent.get_cache(to_jid, 'avatar')
                 if not old_avatar or old_avatar != hash:
-                    debug('New avatar found, requesting vcard')
+                    debug(_('New avatar found, requesting vcard'))
                     self.plugin_parent.getCard(to_jid.userhost(), self.parent.profile)
--- a/plugins/plugin_xep_0065.py	Thu Feb 25 17:09:18 2010 +1100
+++ b/plugins/plugin_xep_0065.py	Wed Mar 03 17:12:23 2010 +1100
@@ -86,7 +86,7 @@
 "protocols": ["XEP-0065"],
 "main": "XEP_0065",
 "handler": "yes",
-"description": """Implementation of SOCKS5 Bytestreams"""
+"description": _("""Implementation of SOCKS5 Bytestreams""")
 }
 
 STATE_INITIAL = 0
@@ -132,7 +132,7 @@
 
 class SOCKSv5(protocol.Protocol, FileSender):
     def __init__(self):
-        debug("Protocol init")
+        debug(_("Protocol init"))
         self.state = STATE_INITIAL
         self.buf = ""
         self.supportedAuthMechs = [ AUTHMECH_ANON ]
@@ -214,7 +214,7 @@
         self.transport.loseConnection()
     
     def addConnection(self, address, connection):
-        info("Adding connection: %s, %s", address, connection)
+        info(_("Adding connection: %(address)s, %(connection)s") % {'address':address, 'connection':connection})
         olist = self.pendingConns.get(address, [])
         if len(olist) <= 1:
             olist.append(connection)
@@ -310,7 +310,7 @@
                 self.loseConnection()
                 return
 
-            debug("Saving file in %s.", self.data["dest_path"])
+            debug(_("Saving file in %s."), self.data["dest_path"])
             self.dest_file = open(self.data["dest_path"], 'w')
             self.state = STATE_TARGET_READY
             self.activateCB(self.target_jid, self.initiator_jid, self.sid, self.IQ_id, self.xmlstream)
@@ -328,7 +328,7 @@
             self._startNegotiation()
 
     def connectRequested(self, addr, port):
-        debug(("connectRequested"))
+        debug("connectRequested")
         # Check for special connect to the namespace -- this signifies that the client
         # is just checking to ensure it can connect to the streamhost
         if addr == "http://jabber.org/protocol/bytestreams":
@@ -361,7 +361,7 @@
             data["position"] = ""
 
     def fileTransfered(self, d):
-        info("File transfer completed, closing connection")
+        info(_("File transfer completed, closing connection"))
         self.transport.loseConnection()
 
     def updateTransfered(self, data):
@@ -435,20 +435,20 @@
 
 
     def startedConnecting(self, connector):
-        debug ("Socks 5 server connection started")
+        debug (_("Socks 5 server connection started"))
 
     def clientConnectionLost(self, connector, reason):
-        debug ("Socks 5 server connection lost (reason: %s)", reason)
+        debug (_("Socks 5 server connection lost (reason: %s)"), reason)
 
 class Socks5ClientFactory(protocol.ClientFactory):
     protocol = SOCKSv5
     protocol.mode = "target"  #FIXME: Q&D way, fix it 
 
     def startedConnecting(self, connector):
-        debug ("Socks 5 client connection started")
+        debug (_("Socks 5 client connection started"))
 
     def clientConnectionLost(self, connector, reason):
-        debug ("Socks 5 client connection lost (reason: %s)", reason)
+        debug (_("Socks 5 client connection lost (reason: %s)"), reason)
 
 
 class XEP_0065():
@@ -465,9 +465,9 @@
     """
 
     def __init__(self, host):
-        info("Plugin XEP_0065 initialization")
+        info(_("Plugin XEP_0065 initialization"))
         self.host = host
-        debug("registering")
+        debug(_("registering"))
         self.server_factory = Socks5ServerFactory()
         self.server_factory.protocol.host = self.host #needed for progress CB
         self.client_factory = Socks5ClientFactory()
@@ -477,7 +477,7 @@
         host.memory.setDefault("IP", "File Transfert", self.getExternalIP)
         
         port = int(self.host.memory.getParamA("Port", "File Transfert"))
-        info("Launching Socks5 Stream server on port %d", port)
+        info(_("Launching Socks5 Stream server on port %d"), port)
         reactor.listenTCP(port, self.server_factory)
     
     def getHandler(self):
@@ -493,7 +493,7 @@
         
     def sendFile(self, id, filepath, size):
         #lauching socks5 initiator
-        debug("Launching socks5 initiator")
+        debug(_("Launching socks5 initiator"))
         self.server_factory.protocol.mode = "initiator"
         self.server_factory.protocol.filepath = filepath
         self.server_factory.protocol.filesize = size
@@ -508,7 +508,7 @@
         IQ_id = iq['id']
         for element in SI_elem.elements():
             if element.name == "streamhost":
-                info ("Stream proposed: host=[%s] port=[%s]", element['host'], element['port'])
+                info (_("Stream proposed: host=[%(host)s] port=[%(post)s]") % {'host':element['host'], 'port':element['port']})
                 factory = self.client_factory
                 self.server_factory.protocol.mode = "target"
                 factory.protocol.host = self.host #needed for progress CB
@@ -524,7 +524,7 @@
                 reactor.connectTCP(element['host'], int(element['port']), factory)
                 
     def activateStream(self, from_jid, to_jid, sid, IQ_id, xmlstream):
-        debug("activating stream")
+        debug(_("activating stream"))
         result = domish.Element(('', 'iq'))
         result['type'] = 'result'
         result['id'] = IQ_id
--- a/plugins/plugin_xep_0077.py	Thu Feb 25 17:09:18 2010 +1100
+++ b/plugins/plugin_xep_0077.py	Wed Mar 03 17:12:23 2010 +1100
@@ -38,13 +38,13 @@
 "protocols": ["XEP-0077"],
 "dependencies": [],
 "main": "XEP_0077",
-"description": """Implementation of in-band registration"""
+"description": _("""Implementation of in-band registration""")
 }
 
 class XEP_0077():
  
     def __init__(self, host):
-        info("Plugin XEP_0077 initialization")
+        info(_("Plugin XEP_0077 initialization"))
         self.host = host
         self.triggers = {}  #used by other protocol (e.g. XEP-0100) to finish registration. key = target_jid
         host.bridge.addMethod("in_band_register", ".communication", in_sign='ss', out_sign='s', method=self.in_band_register)
@@ -59,10 +59,10 @@
         try:
             x_elem = filter (lambda x:x.name == "x", answer.firstChildElement().elements())[0] #We only want the "x" element (data form)
         except IndexError:
-            info("No data form found")
+            info(_("No data form found"))
             #TODO: manage registration without data form
             answer_data = {}
-            answer_data={"reason": "unmanaged", "message":"This gateway can't be managed by SàT, sorry :("}
+            answer_data={"reason": "unmanaged", "message":_("This gateway can't be managed by SàT, sorry :(")}
             answer_type = "ERROR"
             self.host.bridge.actionResult(answer_type, answer['id'], answer_data)
             return
@@ -73,7 +73,7 @@
 
     def reg_err(self, failure):
         """Called when something is wrong with registration"""
-        info ("Registration failure: %s" % str(failure.value))
+        info (_("Registration failure: %s") % str(failure.value))
         answer_data = {}
         answer_data['reason'] = 'unknown'
         answer_data={"message":"%s [code: %s]" % (failure.value.condition, failure.value.code)}
@@ -81,39 +81,39 @@
         self.host.bridge.actionResult(answer_type, failure.value.stanza['id'], answer_data)
    
     def unregistrationAnswer(self, answer):
-        debug ("registration answer: %s" % answer.toXml())
+        debug (_("registration answer: %s") % answer.toXml())
         answer_type = "SUCCESS"
-        answer_data={"message":"Your are now unregistred"}
+        answer_data={"message":_("Your are now unregistred")}
         self.host.bridge.actionResult(answer_type, answer['id'], answer_data)
         
     def unregistrationFailure(self, failure):
-        info ("Unregistration failure: %s" % str(failure.value))
+        info (_("Unregistration failure: %s") % str(failure.value))
         answer_type = "ERROR"
         answer_data = {}
         answer_data['reason'] = 'unknown'
-        answer_data={"message":"Unregistration failed: %s" % failure.value.condition}
+        answer_data={"message":_("Unregistration failed: %s") % failure.value.condition}
         self.host.bridge.actionResult(answer_type, failure.value.stanza['id'], answer_data)
     
     def registrationAnswer(self, answer):
-        debug ("registration answer: %s" % answer.toXml())
+        debug (_("registration answer: %s") % answer.toXml())
         answer_type = "SUCCESS"
-        answer_data={"message":"Registration successfull"}
+        answer_data={"message":_("Registration successfull")}
         self.host.bridge.actionResult(answer_type, answer['id'], answer_data)
         if self.triggers.has_key(answer["from"]):
             self.triggers[answer["from"]](answer["from"])
             del self.triggers[answer["from"]]
         
     def registrationFailure(self, failure):
-        info ("Registration failure: %s" % str(failure.value))
+        info (_("Registration failure: %s") % str(failure.value))
         print failure.value.stanza.toXml()
         answer_type = "ERROR"
         answer_data = {}
         if failure.value.condition == 'conflict':
             answer_data['reason'] = 'conflict'
-            answer_data={"message":"Username already exists, please choose an other one"}
+            answer_data={"message":_("Username already exists, please choose an other one")}
         else:
             answer_data['reason'] = 'unknown'
-            answer_data={"message":"Registration failed"}
+            answer_data={"message":_("Registration failed")}
         self.host.bridge.actionResult(answer_type, failure.value.stanza['id'], answer_data)
         if self.triggers.has_key(answer["from"]):
             del self.triggers[answer["from"]]
@@ -131,10 +131,10 @@
         """register to a target JID"""
         current_jid, xmlstream = self.host.getJidNStream(profile_key)
         if not xmlstream:
-            error ('Asking profile for an non-existant or not connected profile')
+            error (_('Asking for an non-existant or not connected profile'))
             return ""
         to_jid = jid.JID(target)
-        debug("Asking registration for [%s]" % to_jid.full())
+        debug(_("Asking registration for [%s]") % to_jid.full())
         reg_request=IQ(xmlstream,'get')
         reg_request["from"]=current_jid.full()
         reg_request["to"] = to_jid.full()
--- a/plugins/plugin_xep_0096.py	Thu Feb 25 17:09:18 2010 +1100
+++ b/plugins/plugin_xep_0096.py	Wed Mar 03 17:12:23 2010 +1100
@@ -49,13 +49,13 @@
 "dependencies": ["XEP_0065"],
 "main": "XEP_0096",
 "handler": "yes",
-"description": """Implementation of SI File Transfert"""
+"description": _("""Implementation of SI File Transfert""")
 }
 
 class XEP_0096():
 
     def __init__(self, host):
-        info("Plugin XEP_0096 initialization")
+        info(_("Plugin XEP_0096 initialization"))
         self.host = host
         self._waiting_for_approval = {}
         host.bridge.addMethod("sendFile", ".communication", in_sign='sss', out_sign='s', method=self.sendFile)
@@ -64,7 +64,7 @@
         return XEP_0096_handler(self)  
 
     def xep_96(self, IQ, profile):
-        info ("XEP-0096 management")
+        info (_("XEP-0096 management"))
         IQ.handled=True
         SI_elem = IQ.firstChildElement()
         debug(SI_elem.toXml())
@@ -72,7 +72,7 @@
         file_size = ""
         for element in SI_elem.elements():
             if element.name == "file":
-                info ("File proposed: name=[%s] size=%s", element['name'], element['size'])
+                info (_("File proposed: name=[%(name)s] size=%(size)s") % {'name':element['name'], 'size':element['size']})
                 filename = element["name"]
                 file_size = element["size"]
             elif element.name == "feature":
@@ -88,15 +88,15 @@
             self.host.plugins["XEP_0065"].setData(data, id)
             self.approved(id)
         else:
-            debug ("Transfert [%s] refused", id)
+            debug (_("Transfert [%s] refused"), id)
             del(self._waiting_for_approval[id])
 
     def approved(self, id):
         """must be called when a file transfert has be accepted by client"""
-        debug ("Transfert [%s] accepted", id)
+        debug (_("Transfert [%s] accepted"), id)
 
         if ( not self._waiting_for_approval.has_key(id) ):
-            error ("Approved unknow id !")
+            error (_("Approved unknow id !"))
             #TODO: manage this (maybe approved by several frontends)
         else:
             element, from_id, size, profile = self._waiting_for_approval[id]
@@ -108,7 +108,7 @@
         #FIXME: over ultra mega ugly, need to be generic
         client = self.host.getClient(profile)
         assert(client)
-        info ("Feature negociation")
+        info (_("Feature negociation"))
         data = feat_elem.firstChildElement()
         field = data.firstChildElement()
         #FIXME: several options ! Q&D code for test only
@@ -151,7 +151,7 @@
         """
         current_jid, xmlstream = self.host.getJidNStream(profile_key)
         if not xmlstream:
-            error ('Asking profile for an non-existant or not connected profile')
+            error (_('Asking for an non-existant or not connected profile'))
             return ""
         debug ("sendfile (%s) to %s", filepath, to )
         print type(filepath), type(to)
--- a/plugins/plugin_xep_0100.py	Thu Feb 25 17:09:18 2010 +1100
+++ b/plugins/plugin_xep_0100.py	Wed Mar 03 17:12:23 2010 +1100
@@ -34,13 +34,13 @@
 "protocols": ["XEP-0100"],
 "dependencies": ["XEP_0077"],
 "main": "XEP_0100",
-"description": """Implementation of Gateways protocol"""
+"description": _("""Implementation of Gateways protocol""")
 }
 
 class XEP_0100():
 
     def __init__(self, host):
-        info("Gateways plugin initialization")
+        info(_("Gateways plugin initialization"))
         self.host = host
         self.__gateways = {}  #dict used to construct the answer to findGateways. Key = target jid
         host.bridge.addMethod("findGateways", ".communication", in_sign='ss', out_sign='s', method=self.findGateways)
@@ -50,7 +50,7 @@
         self.__gateways[request_id]['__handled_items']+=1
 
         if self.__gateways[request_id]['__total_items'] == self.__gateways[request_id]['__handled_items']:
-            debug ("All items checked for id [%s]" % str(request_id))
+            debug (_("All items checked for id [%s]") % str(request_id))
             
             del self.__gateways[request_id]['__total_items']
             del self.__gateways[request_id]['__handled_items']
@@ -61,7 +61,7 @@
 
         for identity in disco.identities:
             if identity[0] == 'gateway':
-                print ("Found gateway (%s): %s" % (entity.full(), disco.identities[identity]))
+                print (_("Found gateway (%(jid)s): %(identity)s") % {'jid':entity.full(), 'identity':disco.identities[identity]})
                 self.__gateways[request_id][entity.full()] = {
                     'name':disco.identities[identity],
                     'type':identity[1]
@@ -72,7 +72,7 @@
     def discoInfoErr(self, failure, entity, request_id):
         """Something is going wrong with disco"""
         failure.trap(jab_error.StanzaError)
-        error("Error when discovering [%s]: %s" % (entity.full(), failure.value.condition))
+        error(_("Error when discovering [%(jid)s]: %(condition)s") % {'jid':entity.full(), 'condition':failure.value.condition})
         self.__inc_handled_items(request_id)
         
     
@@ -81,19 +81,19 @@
         #FIXME: target is used as we can't find the original iq node (parent is None)
         #       an other way would avoid this useless parameter (is there a way with wokkel ?)
         if len(disco._items) == 0:
-            debug ("No gateway found")
+            debug (_("No gateway found"))
             self.host.actionResultExt(request_id,"DICT_DICT",{})
             return
 
         self.__gateways[request_id] = {'__total_items':len(disco._items), '__handled_items':0, '__private__':{'target':target.full()}}
         for item in disco._items:
-            debug ("item found: %s", item.name)
+            debug (_("item found: %s"), item.name)
             client.disco.requestInfo(item.entity).addCallback(self.discoInfo, entity=item.entity, request_id=request_id)
             client.disco.requestInfo(item.entity).addErrback(self.discoInfoErr, entity=item.entity, request_id=request_id)
 
     def registrationSuccessful(self, target):
         """Called when in_band registration is ok, we must now follow the rest of procedure"""
-        print "Registration successful, doing the rest"
+        debug (_("Registration successful, doing the rest"))
         self.host.addContact(target)
         self.host.setPresence(target)
     
@@ -109,9 +109,8 @@
         """
         client = self.host.getClient(profile_key)
         assert(client)
-        print "target ===>", target
         to_jid = jid.JID(target)
-        debug ("find gateways (target = %s)" % to_jid.full())
+        debug (_("find gateways (target = %s)") % to_jid.full())
         request_id = self.host.get_next_id()
         client.disco.requestItems(to_jid).addCallback(self.discoItems, request_id=request_id, target = to_jid, client = client)
         return request_id
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sat.po	Wed Mar 03 17:12:23 2010 +1100
@@ -0,0 +1,635 @@
+# 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.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-03-03 16:51+1100\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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sat.tac:88
+#, python-format
+msgid "********** [%s] CONNECTED **********"
+msgstr ""
+
+#: sat.tac:94
+msgid "XML stream is initialized"
+msgstr ""
+
+#: sat.tac:114
+#, python-format
+msgid "********** [%s] DISCONNECTED **********"
+msgstr ""
+
+#: sat.tac:118
+msgid "No keep_alife"
+msgstr ""
+
+#: sat.tac:129
+#, python-format
+msgid "got message from: %s"
+msgstr ""
+
+#: sat.tac:171
+#, python-format
+msgid "new contact in roster list: %s"
+msgstr ""
+
+#: sat.tac:178
+#, python-format
+msgid "removing %s from roster list"
+msgstr ""
+
+#: sat.tac:188
+#, python-format
+msgid "presence update for [%s]"
+msgstr ""
+
+#: sat.tac:218
+#, python-format
+msgid "subscription approved for [%s]"
+msgstr ""
+
+#: sat.tac:223
+#, python-format
+msgid "unsubscription confirmed for [%s]"
+msgstr ""
+
+#: sat.tac:228
+#, python-format
+msgid "subscription request for [%s]"
+msgstr ""
+
+#: sat.tac:233
+#, python-format
+msgid "unsubscription asked for [%s]"
+msgstr ""
+
+#: sat.tac:259
+msgid "Registration asked for"
+msgstr ""
+
+#: sat.tac:277 plugins/plugin_xep_0077.py:84 plugins/plugin_xep_0077.py:98
+#, python-format
+msgid "registration answer: %s"
+msgstr ""
+
+#: sat.tac:279 plugins/plugin_xep_0077.py:100
+msgid "Registration successfull"
+msgstr ""
+
+#: sat.tac:284 plugins/plugin_xep_0077.py:76 plugins/plugin_xep_0077.py:107
+#, python-format
+msgid "Registration failure: %s"
+msgstr ""
+
+#: sat.tac:289 plugins/plugin_xep_0077.py:113
+msgid "Username already exists, please choose an other one"
+msgstr ""
+
+#: sat.tac:292
+#, python-format
+msgid "Registration failed (%s)"
+msgstr ""
+
+#: sat.tac:305
+msgid "Trying to access an undefined constant"
+msgstr ""
+
+#: sat.tac:312
+msgid "Trying to redefine a constant"
+msgstr ""
+
+#: sat.tac:373
+#, python-format
+msgid "importing plugin: %s"
+msgstr ""
+
+#: sat.tac:387
+msgid "Trying to connect a non-exsitant profile"
+msgstr ""
+
+#: sat.tac:391
+msgid "already connected !"
+msgstr ""
+
+#: sat.tac:415
+msgid "setting plugins parents"
+msgstr ""
+
+#: sat.tac:426
+msgid "not connected !"
+msgstr ""
+
+#: sat.tac:429
+msgid "Disconnecting..."
+msgstr ""
+
+#: sat.tac:441
+msgid "running app"
+msgstr ""
+
+#: sat.tac:445
+msgid "stopping app"
+msgstr ""
+
+#: sat.tac:483
+msgid "No user or server given"
+msgstr ""
+
+#: sat.tac:485
+msgid "No user, password or server given, can't register new account."
+msgstr ""
+
+#: sat.tac:492
+#, python-format
+msgid "Are you sure to register new account [%(user)s] to server %(server)s ?"
+msgstr ""
+
+#: sat.tac:500
+#, python-format
+msgid "register Confirmation CB ! (%s)"
+msgstr ""
+
+#: sat.tac:532
+#, python-format
+msgid "FIXME FIXME FIXME: Unmanaged action (%s) in submitForm"
+msgstr ""
+
+#: sat.tac:542
+#, python-format
+msgid "setting param: %(name)s=%(value)s in category %(category)s"
+msgstr ""
+
+#: sat.tac:552
+msgid "asking connection status for a non-existant profile"
+msgstr ""
+
+#: sat.tac:569
+msgid "Incomplete data"
+msgstr ""
+
+#: sat.tac:575
+msgid "Unknown action type"
+msgstr ""
+
+#: sat.tac:587
+#, python-format
+msgid "Sending jabber message to %s..."
+msgstr ""
+
+#: sat.tac:610
+#, python-format
+msgid "subsciption request [%(type)s] for %(jid)s"
+msgstr ""
+
+#: sat.tac:617
+msgid "sending automatic \"to\" subscription request"
+msgstr ""
+
+#: sat.tac:648
+#, python-format
+msgid "Feature found: %s"
+msgstr ""
+
+#: sat.tac:651
+#, python-format
+msgid "Identity found: [%(category)s/%(type)s] %(identity)s"
+msgstr ""
+
+#: sat.tac:671
+msgid "type for actionResultExt must be DICT_DICT, fixing it"
+msgstr ""
+
+#: sat.tac:685
+msgid "Attempt to register two callbacks for the same confirmation"
+msgstr ""
+
+#: sat.tac:693
+#, python-format
+msgid "Received confirmation answer for id [%(id)s]: %(success)s"
+msgstr ""
+
+#: sat.tac:693
+msgid "refused"
+msgstr ""
+
+#: sat.tac:695
+msgid "Received an unknown confirmation"
+msgstr ""
+
+#: sat.tac:708
+msgid "Trying to remove an unknow progress callback"
+msgstr ""
+
+#: sat.tac:732
+msgid "Trying to remove an unknow general callback"
+msgstr ""
+
+#: sat.tac:741
+msgid "Trying to call unknown function"
+msgstr ""
+
+#: tools/memory.py:77
+msgid "general params data loaded"
+msgstr ""
+
+#: tools/memory.py:79
+msgid "Can't load general params data !"
+msgstr ""
+
+#: tools/memory.py:85
+msgid "individual params data loaded"
+msgstr ""
+
+#: tools/memory.py:87
+msgid "Can't load individual params data !"
+msgstr ""
+
+#: tools/memory.py:124
+msgid "The profile name already exists"
+msgstr ""
+
+#: tools/memory.py:133
+msgid "Trying to delete an unknown profile"
+msgstr ""
+
+#: tools/memory.py:149
+msgid "No default profile, returning first one"
+msgstr ""
+
+#: tools/memory.py:154
+msgid "Trying to access an unknown profile"
+msgstr ""
+
+#: tools/memory.py:194
+#, python-format
+msgid "Can't determine default value for [%(category)s/%(name)s]: %(reason)s"
+msgstr ""
+
+#: tools/memory.py:207 tools/memory.py:225
+#, python-format
+msgid "Requested param [%(name)s] in category [%(category)s] doesn't exist !"
+msgstr ""
+
+#: tools/memory.py:236
+msgid "Requesting a param for an non-existant profile"
+msgstr ""
+
+#: tools/memory.py:290 tools/memory.py:303
+msgid "Asking params for inexistant profile"
+msgstr ""
+
+#: tools/memory.py:349
+#, python-format
+msgid "Requesting an unknown parameter (%(category)s/%(name)s)"
+msgstr ""
+
+#: tools/memory.py:361
+msgid "Trying to set parameter for an unknown profile"
+msgstr ""
+
+#: tools/memory.py:375
+msgid "Memory manager init"
+msgstr ""
+
+#: tools/memory.py:402
+msgid "params template loaded"
+msgstr ""
+
+#: tools/memory.py:404
+msgid "Can't load params template !"
+msgstr ""
+
+#: tools/memory.py:407
+msgid "No params template, using default template"
+msgstr ""
+
+#: tools/memory.py:412
+msgid "params loaded"
+msgstr ""
+
+#: tools/memory.py:414
+msgid "Can't load params !"
+msgstr ""
+
+#: tools/memory.py:421
+msgid "history loaded"
+msgstr ""
+
+#: tools/memory.py:423
+msgid "Can't load history !"
+msgstr ""
+
+#: tools/memory.py:430
+msgid "private values loaded"
+msgstr ""
+
+#: tools/memory.py:432
+msgid "Can't load private values !"
+msgstr ""
+
+#: tools/memory.py:448
+msgid "params saved"
+msgstr ""
+
+#: tools/memory.py:451
+msgid "history saved"
+msgstr ""
+
+#: tools/memory.py:454
+msgid "private values saved"
+msgstr ""
+
+#: tools/memory.py:497
+msgid "source JID not found !"
+msgstr ""
+
+#: tools/memory.py:501
+msgid "dest JID not found !"
+msgstr ""
+
+#: tools/memory.py:528
+msgid "Trying to add a contact to a non-existant profile"
+msgstr ""
+
+#: tools/memory.py:540
+msgid "Trying to delete a contact for a non-existant profile"
+msgstr ""
+
+#: tools/memory.py:548
+msgid "Asking a contact for a non-existant profile"
+msgstr ""
+
+#: tools/memory.py:562 tools/memory.py:611
+msgid "Asking contacts for a non-existant profile"
+msgstr ""
+
+#: tools/memory.py:573
+msgid "Trying to add presence status to a non-existant profile"
+msgstr ""
+
+#: tools/memory.py:601
+msgid "Asking waiting subscriptions for a non-existant profile"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:62
+msgid "Implementation of vcard-temp"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:68
+msgid "Plugin XEP_0054 initialization"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:111
+#, python-format
+msgid "Photo of type [%s] found"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:113
+msgid "Decoding binary"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:120
+#, python-format
+msgid "file saved to %s"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:122
+#, python-format
+msgid "file [%s] already in cache"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:128
+msgid "parsing vcard"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:154
+#, python-format
+msgid "FIXME: [%s] VCard tag is not managed yet"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:160
+msgid "VCard found"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:166
+msgid "FIXME: vCard not found as first child element"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:171
+#, python-format
+msgid "Can't find VCard of %s"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:180
+msgid "Asking vcard for an non-existant or not connected profile"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:183
+#, python-format
+msgid "Asking for %s's VCard"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:198
+#, python-format
+msgid "Asking for an uncached avatar [%s]"
+msgstr ""
+
+#: plugins/plugin_xep_0054.py:245
+msgid "New avatar found, requesting vcard"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:89
+msgid "Implementation of SOCKS5 Bytestreams"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:135
+msgid "Protocol init"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:217
+#, python-format
+msgid "Adding connection: %(address)s, %(connection)s"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:313
+#, python-format
+msgid "Saving file in %s."
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:364
+msgid "File transfer completed, closing connection"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:438
+msgid "Socks 5 server connection started"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:441
+#, python-format
+msgid "Socks 5 server connection lost (reason: %s)"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:448
+msgid "Socks 5 client connection started"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:451
+#, python-format
+msgid "Socks 5 client connection lost (reason: %s)"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:468
+msgid "Plugin XEP_0065 initialization"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:470
+msgid "registering"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:480
+#, python-format
+msgid "Launching Socks5 Stream server on port %d"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:496
+msgid "Launching socks5 initiator"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:511
+#, python-format
+msgid "Stream proposed: host=[%(host)s] port=[%(post)s]"
+msgstr ""
+
+#: plugins/plugin_xep_0065.py:527
+msgid "activating stream"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:41
+msgid "Implementation of in-band registration"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:47
+msgid "Plugin XEP_0077 initialization"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:62
+msgid "No data form found"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:65
+msgid "This gateway can't be managed by SàT, sorry :("
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:86
+msgid "Your are now unregistred"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:90
+#, python-format
+msgid "Unregistration failure: %s"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:94
+#, python-format
+msgid "Unregistration failed: %s"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:116
+msgid "Registration failed"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:134 plugins/plugin_xep_0096.py:154
+msgid "Asking for an non-existant or not connected profile"
+msgstr ""
+
+#: plugins/plugin_xep_0077.py:137
+#, python-format
+msgid "Asking registration for [%s]"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:52
+msgid "Implementation of SI File Transfert"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:58
+msgid "Plugin XEP_0096 initialization"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:67
+msgid "XEP-0096 management"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:75
+#, python-format
+msgid "File proposed: name=[%(name)s] size=%(size)s"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:91
+#, python-format
+msgid "Transfert [%s] refused"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:96
+#, python-format
+msgid "Transfert [%s] accepted"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:99
+msgid "Approved unknow id !"
+msgstr ""
+
+#: plugins/plugin_xep_0096.py:111
+msgid "Feature negociation"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:37
+msgid "Implementation of Gateways protocol"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:43
+msgid "Gateways plugin initialization"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:53
+#, python-format
+msgid "All items checked for id [%s]"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:64
+#, python-format
+msgid "Found gateway (%(jid)s): %(identity)s"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:75
+#, python-format
+msgid "Error when discovering [%(jid)s]: %(condition)s"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:84
+msgid "No gateway found"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:90
+#, python-format
+msgid "item found: %s"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:96
+msgid "Registration successful, doing the rest"
+msgstr ""
+
+#: plugins/plugin_xep_0100.py:113
+#, python-format
+msgid "find gateways (target = %s)"
+msgstr ""
--- a/sat.tac	Thu Feb 25 17:09:18 2010 +1100
+++ b/sat.tac	Wed Mar 03 17:12:23 2010 +1100
@@ -25,6 +25,7 @@
     'local_dir' : '~/.sat'
 }
 
+
 from twisted.application import internet, service
 from twisted.internet import glib2reactor, protocol, task
 glib2reactor.install()
@@ -49,6 +50,9 @@
 from tools.xml_tools import XMLTools 
 from glob import glob
 
+import gettext
+gettext.install('sat', "i18n", unicode=True)
+
 try:
     from twisted.words.protocols.xmlstream import XMPPHandler
 except ImportError:
@@ -81,13 +85,13 @@
         print "SatXMPPClient"
         client.XMPPClient._authd(self, xmlstream)
         self.__connected=True
-        print "********** [%s] CONNECTED **********" % self.profile
+        info (_("********** [%s] CONNECTED **********") % self.profile)
         self.streamInitialized()
         self.host_app.bridge.connected(self.profile) #we send the signal to the clients
 
     def streamInitialized(self):
         """Called after _authd"""
-        debug ("XML stream is initialized")
+        debug (_("XML stream is initialized"))
         self.keep_alife = task.LoopingCall(self.xmlstream.send, " ")  #Needed to avoid disconnection (specially with openfire)
         self.keep_alife.start(180)
         
@@ -107,11 +111,11 @@
     
     def connectionLost(self, connector, unused_reason):
         self.__connected=False
-        print "********** [%s] DISCONNECTED **********" % self.profile
+        info (_("********** [%s] DISCONNECTED **********") % self.profile)
         try:
             self.keep_alife.stop()
         except AttributeError:
-            debug("No keep_alife")
+            debug (_("No keep_alife"))
         self.host_app.bridge.disconnected(self.profile) #we send the signal to the clients
 
 
@@ -122,7 +126,7 @@
         self.host = host
 
     def onMessage(self, message):
-      debug (u"got_message from: %s", message["from"])
+      debug (_(u"got message from: %s"), message["from"])
       for e in message.elements():
         if e.name == "body":
           type = message['type'] if message.hasAttribute('type') else 'chat' #FIXME: check specs
@@ -164,14 +168,14 @@
                      }
         if item.name:
             item_attr['name'] = item.name
-        info ("new contact in roster list: %s", item.jid.full())
+        info (_("new contact in roster list: %s"), item.jid.full())
         self.host.memory.addContact(item.jid, item_attr, item.groups, self.parent.profile)
         self.host.bridge.newContact(item.jid.full(), item_attr, item.groups, self.parent.profile)
     
     def onRosterRemove(self, entity):
         """Called when a roster removal event is received"""
         #TODO: send a signal to frontends
-        print "removing %s from roster list" % entity.full()
+        print _("removing %s from roster list") % entity.full()
         self.host.memory.delContact(entity, self.parent.profile)
 
 class SatPresenceProtocol(xmppim.PresenceClientProtocol):
@@ -181,7 +185,7 @@
         self.host = host
     
     def availableReceived(self, entity, show=None, statuses=None, priority=0):
-        info ("presence update for [%s]", entity)
+        info (_("presence update for [%s]"), entity)
         
         if statuses.has_key(None):   #we only want string keys
             statuses["default"] = statuses[None]
@@ -211,22 +215,22 @@
         xmppim.PresenceClientProtocol.available(self, entity, show, statuses, priority)
     
     def subscribedReceived(self, entity):
-        debug ("subscription approved for [%s]" % entity.userhost())
+        debug (_("subscription approved for [%s]") % entity.userhost())
         self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile)
         self.host.bridge.subscribe('subscribed', entity.userhost(), self.parent.profile)
 
     def unsubscribedReceived(self, entity):
-        debug ("unsubscription confirmed for [%s]" % entity.userhost())
+        debug (_("unsubscription confirmed for [%s]") % entity.userhost())
         self.host.memory.delWaitingSub(entity.userhost(), self.parent.profile)
         self.host.bridge.subscribe('unsubscribed', entity.userhost(), self.parent.profile)
 
     def subscribeReceived(self, entity):
-        debug ("subscription request for [%s]" % entity.userhost())
+        debug (_("subscription request for [%s]") % entity.userhost())
         self.host.memory.addWaitingSub('subscribe', entity.userhost(), self.parent.profile)
         self.host.bridge.subscribe('subscribe', entity.userhost(), self.parent.profile)
 
     def unsubscribeReceived(self, entity):
-        debug ("unsubscription asked for [%s]" % entity.userhost())
+        debug (_("unsubscription asked for [%s]") % entity.userhost())
         self.host.memory.addWaitingSub('unsubscribe', entity.userhost(), self.parent.profile)
         self.host.bridge.subscribe('unsubscribe', entity.userhost(), self.parent.profile)
 
@@ -252,7 +256,7 @@
         self.user_login = user_login
         self.user_pass = user_pass
         self.answer_id = answer_id
-        print "Registration asked for",user_login, user_pass, jabber_host
+        print _("Registration asked for"),user_login, user_pass, jabber_host
     
     def connectionMade(self):
         print "connectionMade"
@@ -270,22 +274,22 @@
         reg = iq.send(self.jabber_host).addCallbacks(self.registrationAnswer, self.registrationFailure)
 
     def registrationAnswer(self, answer):
-        debug ("registration answer: %s" % answer.toXml())
+        debug (_("registration answer: %s") % answer.toXml())
         answer_type = "SUCCESS"
-        answer_data={"message":"Registration successfull"}
+        answer_data={"message":_("Registration successfull")}
         self.host.bridge.actionResult(answer_type, self.answer_id, answer_data)
         self.xmlstream.sendFooter()
         
     def registrationFailure(self, failure):
-        info ("Registration failure: %s" % str(failure.value))
+        info (_("Registration failure: %s") % str(failure.value))
         answer_type = "ERROR"
         answer_data = {}
         if failure.value.condition == 'conflict':
             answer_data['reason'] = 'conflict'
-            answer_data={"message":"Username already exists, please choose an other one"}
+            answer_data={"message":_("Username already exists, please choose an other one")}
         else:
             answer_data['reason'] = 'unknown'
-            answer_data={"message":"Registration failed (%s)" % str(failure.value.condition)}
+            answer_data={"message":_("Registration failed (%s)") % str(failure.value.condition)}
         self.host.bridge.actionResult(answer_type, self.answer_id, answer_data)
         self.xmlstream.sendFooter()
         
@@ -298,14 +302,14 @@
     def get_const(self, name):
         """Return a constant"""
         if not CONST.has_key(name):
-            error('Trying to access an undefined constant')
+            error(_('Trying to access an undefined constant'))
             raise Exception
         return CONST[name]
 
     def set_const(self, name, value):
         """Save a constant"""
         if CONST.has_key(name):
-            error('Trying to redefine a constant')
+            error(_('Trying to redefine a constant'))
             raise Exception  
         CONST[name] = value
     
@@ -366,7 +370,7 @@
             __import__(plug_path)
             mod = sys.modules[plug_path]
             plug_info = mod.PLUGIN_INFO
-            info ("importing plugin: %s", plug_info['name'])
+            info (_("importing plugin: %s"), plug_info['name'])
             self.plugins[plug_info['import_name']] = getattr(mod, plug_info['main'])(self)
             if plug_info.has_key('handler') and plug_info['handler'] == 'yes':
                 self.plugins[plug_info['import_name']].is_handler = True
@@ -380,11 +384,11 @@
 
         profile = self.memory.getProfileName(profile_key)
         if not profile_key:
-            error ('Trying to connect a non-exsitant profile')
+            error (_('Trying to connect a non-exsitant profile'))
             return
         
         if (self.isConnected()):
-            info("already connected !")
+            info(_("already connected !"))
             return
         print "connecting..."
         current = self.profiles[profile] = SatXMPPClient(self, profile,
@@ -408,7 +412,7 @@
                                                      self.get_const('client_version'))
         current.versionHandler.setHandlerParent(current)
 
-        debug ("setting plugins parents")
+        debug (_("setting plugins parents"))
         
         for plugin in self.plugins.iteritems():
             if plugin[1].is_handler:
@@ -419,10 +423,10 @@
     def disconnect(self, profile_key='@DEFAULT@'):
         """disconnect from jabber server"""
         if (not self.isConnected(profile_key)):
-            info("not connected !")
+            info(_("not connected !"))
             return
         profile = self.memory.getProfileName(profile_key)
-        info("Disconnecting...")
+        info(_("Disconnecting..."))
         self.profiles[profile].stopService()
 
     def startService(self):
@@ -434,11 +438,11 @@
         info("Salut aussi à Rantanplan")
 
     def run(self):
-        debug("running app")
+        debug(_("running app"))
         reactor.run()
     
     def stop(self):
-        debug("stopping app")
+        debug(_("stopping app"))
         reactor.stop()
         
     ## Misc methods ##
@@ -476,16 +480,16 @@
         server = self.memory.getParamA("Server", "Connection")
 
         if not user or not password or not server:
-            info ('No user or server given')
+            info (_('No user or server given'))
             #TODO: a proper error message must be sent to frontend
-            self.actionResult(id, "ERROR", {'message':"No user, password or server given, can't register new account."})
+            self.actionResult(id, "ERROR", {'message':_("No user, password or server given, can't register new account.")})
             return
 
         confirm_id = sat_next_id()
         self.__private_data[confirm_id]=id
     
         self.askConfirmation(confirm_id, "YES/NO",
-            {"message":"Are you sure to register new account [%s] to server %s ?" % (user, server)},
+            {"message":_("Are you sure to register new account [%(user)s] to server %(server)s ?") % {'user':user, 'server':server}},
             self.regisConfirmCB)
         print ("===============+++++++++++ REGISTER NEW ACCOUNT++++++++++++++============")
         print "id=",id
@@ -493,7 +497,7 @@
 
     def regisConfirmCB(self, id, accepted, data):
         #FIXME: gof: profile not managed here !
-        print "register Confirmation CB ! (%s)" % str(accepted)
+        print _("register Confirmation CB ! (%s)") % str(accepted)
         action_id = self.__private_data[id]
         del self.__private_data[id]
         user = jid.parse(self.memory.getParamA("JabberID", "Connection"))[0]
@@ -525,7 +529,7 @@
         elif action=='CANCEL':
             query.addElement('remove')
         else:
-            error ("FIXME FIXME FIXME: Unmanaged action (%s) in submitForm" % action)
+            error (_("FIXME FIXME FIXME: Unmanaged action (%s) in submitForm") % action)
             raise NotImplementedError
 
         deferred = iq.send(target)
@@ -535,7 +539,7 @@
 
     def setParam(self, name, value, category, profile_key='@DEFAULT@'):
         """set wanted paramater and notice observers"""
-        info ("setting param: %s=%s in category %s", name, value, category)
+        info (_("setting param: %(name)s=%(value)s in category %(category)s") % {'name':name, 'value':value, 'category':category})
         self.memory.setParam(name, value, category, profile_key)
 
     def isConnected(self, profile_key='@DEFAULT@'):
@@ -545,7 +549,7 @@
         """
         profile = self.memory.getProfileName(profile_key)
         if not profile:
-            error ('asking connection status for a non-existant profile')
+            error (_('asking connection status for a non-existant profile'))
             raise Exception  #TODO: raise a proper exception
         if not self.profiles.has_key(profile):
             return False
@@ -562,13 +566,13 @@
             try:
                 cb_name = self.memory.getParamA(data["name"], data["category"], "callback")
             except KeyError:
-                error ("Incomplete data")
+                error (_("Incomplete data"))
                 return ""
             id = sat_next_id()
             self.callGeneralCB(cb_name, id, data)
             return id
         else:
-            error ("Unknown action type")
+            error (_("Unknown action type"))
             return ""
 
 
@@ -580,7 +584,7 @@
         profile = self.memory.getProfileName(profile_key)
         assert(profile)
         current_jid = self.profiles[profile].jid
-        debug("Sending jabber message to %s...", to)
+        debug(_("Sending jabber message to %s..."), to)
         message = domish.Element(('jabber:client','message'))
         message["to"] = jid.JID(to).full()
         message["from"] = current_jid.full()
@@ -603,14 +607,14 @@
         profile = self.memory.getProfileName(profile_key)
         assert(profile)
         to_jid = jid.JID(raw_jid)
-        debug ('subsciption request [%s] for %s', type, to_jid.full())
+        debug (_('subsciption request [%(type)s] for %(jid)s') % {'type':type, 'jid':to_jid.full()})
         if type=="subscribe":
             self.profiles[profile].presence.subscribe(to_jid)
         elif type=="subscribed":
             self.profiles[profile].subscribed(to_jid)
             contact = self.memory.getContact(to_jid) 
             if not contact or not bool(contact['to']): #we automatically subscribe to 'to' presence
-                debug('sending automatic "to" subscription request')
+                debug(_('sending automatic "to" subscription request'))
                 self.subscription('subscribe', to_jid.userhost())
         elif type=="unsubscribe":
             self.profiles[profile].presence.unsubscribe(to_jid)
@@ -641,10 +645,10 @@
     def serverDisco(self, disco):
         """xep-0030 Discovery Protocol."""
         for feature in disco.features:
-            debug ("Feature found: %s",feature)
+            debug (_("Feature found: %s"),feature)
             self.server_features.append(feature)
         for cat, type in disco.identities:
-            debug ("Identity found: [%s/%s] %s" % (cat, type, disco.identities[(cat,type)]))
+            debug (_("Identity found: [%(category)s/%(type)s] %(identity)s") % {'category':cat, 'type':type, 'identity':disco.identities[(cat,type)]})
 
     
     ## Generic HMI ## 
@@ -664,7 +668,7 @@
         @param data: dictionary of dictionaries
         """
         if type != "DICT_DICT":
-            error("type for actionResultExt must be DICT_DICT, fixing it")
+            error(_("type for actionResultExt must be DICT_DICT, fixing it"))
             type = "DICT_DICT"
         self.bridge.actionResultExt(type, id, data)
 
@@ -678,7 +682,7 @@
         @param cb: callback called with the answer
         """
         if self.__waiting_conf.has_key(id):
-            error ("Attempt to register two callbacks for the same confirmation")
+            error (_("Attempt to register two callbacks for the same confirmation"))
         else:
             self.__waiting_conf[id] = cb
             self.bridge.askConfirmation(type, id, data)
@@ -686,9 +690,9 @@
 
     def confirmationAnswer(self, id, accepted, data):
         """Called by frontends to answer confirmation requests"""
-        debug ("Received confirmation answer for id [%s]: %s", id, "accepted" if accepted else "refused")
+        debug (_("Received confirmation answer for id [%(id)s]: %(success)s") % {'id': id, 'success':u("accepted") if accepted else _("refused")})
         if not self.__waiting_conf.has_key(id):
-            error ("Received an unknown confirmation")
+            error (_("Received an unknown confirmation"))
         else:
             cb = self.__waiting_conf[id]
             del self.__waiting_conf[id]
@@ -701,7 +705,7 @@
     def removeProgressCB(self, id):
         """Remove a progress callback"""
         if not self.__progress_cb_map.has_key(id):
-            error ("Trying to remove an unknow progress callback")
+            error (_("Trying to remove an unknow progress callback"))
         else:
             del self.__progress_cb_map[id]
 
@@ -725,7 +729,7 @@
     def removeGeneralCB(self, name):
         """Remove a general callback"""
         if not self.__general_cb_map.has_key(name):
-            error ("Trying to remove an unknow general callback")
+            error (_("Trying to remove an unknow general callback"))
         else:
             del self.__general_cb_map[name]
 
@@ -734,7 +738,7 @@
         try:
             return self.__general_cb_map[name](*args, **kwargs)
         except KeyError:
-            error("Trying to call unknown function")
+            error(_("Trying to call unknown function"))
             return None
 
 application = service.Application('SàT')
--- a/tools/memory.py	Thu Feb 25 17:09:18 2010 +1100
+++ b/tools/memory.py	Wed Mar 03 17:12:23 2010 +1100
@@ -74,17 +74,17 @@
             try:
                 with open(file_gen, 'r') as file_gen_pickle:
                     self.params_gen=pickle.load(file_gen_pickle)
-                debug("general params data loaded")
+                debug(_("general params data loaded"))
             except:
-                error ("Can't load general params data !")
+                error (_("Can't load general params data !"))
         
         if os.path.exists(file_ind):
             try:
                 with open(file_ind, 'r') as file_ind_pickle:
                     self.params=pickle.load(file_ind_pickle)
-                debug("individual params data loaded")
+                debug(_("individual params data loaded"))
             except:
-                error ("Can't load individual params data !")
+                error (_("Can't load individual params data !"))
     
     def save_xml(self, file):
         """Save parameters template to xml file"""
@@ -121,7 +121,7 @@
         """Create a new profile
         @param name: Name of the profile"""
         if self.params.has_key(name):
-            info ('The profile name already exists')
+            info (_('The profile name already exists'))
             return 1
         self.params[name]={}
         return 0
@@ -130,7 +130,7 @@
         """Delete an existing profile
         @param name: Name of the profile"""
         if not self.params.has_key(name):
-            error ('Trying to delete an unknown profile')
+            error (_('Trying to delete an unknown profile'))
             return 1
         del self.params[name]
         return 0
@@ -146,12 +146,12 @@
                 return ""
             default = self.host.memory.getPrivate('Profile_default')
             if not default or not default in self.params:
-                info('No default profile, returning first one') #TODO: manage real default profile
+                info(_('No default profile, returning first one')) #TODO: manage real default profile
                 default = self.params.keys()[0]
                 self.host.memory.setPrivate('Profile_default', default)
             return default #FIXME: gof: temporary, must use real default value, and fallback to first one if it doesn't exists
         if not self.params.has_key(profile_key):
-            info ('Trying to access an unknown profile')
+            info (_('Trying to access an unknown profile'))
             return ""
         return profile_key
 
@@ -191,7 +191,7 @@
         self.setParam(name, value, category) #FIXME: better to set param xml value ???
 
     def __default_ko(self, failure, name, category):
-        error ("Can't determine default value for [%s/%s]: %s" % (category, name, str(failure.value)))
+        error (_("Can't determine default value for [%(category)s/%(name)s]: %(reason)s") % {'category':category, 'name':name, 'reason':str(failure.value)})
 
     def setDefault(self, name, category, callback, errback=None):
         """Set default value of parameter
@@ -204,7 +204,7 @@
         #TODO: send signal param update if value changed
         node =  self.__getParamNode(name, category, '@ALL@')
         if not node:
-            error("Requested param [%s] in category [%s] doesn't exist !" , name, category)
+            error(_("Requested param [%(name)s] in category [%(category)s] doesn't exist !") % {'name':name, 'category':category})
             return
         if node[1].getAttribute('default_cb') == 'yes':
             del node[1].attributes['default_cb']
@@ -222,7 +222,7 @@
            @return: attribute"""
         node = self.__getParamNode(name, category)
         if not node:
-            error("Requested param [%s] in category [%s] doesn't exist !" , name, category)
+            error(_("Requested param [%(name)s] in category [%(category)s] doesn't exist !") % {'name':name, 'category':category})
             return None
 
         if node[0] == 'general':
@@ -233,7 +233,7 @@
 
         profile = self.getProfileName(profile_key)
         if not profile:
-            error('Requesting a param for an non-existant profile')
+            error(_('Requesting a param for an non-existant profile'))
             return None
 
         if attr == "value": 
@@ -287,7 +287,7 @@
         Take params xml as skeleton"""
         profile = self.getProfileName(profile_key)
         if not profile:
-            error("Asking params for inexistant profile")
+            error(_("Asking params for inexistant profile"))
             return ""
         prof_xml = self.__constructProfileXml(profile) 
         return_xml = prof_xml.toxml()
@@ -300,7 +300,7 @@
         #TODO: manage category of general type (without existant profile)
         profile = self.getProfileName(profile_key)
         if not profile:
-            error("Asking params for inexistant profile")
+            error(_("Asking params for inexistant profile"))
             return ""
         prof_xml = self.__constructProfileXml(profile) 
         
@@ -346,7 +346,7 @@
 
         node = self.__getParamNode(name, category, '@ALL@')
         if not node:
-            error('Requesting an unknown parameter (%s/%s)' % (category, name))
+            error(_('Requesting an unknown parameter (%(category)s/%(name)s)') % {'category':category, 'name':name})
             return
         
         if node[0] == 'general':
@@ -358,7 +358,7 @@
        
         profile = self.getProfileName(profile_key)
         if not profile:
-            error('Trying to set parameter for an unknown profile')
+            error(_('Trying to set parameter for an unknown profile'))
             return #TODO: throw an error
         
         type = node[1].getAttribute("type")
@@ -372,7 +372,7 @@
     """This class manage all persistent informations"""
 
     def __init__(self, host):
-        info ("Memory manager init")
+        info (_("Memory manager init"))
         self.host = host
         self.contacts={}
         self.presenceStatus={}
@@ -399,37 +399,37 @@
         if os.path.exists(param_file_xml):
             try:
                 self.params.load_xml(param_file_xml)
-                debug("params template loaded")
+                debug(_("params template loaded"))
             except:
-                error ("Can't load params template !")
+                error (_("Can't load params template !"))
                 self.params.load_default_params()
         else:
-            info ("No params template, using default template")
+            info (_("No params template, using default template"))
             self.params.load_default_params()
 
         try:
             self.params.load_data(param_file_data)
-            debug("params loaded")
+            debug(_("params loaded"))
         except:
-            error ("Can't load params !")
+            error (_("Can't load params !"))
 
         #history
         if os.path.exists(history_file):
             try:
                 with open(history_file, 'r') as history_pickle:
                     self.history=pickle.load(history_pickle)
-                debug("history loaded")
+                debug(_("history loaded"))
             except:
-                error ("Can't load history !")
+                error (_("Can't load history !"))
 
         #private
         if os.path.exists(private_file):
             try:
                 with open(private_file, 'r') as private_pickle:
                     self.private=pickle.load(private_pickle)
-                debug("private values loaded")
+                debug(_("private values loaded"))
             except:
-                error ("Can't load private values !")
+                error (_("Can't load private values !"))
 
     def save(self):
         """Save parameters and all memory things to file/db"""
@@ -445,13 +445,13 @@
         
         self.params.save_xml(param_file_xml)
         self.params.save_data(param_file_data)
-        debug("params saved")
+        debug(_("params saved"))
         with open(history_file, 'w') as history_pickle:
             pickle.dump(self.history, history_pickle)
-        debug("history saved")
+        debug(_("history saved"))
         with open(private_file, 'w') as private_pickle:
             pickle.dump(self.private, private_pickle)
-        debug("private values saved")
+        debug(_("private values saved"))
 
     def getProfilesList(self):
         return self.params.getProfilesList()
@@ -494,11 +494,11 @@
     def getHistory(self, from_jid, to_jid, size):
         ret={}
         if not self.history.has_key(from_jid):
-            error("source JID not found !")
+            error(_("source JID not found !"))
             #TODO: throw an error here
             return {}
         if not self.history[from_jid].has_key(to_jid):
-            error("dest JID not found !")
+            error(_("dest JID not found !"))
             #TODO: throw an error here
             return {}
         stamps=self.history[from_jid][to_jid].keys()
@@ -525,7 +525,7 @@
         debug("Memory addContact: %s",contact_jid.userhost())
         profile = self.getProfileName(profile_key)
         if not profile:
-            error ('Trying to add a contact to a non-existant profile')
+            error (_('Trying to add a contact to a non-existant profile'))
             return
         assert(isinstance(attributes,dict))
         assert(isinstance(groups,set))
@@ -537,7 +537,7 @@
         debug("Memory delContact: %s",contact_jid.userhost())
         profile = self.getProfileName(profile_key)
         if not profile:
-            error ('Trying to delete a contact for a non-existant profile')
+            error (_('Trying to delete a contact for a non-existant profile'))
             return
         if self.contacts.has_key(profile) and self.contacts[profile].has_key(contact_jid.userhost()):
             del self.contacts[profile][contact_jid.userhost()]
@@ -545,7 +545,7 @@
     def getContact(self, contact_jid, profile_key='@DEFAULT@'):
         profile = self.getProfileName(profile_key)
         if not profile:
-            error('Asking a contact for a non-existant profile')
+            error(_('Asking a contact for a non-existant profile'))
             return None
         if self.contacts.has_key(profile) and self.contacts[profile].has_key(contact_jid.userhost()):
             self.contacts[profile][contact_jid.userhost()]
@@ -559,7 +559,7 @@
         debug ("Memory getContact OK (%s)", self.contacts)
         profile = self.getProfileName(profile_key)
         if not profile:
-            error('Asking contacts for a non-existant profile')
+            error(_('Asking contacts for a non-existant profile'))
             return []
         ret=[]
         for contact in self.contacts[profile]:
@@ -570,7 +570,7 @@
     def addPresenceStatus(self, contact_jid, show, priority, statuses, profile_key='@DEFAULT@'):
         profile = self.getProfileName(profile_key)
         if not profile:
-            error('Trying to add presence status to a non-existant profile')
+            error(_('Trying to add presence status to a non-existant profile'))
             return
         if not self.presenceStatus.has_key(profile):
             self.presenceStatus[profile] = {}
@@ -598,7 +598,7 @@
         """Called to get a list of currently waiting subscription requests"""
         profile = self.getProfileName(profile_key)
         if not profile:
-            error('Asking waiting subscriptions for a non-existant profile')
+            error(_('Asking waiting subscriptions for a non-existant profile'))
             return {}
         if not self.subscriptions.has_key(profile):
             return {}
@@ -608,7 +608,7 @@
     def getPresenceStatus(self, profile_key='@DEFAULT@'):
         profile = self.getProfileName(profile_key)
         if not profile:
-            error('Asking contacts for a non-existant profile')
+            error(_('Asking contacts for a non-existant profile'))
             return {}
         if not self.presenceStatus.has_key(profile):
             self.presenceStatus[profile] = {}